|  | -*- text -*- | 
|  |  | 
|  | If you are contributing code or translations to the Subversion project, | 
|  | please read this first. | 
|  |  | 
|  | =============================== | 
|  | Guide to translating Subversion | 
|  | =============================== | 
|  |  | 
|  | $LastChangedDate$ | 
|  |  | 
|  | * Introduction | 
|  | * Software version requirements | 
|  | * Starting a new translation | 
|  | * Verifying your po file | 
|  | * Submitting your po file | 
|  | * Updating existing po files | 
|  | * Maintenance on branches | 
|  | * Requirements for po and mo files | 
|  | * Conventions for the empty string msgid section | 
|  | * Translation teams | 
|  | * Single versus double quotes | 
|  | * Error message conventions | 
|  |  | 
|  |  | 
|  |  | 
|  | Introduction | 
|  | ============ | 
|  |  | 
|  | Subversion uses gettext for its translation.  Gettext uses '.po' files | 
|  | to store translation information; the existing ones are kept in the | 
|  | subversion/po directory of the repository. | 
|  | [Note that the last paragraph deliberately does not say GNU gettext.] | 
|  |  | 
|  | Please take some time to go through this document as well as | 
|  | www/hacking.html. | 
|  |  | 
|  |  | 
|  |  | 
|  | Software version requirements | 
|  | ============================= | 
|  |  | 
|  | The Makefile build targets locale-gnu-* (used to maintain po files) | 
|  | require GNU gettext 0.13 or newer.  Note that this is not a requirement | 
|  | for those wanting to compile the *.po files into *.mo's. | 
|  |  | 
|  |  | 
|  |  | 
|  | Starting a new translation | 
|  | ========================== | 
|  |  | 
|  | Before starting a new translation please contact the subversion | 
|  | development mailing list to make sure you are not duplicating efforts. Also | 
|  | please note that the project has a strong preference for translations which | 
|  | are maintained by more than one person: mailing the lists with your | 
|  | intentions might help you find supporters. | 
|  |  | 
|  | After that, you should perform the following steps: | 
|  |  | 
|  | * Unix (GNU gettext) | 
|  |  | 
|  | 1) check out Subversion (see INSTALL for more information) | 
|  | 2) run ./autogen.sh | 
|  | 3) run ./configure | 
|  | 4) run make locale-gnu-pot | 
|  | This step is currently only supported for GNU gettext Makefile based | 
|  | systems | 
|  | 5) run msginit --locale LOCALE -o LOCALE.po in the | 
|  | subversion/po directory of your working copy. LOCALE is the ll[_LL] | 
|  | language and country code used to identify your locale. | 
|  |  | 
|  | Steps (2) and (3) generate a Makefile; step (4) generates | 
|  | subversion/po/subversion.pot | 
|  |  | 
|  | The Subversion project has a policy not to put names in its files, so | 
|  | please apply the two changes described below.  (See www/hacking.html | 
|  | for a description of this convention.) | 
|  |  | 
|  |  | 
|  | The header in the newly generated .po file looks like this: | 
|  | # SOME DESCRIPTIVE TITLE. | 
|  | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER | 
|  | # This file is distributed under the same license as the PACKAGE package. | 
|  | # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. | 
|  |  | 
|  | Please replace that block with the following text: | 
|  | # <Your language> translation for subversion package | 
|  | # Copyright (C) <YEAR> CollabNet. | 
|  | # This file is distributed under the same license as the subversion package. | 
|  |  | 
|  | The first translation block in the .po file contains two lines like these: | 
|  | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" | 
|  | "Language-Team: LANGUAGE <LL@li.org>\n" | 
|  |  | 
|  | Please replace those with these two lines: | 
|  | "Last-Translator: Subversion Developers <dev@subversion.tigris.org>\n" | 
|  | "Language-Team: YOUR LANGUAGE <dev@subversion.tigris.org>\n" | 
|  |  | 
|  |  | 
|  | * Unix (non-GNU gettext) | 
|  |  | 
|  | To be documented | 
|  |  | 
|  | * Windows | 
|  |  | 
|  | See issue #1977 in the subversion issue tracker | 
|  |  | 
|  | For the time being, hourly updated subversion.pot files are posted at: | 
|  |  | 
|  | http://hix.nu/subversion/trunk/subversion.pot (for trunk) | 
|  | http://hix.nu/subversion/1.1.x/subversion.pot (for 1.1.x) | 
|  |  | 
|  |  | 
|  |  | 
|  | Verifying your po file | 
|  | ====================== | 
|  |  | 
|  | Before submitting to the mailing list or committing to the repository, | 
|  | please make sure your po file 'compiles'.  You can do this with these | 
|  | steps (on Makefile based systems): | 
|  |  | 
|  | 1) run './autogen.sh' | 
|  | 2) run './configure' (with the appropriate arguments) | 
|  | 3) run 'make locale' | 
|  |  | 
|  | The autogen.sh step is important, since it adds new po files as | 
|  | dependencies of the 'locale' build target.  Note however that steps 1 | 
|  | and 2 are only needed once after you have added a new translation. | 
|  |  | 
|  |  | 
|  |  | 
|  | Submitting your po file | 
|  | ======================= | 
|  |  | 
|  | Please don't mail large po files to the mailing lists.  There are many | 
|  | subscribers on dev@subversion.tigris.org who are on slow links and do | 
|  | not want to receive a large file by email.  Instead, place the po file | 
|  | somewhere on the Internet for download, and just post the URL.  If you | 
|  | do not have a site available, please ask on dev@ and someone will help | 
|  | you find a location. | 
|  |  | 
|  | Of course, if you have commit access to the Subversion repository, you | 
|  | can just commit the po file there, assuming all other requirements | 
|  | have been satisfied. | 
|  |  | 
|  |  | 
|  |  | 
|  | Updating existing po files | 
|  | ========================== | 
|  |  | 
|  | The Makefile based part of the build system contains a make target to | 
|  | facilitate maintenance of existing po files.  To update po files on | 
|  | systems with GNU gettext run | 
|  |  | 
|  | make locale-gnu-po-update | 
|  |  | 
|  | To only update a particular language, you may use | 
|  |  | 
|  | make locale-gnu-po-update PO=ll | 
|  |  | 
|  | where ll is the name of the po file without the extension (i.e. PO=sv). | 
|  |  | 
|  | It is recommended that the .po update is done by using two commits; one | 
|  | after the "make locale-gnu-po-update", and one after the translation is | 
|  | done. This has two advantages: | 
|  |  | 
|  | - gettext(1) produces lots of line number changes which makes the | 
|  | resulting diff hard to review by the other translators. By committing | 
|  | twice, all the line number changes are stored in the first commit, and | 
|  | the second commit contains all the actual translations with no extra | 
|  | garbage. | 
|  | - If there are several translators for a specific language (which is | 
|  | highly preferred by the project) you don't risk working for hours just | 
|  | to find that some other translator already has done the job when | 
|  | you're finished. You will immediately notice that someone else is | 
|  | working on the .po file when you try to perform the first commit, | 
|  | because svn will tell you that the file is outdated. | 
|  |  | 
|  |  | 
|  | Maintenance on branches | 
|  | ======================= | 
|  |  | 
|  | Editing po files in trunk is pretty straightforward, but gets a bit more | 
|  | complicated when those changes are going to be transferred to a release | 
|  | branch.  Project policy is to make no direct changes on release branches, | 
|  | everything that is committed to the branch should be merged from trunk. | 
|  | This also applies to po files.  Using 'svn merge' to do the job can lead | 
|  | to conflicts and fuzzy messages due to the changes in line numbers and | 
|  | string formatting done by gettext. | 
|  |  | 
|  | The scheme below eliminates any complexity which exists when using 'svn | 
|  | merge' to do branch updates. The following rules apply: | 
|  |  | 
|  | - Translation updates go to trunk | 
|  | - Messages required on the branch which ever existed on trunk | 
|  | get merged from trunk | 
|  | - There are 2 mass operations allowed on po files on branches: | 
|  | * 'make locale-gnu-po-update' | 
|  | * merging messages from trunk (see below) | 
|  | - The remaining few messages which never existed on trunk | 
|  | in any revision are translated on the branch | 
|  | - Message options (such as fuzzy) can be tweaked | 
|  |  | 
|  | The above list is a complete enumeration of all operations allowed on | 
|  | po files on branches. | 
|  |  | 
|  | Merging messages from trunk revision X of YY.po to your branch working | 
|  | copy can be done with this command: | 
|  |  | 
|  | svn cat -r X http://svn.collab.net/repos/svn/trunk/subversion/po/YY.po | \ | 
|  | po-merge.py YY.po | 
|  |  | 
|  |  | 
|  |  | 
|  | Requirements for po and mo files | 
|  | ================================ | 
|  |  | 
|  | On some gettext implementations we have to ensure that the mo files - | 
|  | whether obtained through the project or created locally - are encoded | 
|  | using UTF-8.  This requirement stem from the fact that Subversion uses | 
|  | UTF-8 internally, some implementations translate to the active locale | 
|  | and the fact that bind_textdomain_codeset() is not portable across | 
|  | implementations. | 
|  |  | 
|  | To satisfy this requirement po files are required to be UTF-8 encoded. | 
|  | If the gettext implementation on the target system doesn't support | 
|  | bind_textdomain_codeset(), the build system will ensure that the mo | 
|  | file is in UTF-8 by removing the Content-Type header from the po file | 
|  | header.  Note that some msgfmt utilities dislike the absence of the | 
|  | charset designator and will generate warnings along the lines of | 
|  | "Won't be able to do character set conversion" because of it.  You can | 
|  | safely ignore these warnings. | 
|  |  | 
|  |  | 
|  |  | 
|  | Conventions for the empty string msgid section | 
|  | ============================================== | 
|  |  | 
|  | Some gettext implementations use a section with a msgid "" (empty | 
|  | string) to keep administrative data.  One of the headers suggested is | 
|  | the 'Last-Translator:' field.  Because the Subversion project has a | 
|  | policy not to name contributors in specific files, but give credit in | 
|  | the repository log messages, you are required not to put your name in | 
|  | this field. | 
|  |  | 
|  | Since some tools require this field to consider the po file valid | 
|  | (i.e. Emacs PO Mode), you can put "dev@subversion.tigris.org" into | 
|  | this field. | 
|  |  | 
|  |  | 
|  |  | 
|  | Translation teams | 
|  | ================= | 
|  |  | 
|  | The GNU translation project | 
|  | (http://www2.iro.umontreal.ca/~gnutra/po/HTML/) attempts to organise | 
|  | translation attempts and get translators for various packages.  Some | 
|  | teams have guidelines to stimulate consistency across packages. | 
|  |  | 
|  |  | 
|  |  | 
|  | Single versus double quotes | 
|  | =========================== | 
|  |  | 
|  | The project has standardised the use of quotes.  Some translation | 
|  | teams have done the same.  If there is no translation team for your | 
|  | locale or they did not standardise quoting, please follow the project | 
|  | guidelines per www/hacking.html.  If they did: follow them :-) | 
|  |  | 
|  |  | 
|  |  | 
|  | Error message conventions | 
|  | ========================= | 
|  |  | 
|  | Since translators will generally see all error messages in the code, | 
|  | it's important to know that there is a special section in | 
|  | www/hacking.html about this category of strings.  Here the same | 
|  | applies as does for the quotes: Adhere to them on all points for which | 
|  | there is no explicit policy set out by the translation team for your | 
|  | language. | 
|  |  | 
|  | vim: set tw=72 ts=2 sw=2 sts=2 et fo-=2w fo+=n js : |