summaryrefslogtreecommitdiffstats
path: root/install/po/Makefile
diff options
context:
space:
mode:
authorAdam Young <ayoung@redhat.com>2010-09-24 20:48:23 -0400
committerAdam Young <ayoung@redhat.com>2010-09-27 13:30:55 -0400
commitc187702bfe2c2dbc9614175db5cfa060936159bf (patch)
treee6e8bdf9de5bae7c58ad403d18e18ec2df3a7366 /install/po/Makefile
parent65b455edf97742a922e51a5d81001ce106ec0043 (diff)
downloadfreeipa-c187702bfe2c2dbc9614175db5cfa060936159bf.tar.gz
freeipa-c187702bfe2c2dbc9614175db5cfa060936159bf.tar.xz
freeipa-c187702bfe2c2dbc9614175db5cfa060936159bf.zip
I18N for web
Performing I18N completely on the server, to leverage the existing gettext architecture. Also, the browser does not have access to the Language header. Added the additional po files for a set of required languages conflict with install/static/ipa.js was resolved. Note that the addition of the .po files in this patch is necessary. In order to get Transifex support, we need to update the LINGUAS file with the languages for which we want support. If we don't add the .po files in, they get automatically generated by the rpmbuild process. Our implementation of gettext has a bug in it (It might be F13 thing) where the the Plurals line is not getting correctly transformed, which causes a build failure. However, since the RPM would have the .po files anyway, we should revision control the ones we have, even if they are empty. Fixed the Bug reporting url to the original value. Corrected the Chartype encoding for UK
Diffstat (limited to 'install/po/Makefile')
-rw-r--r--install/po/Makefile286
1 files changed, 286 insertions, 0 deletions
diff --git a/install/po/Makefile b/install/po/Makefile
new file mode 100644
index 000000000..13c455874
--- /dev/null
+++ b/install/po/Makefile
@@ -0,0 +1,286 @@
+prefix = /usr
+exec_prefix = ${prefix}
+datarootdir = ${prefix}/share
+datadir = ${datarootdir}
+localedir = ${datarootdir}/locale
+
+INSTALL = /usr/bin/install -c
+INSTALL_DATA = /usr/bin/install -c -m 644
+AWK = gawk
+SED = /bin/sed
+MKDIR_P = /bin/mkdir -p
+XGETTEXT = /usr/bin/xgettext
+MSGFMT = /usr/bin/msgfmt
+MSGINIT = /usr/bin/msginit
+MSGMERGE = /usr/bin/msgmerge
+MSGCMP = /usr/bin/msgcmp
+
+DOMAIN = ipa
+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))
+
+PYTHON_POTFILES = \
+ ../../ipa \
+ ../../lite-server.py \
+ ../../ipapython/config.py \
+ ../../ipapython/sysrestore.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 \
+ ../../ipalib/plugins/internal.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 \
+ ../../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 mo-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; \
+ $(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
+
+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) ; \
+ $(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
+
+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 \
+ $(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; \
+ po_name = gensub(/.po$$/, "", 1, po_file)} \
+ /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_name ":", ratio, translated/pot_count*100.0, po_untranslated, undefined, untranslated;}'; \
+ 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
+ rm -f $(DOMAIN).pot.update $(DOMAIN).pot.update.tmp $(DOMAIN).pot.tmp
+
+clean: mostlyclean
+
+distclean: clean
+ rm -f Makefile
+
+maintainer-clean: distclean
+
+# 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
+
+maintainer-clean:
+