【发布时间】:2017-05-07 07:28:57
【问题描述】:
是否可以使用 Qt 的翻译系统翻译 enum 的字符串表示形式(即通过 QMetaEnum)?
我认为我需要的是某种方式让lupdate 获取枚举字符串进行翻译,或者通过发出一些 QT_TR_NOOP() 代码当且仅当文件正在由 lupdate 处理时,或者通过修改lupdate/moc 自己的行为。
例如,我的应用程序通过对话框向用户显示“设置”选项。所有设置都定义为Q_PROPERTY。使用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;
}
设置对话框中的组合框显示“Config_Blue”、“Config_Green”等。我希望它只用当前语言显示“Blue”、“Green”等。
对于其余的代码,我们使用 Qt 的翻译系统和 linguist 实用程序,效果非常好。我希望我也可以为 enum 启用这种类型的翻译,而无需手动将字符串文字和 tr() 添加到代码中。基本上,翻译器需要的所有信息都已经存在于代码中,我只需要linguist 就能够将这些枚举值识别为可翻译的。然后我可以在组合框被填充时调用tr()。
我认为我需要的是某种方式让lupdate 获取枚举字符串进行翻译,或者通过发出一些 QT_TR_NOOP() 代码当且仅当文件正在由 lupdate 处理时,或者通过修改lupdate/moc 自己的行为。
我在想也许宏会起作用,但可能不可能。也许需要修改一些 Qt 代码?
【问题讨论】:
-
我最初想写一个回复,但我自己读到了:kalebpederson.com/index.php/2010/07/…
-
这似乎只是描述了如何使用 QMetaEnum 将键值作为字符串获取。我相信这就是我已经在做的事情。我想我真正需要的是让 lupdate 拾取这些枚举字符串,以便可以翻译它们。也许我会修改我的问题以使其更清楚。
标签: c++ qt enums translation