Я только что узнал, как установить языковой пакет для моего приложения в Qt, и в настоящее время у меня есть два вопроса. Я написал минимальное приложение, чтобы показать, где меня смутило.
Я создал главное окно, которое содержит только QLabel
показать текст и QPushButton
изменить текст метки с китайского на английский.
И вот мой код:
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
chineseTr = new QTranslator;
chineseTr->load("../untitled/Language-Pack_zh-CN.qm");
englishTr = new QTranslator;
englishTr->load("../untitled/Language-Pack_en-US.qm");
QCoreApplication::installTranslator(chineseTr);
mWidget = new QWidget;
setCentralWidget(mWidget);
hLayout = new QHBoxLayout;
mWidget->setLayout(hLayout);
mLbl = new QLabel;
mLbl->setText(tr("Text"));
translateBtn = new QPushButton;
connect(translateBtn, &QPushButton::clicked, this, &MainWindow::translateText);
hLayout->addWidget(mLbl);
hLayout->addWidget(translateBtn);
}
void MainWindow::translateText()
{
QCoreApplication::removeTranslator(chineseTr);
QCoreApplication::installTranslator(englishTr);
}
Вопрос первый:
Как вы можете видеть в конструкторе, я сначала загрузил языковой пакет, либо QLabel
просто не будет отображать китайский текст. Я могу либо загрузить пакет китайского языка перед созданием всего остального в конструкторе, либо загрузить main.cpp
перед созданием MainWindow
объект. Я ошибаюсь или эти языковые пакеты должны быть загружены перед созданием объектов класса?
Вопрос второй:
Как вы можете видеть в коде, я нажал кнопку и, чтобы удалить языковой пакет для китайского языка и установить новый переводчик для загрузки языкового пакета для английского языка. Но ничего не работает. Так как я могу динамически менять язык в приложении? Я знаю, что этот вопрос может быть простым, но я не нахожу в Интернете никакого полезного примера, чтобы показать мне, как это сделать? Так может кто-нибудь показать мне способ сделать это или дать мне подсказку?
Надеюсь, я все объясню, и спасибо заранее.
Важно понимать где перевод происходит: внутри tr(...)
вызов. tr(...)
возвращает переведенный текст. Это означает, что замена переводчика повлияет на последующие обращения к tr(...)
, но не имеют возможности изменять тексты, уже отображаемые в виджетах.
Самый простой способ «переключить язык на лету» — это ввести метод, содержащий все tr(...)
вызывает и вызывает его после замены переводчика и в конструкторе. Я считаю, что код, сгенерированный из .ui
У файлов (созданных QtDesigner) такой метод уже есть.
void MainWindow::translate()
{
mLbl->setText(tr("Text"));
}
void MainWindow::translateText()
{
QCoreApplication::removeTranslator(chineseTr);
QCoreApplication::installTranslator(englishTr);
translate();
}
Других решений пока нет …