37

我正在为我们的网络应用程序开发多语言支持。我们在gettext库周围使用Django 的助手。一切都出乎意料地简单,除了如何处理包含重要 HTML 标记的句子的问题。这是一个简单的例子:

Please <a href="/login/">log in</a> to continue.

以下是我能想到的方法:

  1. 更改链接以包含整个句子。不管在这种情况下改变是否是一个好主意,这个解决方案的问题是,当两者在理想情况下独立时,UI 变得依赖于 i18n 的需求。

  2. 将上面的整个字符串标记为翻译(包括格式)。然后,翻译字符串也将直接包含 HTML。问题在于更改 HTML 格式需要更改所有翻译。

  3. 紧密耦合多个翻译,然后使用字符串插值来组合它们。例如,短语“请 %s 继续”和“登录”可以分别标记为翻译,然后合并。“登录”被本地化,然后包装在 HREF 中,然后插入到翻译的短语中,这使 %s 保持在翻译中以标记链接应该去哪里。这种方法使代码复杂化并破坏了翻译字符串的独立性。

还有其他选择吗?其他人是如何解决这个问题的?

4

6 回答 6

19

解决方案 2 就是您想要的。将整个句子发送给他们,并嵌入 HTML 标记。

原因:

  1. 主要的翻译工具 Trados 可以保护标记免受翻译人员无意中的破坏。
  2. Trados 还可以自动翻译它之前看到的文本,即使标签的内容发生了变化(但标签的数量和它们在句子中的位置是一样的)。最起码,译者会给你一个很好的折扣。
  3. 样式是特定于语言环境的。在某些情况下,粗体在中文或日文中是不合适的,例如,斜体在东亚语言中不太常用。译者应该有保留或删除样式的自由。
  4. 词序是特定于语言的。如果将上面的句子分割成片段,它可能适用于英语和法语,但在中文或日语中,当你连接时,单词顺序会不正确。出于这个原因,最好的做法是外化整个句子,而不是句子片段。
于 2008-11-21T17:58:57.147 回答
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

那将是我的首选方法。如果您有忽略某些字符的本地化工具,您可以使用不同的替换模式。例如

loginLink=Please %startlink%log in%endlink% to continue

然后在您的 jsp、servlet 或等效语言中为您使用的任何语言执行替换...

于 2008-11-07T23:51:27.993 回答
7

免责声明:我本人在软件国际化方面没有经验。

  1. 我认为这在任何情况下都不好——只是引入了太多的耦合……</li>
  2. 只要您在需要翻译的部分中保持稀疏格式,就可以了。让翻译者有可能赋予特殊词以重要性(通过使它们成为链接或可能使用<strong />强调听起来是个好主意。但是,那些带有 (X)HTML 的翻译可能无法在其他任何地方轻松使用。
  3. 这对我来说听起来像是不必要的工作……</li>

如果是我,我想我会采用第二种方法,但我会将 URI 放入格式化参数中,这样就可以更改它而无需更改所有这些翻译。

Please <a href="%s">log in</a> to continue.

您应该记住,如果您采用这种方法,您可能需要教您的翻译人员有关 (X)HTML 的基本知识,这样他们就不会搞砸您的标记,并且他们知道从他们编写的文本中可以期待什么. 无论如何,这种额外的知识可能会导致更好的语义标记,因为如上所述,可以使用 (X)HTML 翻译和注释文本以反映本地写作风格。

于 2008-11-07T22:54:04.723 回答
3

无论您做什么,都将整个句子保留为一个字符串。您需要理解整个句子才能正确翻译。

并非所有单词都应该翻译成所有语言:例如,在挪威语中,一个不使用“please”(我们可以说“vær så snill”字面意思是“be so kind”,但用作命令时听起来太有力了)所以正确挪威语应该是:

  • “Logg inn for å fortsette”点亮:“登录以继续”或
  • “Fortsett ved å logge inn”点亮:“继续登录”等。

您必须允许完全更改顺序,例如在虚构的演示语言中:

  • “Für kontinuer Loggen bitte ins”(如果是真的)点亮:“要继续登录,请登录”

某些语言甚至可能对(大部分)这句话也只有一个词......

我会推荐解决方案 1 或者可能是“请 %{startlink}login%{endlink} 继续”,这样翻译者可以将整个句子变成一个链接,如果这样更自然,并且可以完全重组。

于 2008-11-12T13:18:23.900 回答
1

有趣的问题,我很快就会遇到这个问题。我想我会选择 2,没有任何棘手的东西。HTML 标记很简单,url 不会很快移动,如果有任何更改,将在 django.po 中创建一个新条目,因此我们有机会查看翻译(例如:脚本应该在之后检查空翻译makemessages) .

所以,在模板中:

{% load i18n %}
{% trans 'hello <a href="/">world</a>' %}

...然后,在python manage.py makemessages我进入 django.po 之后

#: templates/out.html:3
msgid "hello <a href=\"/\">world</a>"
msgstr ""

我把它改成我的需要

#: templates/out.html:3
msgid "hello <a href=\"/\">world</a>"
msgstr "bonjour <a href=\"/\">monde</a>"

...在我会遇到的简单而常见的情况下,它不值得再麻烦了。这里的其他解决方案似乎很聪明,但我不认为标记问题的解决方案是更多标记。另外,我想避免模板中出现太多令人困惑的东西。

我猜你的模板应该会在一段时间后相当稳定,但我不知道你还期待什么其他麻烦。如果内容一次又一次地变化,那么该内容的位置可能不在模板内,而是在模型内。

编辑:我刚刚在文档中检查了它,如果你需要翻译中的变量,有blocktrans.

于 2008-11-09T21:48:47.803 回答
0
  1. 没有意义,您将如何翻译“登录”?
  2. 我认为许多翻译人员没有 HTML 经验(普通的非 HTML 翻译人员会更便宜)
  3. 我会选择选项 3,或者使用“请 %slog in%s 继续”并将 %s 替换为部分链接。
于 2008-11-08T21:17:20.957 回答