2

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

在您意识到斯洛伐克语使用语法案例之前,这看起来没问题。这意味着,在某些地方我需要写“Program Akadémie Trojstenu”/“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émia Trojstenu”,但在这种情况下,我需要它输出“Novinky pre Akadémiu Trojstenu”,即第四个语法案例中变量的内容。

我目前看到的唯一方法是对模板中的所有此类事件进行特殊处理,查看当前站点的域并输出名称的正确语法大小写。这种解决方案显然是严重抗 DRY、丑陋并且会吃掉小孩。

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

4

2 回答 2

2

只需在翻译字符串中使用变量

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

这也适用于模板

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

最后,您可能会发现使用翻译上下文很有用。

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

于 2012-10-25T11:11:47.327 回答
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" %}" />

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

于 2012-10-28T04:00:23.130 回答