Класс QTranslator
Класс QTranslator предоставляет поддержку интернационализации для вывода текста. Подробнее...
| Заголовок: | #include <QTranslator> |
| 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()
Уничтожает объект и освобождает все выделенные ресурсы.
QString QTranslator::filePath() const
Возвращает путь к загруженному файлу перевода.
Путь к файлу пуст, если перевод еще не был загружен, загрузка не удалась или перевод не был загружен из файла.
Эта функция была добавлена в Qt 5.15.
[virtual] bool QTranslator::isEmpty() const
Возвращает true, если этот переводчик пустой, в противном случае возвращает false. Эта функция работает с очищенными и неочищенными файлами перевода.
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 + имя языка UI + suffix (".qm", если suffix не указан), который может быть абсолютным именем файла или относительным к directory. Возвращает true, если перевод успешно загружен; в противном случае возвращает false.
Предыдущее содержимое этого объекта переводчика отбрасывается.
Если имя файла не существует, проверяются другие имена файлов в следующем порядке:
- Имя файла без приложенного суффикса.
- Имя файла с частью языка пользовательского интерфейса после символа "_" удалена и суффикс.
- Имя файла с удаленной частью языка пользовательского интерфейса без приложенного суффикса.
- Имя файла с ещё более удаленной частью языка пользовательского интерфейса и т.д.
Например, приложение, работающее в локале с указанными ниже языками пользовательского интерфейса - "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.de.qm/opt/foolib/foo.de/opt/foolib/foo.fr.qm/opt/foolib/foo.fr/opt/foolib/foo.qm-
/opt/foolib/foo. /opt/foolib/foo
В операционных системах, где файловая система чувствительна к регистру, QTranslator также пытается загрузить версию имени локали в нижнем регистре.
Эта функция была добавлена в Qt 4.8.
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-5.15/qtranslator.html