Задался я вопросом сбора сообщений для i18n'ции средствами cmake без привлечения внешних шелл скриптов.
С .cpp файлами все было относительно просто. C .ui тоже не сложно, но неудовлетворение вызывал лишь один момент, в результирующий .po файл в качестве комментариев к строкам, попадали указания на автоматически сгенеренные файлы, которые ничего не говорили о реальном расположении переводимой строки в исходном коде.
А нельзя ли сделать так чтобы на время обработки xgettext'ом номера строк с сообщениями для перевода в сгенеренном cpp файле, совпали с номерами оригинальных строк из ui-файла... При этом сгенеренный cpp файл не обязан быть осмысленным, лишь бы xgettext считал его таковым.
В резултате появился вот такой скрипт: http://svn.berlios.de/viewvc/sim-im/trunk/cmake/UiToFakeCpp.cmake?revision=24...
Грубо говоря этот скрипт заменяет теги <string></string> на вызов функции i18n(""); с сохраненем номеров строк. Вычещая при этом всю лишнюю информацию, обрабатывая слеши, кавычки, переводы строк и пр. Остается лишь перед скармливанием xgettext'у присводить результату обработки расширение .ui и положить его относительно запускаемого xgettext'а так чтобы в комментарий полученного файла попал путь такой же как путь к реальному .ui файлу находящемуся в коде. В результате в .po файле будет ссылка на правильный файл, с правильным номером строки.