Динамический перевод строки Qt - PullRequest
9 голосов
/ 09 апреля 2011

Если мы заключаем строки в 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();
 }

То, что я хотел бы сделать, - это переводить на разные языки в зависимости от предпочтений пользователя. Причина в том, что у меня есть сервер, который должен обрабатывать клиентские запросы на разных языках. Иметь язык всего сервера / процесса с помощью событий на запрос не кажется правильным. Таким образом, меня не интересует динамический перевод , реагирующий на 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);
}

Если мне нужно использовать некоторые собственные макросы, то да будет так!

Редактировать: В основном я хотел бы получить от переводчиков конкретную переведенную строку.

1 Ответ

7 голосов
/ 09 апреля 2011

Вам не нужно использовать предоставляемые tr удобные функции, а также не нужно устанавливать переводчики.Просто посмотрите на API для QTranslator, и вы увидите, что вы можете позвонить translate напрямую.Если вы идете по этому пути, вы можете просто иметь карту переводчиков и искать текст по мере необходимости.

Если вы должны использовать tr, то вам нужно создать собственный переводчик.Ваш пользовательский переводчик может затем поддерживать карту переводчиков и использовать переменную запроса, чтобы определить, какой из них использовать.Если ваш сервер обрабатывает только один запрос за раз, тогда подойдет простая глобальная переменная с указанием текущего языка.

Теперь, если ваш сервер обрабатывает несколько запросов в потоках, у вас есть немного больше работы, но немного.В этом случае вы сохраните свои языковые предпочтения в локальном потоке, и установленный переводчик будет использовать этот локальный поток, чтобы определить, какой вспомогательный переводчик делать.

...