mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2024-12-28 01:41:14 -06:00
e7dbbd96b4
The Makefile in install/po has a new target "msg-stats" which prints out statistics concerning the current pot and po files. Here is an example: % make msg-stats ipa.pot has 133 messages id.po: 107/133 80.5% 13 po untranslated, 13 missing, 26 untranslated kn.po: 4/133 3.0% 116 po untranslated, 13 missing, 129 untranslated pl.po: 120/133 90.2% 0 po untranslated, 13 missing, 13 untranslated Also update configure.ac to search for msgcmp, awk & sed programs.
279 lines
9.9 KiB
Makefile
279 lines
9.9 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@
|
|
|
|
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))
|
|
|
|
PYTHON_POTFILES = \
|
|
../../ipa \
|
|
../../lite-server.py \
|
|
../../ipapython/config.py \
|
|
../../ipapython/sysrestore.py \
|
|
../../ipapython/ipasslfile.py \
|
|
../../ipapython/__init__.py \
|
|
../../ipapython/ipautil.py \
|
|
../../ipapython/certdb.py \
|
|
../../ipapython/ipavalidate.py \
|
|
../../ipapython/dnsclient.py \
|
|
../../ipapython/dogtag.py \
|
|
../../ipapython/nsslib.py \
|
|
../../ipapython/entity.py \
|
|
../../install/tools/ipa-replica-manage \
|
|
../../install/tools/ipa-server-certinstall \
|
|
../../install/tools/ipa-replica-install \
|
|
../../install/tools/ipa-nis-manage \
|
|
../../install/tools/ipa-upgradeconfig \
|
|
../../install/tools/ipa-replica-prepare \
|
|
../../install/tools/ipa-compat-manage \
|
|
../../install/tools/ipa-server-install \
|
|
../../install/tools/ipa-ldap-updater \
|
|
../../install/migration/migration.py \
|
|
../../ipalib/config.py \
|
|
../../ipalib/parameters.py \
|
|
../../ipalib/request.py \
|
|
../../ipalib/output.py \
|
|
../../ipalib/__init__.py \
|
|
../../ipalib/backend.py \
|
|
../../ipalib/pkcs10.py \
|
|
../../ipalib/x509.py \
|
|
../../ipalib/plugable.py \
|
|
../../ipalib/constants.py \
|
|
../../ipalib/aci.py \
|
|
../../ipalib/base.py \
|
|
../../ipalib/ipauuid.py \
|
|
../../ipalib/crud.py \
|
|
../../ipalib/cli.py \
|
|
../../ipalib/text.py \
|
|
../../ipalib/compat.py \
|
|
../../ipalib/frontend.py \
|
|
../../ipalib/rpc.py \
|
|
../../ipalib/errors.py \
|
|
../../ipalib/encoder.py \
|
|
../../ipalib/util.py \
|
|
../../ipalib/plugins/config.py \
|
|
../../ipalib/plugins/rolegroup.py \
|
|
../../ipalib/plugins/host.py \
|
|
../../ipalib/plugins/group.py \
|
|
../../ipalib/plugins/migration.py \
|
|
../../ipalib/plugins/xmlclient.py \
|
|
../../ipalib/plugins/service.py \
|
|
../../ipalib/plugins/passwd.py \
|
|
../../ipalib/plugins/__init__.py \
|
|
../../ipalib/plugins/virtual.py \
|
|
../../ipalib/plugins/hbac.py \
|
|
../../ipalib/plugins/cert.py \
|
|
../../ipalib/plugins/baseldap.py \
|
|
../../ipalib/plugins/aci.py \
|
|
../../ipalib/plugins/kerberos.py \
|
|
../../ipalib/plugins/krbtpolicy.py \
|
|
../../ipalib/plugins/dns.py \
|
|
../../ipalib/plugins/automount.py \
|
|
../../ipalib/plugins/netgroup.py \
|
|
../../ipalib/plugins/misc.py \
|
|
../../ipalib/plugins/user.py \
|
|
../../ipalib/plugins/taskgroup.py \
|
|
../../ipalib/plugins/hostgroup.py \
|
|
../../ipalib/plugins/pwpolicy.py \
|
|
../../ipaserver/__init__.py \
|
|
../../ipaserver/servercore.py \
|
|
../../ipaserver/ipautil.py \
|
|
../../ipaserver/rpcserver.py \
|
|
../../ipaserver/conn.py \
|
|
../../ipaserver/ipaldap.py \
|
|
../../ipaserver/install/installutils.py \
|
|
../../ipaserver/install/service.py \
|
|
../../ipaserver/install/ldapupdate.py \
|
|
../../ipaserver/install/__init__.py \
|
|
../../ipaserver/install/cainstance.py \
|
|
../../ipaserver/install/ntpinstance.py \
|
|
../../ipaserver/install/bindinstance.py \
|
|
../../ipaserver/install/krbinstance.py \
|
|
../../ipaserver/install/certs.py \
|
|
../../ipaserver/install/dsinstance.py \
|
|
../../ipaserver/install/replication.py \
|
|
../../ipaserver/install/httpinstance.py \
|
|
../../ipaserver/plugins/ldap2.py \
|
|
../../ipaserver/plugins/rabase.py \
|
|
../../ipaserver/plugins/selfsign.py \
|
|
../../ipaserver/plugins/__init__.py \
|
|
../../ipaserver/plugins/join.py \
|
|
../../ipaserver/plugins/ldapapi.py \
|
|
../../ipaserver/plugins/xmlserver.py \
|
|
../../ipaserver/plugins/dogtag.py \
|
|
../../contrib/RHEL4/ipachangeconf.py \
|
|
../../ipawebui/engine.py \
|
|
../../ipawebui/__init__.py \
|
|
../../ipawebui/widgets.py \
|
|
../../ipawebui/controllers.py \
|
|
../../ipa-client/ipaclient/ntpconf.py \
|
|
../../ipa-client/ipaclient/__init__.py \
|
|
../../ipa-client/ipaclient/ipachangeconf.py \
|
|
../../ipa-client/ipaclient/ipadiscovery.py \
|
|
../../ipa-client/ipa-install/ipa-client-install
|
|
|
|
C_POTFILES = \
|
|
../../daemons/ipa-kpasswd/ipa_kpasswd.c \
|
|
../../daemons/ipa-slapi-plugins/ipa-enrollment/ipa_enrollment.c \
|
|
../../daemons/ipa-slapi-plugins/ipa-memberof/ipa-memberof.c \
|
|
../../daemons/ipa-slapi-plugins/ipa-memberof/ipa-memberof.h \
|
|
../../daemons/ipa-slapi-plugins/ipa-memberof/ipa-memberof_config.c \
|
|
../../daemons/ipa-slapi-plugins/ipa-pwd-extop/ipa_pwd_extop.c \
|
|
../../daemons/ipa-slapi-plugins/ipa-winsync/ipa-winsync-config.c \
|
|
../../daemons/ipa-slapi-plugins/ipa-winsync/ipa-winsync.c \
|
|
../../daemons/ipa-slapi-plugins/ipa-winsync/ipa-winsync.h \
|
|
../../ipa-client/config.c \
|
|
../../ipa-client/ipa-getkeytab.c \
|
|
../../ipa-client/ipa-join.c \
|
|
../../ipa-client/ipa-rmkeytab.c
|
|
|
|
POTFILES = $(PYTHON_POTFILES) $(C_POTFILES)
|
|
|
|
.SUFFIXES:
|
|
.SUFFIXES: .po .mo
|
|
.PHONY: all create-po update-po update-pot install mostlyclean clean distclean test_lang test
|
|
|
|
all: $(po_files)
|
|
@
|
|
|
|
SUFFIXES = .po .mo
|
|
|
|
.po.mo:
|
|
@echo Creating $@; \
|
|
$(MSGFMT) -c -o t-$@ $< && mv t-$@ $@
|
|
|
|
$(po_files): $(DOMAIN).pot
|
|
@if [ ! -f @a ]; 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; \
|
|
$(MSGMERGE) $@ -o $@ $(DOMAIN).pot
|
|
|
|
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
|
|
|
|
$(DOMAIN).pot: $(POTFILES)
|
|
$(MAKE) update-pot
|
|
|
|
update-po: update-pot
|
|
$(MAKE) all
|
|
|
|
update-pot:
|
|
rm -f $(DOMAIN).pot.update
|
|
$(XGETTEXT) $(XGETTEXT_OPTIONS) \
|
|
--output $(DOMAIN).pot.update \
|
|
--language="python" \
|
|
$(PYTHON_POTFILES) \
|
|
&& \
|
|
$(XGETTEXT) $(XGETTEXT_OPTIONS) \
|
|
--output $(DOMAIN).pot.update \
|
|
--join-existing \
|
|
--language="c" \
|
|
$(C_POTFILES) \
|
|
&& \
|
|
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
|
|
|
|
|
|
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" ; \
|
|
for po_file in $(po_files); do \
|
|
$(MSGCMP) $$po_file $(DOMAIN).pot 2>&1 | \
|
|
$(AWK) -v po_file=$$po_file -v pot_count=$$pot_count -v pot_file=$(DOMAIN).pot \
|
|
'BEGIN {po_untranslated=0; undefined=0;} \
|
|
/this message is untranslated/ {po_untranslated++} \
|
|
/this message is used but not defined/ {undefined++} \
|
|
END {untranslated = po_untranslated+undefined; \
|
|
translated = pot_count - untranslated; \
|
|
ratio = sprintf("%d/%d", translated, pot_count); \
|
|
printf "%-7s %8s %5.1f%% %4d po untranslated, %4d missing, %4d untranslated\n", \
|
|
po_file ":", ratio, translated/pot_count*100.0, po_untranslated, undefined, untranslated;}'; \
|
|
done
|
|
|
|
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
|
|
|
|
clean: mostlyclean
|
|
|
|
distclean: clean
|
|
rm -f Makefile
|
|
|
|
# We test our translations by taking the original untranslated string
|
|
# (e.g. msgid) and prepend a prefix character and then append a suffix
|
|
# character. The test consists of asserting that the first character in the
|
|
# translated string is the prefix, the last character in the translated string
|
|
# is the suffix and the everything between the first and last character exactly
|
|
# matches the original msgid.
|
|
#
|
|
# We use unicode characters not in the ascii character set for the prefix and
|
|
# suffix to enhance the test. To make reading the translated string easier the
|
|
# prefix is the unicode right pointing arrow and the suffix left pointing arrow,
|
|
# thus the translated string looks like the original string enclosed in
|
|
# arrows. In ASCII art the string "foo" would render as:
|
|
# -->foo<--
|
|
#
|
|
# Unicode right pointing arrow: u'\u2192', utf-8 = '\xe2\x86\x92'
|
|
# Unicode left pointing arrow: u'\u2190', utf-8 = '\xe2\x86\x90'
|
|
#
|
|
# The sed command below performs the prefix and suffix substitution.
|
|
#
|
|
# When msginit is invoked with an English target locale it copies the msgid
|
|
# into the msgstr. This is an undocumented feature of msginit. Otherwise the
|
|
# msgstr will be set to the empty string (i.e. untranslated). We depend on
|
|
# the msgid being copied to the msgstr.
|
|
|
|
test_lang:
|
|
rm -rf test.po test_locale
|
|
$(MSGINIT) --no-translator -i $(DOMAIN).pot -l en_US -o test.po
|
|
$(SED) -i -r -e 's/^msgstr[ \t]+"(.*)"[ \t]*$$/msgstr "\xe2\x86\x92\1\xe2\x86\x90"/' test.po
|
|
$(MKDIR_P) test_locale/en_US/LC_MESSAGES
|
|
$(MSGFMT) -o test_locale/en_US/LC_MESSAGES/ipa.mo test.po
|
|
|
|
test: test_lang
|
|
./test_i18n.py
|