我正在将项目从autotools迁移到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
答案 0 :(得分:6)
不要让autotool臃肿吓唬你。 : - )
您可以使用以下代码:
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时),我确实重新发明了轮子: - )
答案 1 :(得分:2)
根据this kde wiki页面,使用cmake编辑源代码并不是一个好主意。最好使用独立脚本来更新翻译。
事实上,消息的提取和合并并没有很好地映射到源外构建的CMake概念,而且CMake不能 为这一步提供太多帮助。
因此,在本教程中,我们将使用a处理第一步 独立shell脚本,只有第二步将由处理 CMake的。