• 11847阅读
  • 19回复

[讨论]关于中英文变换的问题??? [复制链接]

上一主题 下一主题
离线panqingliang
 
只看楼主 倒序阅读 楼主  发表于: 2011-06-29
translator = new QTranslator(this);
translator -> load("Chinese");
qApp   -> installTranslator(translator);


我的一个程序里面有多个界面, 其中一个是设置界面, 我想通过设置界面来设置所有界面的中英文模式, 上面三句是在最上面一层的界面的构造函数里的初始化, 程序运行后, 是中文
void Window::languageFunc(const int &n)
{
if(n == 0)
{
        translator -> load("English");
}
else if(n == 1)
{
          translator -> load("Chinese");
}

return;
} 但是我在选项里面设置后, 却只有一个控件上的字体变成了英文 如图 ,想问问, 是怎么回事????
离线dbzhang800

只看该作者 1楼 发表于: 2011-06-29
答案比较容易找,我简单告诉你一下原因。

所谓的翻译,就是你通过 tr("xxx"),将一个字符串转换成另一个字符串。根据什么转换,不难想象,就是你安装的QTranslator。

QTranslator 改变以后,界面如何反应,显然,你必须重新使用 tr("xxxx")来得到新翻译后字符串。

举个例子:对于一个button,之前,你对它 setText(tr“(open)”),那么QTranslator改变后,你必须重新 setText(tr("open")) 一次。

题外:
1. 如果你用的QtCreator,不妨认真看看它生成的代码
2. 答案:多看Manual  http://doc.qt.nokia.com/4.7/internationalization.html#dynamic-translation
离线panqingliang
只看该作者 2楼 发表于: 2011-06-30
回 1楼(dbzhang800) 的帖子
呃, 楼主, 你的意思我明白, 你的意思如果是要改变界面所有控件的文字 要 重新 用setText() 函数???

但是, 我有.ts 文件生存的.qm文件, 我的意思是用QTranslator::tansloter  .load(“englisg”);  来改变整个界面的文字
离线dbzhang800

只看该作者 3楼 发表于: 2011-06-30
Re:回 1楼(dbzhang800) 的帖子
引用第2楼panqingliang于2011-06-30 10:33发表的 回 1楼(dbzhang800) 的帖子 :
呃, 楼主, 你的意思我明白, 你的意思如果是要改变界面所有控件的文字 要 重新 用setText() 函数???
但是, 我有.ts 文件生存的.qm文件, 我的意思是用QTranslator::tansloter  .load(“englisg”);  来改变整个界面的文字

明白了直接去做就好了,没什么可怀疑的,比如:你想把按钮中的文字从 “Close” ==> “关闭”,不就是重新 setText 一下么。
离线panqingliang
只看该作者 4楼 发表于: 2011-06-30
回 3楼(dbzhang800) 的帖子
但是,如果那样的话, 我有多个界面, 每一界面里面有许多控件, 那每一个控件都与偶那个setText()函数去重新来设置, 那我不就没有用QTranslator的必要了

现在我有两个.qm的文件, 一个是对应中文的, 一个是对应英文的, 我就想通过一个信号来切换所有界面内的中英文  该怎么弄
离线dbzhang800

只看该作者 5楼 发表于: 2011-06-30
Re:回 3楼(dbzhang800) 的帖子
引用第4楼panqingliang于2011-06-30 11:30发表的 回 3楼(dbzhang800) 的帖子 :
但是,如果那样的话, 我有多个界面, 每一界面里面有许多控件, 那每一个控件都与偶那个setText()函数去重新来设置, 那我不就没有用QTranslator的必要了
现在我有两个.qm的文件, 一个是对应中文的, 一个是对应英文的, 我就想通过一个信号来切换所有界面内的中英文  该怎么弄

说了这么多,你不会连我在一楼给的链接都没看吧? (manual中相关的内容一般至少在提问前是要看看的)
离线panqingliang
只看该作者 6楼 发表于: 2011-06-30
当然看了文档, 但是 文档没有提及我遇到的问题呀
离线dbzhang800

只看该作者 7楼 发表于: 2011-06-30
引用第6楼panqingliang于2011-06-30 12:59发表的  :
当然看了文档, 但是 文档没有提及我遇到的问题呀

这样的话,估计其他人没办法了。

Manual 中直接告诉你了该如何做(是一个一步一步的howto)

怕你不理解,一开始就给你解释的翻译的工作的实质。
离线panqingliang
只看该作者 8楼 发表于: 2011-06-30
说了半天, 我的问题还是没有解决
离线eadywen

只看该作者 9楼 发表于: 2011-06-30
load文件的时候会产生一个changEvent事件, 你重新实现一下, 把你需要翻译的地方重新setText一下;
void Example::changeEvent(QEvent *event)
{
if(event->type() == QEvent::LanguageChange)
retranslateUI();
QWidget::changeEvent(event);
}
void Example::retransateUI()
{
button->setText(tr("OK "));
}
离线dbzhang800

只看该作者 10楼 发表于: 2011-06-30
引用第8楼panqingliang于2011-06-30 13:46发表的  :
说了半天, 我的问题还是没有解决

可以理解,因为manual给出的,而且正是你所需要的答案,你都认为和你的问题无关
离线panqingliang
只看该作者 11楼 发表于: 2011-06-30
引用第10楼dbzhang800于2011-06-30 13:58发表的  :
可以理解,因为manual给出的,而且正是你所需要的答案,你都认为和你的问题无关 [表情]




开始, 我认为9楼给出的贴可以解决问题, 但是, 他说的还是跟MANUAL上的一样, 要重新用setText()函数,     现在的问题是 我有多个界面 每个控件都要变换的话, 那不是很麻烦  《例如, 我的所有界面里有1K控件的话, 我用setText,那我不得升天了》      
  我的意思是, 既然有了。ts生成的翻译信息, 应该就不用那么麻烦了吧
离线dbzhang800

只看该作者 12楼 发表于: 2011-06-30
看来你钻进牛角尖自己走出不来了。

去看 C++ GUI Qt4 编程 一书的 18.3 节吧,如果你不能静心看英文的manual

题外:国际化是Qt中非常成熟的东西了,按manual走就行了,远比你想的简单地多
离线panqingliang
只看该作者 13楼 发表于: 2011-06-30
回 12楼(dbzhang800) 的帖子
大哥呀, 你讲了半天, 什么用translateUi() 函数, 还不是要在translateUI()  函数里面对每个控件用setText(tr());       我不是用QT设计器设计的界面, 如果我是用设计器设计的界面的话那倒是直接调用translateUi就行了, 现在的问题是, 我不是用的designer设计的界面,    按你那书上写的,还不是得用setText()       苦闷
离线dbzhang800

只看该作者 14楼 发表于: 2011-06-30
Re:回 12楼(dbzhang800) 的帖子
引用第13楼panqingliang于2011-06-30 16:08发表的 回 12楼(dbzhang800) 的帖子 :
大哥呀, 你讲了半天, 什么用translateUi() 函数, 还不是要在translateUI()  函数里面对每个控件用setText(tr());       我不是用QT设计器设计的界面, 如果我是用设计器设计的界面的话那倒是直接调用translateUi就行了, 现在的问题是, 我不是用的designer设计的界面,    按你那书上写的,还不是得用setText()       苦闷[表情]  

这和你用不用designer没任何关系,用不用desiger 都得 setText。一开始不就告诉你了么,
* 如果修改 button 上的文字?? 是 setText 不?
* 先不考虑你的翻译如何实现,你要实现的是不是修改 button 上的文字??


退一步讲,实在不清楚你有什么苦闷的。
*  即使不翻译,你不需要在 button 上设置文字么??
*  Qt 已经把复杂性都隐藏了,你需要的只不过是重现设置文字而已(即使你有上千个button要翻译,又多不了几行代码)
离线panqingliang
只看该作者 15楼 发表于: 2011-06-30
话倒不是这样说的, 那如果我有3种语言甚至更多种语言的话, 那我在那个retranslateUi()的函数里面那还不得:每个控件用三次setText();  那样的话???
离线dbzhang800

只看该作者 16楼 发表于: 2011-06-30
引用第15楼panqingliang于2011-06-30 16:58发表的  :
话倒不是这样说的, 那如果我有3种语言甚至更多种语言的话, 那我在那个retranslateUi()的函数里面那还不得:每个控件用三次setText();  那样的话???[表情]  

唉,即使你有上百种语言,对于每一个按钮,在你的retranslateUi内,你也只需要setText一次。


离线panqingliang
只看该作者 17楼 发表于: 2011-07-01
回 16楼(dbzhang800) 的帖子
看来终于到正题了, 现在就是这样的问题, retranslateUi() 里面的setText(tr(“”))函数的是不是, 里面是中文还是英文都无所谓, 还有, 我开始就是这样弄弄的, 怎么就是翻译不了???
离线dbzhang800

只看该作者 18楼 发表于: 2011-07-01
Re:回 16楼(dbzhang800) 的帖子
引用第17楼panqingliang于2011-07-01 08:48发表的 回 16楼(dbzhang800) 的帖子 :
看来终于到正题了, 现在就是这样的问题, retranslateUi() 里面的setText(tr(“”))函数的是不是, 里面是中文还是英文都无所谓, 还有, 我开始就是这样弄弄的, 怎么就是翻译不了???


呵呵,是你一开始就往旁门左道冲,别人拦都拦不住。

题外:
* 我不关心你怎么做(而且你提供的这些信息过于零散,别人也没办法定位),你只需要确保,你的QTranslator 改变以后,你确实执行了 setText  即可。
* 遇到问题,首要的是 debug 你的程序。提问时应该告诉大家你做了哪些努力,而不是基于一个假定的前提。


离线panqingliang
只看该作者 19楼 发表于: 2011-07-01
我的问题解决了, 多谢你   感觉在发帖之前我走的就是对的
快速回复
限100 字节
 
上一个 下一个