Internationalisation

Differences between revisions 7 and 41 (spanning 34 versions)
Revision 7 as of 2009-06-17 13:59:35
Size: 11974
Editor: p54A12C5F
Comment: Added some more info from Danilo's feedback
Revision 41 as of 2010-08-18 14:21:17
Size: 2654
Editor: 140
Comment: Added new sections
Deletions are marked like this. Additions are marked like this.
Line 4: Line 4:
THIS IS CURRENTLY A DRAFT = Ubuntu Internationalization Guide =
Line 6: Line 6:
= Translations in Ubuntu (from a developer perspective) = This document 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
Line 8: Line 10:
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
== Getting Started ==
 * '''Primer''': This [[/InternationalizationPrimer|internationalization primer]] is a great place to get started.
Line 14: Line 15:
Be sure to read TranslationLifecycle in the [[TranslatingUbuntu|translations wiki pages]] for a general overview of how translations work in Ubuntu. ''General information on the tools and processes related to the internationalization of Ubuntu''
Line 16: Line 17:
<<Anchor(LanguagePacks)>>
== 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.
 * [[TranslationLifecycle|Overview of the translations lifecycle]]
 * [[/Glossary|Glossary of i18n-related terms]]
Line 21: 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". == Coding ==
Line 23: Line 22:
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.]
''Information on writing or modifying internationalized applications for Ubuntu''
Line 29: Line 24:
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:~$
}}}
 * [[/Coding|Internationalization of source code]]
Line 117: Line 26:
== Packaging ==
Line 118: Line 28:
=== 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`:
''Information on packaging internationalized packages for Ubuntu''
Line 121: Line 30:
* For GNOME packages:  * [[/Packaging|Internationalization of packages]]
Line 123: Line 32:
{{{
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.''
== Documentation ==
Line 127: Line 34:
* For KDE packages: ''Information on how to adapt the build system to include internationalization support''
Line 129: Line 36:
TODO  * [[/Docs|Internationalization of documentation]]
Line 131: Line 38:
* For GNU packages: == Build system ==
Line 133: Line 40:
TODO: check ''Information on how to adapt the build system to include internationalization support''
Line 135: Line 42:
{{{
make update-po}}}
 * [[/Build|Adding internationalization support to the build system]]
Line 138: Line 44:
== Desktop Entries == == Translation process ==
Line 140: Line 46:
Translations of [[http://www.freedesktop.org/wiki/Specifications/desktop-entry-spec|desktop entries]] (.desktop files) are also stripped out and included in language packs. ''General overview of the Ubuntu translation process, from the translators' point of view''
Line 142: Line 48:
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):  * [[/TranslationProcess|Overview of the Ubuntu translation process]]
Line 144: Line 50:
{{{
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
}}}
== Launchpad ==
Line 156: Line 52:
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. ''Information related to Launchpad and internationalization, including best practices on how to handle translations of hosted projects''
 * [[https://help.launchpad.net/Translations/YourProject/BestPractices|Best practices on how to set up a project for translation in Launchpad]]
 * [[/Launchpad|Internationalization considerations and general information on Launchpad]]
 * [[http://blog.launchpad.net/translations/automatic-template-generation | Automatic generation of translation templates from branch]]
Line 158: Line 57:
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. == Recipes ==
Line 160: Line 59:
 * [[LangpacksDesktopfiles|Original specification]]
 * [[LangpacksDesktopfilesKDE|Original specification for KDE]]
''Recipes on how to perform common tasks related to internationalization''
Line 163: Line 61:
== 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 ==
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 ===
 * [[/RecipeVerifyingTranslationUploads|Verifying translation uploads]]
 * [[/RecipeIntltoolCheck|Checking out translations in intltool-based packages]]
 * [[/RecipeAddingLPI|Adding Launchpad integration for bugs, help and translations to an application's help menu]]
Line 202: Line 67:
CategoryTranslations

Ubuntu Internationalization Guide

This document 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

Getting Started

General information

General information on the tools and processes related to the internationalization of Ubuntu

Coding

Information on writing or modifying internationalized applications for Ubuntu

Packaging

Information on packaging internationalized packages for Ubuntu

Documentation

Information on how to adapt the build system to include internationalization support

Build system

Information on how to adapt the build system to include internationalization support

Translation process

General overview of the Ubuntu translation process, from the translators' point of view

Launchpad

Information related to Launchpad and internationalization, including best practices on how to handle translations of hosted projects

Recipes

Recipes on how to perform common tasks related to internationalization


CategoryUbuntuDevelopment CategoryTranslations

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