Qt Translation返回相同的字符串而不是翻译

Jas*_*enX 3 qt

我遇到了一个奇怪的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)

有任何想法吗?

dsc*_*ulz 6

目前还不清楚instance()这一行是什么

 this->currentTranslator = new QTranslator(instance());
Run Code Online (Sandbox Code Playgroud)

但无论如何,这里有一些要检查的事情:

  • 你有这样的东西YourProjectName.pro吗?
RESOURCES += \
   resources.qrc 
Run Code Online (Sandbox Code Playgroud)

(这resources.qrc是我经常使用的名称.替换为您选择的任何名称.)

  • 你检查过你的前缀了resources.qrc吗?你确定那里有一个translation/前缀吗?这样的事情也应该有效:
  <RCC>
    <qresource prefix="/">
      <file>translation/YourProjectName_en.qm</file>
      <!-- other resources here -->
    </qresource>
  </RCC>
Run Code Online (Sandbox Code Playgroud)

只要你有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:

<RCC>
   <qresource prefix="/">
     <file>resources/pixmaps/exit.png</file>
     <!-- ... -->
     <file>ts/MyApplication_en.qm</file>
     <file>ts/MyApplication_es.qm</file>
   </qresource>
</RCC>
Run Code Online (Sandbox Code Playgroud)

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)