Международная локализация с 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 прочитайте страницу wiki Перевод 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::location() для поиска переводов используемых модулей Qt. Путь к переводам можно запросить во время выполнения, передав QLibraryInfo::TranslationsPath в эту функцию.
Доступные каталоги
Каталоги переводов Qt расположены в репозитории qttranslations.
Предупреждение: Переводы Qt предоставляются сообществом Qt без каких-либо гарантий. Переводы могут отсутствовать, быть устаревшими или полностью неверными, вплоть до вредоносности. Рекомендуется проверять все переводы, которые вы используете.
Мета-каталог qt_ содержит существующие переводы Qt, которые были включены в каталог qt_ в Qt 4. Он был создан для упрощения переноса приложений из Qt 4 в Qt 5. Мета-каталог зависит от переводов, которые могут отсутствовать, потому что они относятся к ненужным или устаревшим модулям, что может привести к сбою загрузки переводов. Если в вашем приложении используются модули, которые новые в Qt 5, вы должны указать имена каталогов для этих модулей, даже если вы используете мета-каталог.
В следующей таблице перечислены каталоги переводов, доступные для модулей и инструментов 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 с большим порядком байтов, даже если это порядок, предписанный стандартом 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.15/internationalization.html