Changes

Jump to: navigation, search

Translating Gramps

4,963 bytes added, 07:37, 1 April 2017
m
Updating your translation
{{languages|Translating GRAMPSGramps}} Tips for translators of the Gramps program. The page [[Coding_for_translation|coding for translation]] may also be of interest to translators.
Tips for translators of the GRAMPS program.
[[Category:Translators/Categories]][[Category:Developers/General]]
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
* ''Project-Id-Version'' : this is the name and version of the package. Fill it in if it has not already been filled in by xgettext.
===Getting started===
# Always save your translations in UTF-8 encoding'''without [https://en.wikipedia.org/wiki/Byte-order_mark BOM]''' ([http://achilles-keep-moving.blogspot.de/2011/10/msgfmt-fatal-error-with-utf-8-with-bom.html take care with ''NotePad''])
# Don't overwrite the English strings, your translation should be below the original string
# Take heed on special characters. You must have the same number of and types as the original string.
# If possible, try the translation before sending
Translating GRAMPS Gramps into a new language means translating English strings used in the GRAMPS Gramps interface. To put it shortly, this amounts to
# obtaining the gramps.pot file with the strings to be translated,
# translating the strings in the template, and
# getting the translated file uploaded into gramps SVN the Gramps Git repository.Another avenue of translation is translating the documentation. This is a different and lengthy process and it is decribed described in our [[Translating the Gramps User manual]] page. Here we will concentrate on the interface translation only.
===Obtaining gramps.pot===
* Download <code>gramps.pot</code> from GRAMPS SVN Gramps Git repository, see [[Brief_introduction_to_SVNBrief_introduction_to_Git| the introduction to SVNGit]].You can also download files by browsing via [https://github.com/gramps-project/gramps GitHub web interface].* Look for <code>gramps.pot</code> in the directory <code>gramps32/'''po</code> or if you looking for the trunk version look for <code>gramps.pot</code> in the ''' directory <code>trunk/po</code>.
===Translating messages===
* Copy <code>gramps.pot</code> to the file named <code>lang.po</code>, according to the language you are translating into (<code>fr.po</code> for French, <code>ru.po</code> for Russian, etc.)
* Use [http://gtranslator.sourceforge.net GTtranslator] (GNOME, windows), [http://kbabeli18n.kde.org/tools/ KBabel] (KDE), [http://userbase.kde.org/Lokalize Lokalize] (KDE, windows), Emacs po-mode, [http://translatevirtaal.sourceforgetranslatehouse.net/wiki/pootling/index pootlingorg Virtaal] (GNU/Linux, Mac, windows), [http://www.poedit.net/ poedit] (GNU/Linux, OSX, windows), or any similar tool designed for translating <code>.po</code> files. If you do not like any of these tools, you can use any text editor to translate messages. If using vim, properly setting the "langmap" option will significantly speed up your work.* Even though GRAMPS Gramps uses UNICODE (UTF-8) for its character set, you may use your native character set for your translation. Just make sure you specify the character set you are using in the <code>Content-Type</code> line in the <code>.po</code> file. GRAMPS Gramps will handle the conversion to UNICODE.* If there are non ASCII characters in the original English string, try to preserve them by copying them, if applicable.
===Context===
As an extension to standard gettext, strings in GRAMPS Gramps can have a context prefix. This prefix should '''not''' be translated, and just be deleted in the translation. More info and an example [[#Translation context|further down]].
As a special context, you will see the manual context, eg :
'manual|Editing_Dates'
these strings should only be translated if a '''wiki user manual ''' is available in your language. , eg in Dutch : 'Datums_aanpassen'  The string refers to a section, eg [[Gramps_3Gramps_4.0_Wiki_Manual_1_Wiki_Manual_-_Entering_and_Editing_Data:_Detailed_Detailed_-_part_1#Editing_Dates Editing_dates |Editing_Dates]] in Dutch becomes [[Gramps_3Gramps_4.0_Wiki_Manual_1_Wiki_Manual_-_Entering_and_Editing_Data:_Detailed_Detailed_-_part_1/nlde#Datums_aanpassenDaten_bearbeiten|Datums_aanpassen]].
===Testing your <code>.po</code> file===
 {{man warn|Environment change|For Gramps 4.0, {{stable_branch}} and master, see [[Translation_environment4|new environment]].}} In the directory <code>gramps32/po</code> or the <code>trunk/po</code> directory run the command: <pre>make</pre> If there are errors in your po file, this will fail and give you an error message. You should correct these errors. If you have trouble understanding the error, try to run the next test, which might give a more verbose output.
====check_po====
In the directory <code>gramps32/po</code> or the <code>trunk/po</code> directory run the command: <pre>  ./check_po --skip-fuzzy lang.po</pre> or <pre> python check_po --skip-fuzzy lang.po > lang</pre> where lang is your language code. This will give you errors in your translation, information on badly translated phrases, ... the output could resemble something like this..
File: nl.po
====statistics====
In the directory <code>gramps32/po</code> or the <code>trunk/po</code> directory run the command: <pre>msgfmt --statistics lang.po</pre> or <pre>msgfmt.exe --statistics lang.po</pre> where lang is your language code. This should not throw an error.
Basically this gives the same info in a condensed format: 3533 translated messages, 125 fuzzy translations, 12 untranslated messages.
msguniq - unify duplicate translations in message catalog
For checking syntax (header, format, domain) :
msgfmt -c nl.po
msgfmt.exe -c nl.po
For checking keyboard accelerators (underscore) : msgfmt --check-accelerators=_ nl.po  msgfmt.exe --check-accelerators=_ nl.po ====Gettext lint==== [http://gettext-lint.sourceforge.net/ Gettext lint] is a collection of tools for checking the validity, consistency and spelling of PO. Some python scripts do not work anymore with last expat version. ====Pology (KDE)==== [http://pology.nedohodnik.net/ Pology] is a Python library and collection of command-line tools for in-depth processing of PO files, the translation file format of the GNU Gettext software translation system. Pology functionality ranges from precision operations on individual PO messages, to cross-file operations on large collections of PO files. Pology is used by the [http://websvn.kde.org/trunk/l10n-support/pology/ KDE] translation teams for checking syntax. ====Translate Toolkit==== [http://translate.sourceforge.net/wiki/toolkit/index Translate Toolkit] is a collection of useful tools for localisation. It can help to improve the quality of your localisation, including tools to help check, validate, merge and extract messages from your localizations. ===Save as .mo file====
If possible and when you are finished translating, go to '''File -> Save as...''' to generate a ''.mo'' file for testing syntax.
* Under poedit, you can set to always compile a ''.mo'' file when saving changes by clicking '''File -> Preferences''' and on the '''Editor tab''' check the '''Automatically compile ''.mo'' file on save box'''. A dialog will warn you if there is a syntax error on your ''.po'' file.
* Kbabel and Lokalize , GTranslator also provide a syntax check when saving. If an error occured we can navigate to messages which contain errors.
Please, enable this feature to avoid errors on compilation process.
===Formatting (compiling) <code>.po</code> file===
* Currently, [[Coding_for_translation#How_it_works|formatting (msgfmt) is performed during build time]], so you should not have to worry about it. The translated <code>.po</code> file is the product of your work. However, try to [[Translating_Gramps#Save_as_.mo_file|check syntax]] before any commit. ===Send your contribution=== Check it into SVN Git if you obtained the permission to do so, or email it . The following configuration option simplifies pushing a branch back to [[Contact|Brian or Benny]] otherwisethe server: $ git config --global push.default upstream Otherwise you can fork gramps repository with a Github account and pull a merge requestSee: {{Code Browser}}
===Updating your translation===
If you have submitted a translation, changes are it may well be that after some weeks/months, new strings are added to GRAMPSGramps, implying you need to update your translation file.
Assuming you have obtained originally the GRAMPS Gramps source tree as explained in [[Brief introduction to SVNGit]]. Now:* Update your gramps Gramps tree from SVNGit. This can be done by executing the command <pre>svn upgit pull --rebase</pre> from the root GRAMPS svn Gramps directory. This will download an updated <code>gramps.pot</code> file.* Use your outdated translation to translate the strings that did not change:<pre>msgmerge lang.po gramps.pot -o newlang.po</pre> or <pre>msgmerge --no-wrap lang.po gramps.pot -o newlang.po</pre> where <code>lang</code> is your language code. The <code>--no-wrap</code> option will prevent changes due to automatic word wrapping, use it if your previous po file was constructed like that. The <code>--no-wrap</code> options allows for more readable SVN Git diffs.* Check fuzzy messages and translate all untranslated messages in <code>newlang.po</code>. When you are sure everything is right, rename <code>newlang.po</code> as <code>lang.po</code> and check it into SVN Git as you did with the original file.* If command <code>msgmerge</code> is not available on your system, you have to install the <code>}gettext</code> package. For [http://wiki.wxpython.org/index.cgi/Internationalization#How_to_get_gettext_tools_for_Win32 windows users].* To back-port translations, e.g., to merge master branch translations onto an earlier branch, do this on the earlier branch (assuming gramps.pot is updated):<pre>msgmerge -C lang.po master-lang.po gramps.pot -o newlang.po</pre>. Then resolve the fuzzies as usual.
There is also the make target that does the following:
* Create new <code>gramps.pot</code> template from the source code files
cd po
make gramps.pot/genpot.sh or cd po intltool-update python update_po.py -psee [[Talk:Translation_environment4|differences between tools]].
* Updates each <code>po</code> file in the source tree
It may be an overkill for you, but if you feel like using it, you can run:
cd po
make updatepython update_po -po m all in the <code>po</code> directory. This assumes that you have already succesfully successfully configured the source. Note, this command ignores <code>--no-wrap</code> option, so not practical for SVN Git diffs. {{man warn|Environment change|For Gramps 4.0, {{stable_branch}} and master, see [[Translation_environment4|new environment]].}}
===Testing your update===
You can test your update easily with the above mentioned '''check_po''' file. If you downloaded this file, just do:
<pre> python check_po --skip-fuzzy newlang.po</pre>. If everything is ok, the output will be something like this:
File: newlang.po
Template total: 3075
===Installing your translation===
 
{{man warn|Environment change|For Gramps 4.0, {{stable_branch}} and master, see [[Translation_environment4|new environment]].}}
You want to use the new translation immediately, and systemwide?
make --prefix=/usr install #as root !
This should install your translations to <code>''/usr/share/locale/xx{lang}/LC_MESSAGES/gramps.mo</code>'', with xx {lang} being your language. You could of course copy your files manually to that dir with the gramps.mo name.
Make sure you only install from within the po directory, or you will install the development version of GRAMPSGramps, which is not supported and for testing only!
==== Running trunk the master branch with your translation ====
The current GRAMPS trunk as of February 2009 by default looks for the i18n data are often under <code>/usr/local''../share/locale</code>'' according to the default prefix. So you can use:
./autogen.shSo you can use: make cd popython setup.py build make python setup.py install #as root !
This will install the .mo files under /usr/local''../share/locale/xx/LC_MESSAGES'', since according to the default prefix is /usr/localset.
or
python setup.py build python setup.py install --root=/home/joe/configure gramps --prefix="/home/..joe/gramps4" make make install --enable-packager-mode #as simple user ! This will install Gramps and translations under your ''/home/...'' directory. ===== $GRAMPSI18N (for your locale) ===== Actually you don't even need to install the files in order to test them. This is useful because you can develop Gramps without needing superuser privileges. Bear in mind the Gramps i18n process goes something like this when you use the master branch: * when you type <code>python build</code> in the source tree root (/home/user/Gramps e.g.) all the po/*.po files are compiled into build/mo/{lang}/*.mo files.* when you type <code>python install</code> inside the po directory, these .mo files are copied to {prefix}/share/locale/{lang}/LC_MESSAGES as gramps.mo files.
This will install But you can change the place where Gramps looks for these files by altering the environment variable $GRAMPSI18N. So you could also for instance do something like this and translations under your ''avoid the <code>python setup install</home/..'' directory.code> step: (if you are using csh or tcsh the syntax would be a little different)
===== [user@localhost /home/user/Gramps]$ mkdir -p po/en_GB/LC_MESSAGES [user@localhost /home/user/Gramps]$ cp po/en_GB.gmo po/en_GB/LC_MESSAGES/gramps.mo [user@localhost /home/user/Gramps]$ cd gramps [user@localhost /home/user/Gramps/src]$GRAMPSI18N =$PWD/../po LANG====en_GB.UTF-8 python gramps.py
Actually you don't even need to install the files in order to test them===== gramps. This is useful because you can develop GRAMPS without needing superuser privileges. Bear in mind the GRAMPS i18n proccess goes something like this when you use trunk:sh =====
* when you type On a gramps launcher (copy from ''<code>make{prefix}/bin/gramps</code> in the source tree root (/home/user/trunk e.g.'') all the trunkyou can set : export GRAMPSDIR=/po/*.po files are compiled into trunk/po/*.gmo files.* when you type <code>make install< export GRAMPSI18N=/code> inside the /home/user/trunk/po directory, these .gmo files are copied to /usr/local/share/locale/xx/LC_MESSAGES as gramps.mo files.
But you can change the place where GRAMPS looks for these files by altering Where the environment variable ''$GRAMPSI18NGRAMPSDIR'' is the path to your ''gramps'' directory. So you could also for intance do something like this and avoid the <code>make install</code> step: (if you are using csh or tcsh the syntax would be a little different)
[user@localhost /home/user/trunk]$ mkdir -p po/en_GB/LC_MESSAGES [user@localhost /home/user/trunk]$ cp po/en_GB.gmo po/en_GB/LC_MESSAGES/gramps.mo [user@localhost /home/user/trunk]$ cd src [user@localhost /home/user/trunk/src]Where the environment variable ''$ GRAMPSI18N=$PWD/../po LANG=en_GB.UTF-8 python '' is the path to your ''grampslocale'' directory.py
===== Just testing your translation =====
Put it on your translation path (''see above'').
==Hard to Translate Phrasestranslate phrases==
Some things are just hard to translate. Below are a few of the more difficult items, along with some suggestions on how to handle them.
===LDS Terminologyterminology===
The Church of Jesus Christ of Latter Day Saints (a.k.a. Mormons) maintains a lot of genealogy data. In the United States, they are probably the non-government organization with the most detailed records available. Genealogical research is important to the Mormon church. They are responsible for defining the [[GEDCOM]] format.
#* Canceled
#* DNS/CAN (Do Not Submit/Previous sealing cancelled)
 
==Advanced issues==
Eltitkoob
Eltitnosrep
 
If you are a Gramps translator and need a developer to help you add a context to the Gramps source files, please ask for it on the gramps-devel list.
 
====Translation context in GUI labels====
If there is a string in the Glade GUI (i.e., in a .glade source file) that requires the translation context, it's impossible to have it translated statically. In this case, one needs to add runtime code to the corresponding dialog initialization to override the label string with the text obtained with an sgettext call. I.e.,
 
* Verify the relevant widget has a meaningful id in the .glade file (as opposed to a silly autogenerated one). Modify the id if needed and make sure no existing code used the old widget id! E.g., change
<object class="GtkLabel" id="label3">
:into
<object class="GtkLabel" id="place_name_label">
* Add a context to the translatable string in the .glade file. This way, when you look at the POT file or a PO file derived from it, you see a reference to this place, along with the actual place in the .py file(s) which also has the same context string. E.g., change
<property name="label" translatable="yes">Name:</property>
:into
<property name="label" translatable="yes">place|Name:</property>
* In the corresponding dialog initialization, add code to set the string to the correct translation during runtime, e.g.:
:globally in the file:
PLACE_NAME = _('place|Name:')
:in the MergePlace.__init__ method:
for widget_name in ('name_btn1', 'name_btn2'):
self.get_widget(widget_name).set_label(PLACE_NAME)
:The exact method to call on the Gtk control will be different based on the actual GUI element affected. E.g., a GtkButton has a set_label method, whereas a GtkLabel has a set_text.
* Regenerate the POT, translate the new PO strings, and test your work.
===Plural forms===
There was requests for [http://www.gnu.org/software/gettext/manual/html_node/gettext_150.html#Plural-forms plural forms] support.
First, translators need to check if information is available on .po header:''"Plural-Forms:\n"''. (See [http://translate.sourceforge.net/wiki/l10n/pluralforms samples])
# msgid contains the singular string in english
msgid "%d second"
msgstr_plural msgid_plural "%d seconds"
msgstr [0] "%d 秒"
msgid "%d hour"
msgstr_plural msgid_plural "%d hours"
msgstr [0] "%d hour"
msgstr [1] "%d hours"
msgid "%d second"
msgstr_plural msgid_plural "%d seconds"
msgstr [0] "%d sekunda"
msgstr [1] "%d sekundy"
msgfmt -c filename.po
===Translating mnemonicskeys(Keyboard Shortcut keys)===Mnemonics are accelerator keys (also known as Keyboard Shortcut keys) you find in labels, accessible by pressing the {{man key press|ALT }} key together with the mnemonic. You see then in the translated text with a low line, eg '_Help' is shown as 'Help' with a line under the H, and can be put to focus/selected by pressing {{man key press|ALT+|h}}.
It is nice if mnemonics on a screen are unique, but it is not required. If you use twice the same mnemonic, the user must press repeatedly the accelerator to switch between the different entries. However, note the following rule:
*"If duplication of access keys in a window is unavoidable, you should still refrain from duplicating the access keys for any of these buttons that appear in the same window: {{man button|OK}}, {{man button|Cancel}}, {{man button|Close}}, {{man button|Apply }} or {{man button|Help}}."
So you should check in your language what the mnemonic key is for those buttons, and avoid using the same in translated text
'''{{man warn|Warning''': some |Some fonts family will not properly display mnemonics on "g", "j", "p", "q" or "y" as these print the letter over the line under it making it very hard to distinguish the small line. Please avoid to use mnemonics key bindings on these letters. Also try to avoid i and l, as people have difficulty distinguishing between those.}}
Capital letters are no problem though, underlining eg G will work just fine as the letter does not write over the line.
==Translating man pages==
 
{{man warn|Environment change|For gramps 4.0, {{stable_branch}} and master, see [[Translation_environment4#Translating_man_pages|new environment]].}}
 
You can also translated the man pages into your own language.
For the development version (trunkmaster branch) version you can find the required starting files under the directory (/trunk)/data/man. You will find the files
*Makefile.am
*gramps.1.in
First off all you must make a directory for your language under data/man.
<code>
cd data/man
</code>
<code>cd data/man</code> and do  <code> mkdir xx</code> where xx is your languagecode (fr for French, sv for Swedish, etc.) You should use Git. See [[Brief_introduction_to_Git| the introduction to Git]].
where xx is your languagecode (fr for French, sv for Swedish, etc.) You should use SVN. See [[Brief_introduction_to_SVN| the introduction to SVN]]. Then do <code>
svn add xx
svn commit -m "xx dir for man pages" xx
</code>
This will add the xx dir under svn revision control and upload the new dir.
Next step is to copy the Makefile.am and gramps.1.in from data/man to your new directory. Translate all relevant strings in the data/man/xx/gramps.1.in file. Change the file data/man/xx/Makefile.am:
*add the line mandir = @mandir@/xx
*add data/man/xx/Makefile to the line AC_CONFIG_FILES([
Because you added new files, SVN requires that you set All changes must be committed and pushed to the correct propset for those files. Two things are to be done.<code>server: svn propset svn:mime git commit -type text/plain xx/gramps.1.in xx/Makefile.am svn propset svn:eol-type native xx/gramps.1.in "Add man page for xx/Makefile.am"</code> git push
You could also in should see no errors when you run the config file of subversion ( HOMEDIR/.subversion/config) enable the auto-prop feature (enable-auto-props = yes) and uncomment the relevant lines in the [auto-props] section.All changes must be committed and do not forget to change the ChangeLog file.
You should see no errors when you run the <code> ./configure</code><br/> <code>make</code> <br/>scripts.
{{man warn|Install|This last step must be done only in the data/man/xx directory. If not, your normal gramps installation will be overwritten. And this step must be done as superuser(su)}}
<code>
sudo make install
</code>
This will put the gramps.1.gz file into /usr/local/share/man/xx/man1 directory. You could also use a prefix. Then you do:<code>
sudo make --prefix=/usr/share install
</code>
<code>sudo make install</code> This will put the gramps.1.gz file into /usr/local/share/man/xx/man1 directory. You could also use a prefix. Then you do: <code>sudo make --prefix=/usr/share install</code> To see the result of your work, do: <code> man -L xx gramps</code>
==Translating wiki manual==
To have the link working in GRAMPSGramps, you need to have or edit the GrampsDisplay.py file to contain your language.
On line 30 of that file, you see:
}
*Every '<code>manual|...</code>' entry in the <code>gramp.pot </code> file refers to a section in the manual, so make sure to use good section headings so this does not change too much over time.Note that reports/tools link to a section in the page with the same name as the report name in GRAMPSGramps.
*You should be able to edit directly on wiki or using tools like [http://translate.sourceforge.net/wiki/toolkit/txt2po txt2po] or [http://po4a.alioth.debian.org/ po4a]. Also previous gettext file for the manual and [http://en.wikipedia.org/wiki/Translation_memory Translation Memory] may help you to upgrade deprecated/old gettext files. eg, store existing entries from ''/usr/share/locale''.
==Language specific pages==
Check out the pages which cover some aspects of translation into a specific language, such as the glossary.
*[[Translation into Finnish|Finnish]]
*[[Translation into French|French (Français)]]
*[[Translation into Russian|Russian]]
==Translating addon plugins==
* See [[Addons_DevelopmentAddons_development#Get_translators_to_translate_your_addon_into_multiple_languages|3rd-party addon for GRAMPS 3.2Gramps]].

Navigation menu