Author: Naveen Kumar
Internationalization (i18n) refers to an application's/package's support for multiple languages. This support comes from a kind of generalization on part of application/package that helps Localize it in different languages.
Localization or (l10n) here refers to the process of adapting, translating or customising that application/package for a particular locale.
Locale
is a term used to define a set of information corresponding to a given language & country. A locale
information is used by a software application (or operating system) to exhibit a localised behaviour. This localised behaviour is in the form of displaying Application's/package's text in local language or other things pertaining to a locale convention such as localized date, currency format, color conventions, etc.
In this tutorial we will cover i18n & l10n only with respect to text i18n/l10n.
Gettext framework is one such approach to do text i18n. It refers to a collection of tools which are used to internationalize and localize an application/package. Apart from internationalization of applications/packages these tools assist in translating the strings on menus, messages boxes or icons on the applications in the language that the user is interested in.
For a detailed information on text internationalization you can refer to Gettext manual
We assume that you use emacs. Do the following:
- Run emacs
- type ALT+x
- type
ansi-term
in the lower window - press return key twice one after the other
Development Environment
To internationalize an application we need a set of development tools. This is a one-time-only setup,
installed by running those commands from a system administration (root
) account:
yum install @development-tools yum groupinstall <langname>-support
The <langname> above refers to the name of your language. For hindi
I would write something like:
yum groupinstall hindi-support
Hello World
Let us write our first Hello World program:
#include<stdio.h> int main() { printf("Hello World\n"); return 0; }
The output generated by this program is entirely in English. Now in order to make is localizable in different languages, we need to generalize it in some way, such that, when a user selects a particular locale, the application switches its strings/output to the language described by that locale. For example if I select a locale hi_IN.UTF-8 (hi->Hindi; IN->India; encoding->UTF-8), the output/strings of this application should be displayed in Hindi.
Internationalizing Hello World
Now in order to generalize/internationalize this "Hello World" program one needs to ensure that whe
#include<libintl.h> #include<locale.h> #include<stdio.h> #define _(String) gettext (String) int main() { setlocale(LC_ALL,""); bindtextdomain("helloworld","/usr/share/locale"); textdomain("helloworld"); printf(_("Hello World\n")); return 0; }
Create a new directory named po/
mkdir po/hi/
Extract the strings in a POT (helloworld.pot) file using the following command
xgettext -d helloworld -o po/helloworld.pot -k_ -s helloworld.c
A new file helloworld.pot
will be created inside directory po/
PO(T) files
helloworld.pot
# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-04-27 17:42+0530\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" #: helloworld.c:13 #, c-format msgid "Hello World\n" msgstr ""
create a directory with the name of your language. This language name should be probably a 2-digit/3-digit code listed for your language in ISO 639-1. Use http://www.loc.gov/standards/iso639-2/php/code_list.php for reference. A directory with the same name should also be listed at /usr/share/locale
. For hindi I would do this:
mkdir hi/ cp helloworld.pot hi/helloworld.po
Open an Editor of your choice and translate your file in the following manner:
# Hello World Localization. # Copyright (C) 2010 Naveen Kumar # This file is distributed under the same license as the PACKAGE package. # Naveen Kumar <nkumar@redhat.com>, 2010. # msgid "" msgstr "" "Project-Id-Version: helloworld 1.0\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-04-27 18:31+0530\n" "PO-Revision-Date: 2010-04-27 18:53+0530\n" "Last-Translator: Naveen Kumar <nkumar@redhat.com>\n" "Language-Team: Hindi <LL@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" #: helloworld.c:13 #, c-format msgid "Hello World" msgstr "नमस्कार दुनिया\n"
In root
mode copy the po file to your <lang>/LC_MESSAGES directory at /usr/share/locale/hi/LC_MESSAGES. For Hindi I would do something like this:
cp helloworld.mo /usr/share/locale/hi/LC_MESSAGES/
Compile your C file
gcc -o helloworld helloworld.c
Run something like
LANG=hi_IN ./helloworld
You should see message (Hello World) appear in your local language:
[nkumar@localhost]$ LANG=hi_IN [nkumar@localhost]$ ./helloworld नमस्कार दुनिया
.....editing on-----