繁体   English   中英

Gettext后备不适用于未翻译的字符串

[英]Gettext fallbacks don't work with untranslated strings

在我的应用程序的源代码中,我用俄语包装了gettext字符串,因此这是我的默认语言和基于它的* .po文件。 现在我需要做一个不能在西班牙目录中翻译的后备链-应该在英文目录中搜索,如果没有翻译,它将返回俄语

我试图用add_fallback方法做到这一点 ,但是self._catalogGNUTranslations(NullTranslations)中未翻译的字符串已经被其自身和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["Титул должен быть уникальным"] -> "Титул должен быть уникальным" ,我们永远不会在英文目录中进行搜索。

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正在执行与标准后备机制不同的操作,以实现增加的功能,而该功能无法正常运行。 这可能需要一个错误报告。

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

解决它的唯一方法是在编译* .mo文件时删除未翻译的字符串。 使用以下命令修补babel / messages / mofile.py write_mo

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM