From 7def24826c298df77e34fd17bb72c570a22b04bd Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Sat, 6 Aug 2016 21:11:06 +0200 Subject: CMake: Add support for building and installing .mo files Introduce support for building translation domain-specific templates, merging them with the translations, and building a language-specific .mo file. The invocation of xgettext is done in the project source directory, not in the current source directory, and all paths are made relative to the project root, in order to have clean templates. This only supports the C++ source code for now, it unfortunately does not handle the shell scripts of deselect yet. --- po/CMakeLists.txt | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 po/CMakeLists.txt (limited to 'po') diff --git a/po/CMakeLists.txt b/po/CMakeLists.txt new file mode 100644 index 000000000..0dd14839c --- /dev/null +++ b/po/CMakeLists.txt @@ -0,0 +1,20 @@ +apt_add_translation_domain(libapt-pkg${APT_PKG_MAJOR} apt-pkg) + +apt_add_translation_domain(apt # Domain + apt apt-cache apt-get apt-config apt-cdrom + apt-helper apt-mark + apt-private + # Methods + file copy store gpgv cdrom http https ftp rred rsh) + + +apt_add_translation_domain(apt-utils # Domain + apt-sortpkgs + apt-extracttemplates + apt-internal-solver + apt-dump-solver + apt-internal-planner + apt-ftparchive) + +# Add the translations for libapt-inst, and set the translation domain. +apt_add_translation_domain(libapt-inst${APT_INST_MAJOR} apt-inst) -- cgit v1.2.3 From 427fc68b2bfcf8fbc37c0443581db6e000cadfee Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Sun, 7 Aug 2016 14:24:14 +0200 Subject: CMake: po: Add mirror method I forgot this one, sorry --- po/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'po') diff --git a/po/CMakeLists.txt b/po/CMakeLists.txt index 0dd14839c..dc3622156 100644 --- a/po/CMakeLists.txt +++ b/po/CMakeLists.txt @@ -5,7 +5,9 @@ apt_add_translation_domain(apt # Domain apt-helper apt-mark apt-private # Methods - file copy store gpgv cdrom http https ftp rred rsh) + file copy store gpgv cdrom http https ftp rred rsh + mirror +) apt_add_translation_domain(apt-utils # Domain -- cgit v1.2.3 From 6ff8727a0641b299ac32bc897d3ac1246b02061e Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Sun, 7 Aug 2016 15:52:59 +0200 Subject: CMake: Translations: Add support for shell scripts Rework the arguments to apt_add_translation_domain so a user can specify TARGETS and SCRIPTS, the latter being Shell scripts. For each language (TARGETS being C++, SCRIPTS being Shell), a separate template is generated via xgettext. Those templates are then merged together by using msgcomm. In case there are no Shell scripts in the translation domain, msgcomm will receive /dev/null instead of a shell translation template. This also reintroduces line numbers, as msgcomm would otherwise re-order the merged files not only by filename, but also by message string. It's unclear why it does that, it could just leave strings within a file alone. In contrast to the old build system, we use xgettext for shell scripts instead of bash --dump-strings, as it's just easier to use the same tool for everything. We also create valid headers. --- po/CMakeLists.txt | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) (limited to 'po') diff --git a/po/CMakeLists.txt b/po/CMakeLists.txt index dc3622156..c7dfcb0fb 100644 --- a/po/CMakeLists.txt +++ b/po/CMakeLists.txt @@ -1,22 +1,28 @@ -apt_add_translation_domain(libapt-pkg${APT_PKG_MAJOR} apt-pkg) - -apt_add_translation_domain(apt # Domain - apt apt-cache apt-get apt-config apt-cdrom - apt-helper apt-mark - apt-private - # Methods - file copy store gpgv cdrom http https ftp rred rsh - mirror +apt_add_translation_domain( + DOMAIN libapt-pkg${APT_PKG_MAJOR} + TARGETS apt-pkg ) +apt_add_translation_domain( + DOMAIN apt + TARGETS apt apt-cache apt-get apt-config apt-cdrom apt-helper apt-mark + apt-private + # Methods + file copy store gpgv cdrom http https ftp rred rsh mirror + SCRIPTS ../dselect/install ../dselect/update +) -apt_add_translation_domain(apt-utils # Domain - apt-sortpkgs - apt-extracttemplates - apt-internal-solver - apt-dump-solver - apt-internal-planner - apt-ftparchive) +apt_add_translation_domain( + DOMAIN apt-utils + TARGETS apt-sortpkgs + apt-extracttemplates + apt-internal-solver + apt-dump-solver + apt-internal-planner + apt-ftparchive +) -# Add the translations for libapt-inst, and set the translation domain. -apt_add_translation_domain(libapt-inst${APT_INST_MAJOR} apt-inst) +apt_add_translation_domain( + DOMAIN libapt-inst${APT_INST_MAJOR} + TARGETS apt-inst +) -- cgit v1.2.3 From 9a5537fcc6d3ea98909360636a45bd3cf3aba1d1 Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Sun, 7 Aug 2016 16:01:18 +0200 Subject: CMake: Translations: Build apt-all.pot and update .po files Merge all the per-domain templates into one template file using msgcomm, stripping any line numbers in the input files, and sorting the output per file. This should create reasonably stable .pot and .po files that do not change just because files move around. It should also be resilient against some line changes, as long as one translated line is not moved before/after another translated line. Gbp-Dch: ignore --- po/CMakeLists.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'po') diff --git a/po/CMakeLists.txt b/po/CMakeLists.txt index c7dfcb0fb..4fdac3959 100644 --- a/po/CMakeLists.txt +++ b/po/CMakeLists.txt @@ -26,3 +26,13 @@ apt_add_translation_domain( DOMAIN libapt-inst${APT_INST_MAJOR} TARGETS apt-inst ) + +apt_add_update_po( + TEMPLATE + apt-all + DOMAINS + libapt-pkg${APT_PKG_MAJOR} + libapt-inst${APT_INST_MAJOR} + apt + apt-utils +) -- cgit v1.2.3 From ddf40a42f5a699086466990f85d86e6c4977524a Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Tue, 9 Aug 2016 11:58:28 +0200 Subject: CMake: Translations: Add a statistics target This is really useful stuff to have. Gbp-Dch: ignore --- po/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) (limited to 'po') diff --git a/po/CMakeLists.txt b/po/CMakeLists.txt index 4fdac3959..92ff39867 100644 --- a/po/CMakeLists.txt +++ b/po/CMakeLists.txt @@ -36,3 +36,5 @@ apt_add_update_po( apt apt-utils ) + +apt_add_po_statistics() -- cgit v1.2.3 From 32a32d7501ace2859ba097ef8fb7ef665ca2f0ed Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Tue, 9 Aug 2016 18:14:41 +0200 Subject: CMake: Translations: Allow excluding languages from translation This seems to be needed for the hebrew translations. Gbp-Dch: ignore --- po/CMakeLists.txt | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'po') diff --git a/po/CMakeLists.txt b/po/CMakeLists.txt index 92ff39867..174cc5d41 100644 --- a/po/CMakeLists.txt +++ b/po/CMakeLists.txt @@ -1,6 +1,11 @@ +set(languages_excluded + he ## disabled by translator request #313283 +) + apt_add_translation_domain( DOMAIN libapt-pkg${APT_PKG_MAJOR} TARGETS apt-pkg + EXCLUDE_LANGUAGES ${languages_excluded} ) apt_add_translation_domain( @@ -10,6 +15,7 @@ apt_add_translation_domain( # Methods file copy store gpgv cdrom http https ftp rred rsh mirror SCRIPTS ../dselect/install ../dselect/update + EXCLUDE_LANGUAGES ${languages_excluded} ) apt_add_translation_domain( @@ -20,11 +26,13 @@ apt_add_translation_domain( apt-dump-solver apt-internal-planner apt-ftparchive + EXCLUDE_LANGUAGES ${languages_excluded} ) apt_add_translation_domain( DOMAIN libapt-inst${APT_INST_MAJOR} TARGETS apt-inst + EXCLUDE_LANGUAGES ${languages_excluded} ) apt_add_update_po( @@ -35,6 +43,8 @@ apt_add_update_po( libapt-inst${APT_INST_MAJOR} apt apt-utils + EXCLUDE_LANGUAGES + ${languages_excluded} ) -apt_add_po_statistics() +apt_add_po_statistics("${languages_excluded}") -- cgit v1.2.3 From c85c4bed0a4b32ee2dcbd86ea819e39f3d8beb84 Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Tue, 9 Aug 2016 17:40:01 +0200 Subject: Get rid of the old buildsystem Bye, bye, old friend. --- po/LINGUAS | 7 ---- po/makefile | 114 ------------------------------------------------------------ 2 files changed, 121 deletions(-) delete mode 100644 po/LINGUAS delete mode 100644 po/makefile (limited to 'po') diff --git a/po/LINGUAS b/po/LINGUAS deleted file mode 100644 index 6d77cf856..000000000 --- a/po/LINGUAS +++ /dev/null @@ -1,7 +0,0 @@ -## If a language isn't listed here but a po file is available the build will fail. -## If a language is disabled deliberately, list it in a line starting with a single '#' - -ar ast bg bs ca cs cy da de dz el es eu fi fr gl hu it ja km ko ku lt mr nb ne nl nn pl pt pt_BR ro ru sk sl sv th tl tr uk vi zh_CN zh_TW - -## disabled by translator request #313283: -# he diff --git a/po/makefile b/po/makefile deleted file mode 100644 index f42d476a3..000000000 --- a/po/makefile +++ /dev/null @@ -1,114 +0,0 @@ -# -*- make -*- - -# This will compile the gettext message catalogues. - -# The other make files drop file lists in build/po/domains/DOMAIN/* which -# is then picked up by this make file to define all the domains and all the -# source files that compose each domain. It then produces the POT files -# and then filters the PO files through the per-domain POT file to create -# the input to msgformat, which is then dumped into a locale directory. - -BASE=.. -SUBDIR=po - -# Bring in the default rules -include ../buildlib/defaults.mak - -CATALOGS := $(addsuffix .gmo, $(shell sed -e '/^\#/ d' -e '/^$$/ d' LINGUAS | tr '\n' ' ')) -DOMAINS := $(sort $(notdir $(wildcard $(PO_DOMAINS)/*))) -POTFILES := $(addsuffix .pot,$(addprefix $(PO)/,$(DOMAINS))) - -# Construct a list of all mo files for all domains under $(PO_DOMAINS) -MOFILES := $(patsubst %.gmo,%.mo,$(CATALOGS)) -MOFILES := $(foreach D,$(DOMAINS),$(addprefix $(PO_DOMAINS)/$(D)/,$(MOFILES))) -LANG_POFILES := $(patsubst %.mo,%.po,$(MOFILES)) -LINGUAS := $(patsubst %.gmo,%,$(CATALOGS)) - -GETDOMAIN = $(word 1,$(subst /, ,$(1))) - -# Generate the list of files from the bits the other make files dropped -# and produce the .pot file. -$(POTFILES) : $(PO)/%.pot : - echo "Generating POT file $@" - echo $@ : $(wildcard $(PO)/domains/$*/*.*list) $(addprefix $(BASE)/,$(shell cat $(wildcard $(PO)/domains/$*/*.srclist))) > $@.d.tmp - cmp --silent $@.d.tmp $@.d || mv $@.d.tmp $@.d -# From sh source - cat $(PO)/domains/$*/*.shlist 2> /dev/null | (cd $(BASE) && xargs -n1 bash --dump-po-strings) > $(PO)/domains/$*/sh.pot.tmp - cmp --silent $(PO)/domains/$*/sh.pot.tmp $(PO)/domains/$*/sh.pot || \ - mv $(PO)/domains/$*/sh.pot.tmp $(PO)/domains/$*/sh.pot -# From C/C++ source - cat $(PO)/domains/$*/*.srclist | sort > $(PO)/POTFILES_$*.in - $(XGETTEXT) --default-domain=$* --directory=$(BASE) \ - --add-comments --foreign --keyword=_ --keyword=N_ \ - --add-location=file \ - --keyword=P_:1,2 \ - --files-from=$(PO)/POTFILES_$*.in -o $(PO)/domains/$*/c.pot.tmp - cmp --silent $(PO)/domains/$*/c.pot.tmp $(PO)/domains/$*/c.pot || \ - mv $(PO)/domains/$*/c.pot.tmp $(PO)/domains/$*/c.pot - rm -f $(PO)/POTFILES_$*.in - $(MSGCOMM) --omit-header --more-than=0 $(PO)/domains/$*/c.pot $(PO)/domains/$*/sh.pot --output=$@.tmp - cmp --silent $@ $@.tmp || mv $@.tmp $@ - # copy into the domain dirs to make rosetta happy - rm -f $(PO)/domains/$*/*.pot - cp $@ $(PO)/domains/$* - -# Filter the complete translation with the domain specific file to produce -# only the subtext needed for this domain -# We cannot express the dependencies required for this directly with a pattern -# rule, so we use the .d hack. -$(LANG_POFILES) : $(PO_DOMAINS)/%.po : $(POTFILES) - printf "%s " "Generating $@" - echo $@ : $(notdir $@) $(PO)/$(call GETDOMAIN,$*).pot > $(PO)/$(call GETDOMAIN,$*)_$(notdir $@).d - $(MSGMERGE) --add-location=file $(notdir $@) $(PO)/$(call GETDOMAIN,$*).pot -o $@ - -$(MOFILES) : $(PO_DOMAINS)/%.mo : $(PO_DOMAINS)/%.po - printf "%s: " "Generating $(LOCALE)/$(notdir $*)/LC_MESSAGES/$(call GETDOMAIN,$*).mo" - $(GMSGFMT) --statistics -o $@ $< - mkdir -p $(LOCALE)/$(notdir $*)/LC_MESSAGES/ - cp $@ $(LOCALE)/$(notdir $*)/LC_MESSAGES/$(call GETDOMAIN,$*).mo - -stats: all-linguas-enabled - for i in *.pot *.po; do echo -n "$$i: "; msgfmt --output-file=/dev/null --statistics $$i; done - -binary: $(POTFILES) $(MOFILES) all-linguas-enabled - -$(PACKAGE)-all.pot: $(POTFILES) - # we create our partial pot files without a header to avoid changing dates in *.mo files, - # but we want a header for our master-pot file, so we use a dummy pot with nothing but the header - $(XGETTEXT) --default-domain=$(PO)/$(PACKAGE)-dummy.pot --foreign --language=c \ - -o $(PO)/$(PACKAGE)-dummy.pot --force-po --package-name='$(PACKAGE)' \ - --package-version='$(PACKAGE_VERSION)' --msgid-bugs-address='$(PACKAGE_MAIL)' /dev/null - $(MSGCOMM) --more-than=0 $(PO)/$(PACKAGE)-dummy.pot $(POTFILES) --output=$(PACKAGE)-all.pot - rm -f $(PO)/$(PACKAGE)-dummy.pot - -.PHONY: update-po all-linguas-enabled -update-po: $(PACKAGE)-all.pot all-linguas-enabled - for lang in ${LINGUAS}; do \ - echo "Updating $$lang.po"; \ - $(MSGMERGE) $$lang.po $(PACKAGE)-all.pot -o $$lang.new.po; \ - cmp $$lang.new.po $$lang.po || cp $$lang.new.po $$lang.po; \ - rm -f $$lang.new.po; \ - done - -all-linguas-enabled: LINGUAS -ifdef NOISY - echo "Available Translations: $(shell ls *.po | cut -d'.' -f 1 | sort | tr '\n' ' ')" - echo "Mentioned Translations: $(shell sed -e '/^\#\#/ d' -e '/^$$/ d' -e 's/# //' LINGUAS | tr ' ' '\n' | sort | tr '\n' ' ')" - echo "Build Translations: $(shell echo "$(LINGUAS)" | tr ' ' '\n' | sort | tr '\n' ' ')" -endif - test "$(shell ls *.po | cut -d'.' -f 1 | sort | tr '\n' ' ')" = \ - "$(shell sed -e '/^\#\#/ d' -e '/^$$/ d' -e 's/# //' LINGUAS | tr ' ' '\n' | sort | tr '\n' ' ')" || \ - ( echo "ERROR: Not all available translations are mentioned in po/LINGUAS!"; exit 100) - -clean: clean/local -clean/local: - rm -f $(MOFILES) $(LANG_POFILES) $(PO)/*.d - -# Include the dependencies that are available -The_DFiles = $(wildcard $(PO)/*.d) -ifneq ($(words $(The_DFiles)),0) -include $(The_DFiles) -endif - -# otherwise the output is completely screwed -.NOTPARALLEL: -- cgit v1.2.3