QT5之 i18n

前言

i18n 在QT自带的示例程序里面有,名称就是i18n,但是具体的i18n的过程可能还是不太清楚,这里记录一下。(本来想从事linux的C开发的,奈何不给机会,只能搞QT开发咯,哭晕)

步骤

这里给出一点小的建议,如果你是打算修改示例程序的代码,那么建议你将工程文件拷贝出来,不然一旦你改出问题了,下次你就要重新从官网去下载这些东西了,巨麻烦。
在这里插入图片描述
展开这个项目之后,结构是这样的,这里面最重要的就是那些个 .ts 文件了,我们需要先把这个东西编辑好了以后,再生成 .qm 文件,然后程序才能使用这个来进行多语言翻译(记住,这里的多语言翻译可不是谷歌翻译那样,直接按照英文字母的意思来进行翻译;而是根据你的语言环境,来查找这个字符串翻译之后的字符串,然后将翻译之后的字符串显示出来。游戏汉化也是如此)
在这里插入图片描述
这里编辑 .ts 文件,有两种方式,第一种是利用linguist这个程序来进行编辑(它在你的QT安装目录下面,如果是win10系统的话,在开始菜单的地方很容易找到)
在这里插入图片描述
在这里插入图片描述
这个工具,我目前只找到了修改字符串的地方,暂时没有找到添加的地方。画圈的地方就是翻译后的文字,你可以对其进行修改
在这里插入图片描述
第二种方式就是直接操作XML(ts文件其实就是一个XML文件)文件进行修改,这种就比较灵活,随意添加修改。
在这里插入图片描述
在这里插入图片描述
这样改了就可以了,当然还要注意这里,看是不是你要翻译的语言类型,这里的zh就代表是翻译成中文
在这里插入图片描述

好了,上面所做的操作只是编辑好了字符串,那么怎么写到程序呢?这里我们借用官方的示例。
在进行此操作前,一定要先把 ts 文件生成 qm文件,怎么做呢?很简单(注意 ts 文件要放到translations这个目录下),具体操作如下,点击 工具 -> 外部 -> qt语言家 -> 先选择更新翻译 然后选择发布翻译 即可,(注意看操作过程中有无报错,不然qm文件更新失败,i18n是没法实现的)
程序里面怎么使用呢?

QTranslator translator;
translator.load(qm文件); // 我们最终使用的还是qm文件,并不是ts文件
qApp->installTranslator(&translator);
// 这里只是听说是这样,还没试过,等博主试过以后再更新
// 如果你没有 ui这个指针,整个界面都是你手动写的,那么你就需要在此之后调用自己写的方法把字符串全部重新设置一遍,不过想想QT应该没那么蠢才对,应该还有别的办法,待查。
// 如果你的界面是通过设计师程序 来设计的,那么可以直接调用 ui->retranslateui() 来实现

//还有一点要注意,这里的字符串必须和ts里面的完全一样,否则无法翻译;另外,需要翻译的字符串要用tr()包含进来

好了,我们改一下官方的示例
在这里插入图片描述
我们给左边的这个窗口添加一个QRadioButton,名称嘛,自行车咯。
在这里插入图片描述
在这里插入图片描述
因为我们只改了这两种语言,所以这里只有这两种是正常的,其余的语言环境Bike都是英文展示的。当然官方的示例还是比较的简单的,他没有涉及到更新界面的操作,只是添加的窗口。后续我会更新一个更新的博客,等我研究透彻吧。

博主换了系统,原来是deepin的系统,截图什么的用起来贼方便,换回win以后,唉,感觉跟个夜盲人一样,啥都不会。555555.

------------------------续上研究成果-------------------------------------
这里只是用了一个窗口来展示字符串,点击语言选项的时候,窗口动态变化,但似乎除了重新设置字符串以外,没有别的选择。
在这里插入图片描述
贴上自己修改的代码吧

void LanguageChooser::checkBoxToggled()
{
    QRadioButton *radioButton = qobject_cast<QRadioButton *>(sender());
    QTranslator translator;
    translator.load(qmFileForCheckBoxMap.value(radioButton));
    qApp->installTranslator(&translator);

    if (!window)
    {
        window = new MainWindow;
        window->setPalette(colorForLanguage(radioButton->text()));

        window->installEventFilter(this);
        window->show();
    }
    else
    {
        window->setPalette(colorForLanguage(radioButton->text()));
        window->update_words();
    }
}

void MainWindow::update_words()
{
    listWidget->clear();
    for (const char *entry : listEntries)
        listWidget->addItem(tr(entry));

    exitAction->setText(tr("E&xit"));
    fileMenu->setTitle(tr("&File"));
    setWindowTitle(tr("Language: %1").arg(tr("English")));
    statusBar()->showMessage(tr("Internationalization Example"));

    groupBox->setTitle(tr("View"));
    perspectiveRadioButton->setText(tr("Perspective"));
    isometricRadioButton->setText(tr("Isometric"));
    obliqueRadioButton->setText(tr("Oblique"));
    pBike->setText(tr("Bike"));
}

主要修改了checkBoxToggled,以及添加了一个函数update_words,博主试过各种对window指针的操作,完全没办法,最多只能重新创建,这就不符合我们的约定了,还是这种比较好。
说说我的感想吧,若要重新set字符串,那么listwidget里面的内容必须清空以后重新添加字符串才能达到预期效果。一般来说界面上的字符串我们都是预先已经约定好了的,所以这里进行此操作并没有太大的妨碍,至于用户控件里面的动态字符串,那个是软件产生的结果,原先是怎么样,现在依旧是怎么样就可以了,不用做处理,我们只是改界面语言,只是改了控件的提示而已。

完整修改后的代码我会放到CSDN上,有需要的同学可以看看。地址如下:https://download.csdn.net/download/weixin_45718152/12350802

原创文章 19 获赞 1 访问量 433

猜你喜欢

转载自blog.csdn.net/weixin_45718152/article/details/105675435