找回密码
 立即注册
收起左侧

QT多界面切换语言

10
回复
17875
查看
[复制链接]
累计签到:29 天
连续签到:1 天
来源: 2014-2-12 11:00:38 显示全部楼层 |阅读模式
1Qter豆
      你好!我现在在做一个QT的动态语言切换,用的是一些教程中提到的:QTranslator 加载load对应ts翻译后的qm文件,然后retranslateUi重新翻译界面。



     如上图,主要是3个QAction触发changeLanguage槽函数。
connect(ui->action_1,SIGNAL(triggered()),this,SLOT(changeLanguage()));
    connect(ui->action_2,SIGNAL(triggered()),this,SLOT(changeLanguage()));
    connect(ui->action_3,SIGNAL(triggered()),this,SLOT(changeLanguage()));
void MainWindow::changeLanguage()
{
    QTranslator translator;
    QAction* radio = qobject_cast<QAction*>(sender());
    qDebug() << "reciver"<<endl;
    if(radio == ui->action_1)
    {
        ui->retranslateUi(this);
        qDebug() << "en"<<endl;
    }
    else if(radio == ui->action_2)
    {
        translator.load(":/new/tr_zh_CN.qm");
        qApp->installTranslator(&translator);
        ui->retranslateUi(this);
        qDebug() << "cn"<<endl;
    }
    else
    {
        translator.load(":/new/tr_zh_HK.qm");
        qApp->installTranslator(&translator);
        ui->retranslateUi(this);
        qDebug() << "hk"<<endl;
    }
}
        但是我现在遇到一个问题是,我在我原来这个工程中添加了一个新的QT界面类QDialog,在原来的mainwindow类中建立了QDialog的对象test,在菜单栏Edit中会触发test的show函数;我用预言家linguist翻译的时候mainwindow和Dialog的界面都翻译了的,但是切换语言的时候mainwindow 是可以的,QDialog这个对象的语言却切换不了。请问应该怎么做才能让QDialog这个对象随着QMainwindow的语言切换一起切换?十分谢谢!



附件: 您需要 登录 才可以下载或查看,没有帐号?立即注册

最佳答案

查看完整内容

你可以把切换语言时emit一个信号并把你切换的语言类型发送过去,与你要变换语言的窗口的更换语言slot关联起来就可以实行的,这个不难的吧. 例:你在你的mainwindow选择语言时会产生signal的吧? 你的窗口可以加一个slot , void change_trans(int nType){ switch(nType) { case 中文: 更新语言为中文; break; case 英文: 更新语言为英文; break; } } 你把你要变更的窗口加上那个slot并并联,就可以了。 ...
回复

使用道具 举报

累计签到:157 天
连续签到:1 天
2014-2-12 11:00:39 显示全部楼层
你可以把切换语言时emit一个信号并把你切换的语言类型发送过去,与你要变换语言的窗口的更换语言slot关联起来就可以实行的,这个不难的吧.
例:你在你的mainwindow选择语言时会产生signal的吧?
你的窗口可以加一个slot , void change_trans(int nType){
switch(nType)
{
case 中文: 更新语言为中文;
break;
case 英文: 更新语言为英文;
break;
}
}
你把你要变更的窗口加上那个slot并并联,就可以了。
回复

使用道具 举报

累计签到:29 天
连续签到:1 天
2014-2-12 14:07:58 显示全部楼层
本帖最后由 uiaxiaobo 于 2014-2-12 14:10 编辑

     我有个乱七八糟的方法,不知道能不能用。

我在Dialog类里面写了公有函数
void Dialog::re_trans()
{
    ui->retranslateUi(this);
}

      然后在mainwindow每次切换语言后,都通过mainwindow中Qdialog对象test调用上述函数
         translator.load(":/new/tr_zh_CN.qm");
         qApp->installTranslator(&translator);
         ui->retranslateUi(this);                  //这是mainwindow的retranslateUi(this)
         test.re_trans()                              //加了这么一句,这是dialog的retranslateUi(this)
         qDebug() << "cn"<<endl;

     然后可以用了...但是不知道这样写规范不规范行不行,或者说有什么标准的做法?
回复

使用道具 举报

累计签到:29 天
连续签到:1 天
2014-2-13 13:33:00 显示全部楼层
本帖最后由 uiaxiaobo 于 2014-2-13 13:34 编辑
修罗 发表于 2014-2-12 18:19
你可以把切换语言时emit一个信号并把你切换的语言类型发送过去,与你要变换语言的窗口的更换语言slot关联起 ...


谢谢!工程虽然load了qm文件,但是没注意到对应界面的retranslateUi也需要执行一遍才可以
我现在又遇到了一个问题,就是我的linguist打开ts的时候里面代码中的中文即使加了tr在linguist中显示也是乱码的,
譬如:
QMessageBox::warning(this,tr("提示"),tr("端口已打开"),QMessageBox::Ok);
这里的“提示”“端口已经打开”在linguist中显示都是乱码。
这样让我翻译的时候很不好弄,请问你有遇到过这种情况吗?
回复

使用道具 举报

累计签到:157 天
连续签到:1 天
2014-2-17 09:24:04 显示全部楼层
你的代码文件格式不对,用的是utf-8格式还是ansi格式的?你用Notepad++Portable转一下格式吧。
回复

使用道具 举报

累计签到:29 天
连续签到:1 天
2014-2-17 10:19:18 显示全部楼层
本帖最后由 uiaxiaobo 于 2014-2-17 13:33 编辑
修罗 发表于 2014-2-17 09:24
你的代码文件格式不对,用的是utf-8格式还是ansi格式的?你用Notepad++Portable转一下格式吧。 ...


我的代码就是在QTcreator里面写的,是utf-8的,用其他格式的话代码中用到的中文会显示乱码
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));

参考了http://blog.csdn.net/dbzhang800/article/details/6334852 这个文章之后,我在linguist在可以显示代码中的中文了,但是我翻译好之后,发现程序好像完全加载不上qm文件了...
回复

使用道具 举报

累计签到:29 天
连续签到:1 天
2014-2-17 16:37:21 显示全部楼层
有人知道吗?帮忙看一下吧@yafeilinux
回复

使用道具 举报

累计签到:1571 天
连续签到:1 天
2014-2-18 11:36:38 显示全部楼层
uiaxiaobo 发表于 2014-2-17 16:37
有人知道吗?帮忙看一下吧@yafeilinux

首先,如果要使用国际化,建议在程序中只使用英文字符串;

对于那个对话框没有翻译,感觉是因为切换翻译文件的时候,对话框类没有创建造成的。
回复

使用道具 举报

累计签到:29 天
连续签到:1 天
2014-2-18 16:41:12 显示全部楼层
本帖最后由 uiaxiaobo 于 2014-2-18 16:44 编辑
yafeilinux 发表于 2014-2-18 11:36
首先,如果要使用国际化,建议在程序中只使用英文字符串;

对于那个对话框没有翻译,感觉是因为切换翻译 ...

谢谢!这个切换问题3楼已经帮我已经解决了,现在遇到主要下面两个问题:
(1):是linguist显示源码中的中文是乱码,即使我翻译成英文,源码中的中文在切换英文的时候只也没有反应(界面上的中文能够正常切换为英文)
(2):在参考了http://blog.csdn.net/dbzhang800/article/details/6334852 这个文章之后,我在linguist显示代码中的中文不在是乱码了,但是我翻译好之后,发现程序依旧是:源码中的中文切换的时候依旧没有反应(界面上的中文还是能够正常切换为英文)

我也看到许多人说代码中最好不要出现中文,的确,我发现我如果程序启动的时候是英文,然后再切来切去都没什么问题;如果启动是中文的话,切英文就出现了这样的问题

请问您知道这个问题怎么解决吗?当然,不行大不了启动是英文的就是了
回复

使用道具 举报

累计签到:1571 天
连续签到:1 天
2014-2-18 20:54:32 显示全部楼层
uiaxiaobo 发表于 2014-2-18 16:41
谢谢!这个切换问题3楼已经帮我已经解决了,现在遇到主要下面两个问题:
(1):是linguist显示源码中的中 ...

嗯嗯,这个最好做规范,源码中全部使用英文吧。在源码中书写中文本来就不是规范的,因为编码问题,换个系统可能就会乱码。

国际化本来的目的就是把英文显示为其他字符,而不是反过来。


所以,即便有办法解决你所说的问题,也不推荐尝试,为了以后少出问题,最好按规范来。
回复

使用道具 举报

累计签到:29 天
连续签到:1 天
2014-2-19 09:27:19 显示全部楼层
yafeilinux 发表于 2014-2-18 20:54
嗯嗯,这个最好做规范,源码中全部使用英文吧。在源码中书写中文本来就不是规范的,因为编码问题,换个系 ...

嗯,谢谢!
我找了很久也没找到怎么解决的方法
那好,那我就这么做了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了