annotate CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/share/doc/gettext/gettext_12.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 "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html401/loose.dtd">
jpayne@68 2 <html>
jpayne@68 3 <!-- Created on February, 21 2024 by texi2html 1.78a -->
jpayne@68 4 <!--
jpayne@68 5 Written by: Lionel Cons <Lionel.Cons@cern.ch> (original author)
jpayne@68 6 Karl Berry <karl@freefriends.org>
jpayne@68 7 Olaf Bachmann <obachman@mathematik.uni-kl.de>
jpayne@68 8 and many others.
jpayne@68 9 Maintained by: Many creative people.
jpayne@68 10 Send bugs and suggestions to <texi2html-bug@nongnu.org>
jpayne@68 11
jpayne@68 12 -->
jpayne@68 13 <head>
jpayne@68 14 <title>GNU gettext utilities: 12. The Translator's View</title>
jpayne@68 15
jpayne@68 16 <meta name="description" content="GNU gettext utilities: 12. The Translator's View">
jpayne@68 17 <meta name="keywords" content="GNU gettext utilities: 12. The Translator's View">
jpayne@68 18 <meta name="resource-type" content="document">
jpayne@68 19 <meta name="distribution" content="global">
jpayne@68 20 <meta name="Generator" content="texi2html 1.78a">
jpayne@68 21 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
jpayne@68 22 <style type="text/css">
jpayne@68 23 <!--
jpayne@68 24 a.summary-letter {text-decoration: none}
jpayne@68 25 pre.display {font-family: serif}
jpayne@68 26 pre.format {font-family: serif}
jpayne@68 27 pre.menu-comment {font-family: serif}
jpayne@68 28 pre.menu-preformatted {font-family: serif}
jpayne@68 29 pre.smalldisplay {font-family: serif; font-size: smaller}
jpayne@68 30 pre.smallexample {font-size: smaller}
jpayne@68 31 pre.smallformat {font-family: serif; font-size: smaller}
jpayne@68 32 pre.smalllisp {font-size: smaller}
jpayne@68 33 span.roman {font-family:serif; font-weight:normal;}
jpayne@68 34 span.sansserif {font-family:sans-serif; font-weight:normal;}
jpayne@68 35 ul.toc {list-style: none}
jpayne@68 36 -->
jpayne@68 37 </style>
jpayne@68 38
jpayne@68 39
jpayne@68 40 </head>
jpayne@68 41
jpayne@68 42 <body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
jpayne@68 43
jpayne@68 44 <table cellpadding="1" cellspacing="1" border="0">
jpayne@68 45 <tr><td valign="middle" align="left">[<a href="gettext_11.html#SEC197" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
jpayne@68 46 <td valign="middle" align="left">[<a href="gettext_13.html#SEC230" title="Next chapter"> &gt;&gt; </a>]</td>
jpayne@68 47 <td valign="middle" align="left"> &nbsp; </td>
jpayne@68 48 <td valign="middle" align="left"> &nbsp; </td>
jpayne@68 49 <td valign="middle" align="left"> &nbsp; </td>
jpayne@68 50 <td valign="middle" align="left"> &nbsp; </td>
jpayne@68 51 <td valign="middle" align="left"> &nbsp; </td>
jpayne@68 52 <td valign="middle" align="left">[<a href="gettext_toc.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
jpayne@68 53 <td valign="middle" align="left">[<a href="gettext_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
jpayne@68 54 <td valign="middle" align="left">[<a href="gettext_21.html#SEC389" title="Index">Index</a>]</td>
jpayne@68 55 <td valign="middle" align="left">[<a href="gettext_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
jpayne@68 56 </tr></table>
jpayne@68 57
jpayne@68 58 <hr size="2">
jpayne@68 59 <a name="Translators"></a>
jpayne@68 60 <a name="SEC217"></a>
jpayne@68 61 <h1 class="chapter"> <a href="gettext_toc.html#TOC210">12. The Translator's View</a> </h1>
jpayne@68 62
jpayne@68 63
jpayne@68 64
jpayne@68 65
jpayne@68 66 <a name="Trans-Intro-0"></a>
jpayne@68 67 <a name="SEC218"></a>
jpayne@68 68 <h2 class="section"> <a href="gettext_toc.html#TOC211">12.1 Introduction 0</a> </h2>
jpayne@68 69
jpayne@68 70 <p><strong> NOTE: </strong> This documentation section is outdated and needs to be
jpayne@68 71 revised.
jpayne@68 72 </p>
jpayne@68 73 <p>Free software is going international! The Translation Project is a way
jpayne@68 74 to get maintainers, translators and users all together, so free software
jpayne@68 75 will gradually become able to speak many native languages.
jpayne@68 76 </p>
jpayne@68 77 <p>The GNU <code>gettext</code> tool set contains <em>everything</em> maintainers
jpayne@68 78 need for internationalizing their packages for messages. It also
jpayne@68 79 contains quite useful tools for helping translators at localizing
jpayne@68 80 messages to their native language, once a package has already been
jpayne@68 81 internationalized.
jpayne@68 82 </p>
jpayne@68 83 <p>To achieve the Translation Project, we need many interested
jpayne@68 84 people who like their own language and write it well, and who are also
jpayne@68 85 able to synergize with other translators speaking the same language.
jpayne@68 86 If you'd like to volunteer to <em>work</em> at translating messages,
jpayne@68 87 please send mail to your translating team.
jpayne@68 88 </p>
jpayne@68 89 <p>Each team has its own mailing list, courtesy of Linux
jpayne@68 90 International. You may reach your translating team at the address
jpayne@68 91 &lsquo;<tt><var>ll</var>@li.org</tt>&rsquo;, replacing <var>ll</var> by the two-letter ISO 639
jpayne@68 92 code for your language. Language codes are <em>not</em> the same as
jpayne@68 93 country codes given in ISO 3166. The following translating teams
jpayne@68 94 exist:
jpayne@68 95 </p>
jpayne@68 96 <blockquote><p>Chinese <code>zh</code>, Czech <code>cs</code>, Danish <code>da</code>, Dutch <code>nl</code>,
jpayne@68 97 Esperanto <code>eo</code>, Finnish <code>fi</code>, French <code>fr</code>, Irish
jpayne@68 98 <code>ga</code>, German <code>de</code>, Greek <code>el</code>, Italian <code>it</code>,
jpayne@68 99 Japanese <code>ja</code>, Indonesian <code>in</code>, Norwegian <code>no</code>, Polish
jpayne@68 100 <code>pl</code>, Portuguese <code>pt</code>, Russian <code>ru</code>, Spanish <code>es</code>,
jpayne@68 101 Swedish <code>sv</code> and Turkish <code>tr</code>.
jpayne@68 102 </p></blockquote>
jpayne@68 103
jpayne@68 104 <p>For example, you may reach the Chinese translating team by writing to
jpayne@68 105 &lsquo;<tt>zh@li.org</tt>&rsquo;. When you become a member of the translating team
jpayne@68 106 for your own language, you may subscribe to its list. For example,
jpayne@68 107 Swedish people can send a message to &lsquo;<tt>sv-request@li.org</tt>&rsquo;,
jpayne@68 108 having this message body:
jpayne@68 109 </p>
jpayne@68 110 <table><tr><td>&nbsp;</td><td><pre class="example">subscribe
jpayne@68 111 </pre></td></tr></table>
jpayne@68 112
jpayne@68 113 <p>Keep in mind that team members should be interested in <em>working</em>
jpayne@68 114 at translations, or at solving translational difficulties, rather than
jpayne@68 115 merely lurking around. If your team does not exist yet and you want to
jpayne@68 116 start one, please write to &lsquo;<tt>coordinator@translationproject.org</tt>&rsquo;;
jpayne@68 117 you will then reach the coordinator for all translator teams.
jpayne@68 118 </p>
jpayne@68 119 <p>A handful of GNU packages have already been adapted and provided
jpayne@68 120 with message translations for several languages. Translation
jpayne@68 121 teams have begun to organize, using these packages as a starting
jpayne@68 122 point. But there are many more packages and many languages for
jpayne@68 123 which we have no volunteer translators. If you would like to
jpayne@68 124 volunteer to work at translating messages, please send mail to
jpayne@68 125 &lsquo;<tt>coordinator@translationproject.org</tt>&rsquo; indicating what language(s)
jpayne@68 126 you can work on.
jpayne@68 127 </p>
jpayne@68 128
jpayne@68 129 <a name="Trans-Intro-1"></a>
jpayne@68 130 <a name="SEC219"></a>
jpayne@68 131 <h2 class="section"> <a href="gettext_toc.html#TOC212">12.2 Introduction 1</a> </h2>
jpayne@68 132
jpayne@68 133 <p><strong> NOTE: </strong> This documentation section is outdated and needs to be
jpayne@68 134 revised.
jpayne@68 135 </p>
jpayne@68 136 <p>This is now official, GNU is going international! Here is the
jpayne@68 137 announcement submitted for the January 1995 GNU Bulletin:
jpayne@68 138 </p>
jpayne@68 139 <blockquote><p>A handful of GNU packages have already been adapted and provided
jpayne@68 140 with message translations for several languages. Translation
jpayne@68 141 teams have begun to organize, using these packages as a starting
jpayne@68 142 point. But there are many more packages and many languages
jpayne@68 143 for which we have no volunteer translators. If you'd like to
jpayne@68 144 volunteer to work at translating messages, please send mail to
jpayne@68 145 &lsquo;<samp>coordinator@translationproject.org</samp>&rsquo; indicating what language(s)
jpayne@68 146 you can work on.
jpayne@68 147 </p></blockquote>
jpayne@68 148
jpayne@68 149 <p>This document should answer many questions for those who are curious about
jpayne@68 150 the process or would like to contribute. Please at least skim over it,
jpayne@68 151 hoping to cut down a little of the high volume of e-mail generated by this
jpayne@68 152 collective effort towards internationalization of free software.
jpayne@68 153 </p>
jpayne@68 154 <p>Most free programming which is widely shared is done in English, and
jpayne@68 155 currently, English is used as the main communicating language between
jpayne@68 156 national communities collaborating to free software. This very document
jpayne@68 157 is written in English. This will not change in the foreseeable future.
jpayne@68 158 </p>
jpayne@68 159 <p>However, there is a strong appetite from national communities for
jpayne@68 160 having more software able to write using national language and habits,
jpayne@68 161 and there is an on-going effort to modify free software in such a way
jpayne@68 162 that it becomes able to do so. The experiments driven so far raised
jpayne@68 163 an enthusiastic response from pretesters, so we believe that
jpayne@68 164 internationalization of free software is dedicated to succeed.
jpayne@68 165 </p>
jpayne@68 166 <p>For suggestion clarifications, additions or corrections to this
jpayne@68 167 document, please e-mail to &lsquo;<tt>coordinator@translationproject.org</tt>&rsquo;.
jpayne@68 168 </p>
jpayne@68 169
jpayne@68 170 <a name="Discussions"></a>
jpayne@68 171 <a name="SEC220"></a>
jpayne@68 172 <h2 class="section"> <a href="gettext_toc.html#TOC213">12.3 Discussions</a> </h2>
jpayne@68 173
jpayne@68 174 <p><strong> NOTE: </strong> This documentation section is outdated and needs to be
jpayne@68 175 revised.
jpayne@68 176 </p>
jpayne@68 177 <p>Facing this internationalization effort, a few users expressed their
jpayne@68 178 concerns. Some of these doubts are presented and discussed, here.
jpayne@68 179 </p>
jpayne@68 180 <ul>
jpayne@68 181 <li> Smaller groups
jpayne@68 182
jpayne@68 183 <p>Some languages are not spoken by a very large number of people, so people
jpayne@68 184 speaking them sometimes consider that there may not be all that much
jpayne@68 185 demand such versions of free software packages. Moreover, many people
jpayne@68 186 being <em>into computers</em>, in some countries, generally seem to prefer
jpayne@68 187 English versions of their software.
jpayne@68 188 </p>
jpayne@68 189 <p>On the other end, people might enjoy their own language a lot, and be
jpayne@68 190 very motivated at providing to themselves the pleasure of having their
jpayne@68 191 beloved free software speaking their mother tongue. They do themselves
jpayne@68 192 a personal favor, and do not pay that much attention to the number of
jpayne@68 193 people benefiting of their work.
jpayne@68 194 </p>
jpayne@68 195 </li><li> Misinterpretation
jpayne@68 196
jpayne@68 197 <p>Other users are shy to push forward their own language, seeing in this
jpayne@68 198 some kind of misplaced propaganda. Someone thought there must be some
jpayne@68 199 users of the language over the networks pestering other people with it.
jpayne@68 200 </p>
jpayne@68 201 <p>But any spoken language is worth localization, because there are
jpayne@68 202 people behind the language for whom the language is important and
jpayne@68 203 dear to their hearts.
jpayne@68 204 </p>
jpayne@68 205 </li><li> Odd translations
jpayne@68 206
jpayne@68 207 <p>The biggest problem is to find the right translations so that
jpayne@68 208 everybody can understand the messages. Translations are usually a
jpayne@68 209 little odd. Some people get used to English, to the extent they may
jpayne@68 210 find translations into their own language &ldquo;rather pushy, obnoxious
jpayne@68 211 and sometimes even hilarious.&rdquo; As a French speaking man, I have
jpayne@68 212 the experience of those instruction manuals for goods, so poorly
jpayne@68 213 translated in French in Korea or Taiwan&hellip;
jpayne@68 214 </p>
jpayne@68 215 <p>The fact is that we sometimes have to create a kind of national
jpayne@68 216 computer culture, and this is not easy without the collaboration of
jpayne@68 217 many people liking their mother tongue. This is why translations are
jpayne@68 218 better achieved by people knowing and loving their own language, and
jpayne@68 219 ready to work together at improving the results they obtain.
jpayne@68 220 </p>
jpayne@68 221 </li><li> Dependencies over the GPL or LGPL
jpayne@68 222
jpayne@68 223 <p>Some people wonder if using GNU <code>gettext</code> necessarily brings their
jpayne@68 224 package under the protective wing of the GNU General Public License or
jpayne@68 225 the GNU Lesser General Public License, when they do not want to make
jpayne@68 226 their program free, or want other kinds of freedom. The simplest
jpayne@68 227 answer is &ldquo;normally not&rdquo;.
jpayne@68 228 </p>
jpayne@68 229 <p>The <code>gettext-runtime</code> part of GNU <code>gettext</code>, i.e. the
jpayne@68 230 contents of <code>libintl</code>, is covered by the GNU Lesser General Public
jpayne@68 231 License. The <code>gettext-tools</code> part of GNU <code>gettext</code>, i.e. the
jpayne@68 232 rest of the GNU <code>gettext</code> package, is covered by the GNU General
jpayne@68 233 Public License.
jpayne@68 234 </p>
jpayne@68 235 <p>The mere marking of localizable strings in a package, or conditional
jpayne@68 236 inclusion of a few lines for initialization, is not really including
jpayne@68 237 GPL'ed or LGPL'ed code. However, since the localization routines in
jpayne@68 238 <code>libintl</code> are under the LGPL, the LGPL needs to be considered.
jpayne@68 239 It gives the right to distribute the complete unmodified source of
jpayne@68 240 <code>libintl</code> even with non-free programs. It also gives the right
jpayne@68 241 to use <code>libintl</code> as a shared library, even for non-free programs.
jpayne@68 242 But it gives the right to use <code>libintl</code> as a static library or
jpayne@68 243 to incorporate <code>libintl</code> into another library only to free
jpayne@68 244 software.
jpayne@68 245 </p>
jpayne@68 246 </li></ul>
jpayne@68 247
jpayne@68 248
jpayne@68 249 <a name="Organization"></a>
jpayne@68 250 <a name="SEC221"></a>
jpayne@68 251 <h2 class="section"> <a href="gettext_toc.html#TOC214">12.4 Organization</a> </h2>
jpayne@68 252
jpayne@68 253 <p><strong> NOTE: </strong> This documentation section is outdated and needs to be
jpayne@68 254 revised.
jpayne@68 255 </p>
jpayne@68 256 <p>On a larger scale, the true solution would be to organize some kind of
jpayne@68 257 fairly precise set up in which volunteers could participate. I gave
jpayne@68 258 some thought to this idea lately, and realize there will be some
jpayne@68 259 touchy points. I thought of writing to Richard Stallman to launch
jpayne@68 260 such a project, but feel it might be good to shake out the ideas
jpayne@68 261 between ourselves first. Most probably that Linux International has
jpayne@68 262 some experience in the field already, or would like to orchestrate
jpayne@68 263 the volunteer work, maybe. Food for thought, in any case!
jpayne@68 264 </p>
jpayne@68 265 <p>I guess we have to setup something early, somehow, that will help
jpayne@68 266 many possible contributors of the same language to interlock and avoid
jpayne@68 267 work duplication, and further be put in contact for solving together
jpayne@68 268 problems particular to their tongue (in most languages, there are many
jpayne@68 269 difficulties peculiar to translating technical English). My Swedish
jpayne@68 270 contributor acknowledged these difficulties, and I'm well aware of
jpayne@68 271 them for French.
jpayne@68 272 </p>
jpayne@68 273 <p>This is surely not a technical issue, but we should manage so the
jpayne@68 274 effort of locale contributors be maximally useful, despite the national
jpayne@68 275 team layer interface between contributors and maintainers.
jpayne@68 276 </p>
jpayne@68 277 <p>The Translation Project needs some setup for coordinating language
jpayne@68 278 coordinators. Localizing evolving programs will surely
jpayne@68 279 become a permanent and continuous activity in the free software community,
jpayne@68 280 once well started.
jpayne@68 281 The setup should be minimally completed and tested before GNU
jpayne@68 282 <code>gettext</code> becomes an official reality. The e-mail address
jpayne@68 283 &lsquo;<tt>coordinator@translationproject.org</tt>&rsquo; has been set up for receiving
jpayne@68 284 offers from volunteers and general e-mail on these topics. This address
jpayne@68 285 reaches the Translation Project coordinator.
jpayne@68 286 </p>
jpayne@68 287
jpayne@68 288
jpayne@68 289 <a name="Central-Coordination"></a>
jpayne@68 290 <a name="SEC222"></a>
jpayne@68 291 <h3 class="subsection"> <a href="gettext_toc.html#TOC215">12.4.1 Central Coordination</a> </h3>
jpayne@68 292
jpayne@68 293 <p>I also think GNU will need sooner than it thinks, that someone set up
jpayne@68 294 a way to organize and coordinate these groups. Some kind of group
jpayne@68 295 of groups. My opinion is that it would be good that GNU delegates
jpayne@68 296 this task to a small group of collaborating volunteers, shortly.
jpayne@68 297 Perhaps in &lsquo;<tt>gnu.announce</tt>&rsquo; a list of this national committee's
jpayne@68 298 can be published.
jpayne@68 299 </p>
jpayne@68 300 <p>My role as coordinator would simply be to refer to Ulrich any German
jpayne@68 301 speaking volunteer interested to localization of free software packages, and
jpayne@68 302 maybe helping national groups to initially organize, while maintaining
jpayne@68 303 national registries for until national groups are ready to take over.
jpayne@68 304 In fact, the coordinator should ease volunteers to get in contact with
jpayne@68 305 one another for creating national teams, which should then select
jpayne@68 306 one coordinator per language, or country (regionalized language).
jpayne@68 307 If well done, the coordination should be useful without being an
jpayne@68 308 overwhelming task, the time to put delegations in place.
jpayne@68 309 </p>
jpayne@68 310
jpayne@68 311 <a name="National-Teams"></a>
jpayne@68 312 <a name="SEC223"></a>
jpayne@68 313 <h3 class="subsection"> <a href="gettext_toc.html#TOC216">12.4.2 National Teams</a> </h3>
jpayne@68 314
jpayne@68 315 <p>I suggest we look for volunteer coordinators/editors for individual
jpayne@68 316 languages. These people will scan contributions of translation files
jpayne@68 317 for various programs, for their own languages, and will ensure high
jpayne@68 318 and uniform standards of diction.
jpayne@68 319 </p>
jpayne@68 320 <p>From my current experience with other people in these days, those who
jpayne@68 321 provide localizations are very enthusiastic about the process, and are
jpayne@68 322 more interested in the localization process than in the program they
jpayne@68 323 localize, and want to do many programs, not just one. This seems
jpayne@68 324 to confirm that having a coordinator/editor for each language is a
jpayne@68 325 good idea.
jpayne@68 326 </p>
jpayne@68 327 <p>We need to choose someone who is good at writing clear and concise
jpayne@68 328 prose in the language in question. That is hard&mdash;we can't check
jpayne@68 329 it ourselves. So we need to ask a few people to judge each others'
jpayne@68 330 writing and select the one who is best.
jpayne@68 331 </p>
jpayne@68 332 <p>I announce my prerelease to a few dozen people, and you would not
jpayne@68 333 believe all the discussions it generated already. I shudder to think
jpayne@68 334 what will happen when this will be launched, for true, officially,
jpayne@68 335 world wide. Who am I to arbitrate between two Czekolsovak users
jpayne@68 336 contradicting each other, for example?
jpayne@68 337 </p>
jpayne@68 338 <p>I assume that your German is not much better than my French so that
jpayne@68 339 I would not be able to judge about these formulations. What I would
jpayne@68 340 suggest is that for each language there is a group for people who
jpayne@68 341 maintain the PO files and judge about changes. I suspect there will
jpayne@68 342 be cultural differences between how such groups of people will behave.
jpayne@68 343 Some will have relaxed ways, reach consensus easily, and have anyone
jpayne@68 344 of the group relate to the maintainers, while others will fight to
jpayne@68 345 death, organize heavy administrations up to national standards, and
jpayne@68 346 use strict channels.
jpayne@68 347 </p>
jpayne@68 348 <p>The German team is putting out a good example. Right now, they are
jpayne@68 349 maybe half a dozen people revising translations of each other and
jpayne@68 350 discussing the linguistic issues. I do not even have all the names.
jpayne@68 351 Ulrich Drepper is taking care of coordinating the German team.
jpayne@68 352 He subscribed to all my pretest lists, so I do not even have to warn
jpayne@68 353 him specifically of incoming releases.
jpayne@68 354 </p>
jpayne@68 355 <p>I'm sure, that is a good idea to get teams for each language working
jpayne@68 356 on translations. That will make the translations better and more
jpayne@68 357 consistent.
jpayne@68 358 </p>
jpayne@68 359
jpayne@68 360
jpayne@68 361 <a name="Sub_002dCultures"></a>
jpayne@68 362 <a name="SEC224"></a>
jpayne@68 363 <h4 class="subsubsection"> <a href="gettext_toc.html#TOC217">12.4.2.1 Sub-Cultures</a> </h4>
jpayne@68 364
jpayne@68 365 <p>Taking French for example, there are a few sub-cultures around computers
jpayne@68 366 which developed diverging vocabularies. Picking volunteers here and
jpayne@68 367 there without addressing this problem in an organized way, soon in the
jpayne@68 368 project, might produce a distasteful mix of internationalized programs,
jpayne@68 369 and possibly trigger endless quarrels among those who really care.
jpayne@68 370 </p>
jpayne@68 371 <p>Keeping some kind of unity in the way French localization of
jpayne@68 372 internationalized programs is achieved is a difficult (and delicate) job.
jpayne@68 373 Knowing the latin character of French people (:-), if we take this
jpayne@68 374 the wrong way, we could end up nowhere, or spoil a lot of energies.
jpayne@68 375 Maybe we should begin to address this problem seriously <em>before</em>
jpayne@68 376 GNU <code>gettext</code> become officially published. And I suspect that this
jpayne@68 377 means soon!
jpayne@68 378 </p>
jpayne@68 379
jpayne@68 380 <a name="Organizational-Ideas"></a>
jpayne@68 381 <a name="SEC225"></a>
jpayne@68 382 <h4 class="subsubsection"> <a href="gettext_toc.html#TOC218">12.4.2.2 Organizational Ideas</a> </h4>
jpayne@68 383
jpayne@68 384 <p>I expect the next big changes after the official release. Please note
jpayne@68 385 that I use the German translation of the short GPL message. We need
jpayne@68 386 to set a few good examples before the localization goes out for true
jpayne@68 387 in the free software community. Here are a few points to discuss:
jpayne@68 388 </p>
jpayne@68 389 <ul>
jpayne@68 390 <li>
jpayne@68 391 Each group should have one FTP server (at least one master).
jpayne@68 392
jpayne@68 393 </li><li>
jpayne@68 394 The files on the server should reflect the latest version (of
jpayne@68 395 course!) and it should also contain a RCS directory with the
jpayne@68 396 corresponding archives (I don't have this now).
jpayne@68 397
jpayne@68 398 </li><li>
jpayne@68 399 There should also be a ChangeLog file (this is more useful than the
jpayne@68 400 RCS archive but can be generated automatically from the later by
jpayne@68 401 Emacs).
jpayne@68 402
jpayne@68 403 </li><li>
jpayne@68 404 A <em>core group</em> should judge about questionable changes (for now
jpayne@68 405 this group consists solely by me but I ask some others occasionally;
jpayne@68 406 this also seems to work).
jpayne@68 407
jpayne@68 408 </li></ul>
jpayne@68 409
jpayne@68 410
jpayne@68 411 <a name="Mailing-Lists"></a>
jpayne@68 412 <a name="SEC226"></a>
jpayne@68 413 <h3 class="subsection"> <a href="gettext_toc.html#TOC219">12.4.3 Mailing Lists</a> </h3>
jpayne@68 414
jpayne@68 415 <p>If we get any inquiries about GNU <code>gettext</code>, send them on to:
jpayne@68 416 </p>
jpayne@68 417 <table><tr><td>&nbsp;</td><td><pre class="example">&lsquo;<tt>coordinator@translationproject.org</tt>&rsquo;
jpayne@68 418 </pre></td></tr></table>
jpayne@68 419
jpayne@68 420 <p>The &lsquo;<tt>*-pretest</tt>&rsquo; lists are quite useful to me, maybe the idea could
jpayne@68 421 be generalized to many GNU, and non-GNU packages. But each maintainer
jpayne@68 422 his/her way!
jpayne@68 423 </p>
jpayne@68 424 <p>Fran&ccedil;ois, we have a mechanism in place here at
jpayne@68 425 &lsquo;<tt>gnu.ai.mit.edu</tt>&rsquo; to track teams, support mailing lists for
jpayne@68 426 them and log members. We have a slight preference that you use it.
jpayne@68 427 If this is OK with you, I can get you clued in.
jpayne@68 428 </p>
jpayne@68 429 <p>Things are changing! A few years ago, when Daniel Fekete and I
jpayne@68 430 asked for a mailing list for GNU localization, nested at the FSF, we
jpayne@68 431 were politely invited to organize it anywhere else, and so did we.
jpayne@68 432 For communicating with my pretesters, I later made a handful of
jpayne@68 433 mailing lists located at iro.umontreal.ca and administrated by
jpayne@68 434 <code>majordomo</code>. These lists have been <em>very</em> dependable
jpayne@68 435 so far&hellip;
jpayne@68 436 </p>
jpayne@68 437 <p>I suspect that the German team will organize itself a mailing list
jpayne@68 438 located in Germany, and so forth for other countries. But before they
jpayne@68 439 organize for true, it could surely be useful to offer mailing lists
jpayne@68 440 located at the FSF to each national team. So yes, please explain me
jpayne@68 441 how I should proceed to create and handle them.
jpayne@68 442 </p>
jpayne@68 443 <p>We should create temporary mailing lists, one per country, to help
jpayne@68 444 people organize. Temporary, because once regrouped and structured, it
jpayne@68 445 would be fair the volunteers from country bring back <em>their</em> list
jpayne@68 446 in there and manage it as they want. My feeling is that, in the long
jpayne@68 447 run, each team should run its own list, from within their country.
jpayne@68 448 There also should be some central list to which all teams could
jpayne@68 449 subscribe as they see fit, as long as each team is represented in it.
jpayne@68 450 </p>
jpayne@68 451
jpayne@68 452 <a name="Information-Flow"></a>
jpayne@68 453 <a name="SEC227"></a>
jpayne@68 454 <h2 class="section"> <a href="gettext_toc.html#TOC220">12.5 Information Flow</a> </h2>
jpayne@68 455
jpayne@68 456 <p><strong> NOTE: </strong> This documentation section is outdated and needs to be
jpayne@68 457 revised.
jpayne@68 458 </p>
jpayne@68 459 <p>There will surely be some discussion about this messages after the
jpayne@68 460 packages are finally released. If people now send you some proposals
jpayne@68 461 for better messages, how do you proceed? Jim, please note that
jpayne@68 462 right now, as I put forward nearly a dozen of localizable programs, I
jpayne@68 463 receive both the translations and the coordination concerns about them.
jpayne@68 464 </p>
jpayne@68 465 <p>If I put one of my things to pretest, Ulrich receives the announcement
jpayne@68 466 and passes it on to the German team, who make last minute revisions.
jpayne@68 467 Then he submits the translation files to me <em>as the maintainer</em>.
jpayne@68 468 For free packages I do not maintain, I would not even hear about it.
jpayne@68 469 This scheme could be made to work for the whole Translation Project,
jpayne@68 470 I think. For security reasons, maybe Ulrich (national coordinators,
jpayne@68 471 in fact) should update central registry kept at the Translation Project
jpayne@68 472 (Jim, me, or Len's recruits) once in a while.
jpayne@68 473 </p>
jpayne@68 474 <p>In December/January, I was aggressively ready to internationalize
jpayne@68 475 all of GNU, giving myself the duty of one small GNU package per week
jpayne@68 476 or so, taking many weeks or months for bigger packages. But it does
jpayne@68 477 not work this way. I first did all the things I'm responsible for.
jpayne@68 478 I've nothing against some missionary work on other maintainers, but
jpayne@68 479 I'm also losing a lot of energy over it&mdash;same debates over again.
jpayne@68 480 </p>
jpayne@68 481 <p>And when the first localized packages are released we'll get a lot of
jpayne@68 482 responses about ugly translations :-). Surely, and we need to have
jpayne@68 483 beforehand a fairly good idea about how to handle the information
jpayne@68 484 flow between the national teams and the package maintainers.
jpayne@68 485 </p>
jpayne@68 486 <p>Please start saving somewhere a quick history of each PO file. I know
jpayne@68 487 for sure that the file format will change, allowing for comments.
jpayne@68 488 It would be nice that each file has a kind of log, and references for
jpayne@68 489 those who want to submit comments or gripes, or otherwise contribute.
jpayne@68 490 I sent a proposal for a fast and flexible format, but it is not
jpayne@68 491 receiving acceptance yet by the GNU deciders. I'll tell you when I
jpayne@68 492 have more information about this.
jpayne@68 493 </p>
jpayne@68 494
jpayne@68 495 <a name="Translating-plural-forms"></a>
jpayne@68 496 <a name="SEC228"></a>
jpayne@68 497 <h2 class="section"> <a href="gettext_toc.html#TOC221">12.6 Translating plural forms</a> </h2>
jpayne@68 498
jpayne@68 499 <p>Suppose you are translating a PO file, and it contains an entry like this:
jpayne@68 500 </p>
jpayne@68 501 <table><tr><td>&nbsp;</td><td><pre class="smallexample">#, c-format
jpayne@68 502 msgid &quot;One file removed&quot;
jpayne@68 503 msgid_plural &quot;%d files removed&quot;
jpayne@68 504 msgstr[0] &quot;&quot;
jpayne@68 505 msgstr[1] &quot;&quot;
jpayne@68 506 </pre></td></tr></table>
jpayne@68 507
jpayne@68 508 <p>What does this mean? How do you fill it in?
jpayne@68 509 </p>
jpayne@68 510 <p>Such an entry denotes a message with plural forms, that is, a message where
jpayne@68 511 the text depends on a cardinal number. The general form of the message,
jpayne@68 512 in English, is the <code>msgid_plural</code> line. The <code>msgid</code> line is the
jpayne@68 513 English singular form, that is, the form for when the number is equal to 1.
jpayne@68 514 More details about plural forms are explained in <a href="gettext_11.html#SEC207">Additional functions for plural forms</a>.
jpayne@68 515 </p>
jpayne@68 516 <p>The first thing you need to look at is the <code>Plural-Forms</code> line in the
jpayne@68 517 header entry of the PO file. It contains the number of plural forms and a
jpayne@68 518 formula. If the PO file does not yet have such a line, you have to add it.
jpayne@68 519 It only depends on the language into which you are translating. You can
jpayne@68 520 get this info by using the <code>msginit</code> command (see <a href="gettext_6.html#SEC45">Creating a New PO File</a>) &ndash;
jpayne@68 521 it contains a database of known plural formulas &ndash; or by asking other
jpayne@68 522 members of your translation team.
jpayne@68 523 </p>
jpayne@68 524 <p>Suppose the line looks as follows:
jpayne@68 525 </p>
jpayne@68 526 <table><tr><td>&nbsp;</td><td><pre class="smallexample">&quot;Plural-Forms: nplurals=3; plural=n%10==1 &amp;&amp; n%100!=11 ? 0 : n%10&gt;=2 &amp;&amp; n&quot;
jpayne@68 527 &quot;%10&lt;=4 &amp;&amp; (n%100&lt;10 || n%100&gt;=20) ? 1 : 2;\n&quot;
jpayne@68 528 </pre></td></tr></table>
jpayne@68 529
jpayne@68 530 <p>It's logically one line; recall that the PO file formatting is allowed to
jpayne@68 531 break long lines so that each physical line fits in 80 monospaced columns.
jpayne@68 532 </p>
jpayne@68 533 <p>The value of <code>nplurals</code> here tells you that there are three plural
jpayne@68 534 forms. The first thing you need to do is to ensure that the entry contains
jpayne@68 535 an <code>msgstr</code> line for each of the forms:
jpayne@68 536 </p>
jpayne@68 537 <table><tr><td>&nbsp;</td><td><pre class="smallexample">#, c-format
jpayne@68 538 msgid &quot;One file removed&quot;
jpayne@68 539 msgid_plural &quot;%d files removed&quot;
jpayne@68 540 msgstr[0] &quot;&quot;
jpayne@68 541 msgstr[1] &quot;&quot;
jpayne@68 542 msgstr[2] &quot;&quot;
jpayne@68 543 </pre></td></tr></table>
jpayne@68 544
jpayne@68 545 <p>Then translate the <code>msgid_plural</code> line and fill it in into each
jpayne@68 546 <code>msgstr</code> line:
jpayne@68 547 </p>
jpayne@68 548 <table><tr><td>&nbsp;</td><td><pre class="smallexample">#, c-format
jpayne@68 549 msgid &quot;One file removed&quot;
jpayne@68 550 msgid_plural &quot;%d files removed&quot;
jpayne@68 551 msgstr[0] &quot;%d slika uklonjenih&quot;
jpayne@68 552 msgstr[1] &quot;%d slika uklonjenih&quot;
jpayne@68 553 msgstr[2] &quot;%d slika uklonjenih&quot;
jpayne@68 554 </pre></td></tr></table>
jpayne@68 555
jpayne@68 556 <p>Now you can refine the translation so that it matches the plural form.
jpayne@68 557 According to the formula above, <code>msgstr[0]</code> is used when the number
jpayne@68 558 ends in 1 but does not end in 11; <code>msgstr[1]</code> is used when the number
jpayne@68 559 ends in 2, 3, 4, but not in 12, 13, 14; and <code>msgstr[2]</code> is used in
jpayne@68 560 all other cases. With this knowledge, you can refine the translations:
jpayne@68 561 </p>
jpayne@68 562 <table><tr><td>&nbsp;</td><td><pre class="smallexample">#, c-format
jpayne@68 563 msgid &quot;One file removed&quot;
jpayne@68 564 msgid_plural &quot;%d files removed&quot;
jpayne@68 565 msgstr[0] &quot;%d slika je uklonjena&quot;
jpayne@68 566 msgstr[1] &quot;%d datoteke uklonjenih&quot;
jpayne@68 567 msgstr[2] &quot;%d slika uklonjenih&quot;
jpayne@68 568 </pre></td></tr></table>
jpayne@68 569
jpayne@68 570 <p>You noticed that in the English singular form (<code>msgid</code>) the number
jpayne@68 571 placeholder could be omitted and replaced by the numeral word &ldquo;one&rdquo;.
jpayne@68 572 Can you do this in your translation as well?
jpayne@68 573 </p>
jpayne@68 574 <table><tr><td>&nbsp;</td><td><pre class="smallexample">msgstr[0] &quot;jednom datotekom je uklonjen&quot;
jpayne@68 575 </pre></td></tr></table>
jpayne@68 576
jpayne@68 577 <p>Well, it depends on whether <code>msgstr[0]</code> applies only to the number 1,
jpayne@68 578 or to other numbers as well. If, according to the plural formula,
jpayne@68 579 <code>msgstr[0]</code> applies only to <code>n == 1</code>, then you can use the
jpayne@68 580 specialized translation without the number placeholder. In our case,
jpayne@68 581 however, <code>msgstr[0]</code> also applies to the numbers 21, 31, 41, etc.,
jpayne@68 582 and therefore you cannot omit the placeholder.
jpayne@68 583 </p>
jpayne@68 584
jpayne@68 585 <a name="Prioritizing-messages"></a>
jpayne@68 586 <a name="SEC229"></a>
jpayne@68 587 <h2 class="section"> <a href="gettext_toc.html#TOC222">12.7 Prioritizing messages: How to determine which messages to translate first</a> </h2>
jpayne@68 588
jpayne@68 589 <p>A translator sometimes has only a limited amount of time per week to
jpayne@68 590 spend on a package, and some packages have quite large message catalogs
jpayne@68 591 (over 1000 messages). Therefore she wishes to translate the messages
jpayne@68 592 first that are the most visible to the user, or that occur most frequently.
jpayne@68 593 This section describes how to determine these &quot;most urgent&quot; messages.
jpayne@68 594 It also applies to determine the &quot;next most urgent&quot; messages after the
jpayne@68 595 message catalog has already been partially translated.
jpayne@68 596 </p>
jpayne@68 597 <p>In a first step, she uses the programs like a user would do. While she
jpayne@68 598 does this, the GNU <code>gettext</code> library logs into a file the not yet
jpayne@68 599 translated messages for which a translation was requested from the program.
jpayne@68 600 </p>
jpayne@68 601 <p>In a second step, she uses the PO mode to translate precisely this set
jpayne@68 602 of messages.
jpayne@68 603 </p>
jpayne@68 604 <a name="IDX1089"></a>
jpayne@68 605 <p>Here are more details. The GNU <code>libintl</code> library (but not the
jpayne@68 606 corresponding functions in GNU <code>libc</code>) supports an environment variable
jpayne@68 607 <code>GETTEXT_LOG_UNTRANSLATED</code>. The GNU <code>libintl</code> library will
jpayne@68 608 log into this file the messages for which <code>gettext()</code> and related
jpayne@68 609 functions couldn't find the translation. If the file doesn't exist, it
jpayne@68 610 will be created as needed. On systems with GNU <code>libc</code> a shared library
jpayne@68 611 &lsquo;<samp>preloadable_libintl.so</samp>&rsquo; is provided that can be used with the ELF
jpayne@68 612 &lsquo;<samp>LD_PRELOAD</samp>&rsquo; mechanism.
jpayne@68 613 </p>
jpayne@68 614 <p>So, in the first step, the translator uses these commands on systems with
jpayne@68 615 GNU <code>libc</code>:
jpayne@68 616 </p>
jpayne@68 617 <table><tr><td>&nbsp;</td><td><pre class="smallexample">$ LD_PRELOAD=/usr/local/lib/preloadable_libintl.so
jpayne@68 618 $ export LD_PRELOAD
jpayne@68 619 $ GETTEXT_LOG_UNTRANSLATED=$HOME/gettextlogused
jpayne@68 620 $ export GETTEXT_LOG_UNTRANSLATED
jpayne@68 621 </pre></td></tr></table>
jpayne@68 622
jpayne@68 623 <p>and these commands on other systems:
jpayne@68 624 </p>
jpayne@68 625 <table><tr><td>&nbsp;</td><td><pre class="smallexample">$ GETTEXT_LOG_UNTRANSLATED=$HOME/gettextlogused
jpayne@68 626 $ export GETTEXT_LOG_UNTRANSLATED
jpayne@68 627 </pre></td></tr></table>
jpayne@68 628
jpayne@68 629 <p>Then she uses and peruses the programs. (It is a good and recommended
jpayne@68 630 practice to use the programs for which you provide translations: it
jpayne@68 631 gives you the needed context.) When done, she removes the environment
jpayne@68 632 variables:
jpayne@68 633 </p>
jpayne@68 634 <table><tr><td>&nbsp;</td><td><pre class="smallexample">$ unset LD_PRELOAD
jpayne@68 635 $ unset GETTEXT_LOG_UNTRANSLATED
jpayne@68 636 </pre></td></tr></table>
jpayne@68 637
jpayne@68 638 <p>The second step starts with removing duplicates:
jpayne@68 639 </p>
jpayne@68 640 <table><tr><td>&nbsp;</td><td><pre class="smallexample">$ msguniq $HOME/gettextlogused &gt; missing.po
jpayne@68 641 </pre></td></tr></table>
jpayne@68 642
jpayne@68 643 <p>The result is a PO file, but needs some preprocessing before a PO file editor
jpayne@68 644 can be used with it. First, it is a multi-domain PO file, containing
jpayne@68 645 messages from many translation domains. Second, it lacks all translator
jpayne@68 646 comments and source references. Here is how to get a list of the affected
jpayne@68 647 translation domains:
jpayne@68 648 </p>
jpayne@68 649 <table><tr><td>&nbsp;</td><td><pre class="smallexample">$ sed -n -e 's,^domain &quot;\(.*\)&quot;$,\1,p' &lt; missing.po | sort | uniq
jpayne@68 650 </pre></td></tr></table>
jpayne@68 651
jpayne@68 652 <p>Then the translator can handle the domains one by one. For simplicity,
jpayne@68 653 let's use environment variables to denote the language, domain and source
jpayne@68 654 package.
jpayne@68 655 </p>
jpayne@68 656 <table><tr><td>&nbsp;</td><td><pre class="smallexample">$ lang=nl # your language
jpayne@68 657 $ domain=coreutils # the name of the domain to be handled
jpayne@68 658 $ package=/usr/src/gnu/coreutils-4.5.4 # the package where it comes from
jpayne@68 659 </pre></td></tr></table>
jpayne@68 660
jpayne@68 661 <p>She takes the latest copy of &lsquo;<tt>$lang.po</tt>&rsquo; from the Translation Project,
jpayne@68 662 or from the package (in most cases, &lsquo;<tt>$package/po/$lang.po</tt>&rsquo;), or
jpayne@68 663 creates a fresh one if she's the first translator (see <a href="gettext_6.html#SEC45">Creating a New PO File</a>).
jpayne@68 664 She then uses the following commands to mark the not urgent messages as
jpayne@68 665 &quot;obsolete&quot;. (This doesn't mean that these messages - translated and
jpayne@68 666 untranslated ones - will go away. It simply means that the PO file editor
jpayne@68 667 will ignore them in the following editing session.)
jpayne@68 668 </p>
jpayne@68 669 <table><tr><td>&nbsp;</td><td><pre class="smallexample">$ msggrep --domain=$domain missing.po | grep -v '^domain' \
jpayne@68 670 &gt; $domain-missing.po
jpayne@68 671 $ msgattrib --set-obsolete --ignore-file $domain-missing.po $domain.$lang.po \
jpayne@68 672 &gt; $domain.$lang-urgent.po
jpayne@68 673 </pre></td></tr></table>
jpayne@68 674
jpayne@68 675 <p>The she translates &lsquo;<tt>$domain.$lang-urgent.po</tt>&rsquo; by use of a PO file editor
jpayne@68 676 (see section <a href="gettext_8.html#SEC63">Editing PO Files</a>).
jpayne@68 677 (FIXME: I don't know whether <code>KBabel</code> and <code>gtranslator</code> also
jpayne@68 678 preserve obsolete messages, as they should.)
jpayne@68 679 Finally she restores the not urgent messages (with their earlier
jpayne@68 680 translations, for those which were already translated) through this command:
jpayne@68 681 </p>
jpayne@68 682 <table><tr><td>&nbsp;</td><td><pre class="smallexample">$ msgmerge --no-fuzzy-matching $domain.$lang-urgent.po $package/po/$domain.pot \
jpayne@68 683 &gt; $domain.$lang.po
jpayne@68 684 </pre></td></tr></table>
jpayne@68 685
jpayne@68 686 <p>Then she can submit &lsquo;<tt>$domain.$lang.po</tt>&rsquo; and proceed to the next domain.
jpayne@68 687 </p>
jpayne@68 688
jpayne@68 689 <table cellpadding="1" cellspacing="1" border="0">
jpayne@68 690 <tr><td valign="middle" align="left">[<a href="#SEC217" title="Beginning of this chapter or previous chapter"> &lt;&lt; </a>]</td>
jpayne@68 691 <td valign="middle" align="left">[<a href="gettext_13.html#SEC230" title="Next chapter"> &gt;&gt; </a>]</td>
jpayne@68 692 <td valign="middle" align="left"> &nbsp; </td>
jpayne@68 693 <td valign="middle" align="left"> &nbsp; </td>
jpayne@68 694 <td valign="middle" align="left"> &nbsp; </td>
jpayne@68 695 <td valign="middle" align="left"> &nbsp; </td>
jpayne@68 696 <td valign="middle" align="left"> &nbsp; </td>
jpayne@68 697 <td valign="middle" align="left">[<a href="gettext_toc.html#SEC_Top" title="Cover (top) of document">Top</a>]</td>
jpayne@68 698 <td valign="middle" align="left">[<a href="gettext_toc.html#SEC_Contents" title="Table of contents">Contents</a>]</td>
jpayne@68 699 <td valign="middle" align="left">[<a href="gettext_21.html#SEC389" title="Index">Index</a>]</td>
jpayne@68 700 <td valign="middle" align="left">[<a href="gettext_abt.html#SEC_About" title="About (help)"> ? </a>]</td>
jpayne@68 701 </tr></table>
jpayne@68 702 <p>
jpayne@68 703 <font size="-1">
jpayne@68 704 This document was generated by <em>Bruno Haible</em> on <em>February, 21 2024</em> using <a href="https://www.nongnu.org/texi2html/"><em>texi2html 1.78a</em></a>.
jpayne@68 705 </font>
jpayne@68 706 <br>
jpayne@68 707
jpayne@68 708 </p>
jpayne@68 709 </body>
jpayne@68 710 </html>