【问题标题】:Gettext fallbacks don't work with untranslated stringsGettext 回退不适用于未翻译的字符串
【发布时间】:2015-06-04 17:16:13
【问题描述】:

在我的应用程序的源代码中,我用俄语的 gettext 字符串包装,所以这是我的默认语言和基于它的 *.po 文件。 现在我需要创建后备链 - 应该在 english 目录中搜索未在 spanish 目录中翻译的字符串,如果未翻译,则将返回自身俄语

我尝试使用 add_fallback 方法执行此操作,但 GNUTranslations(NullTranslations)self._catalog 中的未翻译字符串已替换为自身,并且ugettext 方法从不做后备。

我做错了什么?

例子:

当前语言环境是西班牙语,我们没有翻译西班牙语目录中的字符串“Титул должен быть уникальным”,因此应该返回英语目录中的“标题应该是唯一的”。

西班牙语 *.po 文件

msgid "Титул должен быть уникальным"
msgstr "" # <— We've got no translation for this string

英文 *.po 文件

msgid "Титул должен быть уникальным"
msgstr "Title should be unique"

俄语 *.po 文件不包含翻译,因为该语言在源代码中用作键(默认语言)

msgid "Титул должен быть уникальным"
msgstr ""

我有西班牙语翻译器(GNUTranslations 的对象),我使用 add_fallback 方法添加英语翻译器(GNUTranslations 的对象)作为后备。 所以,我的 es_translator._fallback 是 en_translator 对象。

ugettext 函数中,我们尝试通过消息作为键从 self._catalog 中获取值,并且只有当它丢失时,我们才执行 self._fallback强>调用。 但是 self._catalog.get(message) 用于未翻译的字符串返回字符串本身。 self._catalog["Титул должен быть уникальным"] -&gt; "Титул должен быть уникальным" 我们从不搜索英文目录。

def add_fallback(self, fallback):
    if self._fallback:
        self._fallback.add_fallback(fallback)
    else:
        self._fallback = fallback

def ugettext(self, message):
        missing = object()
        tmsg = self._catalog.get(message, missing)
        if tmsg is missing:
            if self._fallback:
                return self._fallback.ugettext(message)
            return unicode(message)
        return tmsg

但是,如果消息标记为模糊,则它不包含在 self._catalog 和回退中效果很好。

#, fuzzy
msgid "Отсутствуют файлы фотографий"
msgstr "Archivos de fotos ausentes"

【问题讨论】:

  • 我无法理解您的问题。你能提供一个最小的例子吗?
  • 感谢您的关注,我试图解释我的痛苦:)

标签: python gettext fallback


【解决方案1】:

解决此问题的唯一方法是在编译 *.mo 文件时删除未翻译的字符串。 给 babel/messages/mofile.py write_mo 打补丁

messages = [m for m in messages if m.string]

【讨论】:

    【解决方案2】:

    好的,python 正在做一些不同于标准回退机制的附加功能,而这并没有像您认为的那样工作。这可能需要报告错误。

    如果字符串不在翻译中,标准回退机制只有一个回退:使用源字符串。在大多数情况下,这是英语(C 或 POSIX 语言环境强制不查找),但在您的情况下,因为源 C 语言环境中的消息具有俄语文本(这可能会导致其他问题,因为有时 C 语言环境假定 ascii 而不是 utf8)。当前推荐的最佳实践是在以七位 ascii 编码的 C 语言环境中使用英语,然后翻译成所有其他语言。这是一次重大的重新设计(诚然以英语为中心),但除非有人改进工具(这将是更重大的重新设计),否则这可能是您最好的选择。

    【讨论】:

    • 感谢您的回答!当然,我们在选择俄语作为基本关键语言时犯了一个错误,但是现在我们有很多源代码和 6 个目录以及不同语言的翻译,现在重播是个问题。试图找到替代解决方案。
    • 在这种情况下,源过滤可能是一种解决方案。那就是写一个程序来翻译源代码,同时复制它。如果你需要帮助,我以前做过。如果它是一个开源项目,请给我一个链接,我会做的。如果它是封闭源代码并希望我为你做这件事,我愿意付钱。
    猜你喜欢
    • 1970-01-01
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    相关资源
    最近更新 更多