2015-03-31 86 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]