多站点Django部署中的语法案例

时间:2012-10-25 09:23:44

标签: django django-sites

我正在部署一个Django项目来管理某种事件。有两个部署具有单个数据库,这些站点位于斯洛伐克语中。他们的活动名为“AkadémiaTrojstenu”和“Klub Trojstenu”。简单的部分是我可以使用sites框架,相应地设置每个站点的显示名称,并在我需要引用事件名称的模板中使用它。

在您意识到斯洛伐克语使用语法案例之前,这一切都很好看。这意味着,在某些地方我需要写“ProgramAkadémieTrojstenu”/“Program Klubu Trojstenu”或“StaréAkadémie”/“StaréKluby”等。

例如,请考虑以下模板代码:

<link rel="alternate" type="application/atom+xml" title="Novinky pre {{ site.name }}" href="{% url "news_feed" %}" />

site.name包含“AkadémiaTrojstenu”,但在这种情况下,我需要输出“NovinkypreAkadémiuTrojstenu”,即第四个语法案例中变量的内容。

我现在看到的唯一前进方法是特殊情况下模板中的所有此类事件,查看当前站点的域并输出名称的正确语法大小写。这个解决方案显然是严重的反干,可怕,并会吃小孩。

有人有更好的建议吗?有某种标准的解决方案吗?我想有很多语言使用语法案例,肯定有人在我之前遇到过这个问题。

2 个答案:

答案 0 :(得分:1)

只需使用variables in your translation strings

output = _('Today is %(month)s %(day)s.') % {'month': m, 'day': d}

这也适用于templates

{% blocktrans with site.name as site_name %}Novinky pre {{ site_name }}.{% endblocktrans %}

Finnaly,您可能会觉得使用translation contexts很有用。

在那里你不必“吃小孩”(除非你真的很饿)。

答案 1 :(得分:1)

正如@jpic所说,你可以用上下文标记来做。实际上,模板中嵌入了网站名称会更简单,因为它会被django的makemessages选中。

<link rel="alternate" type="application/atom+xml" 
      title="Novinky pre {% trans 'Akadémia Trojstenu' context '4th' %}" 
      href="{% url "news_feed" %}" />

由于多个站点可能并不简单,您可以改为创建一个额外的.po文件并手动输入所有站点名称及其翻译和上下文名称。

这有点容易出错,因为你手动同步翻译文件和一些数据库值,但至少它们都集中在一个地方和模板之外。

msgctxt "1st"
msgid "Akadémia Trojstenu"
msgstr "Akadémia Trojstenu"

msgctxt "2nd"
msgid "Akadémia Trojstenu"
msgstr "????? Trojstenu"

msgctxt "3rd"
msgid "Akadémia Trojstenu"
msgstr "Akadémie Trojstenu"

msgctxt "4th"
msgid "Akadémia Trojstenu"
msgstr "Akadémiu Trojstenu"

...

msgctxt "3rd"
msgid "Klub Trojstenu"
msgstr "Klubu Trojstenu"

...

将额外的.po粘贴到另一个目录中,并在LOCALE_PATHS设置中注册该目录。记住你这样做了,所以当有人添加一个新网站或更改一个新网站的名称并开始想知道为什么翻译被破坏时,你知道在哪里看。

完成此操作后,您应该可以使用以下网站名称:

<link rel="alternate" type="application/atom+xml" 
      title="Novinky pre {% trans site.name context '4th' %}" 
      href="{% url "news_feed" %}" />

当然,如果问题仅限于网站名称,您可以在网站模型上添加更多字段来保存其他情况(将其子类化)。由于网站对象永远不会真正改变,我认为这种非规范化不会造成任何麻烦。