[英]Gettext fallbacks don't work with untranslated strings
在我的应用程序的源代码中,我用俄语包装了gettext字符串,因此这是我的默认语言和基于它的* .po文件。 现在我需要做一个不能在西班牙目录中翻译的后备链-应该在英文目录中搜索,如果没有翻译,它将返回俄语 。
我试图用add_fallback方法做到这一点 ,但是self._catalog的GNUTranslations(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.