Направление макета для арабского языка не определяется на основе локали (Mac и Linux)

Кому-либо удалось иметь корректное направление макета (слева направо и справа налево) быть выведенным из настроек языка пользователя?

Я испытываю затруднения при локализовывании моего приложения на арабский язык (Саудовская Аравия) локаль. Обнаружение текущей локали, и загрузка и установка соответствующего 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 ни для какого виджета. При выполнении на английской локали (Соединенных Штатов) окно похоже на это:

English screenshot showing left-to-right layout, proper translation, and image of arrow pointing to the right

и при выполнении на арабском языке (Саудовская Аравия) локаль это похоже на это:

Arabic screenshot showing wrong left-to-right layout, proper translation, and image of arrow pointing to the right

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

Примечание. Так как я не знаю арабский язык, текст в качестве примера переводится из 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" будет переведена, приложение автоматически обнаружит свое направление макета, и все работает просто великолепно:

Correct arabic layout on Linux

5
задан andref 19 May 2019 в 15:02
поделиться