动态Qt字符串翻译

时间:2011-04-09 15:14:42

标签: c++ qt qt4 translation

如果我们在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 translationQEvent::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);
}

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

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

1 个答案:

答案 0 :(得分:7)

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

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

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