251 lines
		
	
	
	
		
			10 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			251 lines
		
	
	
	
		
			10 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
| 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.
 |