git-gui / po / READMEon commit Merge branch 'mk/unpack-careful' (3c993de)
   1Localizing git-gui for your language
   2====================================
   3
   4This short note is to help you, who reads and writes English and your
   5own language, help us getting git-gui localized for more languages.  It
   6does not try to be a comprehensive manual of GNU gettext, which is the
   7i18n framework we use, but tries to help you get started by covering the
   8basics and how it is used in this project.
   9
  101. Getting started.
  11
  12You would first need to have a working "git".  Your distribution may
  13have it as "git-core" package (do not get "GNU Interactive Tools" --
  14that is a different "git").  You would also need GNU gettext toolchain
  15to test the resulting translation out.  Although you can work on message
  16translation files with a regular text editor, it is a good idea to have
  17specialized so-called "po file editors" (e.g. emacs po-mode, KBabel,
  18poedit, GTranslator --- any of them would work well).  Please install
  19them.
  20
  21You would then need to clone the git-gui internationalization project
  22repository, so that you can work on it:
  23
  24        $ git clone mob@repo.or.cz:/srv/git/git-gui/git-gui-i18n.git/
  25        $ cd git-gui-i18n
  26        $ git checkout --track -b mob origin/mob
  27        $ git config remote.origin.push mob
  28
  29The "git checkout" command creates a 'mob' branch from upstream's
  30corresponding branch and makes it your current branch.  You will be
  31working on this branch.
  32
  33The "git config" command records in your repository configuration file
  34that you would push "mob" branch to the upstream when you say "git
  35push".
  36
  37
  382. Starting a new language.
  39
  40In the git-gui-i18n directory is a po/ subdirectory.  It has a
  41handful files whose names end with ".po".  Is there a file that has
  42messages in your language?
  43
  44If you do not know what your language should be named, you need to find
  45it.  This currently follows ISO 639-1 two letter codes:
  46
  47        http://www.loc.gov/standards/iso639-2/php/code_list.php
  48
  49For example, if you are preparing a translation for Afrikaans, the
  50language code is "af".  If there already is a translation for your
  51language, you do not have to perform any step in this section, but keep
  52reading, because we are covering the basics.
  53
  54If you did not find your language, you would need to start one yourself.
  55Copy po/git-gui.pot file to po/af.po (replace "af" with the code for
  56your language).  Edit the first several lines to match existing *.po
  57files to make it clear this is a translation table for git-gui project,
  58and you are the primary translator.  The result of your editing would
  59look something like this:
  60
  61    # Translation of git-gui to Afrikaans
  62    # Copyright (C) 2007 Shawn Pearce
  63    # This file is distributed under the same license as the git-gui package.
  64    # YOUR NAME <YOUR@E-MAIL.ADDRESS>, 2007.
  65    #
  66    #, fuzzy
  67    msgid ""
  68    msgstr ""
  69    "Project-Id-Version: git-gui\n"
  70    "Report-Msgid-Bugs-To: \n"
  71    "POT-Creation-Date: 2007-07-24 22:19+0300\n"
  72    "PO-Revision-Date: 2007-07-25 18:00+0900\n"
  73    "Last-Translator: YOUR NAME <YOUR@E-MAIL.ADDRESS>\n"
  74    "Language-Team: Afrikaans\n"
  75    "MIME-Version: 1.0\n"
  76    "Content-Type: text/plain; charset=UTF-8\n"
  77    "Content-Transfer-Encoding: 8bit\n"
  78
  79You will find many pairs of a "msgid" line followed by a "msgstr" line.
  80These pairs define how messages in git-gui application are translated to
  81your language.  Your primarily job is to fill in the empty double quote
  82pairs on msgstr lines with the translation of the strings on their
  83matching msgid lines.  A few tips:
  84
  85 - Control characters, such as newlines, are written in backslash
  86   sequence similar to string literals in the C programming language.
  87   When the string given on a msgid line has such a backslash sequence,
  88   you would typically want to have corresponding ones in the string on
  89   your msgstr line.
  90
  91 - Some messages contain an optional context indicator at the end,
  92   for example "@@noun" or "@@verb".  This indicator allows the
  93   software to select the correct translation depending upon the use.
  94   The indicator is not actually part of the message and will not
  95   be shown to the end-user.
  96
  97   If your language does not require a different translation you
  98   will still need to translate both messages.
  99
 100 - Often the messages being translated are format strings given to
 101   "printf()"-like functions.  Make sure "%s", "%d", and "%%" in your
 102   translated messages match the original.
 103
 104   When you have to change the order of words, you can add "<number>\$"
 105   between '%' and the conversion ('s', 'd', etc.) to say "<number>-th
 106   parameter to the format string is used at this point".  For example,
 107   if the original message is like this:
 108
 109        "Length is %d, Weight is %d"
 110
 111   and if for whatever reason your translation needs to say weight first
 112   and then length, you can say something like:
 113
 114        "WEIGHT IS %2\$d, LENGTH IS %1\$d"
 115
 116   The reason you need a backslash before dollar sign is because
 117   this is a double quoted string in Tcl language, and without
 118   it the letter introduces a variable interpolation, which you
 119   do not want here.
 120
 121 - A long message can be split across multiple lines by ending the
 122   string with a double quote, and starting another string on the next
 123   line with another double quote.  They will be concatenated in the
 124   result.  For example:
 125
 126   #: lib/remote_branch_delete.tcl:189
 127   #, tcl-format
 128   msgid ""
 129   "One or more of the merge tests failed because you have not fetched the "
 130   "necessary commits.  Try fetching from %s first."
 131   msgstr ""
 132   "HERE YOU WILL WRITE YOUR TRANSLATION OF THE ABOVE LONG "
 133   "MESSAGE IN YOUR LANGUAGE."
 134
 135You can test your translation by running "make install", which would
 136create po/af.msg file and installs the result, and then running the
 137resulting git-gui under your locale:
 138
 139        $ make install
 140        $ LANG=af git-gui
 141
 142There is a trick to test your translation without first installing:
 143
 144        $ make
 145        $ LANG=af ./git-gui.sh
 146
 147When you are satisfied with your translation, commit your changes, and
 148push it back to the 'mob' branch:
 149
 150        $ edit po/af.po
 151        ... be sure to update Last-Translator: and
 152        ... PO-Revision-Date: lines.
 153        $ git add po/af.po
 154        $ git commit -m 'Started Afrikaans translation.'
 155        $ git push
 156
 157
 1583. Updating your translation.
 159
 160There may already be a translation for your language, and you may want
 161to contribute an update.  This may be because you would want to improve
 162the translation of existing messages, or because the git-gui software
 163itself was updated and there are new messages that need translation.
 164
 165In any case, make sure you are up-to-date before starting your work:
 166
 167        $ git pull
 168
 169In the former case, you will edit po/af.po (again, replace "af" with
 170your language code), and after testing and updating the Last-Translator:
 171and PO-Revision-Date: lines, "add/commit/push" as in the previous
 172section.
 173
 174By comparing "POT-Creation-Date:" line in po/git-gui.pot file and
 175po/af.po file, you can tell if there are new messages that need to be
 176translated.  You would need the GNU gettext package to perform this
 177step.
 178
 179        $ msgmerge -U po/af.po po/git-gui.pot
 180
 181This updates po/af.po (again, replace "af" with your language
 182code) so that it contains msgid lines (i.e. the original) that
 183your translation did not have before.  There are a few things to
 184watch out for:
 185
 186 - The original text in English of an older message you already
 187   translated might have been changed.  You will notice a comment line
 188   that begins with "#, fuzzy" in front of such a message.  msgmerge
 189   tool made its best effort to match your old translation with the
 190   message from the updated software, but you may find cases that it
 191   matched your old translated message to a new msgid and the pairing
 192   does not make any sense -- you would need to fix them, and then
 193   remove the "#, fuzzy" line from the message (your fixed translation
 194   of the message will not be used before you remove the marker).
 195
 196 - New messages added to the software will have msgstr lines with empty
 197   strings.  You would need to translate them.
 198
 199The po/git-gui.pot file is updated by the internationalization
 200coordinator from time to time.  You _could_ update it yourself, but
 201translators are discouraged from doing so because we would want all
 202language teams to be working off of the same version of git-gui.pot.
 203
 204****************************************************************
 205
 206This section is a note to the internationalization coordinator, and
 207translators do not have to worry about it too much.
 208
 209The message template file po/git-gui.pot needs to be kept up to date
 210relative to the software the translations apply to, and it is the
 211responsibility of the internationalization coordinator.
 212
 213When updating po/git-gui.pot file, however, _never_ run "msgmerge -U
 214po/xx.po" for individual language translations, unless you are absolutely
 215sure that there is no outstanding work on translation for language xx.
 216Doing so will create unnecessary merge conflicts and force needless
 217re-translation on translators.  The translator however may not have access
 218to the msgmerge tool, in which case the coordinator may run it for the
 219translator as a service.
 220
 221But mistakes do happen.  Suppose a translation was based on an older
 222version X, the POT file was updated at version Y and then msgmerge was run
 223at version Z for the language, and the translator sent in a patch based on
 224version X:
 225
 226         ? translated
 227        /
 228    ---X---Y---Z (master)
 229
 230The coordinator could recover from such a mistake by first applying the
 231patch to X, replace the translated file in Z, and then running msgmerge
 232again based on the updated POT file and commit the result.  The sequence
 233would look like this:
 234
 235    $ git checkout X
 236    $ git am -s xx.patch
 237    $ git checkout master
 238    $ git checkout HEAD@{1} po/xx.po
 239    $ msgmerge -U po/xx.po po/git-gui.pot
 240    $ git commit -c HEAD@{1} po/xx.po
 241
 242State in the message that the translated messages are based on a slightly
 243older version, and msgmerge was run to incorporate changes to message
 244templates from the updated POT file.  The result needs to be further
 245translated, but at least the messages that were updated by the patch that
 246were not changed by the POT update will survive the process and do not
 247need to be re-translated.