annotate CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/share/doc/gettext/tutorial.html @ 68:5028fdace37b

planemo upload commit 2e9511a184a1ca667c7be0c6321a36dc4e3d116d
author jpayne
date Tue, 18 Mar 2025 16:23:26 -0400
parents
children
rev   line source
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.&nbsp;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 &lt;libintl.h&gt;
jpayne@68 106 2 #include &lt;locale.h&gt;
jpayne@68 107 3 #include &lt;stdio.h&gt;
jpayne@68 108 4 #include &lt;stdlib.h&gt;
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">&#92;</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 &lt;gora_mohanty@yahoo.co.in&gt;, 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 &lt;gora_mohanty@yahoo.co.in&gt;\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.&nbsp;<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.&nbsp;<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">&#92;</SPAN>n” in
jpayne@68 296 oriya.po, we could enter “&#x0b28;&#x0b2e;&#x0b38;&#x0b4d;&#x0b15;&#x0b3e;&#x0b30;<!-- MATH
jpayne@68 297 $\backslash$
jpayne@68 298 -->
jpayne@68 299 <SPAN CLASS="MATH">&#92;</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 &lt;gora_mohanty@yahoo.co.in&gt;, 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 &lt;gora_mohanty@yahoo.co.in&gt;\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 "&#x0b28;&#x0b2e;&#x0b38;&#x0b4d;&#x0b15;&#x0b3e;&#x0b30;\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&nbsp;[<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.&nbsp;<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>-&gt;</TT> Character Coding <TT>-&gt;</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">&#92;</SPAN>033%<!-- MATH
jpayne@68 394 $\backslash$
jpayne@68 395 -->
jpayne@68 396 <SPAN CLASS="MATH">&#92;</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>-&gt;</TT> Character Coding <TT>-&gt;</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">&#92;</SPAN>033%<!-- MATH
jpayne@68 403 $\backslash$
jpayne@68 404 -->
jpayne@68 405 <SPAN CLASS="MATH">&#92;</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.&nbsp;<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 &gt; 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 &lt;libintl.h&gt;
jpayne@68 446 2 #include &lt;locale.h&gt;
jpayne@68 447 3 #include &lt;stdio.h&gt;
jpayne@68 448 4 #include &lt;stdlib.h&gt;
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">&lt;</SPAN>filename<SPAN CLASS="MATH">&gt;</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, “&#x0b06;&#x0b2a;&#x0b23;
jpayne@68 491 &#x0b15;&#x0b3f;&#x0b2a;&#x0b30;&#x0b3f; &#x0b05;&#x0b1b;&#x0b28;&#x0b4d;&#x0b24;&#x0b3f;?” 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 &lt;gora_mohanty@yahoo.co.in&gt;, 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 &lt;gora_mohanty@yahoo.co.in&gt;\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 "&#x0b28;&#x0b2e;&#x0b38;&#x0b4d;&#x0b15;&#x0b3e;&#x0b30;\n"
jpayne@68 516
jpayne@68 517 #: hello.c:11
jpayne@68 518 msgid "How are you?\n"
jpayne@68 519 msgstr "&#x0b06;&#x0b2a;&#x0b23; &#x0b15;&#x0b3f;&#x0b2a;&#x0b30;&#x0b3f; &#x0b05;&#x0b1b;&#x0b28;&#x0b4d;&#x0b24;&#x0b3f;?\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.&nbsp;<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&nbsp;[<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&nbsp;[<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.&nbsp;M.&nbsp;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.&nbsp;R.&nbsp;Pansari,
jpayne@68 580 A.&nbsp;Nayak, and M.&nbsp;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">&lt;</SPAN>filename<SPAN CLASS="MATH">&gt;</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>-&gt;</TT> Programming <TT>-&gt;</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>&nbsp;[<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.&nbsp;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.&nbsp;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.&nbsp;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 &#169; 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 &#169; 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>