Differences between revisions 7 and 50 (spanning 43 versions)
Revision 7 as of 2009-02-02 22:41:38
Size: 4665
Comment: Linked to i18nstat extension
Revision 50 as of 2009-07-25 22:00:21
Size: 9233
Comment: Links to both hg-i18n and hg-i18n-stable
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
#pragma section-numbers 2
Line 3: Line 5:
  /!\ Mercurial has not yet been released with translation support, you will need to [:Download:download the source] and install that.

This page will describe how you can help internationalize
Mercurial by translating it into your language of choice. Mercurial uses the standard i18n [http://www.gnu.org/software/gettext/ Gettext] infrastructure, and we will only give a quick introduction to it here. Please take a look at the Gettext manual if you are unfamiliar with translating software.
This page will describe how you can help internationalize Mercurial by
translating it into your language of choice.
Mercurial uses the
standard i18n [[http://www.gnu.org/software/gettext/|Gettext]]
infrastructure, and we will only give a quick introduction to it here.
Please take a look at the Gettext manual if you are unfamiliar with
translating software.

<<TableOfContents>>
Line 9: Line 16:
If you find that Mercurial is not yet translated into your favorite language, then you can start one. First contact the development MailingList to see if an effort is already underway.

Translations are stored as `xx.po` and `xx_yy.po` files in the `i18n/` directory. The `xx` corresponds to the language code of the translation and the `yy` is the optional country code. Find your language code in the [http://www.gnu.org/software/gettext/manual/html_node/Usual-Language-Codes.html ISO 639-1 list] and, if needed, your country code in [http://www.gnu.org/software/gettext/manual/html_node/Country-Codes.html ISO 3166 list].

To create a new translation you first create a `i18n/hg.pot` file. This is can be done with the Makefile:
If you find that Mercurial is not yet translated into your favorite
language, then you can start one. First look at the bottom of this
page or
contact the development MailingList to see if an effort is
already underway. There is also the
[[http://www.transifex.net/projects/mercurial/|Transifex]] listing
.

Translations are stored as `xx.po` and `xx_yy.po` files in the `i18n/`
directory. The `xx` corresponds to the language code of the
translation and the `yy` is the optional country code. Find your
language code in the
[
[http://www.gnu.org/software/gettext/manual/html_node/Usual-Language-Codes.html|ISO 639-1 list]] and, if needed, your country code in
[
[http://www.gnu.org/software/gettext/manual/html_node/Country-Codes.html|ISO 3166 list]].

To create a new translation you first create a `i18n/hg.pot` file.
This is can be done with the Makefile:
Line 19: Line 36:
The Makefile requires the `pygettext` and `msgcat` programs. If you do not have `pygettext` installed you can find it [http://svn.python.org/view/python/trunk/Tools/i18n/ on the Python SVN server].

You create your translation from the `hg.pot` file. You can use the `msginit` program to start a new translation or you can copy the `hg.pot` file to the correct `xx.po` name.

Now edit the `xx.po` file with your favorite PO editor, such as [http://www.poedit.net/ Poedit] or Emacs. You can also simply edit the `xx.po` file with a text editor (such as !WordPad), but you must then be careful to keep the formatting.

To actually use the translation you need to compile the `xx.po` file into a `xx.mo`
If you have the `msgfmt` program installed you can do the compilation like this:
You create your translation from the `hg.pot` file. You can use the
`msginit` program to start a new translation or you can copy the
`hg.pot` file to the correct `xx.po` name.

Now edit the `xx.po` file with your favorite PO editor, such as
[[http://www.poedit.net/|Poedit]] or Emacs. You can also simply edit
the `xx.po` file with a text editor (such as !WordPad), but you must
then be careful to keep the formatting.

To actually use the translation you need to compile the `xx.po` file
into a `xx.mo` If you have the `msgfmt` program installed you can do
the compilation like this:
Line 31: Line 53:
Alternatively, you can let Poedit do the compilation or you can use the `msgfmt.py` script found alongside the `pygettext.py` script. The resulting file should be called `hg.mo` and must be saved as Alternatively, you can let Poedit or another PO editor do the
compilation. The resulting file should be called `hg.mo` and must be
saved as
Line 35: Line 60:
Using `setup.py` does this for you, if you compiled the `xx.po` file manually you have to create the directory structure yourself.

Now ensure that your LANGUAGE environment variable is set to 'xx'. In a shell from the Bash-family you do this by:
Using `setup.py` does this for you, if you compiled the `xx.po` file
manually you have to create the directory structure yourself.

Now ensure that your LANGUAGE environment variable is set to 'xx'. In
a shell from the Bash-family you do this by:
Line 45: Line 72:
When changes are made to the Mercurial source, new strings will appear that must be translated. Updating an old translation to take these strings into account is easy: regenerate the `hg.pot` file as above and use the `msgmerge` program to merge new strings into the translation: When changes are made to the Mercurial source, new strings will appear
that must be translated. Updating an old translation to take these
strings into account is easy: regenerate the `hg.pot` file as above
and use the `msgmerge` program to merge new strings into the
translation:
Line 50: Line 81:
Antother way is to call make with the po-file
{{{
make i18n/xx.po
}}}

This combines the regeneration of `hg.pot` and `msgmerge`.

Line 52: Line 91:
If you prefer to have the location information present while working on the translation, then leave out the {{{--no-location}}} flag above. The location info from `hg.pot` will then be merged into the `xx.po` file and you will be able to quickly jump to the source fo a given translation.

To avoid creating excessive diffs you must strip out this information before committing your translation:
If you prefer to have the location information present while working
on the translation, then leave out the {{{--no-location}}} flag above.
The location info from `hg.pot` will then be merged into the `xx.po`
file and you will be able to quickly jump to the source fo a given
translation.

To avoid creating excessive diffs you must strip out this information
before committing your translation:
Line 58: Line 102:
You should always use `hg diff` to check that your patch contains only the necessary changes. When you are happy with your translation, please use the PatchbombExtension to send it to the MailingList. You should always use `hg diff` to check that your patch contains only
the necessary changes.

== Submitting ==

When you are happy with your translation, please notify MartinGeisler.
The easiest way is to join {{{#mercurial}}} on
{{{irc.freenode.net}}} and contact {{{mg}}} with a URL where the
update can be pulled from. He will then push the changes to the
[[http://bitbucket.org/mg/hg-i18n/|i18n queue]] from where they will
eventually be pulled into the main repository.

If your change concerns the stable branch, then please work against
the [[http://bitbucket.org/mg/hg-i18n-stable/|i18n-stable queue]]
instead. It is then '''imperative''' that you merge your stable branch
into your main branch. The rule is that your {{{xx}}} repository must
always be a ''superset'' of your {{{xx-stable}}} repository. That will
ensure that {{{i18n}}} remains a superset of {{{i18n-stable}}} and so
no merges will be necessary later.

Please rebase your changesets to the tip of the target repository before
submitting them for inclusion. That will keep the number of merges to
a minimum and simplify the history graph.

== Formatting ==

The translations of command help texts should be word-wrapped at 78
characters. Please follow this pattern:
{{{
short description, starting with lowercase

    Larger description of the command. Each paragraph should be word-wrapped
    at 70 characters and indented with 4 spaces.

    Paragraphs are separated by a single empty line. Use a single space
    between sentences.
}}}
Line 62: Line 142:
In order to translate the most important strings first, you may want to use the [http://bitbucket.org/mg/hg-i18nstat/ i18nstat extension]. This extension will log each string translated and count the number of times an untranslated string is used.

You simply have to enable the extension and then use Mercurial like normal. Use {{{hg i18nstat}}} to dump the accumulated statistics. When you translate one of the missing strings, it will disappear from the statistics the next time it is used (the extension wont notice that it is translated unless the string is used).
List your tips and tricks here.

=== Importing strings from TortoiseHg ===

The [[http://bitbucket.org/tortoisehg/stable/wiki/Home|TortoiseHg]]
project has made a number of translations and about 50 of the strings
from their project overlap with the strings in Mercurial. To reuse
them, start by downloading the latest version for your language. The
URL are of this form:
{{{
http://bitbucket.org/tortoisehg/crew/raw/tip/i18n/tortoisehg-xx.po
}}}
Use {{{wget}}} or your browser to download the file and save it to the
{{{i18n}}} folder. Then extract the strings common to both
translations:
{{{
msgcomm tortoisehg-xx.po hg.pot -o common-xx.po
}}}
It is important to list the {{{tortoisehg-xx.po}}} file first since
each translation is taken from that file. Now concatenate the two
files using {{{msgcat}}}:
{{{
msgcat --no-location hg.pot common-xx.po xx.po -o xx.po
}}}
The {{{hg.pot}}} file is there to ensure that the strings remain in
the order given in that file.

Some of the translations may conflict between the two projects. This
is marked like this in the {{{xx.po}}} file (this is from the German
translation):
{{{
msgid "unrecognized response\n"
msgstr ""
"#-#-#-#-# de.po (Mercurial) #-#-#-#-#\n"
"Unbekannte Antwort\n"
"#-#-#-#-# tortoisehg-de.po (tortoisehg) #-#-#-#-#\n"
"nicht erkannte antwort\n"
}}}
You must go through the {{{xx.po}}} file and resolve these conflicts.
In the example above, the translation for Mercurial used "Unbekannte
Antword" whereas the translation for TortoiseHg used "nicht erkannte
antwort". Delete the lines marked with "{{{#-#-#-#-#}}}" and delete
the translation you don't like. Talk to the TortoiseHg translator and
try to agree on a common terminology --- that will make future imports
easier for both of you.

=== Attacking the most used strings first ===

In order to translate the most important strings first, you may want
to use the [[http://bitbucket.org/mg/hg-i18nstat/|i18nstat extension]].
This extension will log each string translated and count
the number of times an untranslated string is used.

You simply have to enable the extension and then use Mercurial like
normal. Use {{{hg i18nstat}}} to dump the accumulated statistics. When
you translate one of the missing strings, it will disappear from the
statistics the next time it is used (the extension wont notice that it
is translated unless the string is used).

Line 68: Line 205:
Translations distributed with Mercurial:

 * Chinese (in progress)
 * Danish (in progress)
Translations distributed with Mercurial (see also the
[[http://www.transifex.net/projects/mercurial/|Transifex]] listing):

 * Brazilian Portuguese (WagnerBruna) -- Development takes place at http://bitbucket.org/wbruna/mercurial-i18n-pt_br/
 * Danish (MartinGeisler)
 * French Mercurial (CedricDuval) -- repository: https://bitbucket.org/cedric/mercurial-l10n-fr/ (same mailing list as for the French hgbook)
 * German (TobiasBell) -- Development takes place at http://bitbucket.org/tobidope/mercurial-german-translation/
 * Greek (GiorgosKeramidas) -- repository: http://bitbucket.org/keramida/mercurial-i18n/
 * Italian (StefanoTortarolo)
 * Japanese (KatsunoriFujiwara) -- Development takes place at http://bitbucket.org/foozy/mercurial-translation-ja/
 * Simplified Chinese (DongshengSong) -- Development takes place at http://bitbucket.org/dongsheng/mercurial-i18n/
 * Traditional Chinese (Chia-Huan Wu) -- patch queue: http://bitbucket.org/willie/hg-cht-translation/
Line 75: Line 220:
 * French hgbook (RomainPelisse) -- patch queue: http://bitbucket.org/rpelisse/hgbook-fr/ , dedicated mailing list : hgfr-subscribe@flibuste.net, archived at http://www.mail-archive.com/hgfr@flibuste.net/ (obviously, the mailing list is in French :) )
Line 76: Line 222:

Please contact the person listed above if you would like to help with
a particular language. If you want to start a new translation, then
add the language and your name to the list and go ahead.

----
CategoryChinese CategoryChinese

Internationalizing Mercurial

This page will describe how you can help internationalize Mercurial by translating it into your language of choice. Mercurial uses the standard i18n Gettext infrastructure, and we will only give a quick introduction to it here. Please take a look at the Gettext manual if you are unfamiliar with translating software.

1. Starting a New Translation

If you find that Mercurial is not yet translated into your favorite language, then you can start one. First look at the bottom of this page or contact the development MailingList to see if an effort is already underway. There is also the Transifex listing.

Translations are stored as xx.po and xx_yy.po files in the i18n/ directory. The xx corresponds to the language code of the translation and the yy is the optional country code. Find your language code in the ISO 639-1 list and, if needed, your country code in ISO 3166 list.

To create a new translation you first create a i18n/hg.pot file. This is can be done with the Makefile:

% make update-pot

You create your translation from the hg.pot file. You can use the msginit program to start a new translation or you can copy the hg.pot file to the correct xx.po name.

Now edit the xx.po file with your favorite PO editor, such as Poedit or Emacs. You can also simply edit the xx.po file with a text editor (such as WordPad), but you must then be careful to keep the formatting.

To actually use the translation you need to compile the xx.po file into a xx.mo If you have the msgfmt program installed you can do the compilation like this:

% python setup.py build_mo

Alternatively, you can let Poedit or another PO editor do the compilation. The resulting file should be called hg.mo and must be saved as

locale/xx/LC_MESSAGES/hg.mo

Using setup.py does this for you, if you compiled the xx.po file manually you have to create the directory structure yourself.

Now ensure that your LANGUAGE environment variable is set to 'xx'. In a shell from the Bash-family you do this by:

% export LANGUAGE=xx

Then run hg to see if your translations are picked up.

2. Updating a Translation

When changes are made to the Mercurial source, new strings will appear that must be translated. Updating an old translation to take these strings into account is easy: regenerate the hg.pot file as above and use the msgmerge program to merge new strings into the translation:

msgmerge --no-location --update i18n/xx.po i18n/hg.pot

Antother way is to call make with the po-file

make i18n/xx.po

This combines the regeneration of hg.pot and msgmerge.

Then translate the new strings, make the xx.mo file and enjoy.

If you prefer to have the location information present while working on the translation, then leave out the --no-location flag above. The location info from hg.pot will then be merged into the xx.po file and you will be able to quickly jump to the source fo a given translation.

To avoid creating excessive diffs you must strip out this information before committing your translation:

msgcat --no-location -o xx.po xx.po

You should always use hg diff to check that your patch contains only the necessary changes.

3. Submitting

When you are happy with your translation, please notify MartinGeisler. The easiest way is to join #mercurial on irc.freenode.net and contact mg with a URL where the update can be pulled from. He will then push the changes to the i18n queue from where they will eventually be pulled into the main repository.

If your change concerns the stable branch, then please work against the i18n-stable queue instead. It is then imperative that you merge your stable branch into your main branch. The rule is that your xx repository must always be a superset of your xx-stable repository. That will ensure that i18n remains a superset of i18n-stable and so no merges will be necessary later.

Please rebase your changesets to the tip of the target repository before submitting them for inclusion. That will keep the number of merges to a minimum and simplify the history graph.

4. Formatting

The translations of command help texts should be word-wrapped at 78 characters. Please follow this pattern:

short description, starting with lowercase

    Larger description of the command. Each paragraph should be word-wrapped
    at 70 characters and indented with 4 spaces.

    Paragraphs are separated by a single empty line. Use a single space
    between sentences.

5. Tips

List your tips and tricks here.

5.1. Importing strings from TortoiseHg

The TortoiseHg project has made a number of translations and about 50 of the strings from their project overlap with the strings in Mercurial. To reuse them, start by downloading the latest version for your language. The URL are of this form:

http://bitbucket.org/tortoisehg/crew/raw/tip/i18n/tortoisehg-xx.po

Use wget or your browser to download the file and save it to the i18n folder. Then extract the strings common to both translations:

msgcomm tortoisehg-xx.po hg.pot -o common-xx.po

It is important to list the tortoisehg-xx.po file first since each translation is taken from that file. Now concatenate the two files using msgcat:

msgcat --no-location hg.pot common-xx.po xx.po -o xx.po

The hg.pot file is there to ensure that the strings remain in the order given in that file.

Some of the translations may conflict between the two projects. This is marked like this in the xx.po file (this is from the German translation):

msgid "unrecognized response\n"
msgstr ""
"#-#-#-#-#  de.po (Mercurial)  #-#-#-#-#\n"
"Unbekannte Antwort\n"
"#-#-#-#-#  tortoisehg-de.po (tortoisehg)  #-#-#-#-#\n"
"nicht erkannte antwort\n"

You must go through the xx.po file and resolve these conflicts. In the example above, the translation for Mercurial used "Unbekannte Antword" whereas the translation for TortoiseHg used "nicht erkannte antwort". Delete the lines marked with "#-#-#-#-#" and delete the translation you don't like. Talk to the TortoiseHg translator and try to agree on a common terminology --- that will make future imports easier for both of you.

5.2. Attacking the most used strings first

In order to translate the most important strings first, you may want to use the i18nstat extension. This extension will log each string translated and count the number of times an untranslated string is used.

You simply have to enable the extension and then use Mercurial like normal. Use hg i18nstat to dump the accumulated statistics. When you translate one of the missing strings, it will disappear from the statistics the next time it is used (the extension wont notice that it is translated unless the string is used).

6. Existing Translations

Translations distributed with Mercurial (see also the Transifex listing):

Translations not yet distributed with Mercurial:

Please contact the person listed above if you would like to help with a particular language. If you want to start a new translation, then add the language and your name to the list and go ahead.


CategoryChinese CategoryChinese

TranslatingMercurial (last edited 2016-04-06 22:23:52 by timeless)