Класс 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 также пытается загрузить версию имени локали в нижнем регистре.
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.0/qtranslator.html