Кому-либо удалось иметь корректное направление макета (слева направо и справа налево) быть выведенным из настроек языка пользователя?
Я испытываю затруднения при локализовывании моего приложения на арабский язык (Саудовская Аравия) локаль. Обнаружение текущей локали, и загрузка и установка соответствующего QTranslators оба хорошо работают. (Текст выглядит большим на Linux!) Проблема, которую я имею, - то, что глобальное направление макета не выводится из системной локали.
Документация для QApplication:: состояния layoutDirection (с моими выделениями):
Это свойство содержит направление раскладки по умолчанию для этого приложения. На системном запуске направление раскладки по умолчанию зависит от языка приложения.
Это не то, что происходит, однако: расположение установлено на QT:: LeftToRight независимо от системной локали. Я сделал тестовую программу, которая отображает проблему. Это - основная функция:
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTranslator translator;
translator.load(":/layoutDirection.qm");
a.installTranslator(&translator);
Window w;
w.show();
return a.exec();
}
Это также имеет файл ресурсов, содержащий необходимые изображения и файлы перевода. Это определяется как это:
images/arrow-rtl.png
translations/layoutDirection_ar.qm
images/arrow-ltr.png
translations/layoutDirection_en.qm
Исходный код класса Окна тривиален, и соответствующий .ui файл не устанавливает layoutDirection ни для какого виджета. При выполнении на английской локали (Соединенных Штатов) окно похоже на это:
и при выполнении на арабском языке (Саудовская Аравия) локаль это похоже на это:
Как Вы видите, перевод строк корректен и изображение точек стрелки направо, означая, что корректные ресурсы были загружены. Направление макета является неправильным: это должно зеркально отразить английское расположение.
Примечание. Так как я не знаю арабский язык, текст в качестве примера переводится из Google. Я приношу извинения, если это неправильно.
Ответ Artyom корректен и в конечном счете привел меня к обнаружению, как Виджеты верхнего уровня определяют свое направление макета от экземпляра QApplication. Интернационализация со спокойным руководством говорит:
Сам QT содержит несколько тысяч строк, которые должны будут также быть переведены на языки, для которых Вы нацелены. Вы найдете много файлов перевода в qttranslations репозитории.
Код QApplication имеет интересный метод, также:
static bool qt_detectRTLLanguage()
{
return force_reverse ^
(QGuiApplication::tr("QT_LAYOUT_DIRECTION",
"Translate this string to the string 'LTR' in left-to-right"
" languages or to 'RTL' in right-to-left languages (such as Hebrew"
" and Arabic) to get proper widget layout.") == QLatin1String("RTL"));
}
Когда строка "QT_LAYOUT_DIRECTION" будет переведена, приложение автоматически обнаружит свое направление макета, и все работает просто великолепно: