在我的应用程序的源代码中,我用俄语中的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"
答案 0 :(得分:1)
好的,python正在做一些与标准回退机制不同的东西,用于增加功能,这些功能不像您认为的那样有效。这可能需要一个错误报告。
如果字符串不在转换中,则标准回退机制只有一个回退:使用源字符串。在大多数情况下,这是英语(C或POSIX语言环境不强制查找),但在您的情况下,因为C语言环境中源中的消息具有俄语文本(这可能会导致其他问题,因为有时C语言环境假定ascii不是utf8)。目前推荐的最佳实践是在用7位ascii编码的C语言环境中使用英语,然后翻译成所有其他语言。这是一个重要的重新设计(并且承认是以角度为中心),但除非有人改进工具(这将是更重要的重新设计),这可能是你最好的选择。
答案 1 :(得分:0)
解决问题的唯一方法是在编译* .mo文件时删除未翻译的字符串。 使用
修补babel / messages / mofile.py write_momessages = [m for m in messages if m.string]