| 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 project repository and create |
| a feature branch to begin working: |
| |
| $ git clone git://repo.or.cz/git-gui.git |
| $ cd git-gui.git |
| $ git checkout -b my-translation |
| |
| The "git checkout" command creates a new branch to keep your work |
| isolated and to make it simple to post your patch series when |
| completed. You will be working on this branch. |
| |
| |
| 2. Starting a new language. |
| |
| In the git-gui directory is a po/ subdirectory. It has a handful of |
| 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. |
| |
| - 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. |
| |
| - 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. |
| |
| When you have to change the order of words, you can add "<number>$" |
| 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: |
| |
| "WEIGHT IS %2$d, LENGTH IS %1$d" |
| |
| 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%%)" |
| |
| - 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 |
| |
| There is a trick to test your translation without first installing: |
| |
| $ make |
| $ LANG=af ./git-gui.sh |
| |
| When you are satisfied with your translation, commit your changes then submit |
| your patch series to the maintainer and the Git mailing list: |
| |
| $ edit po/af.po |
| ... be sure to update Last-Translator: and |
| ... PO-Revision-Date: lines. |
| $ git add po/af.po |
| $ git commit -s -m 'git-gui: added Afrikaans translation.' |
| $ git send-email --to 'git@vger.kernel.org' \ |
| --cc 'Pat Thoyts <patthoyts@users.sourceforge.net>' \ |
| --subject 'git-gui: Afrikaans translation' \ |
| master.. |
| |
| |
| 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 checkout master |
| $ 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. |
| |
| 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. |