• 7664阅读
  • 20回复

[提问]关于国际化(语言切换)的问题,大家帮帮我吧! [复制链接]

上一主题 下一主题
离线rain60w
 

只看楼主 倒序阅读 楼主  发表于: 2014-06-27
先说,程序的要求:
一个多级菜单中,子菜单中设置了语言(中英文切换),关闭这个子菜单之后,以前打开的父菜单希望能自动变成新设置语言。

目前自己想这样实现:
现在我是在每一个界面类中调用了读配置文件(含当前语言),也就是重新打开任何一个界面对象,都会更新语言;
但是我希望关闭子对象,就刷新父对象,也就是我父对象中的构造函数中读了配置文件的。
可是我不知道该怎么做?

你们有更好的方法请教教我!
关键就是实现有个有多级对话框的程序中,各个界面都动态的实现语言的切换,我在网上已经基本学会了当前页的动态切换,怎样让已经打开的父框也动态切换啊!!!。
离线dbzhang800

只看该作者 1楼 发表于: 2014-06-27
所谓的切换,不就是加载新的翻译文件么?

加载新的翻译文件时,所有的QWidget不是都能接到通知么?

接到通知到,各个QWidget各自更新的各自的显示不就行了?
离线rain60w

只看该作者 2楼 发表于: 2014-06-27
回 dbzhang800 的帖子
dbzhang800:所谓的切换,不就是加载新的翻译文件么?
加载新的翻译文件时,所有的QWidget不是都能接到通知么?
接到通知到,各个QWidget各自更新的各自的显示不就行了? (2014-06-27 13:16) 

你说的对吧, 我接触的比较少有些地方还是不懂。

你告诉我一下,你所谓的“各个QWidget各自更新的各自的显示”,这个不是自动的吧,怎样实现啊???

QTranslator qt_translator;
qt_translator.load(":/lngg/en");
qApp->installTranslator(&qt_translator);
retranslateUi();

我就是判断Qcombobox中的选择,按键时槽函数调用的上面的代码,当前页里的中英文就切换了,但是父对话框的还是维持原来的语言,要把父窗口关掉,重新打开才切换成新改的语言啊,我是想问,我能在子窗口返回父窗口时调用什么函数,来重新刷新父窗口之类的吗?
离线rain60w

只看该作者 3楼 发表于: 2014-06-27
回 dbzhang800 的帖子
dbzhang800:所谓的切换,不就是加载新的翻译文件么?
加载新的翻译文件时,所有的QWidget不是都能接到通知么?
接到通知到,各个QWidget各自更新的各自的显示不就行了? (2014-06-27 13:16) 

我怎么做能在整个程序中加载这个翻译文件啊, 我加载了只对当前对话框生效了,别的框没变化啊;
当然,很容易可以让新生成的对话框加载这个新的文件;
关键我不知道怎么让已经打开的父框也重新加载这个翻译文件啊!
离线dbzhang800

只看该作者 4楼 发表于: 2014-06-27
你在这儿调用 retranslateUi 是不太恰当的,你应该在事件处理函数中,接受到相应事件时调用。这样你的所有困惑就都不存在了。

我很久没用过QtCreator,我记得,你随便创建一个简单的QtWidgets的工程,它默认生成的代码就是支持翻译机制的正确代码。你可以看一下。当然,直接看Qt Manual也行

离线rain60w

只看该作者 5楼 发表于: 2014-06-27
回 dbzhang800 的帖子
dbzhang800:你在这儿调用 retranslateUi 是不太恰当的,你应该在事件处理函数中,接受到相应事件时调用。这样你的所有困惑就都不存在了。
我很久没用过QtCreator,我记得,你随便创建一个简单的QtWidgets的工程,它默认生成的代码就是支持翻译机制的正确代码。你可以看一下。当然,直接看Qt  .. (2014-06-27 13:50) 

你说的事件处理函数是那种 event字样的函数吗?
我是在槽函数中调用的retranslateUi,这是不对的是吗?

你说的后半句什么意思,我不是很明白?
离线dbzhang800

只看该作者 6楼 发表于: 2014-06-27
回 rain60w 的帖子
rain60w:
你说的事件处理函数是那种 event字样的函数吗?




rain60w:

我是在槽函数中调用的retranslateUi,这是不对的是吗?



谈不上对错,如果你只想翻译这一个widget的话,这么做没什么大问题。

rain60w:

你说的后半句什么意思,我不是很明白?


意思就是,你可以看Qt自带Manual,也可以看QtCreator生成的例子。都很容易找到答案

QEvent::LanguageChange    89    The application translation changed.

只看该作者 7楼 发表于: 2014-06-28
博客地址:https://waleon.blog.csdn.net
微信公众号:高效程序员
QQ 群:242790253
微信群:加微信(iwaleon),邀请入群。

承接各种 C++/Qt/QML 项目,专业的团队,一流的服务,不二的选择!
离线rain60w

只看该作者 8楼 发表于: 2014-07-02
回 奋斗ing孩子 的帖子
奋斗ing孩子:可以参考一下:http://www.qtcn.org/bbs/read-htm-tid-55112.html (2014-06-28 09:30)

我看过你的360的代码,但是里面没有切换中英文的选项吧?
我需要在设置里选中文,之后确认,整个程序都变成中文的,我现在的情况是这样的。
程序本身是英文;
比如我有3层的界面,1中有按钮打开2,2中有按钮打开3;
在3中设置中文语言,当前界面就动态改变了,关掉3,,就看到了2,2还是英文;
1也一个道理,但如果我这时关掉2,再打开2,这时2界面就是中文了。
如果这更个程序关掉,重新运行就全改过来了。

我是对象显示时,也就是每个界面类的构造函数中读配置文件,之后只要新打开的窗口,都会读配置,这时打开的就对了,可是我没办法让已经打开的窗口实时更换语言,我想知道我能在关掉子对话框时,刷新父框(不知道是不是就是能让父框调用一次paintEvent()就好了,如果行怎么调用呢,如果不行这种方式能实现吗?),再或者有更好地方法吗?

还有我的程序是要跑在开发板上的。 请你指点一下,谢谢。
离线dbzhang800

只看该作者 9楼 发表于: 2014-07-02
回 rain60w 的帖子
rain60w:我看过你的360的代码,但是里面没有切换中英文的选项吧?
我需要在设置里选中文,之后确认,整个程序都变成中文的,我现在的情况是这样的。
程序本身是英文;
比如我有3层的界面,1中有按钮打开2,2中有按钮打开3;
....... (2014-07-02 10:05) 

都6天了,你还没弄明白 QEvent::LanguageChange 怎么用么?
离线rain60w

只看该作者 10楼 发表于: 2014-07-02
回 dbzhang800 的帖子
dbzhang800:都6天了,你还没弄明白 QEvent::LanguageChange 怎么用么? (2014-07-02 10:10) 

最近几天在忙别的事。

只看该作者 11楼 发表于: 2014-07-02
回 rain60w 的帖子
rain60w:我看过你的360的代码,但是里面没有切换中英文的选项吧?
我需要在设置里选中文,之后确认,整个程序都变成中文的,我现在的情况是这样的。
程序本身是英文;
比如我有3层的界面,1中有按钮打开2,2中有按钮打开3;
....... (2014-07-02 10:05) 

你好好看,是动态切换语言的。。。
还可以参考:Qt之多语化
博客地址:https://waleon.blog.csdn.net
微信公众号:高效程序员
QQ 群:242790253
微信群:加微信(iwaleon),邀请入群。

承接各种 C++/Qt/QML 项目,专业的团队,一流的服务,不二的选择!
离线dbzhang800

只看该作者 12楼 发表于: 2014-07-02
回 奋斗ing孩子 的帖子
奋斗ing孩子:你好好看,是动态切换语言的。。。
还可以参考:Qt之多语化  (2014-07-02 12:46) 

楼主的做法似乎和你的是一样的,都没有使用Qt为动态翻译专门提供的   QEvent::LanguageChange

所以有多个widgets时,他遇到了问题。

只看该作者 13楼 发表于: 2014-07-02
不需要使用QEvent::LanguageChange可以的,重新加载qm即可!
博客地址:https://waleon.blog.csdn.net
微信公众号:高效程序员
QQ 群:242790253
微信群:加微信(iwaleon),邀请入群。

承接各种 C++/Qt/QML 项目,专业的团队,一流的服务,不二的选择!
离线dbzhang800

只看该作者 14楼 发表于: 2014-07-02
回 奋斗ing孩子 的帖子
奋斗ing孩子:不需要使用QEvent::LanguageChange可以的,重新加载qm即可! (2014-07-02 17:17) 

??

翻译语言切换,肯定要重新加载qm文件,这是没有疑问的。
加载qm文件后,所有的QWidget都会收到 QEvent::LanguageChange 事件。

正常做法:所有需要翻译的QWidget,在各自事件处理函数中,更新需要翻译的内容就行了。

你和楼主的做法:加载qm文件后,直接手动更新要翻译的内容。
这种做法的问题:你很难保证你更新了所有需要翻译的内容,特别是在控件很多,程序很复杂的时候的时候。

只看该作者 15楼 发表于: 2014-07-02
是存在这种问题,但是完全可以做到实时动态切换,在事件函数中也可以处理,不同的方式。。。C++ GUI里面讲的主要是利用QEvent::LanguageChange判断进行切换
博客地址:https://waleon.blog.csdn.net
微信公众号:高效程序员
QQ 群:242790253
微信群:加微信(iwaleon),邀请入群。

承接各种 C++/Qt/QML 项目,专业的团队,一流的服务,不二的选择!
离线紫辰

只看该作者 16楼 发表于: 2014-07-03
我之前做的项目就是用QEvent::LanguageChange做的切换的;
离线rain60w

只看该作者 17楼 发表于: 2014-07-04
谢谢你们啦,我昨天下午搞定了,用的是“奋斗的孩子”的方法,和启发。
----------------------------
我是在切换语言的界面中, 用切换的槽函数中触发一个信号,上级菜单收到这个信号再触发当前界面的槽函数,以此类推。 好像是麻烦了。 但问题基本解决了。
----------------------------
应该是“dbzhang800”的方法好吧,之前不知道该怎么做,现在看了你们两个的讨论又有了新的启发,好像明白了,有时间我会再试试这种QEvent::LanguageChange方法。

很感谢你们两位。
可以结帖了!
本帖提到的人: @dbzhang800 @一去丶二三里
离线dbzhang800

只看该作者 18楼 发表于: 2014-07-04
不用 QEvent::LanguageChange 的坏处是,你添加一个widget,都要手动调用相关的函数来翻译。

用该事件的话,所有东西都是自动的。和像你调用QtWidgets中的标准控件一样。
离线rain60w

只看该作者 19楼 发表于: 2014-07-04
回 dbzhang800 的帖子
dbzhang800:不用 QEvent::LanguageChange 的坏处是,你添加一个widget,都要手动调用相关的函数来翻译。
用该事件的话,所有东西都是自动的。和像你调用QtWidgets中的标准控件一样。 (2014-07-04 12:21) 

好的,我知道了,我去试试!
十分感谢!

只看该作者 20楼 发表于: 2014-07-04
是的,他说的对,是需要手动调用。。。那样会麻烦一些,而且有可能遗漏。
博客地址:https://waleon.blog.csdn.net
微信公众号:高效程序员
QQ 群:242790253
微信群:加微信(iwaleon),邀请入群。

承接各种 C++/Qt/QML 项目,专业的团队,一流的服务,不二的选择!
快速回复
限100 字节
 
上一个 下一个