2015-03-31 82 views
1

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

我试图用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的对象),我加了英语h traslator(GNUTranslations的对象)作为它使用add_fallback方法的后备。 所以,我的es_translator._fallback是en_translator对象。

ugettext功能,我们试图通过消息为重点,从self._catalog获得价值,并且仅当它丢失了我们做self._fallback电话。 但self._catalog.get(消息)为未翻译的字符串返回字符串本身。 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

我无法理解你的问题。您能否提供一个最简单的例子? – hildred 2015-04-01 03:47:17

+0

谢谢你的关注,我试图解释我的痛苦:) – elatonsev 2015-04-01 07:57:57

回答

1

好的,python正在做一些不同于标准的回退机制的增加功能,它不像你认为它应该工作。这可能需要一份错误报告。

如果字符串不在翻译中,标准回退机制只有一个回退:使用源字符串。在大多数情况下,这是英语(C或POSIX语言环境不强制查找),但在您的情况下,因为源语言中的消息C语言环境具有俄语文本(这可能会导致其他问题,因为有时C语言环境假定ascii不是utf8)。目前推荐的最佳做法是在用7位ASCII编码的C语言环境中使用英语,然后翻译为所有其他语言。这是一个重要的重新设计(并且被公认为口头禅),但除非有人改进了这些工具(这将会更重要的重新设计),这可能是您最好的选择。

+0

谢谢你的回答!当然,我们在选择俄语作为基本的关键语言时犯了一个错误,但是现在我们已经有了很多源代码和6个翻译不同语言的目录,现在这是一个重播的问题。试图找到替代解决方案。 – elatonsev 2015-04-02 08:19:09

+0

这是源过滤可能是解决方案的情况。那就是编写一个程序来翻译源代码,同时复制它。如果你需要帮助,我以前就做过。如果它是一个开源项目给我一个链接,我会这样做。如果它是封闭的来源,并希望我为你做,我愿意支付。 – hildred 2015-04-02 14:05:05

0

只有解决这个问题的方法是在编译* .mo文件时删除未翻译的字符串。 补丁babel /消息/ mofile.py write_mo与

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