Динамический перевод строк Qt

если мы обернем строки в 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);
}

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

Edit: в принципе я хотел бы получить мои руки на специфическая переведенная строка от переводчиков.

1 ответов


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

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

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