我有一个使用Qt Quick MessageDialog
的小应用。我用命令
lupdate-qt5 ../myapp.pro .
在myapp.pro中,我表示:
lupdate_only {
SOURCES += $$PWD/ui/*.qml
}
和
TRANSLATIONS += \
translations/i18n_nl.ts translations/i18n_fr.ts translations/i18n_en.ts
正确生成所有翻译。但我不知道如何为MessageDialog
提供的标准按钮生成翻译。在以下示例中,将生成“警告”和“请选择是或否”的翻译。但我无法为“是”和“否”生成它们(这是StandardButtons
属性的文本值)
MessageDialog {
title: qsTr("Warning")
text: qsTr("Please select Yes or No")
icon: StandardIcon.Warning
standardButtons: StandardButton.Yes | StandardButton.No
//.....
}
我检查过source code,表示应该翻译它们:
Button {
id: yesButton
text: qsTr("Yes")
onClicked: root.click(StandardButton.Yes)
visible: root.standardButtons & StandardButton.Yes
}
我还尝试手动添加条目Yes
和No
,但这似乎没有帮助。
我发现issue on stackoverflow谈到将qml文件添加到.pro
文件以使其正常工作,这就是我已经做过的事情。我虽然想添加内置MessageDialog
,但我不知道如何做到这一点。
作为最后一点:我知道在Qt 5.3中,qsTr
不在MessageDialog
。但是从Qt 5.4开始他们是。我目前正在使用Qt 5.5
非常感谢任何帮助。
发布后,我一直在寻找并找到了interesting post有同样问题的人。不幸的是,那里没有答案。
谢谢tynn的回复。我尝试了两种建议但没有成功。我也尝试过别的东西。我在我的代码中添加了一个qDebug,看它是否会翻译。我希望同样的翻译将用于MessageDialog
,但不幸的是,情况似乎并非如此。
qDebug() << "Translate yes :" << tr("Yes"); //translates correctly, dialog doesn't
我还尝试从头开始构建一个与内置messagedialog相同的对话框,但目前我对qml的了解太有限了,无法实现这一点。
答案 0 :(得分:0)
您需要的翻译应在qtquickcontrols_*.qm
文件中找到。 Deploying Translations有关此事的国家
通常,应用程序有.qm文件,如果使用的是未安装在系统上的Qt版本,则还需要部署Qt的.qm文件。
但是,您的应用程序可能无法找到合适的翻译文件。如果您只需要Yes
和No
的翻译,您也可以将这些内容添加到翻译文件中,其上下文为DefaultMessageDialog
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1">
<context>
<name>DefaultMessageDialog</name>
<message>
<source>Yes</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>No</source>
<translation type="unfinished"></translation>
</message>
</context>
</TS>
添加内置的MessageDialog也可以。或者,如果您愿意,可以使用虚拟文件DefaultMessageDialog.qml
Rectangle {
Button {
id: yesButton
text: qsTr("Yes")
}
Button {
id: noButton
text: qsTr("No")
}
}
并添加此代码。
答案 1 :(得分:0)
嗯,可能有点棘手。
首先,Qt小部件的本地化字符串可能位于Qt的.qm文件中。请记住,一般而言,您需要将所有Qt的.qm文件用于转换成的语言环境。这是因为,例如,Qt可能会在可用的平台上使用本机MessageDialogs,并且这种情况下的相关代码将位于qtbase中,因此对于选定的语言环境,不仅需要qtquickcontrols_XX.qm文件,而且还需要qtbase_XX.qm文件。依此类推。
但是,在某些情况下上述方法可能无济于事。 Qt的本地化文件中可能缺少所需的字符串(这是很常见的),因此您需要自己为这些字符串制作.ts和.qm文件。在这种情况下,您将需要研究Qt源,以了解您感兴趣的那些小部件的内部。
请注意,以下示例取决于实施细节,在将来的Qt版本中可能会更改。
例如,用于Android和iOS的QML MessageDialog的Qt实现使用QPlatformTheme,可以进一步将其子类化以用于不同的平台。在QPlatformTheme中,默认情况下,按钮标签的文本由defaultStandardButtonText()方法返回:
QString QPlatformTheme::defaultStandardButtonText(int button)
{
switch (button) {
case QPlatformDialogHelper::Ok:
return QCoreApplication::translate("QPlatformTheme", "OK");
case QPlatformDialogHelper::Save:
return QCoreApplication::translate("QPlatformTheme", "Save");
case QPlatformDialogHelper::SaveAll:
return QCoreApplication::translate("QPlatformTheme", "Save All");
case QPlatformDialogHelper::Open:
return QCoreApplication::translate("QPlatformTheme", "Open");
case QPlatformDialogHelper::Yes:
return QCoreApplication::translate("QPlatformTheme", "&Yes");
case QPlatformDialogHelper::YesToAll:
return QCoreApplication::translate("QPlatformTheme", "Yes to &All");
case QPlatformDialogHelper::No:
return QCoreApplication::translate("QPlatformTheme", "&No");
case QPlatformDialogHelper::NoToAll:
return QCoreApplication::translate("QPlatformTheme", "N&o to All");
case QPlatformDialogHelper::Abort:
return QCoreApplication::translate("QPlatformTheme", "Abort");
case QPlatformDialogHelper::Retry:
return QCoreApplication::translate("QPlatformTheme", "Retry");
case QPlatformDialogHelper::Ignore:
return QCoreApplication::translate("QPlatformTheme", "Ignore");
case QPlatformDialogHelper::Close:
return QCoreApplication::translate("QPlatformTheme", "Close");
case QPlatformDialogHelper::Cancel:
return QCoreApplication::translate("QPlatformTheme", "Cancel");
case QPlatformDialogHelper::Discard:
return QCoreApplication::translate("QPlatformTheme", "Discard");
case QPlatformDialogHelper::Help:
return QCoreApplication::translate("QPlatformTheme", "Help");
case QPlatformDialogHelper::Apply:
return QCoreApplication::translate("QPlatformTheme", "Apply");
case QPlatformDialogHelper::Reset:
return QCoreApplication::translate("QPlatformTheme", "Reset");
case QPlatformDialogHelper::RestoreDefaults:
return QCoreApplication::translate("QPlatformTheme", "Restore Defaults");
default:
break;
}
return QString();
}
因此,为了本地化“是/否”按钮,您需要在.ts文件中添加以下内容:
<context>
<name>QPlatformTheme</name>
<message>
<source>&Yes</source>
<translation>[...]</translation>
</message>
<message>
<source>&No</source>
<translation>[...]</translation>
</message>
</context>
Android有其自己的子类平台主题(QAndroidPlatformTheme),带有重写的defaultStandardButtonText(),因此对于Android,您需要添加以下内容:
<context>
<name>QAndroidPlatformTheme</name>
<message>
<source>Yes</source>
<translation>[...]</translation>
</message>
<message>
<source>No</source>
<translation>[...]</translation>
</message>
</context>
iOS不会在其自己的QPlatformTheme子类中重写此方法,因此不需要其他操作。
您可以看看one of my projects,它使用上述技术在Android和iOS上进行QML MessageBox本地化。
答案 2 :(得分:0)
在Windows,macOS和Linux等台式机平台上,QtQuick.Dialogs中的大多数Dialog组件都使用C ++小部件组件。它们的源翻译在qtbase_{lang}.ts
文件中,而编译后的翻译在qtbase_{lang}.qm
文件中。
在Qt5.13.1中:
C:\Qt\Qt5.13.1\5.13.1\Src\qttranslations\translations
进行源翻译C:\Qt\Qt5.13.1\5.13.1\mingw83_64\translations
如果发现qtbase的大小对于您的喜好太大,则可以部署翻译文件的缩小版本。以下Windows Batch文件创建了qtbase文件的法语,德语和日语子集:
setlocal
set QTDIR=C:\Qt\Qt5.13.1\5.13.1\msvc2017_64\
set QTSRC=C:\Qt\Qt5.13.1\5.13.1\Src
ECHO %QTSRC%\qtbase\src\widgets\dialogs\qmessagebox.cpp > %TEMP%\qtbase_min.lst
ECHO %QTSRC%\qtbase\src\widgets\dialogs\qfiledialog.cpp >> %TEMP%\qtbase_min.lst
ECHO %QTSRC%\qtbase\src\widgets\dialogs\qcolordialog.cpp >> %TEMP%\qtbase_min.lst
ECHO %QTSRC%\qtbase\src\widgets\dialogs\qfontdialog.cpp >> %TEMP%\qtbase_min.lst
ECHO %QTSRC%\qtbase\src\widgets\dialogs\qinputdialog.cpp >> %TEMP%\qtbase_min.lst
ECHO %QTSRC%\qtbase\src\widgets\dialogs\qprogressdialog.cpp >> %TEMP%\qtbase_min.lst
ECHO %QTSRC%\qtbase\src\widgets\dialogs\qwizard.cpp >> %TEMP%\qtbase_min.lst
ECHO %QTSRC%\qtbase\src\gui\kernel\qplatformtheme.cpp >> %TEMP%\qtbase_min.lst
ECHO %QTSRC%\qtbase\src\plugins\platforms\android\qandroidplatformtheme.cpp >> %TEMP%\qtbase_min.lst
ECHO %QTSRC%\qtbase\src\platformsupport\themes\genericunix\qgenericunixthemes.cpp >> %TEMP%\qtbase_min.lst
for /d %%F in (fr de ja en) do copy %QTSRC%\qttranslations\translations\qtbase_%%F.ts qtbase_min_%%F.ts
%QTDIR%\bin\lupdate @%TEMP%/qtbase_min.lst -pluralonly -locations none -ts qtbase_min_en.ts
for /d %%F in (fr de ja en) do if "%%F" neq "en" %QTDIR%\bin\lupdate.exe @%TEMP%/qtbase_min.lst -no-obsolete -locations none -ts qtbase_min_%%F.ts
for /d %%F in (fr de ja en) do %QTDIR%\bin\lrelease qtbase_min_%%F.ts
在移动平台上,例如iOS和Android,在qtbase_{lang}.ts
文件中仍覆盖Dialog MessageDialog组件的可翻译文本。对于其他组件,例如ColorDialog,FontDialog,它们在QML中作为QtQuick组件实现。翻译将在qtquickcontrols_{lang}.ts
和qtquickcontrols_{lang}.qm
文件中找到。
以下内容演示了如何为法语,德语和日语创建qtquickcontrols_{lang}.ts
和qtquickcontrols_{lang}.qm
文件的缩小版本:
setlocal
set QTDIR=C:\Qt\Qt5.13.1\5.13.1\msvc2017_64\
set QTSRC=C:\Qt\Qt5.13.1\5.13.1\Src
ECHO %QTSRC%\qtquickcontrols\src\dialogs\DefaultMessageDialog.qml > %TEMP%\qtquickcontrols_min.lst
ECHO %QTSRC%\qtquickcontrols\src\dialogs\DefaultColorDialog.qml >> %TEMP%\qtquickcontrols_min.lst
ECHO %QTSRC%\qtquickcontrols\src\dialogs\DefaultFileDialog.qml >> %TEMP%\qtquickcontrols_min.lst
ECHO %QTSRC%\qtquickcontrols\src\dialogs\DefaultFontDialog.qml >> %TEMP%\qtquickcontrols_min.lst
ECHO %QTSRC%\qtquickcontrols\src\dialogs\DefaultDialogWrapper.qml >> %TEMP%\qtquickcontrols_min.lst
for /d %%F in (fr de ja en) do copy %QTSRC%\qttranslations\translations\qtquickcontrols_%%F.ts qtquickcontrols_min_%%F.ts
%QTDIR%\bin\lupdate @%TEMP%/qtquickcontrols_min.lst -pluralonly -locations none -ts qtquickcontrols_min_en.ts
for /d %%F in (fr de ja en) do if "%%F" neq "en" %QTDIR%\bin\lupdate.exe @%TEMP%/qtquickcontrols_min.lst -no-obsolete -locations none -ts qtquickcontrols_min_%%F.ts
for /d %%F in (fr de ja en) do %QTDIR%\bin\lrelease qtquickcontrols_min_%%F.ts
目前,在Qt5.13.1,有22种语言(包括英语)。如果此列表中未包含您所需的语言(例如,印度尼西亚语,越南语),则仍可以使用上述脚本来创建占位符缩小的qtbase / qtquickcontrols版本,但您必须自己填充qtbase_min_{lang}.ts
文件。