你如何处理带标记的文本翻译?

时间:2008-11-07 22:31:39

标签: html internationalization translation gettext

我正在为我们的网络应用程序开发多语言支持。我们在Django's helpers库周围使用gettext。除了如何处理包含重要HTML标记的句子之外,一切都非常容易。这是一个简单的例子:

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

以下是我能想到的方法:

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

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

  3. 紧紧耦合多个翻译,然后使用字符串插值来组合它们。例如,可以单独标记短语“Please%s to continue”和“log in”进行翻译,然后合并。 “登录”已本地化,然后包装在HREF中,然后插入到翻译的短语中,这使%s保持翻译以标记链接应该去的位置。这种方法使代码复杂化并破坏了翻译字符串的独立性。

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

6 个答案:

答案 0 :(得分:18)

解决方案2就是你想要的。发送整个句子,嵌入HTML标记。

原因:

  1. 主要的翻译工具Trados可以保护标记免受翻译人员的无意破坏。
  2. Trados还可以自动翻译之前看过的文本,即使标签的内容已更改(但标签的数量及其在句子中的位置相同)。至少,翻译会给你一个很好的折扣。
  3. 样式是特定于语言环境的。在某些情况下,粗体在中文或日文中是不合适的,例如,斜体在东亚语言中较少使用。译者应该可以自由地保留或删除样式。
  4. 字顺序是特定于语言的。如果你将上面的句子分成片段,它可能适用于英语和法语,但是在中文或日语中,单词顺序在你连接时是不正确的。出于这个原因,最好将整个句子外部化,而不是句子碎片。

答案 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)

免责声明:我自己对软件国际化没有经验。

  1. 我认为这在任何情况下都不会好 - 只是引入了太多的耦合......
  2. 只要您在需要翻译的部分中保持稀疏格式,这可能没问题。为翻译人员提供重要特殊词汇的可能性(通过使他们成为链接或可能使用<strong />强调听起来是个好主意。但是,那些带有(X)HTML的翻译可能无法在其他任何地方轻松使用。
  3. 这对我来说听起来像是不必要的工作......
  4. 如果是我,我想我会采用第二种方法,但我会将URI放入格式化参数中,这样就可以更改,而无需更改所有这些翻译。

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

    你应该记住,如果你采用这种方法,你可能需要教你的译员基本的(X)HTML知识,这样他们就不会搞砸你的标记,以便他们知道从中得到什么他们写的文字。无论如何,这些额外的知识可能会带来更好的语义标记,因为如上所述,文本可以用(X)HTML进行翻译和注释,以反映当地的写作风格。

答案 3 :(得分:3)

你做什么把整个句子保持为一个字符串。您需要了解整个传统才能正确翻译它。

并非所有单词都应翻译成所有语言:例如:在挪威语中,我们不会使用“请”(我们可以说“værsåthill”字面意思是“太善良”但是当用作命令时听起来太有力了)所以正确的挪威语应该是:

  • “åfortsette的Logg inn”点亮:“登录以继续”或
  • “Fortsettvedåloggeinn”点亮:“继续登录”等。

您必须允许完全更改订单,例如用虚构的演示语言:

  • “FürkontinuerLoggen bitte ins”(如果它是真的)亮了:“要继续登录请”

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

我会推荐解决方案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)

  1. 没有意义,你会如何翻译“登录”?
  2. 我不认为很多翻译人员都有使用HTML的经验(常规的非HTML感知翻译会更便宜)
  3. 我会使用选项3,或使用“%%slog in%s继续”并将%s替换为部分链接。