Difference between revisions of "GettextForTranslators"

From The Battle for Wesnoth Wiki
 
(Gettext for translators)
Line 5: Line 5:
 
* wesnoth-editor
 
* wesnoth-editor
 
* wesnoth-lib (contains strings shared by game and editor)
 
* wesnoth-lib (contains strings shared by game and editor)
* plus one text-domain for each campaign. The names of these
+
* plus one text-domain for each campaign. The names of these text-domains are constructed from the word wesnoth and the common abbreviation of the campaign (wesnoth-ei, wesnoth-httt, wesnoth-sotbe,
text-domains are constructed from the word wesnoth and the common
 
abbreviation of the campaign (wesnoth-ei, wesnoth-httt, wesnoth-sotbe,
 
 
wesnoth-tdh and wesnoth-trow).
 
wesnoth-tdh and wesnoth-trow).
  
We will use the Swedish (sv) language and the ''wesnoth''
+
We will use the Swedish (sv) language and the ''wesnoth'' domain as an example in this page.
domain as an example in this page.
 
 
There are three important files for each text-domain:
 
There are three important files for each text-domain:
* ''wesnoth/wesnoth.pot'' file, which contains all the strings used in the main game
+
* ''wesnoth/wesnoth.pot'' file, which contains all the strings used in the main game (neither editor, nor campaign strings). You can see how a ''.pot'' file looks like in CVS:
(neither editor, nor campaign strings).
+
<a href="http://svn.gna.org/viewcvs/wesnoth/trunk/po/wesnoth/wesnoth.pot?view=markup">Current CVS version</a>.
You can see how a ''.pot'' file looks like in CVS:
+
* ''wesnoth/sv.po'', the file containing the translation, you can see how a ''.po'' file looks like in CVS:
<a href="http://savannah.nongnu.org/cgi-bin/viewcvs/wesnoth/wesnoth/po/wesnoth/wesnoth.pot?rev=HEAD&content-type=text/vnd.viewcvs-
+
<a href="http://svn.gna.org/viewcvs/wesnoth/trunk/po/wesnoth/sv.po?view=markup">Current CVS version</a>.
markup">Current
+
* ''{translations_dir}/sv/LC_MESSAGES/wesnoth.gmo'', which is a binary version of <lang>.po that the game will use for efficiency reasons. This is not found in cvs, but is created during compilation of the game.
CVS version</a>.
 
* ''wesnoth/sv.po'', the file containing the translation,
 
you can see how a ''.po'' file looks like in CVS:
 
<a href="http://savannah.nongnu.org/cgi-bin/viewcvs/wesnoth/wesnoth/po/wesnoth/sv.po?rev=HEAD&content-type=text/vnd.viewcvs-markup">Current
 
CVS version</a>.
 
* ''{translations_dir}/sv/LC_MESSAGES/wesnoth.gmo'', which is a binary
 
version of <lang>.po that the game will use for efficiency reasons.
 
This is not found in cvs, but is created during compilation of the game.
 
  
The first of these files, we update every once in a while,
+
The first of these files, we update every once in a while, when there is new or modified text,
when there is new or modified text,
 
 
for instance when a new campaign scenario hits the CVS.
 
for instance when a new campaign scenario hits the CVS.
  
Then, ''msgmerge'' is used to merge this new "state of the game strings"
+
Then, ''msgmerge'' is used to merge this new "state of the game strings" with your current translations, and generate a new, up-to-date, ''sv.po''.
with your current translations, and generate a new, up-to-date, ''sv.po''.
 
  
Then, a tool called ''msgfmt'' is called, which generates a new ''wesnoth.gmo''
+
Then, a tool called ''msgfmt'' is called, which generates a new ''wesnoth.gmo'' file from your ''wesnoth.po'' file, which will be used by the game once installed.
file from your ''wesnoth.po'' file, which will be used by the game once installed.
 
  
 
"make -C po update-po" does these three steps in one pass.
 
"make -C po update-po" does these three steps in one pass.
Line 43: Line 29:
 
translating new strings, checking "fuzzy" entries.
 
translating new strings, checking "fuzzy" entries.
 
We can handle the administrative tasks of updating etc.
 
We can handle the administrative tasks of updating etc.
You really don't need to bother with any of these commands, unless you want to
+
You really don't need to bother with any of these commands, unless you want to compile gmo files to check in-game.
compile gmo files to check in-game.
 
  
Ivanovic is now responsible for integrating translations into Wesnoth,
+
Ivanovic is now responsible for integrating translations into Wesnoth, with the help of Torangan and ott.
with the help of Torangan and ott.
+
You should contact Ivanovic (crazy-ivanovic AT gmx DOT net), and he'll put them in the game.
You should contact Ivanovic (crazy-ivanovic AT gmx DOT net),
 
and he'll put them in the game.
 
  
When sending po files to a maintainer to be included in CVS, please
+
When sending po files to a maintainer to be included in CVS, please create a zip or tar archive that you attach, rather than cutting and pasting the translations into an email.  The translated strings are
create a zip or tar archive that you attach, rather than cutting and
+
very sensitive to formatting and the archive will also help distinguish which file is which when sending more than one po file.
pasting the translations into an email.  The translated strings are
 
very sensitive to formatting and the archive will also help distinguish
 
which file is which when sending more than one po file.
 
  
 
==  FAQ  ==
 
==  FAQ  ==
Line 142: Line 122:
 
* [[GettextForWesnothDevelopers]]
 
* [[GettextForWesnothDevelopers]]
 
* [http://gettext.wesnoth.org/ Translation statistics]
 
* [http://gettext.wesnoth.org/ Translation statistics]
 

Revision as of 18:34, 21 September 2005

Gettext for translators

Wesnoth translation is now divided into several text-domains:

  • wesnoth
  • wesnoth-editor
  • wesnoth-lib (contains strings shared by game and editor)
  • plus one text-domain for each campaign. The names of these text-domains are constructed from the word wesnoth and the common abbreviation of the campaign (wesnoth-ei, wesnoth-httt, wesnoth-sotbe,

wesnoth-tdh and wesnoth-trow).

We will use the Swedish (sv) language and the wesnoth domain as an example in this page. There are three important files for each text-domain:

  • wesnoth/wesnoth.pot file, which contains all the strings used in the main game (neither editor, nor campaign strings). You can see how a .pot file looks like in CVS:

<a href="http://svn.gna.org/viewcvs/wesnoth/trunk/po/wesnoth/wesnoth.pot?view=markup">Current CVS version</a>.

  • wesnoth/sv.po, the file containing the translation, you can see how a .po file looks like in CVS:

<a href="http://svn.gna.org/viewcvs/wesnoth/trunk/po/wesnoth/sv.po?view=markup">Current CVS version</a>.

  • {translations_dir}/sv/LC_MESSAGES/wesnoth.gmo, which is a binary version of <lang>.po that the game will use for efficiency reasons. This is not found in cvs, but is created during compilation of the game.

The first of these files, we update every once in a while, when there is new or modified text, for instance when a new campaign scenario hits the CVS.

Then, msgmerge is used to merge this new "state of the game strings" with your current translations, and generate a new, up-to-date, sv.po.

Then, a tool called msgfmt is called, which generates a new wesnoth.gmo file from your wesnoth.po file, which will be used by the game once installed.

"make -C po update-po" does these three steps in one pass.

That was for the "Big Picture". But you really just need to be concerned with the po file: translating new strings, checking "fuzzy" entries. We can handle the administrative tasks of updating etc. You really don't need to bother with any of these commands, unless you want to compile gmo files to check in-game.

Ivanovic is now responsible for integrating translations into Wesnoth, with the help of Torangan and ott. You should contact Ivanovic (crazy-ivanovic AT gmx DOT net), and he'll put them in the game.

When sending po files to a maintainer to be included in CVS, please create a zip or tar archive that you attach, rather than cutting and pasting the translations into an email. The translated strings are very sensitive to formatting and the archive will also help distinguish which file is which when sending more than one po file.

FAQ

  • What's a fuzzy string?
    • It's a string calling for translator revision. For example,

if an English string gets a small change and you run the msgmerge program, it will mark the translation of that string fuzzy. When we switched to gettext we marked all translations as fuzzy as lots of them were outdated.

  • My language needs a different font to get displayed correctly.
    • Wesnoth uses several different fonts, and the number is likely

to grow with the support for new alphabets/writing systems. Right now we are using DejaVuSans (Roman and Cyrillic), FreeSans (Greek), sazanami-gothic (Japanese) and gkai00mp (Chinese). In the wesnoth/sv.po you will find a string containing the currently used fonts. By changing the order of fonts listed, you choose which font is preferred for your translations. A language using Greek letters would for instance translate that string with:

  msgid "DejaVuSans.ttf,FreeSans.ttf,sazanami-gothic.ttf,gkai00mp.ttf"
  msgstr "FreeSans.ttf,DejaVuSans.ttf,sazanami-gothic.ttf,gkai00mp.ttf"

Note that if a certain letter/glyph is not found in the first font listed, the second font will be scanned for it and so on.

  • What should I do to insert a newline in a string?
    • If you want to insert a newline in a string you need to include

the pair of characters " ". You can use normal newlines as you wish as they don't affect the translation.

  • How do I use ' within a single-quote delimited string when translating

text= in help screen texts?

    • Add a backslash before it.
  • What should I do with strings like "Prefs section^General"?
    • There are ambiguous strings which should be translated in a different way

depending on where they appear. For example, we have "General" in the preferences as "General preferences" and we can also have "a General". These strings can have different translations for a given language, so we use "context" to solve this. The prefix only tries to give a hint about the string, and should be not translated, for example:

  msgid "Prefs section^General"
  msgstr "General"
  • Who can I ask for further information?
    • You can ask Ivanovic, Torangan, ott, Yann or Isaac in IRC

(irc.freenode.net, #wesnoth or #wesnoth-dev). If you don't like IRC, send a mail to crazy-ivanovic AT gmx DOT net, or pm him (ivanovic) at the forum.

  • How do I quickly test PO file changes?
    • When you modify a PO file, run "make update-gmo" in the main po directory

to create a new MO file, then run "make install" there to install the new MO file.

    • Then force cache rebuild. This is tricky -- if you only update MO files,

the game may use a cached (i.e., old) version letting you wonder why it still displays the old translation. Either change game.cfg modification time, e.g. with "touch /usr/local/share/wesnoth/game.cfg", or delete the corresponding cache[s] in ~/.wesnoth/cache.

  • The .po file in CVS has changed, how do I move over the translations I've made?
    • If your file with additional translations is called old.po and the

new file from CVS is called cvs.po, create a new file called new.po by doing

  msgmerge -o new.po old.po cvs.po

The new file new.po will keep your translations from old.po as well as the new strings from cvs.po, but check the result -- some translations will not be possible to move across if the original strings changed, these are kept as comments at the end of the file.

Tools

There are several tools to work with .po files:

(Multiplatform)

PO plug-in (Multiplatform)

Of course, you can edit po files with any UTF-8 capable text editor, but the tools listed above have great advantages over any text editor regarding .po translation, like going to next fuzzy/untranslated string, searching only in specific fields (msgid, msgstr, comment), ...

See Also