Directorio de artículos
Código fuente de GitHub: QmlLearningPro , subproyecto seleccionado: TranslationsDemo.pro
Para otros artículos de QML, haga clic aquí: Notas de estudio de QT QUICK QML
1. Proceso de traducción de Qt
Proceso de traducción: la parte de traducción en el juego de números locos de Qt Ejemplo rápido de QML (programación mixta de QML C++, traducción, QSetting) :
1) Preparar el código fuente para la traducción
Use qsTr() para envolver en QML y use tr() para envolver en cpp. El texto envuelto en él será capturado por Qt Linguist para su traducción.
//main.qml
text: qsTr("Correct")
2) Generar archivo xxx.ts
Primero agregue el siguiente código al archivo TranslationsDemo.pro :
TRANSLATIONS += $$PWD/Translations/zh_CN.ts
Se puede generar usando dos métodos:
① En la barra de menú de Qt Creator, haga clic en Tools->External->Qt Linguist->Release update translation (lrelease)(lupdate) , y se generará un archivo ts en el directorio donde se encuentra el archivo de código fuente.
② Use el comando CMD para generar:
use luupdate TranslationsDemo.pro
se genera el archivo ts
3) zh_CN.ts se puede agregar en qml.qrc
4) Traducir y generar archivos qm
Método 1: haga clic con el botón derecho para abrir el archivo de traducción zh_CN.ts
y publíquelo después de la traducción:
se genera el archivo zh_CN.qm
Método 2, ejecuta el comando:
lrelease -verbose zh_CN.ts
Se genera el archivo zh_CN.qm
5) Agregue el archivo zh_CN.qm a qml.qrc:
6) Cargue el archivo de traducción qm
Cargue el archivo qm generado en main.cpp
void setLanguage(QGuiApplication *app) {
QLocale locale = QLocale::system();
if(locale.language() == QLocale::Chinese)
{
QTranslator *translator = new QTranslator(app);
///--以下三种方法都可以加载翻译文件
if(translator->load(":/translations/zh_CN.qm"))
// if(translator->load(locale, ":/translations/zh_CN.qm", "", ":/i18n"))
// if (translator->load(locale, "zh_CN", ".", ":/translations", ".qm"))
{
app->installTranslator(translator);
}
else {
qDebug() << "Error loading source localization ";
}
}
}
Finalmente compílalo.
2. Usa QT_TRANSLATE_NOOP para traducir
En el archivo .cpp, la traducción ordinaria se puede agregar al paquete de campo tr() y no hay introducción aquí.
Y usar QT_TRANSLATE_NOOP puede traducir múltiples segmentos de cadena fuera de la función y traducir en el mapa
1) Cadenas en funciones, como en el mapa:
Si no es factible envolverlo directamente con tr(), simplemente use QT_TRANSLATE_NOOP .
Consulte el código fuente para obtener más detalles, aquí solo hay fragmentos:
① Prueba de traducción.cpp
QStringList TranslationTest::GetQStringList() {
QStringList tmp;
QMap<uint32_t, QString> flightMode = {
{
STABILIZE, AppTranslate("Stabilize")}, //
{
ALT_HOLD, AppTranslate("Altitude Hold")},
{
POS_HOLD, AppTranslate("Position Hold")}
};
for(uint32_t i: flightMode.keys()) {
tmp.append(flightMode[i]); // tmp << enumToString[i];
}
return tmp;
}
QString TranslationTest::AppTranslate(const char* cchar)
{
const char* context = "ContextTest";
return _app->translate( context, QT_TRANSLATE_NOOP(context, cchar));
}
② Prueba de traducción.h
Q_PROPERTY(QStringList qStringListTest READ GetQStringList CONSTANT)
③ Archivo de traducción zh_CN.ts
<context>
<name>ContextTest</name>
<message>
<location filename="../TranslationTest.cpp" line="63"/>
<source>Stabilize</source>
<translation>增稳</translation>
</message>
<message>
<location filename="../TranslationTest.cpp" line="50"/>
<source>Altitude Hold</source>
<translation>高度保持</translation>
</message>
<message>
<location filename="../TranslationTest.cpp" line="50"/>
<source>Position Hold</source>
<translation>位置保持</translation>
</message>
</context>
④ En la interfaz de usuario: main.qml
Repeater {
id: repeater
model: TranslationTest.qStringListTest
Label {
text: modelData
font.pointSize: 15
font.bold: true //黑体
}
}
2) Cadena fuera de la función
① Prueba de traducción.cpp:
const char *MathProblem::greeting_strings[] = {
QT_TRANSLATE_NOOP( "FriendlyConversation", "Hello"),
QT_TRANSLATE_NOOP( "FriendlyConversation", "Goodbye")
QT_TRANSLATE_NOOP( "FriendlyConversation", "How are you")
};
QString TranslationTest::globalGreeting(int type)
{
return _app->translate( "FriendlyConversation", greetingStrings[type]);
}
② Prueba de traducción.h:
Q_INVOKABLE QString globalGreeting(int type) ;
③ Archivo de traducción zh_CN.ts
<context>
<name>FriendlyConversation</name>
<message>
<location filename="../TranslationTest.cpp" line="50"/>
<source>Hello</source>
<translation>你好</translation>
</message>
<message>
<location filename="../TranslationTest.cpp" line="50"/>
<source>Goodbye</source>
<translation>再见</translation>
</message>
<message>
<location filename="../TranslationTest.cpp" line="50"/>
<source>How are you?</source>
<translation>你好吗?</translation>
</message>
</context>
④ interfaz de usuario: main.qml:
Label {
text: TranslationTest.globalGreeting(0)
font.pointSize: 15
}
Label {
text: TranslationTest.globalGreeting(1)
font.pointSize: 15
}
espectáculo:
Referencia: Qt Learning Road (34): Internacionalización (Parte 2)