Ubuntu has some tools around i18n to make it easier to translate desktop software into many languages. Currently, some of that depends on stuff in CDBS (adding the gettext domain to .desktop files, stripping the translations from gconf schemas, etc.). This is all in /usr/share/cdbs/1/rules/langpack.mk. I would like to use debhelper instead of CDBS in my packages because I really like slide 45, but it doesn't (yet) support this specific functionality that is mandatory for applications that go into Ubuntu main. I have no idea (yet) how to port this functionality, so I decided to start by writing down the goal. I've just started looking into debhelper code which is very nicely factored and documented, and here is the code (doesn't seem all that impossible) that runs inside langpack.mk:
# -*- mode: makefile; coding: utf-8 -*-
# Copyright © 2006 Martin Pitt
# Description: Rules for language pack support (POT file updating, and
# gettext domain key for .desktop/.directory/.server files)
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation; either version 2, or (at
# your option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
# 02111-1307 USA.
_cdbs_scripts_path ?= /usr/lib/cdbs
_cdbs_rules_path ?= /usr/share/cdbs/1/rules
_cdbs_class_path ?= /usr/share/cdbs/1/class
ifndef _cdbs_rules_langpack
_cdbs_rules_langpack := 1
# try to build a POT file
common-post-build-arch:: langpack-mk-update-pot
common-post-build-indep:: langpack-mk-update-pot
langpack-mk-update-pot:
if [ -d $(DEB_BUILDDIR)/po ]; then
if grep -q intltool $(DEB_BUILDDIR)/po/Makefile*; then
if [ -x /usr/bin/intltool-update ]; then
cd $(DEB_BUILDDIR)/po; /usr/bin/intltool-update -p --verbose || true;
elif [ -x $(DEB_BUILDDIR)/intltool-update ]; then
cd $(DEB_BUILDDIR)/po; env XGETTEXT=/usr/bin/xgettext ../intltool-update -p --verbose || true;
else
echo 'langpack.mk: po/Makefile* mentions intltool, but intltool-update is not available';
exit 1;
fi;
elif [ -e $(DEB_BUILDDIR)/po/Makefile ]; then
DOMAIN=$$(grep --max-count 1 '^GETTEXT_PACKAGE[[:space:]]*=' $(DEB_BUILDDIR)/po/Makefile | sed 's/^.*=[[:space:]]([^[:space:]])/1/');
if [ "$$DOMAIN" ]; then
echo "langpack.mk: Generating $$DOMAIN.pot...";
make -C $(DEB_BUILDDIR)/po "$$DOMAIN.pot" || true;
fi;
fi;
fi
if [ -d $(DEB_BUILDDIR)/help ]; then
cd $(DEB_BUILDDIR)/help; make pot || true;
fi
# add translation domain to installed desktop/directory/schema files
$(patsubst %,binary-predeb/%,$(DEB_PACKAGES)) :: binary-predeb/%:
echo "langpack.mk: add translation domain to $(cdbs_curpkg)";
if [ -e $(DEB_BUILDDIR)/po/Makefile ]; then
DOMAIN=$$(grep --max-count 1 '^GETTEXT_PACKAGE[[:space:]]*=' $(DEB_BUILDDIR)/po/Makefile | sed 's/^.*=[[:space:]]*([^[:space:]])/1/');
if [ "$$DOMAIN" ]; then
for d in $$(find debian/$(cdbs_curpkg) -type f ( -name "*.desktop" -o -name "*.directory" ) ); do
echo "langpack.mk: Replacing translations with domain $$DOMAIN in $$d...";
sed -ri '/^(Name|GenericName|Comment|X-GNOME-FullName)[/d' $$d;
echo "X-Ubuntu-Gettext-Domain=$$DOMAIN" >> $$d;
done;
for d in $$(find debian/$(cdbs_curpkg) -type f -name "*.server" ); do
echo "langpack.mk: Adding translation domain $$DOMAIN to $$d...";
sed -i "s// $$d.new; mv $$d.new $$d;
done;
fi;
fi
endif