Gettext: Difference between revisions
Fixed link to point to 'GNU Project' instead of 'GNU' |
Removed superfluous 'the' |
||
Line 3: | Line 3: | ||
{{Infobox software |
{{Infobox software |
||
| name = gettext |
| name = gettext |
||
| developer = [[GNU Project| |
| developer = [[GNU Project|GNU Project]] |
||
| latest release version = 0.18 |
| latest release version = 0.18 |
||
| latest release date = May 9, 2010 |
| latest release date = May 9, 2010 |
Revision as of 02:31, 4 September 2011
![]() | This article is written like a manual or guide. (May 2009) |
Developer(s) | GNU Project |
---|---|
Stable release | 0.18
/ May 9, 2010 |
Repository | |
Operating system | Cross-Platform |
Type | Development, translation |
License | LGPL (library), GPL (tools), GFDL/GPL (docs) |
Website | http://www.gnu.org/software/gettext/ |
gettext is the GNU internationalization and localization (i18n) library. It is commonly used for writing multilingual programs.
Programming
Source code is first modified to use the GNU gettext calls. This is, for most programming languages, done by wrapping strings that the user will see in the gettext function. To save on typing time, and to reduce code clutter, this function is commonly aliased to _, so that the C code
printf(gettext("My name is %s.\n"), my_name);
would become
printf(_("My name is %s.\n"), my_name);
gettext then uses the supplied strings as keys for looking up alternative translations, and will return the original string when no translation is available. This is in contrast to systems like catgets or the use of LoadString under Microsoft Windows where a programmatic ID (often an integer) is used.
In addition to C, GNU gettext has the following implementations: C++, Objective-C, Pascal/Object Pascal, sh script, bash script, Python, GNU CLISP, Emacs Lisp, librep, GNU Smalltalk, Java, GNU awk, Haskell, wxWidgets (through the wxLocale class), YCP (the YaST2 language), Tcl, Perl, PHP, Pike, Ruby, and R. Usage is similar to C for most of these.
xgettext is run on the sources to produce a .pot file, or template, which contains a list of all the translatable strings extracted from the sources. For the above, an entry in the .pot file would look like:
#: src/name.c:36 msgid "My name is %s.\n" msgstr ""
Comments placed directly before strings thus marked are made available as hints to translators by helper programs:
/// TRANSLATORS: Please leave %s as it is, because it is needed by the program.
/// Thank you for contributing to this project.
printf(_("My name is %s.\n"), my_name);
In this example, the comment starts with /// and is given to xgettext when building the .pot template file to allow it to extract the comments for the translators.
xgettext --add-comments=/
The .pot file looks like this with the comment:
#. TRANSLATORS: Please leave %s as it is, because it is needed by the program. #. Thank you for contributing to this project. #: src/name.c:36 msgid "My name is %s.\n" msgstr ""
Translating
The translator derives a .po file from the template using the msginit program, then fills out the translations. msginit initializes the translations so, for instance, if we wish to create a French language translation, we'd run
msginit --locale=fr --input=name.pot
This will create fr.po. A sample entry would look like
#: src/name.c:36 msgid "My name is %s.\n" msgstr ""
The translator will have to edit these, either by hand or with a translation tool like Poedit, or Emacs with its editing mode for .po files. When they are done, the entry will look like this:
#: src/name.c:36 msgid "My name is %s.\n" msgstr "Je m'appelle %s.\n"
Finally, the .po files are compiled into binary .mo files with msgfmt. These are now ready for distribution with the software package.
Running
The user, on Unix-type systems, sets the environment variable LC_MESSAGES
, and the program will display strings in the selected language, if there is an .mo
file for it.
See also
External links
- Gettext homepage
- Localizing PHP web sites using gettext - explanation and examples.
- Gettext Commons - Java gettext utilities
- Autotools Tutorial
- gted - GetText EDitor and tools integration
- poEdit - cross-platform PO file editor (MIT license)
- Gorm PO file editor (MPL 1.1)
- Better PO Editor
- Okapi PO filter
- GNU Gettext for Delphi and Gorm, a PO file editor by the same author
- stackoverflow answer to 'Complete C++ i18n gettext() “hello world” example.'