mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2025-01-15 10:51:56 -06:00
23e188f226
The .po files we use for translations have two shortcomings when used in Git: - They include file locations, which change each time the source is updated. This results in large, unreadable diffs that don't merge well. - They include source strings for untranslated messages, wasting space unnecessarily. Update the Makefile so that the extraneous information is stripped when the files are updated or pulled form Transifex, and empty translation files are removed entirely. Also, translations are normalized to a common style. This should help diffs and merges. The validator requires file location comments to identify the programming language, and to produce good error reports. To make this work, merge the comments in before validation. First patch for: https://fedorahosted.org/freeipa/ticket/2435
216 lines
6.8 KiB
Makefile
216 lines
6.8 KiB
Makefile
prefix = @prefix@
|
|
exec_prefix = ${prefix}
|
|
datarootdir = ${prefix}/share
|
|
datadir = ${datarootdir}
|
|
localedir = ${datarootdir}/locale
|
|
|
|
INSTALL = @INSTALL@
|
|
INSTALL_DATA = @INSTALL@ -m 644
|
|
AWK = @AWK@
|
|
SED = @SED@
|
|
MKDIR_P = @MKDIR_P@
|
|
XGETTEXT = @XGETTEXT@
|
|
MSGFMT = @MSGFMT@
|
|
MSGINIT = @MSGINIT@
|
|
MSGMERGE = @MSGMERGE@
|
|
MSGCMP = @MSGCMP@
|
|
MSGATTRIB = @MSGATTRIB@
|
|
TX = @TX@
|
|
IPA_TEST_I18N = ../../tests/i18n.py
|
|
|
|
DOMAIN = @GETTEXT_DOMAIN@
|
|
MSGMERGE_UPDATE = $(MSGMERGE) --update
|
|
|
|
COPYRIGHT_HOLDER = Red Hat
|
|
PACKAGE_NAME = $(DOMAIN)
|
|
PACKAGE_BUGREPORT = https://hosted.fedoraproject.org/projects/freeipa/newticket
|
|
XGETTEXT_OPTIONS = \
|
|
--add-comments="TRANSLATORS:" \
|
|
--copyright-holder="$(COPYRIGHT_HOLDER)" \
|
|
--package-name="$(PACKAGE_NAME)" \
|
|
--msgid-bugs-address="$(PACKAGE_BUGREPORT)"
|
|
|
|
languages = $(shell $(SED) 's/\#.*//' LINGUAS) # The sed command removes comments
|
|
po_files = $(patsubst %, %.po, $(languages))
|
|
mo_files = $(patsubst %.po, %.mo, $(po_files))
|
|
po_count=$(words $(po_files))
|
|
|
|
PY_FILES = $(shell cd ../..; git ls-files | grep -v -e "^tests/" -e "^doc/" -e "^install/po/" -e "^ipapython/test/" -e "setup.py" -e "setup-client.py" | grep "\.py$$" | tr '\n' ' '; cd install/po)
|
|
C_FILES = $(shell cd ../..; git ls-files | grep "\.c$$" | tr '\n' ' '; cd install/po)
|
|
H_FILES = $(shell cd ../..; git ls-files | grep "\.h$$" | tr '\n' ' '; cd install/po)
|
|
|
|
# Please keep this list sorted!
|
|
PY_EXPLICIT_FILES = \
|
|
init/systemd/freeipa-systemd-upgrade \
|
|
install/tools/ipa-adtrust-install \
|
|
install/tools/ipa-ca-install \
|
|
install/tools/ipa-compat-manage \
|
|
install/tools/ipa-csreplica-manage \
|
|
install/tools/ipactl \
|
|
install/tools/ipa-dns-install \
|
|
install/tools/ipa-ldap-updater \
|
|
install/tools/ipa-managed-entries \
|
|
install/tools/ipa-nis-manage \
|
|
install/tools/ipa-replica-conncheck \
|
|
install/tools/ipa-replica-install \
|
|
install/tools/ipa-replica-manage \
|
|
install/tools/ipa-replica-prepare \
|
|
install/tools/ipa-server-certinstall \
|
|
install/tools/ipa-server-install \
|
|
install/tools/ipa-upgradeconfig \
|
|
ipa \
|
|
ipa-client/ipa-install/ipa-client-install
|
|
|
|
|
|
PYTHON_POTFILES = $(PY_FILES) $(PY_EXPLICIT_FILES)
|
|
|
|
C_POTFILES = $(C_FILES) $(H_FILES)
|
|
|
|
.SUFFIXES:
|
|
.SUFFIXES: .po .mo
|
|
.PHONY: all create-po update-po update-pot install mostlyclean clean distclean test mo-files debug strip-po merge-po $(po_files)
|
|
|
|
all:
|
|
|
|
SUFFIXES = .po .mo
|
|
|
|
.po.mo:
|
|
@echo Creating $@; \
|
|
$(MSGFMT) -c -o t-$@ $< && mv t-$@ $@
|
|
|
|
$(po_files): $(DOMAIN).pot
|
|
@if [ ! -f $@ ]; then \
|
|
lang=`echo $@ | $(SED) -r -e 's/\.po$$//'` # Strip .po suffix ; \
|
|
echo Creating nonexistent $@, you should add this file to your SCM repository; \
|
|
$(MSGINIT) --locale $$lang --no-translator -i $(DOMAIN).pot -o $@; \
|
|
fi; \
|
|
echo Merging $(DOMAIN).pot into $@; \
|
|
$(MSGMERGE) --no-fuzzy-matching -o $@ $@ $(DOMAIN).pot
|
|
|
|
strip-po:
|
|
@for po_file in $(po_files); do \
|
|
echo Stripping $$po_file; \
|
|
$(MSGATTRIB) --translated --no-fuzzy --no-location $$po_file > $$po_file.tmp; \
|
|
mv $$po_file.tmp $$po_file; \
|
|
done
|
|
@export FILES_TO_REMOVE=`find . -name '*.po' -empty`; \
|
|
if [ "$$FILES_TO_REMOVE" != "" ]; then \
|
|
echo Removing empty translation files; \
|
|
rm -v $$FILES_TO_REMOVE; \
|
|
echo; echo Please remove the deleted files from LINGUAS!; echo; \
|
|
fi
|
|
|
|
create-po: $(DOMAIN).pot
|
|
@for po_file in $(po_files); do \
|
|
if [ ! -e $$po_file ]; then \
|
|
lang=`echo $$po_file | $(SED) -r -e 's/\.po$$//'` # Strip .po suffix ; \
|
|
echo Creating nonexistent $$po_file, you should add this file to your SCM repository; \
|
|
$(MSGINIT) --locale $$lang --no-translator -i $(DOMAIN).pot -o $$po_file; \
|
|
fi; \
|
|
done
|
|
|
|
|
|
pull-po:
|
|
cd ../..; $(TX) pull -f
|
|
$(MAKE) strip-po
|
|
|
|
merge-po: update-pot
|
|
$(MAKE) $(po_files)
|
|
|
|
update-po: merge-po
|
|
$(MAKE) strip-po
|
|
|
|
update-pot:
|
|
@rm -f $(DOMAIN).pot.update
|
|
@pushd ../.. ; \
|
|
$(XGETTEXT) $(XGETTEXT_OPTIONS) \
|
|
--output install/po/$(DOMAIN).pot.update \
|
|
--language="python" \
|
|
$(PYTHON_POTFILES) \
|
|
&& \
|
|
$(XGETTEXT) $(XGETTEXT_OPTIONS) \
|
|
--output install/po/$(DOMAIN).pot.update \
|
|
--join-existing \
|
|
--language="c" \
|
|
--from-code="UTF-8" \
|
|
--keyword='_' \
|
|
$(C_POTFILES) ; \
|
|
popd ; \
|
|
$(SED) '/^"POT-Creation-Date: .*"$$/d' $(DOMAIN).pot.update > $(DOMAIN).pot.update.tmp ; \
|
|
$(SED) -i -r -e 's%("Content-Type: text/plain; charset=)(.*)(\\n")%\1UTF-8\3%' $(DOMAIN).pot.update.tmp ; \
|
|
$(SED) '/^"POT-Creation-Date: .*"$$/d' $(DOMAIN).pot > $(DOMAIN).pot.tmp ; \
|
|
if ! cmp -s $(DOMAIN).pot.update.tmp $(DOMAIN).pot.tmp ; then \
|
|
echo "$(DOMAIN).pot updated" ; \
|
|
mv $(DOMAIN).pot.update $(DOMAIN).pot ; \
|
|
# Replace the charset with UTF-8 ; \
|
|
$(SED) -i -r -e 's%("Content-Type: text/plain; charset=)(.*)(\\n")%\1UTF-8\3%' $(DOMAIN).pot ; \
|
|
else \
|
|
echo "$(DOMAIN).pot unmodified" ; \
|
|
fi || :
|
|
@rm -f $(DOMAIN).pot.update $(DOMAIN).pot.update.tmp $(DOMAIN).pot.tmp
|
|
$(IPA_TEST_I18N) --show-strings --validate-pot $(DOMAIN).pot
|
|
|
|
msg-stats:
|
|
@pot_count=`$(MSGFMT) --statistics $(DOMAIN).pot 2>&1 | \
|
|
$(AWK) '{match($$0, /([0-9]+) translated messages, ([0-9]+) untranslated messages/, groups); \
|
|
printf "%s\n", groups[2];}'` ; \
|
|
echo "$(DOMAIN).pot has $$pot_count messages. There are $(po_count) po translation files." ; \
|
|
for po_file in $(po_files); do \
|
|
$(MSGFMT) --statistics $$po_file 2>&1 | \
|
|
$(AWK) -v po_file=$$po_file -v pot_count=$$pot_count -v pot_file=$(DOMAIN).pot \
|
|
'BEGIN {po_name = gensub(/\.po$$/, "", 1, po_file);} \
|
|
match($$0, /([[:digit:]]+) translated/, group) {translated = group[1]} \
|
|
match($$0, /([[:digit:]]+) untranslated/, group) {untranslated = group[1]} \
|
|
match($$0, /([[:digit:]]+) fuzzy/, group) {fuzzy = group[1]} \
|
|
END {pot_untranslated = pot_count - translated; \
|
|
ratio = sprintf("%d/%d", translated, pot_count); \
|
|
printf "%-7s %11s %5.1f%% %5d untranslated, %5d fuzzy\n", \
|
|
po_name ":", ratio, translated/pot_count*100.0, pot_untranslated, fuzzy;}'; \
|
|
done
|
|
|
|
mo-files: $(mo_files)
|
|
|
|
install: $(mo_files)
|
|
@for lang in $(languages); do \
|
|
dstdir=$(DESTDIR)$(localedir)/$$lang/LC_MESSAGES; \
|
|
$(MKDIR_P) $$dstdir; \
|
|
$(INSTALL) $$lang.mo $$dstdir/$(DOMAIN).mo; \
|
|
done
|
|
|
|
mostlyclean:
|
|
rm -rf *.mo test.po test_locale tmp.pot
|
|
rm -f $(DOMAIN).pot.update $(DOMAIN).pot.update.tmp $(DOMAIN).pot.tmp
|
|
|
|
clean: mostlyclean
|
|
|
|
distclean: clean
|
|
rm -f Makefile
|
|
|
|
maintainer-clean: distclean
|
|
|
|
test:
|
|
$(IPA_TEST_I18N) --test-gettext
|
|
|
|
validate-pot:
|
|
$(IPA_TEST_I18N) --show-strings --validate-pot $(DOMAIN).pot
|
|
|
|
validate-po:
|
|
$(IPA_TEST_I18N) --show-strings --validate-po $(po_files)
|
|
|
|
validate-src-strings:
|
|
@rm -f tmp.pot
|
|
@touch tmp.pot
|
|
@$(MAKE) DOMAIN=tmp update-pot; \
|
|
status=$$?; \
|
|
rm tmp.pot; \
|
|
exit $$status
|
|
|
|
debug:
|
|
@echo Python potfiles:
|
|
@echo PY_FILES = $(PY_FILES)
|
|
@echo PY_EXPLICIT_FILES = $(PY_EXPLICIT_FILES)
|
|
@echo C potfiles:
|
|
@echo C_FILES = $(C_FILES)
|
|
@echo H_FILES = $(H_FILES)
|
|
|