我遇到了一个奇怪的Qt翻译问题.
由于我无法改变的原因涉及翻译表的遗留数据库,我们的"自然语言"是"Enums".
QString myString = tr("OUR_APP_MY_STRING");
Run Code Online (Sandbox Code Playgroud)
我有一个脚本,可以从我们的数据库中构建*.TS文件,供Qt使用.
英语*.TS文件中的条目如下所示:
<message>
<source>OUR_APP_MY_STRING</source>
<translation>My String</translation>
</message>
Run Code Online (Sandbox Code Playgroud)
*.TS文件可以很好地加载到Qt Linguist中.那里的一切看起来很好.找到"OUR_APP_MY_STRING",其"英文翻译"看起来不错.
QT项目文件在我使用的TRANSLATION部分中有*.TS文件lRelease生成.QM文件并将它们放在应用程序的资源( .qrc)文件中.
在我的应用程序的设置函数(构造后由main()调用)我有以下代码:
// initialize translator
this->currentTranslator = new QTranslator(instance());
if (this->currentTranslator->load(":/translation/myApp_en.qm"))
{
this->installTranslator(this->currentTranslator);
QString test = tr("OUR_APP_MY_STRING"); // <<----- problem. output is always "OUR_APP_MY_STRING"
}
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
目前还不清楚instance()
这一行是什么
this->currentTranslator = new QTranslator(instance());
Run Code Online (Sandbox Code Playgroud)
但无论如何,这里有一些要检查的事情:
YourProjectName.pro
吗?Run Code Online (Sandbox Code Playgroud)RESOURCES += \ resources.qrc
(这resources.qrc
是我经常使用的名称.替换为您选择的任何名称.)
resources.qrc
吗?你确定那里有一个translation/
前缀吗?这样的事情也应该有效:Run Code Online (Sandbox Code Playgroud)<RCC> <qresource prefix="/"> <file>translation/YourProjectName_en.qm</file> <!-- other resources here --> </qresource> </RCC>
只要你有YourProjectName_en.qm
一个translation/
子目录.
这就是Works for Me™:
在main.cpp
:
QApplication app(argc, argv);
QApplication::setApplicationName("MyApplication");
QApplication::setApplicationVersion("4.4");
QApplication::setOrganizationName("FUBAR");
QApplication::setOrganizationDomain("www.fu.bar");
QTranslator translator;
translator.load(app.applicationName() + "_" + QLocale::system().name(), ":/ts");
app.installTranslator(&translator);
Run Code Online (Sandbox Code Playgroud)
在resources.qrc
:
Run Code Online (Sandbox Code Playgroud)<RCC> <qresource prefix="/"> <file>resources/pixmaps/exit.png</file> <!-- ... --> <file>ts/MyApplication_en.qm</file> <file>ts/MyApplication_es.qm</file> </qresource> </RCC>
在MyApplication.pro
:
TRANSLATIONS += \
ts/MyApplication_en.ts \
ts/MyApplication_es.ts
RESOURCES += \
resources.qrc
win32 {
RC_FILE = win32.rc
}
OTHER_FILES += \
win32.rc \
TODO.txt
Run Code Online (Sandbox Code Playgroud)
以下是项目树的简要说明:
MyApplication
??? resources
? ??? pixmaps
? ??? ...
??? (sources are here)
??? MyApplication.pro
??? resources.qrc
??? TODO.txt
??? ts
? ??? MyApplication_en.qm
? ??? MyApplication_en.ts
? ??? MyApplication_es.qm
? ??? MyApplication_es.ts
??? win32.rc
Run Code Online (Sandbox Code Playgroud)
这是一个非常小的项目,来源与一些文物混合在一起.
编辑:
我认为你应该尝试将文件名和目录部分分开给load方法.简而言之,改变这一行
if (this->currentTranslator->load(":/translation/myApp_en.qm"))
Run Code Online (Sandbox Code Playgroud)
对此
if (this->currentTranslator->load("myApp_en.qm", ":/translation/"))
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2563 次 |
最近记录: |