Qt — использовать встроенные переводы

Я использую 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 загружается и устанавливается правильно.

Я что-то упускаю или делаю не так?

0

Решение

Я думаю, что проблема может быть в том, что вы не скопировали полный каталог сообщений. Следующее работает для меня в системе 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() позвони соответственно.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]