を使用してアプリケーションに翻訳を追加すると、以下qApp->installTranslator(& aTranslator)
のすべての呼び出し(および同様の関数)が翻訳者で翻訳されたテキストを検索します。したがって、後に呼び出す必要があります。実際には、そこで呼び出さないイベントが発生する可能性があります。イベントを再実装してインターセプトする可能性があります。QObject::tr()
retranslateUi()
qApp->installTranslator()
QWidget::changeEvent()
QEvent::LanguageChange
void MainWindow::changeEvent(QEvent *e)
{
QMainWindow::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
// Someone called qApp->installTranslator() with a new translation.
// Let's update the user visible strings.
// This function was created by uic from the Designer form.
// It translates all user visible texts in the form.
ui->retranslateUi(this);
// This function must be written by you. It translates other user visible
// texts that are not in the form. See down for an example.
this->retranslateUi();
break;
default:
break;
}
}
ui->retranslateUi()
QObject::tr()
UIで表示される各ユーザーの文字列を呼び出すだけです。これは最後に自動的に呼び出されsetupUi()
、フォームのウィジェットに翻訳されたテキストを入力します(見てください。ファイル内のuicによって定義されていui_MainWindow.h
ます)。QTableWidgetのタイトルなど、他のユーザーに表示されるテキストでも同様のアプローチをとることができます。すべての文字列はretranslateUi()
、アプリケーションの開始時(または、関連するウィジェットが作成された後)および新しい翻訳がロードされるたびに呼び出される関数(おそらく一貫性のために名前が付けられています)に設定されます。
MainWindow::MainWindow(QWidget * parent)
: QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
// Creates other widgets, but do not set their user visible texts.
tableWidget = new QTableWidget(this);
...
someControl = new QLineEdit(this);
someOtherControl = new QSpinBox(this);
someModel = new MyModel(this);
...
// Ok, *now* we set their texts.
this->retranslateUi();
}
...
void MainWindow::retranslateUi()
{
// This function will be called (either manually or automatically by
// `changeEvent()`) when a new translator has installed, hence all the `tr()`
// calls will return the right translation for the last installed language.
QStringList labels;
labels.append(tr("First column"));
labels.append(tr("Second column"));
labels.append(tr("Third column"));
tableWidget->setHorizontalHeaderLabels(labels);
someControl->setText(tr("Control name"));
someOtherControl->setText(tr("Other control name"));
// Perhaps you have a model that need to be retranslated too
// (you need to write its `retranslateUi()` function):
someModel->retranslateUi();
...
}
また、あなたが次のようなことをしている場合は注意してください
void MainWindow::someFunction()
{
...
QTranslator translator;
translator.load(":/lang/English");
qApp->installTranslator(& translator);
...
}
その関数が戻るとすぐに変数translator
が破棄されるため、次回QObject::tr()
が呼び出されると、に格納されているアドレスはqApp->installTranslator(& translator)
無効になります。したがってtranslator
、でヒープに割り当てる必要があります(さらに、不要になったときにnew
で削除することもできます)。delete
例外は、その関数がブロックされており、アプリケーションが閉じられるまで戻らないため、main()
呼び出す前にそれを実行している場合です。QCoreApplication::exec()
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
...
QTranslator translator;
translator.load(":/lang/English");
app.installTranslator(& translator);
...
app.exec(); // This function will return only on application's exit.
// Hence `translator` will outlive the application, there is
// no need to worry about it.
}