c++ - 动态 Qt 字符串翻译

标签 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 translation 不感兴趣对 QEvent::LanguageChange 使用react。

因此,我感兴趣的一件事是 QCoreApplication::installTranslator() 的以下文档

Multiple translation files can be installed. Translations are searched for in the reverse order in which they were installed, so the most recently installed translation file is searched first and the first translation file installed is searched last. The search stops as soon as a translation containing a matching string is found.

因此,加载多种语言似乎是可能的,但我担心的是,如果我有多种语言,我无法指定哪一种语言是首选语言。如果我必须用代码表达我想要的是这样的:

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);
}

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

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

最佳答案

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

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

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

关于c++ - 动态 Qt 字符串翻译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5605845/

相关文章:

qt - 如何使 Qt 图标(在菜单栏和工具栏中)变大?

python - 如何正确地子类化 QApplication?

c++ - 如何使用 Opengl 加载和显示纹理

c++ - gcc 不会编译 C++ 代码

c# - 更新其中一个相同型号网络适配器的驱动程序

c++ - Qt 的小数像素大小

c++ - 为什么有内联函数声明而不是内联函数调用?

c++ - Boost 和 Qt 库中有哪些 namespace 标识符?

c++ - 如何从 Qt4 MVC 切换到 Gtk MVC?

c++ - 将 QImage 保存到 QBuffer