【问题标题】:Dynamic Qt string translation动态 Qt 字符串翻译
【发布时间】: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 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);
}

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

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

【问题讨论】:

  • 处理语言更改事件有什么问题?
  • 这是一个处理多个请求的服务器进程。如果我真的想找个借口,我可以说我正在使用多个线程;)。从技术上讲,当只需要翻译一段字符串时,通过所有对象传播 QEvent 似乎是一种矫枉过正的做法。想象一下,如果我要将OnHandleRequest中的两个字符串翻译成两种不同的语言

标签: c++ qt qt4 translation


【解决方案1】:

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

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

现在,如果您的服务器在线程中处理多个请求,您还有更多工作要做,但不会太多。在这种情况下,您会将您的语言首选项存储在本地线程中,并且安装的翻译器将使用该本地线程来确定要执行哪个支持翻译器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    相关资源
    最近更新 更多