You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
253 lines
10 KiB
253 lines
10 KiB
18 years ago
|
Localizing git-gui for your language
|
||
|
====================================
|
||
|
|
||
|
This short note is to help you, who reads and writes English and your
|
||
|
own language, help us getting git-gui localized for more languages. It
|
||
|
does not try to be a comprehensive manual of GNU gettext, which is the
|
||
|
i18n framework we use, but tries to help you get started by covering the
|
||
|
basics and how it is used in this project.
|
||
|
|
||
|
1. Getting started.
|
||
|
|
||
|
You would first need to have a working "git". Your distribution may
|
||
|
have it as "git-core" package (do not get "GNU Interactive Tools" --
|
||
|
that is a different "git"). You would also need GNU gettext toolchain
|
||
|
to test the resulting translation out. Although you can work on message
|
||
|
translation files with a regular text editor, it is a good idea to have
|
||
|
specialized so-called "po file editors" (e.g. emacs po-mode, KBabel,
|
||
|
poedit, GTranslator --- any of them would work well). Please install
|
||
|
them.
|
||
|
|
||
|
You would then need to clone the git-gui internationalization project
|
||
|
repository, so that you can work on it:
|
||
|
|
||
|
$ git clone mob@repo.or.cz:/srv/git/git-gui/git-gui-i18n.git/
|
||
|
$ cd git-gui-i18n
|
||
|
$ git checkout --track -b mob origin/mob
|
||
|
$ git config remote.origin.push mob
|
||
|
|
||
|
The "git checkout" command creates a 'mob' branch from upstream's
|
||
|
corresponding branch and makes it your current branch. You will be
|
||
|
working on this branch.
|
||
|
|
||
|
The "git config" command records in your repository configuration file
|
||
|
that you would push "mob" branch to the upstream when you say "git
|
||
|
push".
|
||
|
|
||
|
|
||
|
2. Starting a new language.
|
||
|
|
||
|
In the git-gui-i18n directory is a po/ subdirectory. It has a
|
||
|
handful files whose names end with ".po". Is there a file that has
|
||
|
messages in your language?
|
||
|
|
||
|
If you do not know what your language should be named, you need to find
|
||
|
it. This currently follows ISO 639-1 two letter codes:
|
||
|
|
||
|
http://www.loc.gov/standards/iso639-2/php/code_list.php
|
||
|
|
||
|
For example, if you are preparing a translation for Afrikaans, the
|
||
|
language code is "af". If there already is a translation for your
|
||
|
language, you do not have to perform any step in this section, but keep
|
||
|
reading, because we are covering the basics.
|
||
|
|
||
|
If you did not find your language, you would need to start one yourself.
|
||
|
Copy po/git-gui.pot file to po/af.po (replace "af" with the code for
|
||
|
your language). Edit the first several lines to match existing *.po
|
||
|
files to make it clear this is a translation table for git-gui project,
|
||
|
and you are the primary translator. The result of your editing would
|
||
|
look something like this:
|
||
|
|
||
|
# Translation of git-gui to Afrikaans
|
||
|
# Copyright (C) 2007 Shawn Pearce
|
||
|
# This file is distributed under the same license as the git-gui package.
|
||
|
# YOUR NAME <YOUR@E-MAIL.ADDRESS>, 2007.
|
||
|
#
|
||
|
#, fuzzy
|
||
|
msgid ""
|
||
|
msgstr ""
|
||
|
"Project-Id-Version: git-gui\n"
|
||
|
"Report-Msgid-Bugs-To: \n"
|
||
|
"POT-Creation-Date: 2007-07-24 22:19+0300\n"
|
||
|
"PO-Revision-Date: 2007-07-25 18:00+0900\n"
|
||
|
"Last-Translator: YOUR NAME <YOUR@E-MAIL.ADDRESS>\n"
|
||
|
"Language-Team: Afrikaans\n"
|
||
|
"MIME-Version: 1.0\n"
|
||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||
|
"Content-Transfer-Encoding: 8bit\n"
|
||
|
|
||
|
You will find many pairs of a "msgid" line followed by a "msgstr" line.
|
||
|
These pairs define how messages in git-gui application are translated to
|
||
|
your language. Your primarily job is to fill in the empty double quote
|
||
|
pairs on msgstr lines with the translation of the strings on their
|
||
|
matching msgid lines. A few tips:
|
||
|
|
||
|
- Control characters, such as newlines, are written in backslash
|
||
|
sequence similar to string literals in the C programming language.
|
||
|
When the string given on a msgid line has such a backslash sequence,
|
||
|
you would typically want to have corresponding ones in the string on
|
||
|
your msgstr line.
|
||
|
|
||
18 years ago
|
- Some messages contain an optional context indicator at the end,
|
||
|
for example "@@noun" or "@@verb". This indicator allows the
|
||
|
software to select the correct translation depending upon the use.
|
||
|
The indicator is not actually part of the message and will not
|
||
|
be shown to the end-user.
|
||
|
|
||
|
If your language does not require a different translation you
|
||
|
will still need to translate both messages.
|
||
|
|
||
18 years ago
|
- Often the messages being translated are format strings given to
|
||
|
"printf()"-like functions. Make sure "%s", "%d", and "%%" in your
|
||
|
translated messages match the original.
|
||
|
|
||
17 years ago
|
When you have to change the order of words, you can add "<number>$"
|
||
18 years ago
|
between '%' and the conversion ('s', 'd', etc.) to say "<number>-th
|
||
|
parameter to the format string is used at this point". For example,
|
||
|
if the original message is like this:
|
||
|
|
||
|
"Length is %d, Weight is %d"
|
||
|
|
||
|
and if for whatever reason your translation needs to say weight first
|
||
|
and then length, you can say something like:
|
||
|
|
||
17 years ago
|
"WEIGHT IS %2$d, LENGTH IS %1$d"
|
||
18 years ago
|
|
||
17 years ago
|
A format specification with a '*' (asterisk) refers to *two* arguments
|
||
|
instead of one, hence the succeeding argument number is two higher
|
||
|
instead of one. So, a message like this
|
||
|
|
||
|
"%s ... %*i of %*i %s (%3i%%)"
|
||
|
|
||
|
is equivalent to
|
||
|
|
||
|
"%1$s ... %2$*i of %4$*i %6$s (%7$3i%%)"
|
||
18 years ago
|
|
||
|
- A long message can be split across multiple lines by ending the
|
||
|
string with a double quote, and starting another string on the next
|
||
|
line with another double quote. They will be concatenated in the
|
||
|
result. For example:
|
||
|
|
||
|
#: lib/remote_branch_delete.tcl:189
|
||
|
#, tcl-format
|
||
|
msgid ""
|
||
|
"One or more of the merge tests failed because you have not fetched the "
|
||
|
"necessary commits. Try fetching from %s first."
|
||
|
msgstr ""
|
||
|
"HERE YOU WILL WRITE YOUR TRANSLATION OF THE ABOVE LONG "
|
||
|
"MESSAGE IN YOUR LANGUAGE."
|
||
|
|
||
|
You can test your translation by running "make install", which would
|
||
|
create po/af.msg file and installs the result, and then running the
|
||
|
resulting git-gui under your locale:
|
||
|
|
||
|
$ make install
|
||
|
$ LANG=af git-gui
|
||
|
|
||
18 years ago
|
There is a trick to test your translation without first installing:
|
||
18 years ago
|
|
||
|
$ make
|
||
|
$ LANG=af ./git-gui.sh
|
||
|
|
||
|
When you are satisfied with your translation, commit your changes, and
|
||
|
push it back to the 'mob' branch:
|
||
|
|
||
|
$ edit po/af.po
|
||
|
... be sure to update Last-Translator: and
|
||
|
... PO-Revision-Date: lines.
|
||
|
$ git add po/af.po
|
||
|
$ git commit -m 'Started Afrikaans translation.'
|
||
|
$ git push
|
||
|
|
||
|
|
||
|
3. Updating your translation.
|
||
|
|
||
|
There may already be a translation for your language, and you may want
|
||
|
to contribute an update. This may be because you would want to improve
|
||
|
the translation of existing messages, or because the git-gui software
|
||
|
itself was updated and there are new messages that need translation.
|
||
|
|
||
|
In any case, make sure you are up-to-date before starting your work:
|
||
|
|
||
|
$ git pull
|
||
|
|
||
|
In the former case, you will edit po/af.po (again, replace "af" with
|
||
|
your language code), and after testing and updating the Last-Translator:
|
||
|
and PO-Revision-Date: lines, "add/commit/push" as in the previous
|
||
|
section.
|
||
|
|
||
|
By comparing "POT-Creation-Date:" line in po/git-gui.pot file and
|
||
|
po/af.po file, you can tell if there are new messages that need to be
|
||
|
translated. You would need the GNU gettext package to perform this
|
||
|
step.
|
||
|
|
||
|
$ msgmerge -U po/af.po po/git-gui.pot
|
||
|
|
||
|
This updates po/af.po (again, replace "af" with your language
|
||
|
code) so that it contains msgid lines (i.e. the original) that
|
||
|
your translation did not have before. There are a few things to
|
||
|
watch out for:
|
||
|
|
||
|
- The original text in English of an older message you already
|
||
|
translated might have been changed. You will notice a comment line
|
||
|
that begins with "#, fuzzy" in front of such a message. msgmerge
|
||
|
tool made its best effort to match your old translation with the
|
||
|
message from the updated software, but you may find cases that it
|
||
|
matched your old translated message to a new msgid and the pairing
|
||
|
does not make any sense -- you would need to fix them, and then
|
||
|
remove the "#, fuzzy" line from the message (your fixed translation
|
||
|
of the message will not be used before you remove the marker).
|
||
|
|
||
|
- New messages added to the software will have msgstr lines with empty
|
||
|
strings. You would need to translate them.
|
||
17 years ago
|
|
||
|
The po/git-gui.pot file is updated by the internationalization
|
||
|
coordinator from time to time. You _could_ update it yourself, but
|
||
|
translators are discouraged from doing so because we would want all
|
||
|
language teams to be working off of the same version of git-gui.pot.
|
||
|
|
||
|
****************************************************************
|
||
|
|
||
|
This section is a note to the internationalization coordinator, and
|
||
|
translators do not have to worry about it too much.
|
||
|
|
||
|
The message template file po/git-gui.pot needs to be kept up to date
|
||
|
relative to the software the translations apply to, and it is the
|
||
|
responsibility of the internationalization coordinator.
|
||
|
|
||
|
When updating po/git-gui.pot file, however, _never_ run "msgmerge -U
|
||
|
po/xx.po" for individual language translations, unless you are absolutely
|
||
|
sure that there is no outstanding work on translation for language xx.
|
||
|
Doing so will create unnecessary merge conflicts and force needless
|
||
|
re-translation on translators. The translator however may not have access
|
||
|
to the msgmerge tool, in which case the coordinator may run it for the
|
||
|
translator as a service.
|
||
|
|
||
|
But mistakes do happen. Suppose a translation was based on an older
|
||
|
version X, the POT file was updated at version Y and then msgmerge was run
|
||
|
at version Z for the language, and the translator sent in a patch based on
|
||
|
version X:
|
||
|
|
||
|
? translated
|
||
|
/
|
||
|
---X---Y---Z (master)
|
||
|
|
||
|
The coordinator could recover from such a mistake by first applying the
|
||
|
patch to X, replace the translated file in Z, and then running msgmerge
|
||
|
again based on the updated POT file and commit the result. The sequence
|
||
|
would look like this:
|
||
|
|
||
|
$ git checkout X
|
||
|
$ git am -s xx.patch
|
||
|
$ git checkout master
|
||
|
$ git checkout HEAD@{1} po/xx.po
|
||
|
$ msgmerge -U po/xx.po po/git-gui.pot
|
||
|
$ git commit -c HEAD@{1} po/xx.po
|
||
|
|
||
|
State in the message that the translated messages are based on a slightly
|
||
|
older version, and msgmerge was run to incorporate changes to message
|
||
|
templates from the updated POT file. The result needs to be further
|
||
|
translated, but at least the messages that were updated by the patch that
|
||
|
were not changed by the POT update will survive the process and do not
|
||
|
need to be re-translated.
|