Python Gettext回退不';不能使用未翻译的字符串
在我的应用程序的源代码中,我用俄语包装了gettext字符串,所以这是我的默认语言,并且基于它的*.po文件。 现在我需要做回退链-未翻译成西班牙语的字符串应在英语目录中搜索,如果未翻译,将以俄语返回 我试图用add\u fallback方法来实现这一点,但是self中未翻译的字符串。gnutransations(NullTranslations)的目录已经替换为自身,ugettext方法从不进行回退 我做错了什么 例如: 当前语言环境是西班牙语,我们在西班牙语目录中没有字符串“бжжбббббббббббббббббх 西班牙语*.po文件Python Gettext回退不';不能使用未翻译的字符串,python,gettext,fallback,Python,Gettext,Fallback,在我的应用程序的源代码中,我用俄语包装了gettext字符串,所以这是我的默认语言,并且基于它的*.po文件。 现在我需要做回退链-未翻译成西班牙语的字符串应在英语目录中搜索,如果未翻译,将以俄语返回 我试图用add\u fallback方法来实现这一点,但是self中未翻译的字符串。gnutransations(NullTranslations)的目录已经替换为自身,ugettext方法从不进行回退 我做错了什么 例如: 当前语言环境是西班牙语,我们在西班牙语目录中没有字符串“бжжббббб
msgid "Титул должен быть уникальным"
msgstr "" # <— We've got no translation for this string
msgid "Титул должен быть уникальным"
msgstr "Title should be unique"
俄语*.po文件不包含翻译,因为此语言用作源代码中的键(默认语言)
我有西班牙语翻译器(gnutransations的对象),我用add_fallback方法添加了英语翻译器(gnutransations的对象)作为它的后备方法。
所以,我的es_翻译器。_回退是en_翻译器对象
在ugettext函数中,我们试图从self中获取价值。_catalog通过消息作为键,只有当消息丢失时,我们才执行self。_fallback调用。
但是self.\u catalog.get(消息)对于未翻译的字符串返回字符串本身。
self.\u目录[/code>我们从不在英文目录中搜索
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
然而,若标记为fuzzy的消息并没有包含在self.\u目录中,则回退工作正常
#, fuzzy
msgid "Отсутствуют файлы фотографий"
msgstr "Archivos de fotos ausentes"
好的,python正在做一些不同于标准的回退机制的事情,以增加功能,但它并没有像您认为的那样工作。这可能需要一个bug报告
如果字符串不在翻译中,标准回退机制只有一个回退:使用源字符串。在大多数情况下,这是英语(C或POSIX语言环境不强制查找),但在您的情况下,因为源代码中的消息C语言环境具有俄语文本(这可能会导致其他问题,因为有时C语言环境假定ascii不是utf8)。当前推荐的最佳实践是在以七位ascii编码的C语言环境中使用英语,然后翻译成所有其他语言。这是一个重要的重新设计(当然是英语中心的),但除非有人改进工具(这将是更重要的重新设计),否则这可能是你最好的选择。解决这个问题的唯一方法是在编译*.mo文件时删除未翻译的字符串。
将babel/messages/mofile.py write\u mo与
messages = [m for m in messages if m.string]
我很难理解你的问题。你能提供一个简单的例子吗?谢谢你的关注,我试图解释我的痛苦:)谢谢你的回答!当然,我们在选择俄语作为基本关键语言时犯了一个错误,但现在我们有很多源代码和6个目录,有不同语言的翻译,现在重播是一个问题。正在尝试寻找替代解决方案。在这种情况下,源筛选可能是一种解决方案。那就是写一个程序来翻译源代码,同时复制它。如果你需要帮助,我以前做过。如果它是一个开源项目,请给我一个链接,我会这样做。如果它是封闭的来源,并希望我为您做这件事,我愿意如果支付。
messages = [m for m in messages if m.string]