我正在将项目从autotools迁移到cmake.我有关于gettext支持的问题.
现有的FindGettext.cmake模块提供了一个很好的功能:
GETTEXT_CREATE_TRANSLATIONS(foo.pot ALL fr.po de.po)
Run Code Online (Sandbox Code Playgroud)
你在哪里提供一个锅文件和翻译po fil; 该函数负责将po文件转换为gmo文件,并添加正确的安装目标以确保可以在运行时找到文件.一切都很好.
现在问题是:在添加新消息时,如何更新您的pot文件和po文件?
为此,autotools将生成一个"update-po"目标,(根据我的理解),使用包含翻译字符串的所有文件的列表读取POTFILES.in,将其与其他信息混合,最后调用xgetext生成宝.我认为相应的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
Run Code Online (Sandbox Code Playgroud)
所以,在我重新发明轮子之前,是否有一个现有的cmake函数来做同样的事情?或者我是否必须找到xgettext可执行文件,列出文件,并手动执行此操作?makefile版本似乎相当复杂(虽然它似乎处理了很多情况); 我不介意不具有写cmake的同等学历;)
谢谢
PH
不要让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}
)
Run Code Online (Sandbox Code Playgroud)
对于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}
Run Code Online (Sandbox Code Playgroud)
当FindGettext没有选项时ALL(当它是cmake-2.4时)我确实重新发明了轮子:-)
| 归档时间: |
|
| 查看次数: |
1447 次 |
| 最近记录: |