Направление расположения для арабского языка не определяется в зависимости от локали (Mac и Linux) - PullRequest
5 голосов
/ 29 июля 2010

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

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

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.Я извиняюсь, если это неверно.

Решение

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

Correct arabic layout on Linux

Ответы [ 2 ]

8 голосов
/ 02 августа 2010

Насколько я знаю, направление компоновки должно быть задано явно в Qt.

Я знаю, что приложение GTK делает это автоматически, а qt - нет, и это хорошо .

Я объясняю. Предположим, что у вас есть непереведенное приложение, запущенное на арабском или иврите, что происходит со всем макетом, отображаемым справа налево, и все выглядит безобразно и неестественно с английскими строчками RTL. Подумайте о непереведенной IDE с разметкой RTL.

Хитрость в том, чтобы сделать это правильно, состоит в том, чтобы определить специальный ключ перевода, поэтому оригинальный ключ имеет значение LTR, и только в переведенных приложениях на арабский, парижский или иврит он переводится в RTL.

Так что лучше всего было бы что-то вроде этого:

a.setLayoutDirection(tr("LTR")=="RTL" ? Qt::RightToLeft : Qt::LeftToRight)

А затем направление, явно определенное в файле перевода.

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

0 голосов
/ 30 июля 2010

Имеет ли значение порядок ... например, работает ли это:

<qresource prefix="/" lang="ar">
    <file alias="layoutDirection.qm">translations/layoutDirection_ar.qm</file>
    <file alias="arrow.png">images/arrow-rtl.png</file>
</qresource>

вместо:

<qresource prefix="/" lang="ar">
    <file alias="arrow.png">images/arrow-rtl.png</file>
    <file alias="layoutDirection.qm">translations/layoutDirection_ar.qm</file>
</qresource>
...