Internationalisation

Differences between revisions 1 and 7 (spanning 6 versions)
Revision 1 as of 2009-06-16 09:50:53
Size: 8075
Editor: i59F7194C
Comment:
Revision 7 as of 2009-06-17 13:59:35
Size: 11974
Editor: p54A12C5F
Comment: Added some more info from Danilo's feedback
Deletions are marked like this. Additions are marked like this.
Line 4: Line 4:
THIS IS CURRENTLY A DRAFT
Line 7: Line 9:
 * how Ubuntu deals with translations (and i18n in general)  * how Ubuntu deals with translations (and i18n in general) from a developer's perspective
Line 9: Line 11:

== General information ==

Be sure to read TranslationLifecycle in the [[TranslatingUbuntu|translations wiki pages]] for a general overview of how translations work in Ubuntu.
Line 14: Line 20:

Note: once a package is promoted to `main`, it only needs to be rebuilt the first time after promotion so that [[https://launchpad.net/ubuntu/+source/pkgbinarymangler|pkgbinarymangler]] can strip the translations. After this, import to Launchpad Translations and export in language packs "will just happen".
Line 112: Line 120:

* For GNOME packages:
Line 114: Line 125:
''If there's more than one `./po/` directory (or it has a different name), please make sure to adjust it.''

=== General Advice ===
''If there's more than one `./po/` directory (or it has a different name), please make sure to adjust the call above.''

* For KDE packages:

TODO

* For GNU packages:

TODO: check

{{{
make update-po}}}

== Desktop Entries ==

Translations of [[http://www.freedesktop.org/wiki/Specifications/desktop-entry-spec|desktop entries]] (.desktop files) are also stripped out and included in language packs.

This is done by adding the '''X-Ubuntu-Gettext-Domain''' [[http://standards.freedesktop.org/desktop-entry-spec/latest/ar01s08.html|additional key]]. As an example for this key in action, here's how it is done in the Transmission source package in Jaunty (from the `20_add_X-Ubuntu-Gettext-Domain.diff` patch):

{{{
Index: transmission-1.40-2ubuntu1/gtk/transmission.desktop.in
===================================================================
--- transmission-1.40-2ubuntu1.orig/gtk/transmission.desktop.in 2008-12-09 18:57:13.000000000 +0000
+++ transmission-1.40-2ubuntu1/gtk/transmission.desktop.in 2008-12-09 18:58:54.000000000 +0000
@@ -9,3 +9,4 @@
 Type=Application
 MimeType=application/x-bittorrent;
 Categories=Network;FileTransfer;P2P;GTK;
+X-Ubuntu-Gettext-Domain=transmission
}}}

In summary, for packages in `main` we strip the translations out of the .desktop files, and gnome-panel (TODO: is this the right package?, TODO: how is this done in KDE?) has a patch to load a translation from the .mo file. It basically uses that key to figure out where to get the translation from.

The preferred way to implement this is either through `debian/patches` or by using the [[http://packages.ubuntu.com/search?searchon=contents&keywords=langpack.mk&mode=exactfilename&suite=jaunty&arch=any|langpack.mk]] rule if the package uses CDBS.

 * [[LangpacksDesktopfiles|Original specification]]
 * [[LangpacksDesktopfilesKDE|Original specification for KDE]]

== The import queue ==

All translation templates (.pot files) and translations (.po) end up in the Launchpad Translations import queue before being imported into Launchpad.

Some of the import queues:

 * [[https://translations.launchpad.net/ubuntu/hardy/+imports?field.filter_extension=pot&field.filter_status=NEEDS_REVIEW|Hardy]]
 * [[https://translations.launchpad.net/ubuntu/intrepid/+imports?field.filter_extension=pot&field.filter_status=NEEDS_REVIEW|Intrepid]]
 * [[https://translations.launchpad.net/ubuntu/jaunty/+imports?field.filter_extension=pot&field.filter_status=NEEDS_REVIEW|Jaunty]]
 * [[https://translations.launchpad.net/ubuntu/karmic/+imports?field.filter_extension=pot&field.filter_status=NEEDS_REVIEW|Karmic]]

Templates generally get approved automatically, but sometimes there is some manual work involved in approving them. The [[https://launchpad.net/~ubuntu-translation-coordinator|Ubuntu Translations Coordinators Team]] manages the import queue. We've got a [[ubuntu-translation-coordinator@lists.launchpad.net|mailing list]] where issues can be discussed and we welcome the help of any community members experienced with translations.

== General Advice ==
Line 118: Line 178:

* For GNOME packages:
Line 122: Line 184:
Note: ''this is only worth trying if the package uses intltool for i18n (i.e. look for intltool.m4 in the top-level source directory)''

* For GNU packages:

* For KDE packages:
Line 124: Line 192:
== Kubuntu-specific notes ==

== Additional notes on packages not using the Gettext format ==

=== Mozilla ===

=== OpenOffice.org ===

THIS IS CURRENTLY A DRAFT

Translations in Ubuntu (from a developer perspective)

This page tries to outline

  • how Ubuntu deals with translations (and i18n in general) from a developer's perspective
  • which tools are interesting for developers to make sure that translations and i18n work fine

General information

Be sure to read TranslationLifecycle in the translations wiki pages for a general overview of how translations work in Ubuntu.

Language Packs

General

Packages in main and restricted don't contain translations (*.mo) files themselves, they are stripped during the build on the Launchpad buildds and put into language-pack-* packages instead. This is done in an attempt to bundle the translations you're interested in and cut down the occupied space.

Note: once a package is promoted to main, it only needs to be rebuilt the first time after promotion so that pkgbinarymangler can strip the translations. After this, import to Launchpad Translations and export in language packs "will just happen".

Comparing the contents of a package built by Launchpad Soyuz and a locally built one:

daniel@bert:~$ debdiff --nocontrol gcalctool_5.27.2-0ubuntu1_amd64.deb /var/cache/pbuilder/result/gcalctool_5.27.2-0ubuntu1_amd64.deb 
[The following lists of changes regard files as different if they have
different names, permissions or owners.]

Files in second .deb but not in first
-------------------------------------
-rw-r--r--  root/root   /usr/share/locale/af/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/am/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/ar/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/as/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/ast/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/az/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/be/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/be@latin/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/bg/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/bn/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/bn_IN/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/bs/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/ca/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/ca@valencia/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/cs/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/cy/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/da/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/de/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/dz/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/el/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/en_CA/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/en_GB/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/en_US/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/es/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/et/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/eu/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/fa/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/fi/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/fr/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/ga/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/gl/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/gu/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/he/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/hi/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/hr/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/hu/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/id/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/it/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/ja/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/ka/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/kn/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/ko/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/ku/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/lt/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/lv/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/mai/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/mg/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/mk/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/ml/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/mn/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/mr/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/ms/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/nb/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/ne/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/nl/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/nn/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/oc/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/or/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/pa/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/pl/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/pt/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/pt_BR/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/ro/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/ru/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/rw/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/si/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/sk/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/sl/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/sq/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/sr/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/sr@latin/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/sv/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/ta/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/te/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/th/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/tk/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/tr/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/uk/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/vi/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/xh/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/zh_CN/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/zh_HK/LC_MESSAGES/gcalctool.mo
-rw-r--r--  root/root   /usr/share/locale/zh_TW/LC_MESSAGES/gcalctool.mo
daniel@bert:~$ 

Translations Templates

For pkgstriptranslations (in the pkgbinarymangler package) to do the job right, please make sure that your package in main or restricted builds a .pot during the build. It does not necessarily need to be shipped in the source or in the binary package. Generating it during the build is good enough. This can be achieved by running the following in debian/rules:

* For GNOME packages:

cd po; intltool-update -p

If there's more than one ./po/ directory (or it has a different name), please make sure to adjust the call above.

* For KDE packages:

TODO

* For GNU packages:

TODO: check

make update-po

Desktop Entries

Translations of desktop entries (.desktop files) are also stripped out and included in language packs.

This is done by adding the X-Ubuntu-Gettext-Domain additional key. As an example for this key in action, here's how it is done in the Transmission source package in Jaunty (from the 20_add_X-Ubuntu-Gettext-Domain.diff patch):

Index: transmission-1.40-2ubuntu1/gtk/transmission.desktop.in
===================================================================
--- transmission-1.40-2ubuntu1.orig/gtk/transmission.desktop.in 2008-12-09 18:57:13.000000000 +0000
+++ transmission-1.40-2ubuntu1/gtk/transmission.desktop.in      2008-12-09 18:58:54.000000000 +0000
@@ -9,3 +9,4 @@
 Type=Application
 MimeType=application/x-bittorrent;
 Categories=Network;FileTransfer;P2P;GTK;
+X-Ubuntu-Gettext-Domain=transmission

In summary, for packages in main we strip the translations out of the .desktop files, and gnome-panel (TODO: is this the right package?, TODO: how is this done in KDE?) has a patch to load a translation from the .mo file. It basically uses that key to figure out where to get the translation from.

The preferred way to implement this is either through debian/patches or by using the langpack.mk rule if the package uses CDBS.

The import queue

All translation templates (.pot files) and translations (.po) end up in the Launchpad Translations import queue before being imported into Launchpad.

Some of the import queues:

Templates generally get approved automatically, but sometimes there is some manual work involved in approving them. The Ubuntu Translations Coordinators Team manages the import queue. We've got a mailing list where issues can be discussed and we welcome the help of any community members experienced with translations.

General Advice

If you want to make sure that your packages translations are set up correctly, try running:

* For GNOME packages:

cd po; intltool-update -m

and be sure to either fix the issues or report them upstream.

Note: this is only worth trying if the package uses intltool for i18n (i.e. look for intltool.m4 in the top-level source directory)

* For GNU packages:

* For KDE packages:

Sometimes empty .po files caused packages to build from source.

Kubuntu-specific notes

Additional notes on packages not using the Gettext format

Mozilla

OpenOffice.org


CategoryUbuntuDevelopment

UbuntuDevelopment/Internationalisation (last edited 2010-08-18 14:21:17 by 140)