【问题标题】:How to use Qt Linguist for Qt UI file?如何将 Qt Linguist 用于 Qt UI 文件?
【发布时间】:2013-01-03 08:36:21
【问题描述】:

我正在使用 Qt 语言学家翻译 ui 文件。我使用lupdate 获得了它的ts 文件,并翻译了这些单词和短语。现在我想将它添加到我的代码中,但我从它的教程中发现,我似乎必须将tr() 添加到我的代码中的每个单词和短语中。我理解正确吗?我可以只加载翻译后的qm 文件进行翻译吗?如果是这样,我该如何在这个ui 文件中做到这一点?

提前致谢。

更新

在更改 Jens 提到的属性后,在我的 ui 头文件中,我可以看到如下语句:

buttonSetupData->setText(QApplication::translate("MainWindow", "Set Data", 0, QApplication::UnicodeUTF8));

在 Ajith 回答之后,我更改了代码,现在 ui_main.h 文件中的 retranslateUi 函数如下所示:

void retranslateUi ( QMainWindow *MainWindow )
{
    QTranslator translator;
    translator.load ( " ...\Test.ts " );
    QApplication::installTranslator ( &translator );

    MainWindow->setWindowTitle ( QApplication::translate ("MainWindow",  "The Sentioscope - Beta v2.0 for Soccer", 0, QApplication::UnicodeUTF8));

    ...
}

但是还是不行。

最新更新

我目前读取“.qm”文件的函数是这样的:

void MainWindow::translate()
{
     QTranslator translator;
     translator.load ( "Test.qm", "D:\\" );
     qApp->installTranslator ( &translator );
     retranslateUi ( this );
 }

然后我这样调用这个函数:

MainWindow::MainWindow ( QWidget *parent ) : QMainWindow ( parent )
{
    setupUi(this);
    translate();
}

在 Ajith 的最新回答之后,我以这种形式(例如)更改了警告/消息框的每个字符串:

QMessageBox::warning( this, QMessageBox::tr("ERROR"), QMessageBox::tr("Invalid IP adress") );

lupdate 我可以读取所有这些字符串,翻译并将它们保存在一个 qm 文件中。现在的问题是,它可以将这些字符串转换为 ui,但不能转换为执行后的警告/消息框。

【问题讨论】:

    标签: qt user-interface translation linguistics


    【解决方案1】:

    我不完全确定你想从这个问题中完成什么。我认为您正在寻找一种在运行时从 C++ 代码加载“qm”文件的方法。如果是这样,您需要做的是使用QTranslator 类..

    QTranslator translator;
    translator.load("file.qm", "dir");
    qApp->installTranslator(&translator);
    

    更新

    这对我有用..

    主窗口.cpp

    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow),
        isChinese(false)
    {
        ui->setupUi(this);
        msgbox = new QMessageBox(QMessageBox::NoIcon, "", "", QMessageBox::NoButton, this);
        pbtn = msgbox->addButton("Ok", QMessageBox::AcceptRole);
    
        doRetranslate();
    
        QObject::connect(ui->pushButton, SIGNAL(clicked()), this, SLOT(doTranslate()));
        QObject::connect(ui->pushButton, SIGNAL(clicked()), msgbox, SLOT(show()));
    }
    
    MainWindow::~MainWindow()
    {
        delete ui;
    }
    
    void MainWindow::doTranslate()
    {
        QTranslator translator;
        if (!isChinese) {
            translator.load("test_zh_TW.qm", "../TestTranslator");
            qApp->installTranslator(&translator);
            isChinese = true;
        } else {
            translator.load("", ""); // Default is english
            qApp->installTranslator(&translator);
            isChinese = false;
        }
        ui->retranslateUi(this);
        doRetranslate();
    }
    
    void MainWindow::doRetranslate()
    {
        msgbox->setWindowTitle(QObject::tr("ERROR"));
        msgbox->setText(QObject::tr("Invalid IP adress"));
        pbtn->setText(QObject::tr("Ok"));
    }
    

    主窗口.h

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QMainWindow>
    #include <QMessageBox>
    #include <QPushButton>
    
    namespace Ui {
    class MainWindow;
    }
    
    class MainWindow : public QMainWindow
    {
        Q_OBJECT
    
    public:
        explicit MainWindow(QWidget *parent = 0);
        ~MainWindow();
    
        void doRetranslate();
    public slots:
        void doTranslate();
    
    private:
        Ui::MainWindow *ui;
        bool isChinese;
        QMessageBox *msgbox;
        QPushButton *pbtn;
    };
    
    #endif // MAINWINDOW_H
    

    主窗口.ui

    <?xml version="1.0" encoding="UTF-8"?>
    <ui version="4.0">
     <class>MainWindow</class>
     <widget class="QMainWindow" name="MainWindow">
      <property name="geometry">
       <rect>
        <x>0</x>
        <y>0</y>
        <width>400</width>
        <height>300</height>
       </rect>
      </property>
      <property name="windowTitle">
       <string>MainWindow</string>
      </property>
      <widget class="QWidget" name="centralWidget">
       <widget class="QLabel" name="label">
        <property name="geometry">
         <rect>
          <x>100</x>
          <y>70</y>
          <width>181</width>
          <height>17</height>
         </rect>
        </property>
        <property name="text">
         <string>Hello World!</string>
        </property>
        <property name="alignment">
         <set>Qt::AlignCenter</set>
        </property>
       </widget>
       <widget class="QPushButton" name="pushButton">
        <property name="geometry">
         <rect>
          <x>140</x>
          <y>120</y>
          <width>93</width>
          <height>27</height>
         </rect>
        </property>
        <property name="text">
         <string>translate</string>
        </property>
       </widget>
      </widget>
      <widget class="QMenuBar" name="menuBar">
       <property name="geometry">
        <rect>
         <x>0</x>
         <y>0</y>
         <width>400</width>
         <height>23</height>
        </rect>
       </property>
      </widget>
      <widget class="QToolBar" name="mainToolBar">
       <attribute name="toolBarArea">
        <enum>TopToolBarArea</enum>
       </attribute>
       <attribute name="toolBarBreak">
        <bool>false</bool>
       </attribute>
      </widget>
      <widget class="QStatusBar" name="statusBar"/>
     </widget>
     <layoutdefault spacing="6" margin="11"/>
     <resources/>
     <connections>
      <connection>
       <sender>pushButton</sender>
       <signal>clicked()</signal>
       <receiver>label</receiver>
       <slot>update()</slot>
       <hints>
        <hint type="sourcelabel">
         <x>199</x>
         <y>165</y>
        </hint>
        <hint type="destinationlabel">
         <x>206</x>
         <y>114</y>
        </hint>
       </hints>
      </connection>
     </connections>
    </ui>
    

    【讨论】:

    • 我想将它加载到ui或其头文件中,而不是在cpp中,因为我已经完全按照您所说的尝试过,但是失败了。
    • 不应该是 lupdate 问题。 lupdate 只扫描文本文件和字符串,使用 translate() 函数标记的字符串,并填充 .ts 文件。检查源文件以确保使用 tr() 或 translate() 函数标记所需的字符串。
    • 不需要两个qm文件。 lupdate 的结果应该都在一个 ts 文件中,在不同的上下文中。作为测试,我认为您应该尝试从命令行运行 lupdate。我现在无法对其进行测试,但请尝试“lupdate *.{cpp,h} -ts test.ts”。 QApplication::translate() 的第一个参数是上下文,手动将其设置为不同的上下文。您可以指定不同的上下文,它应该都转到同一个 ts 文件。另外,让我看看你的 .pro 文件。
    • 如果使用 -extensions 语法应该是...'lupdate 。 -扩展 cpp、h、ui -ts test.ts'。我试图使用 bash 扩展,但因为那时我没有环境来检查我的命令,所以我忘记了第二个参数,在这种情况下应该是路径 '.'或当前目录。无论如何,这些扩展都是默认包含的,应该不需要指定它们。
    • 我可以重现该问题。我不确定为什么会这样。如果我在 retranslateUI() 之前调用警告窗口,它会显示翻译文本。也许您可以打开另一个问题,其他人可能有更好的主意。另一种方法是使用...创建您自己的警告窗口... msgbox = new QMessageBox(QMessageBox::NoIcon, "", "", QMessageBox::NoButton, this); pbtn = msgbox->addButton("Ok", QMessageBox::AcceptRole);然后对警告窗口中的文本有自己的重新翻译功能。我可以使用它来获得翻译的警告窗口。
    【解决方案2】:

    你描述的非常正确。 QtDesigner/QtCreator 允许每个 ui-Element 选择是否应翻译其文本(请参阅每个 ui-Element 的属性)。如果选择翻译,则将 tr() 放入生成的 ui_xxx.h 文件中,并从那里像任何其他可翻译单词一样呈现。

    【讨论】:

    • 感谢您的回答。你能告诉我如何在我的ui文件中使用它吗?如果我有一个 cpp 文件,我可以像教程中那样加载 ts 文件,但这里我的文件是 .ui 文件。我看到它现在在它的头文件中添加了“::tranlate ...”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 2018-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    相关资源
    最近更新 更多