Есть ли функция cmake для обновления .pot файлов? - PullRequest
8 голосов
/ 23 апреля 2010

Я переношу проект из автоинструментов в cmake.У меня есть вопрос о поддержке gettext.

Существует модуль FindGettext.cmake, который предоставляет удобную функцию:

GETTEXT_CREATE_TRANSLATIONS(foo.pot ALL fr.po de.po)

, где вы предоставляете файл банка и переводите po fil;функция заботится о том, чтобы превратить po-файлы в gmo-файлы и добавить правильные цели установки, чтобы убедиться, что файлы можно найти во время выполнения.Все хорошо и хорошо.

Теперь встает вопрос: как вы обновляете свои файлы банка и ваши po-файлы, когда добавляете новые сообщения?

Для этого autotools сгенерирует цель «update-po», которая (из того, что я понимаю) читает файл POTFILES.in со списками всех файлов, содержащих переведенные строки, смешивает его с другой информацией ив конечном итоге вызывает xgetext для генерации po.Я думаю, что основная задача Makefile - это та, которая содержит что-то вроде:

case `$(XGETTEXT) --version | sed 1q | sed -e 's,^[^0-9]*,,'` in \
  '' | 0.[0-9] | 0.[0-9].* | 0.1[0-5] | 0.1[0-5].* | 0.16 | 0.16.[0-1]*) \
 $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
   --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS)  \
   --files-from=$(srcdir)/POTFILES.in \
   --copyright-holder='$(COPYRIGHT_HOLDER)' \
   --msgid-bugs-address="$$msgid_bugs_address" \
 ;; \
*) \
 $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \
   --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS)  \
   --files-from=$(srcdir)/POTFILES.in \
   --copyright-holder='$(COPYRIGHT_HOLDER)' \
   --package-name="$${package_gnu}ube" \
   --package-version='0.4.0-dev' \
   --msgid-bugs-address="$$msgid_bugs_address" \
 ;; \
 esac

Итак, прежде чем я заново изобрету колесо, есть ли существующая функция cmake, которая делает то же самое?Или я должен найти исполняемый файл xgettext, перечислить файлы и сделать это вручную?Версия makefile кажется довольно сложной (хотя, похоже, она обрабатывает множество случаев);Я не возражаю против не необходимости писать эквивалент cmake;)

Спасибо

PH

Ответы [ 2 ]

6 голосов
/ 23 июля 2012

Не позволяйте автоинструментальному шуту напугать вас. : -)

Вы можете использовать следующий код:

SET(_potFile ${PROJECT_NAME}.pot)
ADD_CUSTOM_COMMAND(OUTPUT ${_potFile}
    COMMAND ${XGETTEXT_CMD} ${_xgettext_option_list} -o ${_potFile} ${_src_list}
    DEPENDS ${_src_list}
    WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
    COMMENT "Extract translatable messages to ${_potFile}"
)

ADD_CUSTOM_TARGET(pot_file ${_all}
DEPENDS ${_potFile}
)

Для программ на C я использую следующее как _xgettext_option_list

--language=C --keyword=_ --keyword=N_ --keyword=C_:1c,2 --keyword=NC_:1c,2 -s
--package-name=${PROJECT_NAME} --package-version=${PRJ_VER}

Я заново изобрел колесо, когда FindGettext не имел опции ALL (когда это был cmake-2.4): -)

2 голосов
/ 03 мая 2017

Согласно этой kde вики-странице, использование cmake для редактирования источников не очень хорошая идея. Лучше использовать автономный скрипт для обновления переводов.

На самом деле извлечение и объединение сообщений не очень хорошо соответствуют концепции CMake для сборок вне исходного кода, а CMake не может предоставьте слишком много помощи для этого шага.

Следовательно, в этом уроке мы рассмотрим первый шаг с автономный сценарий оболочки, и только второй шаг будет обработан CMake.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...