当前位置: 首页 > article >正文

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
        }
    }
}


http://www.kler.cn/a/377929.html

相关文章:

  • nodejs入门教程4:nodejs创建第一个应用
  • openstack之guardian介绍与实例创建过程
  • 我谈正态分布——正态偏态
  • Docker部署Meta-Llama-3.1-70B-Instruct API openai格式,vLLM速度对比
  • CSS常见适配布局方式
  • HTML 框架
  • 分布式架构搭建博客网站
  • MindShare PCIE 3.0 笔记-第三四章
  • Spring Boot技术:校园社团信息管理的革新者
  • 小柴带你学AutoSar系列三、标准和规范篇(4)RTE
  • C语言另一种编码方式开发状态机(无switch)
  • MySQL有关基础查询的知识点
  • Fetch 请求不支持取消操作的问题及解决方案
  • GaussDB和Oracle的语法对比
  • 使用RabbitMQ实现微服务间的异步消息传递
  • Java学习教程,从入门到精通,Java 循环结构:while 和 do...while(17)
  • 2024年 · 地表最强的十大遥感影像分割模型
  • Js内建对象
  • 10个领先的增强现实平台【AR】
  • uniapp 使用uni.getRecorderManager录音,wav格式采样率低于44100,音频播放不了问题解决
  • 无人机敏捷反制技术算法详解!
  • 同一个页面击穿element样式后,会影响同样组件的使用
  • C#与C++交互开发系列(二十):跨进程通信之共享内存(Shared Memory)
  • 论文阅读:Computational Long Exposure Mobile Photography (一)
  • [SICTF Round4] Crypto
  • 简易了解Pytorch中的@ 和 * 运算符(附Demo)