Gettext回退不适用于未翻译的字符串

时间:2015-03-31 11:18:03

标签: python gettext fallback

在我的应用程序的源代码中,我用俄语中的gettext字符串包装,所以这是我的默认语言和基于它的* .po文件。 现在我需要制作后备链 - 不在西班牙语目录中翻译的字符串应该在英语目录中进行搜索,而如果它没有被翻译,则会自行返回的俄语

我尝试使用 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方法添加英语traslator(GNUTranslations的对象)作为后备。 所以,我的es_translator._fallback是en_translator对象。

ugettext 功能中,我们尝试通过消息作为键从 self._catalog 获取值,并且只有在缺少的情况下才会执行 self._fallback 打电话。 但是self._catalog.get(message)用于未翻译的字符串返回字符串本身。 self._catalog["Титул должен быть уникальным"] -> "Титул должен быть уникальным"我们从不在英文目录中搜索。

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"

2 个答案:

答案 0 :(得分:1)

好的,python正在做一些与标准回退机制不同的东西,用于增加功能,这些功能不像您认为的那样有效。这可能需要一个错误报告。

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

答案 1 :(得分:0)

解决问题的唯一方法是在编译* .mo文件时删除未翻译的字符串。 使用

修补babel / messages / mofile.py write_mo
messages = [m for m in messages if m.string]