zoukankan      html  css  js  c++  java
  • VS中设置Qt多语言界面

    一、多语言界面设计概述

    1.在程序设计阶段,程序代码中每一个用户可见的字符串都用tr()函数封装,以便Qt提取界面字符串,用于生成翻译资源文件。用UI设计器可视化设计窗体时统一用一种语言。

    2.在项目配置文件.pro文件中设置需要导出的翻译文件.ts文件,使用lupdate工具扫描项目文件中需要翻译的字符串,并生成翻译文件。

    3.使用Qt的Linguist程序打开生成的翻译文件,将程序中的字符串翻译为需要的语言,如将所有中文字符串翻译成英文。

    4.使用lrelease工具编译翻译好的翻译文件,生成更为紧凑的“.qm”文件,实现不同的语言界面。

    二、tr()函数的使用

     为了让qt可以提取用户可见的字符串,需要对每个字符串使用tr()函数封装。tr()是QObject的一个静态函数,在使用了Q_OBJECT宏定义的类或QObject的子类中,都可以直接使用tr()函数,否则需要使用QObject::tr()调用。或者在类定义中用Q_DECLARE_TR_FUNCTIONS宏把tr()函数添加到类中之后,再直接调用tr()函数。

    定义:QString QObject::tr(const char *sourceText, const char *disambiguation = Q_NULLPTR, int n = -1);

    其中,sourceText是源字符串, disambiguation是为翻译者提供额外信息的字符串,用于对一些容易混淆的地方作说明。

    注意事项:

    • 尽量使用常量字符串,不要使用字符串变量。以下使用lupdate工具提取项目中的字符串时,将不能提取“不能删除记录”这个字符串。 
    char *errorStr = "不能删除记录";
    QString str2 = tr(errorStr);
    • 使用字符串变量时,需要用Qt_TR_NOOP()宏进行标记。
    const char *cities[4] = {
            Qt_TR_NOOP("Beijing"),
            Qt_TR_NOOP("Shanghai"),
            Qt_TR_NOOP("Qingdao"),
            Qt_TR_NOOP("Wuhan")
    };    
    for(int i = 0; i < 4; i++)
        comboBox->addItem(tr(cities[i]));
    
    • tr()不能使用拼接的动态字符串。
    //错误
    LabCellPos->setText(tr("第" + QString::number(current.row()) + "行"));
    
    //正确
    LabCellPos->setText(tr("第 %1 行").arg(current.row()));
    
    • Qt_NO_CAST_FROM_ASCII的作用。在一个需要翻译为多语言的应用程序中,如果编写程序时忘了对某个字符串使用tr()函数,lupdate生成的翻译资源文件就会遗漏这个字符串。为了避免这种疏忽错误,可以在项目配置文件(.pro文件)中添加如下的定义。

       DEFINES += Qt_NO_CAST_FROM_ASCII

    三:VS项目中配置多语言步骤 

    步骤:

    1.创建项目,对用到的每个字符串以上规则的前提下加入tr()函数。

    2.右击项目,点击Qt中的Create New Traslation File

    (sample_zh.ts和sample_en.ts)创建英文和中文的ts文件

    3.右击sample_zh.ts或者sample_en.ts,使用lupdate生成翻译的资源文件

    4.使用Qt Linguist翻译ts文件

    5.右击sample_zh.ts或者sample_en.ts,使用lrelease在项目源程序目录下生成qm文件sample_zh.qm或者sample_en.qm

    四:调用翻译文件改变界面语言

    case1:

      启动项目时获取系统语言,改变界面语言:

    __CheckLocale()获取系统语言。参考链接:https://www.cnblogs.com/foreversdf/p/12900497.html
    std::string locale = __CheckLocale();
    	if (locale.find("zh") != std::string::npos || locale.find("CN") != std::string::npos) {
    		m_translator.load("translations/sample_zh");
    		m_translatorQt.load("translations/qt_zh_CN");
    		qApp->installTranslator(&m_translator);
    		qApp->installTranslator(&m_translatorQt);
    	}
    	else {
    		m_translator.load("translations/sample_en");
    		m_translatorQt.load("translations/qt_en");
    		qApp->installTranslator(&m_translator);
    		qApp->installTranslator(&m_translatorQt);
    	}
    

      

     case2:

      动态切换语言,对于大型软件来说不推荐动态切换语言,一般都需要重启后进行设置。

    void MainWindow::on_actionChinese_triggered()
    {
           qApp->removeTranslator(m_translator);    
           delete trans;
           m_translator= new Qtranslator;
           m_translator->load("translatsions/sample_zh");
           qApp->installTranslator(m_translator);
           ui->retranslateUi(this); //刷新界面字符串    
    }
    
    
    void MainWindow::on_actionEnglish_triggered()
    {
           qApp->removeTranslator(m_translator);    
           delete trans;
           m_translator= new Qtranslator;
           m_translator->load("translatsions/sample_en");
           qApp->installTranslator(m_translator);
           ui->retranslateUi(this); //刷新界面字符串    
    }
    
  • 相关阅读:
    asp.net下的网页编辑器
    在Visual C#中访问不同数据库
    VS2008 sp1中文版下载地址
    常用封装链接数据库类
    常用封装日志类
    动态构建OrderBy的Lambda表达式
    用户管理抽象类
    存储过程导出数据库数据
    应用程序xml 配置文件抽象基类
    ini文件示例说明
  • 原文地址:https://www.cnblogs.com/foreversdf/p/12834196.html
Copyright © 2011-2022 走看看