【发布时间】:2011-08-02 03:03:37
【问题描述】:
如果我们在 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);
}
如果我必须使用一些自定义宏,那就这样吧!
编辑:基本上我想从翻译人员那里得到一个特定的翻译字符串。
【问题讨论】:
-
处理语言更改事件有什么问题?
-
这是一个处理多个请求的服务器进程。如果我真的想找个借口,我可以说我正在使用多个线程;)。从技术上讲,当只需要翻译一段字符串时,通过所有对象传播 QEvent 似乎是一种矫枉过正的做法。想象一下,如果我要将
OnHandleRequest中的两个字符串翻译成两种不同的语言
标签: c++ qt qt4 translation