注意:本文不介绍如何使用Qt的国际化、本地化支持。本文针对的是偏底层的、Manual和其他资料中很少涉及的东西。所以,继续之前,请先确保:你已经对如何使用Qt的国际化比较熟悉了。

本文针对的是  tr("我是中文") 这种情况, 是Qt中translate、tr 与中文问题 一文提到的 2b 问题的深入。

例子

首先,个人比较抵制源码中使用中文(当然也包括用tr扩住中文了)。但是如果非要用,也不是不可以。在  Qt中translate、tr 与中文问题 一文中,我提到了这个问题。

废话少说,看个例子:

#include <QApplication>
#include <QPushButton>
#include <QTextCodec>
#include <QTranslator>
int main(int argc, char *argv[]){QApplication app(argc, argv);
#ifndef LOVE_GBKQTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8"));
#elseQTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));
#endifQTranslator translator;translator.load("hellotr_en");app.installTranslator(&translator);QPushButton hello(QPushButton::tr("你好!", "版权所有:Dbzhang800"));hello.show();return app.exec();
}

大家应该都知道如何做了:

  • 使用lupdate 生成 hellotr_en.ts 文件

  • 使用linguist 打开该文件进行翻译

  • 使用lrelease (或通过linguist的菜单)将其转换成hellotr_en.qm文件

三步走下来,结果正常,界面能显示翻译出来的问题。但是,翻译过程中有一点会很不爽:

  • hellotr_en.ts 文件中,本该显示"你好!"的地方出现的是一堆乱码!
  • 当然,使用linguist进行翻译时很难受,因为你不知道乱码处是什么东西

为了解决这个问题,我们不妨从源头lupdate开始看看。

lupdate

作用:从源码文件中提取待翻译的字符串

目前支持的源码文件的后缀:

java,jui,ui,c,c++,cc,cpp,cxx,ch,h,h++,hh,hpp,hxx,js,qs,qml

我们这儿只关心与C++有关的源码文件(QtJambi、QtScript、!Qt Quick相关的源码文件可能会有不同,我不能确定),能力和精力有限哈。

生成.ts文件

要使用lupdate,细分一下,有两种方式:

TRANSLATIONS = hello_zh_CN.ts hello_zh_TW.ts
lupdate hello.pro -ts hello_zh_CN.ts hello_zh_TW.ts

乱码?

我们在  QString 与中文问题 一文中,已经充分见识了源码中包含非latin1字符时的编码问题。  lupdate 要从源码文件中提取中文字符串,但它无从知道那我们使用的utf-8,还是gbk,又或者是big5等等编码。所以,需要我们告诉它!

前面提到lupdate的两种用法,那么我们要分别通过两种方法告诉它我们的文件是何种编码:

CODECFORTR = utf-8 #or gbk
#DEFAULTCODEC = utf-8
#CODEC = utf-8

注意,如果 CODECFORTR 没有定义,将找 DEFAULTCODEC,如果还没有定义,将找 CODEC。3个都没有定义的话,就采用latin1

lupdate hello.pro -codecfortr utf-8 -ts hello_zh_CN.ts hello_zh_TW.ts
  • 万恶的MSVC?

  • 注意:如果你在使用msvc的编译器,除了前面提到的东西,你还需要知道一点:

    • 如果你的源码文件是带BOM的utf8,utf16等编码格式,它会有转码的动作。
    • 这样一来,tr()包住的字符串将转码成时GBK、BIG5等system编码,与源文件所用的编码不同。
    • 所以,对此,我们还需要指定源文件的编码:
    CODECFORTR = GB2312
    CODECFORSRC = UTF-8

恩,编码设置挺顺利的,这样一来,lupdate根据指定的编码能识别我们的汉字,然后生成的.ts文件不再是乱码了,同时,它在.ts文件中记录下源码中窄字符串的编码

<defaultcodec>GB2312</defaultcodec>
  • 注意 :lupdate 存在一些bug,你如此操作之后,程序运行时可能会无法加载翻译的内容!!我们稍后介绍。

lrelease

lrelease 是 Linguist 工具链的一部分,可作为独立程序使用。它将 .ts 文件转换成压缩的 .qm 文件,供 QTranslator 使用。

对应于前面 lupdate 的用法,lrelease也有两种用法

  • pro 文件内指定了 ts 文件
lrelease  project.pro
  • 通过命令行指定 ts 文件
lrelease ts-files [-qm qm-file]

注意bug!

我们刚才提到 .ts 到 .qm 的过程,存在一个编码的过程。具体到我们前面提到的GB2312,意味着lrelease需要使用Qt的插件(比如qcncodecs4.dll)。

但很不幸,当前版本(Qt4.7)的lrelease存在bug。

注意:如果你使用的utf-8编码,则不存在这个问题。因为utf-8不需要插件。

如何避免?

尝试阅读lrelease的源码,因为功底太差,最终放弃。所以我也无法提供补丁,只告诉大家一个折中的方法:

如果你在简体中文的windows系统中使用gb2312,那么在指定编码是,直接指定SYSTEM而不要指定GB2312 ,这样一来,可以避免使用codecs插件。

这样的话,.ts中的字符串将会在不借助codecs插件的情况下被lrelease成功地被转码成gb2312。我们的程序此时又可以成功加载翻译了。鼓掌!呵呵

lingiust

原因?

个人认为这应当是lingiust的一个bug。

怎么办?我想应该这样来做(其实lupdate也应该这样来做的,如果这样做了,就不用对MSVC的情况单独设置一个source编码了)。

折中之道

如果你只是想让lingiust能正确显示编码,那么你只需要找到:

  • 文件%QTDIR%/tools/linguist/linguist/sourcecodeview.cpp

找到:

void SourceCodeView::showSourceCode(const QString &absFileName, const int lineNum)
{
...
fileText = QString::fromLatin1(file.readAll());
...
}

改为

QString::fromLocal8Bit

重新编译一下lingiust即可。

至此,我们的任务完成!

小结

总结一下:

  • 运行lupdate从源码中提取待翻译字符串,需要指定待翻译串的编码 (注意msvc对带BOM文件的处理)

  • 运行linguist进行翻译(如果让源码窗口显示也正常,需修改至少一行代码)
  • 运行lrelease将.ts编程qm文件,这时对gb2312的处理存在问题,我们采取一个补救措施
转自http://blog.csdn.net/dbzhang800/article/details/6334852

QTranslate国际化及多语言切换相关推荐

  1. 项目国际化I18N多语言切换

    作为国际化的门户网站,支持多种不同的语言,以方便不同国家,不同语种的用户访问尤其重要,目前通过Vue I18n已实现中英文自由切换. 一.了解I18N 1.什么是I18N i18n(其来源是英文单词 ...

  2. 前端vue最新vue-i18n国际化插件实现语言切换(带源码)

    目录 1.安装i18n插件和elementUI插件 注意:建议安装指定低版本插件!!! 解决办法 2.main.js全局挂载i18n和elementUI挂载 3.语言文件 en.js,代码如下 zh. ...

  3. Qt之Qml 国际化—实现简易语言切换功能

    目标:实现一个下拉框,具有切换语言的功能 GIF展示: 版本Qt5.14.2,版本不能低于5.10 qml控件 1.在QML文件中把需要翻译显示的文本用qsTr(" ")包裹起来 ...

  4. vue3.0 引入i18n 做国际化 - 做动态语言切换

    说明 适合 vue2.0版本的官方链接如下: ​​​​​​Vue I18nVue I18n 是 Vue.js 的国际化插件https://kazupon.github.io/vue-i18n/zh/ ...

  5. 安卓国际化(多语言切换),支持小语种

    最近安卓开发遇到一个新的需求,需要支持多语言,而且还是我们五十六个大家庭中的藏语,一时间点懵了,毕竟从来没搞过多语言,一下来的还是比较小众的.后面研究了一番那个,还是大致搞出来了,这里简单写篇博客记一 ...

  6. iOS国际化APP内语言切换

    开发java的时候要求实现语言国际化,在java中用了i18来进行处理,移动端也可以进行处理: 方法可以有以下两种: 方案一:在原国际化版本的基础上做修改,在info.plist文件中新增key=&q ...

  7. 【vue-element-admin】4.x 添加 i18n 国际化多语言切换

    花裤衩前辈的vue-element-admin模块在4.x的大版本中去除了对i18n国际化的支持,本次因项目需要,在一个基于 vue-element-admin V4.2.1 版本模板开发的项目中,需 ...

  8. Swift之本地国际化与App内切换语言

    添加语言库 点击项目 -> PROJECT -> Info -> Localizations -> + , 添加需要的语言; 添加完成的语言库如下所示: 创建Localizab ...

  9. android 指定语言的资源,Android国际化多语言切换

    最近工作中突然要求要项目进行国际化,之前没遇到过.但是也很简单呀,只需要把添加一个相应语言的的strings.xml的资源文件就好了,不是吗?这样只要切换系统语言就能切换app的文字语言了. 但是由此 ...

最新文章

  1. 阿里云ESC搭建SVN服务端
  2. tenserflow.js 环境搭建
  3. 编程开发之--java多线程学习总结(5)
  4. HDOJ 1069 Monkey and Banana
  5. Java一致性Hash算法的实现
  6. JS中document和window的区别
  7. python 快速排序_python-快速排序的两种方法
  8. python中headers的作用_爬虫入门到精通-headers的详细讲解(模拟登录知乎)
  9. 使用C语言读写xlsx文件
  10. php ajax mysql视频教学视频_PHP入门教程之AJAX 与 MySQL
  11. Android 一个adapter实现商品列表折叠
  12. PLC通过485与单片机通讯示例
  13. java 前后端分离_Java项目如何实现前后端分离
  14. 惠普打印机m226dn教程_惠普m226dn说明书
  15. 男女逗段,瞅瞅有没有说到你
  16. 苹果蓝牙耳机怎么接电话_如何在开车时可以更安全的接电话——ROMAN R6000蓝牙耳机...
  17. Adobe Photoshop CC 2018之ps钢笔工具抠图(☆☆☆)
  18. Uboot中的MIPI DSI clk分析
  19. Qt中QPainter的使用
  20. RxJava 3.x 使用总结

热门文章

  1. .seq格式转为.fasta格式
  2. Linux 用户passwd文件详解
  3. 享受葡萄酒的极致诱惑
  4. 从深度心理学的角度看爱情
  5. Python:ERROR: Could not install packages due to an OSError: HTTPSConnectionPool
  6. 麒麟810以后能升级为鸿蒙系统吗,华为麒麟810再曝新消息,由此可见,鸿蒙系统必将出现!...
  7. 是否应该定期给员工做背调?
  8. 力扣978最长湍流子数组——Python解答
  9. 一张彩色图片,如何用Photoshop处理成一张轮廓图(就是变成刚用铅笔画出来时的那样)_......
  10. begin ubuntu