如果我们在tr()中包装字符串,我们可以使用语言学家来翻译qt应用程序。以下示例是动态加载语言的一种方法:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QTranslator translator;
translator.load("hellotr_la");
app.installTranslator(&translator);
QPushButton hello(QPushButton::tr("Hello world!"));
hello.resize(100, 30);
hello.show();
return app.exec();
}
我想要做的是根据用户偏好翻译成不同的语言。原因是我有一台服务器需要处理具有不同语言的客户端请求。通过每个请求的事件使整个服务器/进程更改语言感觉不对。因此,我对dynamic translation对QEvent::LanguageChange
的反应不感兴趣。
因此,我感兴趣的是QCoreApplication::installTranslator()
的以下文档可以安装多个翻译文件。按照安装它们的相反顺序搜索翻译,因此首先搜索最近安装的翻译文件,最后搜索安装的第一个翻译文件。只要找到包含匹配字符串的翻译,搜索就会停止。
因此,似乎可以加载多种语言,但我担心的是,如果我有多种语言,我无法指定哪种语言是首选语言。如果我必须在代码中表达我想要的东西是这样的:
QString MyApplicationServer::OnHandleRequest(MyRequest &r)
{
//Get the language for this specific request
//For example language can be “hellotr_la” or “hellotr_fr”
// Or another way: "lat", "fra", "enu", "esn" ...
QString language = getLanguageForRequest(r);
//How do I dynamically use language or translate to language?
// This would be the preferred solution.
return tr("Not Implemented", language);
}
如果我必须使用一些自定义宏,那么就这样吧!
编辑:基本上我想了解翻译人员的特定翻译字符串。
答案 0 :(得分:7)
您不必使用提供的tr
便利功能,也不必安装翻译器。只需查看QTranslator
的API,您就会看到可以直接致电translate
。如果你走这条路线,你可以简单地找到一个翻译地图,并根据需要查找文本。
如果您必须使用tr
,则必须构建自定义翻译器。然后,您的自定义翻译人员可以维护翻译人员的地图,并使用请求变量来确定使用哪个翻译人员。
如果您的服务器一次只处理一个请求,那么说明当前语言的简单全局变量就可以了。
现在,如果您的服务器在线程中处理多个请求,您还需要做更多工作,但不多。在这种情况下,您将语言首选项存储在本地线程中,安装的转换程序将使用该本地线程来确定要执行的后备转换程序。