jpayne@68
|
1 <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML i18n//EN">
|
jpayne@68
|
2 <!--
|
jpayne@68
|
3 Copyright (C) 2004-2005, 2012 Gora Mohanty.
|
jpayne@68
|
4 Written by Gora Mohanty <gora_mohanty@yahoo.co.in>, 2004.
|
jpayne@68
|
5
|
jpayne@68
|
6 This manual is covered by the GNU FDL. Permission is granted to copy,
|
jpayne@68
|
7 distribute and/or modify this document under the terms of the
|
jpayne@68
|
8 GNU Free Documentation License (FDL), version 1.2.
|
jpayne@68
|
9 A copy of the license is at
|
jpayne@68
|
10 <https://www.gnu.org/licenses/old-licenses/fdl-1.2>.
|
jpayne@68
|
11 -->
|
jpayne@68
|
12
|
jpayne@68
|
13 <!--Converted with jLaTeX2HTML 2002-2-1 (1.70) JA patch-1.4
|
jpayne@68
|
14 patched version by: Kenshi Muto, Debian Project.
|
jpayne@68
|
15 LaTeX2HTML 2002-2-1 (1.70),
|
jpayne@68
|
16 original version by: Nikos Drakos, CBLU, University of Leeds
|
jpayne@68
|
17 * revised and updated by: Marcus Hennecke, Ross Moore, Herb Swan
|
jpayne@68
|
18 * with significant contributions from:
|
jpayne@68
|
19 Jens Lippmann, Marek Rouchal, Martin Wilck and others -->
|
jpayne@68
|
20 <HTML>
|
jpayne@68
|
21 <HEAD>
|
jpayne@68
|
22 <TITLE>A tutorial on Native Language Support using GNU gettext</TITLE>
|
jpayne@68
|
23 <META NAME="description" CONTENT="A tutorial on Native Language Support using GNU gettext">
|
jpayne@68
|
24 <META NAME="keywords" CONTENT="memo">
|
jpayne@68
|
25 <META NAME="resource-type" CONTENT="document">
|
jpayne@68
|
26 <META NAME="distribution" CONTENT="global">
|
jpayne@68
|
27
|
jpayne@68
|
28 <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
|
jpayne@68
|
29 <META NAME="Generator" CONTENT="jLaTeX2HTML v2002-2-1 JA patch-1.4">
|
jpayne@68
|
30 <META HTTP-EQUIV="Content-Style-Type" CONTENT="text/css">
|
jpayne@68
|
31
|
jpayne@68
|
32 <!--
|
jpayne@68
|
33 <LINK REL="STYLESHEET" HREF="memo.css">
|
jpayne@68
|
34 -->
|
jpayne@68
|
35
|
jpayne@68
|
36 </HEAD>
|
jpayne@68
|
37
|
jpayne@68
|
38 <BODY >
|
jpayne@68
|
39
|
jpayne@68
|
40 <!--Navigation Panel
|
jpayne@68
|
41 <DIV CLASS="navigation">
|
jpayne@68
|
42 <IMG WIDTH="81" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="next_inactive"
|
jpayne@68
|
43 SRC="file:/usr/share/latex2html/icons/nx_grp_g.png">
|
jpayne@68
|
44 <IMG WIDTH="26" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="up"
|
jpayne@68
|
45 SRC="file:/usr/share/latex2html/icons/up_g.png">
|
jpayne@68
|
46 <IMG WIDTH="63" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="previous"
|
jpayne@68
|
47 SRC="file:/usr/share/latex2html/icons/prev_g.png">
|
jpayne@68
|
48 <BR>
|
jpayne@68
|
49 <BR><BR></DIV>
|
jpayne@68
|
50 End of Navigation Panel-->
|
jpayne@68
|
51
|
jpayne@68
|
52 <H1 ALIGN="CENTER">A tutorial on Native Language Support using GNU gettext</H1><DIV CLASS="author_info">
|
jpayne@68
|
53
|
jpayne@68
|
54 <P ALIGN="CENTER"><STRONG>G. Mohanty</STRONG></P>
|
jpayne@68
|
55 <P ALIGN="CENTER"><STRONG>Revision 0.3: 24 July 2004</STRONG></P>
|
jpayne@68
|
56 </DIV>
|
jpayne@68
|
57
|
jpayne@68
|
58 <H3>Abstract:</H3>
|
jpayne@68
|
59 <DIV CLASS="ABSTRACT">
|
jpayne@68
|
60 The use of the GNU <TT>gettext</TT> utilities to implement support for native
|
jpayne@68
|
61 languages is described here. Though, the language to be supported is
|
jpayne@68
|
62 considered to be Oriya, the method is generally applicable. Likewise, while
|
jpayne@68
|
63 Linux was used as the platform here, any system using GNU <TT>gettext</TT> should work
|
jpayne@68
|
64 in a similar fashion.
|
jpayne@68
|
65
|
jpayne@68
|
66 <P>
|
jpayne@68
|
67 We go through a step-by-step description of how to make on-screen messages
|
jpayne@68
|
68 from a toy program to appear in Oriya instead of English; starting from the
|
jpayne@68
|
69 programming and ending with the user's viewpoint. Some discussion is also made
|
jpayne@68
|
70 of how to go about the task of translation.
|
jpayne@68
|
71 </DIV>
|
jpayne@68
|
72 <P>
|
jpayne@68
|
73 <H1><A NAME="SECTION00010000000000000000">
|
jpayne@68
|
74 Introduction</A>
|
jpayne@68
|
75 </H1>
|
jpayne@68
|
76 Currently, both commercial and free computer software is typically written and
|
jpayne@68
|
77 documented in English. Till recently, little effort was expended towards
|
jpayne@68
|
78 allowing them to interact with the user in languages other than English, thus
|
jpayne@68
|
79 leaving the non-English speaking world at a disadvantage. However, that
|
jpayne@68
|
80 changed with the release of the GNU <TT>gettext</TT> utilities, and nowadays most GNU
|
jpayne@68
|
81 programs are written within a framework that allows easy translation of the
|
jpayne@68
|
82 program message to languages other than English. Provided that translations
|
jpayne@68
|
83 are available, the language used by the program to interact with the user can
|
jpayne@68
|
84 be set at the time of running it. <TT>gettext</TT> manages to achieve this seemingly
|
jpayne@68
|
85 miraculous task in a manner that simplifies the work of both the programmer
|
jpayne@68
|
86 and the translator, and, more importantly, allows them to work independently
|
jpayne@68
|
87 of each other.
|
jpayne@68
|
88
|
jpayne@68
|
89 <P>
|
jpayne@68
|
90 This article describes how to support native languages under a system using
|
jpayne@68
|
91 the GNU <TT>gettext</TT> utilities. While it should be applicable to other versions of
|
jpayne@68
|
92 <TT>gettext</TT>, the one actually used for the examples here is version
|
jpayne@68
|
93 0.12.1. Another system, called <TT>catgets</TT>, described in the X/Open
|
jpayne@68
|
94 Portability Guide, is also in use, but we shall not discuss that here.
|
jpayne@68
|
95
|
jpayne@68
|
96 <P>
|
jpayne@68
|
97
|
jpayne@68
|
98 <H1><A NAME="SECTION00020000000000000000">
|
jpayne@68
|
99 A simple example</A>
|
jpayne@68
|
100 </H1>
|
jpayne@68
|
101 <A NAME="sec:simple"></A>Our first example of using <TT>gettext</TT> will be the good old Hello World program,
|
jpayne@68
|
102 whose sole function is to print the phrase “Hello, world!” to the terminal.
|
jpayne@68
|
103 The internationalized version of this program might be saved in hello.c as:
|
jpayne@68
|
104 <PRE>
|
jpayne@68
|
105 1 #include <libintl.h>
|
jpayne@68
|
106 2 #include <locale.h>
|
jpayne@68
|
107 3 #include <stdio.h>
|
jpayne@68
|
108 4 #include <stdlib.h>
|
jpayne@68
|
109 5 int main(void)
|
jpayne@68
|
110 6 {
|
jpayne@68
|
111 7 setlocale( LC_ALL, "" );
|
jpayne@68
|
112 8 bindtextdomain( "hello", "/usr/share/locale" );
|
jpayne@68
|
113 9 textdomain( "hello" );
|
jpayne@68
|
114 10 printf( gettext( "Hello, world!\n" ) );
|
jpayne@68
|
115 11 exit(0);
|
jpayne@68
|
116 12 }
|
jpayne@68
|
117 </PRE>
|
jpayne@68
|
118 Of course, a real program would check the return values of the functions and
|
jpayne@68
|
119 try to deal with any errors, but we have omitted that part of the code for
|
jpayne@68
|
120 clarity. Compile as usual with <TT>gcc -o hello hello.c</TT>. The program should
|
jpayne@68
|
121 be linked to the GNU libintl library, but as this is part of the GNU C
|
jpayne@68
|
122 library, this is done automatically for you under Linux, and other systems
|
jpayne@68
|
123 using glibc.
|
jpayne@68
|
124
|
jpayne@68
|
125 <H2><A NAME="SECTION00021000000000000000">
|
jpayne@68
|
126 The programmer's viewpoint</A>
|
jpayne@68
|
127 </H2>
|
jpayne@68
|
128 As expected, when the <TT>hello</TT> executable is run under the default locale
|
jpayne@68
|
129 (usually the C locale) it prints “Hello, world!” in the terminal. Besides
|
jpayne@68
|
130 some initial setup work, the only additional burden faced by the programmer is
|
jpayne@68
|
131 to replace any string to be printed with <TT>gettext(string)</TT>, i.e., to
|
jpayne@68
|
132 instead pass the string as an argument to the <TT>gettext</TT> function. For lazy
|
jpayne@68
|
133 people like myself, the amount of extra typing can be reduced even further by
|
jpayne@68
|
134 a CPP macro, e.g., put this at the beginning of the source code file,
|
jpayne@68
|
135 <PRE>
|
jpayne@68
|
136 #define _(STRING) gettext(STRING)
|
jpayne@68
|
137 </PRE>
|
jpayne@68
|
138 and then use <TT>_(string)</TT> instead of <TT>gettext(string)</TT>.
|
jpayne@68
|
139
|
jpayne@68
|
140 <P>
|
jpayne@68
|
141 Let us dissect the program line-by-line.
|
jpayne@68
|
142
|
jpayne@68
|
143 <OL>
|
jpayne@68
|
144 <LI><TT>locale.h</TT> defines C data structures used to hold locale
|
jpayne@68
|
145 information, and is needed by the <TT>setlocale</TT> function. <TT>libintl.h</TT>
|
jpayne@68
|
146 prototypes the GNU text utilities functions, and is needed here by
|
jpayne@68
|
147 <TT>bindtextdomain</TT>, <TT>gettext</TT>, and <TT>textdomain</TT>.
|
jpayne@68
|
148 </LI>
|
jpayne@68
|
149 <LI>The call to <TT>setlocale</TT> () on line 7, with LC_ALL as the first argument
|
jpayne@68
|
150 and an empty string as the second one, initializes the entire current locale
|
jpayne@68
|
151 of the program as per environment variables set by the user. In other words,
|
jpayne@68
|
152 the program locale is initialized to match that of the user. For details see
|
jpayne@68
|
153 “man <TT>setlocale</TT>.”
|
jpayne@68
|
154 </LI>
|
jpayne@68
|
155 <LI>The <TT>bindtextdomain</TT> function on line 8 sets the base directory for the
|
jpayne@68
|
156 message catalogs for a given message domain. A message domain is a set of
|
jpayne@68
|
157 translatable messages, with every software package typically having its own
|
jpayne@68
|
158 domain. Here, we have used “hello” as the name of the message domain for
|
jpayne@68
|
159 our toy program. As the second argument, /usr/share/locale, is the default
|
jpayne@68
|
160 system location for message catalogs, what we are saying here is that we are
|
jpayne@68
|
161 going to place the message catalog in the default system directory. Thus, we
|
jpayne@68
|
162 could have dispensed with the call to <TT>bindtextdomain</TT> here, and this
|
jpayne@68
|
163 function is useful only if the message catalogs are installed in a
|
jpayne@68
|
164 non-standard place, e.g., a packaged software distribution might have
|
jpayne@68
|
165 the catalogs under a po/ directory under its own main directory. See “man
|
jpayne@68
|
166 <TT>bindtextdomain</TT>” for details.
|
jpayne@68
|
167 </LI>
|
jpayne@68
|
168 <LI>The <TT>textdomain</TT> call on line 9 sets the message domain of the current
|
jpayne@68
|
169 program to “hello,” i.e., the name that we are using for our example
|
jpayne@68
|
170 program. “man textdomain” will give usage details for the function.
|
jpayne@68
|
171 </LI>
|
jpayne@68
|
172 <LI>Finally, on line 10, we have replaced what would normally have been,
|
jpayne@68
|
173 <PRE>
|
jpayne@68
|
174 printf( "Hello, world!\n" );
|
jpayne@68
|
175 </PRE>
|
jpayne@68
|
176 with,
|
jpayne@68
|
177 <PRE>
|
jpayne@68
|
178 printf( gettext( "Hello, world!\n" ) );
|
jpayne@68
|
179 </PRE>
|
jpayne@68
|
180 (If you are unfamiliar with C, the <!-- MATH
|
jpayne@68
|
181 $\backslash$
|
jpayne@68
|
182 -->
|
jpayne@68
|
183 <SPAN CLASS="MATH">\</SPAN>n at the end of the string
|
jpayne@68
|
184 produces a newline at the end of the output.) This simple modification to all
|
jpayne@68
|
185 translatable strings allows the translator to work independently from the
|
jpayne@68
|
186 programmer. <TT>gettextize</TT> eases the task of the programmer in adapting a
|
jpayne@68
|
187 package to use GNU <TT>gettext</TT> for the first time, or to upgrade to a newer
|
jpayne@68
|
188 version of <TT>gettext</TT>.
|
jpayne@68
|
189 </LI>
|
jpayne@68
|
190 </OL>
|
jpayne@68
|
191
|
jpayne@68
|
192 <H2><A NAME="SECTION00022000000000000000">
|
jpayne@68
|
193 Extracting translatable strings</A>
|
jpayne@68
|
194 </H2>
|
jpayne@68
|
195 Now, it is time to extract the strings to be translated from the program
|
jpayne@68
|
196 source code. This is achieved with <TT>xgettext</TT>, which can be invoked as follows:
|
jpayne@68
|
197 <PRE><FONT color="red">
|
jpayne@68
|
198 xgettext -d hello -o hello.pot hello.c
|
jpayne@68
|
199 </FONT></PRE>
|
jpayne@68
|
200 This processes the source code in hello.c, saving the output in hello.pot (the
|
jpayne@68
|
201 argument to the -o option).
|
jpayne@68
|
202 The message domain for the program should be specified as the argument
|
jpayne@68
|
203 to the -d option, and should match the domain specified in the call to
|
jpayne@68
|
204 <TT>textdomain</TT> (on line 9 of the program source). Other details on how to use
|
jpayne@68
|
205 <TT>gettext</TT> can be found from “man gettext.”
|
jpayne@68
|
206
|
jpayne@68
|
207 <P>
|
jpayne@68
|
208 A .pot (portable object template) file is used as the basis for translating
|
jpayne@68
|
209 program messages into any language. To start translation, one can simply copy
|
jpayne@68
|
210 hello.pot to oriya.po (this preserves the template file for later translation
|
jpayne@68
|
211 into a different language). However, the preferred way to do this is by
|
jpayne@68
|
212 use of the <TT>msginit</TT> program, which takes care of correctly setting up some
|
jpayne@68
|
213 default values,
|
jpayne@68
|
214 <PRE><FONT color="red">
|
jpayne@68
|
215 msginit -l or_IN -o oriya.po -i hello.pot
|
jpayne@68
|
216 </FONT></PRE>
|
jpayne@68
|
217 Here, the -l option defines the locale (an Oriya locale should have been
|
jpayne@68
|
218 installed on your system), and the -i and -o options define the input and
|
jpayne@68
|
219 output files, respectively. If there is only a single .pot file in the
|
jpayne@68
|
220 directory, it will be used as the input file, and the -i option can be
|
jpayne@68
|
221 omitted. For me, the oriya.po file produced by <TT>msginit</TT> would look like:
|
jpayne@68
|
222 <PRE>
|
jpayne@68
|
223 # Oriya translations for PACKAGE package.
|
jpayne@68
|
224 # Copyright (C) 2004 THE PACKAGE'S COPYRIGHT HOLDER
|
jpayne@68
|
225 # This file is distributed under the same license as the PACKAGE package.
|
jpayne@68
|
226 # Gora Mohanty <gora_mohanty@yahoo.co.in>, 2004.
|
jpayne@68
|
227 #
|
jpayne@68
|
228 msgid ""
|
jpayne@68
|
229 msgstr ""
|
jpayne@68
|
230 "Project-Id-Version: PACKAGE VERSION\n"
|
jpayne@68
|
231 "Report-Msgid-Bugs-To: \n"
|
jpayne@68
|
232 "POT-Creation-Date: 2004-06-22 02:22+0530\n"
|
jpayne@68
|
233 "PO-Revision-Date: 2004-06-22 02:38+0530\n"
|
jpayne@68
|
234 "Last-Translator: Gora Mohanty <gora_mohanty@yahoo.co.in>\n"
|
jpayne@68
|
235 "Language-Team: Oriya\n"
|
jpayne@68
|
236 "MIME-Version: 1.0\n"
|
jpayne@68
|
237 "Content-Type: text/plain; charset=UTF-8\n"
|
jpayne@68
|
238 "Content-Transfer-Encoding: 8bit\n"
|
jpayne@68
|
239
|
jpayne@68
|
240 #: hello.c:10
|
jpayne@68
|
241 msgid "Hello, world!\n"
|
jpayne@68
|
242 msgstr ""
|
jpayne@68
|
243 </PRE>
|
jpayne@68
|
244 <TT>msginit</TT> prompted for my email address, and probably obtained my real name
|
jpayne@68
|
245 from the system password file. It also filled in values such as the revision
|
jpayne@68
|
246 date, language, character set, presumably using information from the or_IN
|
jpayne@68
|
247 locale.
|
jpayne@68
|
248
|
jpayne@68
|
249 <P>
|
jpayne@68
|
250 It is important to respect the format of the entries in the .po (portable
|
jpayne@68
|
251 object) file. Each entry has the following structure:
|
jpayne@68
|
252 <PRE>
|
jpayne@68
|
253 WHITE-SPACE
|
jpayne@68
|
254 # TRANSLATOR-COMMENTS
|
jpayne@68
|
255 #. AUTOMATIC-COMMENTS
|
jpayne@68
|
256 #: REFERENCE...
|
jpayne@68
|
257 #, FLAG...
|
jpayne@68
|
258 msgid UNTRANSLATED-STRING
|
jpayne@68
|
259 msgstr TRANSLATED-STRING
|
jpayne@68
|
260 </PRE>
|
jpayne@68
|
261 where, the initial white-space (spaces, tabs, newlines,...), and all
|
jpayne@68
|
262 comments might or might not exist for a particular entry. Comment lines start
|
jpayne@68
|
263 with a '#' as the first character, and there are two kinds: (i) manually
|
jpayne@68
|
264 added translator comments, that have some white-space immediately following the
|
jpayne@68
|
265 '#,' and (ii) automatic comments added and maintained by the <TT>gettext</TT> tools,
|
jpayne@68
|
266 with a non-white-space character after the '#.' The <TT>msgid</TT> line contains
|
jpayne@68
|
267 the untranslated (English) string, if there is one for that PO file entry, and
|
jpayne@68
|
268 the <TT>msgstr</TT> line is where the translated string is to be entered. More on
|
jpayne@68
|
269 this later. For details on the format of PO files see gettext::Basics::PO
|
jpayne@68
|
270 Files:: in the Emacs info-browser (see Appdx. <A HREF="#sec:emacs-info">A</A> for an
|
jpayne@68
|
271 introduction to using the info-browser in Emacs).
|
jpayne@68
|
272
|
jpayne@68
|
273 <H2><A NAME="SECTION00023000000000000000">
|
jpayne@68
|
274 Making translations</A>
|
jpayne@68
|
275 </H2>
|
jpayne@68
|
276 The oriya.po file can then be edited to add the translated Oriya
|
jpayne@68
|
277 strings. While the editing can be carried out in any editor if one is careful
|
jpayne@68
|
278 to follow the PO file format, there are several editors that ease the task of
|
jpayne@68
|
279 editing PO files, among them being po-mode in Emacs, <TT>kbabel</TT>, gtranslator,
|
jpayne@68
|
280 poedit, etc. Appdx. <A HREF="#sec:pofile-editors">B</A> describes features of some of
|
jpayne@68
|
281 these editors.
|
jpayne@68
|
282
|
jpayne@68
|
283 <P>
|
jpayne@68
|
284 The first thing to do is fill in the comments at the beginning and the header
|
jpayne@68
|
285 entry, parts of which have already been filled in by <TT>msginit</TT>. The lines in
|
jpayne@68
|
286 the header entry are pretty much self-explanatory, and details can be found in
|
jpayne@68
|
287 the gettext::Creating::Header Entry:: info node. After that, the remaining
|
jpayne@68
|
288 work consists of typing the Oriya text that is to serve as translations for
|
jpayne@68
|
289 the corresponding English string. For the <TT>msgstr</TT> line in each of the
|
jpayne@68
|
290 remaining entries, add the translated Oriya text between the double quotes;
|
jpayne@68
|
291 the translation corresponding to the English phrase in the <TT>msgid</TT> string
|
jpayne@68
|
292 for the entry. For example, for the phrase “Hello world!<!-- MATH
|
jpayne@68
|
293 $\backslash$
|
jpayne@68
|
294 -->
|
jpayne@68
|
295 <SPAN CLASS="MATH">\</SPAN>n” in
|
jpayne@68
|
296 oriya.po, we could enter “ନମସ୍କାର<!-- MATH
|
jpayne@68
|
297 $\backslash$
|
jpayne@68
|
298 -->
|
jpayne@68
|
299 <SPAN CLASS="MATH">\</SPAN>n”. The final
|
jpayne@68
|
300 oriya.po file might look like:
|
jpayne@68
|
301 <PRE>
|
jpayne@68
|
302 # Oriya translations for hello example package.
|
jpayne@68
|
303 # Copyright (C) 2004 Gora Mohanty
|
jpayne@68
|
304 # This file is distributed under the same license as the hello example package.
|
jpayne@68
|
305 # Gora Mohanty <gora_mohanty@yahoo.co.in>, 2004.
|
jpayne@68
|
306 #
|
jpayne@68
|
307 msgid ""
|
jpayne@68
|
308 msgstr ""
|
jpayne@68
|
309 "Project-Id-Version: oriya\n"
|
jpayne@68
|
310 "Report-Msgid-Bugs-To: \n"
|
jpayne@68
|
311 "POT-Creation-Date: 2004-06-22 02:22+0530\n"
|
jpayne@68
|
312 "PO-Revision-Date: 2004-06-22 10:54+0530\n"
|
jpayne@68
|
313 "Last-Translator: Gora Mohanty <gora_mohanty@yahoo.co.in>\n"
|
jpayne@68
|
314 "Language-Team: Oriya\n"
|
jpayne@68
|
315 "MIME-Version: 1.0\n"
|
jpayne@68
|
316 "Content-Type: text/plain; charset=UTF-8\n"
|
jpayne@68
|
317 "Content-Transfer-Encoding: 8bit\n"
|
jpayne@68
|
318 "X-Generator: KBabel 1.3\n"
|
jpayne@68
|
319
|
jpayne@68
|
320 #: hello.c:10
|
jpayne@68
|
321 msgid "Hello, world!\n"
|
jpayne@68
|
322 msgstr "ନମସ୍କାର\n"
|
jpayne@68
|
323 </PRE>
|
jpayne@68
|
324
|
jpayne@68
|
325 <P>
|
jpayne@68
|
326 For editing PO files, I have found the <TT>kbabel</TT> editor suits me the best. The
|
jpayne@68
|
327 only problem is that while Oriya text can be entered directly into <TT>kbabel</TT>
|
jpayne@68
|
328 using the xkb Oriya keyboard layouts [<A
|
jpayne@68
|
329 HREF="memo.html#xkb-oriya-layout">1</A>] and the entries
|
jpayne@68
|
330 are saved properly, the text is not displayed correctly in the <TT>kbabel</TT> window
|
jpayne@68
|
331 if it includes conjuncts. Emacs po-mode is a little restrictive, but strictly
|
jpayne@68
|
332 enforces conformance with the PO file format. The main problem with it is that
|
jpayne@68
|
333 it does not seem currently possible to edit Oriya text in Emacs. <TT>yudit</TT>
|
jpayne@68
|
334 is the best at editing Oriya text, but does not ensure that the PO file format
|
jpayne@68
|
335 is followed. You can play around a bit with these editors to find one that
|
jpayne@68
|
336 suits your personal preferences. One possibility might be to first edit the
|
jpayne@68
|
337 header entry with <TT>kbabel</TT> or Emacs po-mode, and then use <TT>yudit</TT> to enter
|
jpayne@68
|
338 the Oriya text on the <TT>msgstr</TT> lines.
|
jpayne@68
|
339
|
jpayne@68
|
340 <H2><A NAME="SECTION00024000000000000000">
|
jpayne@68
|
341 Message catalogs</A>
|
jpayne@68
|
342 </H2>
|
jpayne@68
|
343 <A NAME="sec:catalog"></A>After completing the translations in the oriya.po file, it must be compiled to
|
jpayne@68
|
344 a binary format that can be quickly loaded by the <TT>gettext</TT> tools. To do that,
|
jpayne@68
|
345 use:
|
jpayne@68
|
346 <PRE><FONT color="red">
|
jpayne@68
|
347 msgfmt -c -v -o hello.mo oriya.po
|
jpayne@68
|
348 </FONT></PRE>
|
jpayne@68
|
349 The -c option does detailed checking of the PO file format, -v makes the
|
jpayne@68
|
350 program verbose, and the output filename is given by the argument to the -o
|
jpayne@68
|
351 option. Note that the base of the output filename should match the message
|
jpayne@68
|
352 domain given in the first arguments to <TT>bindtextdomain</TT> and <TT>textdomain</TT> on
|
jpayne@68
|
353 lines 8 and 9 of the example program in Sec. <A HREF="#sec:simple">2</A>. The .mo
|
jpayne@68
|
354 (machine object) file should be stored in the location whose base directory is
|
jpayne@68
|
355 given by the second argument to <TT>bindtextdomain</TT>. The final location of the
|
jpayne@68
|
356 file will be in the sub-directory LL/LC_MESSAGES or LL_CC/LC_MESSAGES under
|
jpayne@68
|
357 the base directory, where LL stands for a language, and CC for a country. For
|
jpayne@68
|
358 example, as we have chosen the standard location, /usr/share/locale, for our
|
jpayne@68
|
359 base directory, and for us the language and country strings are “or” and
|
jpayne@68
|
360 “IN,” respectively, we will place hello.mo in /usr/share/locale/or_IN. Note
|
jpayne@68
|
361 that you will need super-user privilege to copy hello.mo to this system
|
jpayne@68
|
362 directory. Thus,
|
jpayne@68
|
363 <PRE><FONT color="red">
|
jpayne@68
|
364 mkdir -p /usr/share/locale/or_IN/LC_MESSAGES
|
jpayne@68
|
365 cp hello.mo /usr/share/locale/or_IN/LC_MESSAGES
|
jpayne@68
|
366 </FONT></PRE>
|
jpayne@68
|
367
|
jpayne@68
|
368 <H2><A NAME="SECTION00025000000000000000">
|
jpayne@68
|
369 The user's viewpoint</A>
|
jpayne@68
|
370 </H2>
|
jpayne@68
|
371 Once the message catalogs have been properly installed, any user on the system
|
jpayne@68
|
372 can use the Oriya version of the Hello World program, provided an Oriya locale
|
jpayne@68
|
373 is available. First, change your locale with,
|
jpayne@68
|
374 <PRE><FONT color="red">
|
jpayne@68
|
375 echo $LANG
|
jpayne@68
|
376 export LANG=or_IN
|
jpayne@68
|
377 </FONT></PRE>
|
jpayne@68
|
378 The first statement shows you the current setting of your locale (this is
|
jpayne@68
|
379 usually en_US, and you will need it to reset the default locale at the end),
|
jpayne@68
|
380 while the second one sets it to an Oriya locale.
|
jpayne@68
|
381
|
jpayne@68
|
382 <P>
|
jpayne@68
|
383 A Unicode-capable terminal emulator is needed to view Oriya output
|
jpayne@68
|
384 directly. The new versions of both gnome-terminal and konsole (the KDE
|
jpayne@68
|
385 terminal emulator) are Unicode-aware. I will focus on gnome-terminal as it
|
jpayne@68
|
386 seems to have better support for internationalization. gnome-terminal needs to
|
jpayne@68
|
387 be told that the bytes arriving are UTF-8 encoded multibyte sequences. This
|
jpayne@68
|
388 can be done by (a) choosing Terminal <TT>-></TT> Character Coding <TT>-></TT>
|
jpayne@68
|
389 Unicode (UTF-8), or (b) typing “/bin/echo -n -e
|
jpayne@68
|
390 '<!-- MATH
|
jpayne@68
|
391 $\backslash$
|
jpayne@68
|
392 -->
|
jpayne@68
|
393 <SPAN CLASS="MATH">\</SPAN>033%<!-- MATH
|
jpayne@68
|
394 $\backslash$
|
jpayne@68
|
395 -->
|
jpayne@68
|
396 <SPAN CLASS="MATH">\</SPAN>G'” in the terminal, or (c) by running
|
jpayne@68
|
397 /bin/unicode_start. Likewise, you can revert to the default locale by (a)
|
jpayne@68
|
398 choosing Terminal <TT>-></TT> Character Coding <TT>-></TT> Current Locale
|
jpayne@68
|
399 (ISO-8859-1), or (b) “/bin/echo -n -e '<!-- MATH
|
jpayne@68
|
400 $\backslash$
|
jpayne@68
|
401 -->
|
jpayne@68
|
402 <SPAN CLASS="MATH">\</SPAN>033%<!-- MATH
|
jpayne@68
|
403 $\backslash$
|
jpayne@68
|
404 -->
|
jpayne@68
|
405 <SPAN CLASS="MATH">\</SPAN>@',” or
|
jpayne@68
|
406 (c) by running /bin/unicode_stop. Now, running the example program (after
|
jpayne@68
|
407 compiling with gcc as described in Sec. <A HREF="#sec:simple">2</A>) with,
|
jpayne@68
|
408 <PRE><FONT color="red">
|
jpayne@68
|
409 ./hello
|
jpayne@68
|
410 </FONT></PRE>
|
jpayne@68
|
411 should give you output in Oriya. Please note that conjuncts will most likely
|
jpayne@68
|
412 be displayed with a “halant” as the terminal probably does not render Indian
|
jpayne@68
|
413 language fonts correctly. Also, as most terminal emulators assume fixed-width
|
jpayne@68
|
414 fonts, the results are hardly likely to be aesthetically appealing.
|
jpayne@68
|
415
|
jpayne@68
|
416 <P>
|
jpayne@68
|
417 An alternative is to save the program output in a file, and view it with
|
jpayne@68
|
418 <TT>yudit</TT> which will render the glyphs correctly. Thus,
|
jpayne@68
|
419 <PRE><FONT color="red">
|
jpayne@68
|
420 ./hello > junk
|
jpayne@68
|
421 yudit junk
|
jpayne@68
|
422 </FONT></PRE>
|
jpayne@68
|
423 Do not forget to reset the locale before resuming usual work in the
|
jpayne@68
|
424 terminal. Else, your English characters might look funny.
|
jpayne@68
|
425
|
jpayne@68
|
426 <P>
|
jpayne@68
|
427 While all this should give the average user some pleasure in being able to see
|
jpayne@68
|
428 Oriya output from a program without a whole lot of work, it should be kept in
|
jpayne@68
|
429 mind that we are still far from our desired goal. Hopefully, one day the
|
jpayne@68
|
430 situation will be such that rather than deriving special pleasure from it,
|
jpayne@68
|
431 users take it for granted that Oriya should be available and are upset
|
jpayne@68
|
432 otherwise.
|
jpayne@68
|
433
|
jpayne@68
|
434 <P>
|
jpayne@68
|
435
|
jpayne@68
|
436 <H1><A NAME="SECTION00030000000000000000">
|
jpayne@68
|
437 Adding complications: program upgrade</A>
|
jpayne@68
|
438 </H1>
|
jpayne@68
|
439 The previous section presented a simple example of how Oriya language support
|
jpayne@68
|
440 could be added to a C program. Like all programs, we might now wish to further
|
jpayne@68
|
441 enhance it. For example, we could include a greeting to the user by adding
|
jpayne@68
|
442 another <TT>printf</TT> statement after the first one. Our new hello.c source
|
jpayne@68
|
443 code might look like this:
|
jpayne@68
|
444 <PRE>
|
jpayne@68
|
445 1 #include <libintl.h>
|
jpayne@68
|
446 2 #include <locale.h>
|
jpayne@68
|
447 3 #include <stdio.h>
|
jpayne@68
|
448 4 #include <stdlib.h>
|
jpayne@68
|
449 5 int main(void)
|
jpayne@68
|
450 6 {
|
jpayne@68
|
451 7 setlocale( LC_ALL, "" );
|
jpayne@68
|
452 8 bindtextdomain( "hello", "/usr/share/locale" );
|
jpayne@68
|
453 9 textdomain( "hello" );
|
jpayne@68
|
454 10 printf( gettext( "Hello, world!\n" ) );
|
jpayne@68
|
455 11 printf( gettext( "How are you\n" ) );
|
jpayne@68
|
456 12 exit(0);
|
jpayne@68
|
457 13 }
|
jpayne@68
|
458 </PRE>
|
jpayne@68
|
459 For such a small change, it would be simple enough to just repeat the above
|
jpayne@68
|
460 cycle of extracting the relevant English text, translating it to Oriya, and
|
jpayne@68
|
461 preparing a new message catalog. We can even simplify the work by cutting and
|
jpayne@68
|
462 pasting most of the old oriya.po file into the new one. However, real programs
|
jpayne@68
|
463 will have thousands of such strings, and we would like to be able to translate
|
jpayne@68
|
464 only the changed strings, and have the <TT>gettext</TT> utilities handle the drudgery
|
jpayne@68
|
465 of combining the new translations with the old ones. This is indeed possible.
|
jpayne@68
|
466
|
jpayne@68
|
467 <H2><A NAME="SECTION00031000000000000000">
|
jpayne@68
|
468 Merging old and new translations</A>
|
jpayne@68
|
469 </H2>
|
jpayne@68
|
470 As before, extract the translatable strings from hello.c to a new portable
|
jpayne@68
|
471 object template file, hello-new.pot, using <TT>xgettext</TT>,
|
jpayne@68
|
472 <PRE><FONT color="red">
|
jpayne@68
|
473 xgettext -d hello -o hello-new.pot hello.c
|
jpayne@68
|
474 </FONT></PRE>
|
jpayne@68
|
475 Now, we use a new program, <TT>msgmerge</TT>, to merge the existing .po file with
|
jpayne@68
|
476 translations into the new template file, viz.,
|
jpayne@68
|
477 <PRE><FONT color="red">
|
jpayne@68
|
478 msgmerge -U oriya.po hello-new.pot
|
jpayne@68
|
479 </FONT></PRE>
|
jpayne@68
|
480 The -U option updates the existing
|
jpayne@68
|
481 .po file, oriya.po. We could have chosen to instead create a new .po file by
|
jpayne@68
|
482 using “-o <SPAN CLASS="MATH"><</SPAN>filename<SPAN CLASS="MATH">></SPAN>” instead of -U. The updated .po file will still
|
jpayne@68
|
483 have the old translations embedded in it, and new entries with untranslated
|
jpayne@68
|
484 <TT>msgid</TT> lines. For us, the new lines in oriya.po will look like,
|
jpayne@68
|
485 <PRE>
|
jpayne@68
|
486 #: hello.c:11
|
jpayne@68
|
487 msgid "How are you?\n"
|
jpayne@68
|
488 msgstr ""
|
jpayne@68
|
489 </PRE>
|
jpayne@68
|
490 For the new translation, we could use, “ଆପଣ
|
jpayne@68
|
491 କିପରି ଅଛନ୍ତି?” in
|
jpayne@68
|
492 place of the English phrase “How are you?” The updated oriya.po file,
|
jpayne@68
|
493 including the translation might look like:
|
jpayne@68
|
494 <PRE>
|
jpayne@68
|
495 # Oriya translations for hello example package.
|
jpayne@68
|
496 # Copyright (C) 2004 Gora Mohanty
|
jpayne@68
|
497 # This file is distributed under the same license as the hello examplepackage.
|
jpayne@68
|
498 # Gora Mohanty <gora_mohanty@yahoo.co.in>, 2004.
|
jpayne@68
|
499 #
|
jpayne@68
|
500 msgid ""
|
jpayne@68
|
501 msgstr ""
|
jpayne@68
|
502 "Project-Id-Version: oriya\n"
|
jpayne@68
|
503 "Report-Msgid-Bugs-To: \n"
|
jpayne@68
|
504 "POT-Creation-Date: 2004-06-23 14:30+0530\n"
|
jpayne@68
|
505 "PO-Revision-Date: 2004-06-22 10:54+0530\n"
|
jpayne@68
|
506 "Last-Translator: Gora Mohanty <gora_mohanty@yahoo.co.in>\n"
|
jpayne@68
|
507 "Language-Team: Oriya\n"
|
jpayne@68
|
508 "MIME-Version: 1.0\n"
|
jpayne@68
|
509 "Content-Type: text/plain; charset=UTF-8\n"
|
jpayne@68
|
510 "Content-Transfer-Encoding: 8bit\n"
|
jpayne@68
|
511 "X-Generator: KBabel 1.3\n"
|
jpayne@68
|
512
|
jpayne@68
|
513 #: hello.c:10
|
jpayne@68
|
514 msgid "Hello, world!\n"
|
jpayne@68
|
515 msgstr "ନମସ୍କାର\n"
|
jpayne@68
|
516
|
jpayne@68
|
517 #: hello.c:11
|
jpayne@68
|
518 msgid "How are you?\n"
|
jpayne@68
|
519 msgstr "ଆପଣ କିପରି ଅଛନ୍ତି?\n"
|
jpayne@68
|
520 </PRE>
|
jpayne@68
|
521
|
jpayne@68
|
522 <P>
|
jpayne@68
|
523 Compile oriya.po to a machine object file, and install in the appropriate
|
jpayne@68
|
524 place as in Sec. <A HREF="#sec:catalog">2.4</A>. Thus,
|
jpayne@68
|
525 <PRE><FONT color="red">
|
jpayne@68
|
526 msgfmt -c -v -o hello.mo oriya.po
|
jpayne@68
|
527 mkdir -p /usr/share/locale/or_IN/LC_MESSAGES
|
jpayne@68
|
528 cp hello.mo /usr/share/locale/or_IN/LC_MESSAGES
|
jpayne@68
|
529 </FONT></PRE>
|
jpayne@68
|
530 You can test the Oriya output as above, after recompiling hello.c and running
|
jpayne@68
|
531 it in an Oriya locale.
|
jpayne@68
|
532
|
jpayne@68
|
533 <P>
|
jpayne@68
|
534
|
jpayne@68
|
535 <H1><A NAME="SECTION00040000000000000000">
|
jpayne@68
|
536 More about <TT>gettext</TT> </A>
|
jpayne@68
|
537 </H1>
|
jpayne@68
|
538 The GNU <TT>gettext</TT> info pages provide a well-organized and complete description
|
jpayne@68
|
539 of the <TT>gettext</TT> utilities and their usage for enabling Native Language
|
jpayne@68
|
540 Support. One should, at the very least, read the introductory material at
|
jpayne@68
|
541 gettext::Introduction::, and the suggested references in
|
jpayne@68
|
542 gettext::Conclusion::References::. Besides the <TT>gettext</TT> utilities described in
|
jpayne@68
|
543 this document, various other programs to manipulate .po files are discussed in
|
jpayne@68
|
544 gettext:Manipulating::. Finally, support for programming languages other than
|
jpayne@68
|
545 C/C++ is discussed in gettext::Programming Languages::.
|
jpayne@68
|
546
|
jpayne@68
|
547 <P>
|
jpayne@68
|
548
|
jpayne@68
|
549 <H1><A NAME="SECTION00050000000000000000">
|
jpayne@68
|
550 The work of translation</A>
|
jpayne@68
|
551 </H1>
|
jpayne@68
|
552 Besides the obvious program message strings that have been the sole focus of
|
jpayne@68
|
553 our discussion here, there are many other things that require translation,
|
jpayne@68
|
554 including GUI messages, command-line option strings, configuration files,
|
jpayne@68
|
555 program documentation, etc. Besides these obvious aspects, there are a
|
jpayne@68
|
556 significant number of programs and/or scripts that are automatically generated
|
jpayne@68
|
557 by other programs. These generated programs might also themselves require
|
jpayne@68
|
558 translation. So, in any effort to provide support for a given native language,
|
jpayne@68
|
559 carrying out the translation and keeping up with program updates becomes a
|
jpayne@68
|
560 major part of the undertaking, requiring a continuing commitment from the
|
jpayne@68
|
561 language team. A plan has been outlined for the Oriya localization
|
jpayne@68
|
562 project [<A
|
jpayne@68
|
563 HREF="memo.html#url:oriya-trans-plan">2</A>].
|
jpayne@68
|
564
|
jpayne@68
|
565 <P>
|
jpayne@68
|
566
|
jpayne@68
|
567 <H1><A NAME="SECTION00060000000000000000">
|
jpayne@68
|
568 Acknowledgments</A>
|
jpayne@68
|
569 </H1>
|
jpayne@68
|
570 Extensive use has obviously been made of the GNU <TT>gettext</TT> manual in preparing
|
jpayne@68
|
571 this document. I have also been helped by an article in the Linux
|
jpayne@68
|
572 Journal [<A
|
jpayne@68
|
573 HREF="memo.html#url:lj-translation">3</A>].
|
jpayne@68
|
574
|
jpayne@68
|
575 <P>
|
jpayne@68
|
576 This work is part of the project for enabling the use of Oriya under Linux. I
|
jpayne@68
|
577 thank my uncle, N. M. Pattnaik, for conceiving of the project. We have all
|
jpayne@68
|
578 benefited from the discussions amidst the group of people working on this
|
jpayne@68
|
579 project. On the particular issue of translation, the help of H. R. Pansari,
|
jpayne@68
|
580 A. Nayak, and M. Chand is much appreciated.
|
jpayne@68
|
581
|
jpayne@68
|
582 <H1><A NAME="SECTION00070000000000000000">
|
jpayne@68
|
583 The Emacs info browser</A>
|
jpayne@68
|
584 </H1>
|
jpayne@68
|
585 <A NAME="sec:emacs-info"></A>You can start up Emacs from the command-line by typing “emacs,” or “emacs
|
jpayne@68
|
586 <SPAN CLASS="MATH"><</SPAN>filename<SPAN CLASS="MATH">></SPAN>.” It can be started from the menu in some desktops, e.g., on
|
jpayne@68
|
587 my GNOME desktop, it is under Main Menu <TT>-></TT> Programming <TT>-></TT>
|
jpayne@68
|
588 Emacs. If you are unfamiliar with Emacs, a tutorial can be started by typing
|
jpayne@68
|
589 “C-h t” in an Emacs window, or from the Help item in the menubar at the
|
jpayne@68
|
590 top. Emacs makes extensive use of the Control (sometimes labelled as “CTRL”
|
jpayne@68
|
591 or “CTL”) and Meta (sometimes labelled as “Edit” or “Alt”) keys. In
|
jpayne@68
|
592 Emacs parlance, a hyphenated sequence, such as “C-h” means to press the
|
jpayne@68
|
593 Control and ‘h’ key simultaneously, while “C-h t” would mean to press the
|
jpayne@68
|
594 Control and ‘h’ key together, release them, and press the ‘t’ key. Similarly,
|
jpayne@68
|
595 “M-x” is used to indicate that the Meta and ‘x’ keys should be pressed at
|
jpayne@68
|
596 the same time.
|
jpayne@68
|
597
|
jpayne@68
|
598 <P>
|
jpayne@68
|
599 The info browser can be started by typing “C-h i” in Emacs. The first time
|
jpayne@68
|
600 you do this, it will briefly list some commands available inside the info
|
jpayne@68
|
601 browser, and present you with a menu of major topics. Each menu item, or
|
jpayne@68
|
602 cross-reference is hyperlinked to the appropriate node, and you can visit that
|
jpayne@68
|
603 node either by moving the cursor to the item and pressing Enter, or by
|
jpayne@68
|
604 clicking on it with the middle mouse button. To get to the <TT>gettext</TT> menu items,
|
jpayne@68
|
605 you can either scroll down to the line,
|
jpayne@68
|
606 <PRE>
|
jpayne@68
|
607 * gettext: (gettext). GNU gettext utilities.
|
jpayne@68
|
608 </PRE>
|
jpayne@68
|
609 and visit that node. Or, as it is several pages down, you can locate it using
|
jpayne@68
|
610 “I-search.” Type “C-s” to enter “I-search” which will then prompt you
|
jpayne@68
|
611 for a string in the mini-buffer at the bottom of the window. This is an
|
jpayne@68
|
612 incremental search, so that Emacs will keep moving you forward through the
|
jpayne@68
|
613 buffer as you are entering your search string. If you have reached the last
|
jpayne@68
|
614 occurrence of the search string in the current buffer, you will get a message
|
jpayne@68
|
615 saying “Failing I-search: ...” on pressing “C-s.” At that point, press
|
jpayne@68
|
616 “C-s” again to resume the search at the beginning of the buffer. Likewise,
|
jpayne@68
|
617 “C-r” incrementally searches backwards from the present location.
|
jpayne@68
|
618
|
jpayne@68
|
619 <P>
|
jpayne@68
|
620 Info nodes are listed in this document with a “::” separator, so
|
jpayne@68
|
621 that one can go to the gettext::Creating::Header Entry:: by visiting the
|
jpayne@68
|
622 “gettext” node from the main info menu, navigating to the “Creating”
|
jpayne@68
|
623 node, and following that to the “Header Entry” node.
|
jpayne@68
|
624
|
jpayne@68
|
625 <P>
|
jpayne@68
|
626 A stand-alone info browser, independent of Emacs, is also available on many
|
jpayne@68
|
627 systems. Thus, the <TT>gettext</TT> info page can also be accessed by typing
|
jpayne@68
|
628 “info gettext” in a terminal. <TT>xinfo</TT> is an X application serving as an
|
jpayne@68
|
629 info browser, so that if it is installed, typing “xinfo gettext” from the
|
jpayne@68
|
630 command line will open a new browser window with the <TT>gettext</TT> info page.
|
jpayne@68
|
631
|
jpayne@68
|
632 <P>
|
jpayne@68
|
633
|
jpayne@68
|
634 <H1><A NAME="SECTION00080000000000000000">
|
jpayne@68
|
635 PO file editors</A>
|
jpayne@68
|
636 </H1>
|
jpayne@68
|
637 <A NAME="sec:pofile-editors"></A>While the <TT>yudit</TT> editor is adequate for our present purposes, and we are
|
jpayne@68
|
638 planning on using that as it is platform-independent, and currently the best
|
jpayne@68
|
639 at rendering Oriya. This section describes some features of some editors that
|
jpayne@68
|
640 are specialized for editing PO files under Linux. This is still work in
|
jpayne@68
|
641 progress, as I am in the process of trying out different editors before
|
jpayne@68
|
642 settling on one. The ones considered here are: Emacs in po-mode, <TT>poedit</TT>,
|
jpayne@68
|
643 <TT>kbabel</TT>, and <TT>gtranslator</TT>.
|
jpayne@68
|
644
|
jpayne@68
|
645 <H2><A NAME="SECTION00081000000000000000">
|
jpayne@68
|
646 Emacs PO mode</A>
|
jpayne@68
|
647 </H2>
|
jpayne@68
|
648 Emacs should automatically enter po-mode when you load a .po file, as
|
jpayne@68
|
649 indicated by “PO” in the modeline at the bottom. The window is made
|
jpayne@68
|
650 read-only, so that you can edit the .po file only through special commands. A
|
jpayne@68
|
651 description of Emacs po-mode can be found under the gettext::Basics info node,
|
jpayne@68
|
652 or type ‘h’ or ‘?’ in a po-mode window for a list of available commands. While
|
jpayne@68
|
653 I find Emacs po-mode quite restrictive, this is probably due to unfamiliarity
|
jpayne@68
|
654 with it. Its main advantage is that it imposes rigid conformance to the PO
|
jpayne@68
|
655 file format, and checks the file format when closing the .po file
|
jpayne@68
|
656 buffer. Emacs po-mode is not useful for Oriya translation, as I know of no way
|
jpayne@68
|
657 to directly enter Oriya text under Emacs.
|
jpayne@68
|
658
|
jpayne@68
|
659 <H2><A NAME="SECTION00082000000000000000">
|
jpayne@68
|
660 poedit</A>
|
jpayne@68
|
661 </H2>
|
jpayne@68
|
662 XXX: in preparation.
|
jpayne@68
|
663
|
jpayne@68
|
664 <H2><A NAME="SECTION00083000000000000000">
|
jpayne@68
|
665 KDE: the kbabel editor</A>
|
jpayne@68
|
666 </H2>
|
jpayne@68
|
667 <TT>kbabel</TT> [<A
|
jpayne@68
|
668 HREF="memo.html#url:kbabel">4</A>] is a more user-friendly and configurable editor than
|
jpayne@68
|
669 either of Emacs po-mode or <TT>poedit</TT>. It is integrated into KDE, and offers
|
jpayne@68
|
670 extensive contextual help. Besides support for various PO file features, it
|
jpayne@68
|
671 has a plugin framework for dictionaries, that allows consistency checks and
|
jpayne@68
|
672 translation suggestions.
|
jpayne@68
|
673
|
jpayne@68
|
674 <H2><A NAME="SECTION00084000000000000000">
|
jpayne@68
|
675 GNOME: the gtranslator editor</A>
|
jpayne@68
|
676 </H2>
|
jpayne@68
|
677 XXX: in preparation.
|
jpayne@68
|
678
|
jpayne@68
|
679 <H2><A NAME="SECTION00090000000000000000">
|
jpayne@68
|
680 Bibliography</A>
|
jpayne@68
|
681 </H2><DL COMPACT><DD><P></P><DT><A NAME="xkb-oriya-layout">1</A>
|
jpayne@68
|
682 <DD>
|
jpayne@68
|
683 G. Mohanty,
|
jpayne@68
|
684 <BR>A practical primer for using Oriya under Linux, v0.3,
|
jpayne@68
|
685 <BR><TT><A NAME="tex2html1"
|
jpayne@68
|
686 HREF="http://oriya.sarovar.org/docs/getting_started/index.html">http://oriya.sarovar.org/docs/getting_started/index.html</A></TT>, 2004,
|
jpayne@68
|
687 <BR>Sec. 6.2 describes the xkb layouts for Oriya.
|
jpayne@68
|
688
|
jpayne@68
|
689 <P></P><DT><A NAME="url:oriya-trans-plan">2</A>
|
jpayne@68
|
690 <DD>
|
jpayne@68
|
691 G. Mohanty,
|
jpayne@68
|
692 <BR>A plan for Oriya localization, v0.1,
|
jpayne@68
|
693 <BR><TT><A NAME="tex2html2"
|
jpayne@68
|
694 HREF="http://oriya.sarovar.org/docs/translation_plan/index.html">http://oriya.sarovar.org/docs/translation_plan/index.html</A></TT>,
|
jpayne@68
|
695 2004.
|
jpayne@68
|
696
|
jpayne@68
|
697 <P></P><DT><A NAME="url:lj-translation">3</A>
|
jpayne@68
|
698 <DD>
|
jpayne@68
|
699 Linux Journal article on internationalization,
|
jpayne@68
|
700 <BR><TT><A NAME="tex2html3"
|
jpayne@68
|
701 HREF="https://www.linuxjournal.com/article/3023">https://www.linuxjournal.com/article/3023</A></TT>.
|
jpayne@68
|
702
|
jpayne@68
|
703 <P></P><DT><A NAME="url:kbabel">4</A>
|
jpayne@68
|
704 <DD>
|
jpayne@68
|
705 Features of the kbabel editor,
|
jpayne@68
|
706 <BR><TT><A NAME="tex2html4"
|
jpayne@68
|
707 HREF="http://i18n.kde.org/tools/kbabel/features.html">http://i18n.kde.org/tools/kbabel/features.html</A></TT>.
|
jpayne@68
|
708 </DL>
|
jpayne@68
|
709
|
jpayne@68
|
710 <H1><A NAME="SECTION000100000000000000000">
|
jpayne@68
|
711 About this document ...</A>
|
jpayne@68
|
712 </H1>
|
jpayne@68
|
713 <STRONG>A tutorial on Native Language Support using GNU gettext</STRONG><P>
|
jpayne@68
|
714 This document was generated using the
|
jpayne@68
|
715 <A HREF="http://www.latex2html.org/"><STRONG>LaTeX</STRONG>2<tt>HTML</tt></A> translator Version 2002-2-1 (1.70)
|
jpayne@68
|
716 <P>
|
jpayne@68
|
717 Copyright © 1993, 1994, 1995, 1996,
|
jpayne@68
|
718 <A HREF="http://cbl.leeds.ac.uk/nikos/personal.html">Nikos Drakos</A>,
|
jpayne@68
|
719 Computer Based Learning Unit, University of Leeds.
|
jpayne@68
|
720 <BR>Copyright © 1997, 1998, 1999,
|
jpayne@68
|
721 <A HREF="http://www.maths.mq.edu.au/~ross/">Ross Moore</A>,
|
jpayne@68
|
722 Mathematics Department, Macquarie University, Sydney.
|
jpayne@68
|
723 <P>
|
jpayne@68
|
724 The command line arguments were: <BR>
|
jpayne@68
|
725 <STRONG>latex2html</STRONG> <TT>-no_math -html_version 4.0,math,unicode,i18n,tables -split 0 memo</TT>
|
jpayne@68
|
726 <P>
|
jpayne@68
|
727 The translation was initiated by Gora Mohanty on 2004-07-24
|
jpayne@68
|
728 <DIV CLASS="navigation"><HR>
|
jpayne@68
|
729
|
jpayne@68
|
730 <!--Navigation Panel
|
jpayne@68
|
731 <IMG WIDTH="81" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="next_inactive"
|
jpayne@68
|
732 SRC="file:/usr/share/latex2html/icons/nx_grp_g.png">
|
jpayne@68
|
733 <IMG WIDTH="26" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="up"
|
jpayne@68
|
734 SRC="file:/usr/share/latex2html/icons/up_g.png">
|
jpayne@68
|
735 <IMG WIDTH="63" HEIGHT="24" ALIGN="BOTTOM" BORDER="0" ALT="previous"
|
jpayne@68
|
736 SRC="file:/usr/share/latex2html/icons/prev_g.png">
|
jpayne@68
|
737 <BR></DIV>
|
jpayne@68
|
738 End of Navigation Panel-->
|
jpayne@68
|
739
|
jpayne@68
|
740 <ADDRESS>
|
jpayne@68
|
741 Gora Mohanty
|
jpayne@68
|
742 2004-07-24
|
jpayne@68
|
743 </ADDRESS>
|
jpayne@68
|
744 </BODY>
|
jpayne@68
|
745 </HTML>
|