Международная локализация с 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;
if (myappTranslator.load(QLocale::system(), u"myapp"_qs, u"_"_qs, u":/i18n"_qs))
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 | qtdeclarative |
| Qt Quick Widgets | qtdeclarative |
| Qt SQL | qtbase |
| Qt Widgets | qtbase |
Пример: Базовые модули Qt
Например, чтобы найти переводы для основных модулей Qt, таких как Qt Core, Qt GUI, Qt Network и Qt Widgets, добавьте следующий код в функцию main():
QTranslator qtTranslator;
if (qtTranslator.load(QLocale::system(), u"qtbase"_qs, u"_"_qs,
QLibraryInfo::path(QLibraryInfo::TranslationsPath))) {
app.installTranslator(&qtTranslator);
} Поддержка кодировок
Начиная с Qt 6, предполагается, что преобладающей кодировкой является 8-битный UTF-8.
QString::toUtf8() возвращает текст в кодировке UTF-8; это идеально сохраняет информацию Юникода, выглядя как обычный ASCII, если текст полностью состоит из ASCII.
Для преобразования Юникода в локальные 8-битные кодировки доступен ярлык: функция QString::toLocal8Bit() возвращает такие 8-битные данные. В системах Unix это эквивалентно toUtf8(), в Windows используется текущая кодовая страница системы.
Для преобразования в обратном направлении существуют удобные функции QString::fromUtf8() и QString::fromLocal8Bit().
Для QTextStream, можно использовать QTextStream::setEncoding() для установки распространённых кодировок.
Если потребуются другие устаревшие кодировки, можно использовать класс QTextCodec из модуля Qt5Compat.
При запуске приложения локаль машины определит 8-битную кодировку, используемую при работе с внешними 8-битными данными. QTextCodec::codecForLocale() возвращает кодек, который может использоваться для преобразования между этой кодировкой локальной области и Юникодом.
Приложению иногда могут потребоваться кодировки, отличные от стандартной локальной 8-битной кодировки. Например, приложению в кириллической локали KOI8-R (фактический стандартный язык в России) может потребоваться выводить кириллицу в кодировке ISO 8859-5. Код для этого будет:
QString string = ...; // some Unicode text
QTextCodec *codec = QTextCodec::codecForName("ISO 8859-5");
QByteArray encodedString = codec->fromUnicode(string); Для преобразования в обратном направлении, следующий код демонстрирует преобразование из кириллицы ISO 8859-5 в Юникод:
QByteArray encodedString = ...; // some ISO 8859-5 encoded text
QTextCodec *codec = QTextCodec::codecForName("ISO 8859-5");
QString string = codec->toUnicode(encodedString); Полный список поддерживаемых кодировок см. в документации к QTextCodec.
Локализация чисел, дат, времени и валюты
Локализация — это процесс адаптации к местным соглашениям, например, представление дат и времени с использованием локально предпочтительных форматов. Для локализованных чисел, дат, времени и строк валюты используйте класс 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, имеют ограниченную поддержку Юникода. Уровень поддержки, доступный в базовой системе, оказывает некоторое влияние на поддержку, которую Qt может предоставить на этих платформах, хотя в целом приложения Qt не должны слишком беспокоиться о платформенных ограничениях.
Unix/X11
- Локализованные шрифты и методы ввода. Qt скрывает их и предоставляет ввод и вывод Юникода.
- Конвенции файловой системы, такие как UTF-8, сегодня по умолчанию используются в большинстве вариантов Unix. Все функции Qt файлов позволяют использовать Юникод, но преобразуют имена файлов в локальную 8-битную кодировку, так как это соглашение Unix (см. QFile::setEncodingFunction(), чтобы изучить альтернативные кодировки).
- Ввод/вывод файлов по умолчанию использует локальную 8-битную кодировку с опциями Юникода в QTextStream.
- Некоторые старые дистрибутивы Unix содержат только частичную поддержку некоторых локалей. Например, если у вас есть каталог
/usr/share/locale/ja_JP.EUC, это не обязательно означает, что вы можете отобразить японский текст; вам также нужно установить японские шрифты, и каталог/usr/share/locale/ja_JP.EUCдолжен быть полным. Для достижения наилучших результатов используйте полные локали от вашего поставщика системы.
Linux
- Qt предоставляет полную поддержку Юникода, включая методы ввода, шрифты, буфер обмена, перетаскивание.
- Файловая система обычно закодирована в UTF-8 во всех современных дистрибутивах Linux и не должна создавать проблем. Ввод/вывод файлов по умолчанию использует UTF-8.
Windows
- Qt предоставляет полную поддержку Юникода, включая методы ввода, шрифты, буфер обмена, перетаскивание и имена файлов.
- Ввод/вывод файлов по умолчанию использует Latin1 с опциями Юникода в QTextStream. Обратите внимание, что некоторые программы Windows не понимают текстовые файлы Юникода большого порядка, даже если это порядок, предписанный стандартом Юникода в отсутствие протоколов более высокого уровня.
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.2/internationalization.html