Проще всего будет модифицировать уже созданный вами проект Hello, но, если хотите, можете создать новый проект, благо вы это уже умеете.
Кстати, вместо кнопки мы теперь создадим пустое окно (12): первый параметр конструктора указывает на родительский элемент (в данном случае 0 – окно не имеет родителя), а второй – набор битовых флагов, влияющих на внешний вид окна (флаг Qt::Windows означает, что элемент будет выглядеть, как окно приложения, т.е. будет иметь строку заголовка с системными кнопками для сворачивания на панель задач, закрытия и т.д.). И укажем заголовок этого окна (13) – «Пустое окно Qt».
Но, наверное, у вас есть желание набросать в него всяких разных кнопочек и текста. Для этого имеется специальный инструмент визуального программирования Qt Designer. Рассмотрением его работы мы и занимались в разделе «создание графического интерфейса с помощью библиотеки классов Qt».
Впрочем, как вы, наверное, заметили, все графические элементы в Qt можно создавать вручную (так мы еже создали кнопку и окно), но проще и нагляднее применять все же Qt Designer.
Qt Linguist. Создание переводимого интерфейса приложения
1. Перед тем, как приступить к выполнению этой части лабораторной работы прочтите раздел «Мультиязычность» теоретической части.
2. В качестве примера, рассмотрим процесс перевода приложения QReader, которое было написано нами в процессе выполнения прошлой лабораторной работы. Оно уже содержит все необходимые вызовы tr(). Откройте его в Qt Creator.
3. Прежде всего, необходимо внести изменения в файл проекта .pro, чтобы указать - какие языки будут поддерживаться приложением. Допустим, что мы собираемся включить поддержку немецкого, французского и английского языков, дополнительно к русскому, тогда необходимо в файл QReader.pro добавить раздел TRANSLATIONS:
TRANSLATIONS = QReader_de.ts \
QReader_fr.ts \
QReader_en.ts \
QReader_ru.ts
Здесь мы указали три файла переводов: для немецкого, французского и английского языков. Эти файлы будут созданы при первом запуске утилиты lupdate, а на последующих запусках будут просто дополняться.
Для продолжения работы с переводами необходимо собрать приложение.
4. Далее запускаем lupdate из меню (Инструменты – Внешние – Linguist – Обновить переводы), см. рис. 5.2.
Рисунок 5.2. Вызов утилиты lupdate.
Каждая строка, которая "завернута" в вызов tr(), заносится в .ts, с пустым местом для перевода. Строки, которые находятся в файле .ui, так же включаются в исходный файл перевода. Теперь в каталоге должны появиться три файла.
5. Перевод, в файлы QReader_de.ts, QReader_fr.ts и QReader_ru.ts, добавляется переводчиком, с помощью утилиты Qt Linguist. В данном случае – Вами. =)
Чтобы запустить Qt Linguist выберите пункт Qt | Qt Linguist в меню Пуск, либо найдите исполняемый файл в «<Путь установки Qt>\<№ версии Qt>\mingw48_32\bin\linguist.exe». Затем, с помощью меню File|Open, откройте файл с исходным текстом перевода. Осуществите перевод всех строк с русского на английский.
С левой стороны главного окна Qt Linguist находится список контекстов переводов. Для QReader существуют лишь контексты: "MainWindow" и "Find_Dialog". По центру вверху находится список строк для текущего контекста. Каждая строка отображается вместе с переводом и флагом Done ("Готово") в активном (если уже переведено) или пассивном состоянии (если перевод еще не готов). По центру вводится текст перевода для текущей строки.
Рисунок 5.3. Qt Linguist в действии
6. По окончании работы над переводом, файл .ts необходимо преобразовать в файл .qm. Здесь есть 2 варианта.
7.1. В приложении Qt Linguist выберите пункт меню File|Release (Файл|Скомпилировать). Обычно, после перевода нескольких строк, выполняются пробные запуски приложения, с созданным файлом .qm, чтобы визуально оценить качество перевода.
7.2. Запускаем lrelease из меню (Инструменты – Внешние – Linguist – Создать переводы), см. рис. 5.2.
Непереведенные строки, при пробном запуске приложения, будут отображаться на языке оригинала. Флаг Done никак не используется утилитой lrelease, он предназначен исключительно для переводчика, чтобы напоминать о том, какие строки имеют окончательный перевод, а какие требуют уточнения.
В случае внесения изменений в исходный код приложения, содержимое файлов .ts может "устареть". Чтобы этого не происходило нужно всякий раз запускать утилиту lupdate, добавлять перевод для вновь появляющихся строк и пересобирать файлы .qm. Некоторые команды разработчиков синхронизируют перевод так часто, насколько это только возможно, другие предпочитают дождаться окончательного релиза приложения и только тогда приступают к переводу.
Утилиты lupdate и Qt Linguist достаточно "умны". Переведенные строки, необходимость в которых уже отпала, все равно сохраняются в исходных файлах с переводами, на тот случай, если они могут понадобиться в будущем. При обновлении файлов .ts, утилита lupdate использует интеллектуальный алгоритм объединения, который помогает избежать лишней работы по переводу одинаковых строк в различных контекстах.
8. Теперь настало время подключить наш перевод посредством программного кода, например, подключим английский язык (в файле main.cpp):
QTranslator translator;
bool file_load=translator.load("QReader_en");
app.installTranslator(&translator);
По идее данный код должен работать и подключать к нашей программе английский язык (кстати, не забудьте подключить #include <QTranslator>), НО по неведанной мне причине, вопреки справочной системе и интернету – он НЕ работает(а именно: функция load не находит файл с переводом).
Посему необходимо будет пойти другим путем – попробуем задать путь к файлу напрямую (например):
На сей раз стоит снова обратить внимание на слеш, который стоит перед файлом с переводом – дело в том, что qApp->applicationDirPath() возвращает строку без слеша в конце. НО qApp->applicationDirPath()возвращает путь к исполняемому файлу, поэтому файлы перевода (.qm) стоит перебросить в новоиспеченную папку debug нашего проекта.
Это интересно.Подключив #include <QLocale> мы получим доступ к весьма специфичному коду:
Эти строчки программного кода подключат к вашей программе родной язык компьютера! В нашем случае это будет русский (QLocale::system().name() – вернет ru).
Это полезно: найти примеры программ, использующих Qt Linguist можно в «<Путь установки Qt>\<№ версии Qt>\mingw48_32\examples\linguist»