亂談Qt程式之i18n的實現(從C 到Qt)

2021-08-26 03:41:39 字數 2465 閱讀 6243

嘿嘿,本文只是試圖從純c++的角度告訴你 qt 的國際化是到底是怎麼一回事(注:本文只看乙個點,不看面)。而不會一步一步告訴你qt的國際化/本地化怎麼用(這些東西在qt manual、論壇 以及 相關書籍中介紹的夠多了)。

qt 國際化所做的就是這點東西:

至於動態翻譯:點一下選單,介面文字全改變,這在qt中是相當容易實現的東西。

其實,根本就沒有動態這回事。所謂的動態翻譯,就是我們載入了乙個新的翻譯檔案,然後將介面的文字用新的重新設定了一遍。

我們找個超簡單的c++的小例子看看,並一步一步讓它變的複雜一點點。

看乙個 hello world 的例子:

#include #include #include #define tr(x) l##x

int main()

恩,編譯執行,看到結果

hello world

如何翻譯這個程式呢?

源單詞和目標單詞的對應關係,我們就叫它詞典好了。

typedef std::mapmap;

map chinese;

map japanese;

map norwegian;

int create_maps()

int dummy = create_maps();

有了翻譯的內容,需要安裝一下,讓我們的程式知道翻譯內容的存在吧?

map * globalmap = 0;

int main()

第乙個例子中的巨集可以丟掉了,我們寫乙個函式:

std::wstring tr(const char * text)

wchar_t wcs[100];

mbstowcs(wcs, text, 99);

return std::wstring(wcs);

}

將3部分合到一塊:

#include #include #include #include #include 

typedef std::mapmap;

map chinese;

map japanese;

map norwegian;

int create_maps()

int dummy = create_maps();

map * globalmap = 0;

std::wstring tr(const char * text)

wchar_t wcs[100];

mbstowcs(wcs, text, 99);

return std::wstring(wcs);

}//#define tr(x) l##x

int main()

看看執行結果:

你好 世界

qt 又做了什麼呢?

qt

我們的例子

lupdate/lrelease/...

map/map/map

生成翻譯/詞典檔案

qtranslator

globalmap

安裝翻譯檔案

tr()

使用翻譯檔案

從根本上說,qt 國際化所做的就是這點東西:

注意,tr就是乙個將 const char * 變成 qstring 的函式:

qstring qobject::tr ( const char * sourcetext,...)

對於tr,我們在qt中translate、tr關係 與中文問題有了比較詳細的討論,此處就不重複了。

點一下選單,介面文字全改變,這在qt中是相當容易實現的東西。也就是大家所說的動態翻譯。

其實,根本就沒有動態這回事。所謂的動態翻譯,就是我們載入了乙個新的翻譯檔案,然後將介面的文字用新的重新設定了一遍。

考慮我們前面的例子,稍微改改:

int main()

儘管都是用tr,但3處 welcome 的內容卻不相同,動態翻譯也就是這回事。

這也是為什麼,uic生成的** ui_***.h 中始終有:

void retranslateui(qdialog *dialog)

// retranslateui

這種函式存在的原因。

當你安裝了新的翻譯檔案以後,只需要重新呼叫一遍這個函式就行了。

但你安裝新的翻譯檔案後,應用程式會給各個視窗傳送乙個事件,此時,是呼叫上述函式的最佳時機

void mainwindow::changeevent(qevent *e)

}

大家對這個函式應該都不陌生,畢竟,qt creator會自動為你生成它。不管你到底用還是不用。

i18n呼叫自己引數 I18N的前後端實現

所需工具 1 vue 2 vue i18n 前期設定 1 構建兩個json語言字典,如果就中英文切換就分別構建 string en.json 和string zh.json,格式如下 2 讀取前一步驟建立的字典,並構造vuei18n元素 獲取本地語言包 非同步獲取會沒有response,需要暫時關閉...

Cakephp中如何實現i18n?

好像網上一直沒有比較詳細的中文資料來講述如何使用cakephp來實現i18n。正好昨天被逼無奈的將 中的提示中文化了一把,略有心得,簡而志之。中文化cakephp有如下幾步 在需要進行中文化的地方使用 函式,如下所示 this is the string i need to translate tr...

I18n實現多語言包

url localization 外掛程式介紹 在 rails 2.2 版本之前,rails 應用程式都是採用localization外掛程式實現應用程式的本地化,支援多語言。localization有點類似於gettext,使用很簡單的方法就可以為你的應用實現多語言支援,進而實現應用的本地化。ra...