Международная локализация с Qt
Международная локализация и локализация приложения — это процессы адаптации приложения к различным языкам, региональным особенностям и техническим требованиям целевого рынка. Международная локализация означает проектирование программного приложения таким образом, чтобы его можно было адаптировать к различным языкам и регионам без внесения технических изменений. Локализация означает адаптацию интернационализированного программного обеспечения для конкретного региона или языка путем добавления компонентов, специфичных для локали (например, форматы дат, времени и чисел), и перевода текста.
Соответствующие классы и API Qt
Эти классы поддерживают интернационализацию приложений Qt.
Сравнивает строки в соответствии с алгоритмом сортировки локализированной сортировки |
|
Может использоваться для ускорения сортировки строк |
|
Преобразует числа в их строковые представления на разных языках |
|
Базовый класс для кодирования и декодирования текста |
|
Декодер текста на основе состояния |
|
Кодировщик текста на основе состояния |
|
Преобразования между кодировками текста |
|
Декодер на основе состояния |
|
Кодировщик на основе состояния |
|
Поддержка интернационализации для вывода текста |
Языки и системы письма
В некоторых случаях интернационализация проста, например, для доступа к приложению США австралийскими или британскими пользователями может потребоваться лишь несколько правок. Но для того, чтобы сделать приложение США пригодным для японских пользователей, или корейское приложение — для немецких пользователей, потребуется, чтобы программа работала не только на разных языках, но и использовала различные методы ввода, кодировки символов и соглашения о представлении.
Qt старается максимально упростить интернационализацию для разработчиков. Все элементы управления вводом и методы рисования текста в Qt поддерживают все поддерживаемые языки. Встроенный движок шрифтов способен правильно и привлекательно отображать текст, содержащий символы из различных систем письма одновременно.
Qt поддерживает большинство языков, используемых сегодня, в частности:
- Все восточноазиатские языки (китайский, японский и корейский)
- Все западные языки (использующие латинский алфавит)
- Арабский
- Кириллические языки (русский, украинский и др.)
- Греческий
- Иврит
- Тайский и лаосский
- Все сценарии в Unicode 6.2, которые не требуют специальной обработки
- Бенгальский
- Бирманский (Мьянма)
- Деванагари
- Гуджарати
- Гурмукхи
- Каннада
- Кхмерский
- Малаялам
- Тамильский
- Телугу
- Тибетский
Вышеперечисленный список поддерживается и будет работать на всех платформах, если система имеет установленные шрифты для отображения этих систем письма.
В Windows, Linux и Unix с FontConfig (поддержка шрифтов на стороне клиента) также поддерживаются следующие языки:
- Дивехи (Таана)
- Сирийский
- Н'Ко
В macOS также поддерживаются следующие языки:
- Ориа
- Сингальский
Многие из этих систем письма имеют особые функции:
- Особое поведение перевода строки. Некоторые азиатские языки пишутся без пробелов между словами. Перевод строки может происходить либо после каждого символа (с исключениями), как в китайском, японском и корейском языках, либо после логических границ слов, как в тайском.
- Двунаправленное написание. Арабский и иврит пишутся справа налево, за исключением чисел и встроенного английского текста, который пишется слева направо. Точное поведение определяется в Техническом приложении Unicode #9.
- Непробельные или диакритические знаки (ударения или умлауты в европейских языках). Некоторые языки, такие как вьетнамский, широко используют эти знаки, и некоторые символы могут иметь более одного знака одновременно для уточнения произношения.
- Лигатуры. В особых контекстах некоторые пары символов заменяются комбинированным глифом, образующим лигатуру. Общие примеры — лигатуры fl и fi, используемые в верстке американских и европейских книг.
Qt пытается учесть все вышеперечисленные особенности. Вам обычно не нужно беспокоиться об этих функциях, если вы используете элементы управления вводом Qt (например, QLineEdit, QTextEdit и производные классы или элемент Quick TextInput) и элементы отображения Qt (например, QLabel и элемент Text Qt Quick).
Поддержка этих систем письма прозрачна для программиста и полностью инкапсулирована в текстовый движок Qt. Это означает, что вам обычно не нужно знать ничего о системе письма, используемой на конкретном языке, если только вы не хотите разработать собственные элементы управления вводом текста. В некоторых языках, таких как арабский или языки индийского субконтинента, ширина и форма глифа изменяются в зависимости от окружающих символов. Для учета этого используйте QTextLayout. Для разработки элементов управления вводом текста также необходимо знание используемых сценариев. Обычно проще всего наследовать QLineEdit или QTextEdit.
Дополнительную информацию о том, как интернационализировать исходный код, см. в разделах Написание исходного кода для перевода и Итернационализация и локализация с Qt Quick.
Создание переводов
Qt предоставляет отличную поддержку перевода приложений Qt C++ и Qt Quick на местные языки. Руководители выпусков, переводчики и разработчики могут использовать инструменты перевода Qt для выполнения своих задач.
Инструменты перевода Qt, Qt Linguist, lupdate, и lrelease установлены в подкаталоге bin базового каталога, в который установлен Qt. Дополнительную информацию об их использовании см. в руководстве по Qt Linguist.
В самом Qt содержится несколько тысяч строк, которые также необходимо перевести на целевые языки. Вы найдете ряд файлов переводов в репозитории qttranslations. Прежде чем начать перевод Qt, ознакомьтесь со страницей вики Перевод Qt на другие языки.
Включение перевода
Как правило, функция main() вашего приложения будет выглядеть следующим образом:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QTranslator myappTranslator;
myappTranslator.load(QLocale(), QLatin1String("myapp"), QLatin1String("_"), QLatin1String(":/i18n"));
app.installTranslator(&myappTranslator);
return app.exec();
} Для приложения, поддерживающего перевод, создается объект QTranslator, затем перевод загружается в соответствии с предпочтениями отображения пользовательского интерфейса на основе локали в момент выполнения, и, наконец, объект переводчика устанавливается в приложение.
Поиск переводов Qt
Вы также можете использовать QLibraryInfo::path() для поиска переводов для используемых модулей Qt. Путь к переводам можно запросить во время выполнения, передав QLibraryInfo::TranslationsPath в эту функцию.
Доступные каталоги
Каталоги переводов Qt расположены в репозитории qttranslations.
Предупреждение: Переводы Qt предоставляются сообществом Qt без каких-либо гарантий. Переводы могут отсутствовать, быть устаревшими или полностью некорректными, вплоть до вредоносных. Рекомендуется проверять все переводы, которые вы используете.
Метакаталог qt_ содержит все еще существующие переводы Qt, которые были включены в каталог qt_ в Qt 4. Он был создан для облегчения переноса приложений из Qt 4 в Qt 5. Метакаталог зависит от переводов, которые могут отсутствовать, потому что они относятся к ненужным или устаревшим модулям, что может привести к сбою загрузки переводов. Если вы используете модули, которые являются новыми в Qt 5 или более поздних версиях в вашем приложении, вы должны указать имена каталогов для этих модулей, даже если вы используете метакаталог.
В следующей таблице перечислены каталоги переводов, доступные для модулей и инструментов Qt.
| Модуль или инструмент Qt | Каталог |
|---|---|
| Qt Concurrent | qtbase_ |
| Qt Core | qtbase_ |
| Qt D-Bus | qtbase_ |
| Qt Designer | designer_ |
| Qt GUI | qtbase_ |
| Qt Help | qt_help_ |
| Qt Linguist | linguist_ |
| Qt Network | qtbase_ |
| Qt Print Support | qtbase_ |
| Qt QML | qtdeclarative_ |
| Qt Quick | qtdeclarative_ |
| Qt Quick Controls | qtquickcontrols2_ |
| Qt Quick Widgets | qtdeclarative_ |
| Qt SQL | qtbase_ |
| Qt Widgets | qtbase_ |
Пример: Основные модули Qt
Например, чтобы найти переводы для основных модулей Qt, таких как Qt Core, Qt GUI, Qt Network и Qt Widgets, добавьте следующий код в функцию main():
QTranslator qtTranslator;
qtTranslator.load(QLocale::system(), QStringLiteral("qtbase_"));
app.installTranslator(&qtTranslator); Поддержка кодировок
Класс QTextCodec и возможности класса QTextStream упрощают поддержку многих устаревших кодировок ввода-вывода для данных ваших пользователей. При запуске приложения локаль машины определяет 8-битную кодировку, используемую при работе с внешними 8-битными данными. QTextCodec::codecForLocale() возвращает кодек, который можно использовать для преобразования между этой локальной кодировкой и Unicode.
Приложению иногда могут потребоваться кодировки, отличные от кодировки по умолчанию — локальной 8-битной. Например, приложению в локальной кодировке Кириллица КОИ8-Р (фактический стандарт в России) может потребоваться вывод кириллицы в кодировке ISO 8859-5. Код для этого будет:
QString string = ...; // some Unicode text
QTextCodec *codec = QTextCodec::codecForName("ISO 8859-5");
QByteArray encodedString = codec->fromUnicode(string); Для преобразования Unicode в локальные 8-битные кодировки доступен сокращённый способ: функция QString::toLocal8Bit() возвращает такие 8-битные данные. Ещё один полезный сокращённый способ — QString::toUtf8(), который возвращает текст в 8-битной кодировке UTF-8: это идеально сохраняет информацию Unicode, выглядя как обычный ASCII, если текст целиком состоит из ASCII.
Для преобразования в обратную сторону существуют удобные функции QString::fromUtf8() и QString::fromLocal8Bit(), или общий код, продемонстрированный в этом примере преобразования из кириллицы ISO 8859-5 в Unicode:
QByteArray encodedString = ...; // some ISO 8859-5 encoded text
QTextCodec *codec = QTextCodec::codecForName("ISO 8859-5");
QString string = codec->toUnicode(encodedString); Следует использовать ввод-вывод Unicode, так как это максимизирует переносимость документов между пользователями по всему миру. Однако во многих случаях всё равно необходимо поддерживать другие кодировки, так как вашим пользователям потребуется обрабатывать существующие документы. Самая важная дополнительная кодировка для поддержки — та, которая возвращается функцией QTextCodec::codecForLocale(), поскольку она наиболее вероятна для общения с другими людьми и приложениями (это кодек, используемый local8Bit()).
Qt поддерживает большинство часто используемых кодировок в родном виде. Полный список поддерживаемых кодировок см. в документации к QTextCodec.
В некоторых случаях и для менее распространённых кодировок может потребоваться создание собственного подкласса QTextCodec. В зависимости от срочности, может быть полезно обратиться в техническую поддержку Qt или задать вопрос на форуме qt-interest, чтобы узнать, не работает ли кто-то уже над поддержкой кодировки.
Локализация чисел, дат, времён и валют
Локализация — это процесс адаптации к местным соглашениям, например, представление дат и времён с использованием локальных предпочтительных форматов. Для локализованных чисел, дат, времён и строк валют используйте класс QLocale.
Локализация изображений не рекомендуется. Выбирайте чёткие значки, подходящие для всех локалей, а не полагайтесь на местные каламбуры или растянутые метафоры. Исключение составляют изображения стрелок влево и вправо, которые могут потребоваться перевернуть для арабских и еврейских локалей.
Динамический перевод
Некоторые приложения, такие как Qt Linguist, должны уметь поддерживать изменения настроек языка пользователя во время работы. Чтобы сделать виджеты осознающими изменений установленных объектов QTranslator, переопределите функцию changeEvent() виджета, чтобы проверить, является ли событие событием LanguageChange, и обновить отображаемый текст виджетов, используя функцию tr() обычным способом. Например:
void MyWidget::changeEvent(QEvent *event)
{
if (event->type() == QEvent::LanguageChange) {
titleLabel->setText(tr("Document Title"));
...
okPushButton->setText(tr("&OK"));
} else
QWidget::changeEvent(event);
} Все остальные события изменения должны передаваться путём вызова реализации функции по умолчанию.
Список установленных переводчиков может измениться в ответ на событие LocaleChange, или приложение может предоставить пользовательский интерфейс, позволяющий пользователю изменить текущий язык приложения.
Обработчик событий по умолчанию для подклассов QWidget реагирует на событие QEvent::LanguageChange и вызовет эту функцию при необходимости.
События LanguageChange публикуются при установке нового перевода с помощью функции QCoreApplication::installTranslator(). Кроме того, другие компоненты приложения также могут заставить виджеты обновить себя, опубликовав события LanguageChange для них.
Поддержка системы
Некоторые операционные системы и системы окон, на которых работает Qt, имеют ограниченную поддержку Unicode. Уровень поддержки, доступный в базовой системе, оказывает некоторое влияние на поддержку, которую Qt может предоставить на этих платформах, хотя в общем приложения Qt не должны сильно беспокоиться о платформенно-специфичных ограничениях.
Unix/X11
- Локализованные шрифты и методы ввода. Qt скрывает их и предоставляет ввод-вывод Unicode.
- Конвенции файловой системы, такие как UTF-8, в настоящее время по умолчанию используются в большинстве вариантов Unix. Все функции Qt для работы с файлами поддерживают Unicode, но преобразуют имена файлов в локальную 8-битную кодировку, поскольку это соглашение Unix (см. QFile::setEncodingFunction(), чтобы изучить альтернативные кодировки).
- Ввод-вывод файлов по умолчанию использует локальную 8-битную кодировку с вариантами Unicode в QTextStream.
- В некоторых старых дистрибутивах Unix есть только частичная поддержка некоторых локалей. Например, если у вас есть каталог
/usr/share/locale/ja_JP.EUC, это не обязательно означает, что вы сможете отобразить японский текст; вам также нужны установленные японские шрифты, и каталог/usr/share/locale/ja_JP.EUCдолжен быть полным. Для наилучших результатов используйте полные локали от вашего поставщика системы.
Linux
- Qt предоставляет полную поддержку Unicode, включая методы ввода, шрифты, буфер обмена, перетаскивание.
- Файловая система обычно закодирована в UTF-8 во всех современных дистрибутивах Linux и не должна создавать проблем. Ввод-вывод файлов по умолчанию использует UTF-8.
Windows
- Qt предоставляет полную поддержку Unicode, включая методы ввода, шрифты, буфер обмена, перетаскивание и имена файлов.
- Ввод-вывод файлов по умолчанию использует Latin1 с вариантами Unicode в QTextStream. Обратите внимание, что некоторые программы Windows не понимают текстовые файлы Unicode с big-endian-кодировкой, даже если это порядок, предписанный стандартом Unicode в отсутствие протоколов более высокого уровня.
macOS
Для получения подробной информации о переводе, специфичном для macOS, обратитесь к документу о проблемах Qt для macOS здесь.
Связанные страницы
Использование Qt Linguist для интернационализации вашего приложения Qt |
|
Руководство Qt Linguist: Переводы на основе идентификаторов текста |
Переводы на основе идентификаторов текста предоставляют поддержку крупных проектов с множеством целевых локалей и множеством текстов для перевода |
Краткий обзор правил перевода для множественного числа, созданных инструментами i18n Qt. |
|
Как писать исходный код таким образом, чтобы пользовательский текст можно было переводить. |
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.1/internationalization.html