更简便的Python/Django国际化方案

3 投票
1 回答
1439 浏览
提问于 2025-04-16 02:26

我有个关于Python国际化(i18n)的问题。根据我的理解,它包括以下几个步骤:

  • 为每种语言创建一个消息文件(就一个文件吗?!)。
  • 在这个文件里,每条消息的格式是这样的:
    • 这里是英文消息
    • 这里是法语消息(嗯,法语不太好..)
  • 然后把这个文件编译成另一种更快的二进制格式。
  • 对所有需要的其他语言重复这个过程。
  • 在应用代码中(比如Django),使用翻译方法,传入英文(或默认)语言,这样就能根据地区正确翻译... tr('这里是英文消息')

我可能对步骤理解得不太准确,但大致上是这个意思吧?

我想知道有没有更简单的方法?我意思是,在Java的网页应用中,你可以设置消息包文件,格式是bundleName_locale.properties。每个文件里通常有一个键值对,比如greeting = Hello World.。你可以为网站/应用的不同子部分准备很多不同的属性文件。所有的地区文件都是分层的,如果某个子地区缺少键,就会自动使用父地区的键。这一切在Java中都是自动完成的,不需要额外设置。

在Django/Python的世界里有没有类似的东西?这样做是不是太复杂了?我能不能用一个模块来模拟Java的.properties文件?抱歉问题问得有点长,感谢任何建议。

1 个回答

13

虽然你可以很简单地做到这一点,但我想问问为什么要这么做。

现在的情况是:

  1. Django的国际化功能是基于 gettext 的,这个从来没有给我带来性能上的问题。
  2. 你不需要自己创建消息文件,Django会为你处理
  3. Django创建的消息文件可以作为文本文件发送给几乎任何人进行翻译。
    • 我花了大约5分钟给一个人讲解如何使用这些文件,结果一天后收到了我整个网站的精彩翻译。
  4. 在代码中标记字符串非常简单。
    • _("我的字符串") 是在 .py 文件中使用 from django.utils.translation import ugettext as _ 的常规写法。
    • 在模板中使用 {% trans "我的字符串" %},同样也很简单。
    • bundle.getString("我的字符串") 看起来会很快让人厌烦。
  5. 如果需要,你可以很容易地将Django的国际化功能融入到你的JavaScript中
  6. 还有基于网页的编辑器可以用来处理消息文件。
  7. 你不需要多次定义同一个字符串,它会把你整个应用中的所有实例合并成一个标记。
    • 你在Java属性文件中需要多少次定义“保存”呢?
  8. 这些内容仍然保存在一个友好的、支持版本跟踪的文本文件中。
  9. 如果你自己拼凑一个类似 .properties 的方式来定义字符串,你仍然希望编译它们,这样在执行时就不需要解析文本文件了。

空的 .po 文件示例:

#: templates/inquiries/settings/new_field.html:12
#: templates/inquiries/settings/new_form.html:4
msgid "Save"
msgstr ""

就我个人而言,我看不出有什么理由去费劲找一个已经存在并且运作良好的解决方案的替代品。

撰写回答