如何翻译默认的qsTr字段 - 例如MessageDialog是/否按钮

时间:2015-07-30 14:06:34

标签: qt qml qtquick2 qt5.5

我有一个使用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
}

我还尝试手动添加条目YesNo,但这似乎没有帮助。

我发现issue on stackoverflow谈到将qml文件添加到.pro文件以使其正常工作,这就是我已经做过的事情。我虽然想添加内置MessageDialog,但我不知道如何做到这一点。

作为最后一点:我知道在Qt 5.3中,qsTr不在MessageDialog。但是从Qt 5.4开始他们是。我目前正在使用Qt 5.5

非常感谢任何帮助。

修改

发布后,我一直在寻找并找到了interesting post有同样问题的人。不幸的是,那里没有答案。

编辑2

谢谢tynn的回复。我尝试了两种建议但没有成功。我也尝试过别的东西。我在我的代码中添加了一个qDebug,看它是否会翻译。我希望同样的翻译将用于MessageDialog,但不幸的是,情况似乎并非如此。

qDebug() << "Translate yes :" << tr("Yes"); //translates correctly, dialog doesn't

我还尝试从头开始构建一个与内置messagedialog相同的对话框,但目前我对qml的了解太有限了,无法实现这一点。

3 个答案:

答案 0 :(得分:0)

您需要的翻译应在qtquickcontrols_*.qm文件中找到。 Deploying Translations有关此事的国家

  

通常,应用程序有.qm文件,如果使用的是未安装在系统上的Qt版本,则还需要部署Qt的.qm文件。

但是,您的应用程序可能无法找到合适的翻译文件。如果您只需要YesNo的翻译,您也可以将这些内容添加到翻译文件中,其上下文为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>&amp;Yes</source>
        <translation>[...]</translation>
    </message>
    <message>
        <source>&amp;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}.tsqtquickcontrols_{lang}.qm文件中找到。

以下内容演示了如何为法语,德语和日语创建qtquickcontrols_{lang}.tsqtquickcontrols_{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文件。