2012-05-03 36 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

相關問題