玩轉Qml 4 I18n動態國際化

2021-10-13 07:23:08 字數 3078 閱讀 4865

多國語言版本

i18n 是 internationalization(國際化) 的首尾字元加中間的 18 個字元。隨著產品越做越大,要推向國際的時候,國際化這一步

是必不可少的。i18n 的方案有很多,這裡只討論在qt/qml中的方案。

《玩轉qml》系列文章,配套了乙個優秀的開源專案:taoquick

github

訪問不了或者速度太慢,可以用國內的映象**gitee

看一下最終效果

目前支援的語言包括:

(其中阿拉伯文是從右往左寫的,qml預設的處理看起來不完全正確。

濤哥對阿拉伯也不是很熟,就不深入研究了。)

先說一下原始碼中輸出中文的問題。

在檔案本身的編碼是utf-8的前提下,以下三種方式都可以直接輸出中文。

qinfo() << u8"山有木兮木有枝,心悅君兮君不知。";
qinfo() << qstringliteral("黃河遠上白雲間,一片孤城萬仞山。");
qinfo() << qstring::fromlocal8bit("人生若只如初見,何事秋風悲畫扇。");
u8是c++11標準支援的字串字面量寫法,可以參考

qstringliteral是qt特有的巨集,用來在編譯期生成字串字面量,效果和u8類似。

qstring::fromlocal8bit可以在執行過程中,動態處理中文字串。

c++**中的字串使用qobject::tr()包起來,類本身是qobject的子類時可以省略作用域「qobject::」,直接寫tr

qml**中使用qstr把字串包起來

pro檔案中新增一句translations += trans_zh.qs ,這個名字起什麼無所謂,關鍵是『_zh』要有。

呼叫lrelease工具,掃瞄專案並生成trans_zh.qs 檔案。這個檔案是xml格式的,未經過翻譯的,需要為這個檔案做一些翻譯工作。

後面說怎麼做翻譯。

翻譯做好後,呼叫lupdate工具,生成trans_zh.qm檔案。這個檔案就是把xml變成了二進位制。

將qm檔案放在執行路徑,或者資源檔案裡。

在5.10以前的版本,qt是不能直接動態切換語言的,要麼重新啟動程式,要麼把所有的text都set一遍,retranslate是5.10才有的介面。

濤哥這次的方案,以retranslate為主,5.10以前還有各路大神的動態切換語言方案,不在本次文章的討論範圍。

qt提供了視覺化的工具,即qtdir/bin路徑下的linguist.exe,可以直接開啟我們拿到的trans_zh.qs檔案。這個工具可以由程式設計師之外不懂xml的專業翻譯人士使用。

小工具已經開源 qt-transer

當然這種小工具qt也能做,濤哥使用go純屬興趣。

需要在qt/c++**中實現,並提供給qml呼叫。這裡以中文和英文為例,濤哥直接寫在了自定義qquivkview的**裡。

class taoview : public qquickview

;

// taoview.cpp

#include "stdafx.h"

#include "taoview.h"

#include #include taoview::taoview(qwindow *parent) : qquickview(parent)

void taoview::retrans(const qstring &lang)

//切換語言

m_lang = lang;

if ( lang == qstringliteral("中文簡體"))

else if (lang == "english")

}

和文章3 qml元件化程式設計3-動態切換** 類似, 在標題欄按鈕中做乙個切換按鈕

// titlebar.qml

timagebtn

tpopup }}

}}

前面的**只有中文和英文,已經可以說明問題了。

這裡再把最終版本的多國語言的貼出來。

這是標頭檔案

#pragma once

#include #include class taoview : public qquickview

signals:

void retransed();

void languagelistchanged();

private:

qstring m_lang;

qmap> m_transmap;

qtranslator *m_plastlang = nullptr;

qstringlist m_languagelist;

};

這是cpp

#include "stdafx.h"

#include "taoview.h"

#include #include taoview::taoview(qwindow *parent) : qquickview(parent)

m_plastlang = m_transmap[m_languagelist.at(0)].get();

m_lang = m_languagelist.at(0);

emit languagelistchanged();

}void taoview::retrans(const qstring &lang)

m_lang = lang;

m_plastlang = m_transmap[lang].get();

engine()->retranslate();

emit retransed();

}

還有qml

....

timagebtn

tpopup }}

}}....

react Taro 使用i18n國際化

npm install react i18next i18next i18next browser languagedetector 新建index.jsx import languagedetector from i18next browser languagedetector import i1...

struts2 i18n國際化問題

根據實驗結果,做乙個簡單的總結 一.action級別 對應乙個action可以定義乙個資源檔案,可供這個action使用,例如helloaction public class helloaction extends actionsupport 對應的properties檔案是 hello hello...

iOS應用的國際化i18n

ios應用的國際化,主要分為3個部分 下面我就來一一說明。info.plist 檔案的國際化 我們使用xcode 4.5 建立乙個新專案,會自動建立乙個 en.lproj 目錄,這個目錄下存放的就是需要國際化的檔案 預設為英文 下面,我們還需要建立中文國際化支援。1.建立名為 zh hans.lpr...