2012-05-03 30 views
3

我遇到了奇怪的Qt翻译问题。Qt Translation返回相同的字符串而不是翻译

由于我无法改变涉及翻译表的遗留数据库的原因,我们的'自然语言'是'枚举'。

QString myString = tr("OUR_APP_MY_STRING"); 

我有一个脚本,它将* .TS文件从我们的数据库中构建出来供Qt使用。

该条目在* .ts文件的英文看起来像这样:

<message> 
    <source>OUR_APP_MY_STRING</source> 
    <translation>My String</translation> 
</message> 

的* .TS文件加载罚款到Qt语言。那里的一切都很好看。找到“OUR_APP_MY_STRING”并且其“英文翻译”看起来不错。

的QT项目文件的翻译部分 的* .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" 

} 

任何想法?

回答

6

目前还不清楚什么是在这条线

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

但无论如何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/")) 
+0

回答你的问题:是的,我在我的项目文件中的* .qrc文件。我所有的应用图片都在那里。 * .qrc文件的前缀是“/”。文件夹存在。我们之间唯一的区别是,我从我的QApplication派生类中加载并初始化了翻译器,并且您正在从主要方法中进行此操作。 – JasonGenX

+0

@ RM1970编辑了我的答案,请看底部。 – dschulz

+0

这不是加载部分。我放弃了资源,只为了解问题出在哪里。我直接从我的硬盘上加载,并且加载很好。负载返回“true”.. QTranslator上的“isEmpty”返回false。我觉得我遇到了麻烦,因为我的* .TS文件是UTF-8,因为我的应用程序被翻译成13种语言,有些非常奇特。我无法弄清楚如何解决它。翻译字符串总是返回相同的字符串,未翻译。 – JasonGenX

相关问题