Russian Qt Forum
Апрель 20, 2024, 18:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Автоматический вызов lrelease  (Прочитано 15202 раз)
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 189


Просмотр профиля
« : Февраль 21, 2012, 15:47 »

Здравствуйте.
Попрактиковался я в русификации с помощью linguist. Штука хорошая и надёжная.
Только вот что смущает. Если я собираю проект из исходников (qmake / make), всё равно для каждого .ts приходится вручную вызывать lrelease, чтоб получить из него .qm. Программа make этот процесс не автоматизирует. Думал, это у меня проект кривой - при сборке стандартных примеров из Qt та же самая ситуация.
Так и должно быть? Если да - непонятно, зачем вообще в файле проекта секция TRANSLATIONS. Да и вообще обидно как-то.
Если нет - где могла собака порыться?
Поиском на форуме нашёл обсуждение аналогичной проблемы для cmake, но я ей не пользуюсь, полагаюсь на стандартные для Qt средства. До последнего момента мне их хватало.
« Последнее редактирование: Январь 31, 2018, 09:57 от DarkHobbit » Записан

Мои проекты на Qt: DoubleContact, LInvert
QuAzI
Гость
« Ответ #1 : Февраль 21, 2012, 16:06 »

Но там же есть в самом linguist опция "скомпилировать", которая и выдаёт нужный QM. Меня больше прикалывает то, что приходится дёргать для "нового" файла в лингвисте уже существующий файл. Или он как-то может создаваться самим проектом?
Записан
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 189


Просмотр профиля
« Ответ #2 : Февраль 21, 2012, 21:40 »

Но там же есть в самом linguist опция "скомпилировать", которая и выдаёт нужный QM.
linguist - это гуёвая программа для _редактирования_ .ts. А у меня задача в данном случае - тупо собрать проект с минимум телодвижений, допустим, из tar.bz2 с исходниками или из svn/hg/git. В общем случае править перевод может один человек, а собирать понадобится другому.
Помещать файлы .qm в tar.bz2 и уж тем более коммитить их в svn/hg/git я, естественно, не хочу. Ибо это вторичный продукт по отношению к .ts, да ещё и двоичный. Со всеми вытекающими. Стало быть, надо собирать. Мне показалось, что было бы естественно возложить это на make. Ибо какая разница, что ей вызывать - gcc, uic или lrelrase. Но похоже, что у qmake, которая делает Makefile, на этот счёт другое мнение.

P.S. Сейчас ещё раз погуглил - похоже, стандартно проблема не решается, надо добавлять свой скрипт. Авторы кутима так и сделали:
http://wiki.qutim.org/ru/how_to_translate
Цитировать
вызвать скрипт make.sh из папки translations и собрать перевод в qm файлы
Хнык-хнык.
Записан

Мои проекты на Qt: DoubleContact, LInvert
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #3 : Февраль 21, 2012, 22:47 »

Можно сделать через дополнительные цели:

Код:
tr.commands = lrelease $$_PRO_FILE_

QMAKE_EXTRA_TARGETS += tr

Команда "make tr" создаст компилированные файлы переводов. А если написать

Код:
tr.commands = lrelease $$_PRO_FILE_

QMAKE_EXTRA_TARGETS += tr

POST_TARGETDEPS += tr

То это будет вызываться автоматом перед линковкой основного таргета.
Записан
QuAzI
Гость
« Ответ #4 : Февраль 23, 2012, 10:58 »

Фишка с доп.целями понравилась. А как определить, чтобы например *.QM копировались в директорию сборки? А то софтинка то их всё равно не находит без ручного подкидывания
Записан
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 189


Просмотр профиля
« Ответ #5 : Февраль 26, 2012, 12:59 »

Можно сделать через дополнительные цели

Добавил второй вариант в .pro-файл. Спасибо, помогло!

Мне кажется, способ достоин помещения в FAQ!
Записан

Мои проекты на Qt: DoubleContact, LInvert
manarch
Гость
« Ответ #6 : Декабрь 14, 2016, 15:59 »

Ну и в капилку будущим поколениям (ну или мне при потере памяти Улыбающийся )

Создаем файл "translations.prf":
Код:
isEmpty(LRELEASES): return()
contains(TEMPLATE, .*subdirs): error("TRANSLATIONS does not work with TEMPLATE=subdirs")

build_pass:build_all: \
  debug_and_release:debug {
    return()
}

for (cp, LRELEASES) {
    isEmpty($${cp}.files): next()
    pfx = lrelease_$${cp}
    for (f, $${cp}.files) {
        fil = $$absolute_path($$f, $$_PRO_FILE_PWD_)
        $${pfx}.files += $$fil
    }
    path = $$eval($${cp}.path)
    isEmpty(path): path = ${QMAKE_FILE_IN_PATH}
    $${pfx}.output = $$path/${QMAKE_FILE_IN_BASE}.qm
    $${pfx}.input = $${pfx}.files
    $${pfx}.commands = lrelease ${QMAKE_FILE_IN} -qm ${QMAKE_FILE_OUT}
    $${pfx}.name = LRELEASE ${QMAKE_FILE_IN}
    $${pfx}.CONFIG = no_link no_clean target_predeps
    QMAKE_EXTRA_COMPILERS += $${pfx}
}

Сохраняем его в корневой директории проекта каталог "features". Добавляем тут же файл ".qmake.conf" со строкой  (если он у вас уже есть то просто добавляем в него) :
Код:
QMAKEFEATURES = $$PWD/features
Ну или файл translations.prf можно добавить в директорию "mkspecs\features" в Qt, но при этом помните что она не будет работать у тех у кого в Qt не будет этого файла.


Далее в проекте добавляем:
Код:
CONFIG += translations

Подключение lrelease делаем с помощью кода:
Код:
# Release translations files
translations.path = $$DESTDIR/translations
translations.files = $$TRANSLATIONS

LRELEASES += translations

И не забываем добавить в TRANSLATIONS файлы перевода. Ну и можно не использовать TRANSLATIONS, а сразу весь список гнать в ".files". Если не указывать ".path" то перевод сгенерируется рядом с ts'ками.

Записан
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 189


Просмотр профиля
« Ответ #7 : Январь 31, 2018, 09:54 »

Ещё засада возникла...
Код:
tr.commands = lrelease $$_PRO_FILE_
Этот вариант без проблем работает в винде и работал в старых линуксах.
В современных же линуксах целый зоопарк различных имён для lrelease. В зависимости от дистрибутива, его версии и установленных версий Qt, системе могут присутствовать (некоторые из них могут присутствовать одновременно, а могут и отсутствовать) команды lrelease, lrelease-qt4 и lrelease-qt5. В попытке охватить все случаи без правки файла проекта я уже написал в своём .pro трёхэтажную конструкцию, но после обновления одного из дистрибутивов убедился, что однозначности она всё равно не гарантирует.

Сейчас я уже пришёл к тому, что хочу отказаться от полного автоматизма и задавать имя для lrelease в переменной среды ПЕРЕД вызовом qmake. Это заодно позволит переключаться между используемыми версиями Qt, не делая за сборщика спекулятивных предположений.

Вопрос 1. Может, такая переменная уже где-то есть или вообще есть более изящное решение?

Вопрос 2. Можно ли в .pro заставить qmake отругаться, если заданная переменная не найдена/пуста? А то ведь кто-нибудь обязательно запустит qmake без параметров, и хотелось бы, чтобы сообщение об ошибке ему пришло моё, а не системное.
Записан

Мои проекты на Qt: DoubleContact, LInvert
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 23.