• 11210阅读
  • 8回复

[提问]QT翻译 lupdate不能读取中文 [复制链接]

上一主题 下一主题
离线米尔利安
 

只看楼主 倒序阅读 楼主  发表于: 2011-10-21
— 本帖被 XChinux 从 Qt基础编程 移动到本区(2013-04-01) —
如题。界面上使用中文文字,使用lupdate工具在提取出来的ts文件中是正常显示的,但是在代码中直接用QObject::tr()所包含的文字在ts文件中显示为乱码
因为QT程序员的语言是中文,英文部分是交给翻译来做的,所以在编码时还是尽量想使用中文。但是代码里的中文无法正确提取,请问这个问题有办法解决吗?
我们在天上的父,愿人都尊你的名为圣。
愿你的国降临。
愿你的旨意行在地上,如同行在天上。
离线dbzhang800

只看该作者 1楼 发表于: 2011-10-21
看这个吧:
http://blog.csdn.net/dbzhang800/article/details/6334852


题外(牢骚一下):
说到底,这是Qt的一个bug。但是几乎没人(包括一个日本的在内,你是我见到的第三个)反应这种问题。但是用

QTextCodec::setCodecForTr(QTextCodec::codecForName("GB2312"));

这种代码的却随处可见。说明99%以上的使用上面代码的都在误用Tr。
离线米尔利安

只看该作者 2楼 发表于: 2011-10-21
回 1楼(dbzhang800) 的帖子
嗯谢谢,这篇文章我找到并且照着用了,但是没有解决问题。

我怀疑是因为我用VS2008作为开发工具导致的源代码文件编码问题。Notepad++工具里面查询到的源代码文件编码是ANSI格式,但是按照文章里的方式,无论是设置CODEFORTR为GB2312或者utf-8都无法解决问题。。。。。。使用Notepad++直接将文件转码为utf-8也不能解决问题,快崩溃了……
我们在天上的父,愿人都尊你的名为圣。
愿你的国降临。
愿你的旨意行在地上,如同行在天上。
离线dbzhang800

只看该作者 3楼 发表于: 2011-10-21
引用第2楼于1970-01-01 08:00发表的  :


呵呵,我那个确实写的很乱。但是如果你看懂了,肯定能解决你的问题。

我换个角度说一下(同样,也很乱):
* C、C++ 源文件字符集分两个:源码字符集  执行环境字符集(对于MSVC,要特别注意这个)
   比如包含 char * abc = "中文"; 的源文件是带BOM的utf8, 在简体中文系统下的MSVC下,源码是utf8,执行环境是gbk

* 对于你setCodecFortr 来说,要么设置gbk,要么utf8,这个基本没有异议。在简体中文windows下,几乎可以确定就是gbk

* 对于lupdate来说,它也需要知道编码。对于
这时,你无论如何也不能告诉它你用的gbk(尽管你确实是)。你告诉它你用的system!!(注意,源码中无论如何不要用system)
离线米尔利安

只看该作者 4楼 发表于: 2011-10-21
回 3楼(dbzhang800) 的帖子
在源码的main函数中,我设置codecfortr是GB2312,这个基本上没有问题。

我放置中文字符串的源码文件是被保存成GB2312格式的(也就是ANSI)。如果我手动将其存成带BOM的utf-8格式,lupdate还是无法转出来。。。
以下为输出:
D:\work\UniKey\UniKey STD-PRO-Time\Console\标准\Console_V2.0>LUPDATE CONSOLE.PRO

D:/qt473/mkspecs/features/default_post.prf(5):Function 'system' is not implement
ed
D:/qt473/mkspecs/features/debug_and_release.prf(66):Function 'eval' is not imple
mented
D:/qt473/mkspecs/features/debug_and_release.prf(69):Function 'eval' is not imple
mented
D:/qt473/mkspecs/features/debug_and_release.prf(72):Function 'eval' is not imple
mented
D:/qt473/mkspecs/features/debug_and_release.prf(75):Function 'eval' is not imple
mented
D:/qt473/mkspecs/features/debug_and_release.prf(78):Function 'eval' is not imple
mented
D:/qt473/mkspecs/features/debug_and_release.prf(80):Function 'eval' is not imple
mented
D:/qt473/mkspecs/features/debug_and_release.prf(82):Function 'eval' is not imple
mented
D:/qt473/mkspecs/features/debug_and_release.prf(84):Function 'eval' is not imple
mented
D:/qt473/src/corelib/tools/qstringbuilder.h:45: circular inclusion of d:/qt473/i
nclude/QtCore/qstring.h
D:/qt473/src/gui/painting/qwmatrix.h:45: circular inclusion of d:/qt473/include/
QtGui/qmatrix.h
d:/qt473/include/QtGui/qaction.h:1: circular inclusion of D:/qt473/src/gui/kerne
l/qaction.h
D:/qt473/src/gui/kernel/qboxlayout.h:45: circular inclusion of d:/qt473/include/
QtGui/qlayout.h
d:/qt473/include/QtGui/qgridlayout.h:1: circular inclusion of D:/qt473/src/gui/k
ernel/qgridlayout.h
Updating 'trans_EN.ts'...
    Found 605 source text(s) (0 new and 605 already existing)
Updating 'trans_CH.ts'...
    Found 605 source text(s) (0 new and 605 already existing)
Updating 'trans_FR.ts'...
    Found 605 source text(s) (0 new and 605 already existing)
Updating 'trans_JP.ts'...
    Found 605 source text(s) (0 new and 605 already existing)

打开TS文件显示内容:

我们在天上的父,愿人都尊你的名为圣。
愿你的国降临。
愿你的旨意行在地上,如同行在天上。
离线dbzhang800

只看该作者 5楼 发表于: 2011-10-21
用GBK保存源码 + 在简体中文windows下 + MSVC 情况下:解决方案其实非常简单

* 完全和utf8没有任何关系
* 你只需要搞清SYSTEM和GBK这两个对你几乎完全一样的东西,如何选择就可以了(而这一个,我应该反复提及了)
离线米尔利安

只看该作者 6楼 发表于: 2011-10-21
回 5楼(dbzhang800) 的帖子
好的。其实我想我应该是理解了你的意思。
现在我对整个工程的处理方式是这样的:
1、工程的源代码全部使用ANSI编码保存(也就是GB2312),对VS的设置不做任何调整。
2、main函数中设置CODECFORTR为GB2312。
3、pro文件中加入 CODECFORTR = system

使用lupdate pro文件,生成.TS文件, 使用linguist打开ts文件,依旧是乱码。无论左边还是右边。
使用文本文件编辑器打开生成的ts文件,有如下字句:
<defaultcodec>System</defaultcodec>

我想我并没有理解错你的意思,而这个执行结果也应该是正确的,为何linguist打开来依旧是乱码呢?
我们在天上的父,愿人都尊你的名为圣。
愿你的国降临。
愿你的旨意行在地上,如同行在天上。
离线dbzhang800

只看该作者 7楼 发表于: 2011-10-21
Re:回 5楼(dbzhang800) 的帖子
引用第6楼米尔利安于2011-10-21 13:59发表的 回 5楼(dbzhang800) 的帖子 :
为何linguist打开来依旧是乱码呢?
.......

呵呵,这个我blog中肯定提到了。最后 lingiust 那一节中似乎就说了这一个问题
离线米尔利安

只看该作者 8楼 发表于: 2011-10-21
回 7楼(dbzhang800) 的帖子
可能是我理解错误了吧。对于你的日志最后一段,我理解为右边显示源代码的区域会是乱码,但是左边显示翻译文字的条目的区域,应当是从XML文件中读进来的。如果lupdate提取正确,这个区域就不应当再显示乱码了吧?但是现在我这边这两个区域都是乱码。。。
如果是我理解错误,那么我就去重新编译一下linguist(笑)
谢谢你这么有耐心~
我们在天上的父,愿人都尊你的名为圣。
愿你的国降临。
愿你的旨意行在地上,如同行在天上。
快速回复
限100 字节
 
上一个 下一个