Qt翻译返回相同字符串而非翻译

4

我遇到了一个奇怪的Qt翻译问题。

由于涉及到翻译表的传统数据库,而我无法更改,因此我们的“自然语言”是“枚举”。

QString myString = tr("OUR_APP_MY_STRING");

我有一个脚本,可以从我们的数据库构建*.TS文件以供Qt使用。
英语的*.TS文件条目如下:
<message>
    <source>OUR_APP_MY_STRING</source>
    <translation>My String</translation>
</message>

*.TS文件在Qt Linguist中可以正常加载,一切看起来都很好。“OUR_APP_MY_STRING”被找到了,并且它的“English Translation”看起来很好。

QT 项目文件将*.TS文件放在TRANSLATION部分中,我正在使用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"

}

任何想法?
1个回答

6

这行代码中的instance()不太清楚是什么意思

 this->currentTranslator = new QTranslator(instance());

总之,以下是一些需要检查的内容:

  • 您的 YourProjectName.pro 文件中是否有类似于此的内容?
RESOURCES += \
   resources.qrc 

(resources.qrc 是我通常使用的名称。请用您选择的任何名称替换它。)

  • 您是否检查了您的 resources.qrc 中的前缀?您确定其中有一个 translation/ 前缀吗?类似这样的内容也应该可以工作:
  <RCC>
    <qresource prefix="/">
      <file>translation/YourProjectName_en.qm</file>
      <!-- other resources here -->
    </qresource>
  </RCC>

假设您在translation/子目录下有YourProjectName_en.qm文件。

这是我的成功经验™

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);

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>

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

这里是项目树的简要描述:

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

这是一个非常小的项目,源码与一些构件混在一起。

编辑:

我认为你应该尝试将文件名和目录部分分开传递到加载方法中。简而言之,改变这行代码:

 if (this->currentTranslator->load(":/translation/myApp_en.qm"))

转换成这个

 if (this->currentTranslator->load("myApp_en.qm", ":/translation/"))

回答你的问题:是的,我在我的项目文件中有*.qrc文件。我的应用程序中的所有图像都在那里。*.qrc文件前缀为“/”。文件夹已存在。我们之间唯一的区别是,我从我的QApplication派生类中加载和初始化翻译器,而你是从主方法中进行的。 - JasonGenX
这不是加载部分的问题。我只是放弃了资源,以便找出问题所在。我直接从硬盘加载,加载很好。加载返回“true”。 QTranslator 上的“isEmpty”返回false。我认为我遇到困难,因为我的*.TS文件是UTF-8,而我的应用程序被翻译成13种语言,有些非常奇特。我无法弄清楚如何修复它。翻译字符串始终返回相同的字符串,未翻译。 - JasonGenX
@dschulz,项目文件中是否有一个变量可以将qrc_resources文件收集到像.moc文件的MOC_DIR文件夹中? - Niklas
1
@Niklas,一般情况下有一个名为RCC_DIR的资源文件目录,但我不确定这是否符合您的要求。您可以根据自己的需要对资源文件进行分类,并在.qrc文件中正确定义各个文件的路径。 - dschulz
@dschulz,我在寻找RCC_DIR。非常感谢! - Niklas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接