Динамический перевод строк 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
тогда вам нужно создать пользовательский переводчик. Затем пользовательский переводчик может поддерживать карту переводчиков и использовать переменную запроса для определить, какой из них использовать.
Если ваш сервер обрабатывает только один запрос за раз, то простая глобальная переменная, указывающая текущий язык, будет в порядке.
теперь, если ваш сервер обрабатывает несколько запросов в потоках, у вас есть немного больше работы, но не много. В этом случае вы сохраните свои языковые предпочтения в локальном потоке, и установленный переводчик будет использовать этот локальный поток для определения того, какой резервный переводчик делать.