2008-10-12 68 views
14

我正在使用C++中的語言環境和I18N東西,並且一直在尋找真實世界的例子。我已經閱讀了關於I18N的Josuttis章節,他的book(2012年4月發佈的第二版C++ 11)發現它很有用,但沒有真實世界的例子來繪製我不知道我是否遵循最佳實踐承諾初學者的錯誤。 StackOverflow可以在網絡和打印機上使用哪些資源來執行C++中的I18N?C++中的I18N的資源

還有哪些庫可用於C++,使i18n更容易?標準庫中沒有需要的東西?乍一看,標準庫中不存在UTF8支持。

編輯:

做一些更多的閱讀後,似乎C和C++都是Unicode的 「不可知」。對於處理以Unicode/UTF8/16/32編碼的數據,似乎也需要使用第三方庫。關鍵在於標準庫本身只考慮ISO 8859和相關字符頁面,這些頁面根據您的語言環境設置而變化。這意味着我可能想使用ICU庫來獲取字符串,而不是使用std::string甚至std::wstring

回答

0

看看GNU gettext

這將是有趣的,知道您正在使用哪些C++庫,一些GUI庫已經提供了國際化支持。

0

第二個GNU gettext。但是,如果你使用的是Qt(如果你想用C++來做GUI,那麼機會就很大),Qt帶有它自己的gettext版本和一個很好的翻譯工具(Qt Linguist),它可以讓事情變得更簡單,也可以使用從非GUI應用程序沒有開銷。我們甚至有服務。

然而,關於什麼C++缺乏,正是在我腦海中:

  • 的關於數字,日期或貨幣語言環境的全面支持。請記住,語言環境不僅僅是小數點分隔符,包括排序,這將我帶到第二點:
  • C++本身沒有支持有序參數的格式函數(因爲在另一種語言中,詞序可能不同比你的語言)。你可以使用boost :: format。 Qt當然也支持它。

也看看你自己做了什麼,即使這些東西都支持。例如,.NET提供了可供使用的語言環境的完整列表。

9

您已被指向GNU gettext,它允許您在運行時使用本地化版本替換文字字符串 - 本地化的一個方面(這是發生在完成國際化後發生的情況,當某人實際使用您的國際化代碼在特定的語言環境中)。您也被指向Boost(特別是Boost.Locale)庫;對於任何與C++相關的東西來說,這通常是一個很好的答案

您可能會看到的另一個地方是ICU(國際組件爲Unicode)項目。作爲數據來源,您可以將CLDR(Common Locale Data Repository)視爲關於不同語言環境的信息來源; Unicode網站還有許多關於不同文化的其他方面的信息,因爲它處理多種語言。

作爲現在的最後一個資源,有一個相當專業的資源,有Olson Time Zone database,每年更新多次以跟蹤不同國家在冬季和夏季之間更改何時更換規則的方式(日光節約和標準)的時間。

1

看看wxWidgets國際化的例子。它有一個非gnu實現的gettext(前面提到)中使用的翻譯機制。您甚至可以在商業應用程序中使用它,因爲wxWidgets許可證允許您這樣做。

如果您只是在查看應用程序國際化的方法,gettext是一個起點。

0

對於UTF-8支持,請查看UTF-8 CPP庫。

-2

您不需要庫來完成此任務。有關Satellite DLLs here的詳細信息,請參閱MS指南。

如果您指定在項目設置中使用Unicode並使用Unicode字符串函數(而不是char),那麼標準使用Satellite DLL來保存特定於語言環境的數據(對話框,字符串等)就足夠了。

只要DLL正確命名,Windows本身就會負責找到正確的資源。附屬DLL所需的後綴是here