0

我的项目中有很多表单和字符串,可翻译的字符串被装箱在 tr() 函数中。我翻译了 Linguist 的所有字符串,但是当我加载相应的 qm 文件时,只翻译了 UI 中的字符串。

例如,如果我有一个包含“Hello World!”标签的表单。文本,它被翻译为“Olleh Dlrow!”(只是为了说)。但是如果我在代码中写:

if ( condition )
    ui.setTitle(tr("MainWindow"));
else
    ui.setTitle(tr("SecondaryWindow"));

未完成MainWindowSecondaryWindow的翻译并显示原始文本。

任何想法?先谢谢了。

4

1 回答 1

1

我想为像我这样的人解释解决方案。考虑我有一个名为 MyForm 的类。我为我的项目定义了一个名为 MyNmeSpace 的命名空间。

/*    MyForm.cpp    */

using namespace MyNmeSpace;

MyForm::MyForm(QWidget* parent):QMainWindow(parent)
{}

1)如果用户将字符串包装在tr()函数中,它们将不会被翻译。为了启用翻译,他必须使用QApplication::translate("ClassName", "str", 0, QApplication::UnicodeUTF8) ,例如:

/*    MyForm.cpp approach 1   */

using namespace MyNmeSpace;

MyForm::MyForm(QWidget* parent):QMainWindow(parent)
{
    bool condition; /* sth you like */

    if ( condition )
        // ui.setWindowTitle(tr("MainWindow"));  <= won't work
        ui.setWindowTitle(QApplication::translate("MyForm", "MainWindow", 0, QApplication::UnicodeUTF8));
    else
        // ui.setWindowTitle(tr("SecondaryWindow"));  <= won't work
        ui.setWindowTitle(QApplication::translate("MyForm", "SecondaryWindow", 0, QApplication::UnicodeUTF8));
}

在这种方法中,.ts 文件中的翻译在每个条目中写入MyForm 。

2)删除使用命名空间MyNmeSpace;MyForm.cpp的开头并指定范围,例如:

/*    MyForm.cpp approach 2   */

MyNmeSpace::MyForm::MyForm(QWidget* parent):QMainWindow(parent)
{
    bool condition; /* sth you like */

    if ( condition )
        ui.setWindowTitle(tr("MainWindow"));  // Now works
    else
        ui.setWindowTitle(tr("SecondaryWindow"));  // Now works
}

在这种方法中,.ts 文件中的翻译在每个条目中都像MyNmeSpace::MyForm一样编写。

于 2013-08-12T07:25:44.787 回答