2008-11-11 41 views
29

編輯:我真的很想看到關於格式的一些一般性討論,他們的優點和缺點!i18n - 國際化的最佳實踐 - XLIFF,gettext,INI,...?

編輯2:'賞金並沒有真正幫助創建所需的討論,但有一些有趣的答案,但該主題的綜合報道仍然缺失。六人將問題標記爲最愛,這表明我對這次討論感興趣。

當決定國際化最難的部分IMO是存儲格式的選擇。

例如在Zend PHP框架提供了以下適配器,涵蓋幾乎所有我的選擇:

  • 陣:沒有,很難維持
  • CSV:不知道,用編碼可能出現的問題
  • 的Gettext:經常使用,poEdit的可用而複雜的
  • INI所有平臺:不知道,POSS編碼的問題
  • TBX:無線索
  • TMX:太大了嗎?沒有編輯可以免費獲得。
  • QT:不是很普遍,沒有免費工具
  • XLIFF:合作標準?但沒有免費的工具可用。
  • XMLTM:不,不是我所需要

基本上我卡與4 '大膽' 的選擇。我想使用INI文件,但是我正在閱讀有關編碼問題......如果我使用嚴格的UTF-8(文件,連接,數據庫等),它真的是個問題嗎?

我在Windows上,我試圖找出poEdit的功能,但沒有管理。在網上沒有任何教程,是gettext仍然是選擇還是瀕危物種呢?

怎麼樣XLIFF,有沒有人與它合作?有關使用哪些工具的任何提示?

任何想法Eclipse任何這些技術的集成?

回答

12

總是有Translate Toolkit它允許我認爲所有提到的格式之間進行翻譯,並且首選的gettext(po)和XLIFF。

1

如果您願意,您可以使用INI,這只是INI無法告訴任何人使用UTF8,所以如果有人用編輯器打開INI,可能會損壞您的文件。

所以這個想法是,如果你可以信任用戶使用UTF8編碼進行編輯。

您可以在文件的開頭添加BOM,一些編輯知道它。

你想存儲什麼?用戶生成的內容或您的應用程序資源?

+0

我想ini中存儲中的語言字符串。然後我會爲每種語言和每個模塊提供一個ini。比如default.en,default.de,默認。 fr ... – markus 2008-11-11 07:50:43

+0

然後你可以使用一個簡單的INI,你只需要在你的文檔中聲明翻譯文件需要UTF8。如果譯者沒有,這是他的錯:) – CiNN 2008-11-11 08:01:46

+0

我做了一個變種(例如每種語言的INI類型文件),並將其加載到自定義哈希表中。除了在C應用程序中圍繞一些本土OO外,它速度很快並且工作得很好。 – torial 2009-03-03 06:40:38

15

POEdit並不是真的很難得到。只需創建一個新的.po文件,然後告訴它從源文件導入字符串。該程序會掃描您的PHP文件以查找與_("Text"), gettext("Text")等匹配的任何函數調用,您甚至可以指定自己的函數來查找。

然後,您在相應的框中輸入翻譯。當您保存.po文件時,會自動生成一個.mo文件。這只是gettext可以輕鬆解析的翻譯版本。

在你的PHP腳本做出bindtextdomain()打電話,告訴它在您的.mo文件的位置。現在任何傳遞給gettext(或下劃線函數)的字符串都將被翻譯。

這使得翻譯文件保持最新變得非常簡單。 POEdit還具有一些簡潔的功能,例如允許評論,顯示已更改和刪除的字符串以及允許模糊匹配,這意味着您不必重新轉換已稍作修改的字符串。

1

我曾與其中兩個格式的l18n側:TMX和XLIFF。他們非常相似。 TMX現在更受歡迎,但XLIFF正在迅速獲得支持。當我上次查看它時,至少有一個免費的XLIFF編輯器:Transolution但它現在還沒有開發。

0

一個相當簡單的方法是隻使用資源文件和資源腳本。像MSVC這樣的程序編輯它們沒有問題。他們對其他系統(以及文本編輯器)也相當友好。您只需爲每種語言創建不同的字串表(位圖和表),並標出每個這樣的表,它是什麼語言。

0

這些選擇都看起來很開胃我。

如果你將文件發送出去的多國語言翻譯,那麼你希望能夠相信這些編碼是正確的,特別是如果你沒有一個在你的團隊講這些語言。有時候很難發現一種外語的編碼問題,如果讓你的操作系統「猜測」,那麼對於無意中損壞的文件編碼來說,這太容易了。

你真的想要一個聲明其編碼的格式。否則,譯員或他們的翻譯工具可能會選擇UTF-8以外的內容。對於我的錢來說,任何一種簡單的XML格式都是最好的,但看起來你需要在Zend中推出自己的產品。 XLIFF和TMX肯定是矯枉過正。

像Java的XML資源這樣的格式是理想的。

1

我使用自定義設計自己做數據存儲 - 所有顯示的文本都存儲在數據庫中。

我有兩個表。 第一個表格有一個標識值,一個32字符的varchar字段(在此字段上索引) 和一個200個字符的短語英語說明。

我的第二表具有與所述第一表中,語言代碼(EN_UK,EN_US等)和文本一個nvarchar列中的標識值。

我使用一個nvarchar的文本,因爲它支持的我還沒有使用其它字符集。

第一個表中的32個字符varchar存儲類似'pleaselogin'的內容,而第二個表實際存儲完整的「請在下面輸入您的登錄名和密碼」。

我創建了一個在運行時替換的動態值的巨大列表。一個例子是「您有{{dynamic:passworddaysremain}}天來更改您的密碼。」 - 這使我可以解決以不同語言排序的單詞。

我只需要處理阿拉伯數字到目前爲止,但將不得不爲第一個需要非阿拉伯數字的用戶工作。

我實際上是以2小時的時間間隔將這些信息從數據庫中提取出來,並將其緩存到XML中每種語言文件的磁盤上。廣泛使用CDATA被使用。

有很多選項可用,對於每種語言可以使用html模板的性能 - 我的方法運行良好,但在運行時用很多XML DOM來創建頁面。

0

這可能與迄今爲止發佈的內容有點不同,但可能並不完全符合您的要求,但我想我會添加它,如果沒有別的方法,只能採用不同的方法。我採用了面向對象的方法。我所做的是創建一個系統,通過將它們存儲在一個string =>轉換對數組中,將語言文件封裝到一個類中。訪問翻譯是通過一種稱爲翻譯的方法,將鍵字符串作爲參數。擴展類繼承父類的語言數組,並可以添加或覆蓋它。因爲這些類是可擴展的,所以您可以更改基類,並通過子級傳播更改,從而使其本身比數組更容易維護。另外,你只需要調用你需要的類。

0

我們只是將字符串存儲在數據庫中,並在應用程序中內置了一個翻譯器模式,以處理實際爲不同語言添加字符串。

在我們使用各種技巧來創建文本ID的應用程序,像

£("btn_save") 
£(Order.class,"amt") 

的翻譯是從數據庫加載系統啓動時,或當重載手動觸發。 £方法負責根據用戶會話中指定的語言查找翻譯後的字符串。