Qt语言专家(linguist)很容易处理多语言问题,但是最近遇到奇怪的问题,百思才得解,记录并分享经验。
代码如下:
main.cpp :
==========================
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTranslator translator;
QString strLangFile = GetCurrentLangFile(); // 从配置中获取当前多语言编译文件,.qm格式
if (translator.load(strLangFile)) {
a.installTranslator(&translator);
}
// 其余代码省略
}
Class1.h :
=======================
Class1 {
private:
static QString s_strTexts[3];
};
Class1.cpp :
=======================
QString Class1::s_strTexts[3] = {
tr("字符串1"),
tr("字符串2"),
tr("字符串3"),
};
Class1 类定义了一个静态成员变量数组,用来定义该类使用的字符串列表。
问题:
在main.cpp中执行了 installTranslator()函数后,发现字符串总是没有被翻译成指定的语言。
原因:
静态成员变量的加载时机先于 main() 函数的执行,因此对installTranslator()函数的调用没有作用到s_strTexts静态成员变量。
解决方案:
-
将 s_strTexts设计为非静态成员变量;
-
每次引用s_strTexts的元素时,都调用QCoreApplication::translate() 函数显示翻译语言;
显然采用方案1比较方便,但是有多Class1对象时,会有多份字符串列表的副本。若列表很长,占用的内存会显著增加,则可考虑使用方案2.