Я использую 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();
}
qt_fr.qm файл находится в path_to_qt / Qt5.6.2 / 5,6 / mingw49_32 / переводы для пользователей Qt5.6.2 и MinGW. Я копирую указанный файл в каталог работающего программного обеспечения, но переводчик всегда не может его загрузить. Но когда я использую свой собственный файл qm (созданный из файла .ts с использованием инструментов Qt lupdate и lrelease), файл 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 попытается сделать это первым, и я также показал, как составить имя файла из определенного объекта локали).
Если мы проверяем qt_fr.qm
использование файла lconvert -of ts /usr/share/qt5/translations/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()
позвони соответственно.
Других решений пока нет …