翻译枚举值的字符串表示Qt

时间:2016-12-21 19:05:36

标签: c++ qt enums translation

是否可以使用Qt的翻译系统翻译enum的字符串表示(即通过QMetaEnum)?

我认为我需要的是某种方式让lupdate获取用于翻译的枚举字符串,或者通过发出一些QT_TR_NOOP()代码,当且仅当该文件由lupdate处理时,或者通过修改lupdate / moc本身的行为。

例如,我的应用程序提供"设置"通过对话框向用户提供的选项。所有设置都定义为Q_PROPERTY' s。使用enum的选项显示为组合框,组合框的文本选项使用QMetaEnum::key()作为显示的文本。下面是一些伪代码来解决这个问题。

小部件将定义一些enum属性,如:

class SomeWidget : public QWidget
{
    Q_OBJECT
    Q_ENUMS( Configuration );

    enum Configuration
    {
        Config_Blue = 0,
        Config_Green,
        Config_Invisible,
        Config_Backwards
    };

    Q_PROPERTY( Configuration READ Configuration WRITE SetConfiguration );
};

组合小部件创建由单独的设置管理器完成,如下所示:

QWidget* SettingsItem::CreateWidget()
{
    const QMetaObject* pMetaObj = this->m_pWidget->metaObject();
    const QMetaProperty& rcProp = pMetaObj->property( this->m_iProp );

    QMetaEnum cEnum = rcProp.enumerator();
    if( cEnum.isValid() )
    {
        QComboBox* pRetWidget = new QComboBox;
        for( int i = 0; i < cEnum.keyCount(); ++i )
        {
            int iVal = cEnum.value( i );
            QString strKey = cEnum.key( i );  // Translate here?
            pRetWidget->addItem( strKey, iVal );
        }
    } 

    ...
    return pRetWidget;
}

设置对话框中的组合框显示&#34; Config_Blue&#34;,&#34; Config_Green&#34;等等。我希望它只是说&#34; Blue&#34;,&#34 ;绿色&#34;等等,无论当前的语言是什么。

对于其余代码,我们使用Qt的翻译系统和linguist实用程序,它非常好用。我希望我也可以为enum启用此类翻译,而无需手动将字符串文字和tr()添加到代码中。基本上,翻译人员需要的所有信息都已经存在于代码中,我只需linguist就可以将这些枚举值标识为可翻译。然后,我可以在填充组合框时调用tr()

我认为我需要的是某种方式让lupdate获取用于翻译的枚举字符串,或者通过发出一些QT_TR_NOOP()代码,当且仅当该文件由lupdate处理时,或者通过修改lupdate / moc本身的行为。

我在想也许宏会起作用,但可能不可能。也许修改一些Qt代码是必要的吗?

2 个答案:

答案 0 :(得分:2)

枚举标识符不应该是用户可见的。这些是对开发人员而不是对用户有意义的标识符。将它们直接暴露给用户会在代码的内部设计和用户可见行为之间增加强大的耦合。最好避免这种情况。

您需要在枚举值和用户可见字符串之间进行映射。地图中的值应该进行翻译,并且应该在重新翻译时重新填充地图。 E.g:

class Object : public QObject
{
    Q_OBJECT
    Q_ENUMS(Configuration);
    Q_PROPERTY(Configuration READ Configuration WRITE SetConfiguration);

    enum Configuration {
        Config_Blue, Config_Green, Config_Invisible, Config_Backwards
    };
public:
    static QString toString(Configuration c) {
      switch (c) {
      case Config_Blue: return tr("Blue", "Configuration");
      case Config_Green: return tr("Green", "Configuration");
      case Config_Invisible: return tr("Invisible", "Configuration");
      case Config_Backwards: return tr("Backwards", "Configuration");
      }
    }
};

您现在可以翻译配置值。

答案 1 :(得分:1)

我在定义枚举的类中使用专用函数。有帮助吗? (Qt5.13)。

我称它为MyClass :: toTrString(myEnumVal);

class MyClass : public QObject
{
    Q_OBJECT
public:
    explicit MyClass(QObject *parent = nullptr);
    enum MyEnum {
            myKey1,
            myKey2,
            ...
    };
    Q_ENUM(MyEnum)
    static QString toTrString(MyEnum t) {
        return tr(qPrintable(QVariant::fromValue(t).toString()));
    }
}