Qt项目实战:语言家(中英文翻译)
目录
一.作用与性质
1.解决字符串乱码和翻译问题
2.提高开发效率
3.支持多语言环境
4.优化用户体验
5.降低维护成本
6.扩展性和兼容性
二.使用
1.pro文件添加TRANSLATIONS
2.使用qsTr包裹text
3.设置当前语言
4.获取当前语言
5.设置指定语言
6.qml调用
三.语言家
四.效果
五.代码
1.TranslationEenglis.h
2.TranslationEenglis.cpp
3.main.cpp
4.qml
Qt语言家(Qt Linguist)是Qt框架中用于管理和应用多语言支持的强大工具。它通过提供图形用户界面,使得开发者、翻译者和发布者能够方便地进行应用程序的国际化和本地化工作。
一.作用与性质
1.解决字符串乱码和翻译问题
统一资源文件格式:Qt语言家通过将需要翻译的字符串提取出来,使用统一的.ts文件格式进行管理,避免了硬编码带来的字符串乱码问题。
自动化翻译过程:Qt语言家可以自动检测源代码中的翻译标记(如tr()函数),并生成相应的翻译文件,简化了翻译流程。
2.提高开发效率
减少重复工作:开发者只需在代码中使用tr()函数标记需要翻译的字符串,Qt语言家会自动处理这些标记,生成翻译文件,减少了手动编写和维护翻译文件的工作。
实时预览和更新:Qt语言家提供了实时预览功能,开发者可以在不重新编译的情况下查看翻译效果,并根据需要进行调整。
3.支持多语言环境
灵活的语言切换:Qt语言家支持多种语言,开发者可以根据需要添加或删除语言文件,实现应用程序在不同语言环境下的无缝切换。
专业的翻译支持:对于需要多语言支持的应用程序,Qt语言家提供了一个专业的平台,使得翻译者可以专注于翻译工作,而不必担心技术细节。
4.优化用户体验
提升应用的国际竞争力:通过提供多语言支持,应用程序可以更好地服务于全球用户,提升用户体验和满意度。
适应不同文化背景:Qt语言家使得应用程序能够根据用户的文化背景和语言习惯进行本地化,增强了应用程序的亲和力和可用性。
5.降低维护成本
集中管理翻译文件:所有翻译文件都集中在.ts文件中管理,便于维护和更新。
减少错误和遗漏:Qt语言家的自动化特性减少了人为错误的可能性,确保了翻译的完整性和准确性。
6.扩展性和兼容性
广泛的框架支持:Qt语言家不仅支持Qt C++应用程序,还支持Qt Quick等其他Qt技术栈,具有良好的扩展性和兼容性。
与其他工具集成:Qt语言家可以与Qt Creator等开发工具无缝集成,提供了便捷的开发和翻译体验。
二.使用
1.pro文件添加TRANSLATIONS
2.使用qsTr包裹text
3.设置当前语言
1.创建翻译器和区域设置对象
2.检查当前语言并加载相应的翻译文件
3.安装翻译器
4.重新翻译界面文本
4.获取当前语言
1.创建 QLocale
对象
2.如果当前语言是英语,则返回 0
3.如果当前语言是中文,则返回 1
5.设置指定语言
1.创建翻译器对象
2.检查索引值并加载相应的翻译文件
3.安装翻译器
4.重新翻译界面文本
6.qml调用
三.语言家
四.效果
五.代码
1.TranslationEenglis.h
#ifndef TRANSLATIONEENGLIS_H
#define TRANSLATIONEENGLIS_H
#include <QObject>
#include <QTranslator>
#include <QGuiApplication>
#include <QQmlApplicationEngine>
class TranslationEenglis : public QObject
{
Q_OBJECT
public:
TranslationEenglis(QGuiApplication& app, QQmlApplicationEngine &engine);
//设置为当前系统语言
void setLocalLanguage();
//获取当前系统语言,必须添加 Q_INVOKABLE 后才能在前端调用该函数
Q_INVOKABLE int getLocalLanguage();
//设置为index指定的语言
Q_INVOKABLE void setLanguage(int index);
private:
QGuiApplication *m_app;
QQmlApplicationEngine *m_engine;
};
#endif // TRANSLATIONEENGLIS_H
2.TranslationEenglis.cpp
#include "translationeenglis.h"
TranslationEenglis::TranslationEenglis(QGuiApplication &app, QQmlApplicationEngine& engine)
{
m_app = &app;
m_engine = &engine;
}
int TranslationEenglis::getLocalLanguage(){
QLocale locale;
if(locale.language() == QLocale::English){
return 0;
}else if(locale.language() == QLocale::Chinese){
return 1;
}
return 0;
}
void TranslationEenglis::setLocalLanguage(){
QTranslator translator;
QLocale locale;
if( locale.language() == QLocale::English ) {
translator.load(":/new/prefix1/en.qm");
}
else if( locale.language() == QLocale::Chinese ) {
translator.load(":/new/prefix1/zh.qm");
}
m_app->installTranslator(&translator);
//重新载入语言包
m_engine->retranslate();
}
void TranslationEenglis::setLanguage(int index)
{
QTranslator translator;
if (index == 0)
{
translator.load(":/new/prefix1/en.qm");
}else if (index == 1) {
translator.load(":/new/prefix1/zh.qm");
}else{
translator.load(":/new/prefix1/en.qm");
}
m_app->installTranslator(&translator);
//重新载入语言包
m_engine->retranslate();
}
3.main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QTranslator>
#include <QDebug>
#include <QQmlContext>
#include "translationeenglis.h"
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
//解决窗口拖拽时闪烁的问题
QCoreApplication::setAttribute(Qt::AA_UseSoftwareOpenGL);
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
//切换为本地语言
//检测本系统语言自动装载翻译文件
//使用qt的QLocale这个类,通过这个类来获取系统本地语言环境
//QTranslator的load方法装载语言包
//QGuiApplication的实例化对象的installTranslator去实现语言翻译
QTranslator translator;
QLocale locale;
if( locale.language() == QLocale::English ) {
translator.load(":/new/prefix1/en.qm");
}
else if( locale.language() == QLocale::Chinese ) {
translator.load(":/new/prefix1/zh.qm");
}
app.installTranslator(&translator);
//将TranslationEenglis中的所有函数暴露给qml调用
TranslationEenglis translationEenglis(app, engine);
engine.rootContext()->setContextProperty("translationEenglis", &translationEenglis);
const QUrl url(QStringLiteral("qrc:/main.qml"));
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
&app, [url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
engine.load(url);
return app.exec();
}
4.qml
import QtQuick.Window 2.2
import QtQuick 2.0
import QtQuick.Controls 2.1
Window {
visible: true
width: 640
height: 480
title: qsTr("Translation")
Label{
id:_label
font.pixelSize: 50
anchors.top: parent.top
anchors.topMargin: 120
anchors.horizontalCenter: parent.horizontalCenter
text: qsTr("I Love you")
}
ComboBox {
anchors.top: _label.bottom
anchors.horizontalCenter: parent.horizontalCenter
anchors.topMargin: 30
model: ['简体中文','English']
currentIndex: translationEenglis.getLocalLanguage()
onActivated: {
translationEenglis.setLanguage(index)
currentIndex = index
}
}
}