Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Gettext回退不';不能使用未翻译的字符串_Python_Gettext_Fallback - Fatal编程技术网

Python Gettext回退不';不能使用未翻译的字符串

Python Gettext回退不';不能使用未翻译的字符串,python,gettext,fallback,Python,Gettext,Fallback,在我的应用程序的源代码中,我用俄语包装了gettext字符串,所以这是我的默认语言,并且基于它的*.po文件。 现在我需要做回退链-未翻译成西班牙语的字符串应在英语目录中搜索,如果未翻译,将以俄语返回 我试图用add\u fallback方法来实现这一点,但是self中未翻译的字符串。gnutransations(NullTranslations)的目录已经替换为自身,ugettext方法从不进行回退 我做错了什么 例如: 当前语言环境是西班牙语,我们在西班牙语目录中没有字符串“бжжббббб

在我的应用程序的源代码中,我用俄语包装了gettext字符串,所以这是我的默认语言,并且基于它的*.po文件。 现在我需要做回退链-未翻译成西班牙语的字符串应在英语目录中搜索,如果未翻译,将以俄语返回

我试图用add\u fallback方法来实现这一点,但是self中未翻译的字符串。gnutransations(NullTranslations)目录已经替换为自身,ugettext方法从不进行回退

我做错了什么

例如:

当前语言环境是西班牙语,我们在西班牙语目录中没有字符串“бжжбббббббббббббббббх

西班牙语*.po文件

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]