动态Qt字符串翻译

Der*_*bee 9 c++ qt translation qt4

如果我们在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();
 }
Run Code Online (Sandbox Code Playgroud)

我想要做的是根据用户偏好翻译成不同的语言.原因是我有一台服务器需要处理具有不同语言的客户端请求.通过每个请求的事件使整个服务器/进程更改语言感觉不对.因此,我对动态翻译的反应不感兴趣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);
}
Run Code Online (Sandbox Code Playgroud)

如果我必须使用一些自定义宏,那么它就是这样!

编辑:基本上我想了解翻译人员的特定翻译字符串.

edA*_*a-y 7

您不必使用提供的tr便利功能,也不必安装翻译器.只需查看API QTranslator,您就会看到可以translate直接致电.如果你走这条路线,你可以简单地找到一个翻译地图,并根据需要查找文本.

如果必须使用,tr则必须构建自定义转换器.然后,您的自定义翻译人员可以维护翻译人员的地图,并使用请求变量来确定使用哪个翻译人员.如果您的服务器一次只处理一个请求,那么说明当前语言的简单全局变量就可以了.

现在,如果您的服务器处理线程中的多个请求,您还需要做更多工作,但不是很多.在这种情况下,您将语言首选项存储在本地线程中,安装的转换程序将使用该本地线程来确定要执行的后备转换程序.