git-gui / po / READMEon commit string_list: add a new function, string_list_remove_duplicates() (31d5451)
   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 project repository and create
  22a feature branch to begin working:
  23
  24        $ git clone git://repo.or.cz/git-gui.git
  25        $ cd git-gui.git
  26        $ git checkout -b my-translation
  27
  28The "git checkout" command creates a new branch to keep your work
  29isolated and to make it simple to post your patch series when
  30completed.  You will be working on this branch.
  31
  32
  332. Starting a new language.
  34
  35In the git-gui directory is a po/ subdirectory.  It has a handful of
  36files whose names end with ".po".  Is there a file that has messages
  37in your language?
  38
  39If you do not know what your language should be named, you need to find
  40it.  This currently follows ISO 639-1 two letter codes:
  41
  42        http://www.loc.gov/standards/iso639-2/php/code_list.php
  43
  44For example, if you are preparing a translation for Afrikaans, the
  45language code is "af".  If there already is a translation for your
  46language, you do not have to perform any step in this section, but keep
  47reading, because we are covering the basics.
  48
  49If you did not find your language, you would need to start one yourself.
  50Copy po/git-gui.pot file to po/af.po (replace "af" with the code for
  51your language).  Edit the first several lines to match existing *.po
  52files to make it clear this is a translation table for git-gui project,
  53and you are the primary translator.  The result of your editing would
  54look something like this:
  55
  56    # Translation of git-gui to Afrikaans
  57    # Copyright (C) 2007 Shawn Pearce
  58    # This file is distributed under the same license as the git-gui package.
  59    # YOUR NAME <YOUR@E-MAIL.ADDRESS>, 2007.
  60    #
  61    #, fuzzy
  62    msgid ""
  63    msgstr ""
  64    "Project-Id-Version: git-gui\n"
  65    "Report-Msgid-Bugs-To: \n"
  66    "POT-Creation-Date: 2007-07-24 22:19+0300\n"
  67    "PO-Revision-Date: 2007-07-25 18:00+0900\n"
  68    "Last-Translator: YOUR NAME <YOUR@E-MAIL.ADDRESS>\n"
  69    "Language-Team: Afrikaans\n"
  70    "MIME-Version: 1.0\n"
  71    "Content-Type: text/plain; charset=UTF-8\n"
  72    "Content-Transfer-Encoding: 8bit\n"
  73
  74You will find many pairs of a "msgid" line followed by a "msgstr" line.
  75These pairs define how messages in git-gui application are translated to
  76your language.  Your primarily job is to fill in the empty double quote
  77pairs on msgstr lines with the translation of the strings on their
  78matching msgid lines.  A few tips:
  79
  80 - Control characters, such as newlines, are written in backslash
  81   sequence similar to string literals in the C programming language.
  82   When the string given on a msgid line has such a backslash sequence,
  83   you would typically want to have corresponding ones in the string on
  84   your msgstr line.
  85
  86 - Some messages contain an optional context indicator at the end,
  87   for example "@@noun" or "@@verb".  This indicator allows the
  88   software to select the correct translation depending upon the use.
  89   The indicator is not actually part of the message and will not
  90   be shown to the end-user.
  91
  92   If your language does not require a different translation you
  93   will still need to translate both messages.
  94
  95 - Often the messages being translated are format strings given to
  96   "printf()"-like functions.  Make sure "%s", "%d", and "%%" in your
  97   translated messages match the original.
  98
  99   When you have to change the order of words, you can add "<number>$"
 100   between '%' and the conversion ('s', 'd', etc.) to say "<number>-th
 101   parameter to the format string is used at this point".  For example,
 102   if the original message is like this:
 103
 104        "Length is %d, Weight is %d"
 105
 106   and if for whatever reason your translation needs to say weight first
 107   and then length, you can say something like:
 108
 109        "WEIGHT IS %2$d, LENGTH IS %1$d"
 110
 111   A format specification with a '*' (asterisk) refers to *two* arguments
 112   instead of one, hence the succeeding argument number is two higher
 113   instead of one. So, a message like this
 114
 115        "%s ... %*i of %*i %s (%3i%%)"
 116
 117   is equivalent to
 118
 119        "%1$s ... %2$*i of %4$*i %6$s (%7$3i%%)"
 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 then submit
 148your patch series to the maintainer and the Git mailing list:
 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 -s -m 'git-gui: added Afrikaans translation.'
 155        $ git send-email --to 'git@vger.kernel.org' \
 156           --cc 'Pat Thoyts <patthoyts@users.sourceforge.net>' \
 157           --subject 'git-gui: Afrikaans translation' \
 158           master..
 159
 160
 1613. Updating your translation.
 162
 163There may already be a translation for your language, and you may want
 164to contribute an update.  This may be because you would want to improve
 165the translation of existing messages, or because the git-gui software
 166itself was updated and there are new messages that need translation.
 167
 168In any case, make sure you are up-to-date before starting your work:
 169
 170        $ git checkout master
 171        $ git pull
 172
 173In the former case, you will edit po/af.po (again, replace "af" with
 174your language code), and after testing and updating the Last-Translator:
 175and PO-Revision-Date: lines, "add/commit/push" as in the previous
 176section.
 177
 178By comparing "POT-Creation-Date:" line in po/git-gui.pot file and
 179po/af.po file, you can tell if there are new messages that need to be
 180translated.  You would need the GNU gettext package to perform this
 181step.
 182
 183        $ msgmerge -U po/af.po po/git-gui.pot
 184
 185This updates po/af.po (again, replace "af" with your language
 186code) so that it contains msgid lines (i.e. the original) that
 187your translation did not have before.  There are a few things to
 188watch out for:
 189
 190 - The original text in English of an older message you already
 191   translated might have been changed.  You will notice a comment line
 192   that begins with "#, fuzzy" in front of such a message.  msgmerge
 193   tool made its best effort to match your old translation with the
 194   message from the updated software, but you may find cases that it
 195   matched your old translated message to a new msgid and the pairing
 196   does not make any sense -- you would need to fix them, and then
 197   remove the "#, fuzzy" line from the message (your fixed translation
 198   of the message will not be used before you remove the marker).
 199
 200 - New messages added to the software will have msgstr lines with empty
 201   strings.  You would need to translate them.
 202
 203The po/git-gui.pot file is updated by the internationalization
 204coordinator from time to time.  You _could_ update it yourself, but
 205translators are discouraged from doing so because we would want all
 206language teams to be working off of the same version of git-gui.pot.
 207
 208****************************************************************
 209
 210This section is a note to the internationalization coordinator, and
 211translators do not have to worry about it too much.
 212
 213The message template file po/git-gui.pot needs to be kept up to date
 214relative to the software the translations apply to, and it is the
 215responsibility of the internationalization coordinator.
 216
 217When updating po/git-gui.pot file, however, _never_ run "msgmerge -U
 218po/xx.po" for individual language translations, unless you are absolutely
 219sure that there is no outstanding work on translation for language xx.
 220Doing so will create unnecessary merge conflicts and force needless
 221re-translation on translators.  The translator however may not have access
 222to the msgmerge tool, in which case the coordinator may run it for the
 223translator as a service.
 224
 225But mistakes do happen.  Suppose a translation was based on an older
 226version X, the POT file was updated at version Y and then msgmerge was run
 227at version Z for the language, and the translator sent in a patch based on
 228version X:
 229
 230         ? translated
 231        /
 232    ---X---Y---Z (master)
 233
 234The coordinator could recover from such a mistake by first applying the
 235patch to X, replace the translated file in Z, and then running msgmerge
 236again based on the updated POT file and commit the result.  The sequence
 237would look like this:
 238
 239    $ git checkout X
 240    $ git am -s xx.patch
 241    $ git checkout master
 242    $ git checkout HEAD@{1} po/xx.po
 243    $ msgmerge -U po/xx.po po/git-gui.pot
 244    $ git commit -c HEAD@{1} po/xx.po
 245
 246State in the message that the translated messages are based on a slightly
 247older version, and msgmerge was run to incorporate changes to message
 248templates from the updated POT file.  The result needs to be further
 249translated, but at least the messages that were updated by the patch that
 250were not changed by the POT update will survive the process and do not
 251need to be re-translated.