0

私のプロジェクトには、翻訳可能な文字列が tr() 関数でボックス化されている多くのフォームと文字列があります。すべての文字列を Linguist で翻訳しましたが、対応する qm ファイルをロードすると、UI にある文字列だけが翻訳されます。

たとえば、「He​​llo World!」というラベルを含むフォームがあるとします。テキスト、それは「Olleh Dlrow!」に翻訳されます。しかし、私が書いた場合のコードでは:

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

MainWindowまたはSecondaryWindowの翻訳は行われず、元のテキストが表示されます。

何か案が?ありがとうございます。

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) using 名前空間 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 に答える