| <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML i18n//EN"> | |
| <!-- | |
| Copyright (C) 2004-2005, 2012 Gora Mohanty. | |
| Written by Gora Mohanty <gora_mohanty@yahoo.co.in>, 2004. | |
| This manual is covered by the GNU FDL. Permission is granted to copy, | |
| distribute and/or modify this document under the terms of the | |
| GNU Free Documentation License (FDL), version 1.2. | |
| A copy of the license is at | |
| <https://www.gnu.org/licenses/old-licenses/fdl-1.2>. | |
| --> | |
| <!--Converted with jLaTeX2HTML 2002-2-1 (1.70) JA patch-1.4 | |
| patched version by: Kenshi Muto, Debian Project. | |
| LaTeX2HTML 2002-2-1 (1.70), | |
| original version by: Nikos Drakos, CBLU, University of Leeds | |
| * revised and updated by: Marcus Hennecke, Ross Moore, Herb Swan | |
| * with significant contributions from: | |
| Jens Lippmann, Marek Rouchal, Martin Wilck and others --> | |
| <HTML> | |
| <HEAD> | |
| <TITLE>A tutorial on Native Language Support using GNU gettext</TITLE> | |
| <META NAME="description" CONTENT="A tutorial on Native Language Support using GNU gettext"> | |
| <META NAME="keywords" CONTENT="memo"> | |
| <META NAME="resource-type" CONTENT="document"> | |
| <META NAME="distribution" CONTENT="global"> | |
| <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8"> | |
| <META NAME="Generator" CONTENT="jLaTeX2HTML v2002-2-1 JA patch-1.4"> | |
| <META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css"> | |
| <!-- | |
| <LINK REL="STYLESHEET" HREF="memo.css"> | |
| --> | |
| </HEAD> | |
| <BODY > | |
| <!--Navigation Panel | |
| <DIV CLASS="navigation"> | |
| <IMG WIDTH="81" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="next_inactive" | |
| SRC="file:/usr/share/latex2html/icons/nx_grp_g.png"> | |
| <IMG WIDTH="26" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="up" | |
| SRC="file:/usr/share/latex2html/icons/up_g.png"> | |
| <IMG WIDTH="63" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="previous" | |
| SRC="file:/usr/share/latex2html/icons/prev_g.png"> | |
| <BR> | |
| <BR><BR></DIV> | |
| End of Navigation Panel--> | |
| <H1 ALIGN="CENTER">A tutorial on Native Language Support using GNU gettext</H1><DIV CLASS="author_info"> | |
| <P ALIGN="CENTER"><STRONG>G. Mohanty</STRONG></P> | |
| <P ALIGN="CENTER"><STRONG>Revision 0.3: 24 July 2004</STRONG></P> | |
| </DIV> | |
| <H3>Abstract:</H3> | |
| <DIV CLASS="ABSTRACT"> | |
| The use of the GNU <TT>gettext</TT> utilities to implement support for native | |
| languages is described here. Though, the language to be supported is | |
| considered to be Oriya, the method is generally applicable. Likewise, while | |
| Linux was used as the platform here, any system using GNU <TT>gettext</TT> should work | |
| in a similar fashion. | |
| <P> | |
| We go through a step-by-step description of how to make on-screen messages | |
| from a toy program to appear in Oriya instead of English; starting from the | |
| programming and ending with the user's viewpoint. Some discussion is also made | |
| of how to go about the task of translation. | |
| </DIV> | |
| <P> | |
| <H1><A NAME="SECTION00010000000000000000"> | |
| Introduction</A> | |
| </H1> | |
| Currently, both commercial and free computer software is typically written and | |
| documented in English. Till recently, little effort was expended towards | |
| allowing them to interact with the user in languages other than English, thus | |
| leaving the non-English speaking world at a disadvantage. However, that | |
| changed with the release of the GNU <TT>gettext</TT> utilities, and nowadays most GNU | |
| programs are written within a framework that allows easy translation of the | |
| program message to languages other than English. Provided that translations | |
| are available, the language used by the program to interact with the user can | |
| be set at the time of running it. <TT>gettext</TT> manages to achieve this seemingly | |
| miraculous task in a manner that simplifies the work of both the programmer | |
| and the translator, and, more importantly, allows them to work independently | |
| of each other. | |
| <P> | |
| This article describes how to support native languages under a system using | |
| the GNU <TT>gettext</TT> utilities. While it should be applicable to other versions of | |
| <TT>gettext</TT>, the one actually used for the examples here is version | |
| 0.12.1. Another system, called <TT>catgets</TT>, described in the X/Open | |
| Portability Guide, is also in use, but we shall not discuss that here. | |
| <P> | |
| <H1><A NAME="SECTION00020000000000000000"> | |
| A simple example</A> | |
| </H1> | |
| <A NAME="sec:simple"></A>Our first example of using <TT>gettext</TT> will be the good old Hello World program, | |
| whose sole function is to print the phrase “Hello, world!” to the terminal. | |
| The internationalized version of this program might be saved in hello.c as: | |
| <PRE> | |
| 1 #include <libintl.h> | |
| 2 #include <locale.h> | |
| 3 #include <stdio.h> | |
| 4 #include <stdlib.h> | |
| 5 int main(void) | |
| 6 { | |
| 7 setlocale( LC_ALL, "" ); | |
| 8 bindtextdomain( "hello", "/usr/share/locale" ); | |
| 9 textdomain( "hello" ); | |
| 10 printf( gettext( "Hello, world!\n" ) ); | |
| 11 exit(0); | |
| 12 } | |
| </PRE> | |
| Of course, a real program would check the return values of the functions and | |
| try to deal with any errors, but we have omitted that part of the code for | |
| clarity. Compile as usual with <TT>gcc -o hello hello.c</TT>. The program should | |
| be linked to the GNU libintl library, but as this is part of the GNU C | |
| library, this is done automatically for you under Linux, and other systems | |
| using glibc. | |
| <H2><A NAME="SECTION00021000000000000000"> | |
| The programmer's viewpoint</A> | |
| </H2> | |
| As expected, when the <TT>hello</TT> executable is run under the default locale | |
| (usually the C locale) it prints “Hello, world!” in the terminal. Besides | |
| some initial setup work, the only additional burden faced by the programmer is | |
| to replace any string to be printed with <TT>gettext(string)</TT>, i.e., to | |
| instead pass the string as an argument to the <TT>gettext</TT> function. For lazy | |
| people like myself, the amount of extra typing can be reduced even further by | |
| a CPP macro, e.g., put this at the beginning of the source code file, | |
| <PRE> | |
| #define _(STRING) gettext(STRING) | |
| </PRE> | |
| and then use <TT>_(string)</TT> instead of <TT>gettext(string)</TT>. | |
| <P> | |
| Let us dissect the program line-by-line. | |
| <OL> | |
| <LI><TT>locale.h</TT> defines C data structures used to hold locale | |
| information, and is needed by the <TT>setlocale</TT> function. <TT>libintl.h</TT> | |
| prototypes the GNU text utilities functions, and is needed here by | |
| <TT>bindtextdomain</TT>, <TT>gettext</TT>, and <TT>textdomain</TT>. | |
| </LI> | |
| <LI>The call to <TT>setlocale</TT> () on line 7, with LC_ALL as the first argument | |
| and an empty string as the second one, initializes the entire current locale | |
| of the program as per environment variables set by the user. In other words, | |
| the program locale is initialized to match that of the user. For details see | |
| “man <TT>setlocale</TT>.” | |
| </LI> | |
| <LI>The <TT>bindtextdomain</TT> function on line 8 sets the base directory for the | |
| message catalogs for a given message domain. A message domain is a set of | |
| translatable messages, with every software package typically having its own | |
| domain. Here, we have used “hello” as the name of the message domain for | |
| our toy program. As the second argument, /usr/share/locale, is the default | |
| system location for message catalogs, what we are saying here is that we are | |
| going to place the message catalog in the default system directory. Thus, we | |
| could have dispensed with the call to <TT>bindtextdomain</TT> here, and this | |
| function is useful only if the message catalogs are installed in a | |
| non-standard place, e.g., a packaged software distribution might have | |
| the catalogs under a po/ directory under its own main directory. See “man | |
| <TT>bindtextdomain</TT>” for details. | |
| </LI> | |
| <LI>The <TT>textdomain</TT> call on line 9 sets the message domain of the current | |
| program to “hello,” i.e., the name that we are using for our example | |
| program. “man textdomain” will give usage details for the function. | |
| </LI> | |
| <LI>Finally, on line 10, we have replaced what would normally have been, | |
| <PRE> | |
| printf( "Hello, world!\n" ); | |
| </PRE> | |
| with, | |
| <PRE> | |
| printf( gettext( "Hello, world!\n" ) ); | |
| </PRE> | |
| (If you are unfamiliar with C, the <!-- MATH | |
| $\backslash$ | |
| --> | |
| <SPAN CLASS="MATH">\</SPAN>n at the end of the string | |
| produces a newline at the end of the output.) This simple modification to all | |
| translatable strings allows the translator to work independently from the | |
| programmer. <TT>gettextize</TT> eases the task of the programmer in adapting a | |
| package to use GNU <TT>gettext</TT> for the first time, or to upgrade to a newer | |
| version of <TT>gettext</TT>. | |
| </LI> | |
| </OL> | |
| <H2><A NAME="SECTION00022000000000000000"> | |
| Extracting translatable strings</A> | |
| </H2> | |
| Now, it is time to extract the strings to be translated from the program | |
| source code. This is achieved with <TT>xgettext</TT>, which can be invoked as follows: | |
| <PRE><FONT color="red"> | |
| xgettext -d hello -o hello.pot hello.c | |
| </FONT></PRE> | |
| This processes the source code in hello.c, saving the output in hello.pot (the | |
| argument to the -o option). | |
| The message domain for the program should be specified as the argument | |
| to the -d option, and should match the domain specified in the call to | |
| <TT>textdomain</TT> (on line 9 of the program source). Other details on how to use | |
| <TT>gettext</TT> can be found from “man gettext.” | |
| <P> | |
| A .pot (portable object template) file is used as the basis for translating | |
| program messages into any language. To start translation, one can simply copy | |
| hello.pot to oriya.po (this preserves the template file for later translation | |
| into a different language). However, the preferred way to do this is by | |
| use of the <TT>msginit</TT> program, which takes care of correctly setting up some | |
| default values, | |
| <PRE><FONT color="red"> | |
| msginit -l or_IN -o oriya.po -i hello.pot | |
| </FONT></PRE> | |
| Here, the -l option defines the locale (an Oriya locale should have been | |
| installed on your system), and the -i and -o options define the input and | |
| output files, respectively. If there is only a single .pot file in the | |
| directory, it will be used as the input file, and the -i option can be | |
| omitted. For me, the oriya.po file produced by <TT>msginit</TT> would look like: | |
| <PRE> | |
| # Oriya translations for PACKAGE package. | |
| # Copyright (C) 2004 THE PACKAGE'S COPYRIGHT HOLDER | |
| # This file is distributed under the same license as the PACKAGE package. | |
| # Gora Mohanty <gora_mohanty@yahoo.co.in>, 2004. | |
| # | |
| msgid "" | |
| msgstr "" | |
| "Project-Id-Version: PACKAGE VERSION\n" | |
| "Report-Msgid-Bugs-To: \n" | |
| "POT-Creation-Date: 2004-06-22 02:22+0530\n" | |
| "PO-Revision-Date: 2004-06-22 02:38+0530\n" | |
| "Last-Translator: Gora Mohanty <gora_mohanty@yahoo.co.in>\n" | |
| "Language-Team: Oriya\n" | |
| "MIME-Version: 1.0\n" | |
| "Content-Type: text/plain; charset=UTF-8\n" | |
| "Content-Transfer-Encoding: 8bit\n" | |
| #: hello.c:10 | |
| msgid "Hello, world!\n" | |
| msgstr "" | |
| </PRE> | |
| <TT>msginit</TT> prompted for my email address, and probably obtained my real name | |
| from the system password file. It also filled in values such as the revision | |
| date, language, character set, presumably using information from the or_IN | |
| locale. | |
| <P> | |
| It is important to respect the format of the entries in the .po (portable | |
| object) file. Each entry has the following structure: | |
| <PRE> | |
| WHITE-SPACE | |
| # TRANSLATOR-COMMENTS | |
| #. AUTOMATIC-COMMENTS | |
| #: REFERENCE... | |
| #, FLAG... | |
| msgid UNTRANSLATED-STRING | |
| msgstr TRANSLATED-STRING | |
| </PRE> | |
| where, the initial white-space (spaces, tabs, newlines,...), and all | |
| comments might or might not exist for a particular entry. Comment lines start | |
| with a '#' as the first character, and there are two kinds: (i) manually | |
| added translator comments, that have some white-space immediately following the | |
| '#,' and (ii) automatic comments added and maintained by the <TT>gettext</TT> tools, | |
| with a non-white-space character after the '#.' The <TT>msgid</TT> line contains | |
| the untranslated (English) string, if there is one for that PO file entry, and | |
| the <TT>msgstr</TT> line is where the translated string is to be entered. More on | |
| this later. For details on the format of PO files see gettext::Basics::PO | |
| Files:: in the Emacs info-browser (see Appdx. <A HREF="#sec:emacs-info">A</A> for an | |
| introduction to using the info-browser in Emacs). | |
| <H2><A NAME="SECTION00023000000000000000"> | |
| Making translations</A> | |
| </H2> | |
| The oriya.po file can then be edited to add the translated Oriya | |
| strings. While the editing can be carried out in any editor if one is careful | |
| to follow the PO file format, there are several editors that ease the task of | |
| editing PO files, among them being po-mode in Emacs, <TT>kbabel</TT>, gtranslator, | |
| poedit, etc. Appdx. <A HREF="#sec:pofile-editors">B</A> describes features of some of | |
| these editors. | |
| <P> | |
| The first thing to do is fill in the comments at the beginning and the header | |
| entry, parts of which have already been filled in by <TT>msginit</TT>. The lines in | |
| the header entry are pretty much self-explanatory, and details can be found in | |
| the gettext::Creating::Header Entry:: info node. After that, the remaining | |
| work consists of typing the Oriya text that is to serve as translations for | |
| the corresponding English string. For the <TT>msgstr</TT> line in each of the | |
| remaining entries, add the translated Oriya text between the double quotes; | |
| the translation corresponding to the English phrase in the <TT>msgid</TT> string | |
| for the entry. For example, for the phrase “Hello world!<!-- MATH | |
| $\backslash$ | |
| --> | |
| <SPAN CLASS="MATH">\</SPAN>n” in | |
| oriya.po, we could enter “ନମସ୍କାର<!-- MATH | |
| $\backslash$ | |
| --> | |
| <SPAN CLASS="MATH">\</SPAN>n”. The final | |
| oriya.po file might look like: | |
| <PRE> | |
| # Oriya translations for hello example package. | |
| # Copyright (C) 2004 Gora Mohanty | |
| # This file is distributed under the same license as the hello example package. | |
| # Gora Mohanty <gora_mohanty@yahoo.co.in>, 2004. | |
| # | |
| msgid "" | |
| msgstr "" | |
| "Project-Id-Version: oriya\n" | |
| "Report-Msgid-Bugs-To: \n" | |
| "POT-Creation-Date: 2004-06-22 02:22+0530\n" | |
| "PO-Revision-Date: 2004-06-22 10:54+0530\n" | |
| "Last-Translator: Gora Mohanty <gora_mohanty@yahoo.co.in>\n" | |
| "Language-Team: Oriya\n" | |
| "MIME-Version: 1.0\n" | |
| "Content-Type: text/plain; charset=UTF-8\n" | |
| "Content-Transfer-Encoding: 8bit\n" | |
| "X-Generator: KBabel 1.3\n" | |
| #: hello.c:10 | |
| msgid "Hello, world!\n" | |
| msgstr "ନମସ୍କାର\n" | |
| </PRE> | |
| <P> | |
| For editing PO files, I have found the <TT>kbabel</TT> editor suits me the best. The | |
| only problem is that while Oriya text can be entered directly into <TT>kbabel</TT> | |
| using the xkb Oriya keyboard layouts [<A | |
| HREF="memo.html#xkb-oriya-layout">1</A>] and the entries | |
| are saved properly, the text is not displayed correctly in the <TT>kbabel</TT> window | |
| if it includes conjuncts. Emacs po-mode is a little restrictive, but strictly | |
| enforces conformance with the PO file format. The main problem with it is that | |
| it does not seem currently possible to edit Oriya text in Emacs. <TT>yudit</TT> | |
| is the best at editing Oriya text, but does not ensure that the PO file format | |
| is followed. You can play around a bit with these editors to find one that | |
| suits your personal preferences. One possibility might be to first edit the | |
| header entry with <TT>kbabel</TT> or Emacs po-mode, and then use <TT>yudit</TT> to enter | |
| the Oriya text on the <TT>msgstr</TT> lines. | |
| <H2><A NAME="SECTION00024000000000000000"> | |
| Message catalogs</A> | |
| </H2> | |
| <A NAME="sec:catalog"></A>After completing the translations in the oriya.po file, it must be compiled to | |
| a binary format that can be quickly loaded by the <TT>gettext</TT> tools. To do that, | |
| use: | |
| <PRE><FONT color="red"> | |
| msgfmt -c -v -o hello.mo oriya.po | |
| </FONT></PRE> | |
| The -c option does detailed checking of the PO file format, -v makes the | |
| program verbose, and the output filename is given by the argument to the -o | |
| option. Note that the base of the output filename should match the message | |
| domain given in the first arguments to <TT>bindtextdomain</TT> and <TT>textdomain</TT> on | |
| lines 8 and 9 of the example program in Sec. <A HREF="#sec:simple">2</A>. The .mo | |
| (machine object) file should be stored in the location whose base directory is | |
| given by the second argument to <TT>bindtextdomain</TT>. The final location of the | |
| file will be in the sub-directory LL/LC_MESSAGES or LL_CC/LC_MESSAGES under | |
| the base directory, where LL stands for a language, and CC for a country. For | |
| example, as we have chosen the standard location, /usr/share/locale, for our | |
| base directory, and for us the language and country strings are “or” and | |
| “IN,” respectively, we will place hello.mo in /usr/share/locale/or_IN. Note | |
| that you will need super-user privilege to copy hello.mo to this system | |
| directory. Thus, | |
| <PRE><FONT color="red"> | |
| mkdir -p /usr/share/locale/or_IN/LC_MESSAGES | |
| cp hello.mo /usr/share/locale/or_IN/LC_MESSAGES | |
| </FONT></PRE> | |
| <H2><A NAME="SECTION00025000000000000000"> | |
| The user's viewpoint</A> | |
| </H2> | |
| Once the message catalogs have been properly installed, any user on the system | |
| can use the Oriya version of the Hello World program, provided an Oriya locale | |
| is available. First, change your locale with, | |
| <PRE><FONT color="red"> | |
| echo $LANG | |
| export LANG=or_IN | |
| </FONT></PRE> | |
| The first statement shows you the current setting of your locale (this is | |
| usually en_US, and you will need it to reset the default locale at the end), | |
| while the second one sets it to an Oriya locale. | |
| <P> | |
| A Unicode-capable terminal emulator is needed to view Oriya output | |
| directly. The new versions of both gnome-terminal and konsole (the KDE | |
| terminal emulator) are Unicode-aware. I will focus on gnome-terminal as it | |
| seems to have better support for internationalization. gnome-terminal needs to | |
| be told that the bytes arriving are UTF-8 encoded multibyte sequences. This | |
| can be done by (a) choosing Terminal <TT>-></TT> Character Coding <TT>-></TT> | |
| Unicode (UTF-8), or (b) typing “/bin/echo -n -e | |
| '<!-- MATH | |
| $\backslash$ | |
| --> | |
| <SPAN CLASS="MATH">\</SPAN>033%<!-- MATH | |
| $\backslash$ | |
| --> | |
| <SPAN CLASS="MATH">\</SPAN>G'” in the terminal, or (c) by running | |
| /bin/unicode_start. Likewise, you can revert to the default locale by (a) | |
| choosing Terminal <TT>-></TT> Character Coding <TT>-></TT> Current Locale | |
| (ISO-8859-1), or (b) “/bin/echo -n -e '<!-- MATH | |
| $\backslash$ | |
| --> | |
| <SPAN CLASS="MATH">\</SPAN>033%<!-- MATH | |
| $\backslash$ | |
| --> | |
| <SPAN CLASS="MATH">\</SPAN>@',” or | |
| (c) by running /bin/unicode_stop. Now, running the example program (after | |
| compiling with gcc as described in Sec. <A HREF="#sec:simple">2</A>) with, | |
| <PRE><FONT color="red"> | |
| ./hello | |
| </FONT></PRE> | |
| should give you output in Oriya. Please note that conjuncts will most likely | |
| be displayed with a “halant” as the terminal probably does not render Indian | |
| language fonts correctly. Also, as most terminal emulators assume fixed-width | |
| fonts, the results are hardly likely to be aesthetically appealing. | |
| <P> | |
| An alternative is to save the program output in a file, and view it with | |
| <TT>yudit</TT> which will render the glyphs correctly. Thus, | |
| <PRE><FONT color="red"> | |
| ./hello > junk | |
| yudit junk | |
| </FONT></PRE> | |
| Do not forget to reset the locale before resuming usual work in the | |
| terminal. Else, your English characters might look funny. | |
| <P> | |
| While all this should give the average user some pleasure in being able to see | |
| Oriya output from a program without a whole lot of work, it should be kept in | |
| mind that we are still far from our desired goal. Hopefully, one day the | |
| situation will be such that rather than deriving special pleasure from it, | |
| users take it for granted that Oriya should be available and are upset | |
| otherwise. | |
| <P> | |
| <H1><A NAME="SECTION00030000000000000000"> | |
| Adding complications: program upgrade</A> | |
| </H1> | |
| The previous section presented a simple example of how Oriya language support | |
| could be added to a C program. Like all programs, we might now wish to further | |
| enhance it. For example, we could include a greeting to the user by adding | |
| another <TT>printf</TT> statement after the first one. Our new hello.c source | |
| code might look like this: | |
| <PRE> | |
| 1 #include <libintl.h> | |
| 2 #include <locale.h> | |
| 3 #include <stdio.h> | |
| 4 #include <stdlib.h> | |
| 5 int main(void) | |
| 6 { | |
| 7 setlocale( LC_ALL, "" ); | |
| 8 bindtextdomain( "hello", "/usr/share/locale" ); | |
| 9 textdomain( "hello" ); | |
| 10 printf( gettext( "Hello, world!\n" ) ); | |
| 11 printf( gettext( "How are you\n" ) ); | |
| 12 exit(0); | |
| 13 } | |
| </PRE> | |
| For such a small change, it would be simple enough to just repeat the above | |
| cycle of extracting the relevant English text, translating it to Oriya, and | |
| preparing a new message catalog. We can even simplify the work by cutting and | |
| pasting most of the old oriya.po file into the new one. However, real programs | |
| will have thousands of such strings, and we would like to be able to translate | |
| only the changed strings, and have the <TT>gettext</TT> utilities handle the drudgery | |
| of combining the new translations with the old ones. This is indeed possible. | |
| <H2><A NAME="SECTION00031000000000000000"> | |
| Merging old and new translations</A> | |
| </H2> | |
| As before, extract the translatable strings from hello.c to a new portable | |
| object template file, hello-new.pot, using <TT>xgettext</TT>, | |
| <PRE><FONT color="red"> | |
| xgettext -d hello -o hello-new.pot hello.c | |
| </FONT></PRE> | |
| Now, we use a new program, <TT>msgmerge</TT>, to merge the existing .po file with | |
| translations into the new template file, viz., | |
| <PRE><FONT color="red"> | |
| msgmerge -U oriya.po hello-new.pot | |
| </FONT></PRE> | |
| The -U option updates the existing | |
| .po file, oriya.po. We could have chosen to instead create a new .po file by | |
| using “-o <SPAN CLASS="MATH"><</SPAN>filename<SPAN CLASS="MATH">></SPAN>” instead of -U. The updated .po file will still | |
| have the old translations embedded in it, and new entries with untranslated | |
| <TT>msgid</TT> lines. For us, the new lines in oriya.po will look like, | |
| <PRE> | |
| #: hello.c:11 | |
| msgid "How are you?\n" | |
| msgstr "" | |
| </PRE> | |
| For the new translation, we could use, “ଆପଣ | |
| କିପରି ଅଛନ୍ତି?” in | |
| place of the English phrase “How are you?” The updated oriya.po file, | |
| including the translation might look like: | |
| <PRE> | |
| # Oriya translations for hello example package. | |
| # Copyright (C) 2004 Gora Mohanty | |
| # This file is distributed under the same license as the hello examplepackage. | |
| # Gora Mohanty <gora_mohanty@yahoo.co.in>, 2004. | |
| # | |
| msgid "" | |
| msgstr "" | |
| "Project-Id-Version: oriya\n" | |
| "Report-Msgid-Bugs-To: \n" | |
| "POT-Creation-Date: 2004-06-23 14:30+0530\n" | |
| "PO-Revision-Date: 2004-06-22 10:54+0530\n" | |
| "Last-Translator: Gora Mohanty <gora_mohanty@yahoo.co.in>\n" | |
| "Language-Team: Oriya\n" | |
| "MIME-Version: 1.0\n" | |
| "Content-Type: text/plain; charset=UTF-8\n" | |
| "Content-Transfer-Encoding: 8bit\n" | |
| "X-Generator: KBabel 1.3\n" | |
| #: hello.c:10 | |
| msgid "Hello, world!\n" | |
| msgstr "ନମସ୍କାର\n" | |
| #: hello.c:11 | |
| msgid "How are you?\n" | |
| msgstr "ଆପଣ କିପରି ଅଛନ୍ତି?\n" | |
| </PRE> | |
| <P> | |
| Compile oriya.po to a machine object file, and install in the appropriate | |
| place as in Sec. <A HREF="#sec:catalog">2.4</A>. Thus, | |
| <PRE><FONT color="red"> | |
| msgfmt -c -v -o hello.mo oriya.po | |
| mkdir -p /usr/share/locale/or_IN/LC_MESSAGES | |
| cp hello.mo /usr/share/locale/or_IN/LC_MESSAGES | |
| </FONT></PRE> | |
| You can test the Oriya output as above, after recompiling hello.c and running | |
| it in an Oriya locale. | |
| <P> | |
| <H1><A NAME="SECTION00040000000000000000"> | |
| More about <TT>gettext</TT> </A> | |
| </H1> | |
| The GNU <TT>gettext</TT> info pages provide a well-organized and complete description | |
| of the <TT>gettext</TT> utilities and their usage for enabling Native Language | |
| Support. One should, at the very least, read the introductory material at | |
| gettext::Introduction::, and the suggested references in | |
| gettext::Conclusion::References::. Besides the <TT>gettext</TT> utilities described in | |
| this document, various other programs to manipulate .po files are discussed in | |
| gettext:Manipulating::. Finally, support for programming languages other than | |
| C/C++ is discussed in gettext::Programming Languages::. | |
| <P> | |
| <H1><A NAME="SECTION00050000000000000000"> | |
| The work of translation</A> | |
| </H1> | |
| Besides the obvious program message strings that have been the sole focus of | |
| our discussion here, there are many other things that require translation, | |
| including GUI messages, command-line option strings, configuration files, | |
| program documentation, etc. Besides these obvious aspects, there are a | |
| significant number of programs and/or scripts that are automatically generated | |
| by other programs. These generated programs might also themselves require | |
| translation. So, in any effort to provide support for a given native language, | |
| carrying out the translation and keeping up with program updates becomes a | |
| major part of the undertaking, requiring a continuing commitment from the | |
| language team. A plan has been outlined for the Oriya localization | |
| project [<A | |
| HREF="memo.html#url:oriya-trans-plan">2</A>]. | |
| <P> | |
| <H1><A NAME="SECTION00060000000000000000"> | |
| Acknowledgments</A> | |
| </H1> | |
| Extensive use has obviously been made of the GNU <TT>gettext</TT> manual in preparing | |
| this document. I have also been helped by an article in the Linux | |
| Journal [<A | |
| HREF="memo.html#url:lj-translation">3</A>]. | |
| <P> | |
| This work is part of the project for enabling the use of Oriya under Linux. I | |
| thank my uncle, N. M. Pattnaik, for conceiving of the project. We have all | |
| benefited from the discussions amidst the group of people working on this | |
| project. On the particular issue of translation, the help of H. R. Pansari, | |
| A. Nayak, and M. Chand is much appreciated. | |
| <H1><A NAME="SECTION00070000000000000000"> | |
| The Emacs info browser</A> | |
| </H1> | |
| <A NAME="sec:emacs-info"></A>You can start up Emacs from the command-line by typing “emacs,” or “emacs | |
| <SPAN CLASS="MATH"><</SPAN>filename<SPAN CLASS="MATH">></SPAN>.” It can be started from the menu in some desktops, e.g., on | |
| my GNOME desktop, it is under Main Menu <TT>-></TT> Programming <TT>-></TT> | |
| Emacs. If you are unfamiliar with Emacs, a tutorial can be started by typing | |
| “C-h t” in an Emacs window, or from the Help item in the menubar at the | |
| top. Emacs makes extensive use of the Control (sometimes labelled as “CTRL” | |
| or “CTL”) and Meta (sometimes labelled as “Edit” or “Alt”) keys. In | |
| Emacs parlance, a hyphenated sequence, such as “C-h” means to press the | |
| Control and ‘h’ key simultaneously, while “C-h t” would mean to press the | |
| Control and ‘h’ key together, release them, and press the ‘t’ key. Similarly, | |
| “M-x” is used to indicate that the Meta and ‘x’ keys should be pressed at | |
| the same time. | |
| <P> | |
| The info browser can be started by typing “C-h i” in Emacs. The first time | |
| you do this, it will briefly list some commands available inside the info | |
| browser, and present you with a menu of major topics. Each menu item, or | |
| cross-reference is hyperlinked to the appropriate node, and you can visit that | |
| node either by moving the cursor to the item and pressing Enter, or by | |
| clicking on it with the middle mouse button. To get to the <TT>gettext</TT> menu items, | |
| you can either scroll down to the line, | |
| <PRE> | |
| * gettext: (gettext). GNU gettext utilities. | |
| </PRE> | |
| and visit that node. Or, as it is several pages down, you can locate it using | |
| “I-search.” Type “C-s” to enter “I-search” which will then prompt you | |
| for a string in the mini-buffer at the bottom of the window. This is an | |
| incremental search, so that Emacs will keep moving you forward through the | |
| buffer as you are entering your search string. If you have reached the last | |
| occurrence of the search string in the current buffer, you will get a message | |
| saying “Failing I-search: ...” on pressing “C-s.” At that point, press | |
| “C-s” again to resume the search at the beginning of the buffer. Likewise, | |
| “C-r” incrementally searches backwards from the present location. | |
| <P> | |
| Info nodes are listed in this document with a “::” separator, so | |
| that one can go to the gettext::Creating::Header Entry:: by visiting the | |
| “gettext” node from the main info menu, navigating to the “Creating” | |
| node, and following that to the “Header Entry” node. | |
| <P> | |
| A stand-alone info browser, independent of Emacs, is also available on many | |
| systems. Thus, the <TT>gettext</TT> info page can also be accessed by typing | |
| “info gettext” in a terminal. <TT>xinfo</TT> is an X application serving as an | |
| info browser, so that if it is installed, typing “xinfo gettext” from the | |
| command line will open a new browser window with the <TT>gettext</TT> info page. | |
| <P> | |
| <H1><A NAME="SECTION00080000000000000000"> | |
| PO file editors</A> | |
| </H1> | |
| <A NAME="sec:pofile-editors"></A>While the <TT>yudit</TT> editor is adequate for our present purposes, and we are | |
| planning on using that as it is platform-independent, and currently the best | |
| at rendering Oriya. This section describes some features of some editors that | |
| are specialized for editing PO files under Linux. This is still work in | |
| progress, as I am in the process of trying out different editors before | |
| settling on one. The ones considered here are: Emacs in po-mode, <TT>poedit</TT>, | |
| <TT>kbabel</TT>, and <TT>gtranslator</TT>. | |
| <H2><A NAME="SECTION00081000000000000000"> | |
| Emacs PO mode</A> | |
| </H2> | |
| Emacs should automatically enter po-mode when you load a .po file, as | |
| indicated by “PO” in the modeline at the bottom. The window is made | |
| read-only, so that you can edit the .po file only through special commands. A | |
| description of Emacs po-mode can be found under the gettext::Basics info node, | |
| or type ‘h’ or ‘?’ in a po-mode window for a list of available commands. While | |
| I find Emacs po-mode quite restrictive, this is probably due to unfamiliarity | |
| with it. Its main advantage is that it imposes rigid conformance to the PO | |
| file format, and checks the file format when closing the .po file | |
| buffer. Emacs po-mode is not useful for Oriya translation, as I know of no way | |
| to directly enter Oriya text under Emacs. | |
| <H2><A NAME="SECTION00082000000000000000"> | |
| poedit</A> | |
| </H2> | |
| XXX: in preparation. | |
| <H2><A NAME="SECTION00083000000000000000"> | |
| KDE: the kbabel editor</A> | |
| </H2> | |
| <TT>kbabel</TT> [<A | |
| HREF="memo.html#url:kbabel">4</A>] is a more user-friendly and configurable editor than | |
| either of Emacs po-mode or <TT>poedit</TT>. It is integrated into KDE, and offers | |
| extensive contextual help. Besides support for various PO file features, it | |
| has a plugin framework for dictionaries, that allows consistency checks and | |
| translation suggestions. | |
| <H2><A NAME="SECTION00084000000000000000"> | |
| GNOME: the gtranslator editor</A> | |
| </H2> | |
| XXX: in preparation. | |
| <H2><A NAME="SECTION00090000000000000000"> | |
| Bibliography</A> | |
| </H2><DL COMPACT><DD><P></P><DT><A NAME="xkb-oriya-layout">1</A> | |
| <DD> | |
| G. Mohanty, | |
| <BR>A practical primer for using Oriya under Linux, v0.3, | |
| <BR><TT><A NAME="tex2html1" | |
| HREF="http://oriya.sarovar.org/docs/getting_started/index.html">http://oriya.sarovar.org/docs/getting_started/index.html</A></TT>, 2004, | |
| <BR>Sec. 6.2 describes the xkb layouts for Oriya. | |
| <P></P><DT><A NAME="url:oriya-trans-plan">2</A> | |
| <DD> | |
| G. Mohanty, | |
| <BR>A plan for Oriya localization, v0.1, | |
| <BR><TT><A NAME="tex2html2" | |
| HREF="http://oriya.sarovar.org/docs/translation_plan/index.html">http://oriya.sarovar.org/docs/translation_plan/index.html</A></TT>, | |
| 2004. | |
| <P></P><DT><A NAME="url:lj-translation">3</A> | |
| <DD> | |
| Linux Journal article on internationalization, | |
| <BR><TT><A NAME="tex2html3" | |
| HREF="https://www.linuxjournal.com/article/3023">https://www.linuxjournal.com/article/3023</A></TT>. | |
| <P></P><DT><A NAME="url:kbabel">4</A> | |
| <DD> | |
| Features of the kbabel editor, | |
| <BR><TT><A NAME="tex2html4" | |
| HREF="http://i18n.kde.org/tools/kbabel/features.html">http://i18n.kde.org/tools/kbabel/features.html</A></TT>. | |
| </DL> | |
| <H1><A NAME="SECTION000100000000000000000"> | |
| About this document ...</A> | |
| </H1> | |
| <STRONG>A tutorial on Native Language Support using GNU gettext</STRONG><P> | |
| This document was generated using the | |
| <A HREF="http://www.latex2html.org/"><STRONG>LaTeX</STRONG>2<tt>HTML</tt></A> translator Version 2002-2-1 (1.70) | |
| <P> | |
| Copyright © 1993, 1994, 1995, 1996, | |
| <A HREF="http://cbl.leeds.ac.uk/nikos/personal.html">Nikos Drakos</A>, | |
| Computer Based Learning Unit, University of Leeds. | |
| <BR>Copyright © 1997, 1998, 1999, | |
| <A HREF="http://www.maths.mq.edu.au/~ross/">Ross Moore</A>, | |
| Mathematics Department, Macquarie University, Sydney. | |
| <P> | |
| The command line arguments were: <BR> | |
| <STRONG>latex2html</STRONG> <TT>-no_math -html_version 4.0,math,unicode,i18n,tables -split 0 memo</TT> | |
| <P> | |
| The translation was initiated by Gora Mohanty on 2004-07-24 | |
| <DIV CLASS="navigation"><HR> | |
| <!--Navigation Panel | |
| <IMG WIDTH="81" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="next_inactive" | |
| SRC="file:/usr/share/latex2html/icons/nx_grp_g.png"> | |
| <IMG WIDTH="26" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="up" | |
| SRC="file:/usr/share/latex2html/icons/up_g.png"> | |
| <IMG WIDTH="63" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="previous" | |
| SRC="file:/usr/share/latex2html/icons/prev_g.png"> | |
| <BR></DIV> | |
| End of Navigation Panel--> | |
| <ADDRESS> | |
| Gora Mohanty | |
| 2004-07-24 | |
| </ADDRESS> | |
| </BODY> | |
| </HTML> |