我正在为我们的网络应用程序开发多语言支持。我们在Django's helpers库周围使用gettext。除了如何处理包含重要HTML标记的句子之外,一切都非常容易。这是一个简单的例子:
Please <a href="/login/">log in</a> to continue.
以下是我能想到的方法:
更改链接以包含整个句子。无论在这种情况下改变是否是一个好主意,这个解决方案的问题在于,当两者理想地独立时,UI变得依赖于i18n的需求。
将上面的整个字符串标记为翻译(包括格式)。然后,翻译字符串也将直接包含HTML。这样做的问题是更改HTML格式需要更改所有翻译。
紧紧耦合多个翻译,然后使用字符串插值来组合它们。例如,可以单独标记短语“Please%s to continue”和“log in”进行翻译,然后合并。 “登录”已本地化,然后包装在HREF中,然后插入到翻译的短语中,这使%s保持翻译以标记链接应该去的位置。这种方法使代码复杂化并破坏了翻译字符串的独立性。
还有其他选择吗?其他人如何解决这个问题?
答案 0 :(得分:18)
解决方案2就是你想要的。发送整个句子,嵌入HTML标记。
原因:
答案 1 :(得分:12)
2,有可能扭曲。
你当然可以将整个字符串本地化,例如:
loginLink=Please <a href="/login">log in</a> to continue
但是,根据您的工具和本地化群组,他们可能更愿意您执行以下操作:
// tokens in this string add html links
loginLink=Please {0}log in{1} to continue
那将是我的首选方法。如果您具有忽略某些字符的本地化工具,则可以使用不同的替换模式。 E.g。
loginLink=Please %startlink%log in%endlink% to continue
然后在你正在使用的任何语言的jsp,servlet或等效语言中执行替换...
答案 2 :(得分:7)
免责声明:我自己对软件国际化没有经验。
<strong />
强调听起来是个好主意。但是,那些带有(X)HTML的翻译可能无法在其他任何地方轻松使用。如果是我,我想我会采用第二种方法,但我会将URI放入格式化参数中,这样就可以更改,而无需更改所有这些翻译。
Please <a href="%s">log in</a> to continue.
你应该记住,如果你采用这种方法,你可能需要教你的译员基本的(X)HTML知识,这样他们就不会搞砸你的标记,以便他们知道从中得到什么他们写的文字。无论如何,这些额外的知识可能会带来更好的语义标记,因为如上所述,文本可以用(X)HTML进行翻译和注释,以反映当地的写作风格。
答案 3 :(得分:3)
你做什么把整个句子保持为一个字符串。您需要了解整个传统才能正确翻译它。
并非所有单词都应翻译成所有语言:例如:在挪威语中,我们不会使用“请”(我们可以说“værsåthill”字面意思是“太善良”但是当用作命令时听起来太有力了)所以正确的挪威语应该是:
您必须允许完全更改订单,例如用虚构的演示语言:
某些语言甚至可能只有一个单词用于(大部分)这句话......
我会推荐解决方案1或可能“请%{startlink}登录%{endlink}继续”这样翻译人员可以将整个句子作为一个链接,如果这更自然,它可以完全重组。< / p>
答案 4 :(得分:1)
有趣的问题,我很快就会遇到这个问题。我想我会选择2,没有任何棘手的东西。 HTML标记很简单,网址不会很快移动,如果有任何更改,将在django.po中创建一个新条目,因此我们有机会查看翻译(例如:脚本应检查{之后的空翻译) {1}})。
所以,在模板中:
makemessages
...然后,{% load i18n %}
{% trans 'hello <a href="/">world</a>' %}
之后我进入了我的django.po
python manage.py makemessages
我将其改为我的需要
#: templates/out.html:3
msgid "hello <a href=\"/\">world</a>"
msgstr ""
......在我遇到的简单而频繁的情况下,不值得再麻烦了。这里的其他解决方案看起来很聪明,但我不认为标记问题的解决方案更多是标记。另外,我想在模板中避免过多令人困惑的东西。
我想,你的模板应该会在一段时间后保持稳定,但我不知道你还有什么其他麻烦。如果内容反复变化,那么该内容的位置可能不在模板内,而是在模型内。
修改:我刚刚在documentation中查看过,如果您需要翻译中的变量,则有#: templates/out.html:3
msgid "hello <a href=\"/\">world</a>"
msgstr "bonjour <a href=\"/\">monde</a>"
。
答案 5 :(得分:0)