[英]Qt - Use builtin translations
我正在使用Qt,並且想要“本地”翻譯Qt小部件顯示的文本。 例如,“本地顯示的文本”是指上下文菜單中顯示的文本編輯(復制,粘貼等)。
這是我已經完成的工作:
#include <QApplication>
#include <QDebug>
#include <QTranslator>
#include <QFile>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTranslator translator;
if(translator.load("qt_fr.qm", QApplication::applicationDirPath())) {
qDebug() << a.installTranslator(&translator);
}
qDebug() << QFile::exists(QApplication::applicationDirPath() + "/qt_fr.qm"); // just to debug file existence
// MainWindow w; // not related to my question
// w.showMaximized(); // neither is this
return a.exec();
}
對於Qt5.6.2和MinGW用戶, qt_fr.qm文件位於path_to_qt / Qt5.6.2 / 5.6 / mingw49_32 / translations 。 我將所述文件復制到正在運行的軟件目錄中,但翻譯器始終無法加載該文件。 但是,當我使用自己的qm文件(使用Qt lupdate和lrelease工具從.ts文件構建)時,qm文件已正確加載和安裝。
有什么我想念的或做錯的嗎?
我認為問題可能是您尚未復制完整的消息目錄。 以下在Debian系統上使用標准位置的QM文件為我工作:
#include <QApplication>
#include <QDebug>
#include <QLocale>
#include <QTranslator>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTranslator translator;
const QString dir = "/usr/share/qt5/translations";
if (translator.load("qt_fr", dir)) {
qDebug() << "first load succeeded:"
<< "'Open' =>" << translator.translate("QShortcut", "Open");
}
if (translator.load(QLocale::French, "qt", "_", dir)) {
qDebug() << "second load succeeded:"
<< "'Open' =>" << translator.translate("QShortcut", "Open");
}
}
輸出是
first load succeeded: 'Open' => "Ouvrir"
second load succeeded: 'Open' => "Ouvrir"
(我從文件名中刪除了.qm
,因為Qt會首先嘗試這樣做,並且我還展示了如何從特定區域設置對象組成文件名)。
如果我們使用lconvert -of ts /usr/share/qt5/translations/qt_fr.qm
檢查qt_fr.qm
文件,我們可以看到它只是一個很小的文件,通過引用合並了其他文件:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="fr_FR">
<dependencies>
<dependency catalog="qtbase_fr"/>
<dependency catalog="qtscript_fr"/>
<dependency catalog="qtquick1_fr"/>
<dependency catalog="qtmultimedia_fr"/>
<dependency catalog="qtxmlpatterns_fr"/>
</dependencies>
</TS>
我認為最可能引起您症狀的原因是無法加載一個或多個依賴文件。 您應該確保所有這些文件區域在將qt_fr.qm
復制到-的同一位置可用,或者,如果僅需要“基本”翻譯,則只需復制qtbase_fr.qm
,並適當地更改您的translator.load()
調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.