如何强制Qlocale ::系统更改
How to force QLocale::system to change
我需要经常测试我的应用程序翻译到非英语语言,这对于更改整个操作系统语言而只是为了进行此简单检查是非常不舒服的。例如,如何使用环境变量更改QT检测的系统语言?或使用命令行参数。
我尝试更改LANG
,LANGUAGE
环境变量,但没有效果。但是,在Gnome下,它具有!
upd:我正在使用这样的代码来确定系统语言环境并加载适当的翻译:
QTranslator app_translator;
if (!app_translator.load ("app_" + QLocale::system ().name (), app_tr_dir))
qWarning ("Can't load app translator file for locale %s from %s", qPrintable (QLocale::system ().name ()), app_tr_dir.toLocal8Bit().data());
else
app.installTranslator (&app_translator);
P.S。我的操作系统是Kubuntu 13.10,QT版本为4.8。
您始终可以通过qlocale :: setDefault()方法更改语言环境。这是一个项目的一个示例:
void Language::setCurrentLanguage(Language::Languages language)
{
if (language == Language::Arabic) {
QLocale l(QLocale::Arabic, QLocale::SaudiArabia);
QLocale::setDefault(l);
dynamic_cast<MangoApp*>(qApp)->setLayoutDirection(Qt::RightToLeft);
dynamic_cast<MangoApp*>(qApp)->removeAllTranslator();
dynamic_cast<MangoApp*>(qApp)->loadQtTranslator();
dynamic_cast<MangoApp*>(qApp)->loadMangoTranslator();
} else {
QLocale l(QLocale::English, QLocale::UnitedStates);
QLocale::setDefault(l);
dynamic_cast<MangoApp*>(qApp)->setLayoutDirection(Qt::LeftToRight);
dynamic_cast<MangoApp*>(qApp)->removeAllTranslator();
}
}
用于测试您可以使用类似的东西(仅正确的主函数):
int main(int argc, char **argv) {
QApplication app(argc, argv);
QLocale localeUsedToDeterminateTranslators = QLocale::system();
Q_FOREACH(QString a, app.arguments()) {
const static localeParam = "-locale:";
if (a.startsWith(localeParam)) {
localeUsedToDeterminateTranslators = QLocale(a.mid(sizeof(localeParam)-1));
break;
}
}
... // your normal code
然后,当您运行应用程序时,您可以使用额外的参数运行它:./yourAppName -locale:nl
。有关可能的值,请参见Qlocale的文档。
编辑:我找到了更好的方法,有一种方法
QLocale::setDefault
,因此应该更好地工作:
int main(int argc, char **argv) {
QApplication app(argc, argv);
Q_FOREACH(QString a, app.arguments()) {
const static localeParam = "-locale:";
if (a.startsWith(localeParam)) {
QLocale::setDefault(QLocale(a.mid(sizeof(localeParam)-1)));
break;
}
}
...
QTranslator app_translator;
if (!app_translator.load ("app_" + QLocale().name (), app_tr_dir))
qWarning ("Can't load app translator file for locale %s from %s", qPrintable (QLocale().name()), app_tr_dir.toLocal8Bit().data());
else
app.installTranslator (&app_translator);
使用 LANGUAGE
( LANG
)环境变量绝对应更改 QLocale::system().name()
返回的值,因为此环境变量比所有其他方法都优先于定义应用程序消息区域(详细信息)。
我在lubuntu 19.10下用QT 5.12(表示使用LXQT桌面)对其进行了测试,并且可以使用。命令是:
LANGUAGE=de ./application
如果在kubuntu下确实不起作用,则应将其报告为错误,因为那时Kubuntu正在干扰应用程序的方式。
相关文章:
- C++,系统无法执行指定的程序
- 在UNIX系统中使用DIR查找文件的字节大小
- 错误处理.将系统错误代码映射到泛型
- 当系统的卷被修改时,如何修改WASAPI环回捕获卷
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 在C++游戏中与库存系统作斗争
- 文件系统:复制功能的速度秘诀是什么
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 在gtest.中使用fff.h模拟系统API
- 如何制作无限制照明系统
- 系统.将数组移交给c#中动态加载的c++DLL时发生AccessViolationException
- 如何传递多个 std::文件系统选项?
- 遍历顺序由 std::文件系统directory_iterator给出
- C++系统找不到指定的文件错误
- 系统参数信息A 与 SPI_GETMOUSE 返回 0
- libstdc++ 文件系统中未初始化的用法?
- 如何在ECS框架中更新组件数据和通知系统
- boost::文件系统::recursive_directory_iterator多线程安全
- 如果整个应用程序是虚拟映射的,为什么 new 会进行系统调用?
- 如何强制Qlocale ::系统更改