Класс QTranslator
Класс QTranslator обеспечивает поддержку интернационализации для вывода текста. Подробнее...
| Заголовок: | #include <QTranslator> |
| CMake: | find_package(Qt6 COMPONENTS Core REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
| Наследуется от: | QObject |
Открытые функции
| QTranslator(QObject *parent = nullptr) | |
| virtual | ~QTranslator() |
| QString | filePath() const |
| virtual bool | isEmpty() const |
| QString | language() const |
| bool | load(const QString &filename, const QString &directory = QString(), const QString &search_delimiters = QString(), const QString &suffix = QString()) |
| bool | load(const QLocale &locale, const QString &filename, const QString &prefix = QString(), const QString &directory = QString(), const QString &suffix = QString()) |
| bool | load(const uchar *data, int len, const QString &directory = QString()) |
| virtual QString | translate(const char *context, const char *sourceText, const char *disambiguation = nullptr, int n = -1) const |
Подробное описание
Объект этого класса содержит набор переводов с исходного языка на целевой язык. QTranslator предоставляет функции для поиска переводов в файле перевода. Файлы перевода создаются с помощью Qt Linguist.
Наиболее распространенное использование QTranslator: загрузить файл перевода и установить его с помощью QCoreApplication::installTranslator().
Вот пример main() функции, использующей QTranslator:
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QTranslator translator;
// look up e.g. :/i18n/myapp_de.qm
if (translator.load(QLocale(), QLatin1String("myapp"), QLatin1String("_"), QLatin1String(":/i18n")))
QCoreApplication::installTranslator(&translator);
QPushButton hello(QCoreApplication::translate("main", "Hello world!"));
hello.resize(100, 30);
hello.show();
return app.exec();
} Обратите внимание, что переводчик должен быть создан *до* виджетов приложения.
Большинству приложений не нужно будет делать с этим классом ничего другого. Другие функции, предоставляемые этим классом, полезны для приложений, которые работают с файлами перевода.
Поиск переводов
Возможно искать перевод с помощью translate() (как tr() и QCoreApplication::translate() делают). Функция translate() принимает до трех параметров:
- context — обычно имя класса для вызывающего tr().
- source text — обычно аргумент для tr().
- disambiguation — необязательная строка, которая помогает разобрать различные использования одного и того же текста в одном и том же контексте.
Например, «Отмена» в диалоговом окне может быть «Anuluj», когда программа работает на польском языке (в этом случае исходный текст был бы «Cancel»). Контекстом (обычно) будет имя класса диалогового окна; обычно комментариев нет, и переведенный текст будет «Anuluj».
Но не всегда так просто. Испанская версия диалогового окна принтера с настройками для двусторонней печати и переплета, вероятно, потребует как «Activado», так и «Activada» в качестве переводов для «Enabled». В этом случае исходный текст был бы «Enabled» в обоих случаях, а контекстом был бы класс диалогового окна, но два элемента имели бы такие пояснения, как «двусторонняя печать» для одного и «переплет» для другого. Пояснение позволяет переводчику выбрать подходящий род для испанской версии и позволяет Qt различать переводы.
Использование нескольких переводов
В приложении можно установить несколько файлов перевода. Переводы ищутся в обратном порядке их установки, поэтому самый недавно установленный файл перевода ищется для переводов в первую очередь, а самый ранний файл перевода ищется последним. Поиск прекращается, как только находится перевод, содержащий соответствующую строку.
Этот механизм позволяет выбрать или задать приоритет конкретного перевода по сравнению с другими; просто удалите переводчик из приложения, передав его функции QCoreApplication::removeTranslator, и переустановите его с помощью QCoreApplication::installTranslator. Тогда это будет первый перевод, для которого будут искаться соответствующие строки.
См. также QCoreApplication::installTranslator(), QCoreApplication::removeTranslator(), QObject::tr(), QCoreApplication::translate(), Пример I18N, Пример Hello tr(), Пример Arrow Pad, и Пример Troll Print.
Документация по членам функций
QTranslator::QTranslator(QObject *parent = nullptr)
Конструирует пустой объект файла сообщений с родителем parent, который не подключен к ни одному файлу.
[virtual] QTranslator::~QTranslator()
Уничтожает объект и освобождает все выделенные ресурсы.
[since 5.15] QString QTranslator::filePath() const
Возвращает путь к загруженному файлу перевода.
Путь к файлу пуст, если перевод еще не был загружен, загрузка не удалась или перевод не был загружен из файла.
Эта функция была введена в Qt 5.15.
[virtual] bool QTranslator::isEmpty() const
Возвращает true, если этот переводчик пуст, в противном случае возвращает false. Эта функция работает с очищенными и неочищенными файлами перевода.
[since 5.15] QString QTranslator::language() const
Возвращает целевой язык, как хранится в файле перевода.
Эта функция была введена в Qt 5.15.
bool QTranslator::load(const QString &filename, const QString &directory = QString(), const QString &search_delimiters = QString(), const QString &suffix = QString())
Загружает filename + suffix (".qm", если suffix не указан), что может быть полным именем файла или относительным к directory. Возвращает true, если перевод успешно загружен; в противном случае возвращает false.
Если directory не указано, используется текущая директория (т. е., как currentPath()).
Предыдущее содержимое этого объекта переводчика отбрасывается.
Если имя файла не существует, пробуются другие имена файлов в следующем порядке:
- Имя файла без добавленного suffix.
- Имя файла с удаленным текстом после символа из search_delimiters и добавленным suffix ("_." по умолчанию для search_delimiters, если это пустая строка).
- Имя файла без добавленного suffix.
- Имя файла с дальнейшим удалением и т. д.
Например, приложение, работающее в локали fr_CA (франкоязычная Канада), может вызвать load("foo.fr_ca", "/opt/foolib"). load() затем попытается открыть первый существующий читаемый файл из этого списка:
/opt/foolib/foo.fr_ca.qm/opt/foolib/foo.fr_ca/opt/foolib/foo.fr.qm/opt/foolib/foo.fr/opt/foolib/foo.qm/opt/foolib/foo
Обычно лучше использовать функцию QTranslator::load(const QLocale &, const QString &, const QString &, const QString &, const QString &), так как она использует QLocale::uiLanguages() и не просто имя локали, что относится к формату дат и чисел, а не обязательно к языку интерфейса.
bool QTranslator::load(const QLocale &locale, const QString &filename, const QString &prefix = QString(), const QString &directory = QString(), const QString &suffix = QString())
Загружает filename + prefix + имя языка интерфейса + suffix (".qm", если suffix не указан), что может быть полным именем файла или относительным к directory. Возвращает true, если перевод успешно загружен; в противном случае возвращает false.
Предыдущее содержимое этого объекта переводчика удаляется.
Если имя файла не существует, другие имена файлов пытаются загрузить в следующем порядке:
- Имя файла без добавления suffix.
- Имя файла с частью языка интерфейса после символа «_» удалённой и с suffix.
- Имя файла с частью языка интерфейса удалённой без добавления suffix.
- Имя файла с дальнейшим удалением части языка интерфейса и так далее.
Например, приложение, работающее в locale с следующими языками интерфейса - "es", "fr-CA", "de" может вызвать load(QLocale(), "foo", ".", "/opt/foolib", ".qm"). load() заменит «-» (дефис) на «_» (подчеркивание) в языке интерфейса и затем попытается открыть первый существующий читаемый файл из этого списка:
/opt/foolib/foo.es.qm/opt/foolib/foo.es/opt/foolib/foo.fr_CA.qm/opt/foolib/foo.fr_CA/opt/foolib/foo.fr.qm/opt/foolib/foo.fr/opt/foolib/foo.de.qm/opt/foolib/foo.de/opt/foolib/foo.qm-
/opt/foolib/foo. /opt/foolib/foo
В операционных системах, где файловая система чувствительна к регистру, QTranslator также пытается загрузить версию имени локали в нижнем регистре.
bool QTranslator::load(const uchar *data, int len, const QString &directory = QString())
Эта функция перегружает load().
Загружает данные QM файла data длиной len в переводчик.
Данные не копируются. Вызывающая сторона должна гарантировать, что data не будет удалён или изменён.
directory используется только для указания базового каталога при загрузке зависимостей файла QM. Если файл не имеет зависимостей, этот аргумент игнорируется.
[virtual] QString QTranslator::translate(const char *context, const char *sourceText, const char *disambiguation = nullptr, int n = -1) const
Возвращает перевод для ключа (context, sourceText, disambiguation). Если не найдено, также пытается (context, sourceText, ""). Если это по-прежнему не удаётся, возвращает пустую строку.
Примечание: Неполные переводы могут привести к неожиданному поведению: Если перевод для (context, sourceText, "") не предоставлен, метод в этом случае может фактически вернуть перевод для другого disambiguation.
Если n не равно -1, оно используется для выбора подходящей формы перевода (например, «%n файл найден» против «%n файлов найдены»).
Если вам нужно программно вставлять переводы в QTranslator, эту функцию можно переопределить.
См. также load().
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.1/qtranslator.html