Локализация с 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("myapp_" + QLocale::system().name());
app.installTranslator(&myappTranslator);
return app.exec();
} Для приложения, поддерживающего перевод, создается объект QTranslator, затем перевод загружается в соответствии с текущей локалью во время выполнения, и, наконец, объект переводчика устанавливается в приложение.
Поиск переводов Qt
Вы также можете использовать QLibraryInfo::location() для поиска переводов для используемых модулей Qt. Путь к переводам можно запросить во время выполнения, передав QLibraryInfo::TranslationsPath в эту функцию.
Доступные каталоги
Каталоги переводов Qt находятся в репозитории qttranslations.
Предупреждение: Переводы Qt предоставляются сообществом Qt без каких-либо гарантий. Переводы могут отсутствовать, быть устаревшими или полностью некорректными, вплоть до вредоносных. Рекомендуется проверять все переводы, которые вы распространяете.
Мета-каталог qt_ содержит сохранившиеся переводы Qt, которые были включены в каталог qt_ в Qt 4. Он был создан, чтобы облегчить портирование приложений из Qt 4 в Qt 5. Мета-каталог зависит от переводов, которые могут отсутствовать, потому что они относятся к ненужным или устаревшим модулям, что может привести к сбою загрузки переводов. Если вы используете модули, новые в Qt 5, в своем приложении, вы должны указать имена каталогов для этих модулей, даже если вы используете мета-каталог.
В следующей таблице перечислены каталоги переводов, доступные для модулей и инструментов Qt в Qt.
| Модуль или инструмент Qt | Каталог |
|---|---|
| Помощник Qt | assistant_ |
| Qt Bluetooth | qtconnectivity_ |
| Qt Concurrent | qtbase_ |
| Qt Core | qtbase_ |
| Qt D-Bus | qtbase_ |
| Qt Designer | designer_ |
| Qt GUI | qtbase_ |
| Qt Справка | qt_help_ |
| Qt Linguist | linguist_ |
| Qt Location | qtlocation_ |
| Qt Multimedia | qtmultimedia_ |
| Qt Multimedia Widgets | qtmultimedia_ |
| Qt NFC | qtconnectivity_ |
| Qt Network | qtbase_ |
| Qt Positioning | qtlocation_ |
| Qt Print Support | qtbase_ |
| Qt QML | qtdeclarative_ |
| Qt Quick | qtdeclarative_ |
| Qt Quick Controls | qtquickcontrols2_ |
| Qt Quick Widgets | qtdeclarative_ |
| Qt Serial Port | qtserialport_ |
| Qt SQL | qtbase_ |
| Qt WebEngine | qtwebengine_ |
| Qt WebSockets | qtwebsockets_ |
| 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-битной кодировки. Например, приложение в кириллической локали KOI8-R (фактический стандарт в России) может потребовать вывод кириллицы в кодировке 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-5.14/internationalization.html