Класс 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, удалённый ("_." по умолчанию для search_delimiters, если это пустая строка), и suffix.
- Имя файла, обрезанное без добавления 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 также пытается загрузить версию имени locale в нижнем регистре.
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.2/qtranslator.html