2011-02-03 74 views
8

我有一個使用XML文件的Qt項目。這些XML文件包含人類可讀的文本,並且應該使用Qt工具(lupdate,lrelease,QtLinguist)來翻譯此文本。Qt翻譯來自非源文件的字符串

問題是,如果可以通過lupdate生成.ts文件中的條目,而無需使用QT_TR_NOOP()宏和朋友從源代碼文件中的XML文件中複製字符串?或者一般來說,如何翻譯Qt項目的非源文件中的字符串?

+0

如果lupdate接受字符串/上下文對而不是僅僅是文件,那會很好;那麼可以在構建系統中包含這些東西。 – Joey 2014-02-17 12:41:06

+0

我發現了一個更簡單的方法來做到這一點。檢查我的答案:http://stackoverflow.com/questions/28166081/can-i-use-tr-and-lupdate-on-xml-files/28168782#28168782 – 2015-01-27 11:06:28

回答

5

我們遇到了同樣的問題:包含人類可讀字符串的XML文件。

我們的解決方案是確保XML文件中的人類可讀字符串易於提取(我們將它們放入LABEL屬性中),並且我們開發了一個小工具來解析XML文件,提取字符串,生成上下文(通過從XML文件中提取數據),然後生成包含QT_TR_NOOP()列表的CPP頭文件。

此文件已添加到我們的項目文件(.pro)中,該文件由lupdate使用。

該解決方案是罰款我們,但我們必須非常小心兩兩件事:

  • 運行此工具每次一個XML文件的內容發生變化。
  • 確保XML文件是UTF-8編碼的。
3

只要.qm文件具有匹配的翻譯/上下文,就可以使用tr()在運行時轉換所需的任何內容。 lupdate是否提取它應該沒有什麼區別。

我不知道如何使lupdate從任意的XML中提取字符串,但這並不意味着你不能使用語言學家。

  1. .ts文件也是XML;應該很容易製作一個將XML轉換爲.ts文件的XSLT。如果你想要定位標準而不是Qt,lupdate(和語言學家)也可以處理XLIFF文件。
  2. 你可以有多個.ts文件(就叫QTranslator ::負荷超過一次設置它的時候了)

如果你真的想擁有這一切在一個文件的翻譯,有你的XSLT副本lupdate生成的文件放入其輸出中。

只要您使用的上下文名稱不重複源代碼中使用的內容,這與許多應用程序爲每個DLL加載.qm的方式應該沒有任何區別(從Qt的角度來看)有GUI。

+0

XSLT的想法很好,謝謝!但是,我的項目實際上更復雜,用戶可以將可能包含XML文件的插件與不同的用戶定義模式集成。現在XSLT如何轉換人類可讀的和不可讀的? (我不確定我是否可以/應該要求用戶爲每個XML文件提供他們自己的XSLT ......) – Sascha 2011-02-04 00:07:35