QPlainTextEdit、QTextEdit、QColorDialog的汉化

来源:互联网 发布:java解决高并发问题 编辑:程序博客网 时间:2024/06/03 19:26

软件汉化用的是Qt自带的ts文件qt_zh_CN.ts,用lrelease.exe编为qt_zh_CN.qm文件后,拷个地方填上路径加载安装下就可以了,找不到ts和exe的位置可用everything搜一下。

  1. QApplication a(argc, argv);  
  2. //...
  3. QTranslator qtTranslator;  
  4. qtTranslator.load("qt_zh_CN.qm", strPath);  
  5. a.installTranslator(&qtTranslator);  
  6. //...

这样大部分的都翻译过来了,还有少数顽固派不服礼教,排查了下,主要是QPlainTextEdit和QTextEdit的右键菜单和QColorDialog上的几处没有汉化。

看帮助文档,ts文件是xml格式的,于是拖到VS Code中一探究竟,如QLineEdit,里面的内容基本这个样子:

  1. <context>
  2.     <name>QLineEdit</name>
  3.     <message>
  4.         <locationfilename="../src/gui/widgets/qlineedit.cpp"line="+2680"/>
  5.         <source>&Undo</source>
  6.         <translation>撤消(&U)</translation>
  7.     </message>
  8.     <message>
  9.         <locationline="+4"/>
  10.         <source>&Redo</source>
  11.         <translation>恢复(&R)</translation>
  12.     </message>
  13. </context>

除了location我最终也没弄太明白做什么用的,而且自带的删掉也没发现有什么影响(后来发现貌似是Qt语言家里定位代码用的),其他的含义都很清晰了,于是拷了一份QLineEdit,删掉了location行,把QLineEdit改为QPlainTextEdit,编了下,我是VS环境,临时把ts和qm放一起,把ts加入工程里,右键最后就会出现lrelease的菜单,运行,not work,郁闷,扒了扒了源码,发现QPlainTextEdit的右键菜单实际是在一个叫QWidgetTextControl的控件里实现的,于是改成QWidgetTextControl试了下,结果QPlainTextEdit和QTextEdit都好了,再看代码,原来QTextEdit也是QWidgetTextControl弹得右键,妥。

然后就是QColorDialog,QColorDialog原来ts里有一部分,就是不全,先加入Pick Screen Color的翻译:

  1. <message>
  2.     <source>Pick Screen Color</source>
  3.     <translation>拾取屏幕颜色(&P)</translation>
  4. </message>

(&P)是自己加的热键Alt+P,因为&是xml的五个转义字符之一,编辑器里实际要写的是(&P),这边自动给转过来了,这个倒挺顺利。

然后点了下这个键,发现下面还有实时显示坐标和颜色的提示,也是英文,于是从源码里拷出了原文翻译了下:

  1. <message>
  2.     <source>Cursor at %1, %2, color: %3\nPress ESC to cancel</source>
  3.     <translation>坐标: %1, %2, 颜色: %3\n按ESC键取消</translation>
  4. </message>

竟然没有用!研究了下ts里其他的写法后,最终发现应该这样写:

  1. <message>
  2.     <source>Cursor at %1, %2, color: %3  
  3. Press ESC to cancel</source>
  4.     <translation>坐标: %1, %2, 颜色: %3  
  5. 按ESC键取消</translation>
  6. </message>

然后就是OK和Cancel,如法炮制,然并卵,扒了扒代码,貌似是QDialogButtonBox家的,然而试了一圈,从QDialogButtonBox、QPushButton到QAbstractButton,并没有人愿意认领,走投无路只好祭出了撒手锏:

  1. if (QDialogButtonBox *btnBox = colorDlg->findChild<QDialogButtonBox *>())  
  2. {  
  3.     if(QPushButton *btnOk = btnBox->button(QDialogButtonBox::Ok))  
  4.         btnOk->setText("确定");  
  5.     if (QPushButton *btnCancel = btnBox->button(QDialogButtonBox::Cancel))  
  6.         btnCancel->setText("取消");  
  7. }  

呵呵,无处可逃了吧,鉴于整个软件用这个控件的地方不多,就三处,又没有其他好的办法(谁知道望告知),so be it!

确定,取消如果要加Alt热键,注意C已经被界面上的其他元素占用了,不能再给取消用了,这个可以自己协调,这是后话。

我的第一篇博客O(∩_∩)O~,虽然没撒技术含量,考虑到可能会有人跳坑,还是勇敢地分享一下引玉,对了,我用的是Qt5.4.1。

(第一篇博客,还误删了,怎么写第二篇呢,还好有收藏,重发一下吧,最初应该是2016-12-20左右发表的 

0 0
原创粉丝点击