动态 Qt 字符串翻译

9
如果我们在字符串中使用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();
 }

我想做的是根据用户的喜好翻译成不同的语言。原因是我有一个需要处理不同语言客户请求的服务器。通过每个请求的事件来改变整个服务器/进程的语言感觉不太合适。因此,我对动态翻译对的反应不感兴趣。
其中一件让我感兴趣的事情是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);
}

如果我需要使用一些自定义宏,那就这样吧!

编辑:基本上我想从翻译人员那里得到一个特定的翻译字符串。


处理语言更改事件有什么问题吗? - BЈовић
这是一个处理多个请求的服务器进程。如果我真的想要找借口,我可以说我正在使用多个线程;)。从技术上讲,当只需要翻译一个字符串时,通过所有对象传播QEvent似乎有些过度。想象一下,如果我要在OnHandleRequest中将两个字符串翻译成两种不同的语言。 - Derick Schoonbee
1个回答

7
您不必使用提供的tr便利函数,也不必安装翻译器。只需查看QTranslator的API,您就可以直接调用translate。如果您选择这种方法,您可以简单地拥有一个可用的翻译器映射,并根据需要查找文本。
如果您必须使用tr,则必须构建自定义翻译器。您的自定义翻译器可以维护翻译器映射,并使用请求变量来确定要使用哪个翻译器。如果您的服务器一次只处理一个请求,则全局变量表示当前语言将很好。
现在,如果您的服务器以线程处理多个请求,则需要做更多的工作,但不需要太多。在这种情况下,您将在线程本地存储语言首选项,并安装的翻译器将使用该线程本地存储来确定要使用哪个后备翻译器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接