Кому-нибудь удалось определить правильное направление компоновки (слева направо и справа налево) из настроек языка пользователя?
У меня проблемы с локализацией приложения на арабском языке (Саудовская Аравия).Обнаружение текущей локали, загрузка и установка соответствующих 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();
}
Также имеется файл ресурсов, содержащий необходимые изображения и файлы перевода.Он определяется следующим образом:
<RCC>
<!-- Arabic resources. The arrow points to the left. -->
<qresource prefix="/" lang="ar">
<file alias="arrow.png">images/arrow-rtl.png</file>
<file alias="layoutDirection.qm">translations/layoutDirection_ar.qm</file>
</qresource>
<!-- English resources. The arrow points to the right. -->
<qresource prefix="/" lang="en">
<file alias="arrow.png">images/arrow-ltr.png</file>
<file alias="layoutDirection.qm">translations/layoutDirection_en.qm</file>
</qresource>
</RCC>
Исходный код класса Window тривиален, и соответствующий .ui-файл не устанавливает layoutDirection для любого виджета.При запуске на английском языке (США) окно выглядит следующим образом:
и при запуске на арабском языке (Саудовская Аравия),это выглядит так:
Как видите, перевод строк правильный, а изображение стрелки указывает на право, что означаетчто правильные ресурсы были загружены.Направление верстки неправильное: оно должно отражать английскую разметку.
Примечание. Поскольку я не знаю арабский язык, пример текста переведен Google.Я извиняюсь, если это неверно.
Решение
Артём ответ правильный и в конечном итоге привел меня к открытию, как виджеты верхнего уровня определяют направление компоновки из QApplicationпример.Руководство по Интернационализация с Qt гласит:
Сам Qt содержит несколько тысяч строк, которые также необходимо будет перевести на языки, на которые вы ориентируетесь.Вы найдете несколько файлов перевода в репозитории qttranslations.
У QApplication Code также есть интересный метод:
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 "строка переведена, приложение автоматически определит направление компоновки, и все работает просто отлично: