2010-01-07 52 views
8

我有幾個應用程序用PyQt4編寫,我已經使用標準Python gettext庫進行GUI的國際化和本地化。它適合我。但是我選擇gettext僅僅是因爲我已經有了gettext使用的知識和經驗,並且沒有使用Qt4 tr()方法的經驗。使用gettext代替QObject.tr()進行PyQt4應用本地化的優缺點?

現在我想更好地比較這兩種方法,並通過使用gettext而不是QObject.tr來了解我所缺少的東西,以及爲什麼我不應該使用gettext來處理Qt4/PyQt4應用程序嗎?

在使用的gettext的我的理解優點是:

  • GNU gettext的是成熟的,它似乎是標準的事實上的在GNU/Linux世界。
  • PO文件有足夠的特殊編輯來簡化翻譯工作,但PO模板的文本性質使其不是絕對必要的。
  • 甚至還有可用於協作翻譯的網絡服務。
  • gettext是標準的Python庫,所以我不需要安裝任何特殊的東西來在運行時使用它。
  • 它通過ngettext()對單數/複數形式選擇有很好的支持。

我看到了什麼是QObject.tr()的優點:

  • 這是本土技術的Qt4/PyQt4的,所以也許它會工作得更好/更快(雖然我沒有數據證明)。
  • 要翻譯的消息可以具有附加的上下文信息,這將有助於翻譯者爲同音詞詞彙選擇最佳變體,例如,根據實際情況,英文單詞「Letter」可以翻譯爲「字符」,「郵件」或甚至「紙張大小」類型。

我看到了什麼是QObject.tr的缺點()VS的gettext:

  • 我沒有Qt文檔如何支持的功能單數/複數選擇那裏找到。
  • Qt4 TS翻譯模板採用XML格式,因此在沒有特殊編輯器(QT Linguist)的情況下編輯起來更加複雜,似乎沒有其他第三方解決方案或Web服務。所以翻譯人員需要學習新的工具(如果他們已經熟悉PO工具)。

但是,上述所有項目都不夠清楚地說任何工具都比其他工具更好。我不想開始火焰戰爭,因爲這很主觀。我只想知道我缺少的QObject.tr()與gettext的利弊。

回答

-1

您可以添加參數的管理方式不同...

隨着Gettext的,我們能做到

_("Hello %(name)s from %(city)s") % {person.__dict__}

而在PyQt的,我們做

self.tr("Hello %1 from %2").arg(person.name).arg(person.city)

2

一個簡單的理由來使用QObject.tr()是:

這樣可以節省你的需要在Windows上安裝gettext,使跨平臺的工作更容易一些。 我嘗試在Windows上儘可能少地使用二進制依賴關係。

2

所有這些都有其優點和缺點,但要更明確地定義它們,您必須首先定義如果您的目標是移動環境或桌面環境。

在我們公司內部,我們使用不同的方法,因爲理想的解決方案還不存在。 對於桌面開發,我們使用PO文件只是因爲按鈕沒有縮放,因此文本會適合。 對於移動開發,字符串的翻譯取決於橫向和縱向設備上可能不同的按鈕尺寸。 所以這使得它稍微複雜一點,因爲PO文件只能有1個單詞的翻譯。 所以我們爲此選擇了XLIFF,因此我們可以爲字符串分配唯一的ID。 這也不是一件容易的事情,因爲沒有很好的解決方案將.RC文件轉換爲XLIFF文件。 (因爲當前的工具將所有字符串轉換爲「」,這當然是不需要的行爲)。 所以我爲這個任務寫了一個轉換器。

但是,在考慮本地化時,複數形式非常重要,所以不會有這個不好的本地化解決方案。 因此,我會說要去PO gettext。

Greetings, Floris。

2

在當前的時間,當你利用QT_TRANSLATE_NOOP的

+1

我想補充Qt不處理複數形式的'TR(「您選擇了%N項目(S)」,item.count ())'看起來好像它可能工作,但它在Qt的系統中記錄很差,如果說你真的想要兩個(或更多)不同的字符串,而不僅僅是一個後綴,真的沒有解釋如何放置:'tr(「 %n item {is | s are}現在處於選擇狀態。「,,item.count())' – SlySven 2016-01-19 07:38:36