3

我遇到了一个奇怪的 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”,它的“英文翻译”看起来没问题。

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"

}

有任何想法吗?

4

1 回答 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>

前提是您YourProjectName_en.qmtranslation/子目录中。

这就是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);

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/"))
于 2012-05-03T19:39:37.723 回答