Project

General

Profile

Translating » History » Version 47

Lukas Zapletal, 09/03/2013 07:03 PM
interpolation note

1 6 Lukas Zapletal
h1. Translating for contributors
2 1 Lukas Zapletal
3 7 Lukas Zapletal
h2. General tips
4 7 Lukas Zapletal
5 7 Lukas Zapletal
It is important not to change punctuation and whitespace. For example if the English string is "blah." it must be translated as "xyz." with the dot at the end. The same for an extra space - e.g. "blah " must be "xyz ". Although we try to eliminate all the extra spaces, there are rare cases where we need them. There is a checker (pofilter) which is executed regularly by developers to catch and fix all these types of mistakes. 
6 7 Lukas Zapletal
7 32 Dominic Cleal
There are model names in the translation strings, you can get the full list here: https://github.com/theforeman/foreman/blob/develop/locale/model_attributes.rb
8 7 Lukas Zapletal
9 7 Lukas Zapletal
These model names are in two formats: "Model name" (name of the database table) and "Modelname|Column name" for column name. Here are few examples how to translate them:
10 7 Lukas Zapletal
11 7 Lukas Zapletal
 _('Compute resource') -> "Compute Resource"
12 7 Lukas Zapletal
13 7 Lukas Zapletal
 _('ComputeResource|Description') -> "Description"
14 7 Lukas Zapletal
15 7 Lukas Zapletal
Several models have prefixes in the form something/ or Something:: - you can ignore these. Example:
16 7 Lukas Zapletal
17 7 Lukas Zapletal
 _('Audited/adapters/active record/audit') -> "Audit"
18 7 Lukas Zapletal
19 7 Lukas Zapletal
 _('Audited::Adapters::ActiveRecord::Audit|Associated name') -> "Associated Name"
20 7 Lukas Zapletal
21 6 Lukas Zapletal
h2. Using Transifex
22 6 Lukas Zapletal
23 6 Lukas Zapletal
Go to https://www.transifex.com/projects/p/foreman and register/login. Then you can use the Transifex interface to do all translations. The project on Transifex automatically updates when we add new strings into git. Foreman team regularly downloads new translations to the develop branch in git as well, therefore there is no action needed when you finish with translations. It will be pulled eventually (e.g. before the next release).
24 6 Lukas Zapletal
25 6 Lukas Zapletal
Read the tips bellow if you want to start translating now.
26 1 Lukas Zapletal
27 2 Lukas Zapletal
h2. Manually
28 2 Lukas Zapletal
29 2 Lukas Zapletal
If you prefer, you can edit PO files directly using your preferred editor. Please make sure the encoding of the files is UTF-8. It is also recommended to test your translations before submitting a Pull Request on the github using either:
30 2 Lukas Zapletal
31 28 Lukas Zapletal
  foreman# rake locale:pack
32 1 Lukas Zapletal
33 2 Lukas Zapletal
or
34 1 Lukas Zapletal
35 7 Lukas Zapletal
  foreman# make -C locale check all-mo
36 2 Lukas Zapletal
37 29 Lukas Zapletal
Note that locale:pack is an alias for gettext:pack which is only avaiable in the development environment.
38 29 Lukas Zapletal
39 1 Lukas Zapletal
The above command should not print any error message. Also you should start Foreman UI and see if your translations do fit (sometimes longer strings can wrap or even break the UI). If you start Foreman in the production mode, you need to do one of the above commands every time you change your translation. In the development mode, you only need to restart Foreman to see the changes.
40 1 Lukas Zapletal
41 1 Lukas Zapletal
More info about contributing your translation directly is on our [[Contribute]] wiki page. 
42 1 Lukas Zapletal
43 33 Lukas Zapletal
h2. Changing language
44 33 Lukas Zapletal
45 33 Lukas Zapletal
To change your language, to to User account page and change our language from Browser default to your preferred one. (This is work in progress)
46 33 Lukas Zapletal
47 33 Lukas Zapletal
To quickly change language without going to user settings add ?locale=XX to any Foreman URL. For example visit:
48 33 Lukas Zapletal
49 33 Lukas Zapletal
  http://localhost:3000/?locale=de
50 33 Lukas Zapletal
51 39 Lukas Zapletal
and Foreman will remember the language setting for the whole session. Note: The current user needs to have "Browser Locale" set in the account settings, otherwise this will not work.
52 33 Lukas Zapletal
53 6 Lukas Zapletal
h1. Translating for developers
54 1 Lukas Zapletal
55 15 Lukas Zapletal
h2. Extracting strings
56 15 Lukas Zapletal
57 15 Lukas Zapletal
There are several rules to follow when marking strings for translations with _("") and similar functions:
58 15 Lukas Zapletal
59 30 Dominic Cleal
 * To translate a string use @_("My string")@
60 45 Lukas Zapletal
 * To translate string with a parameter use @_("String with param: %s") % param@
61 45 Lukas Zapletal
 * To translate string with more than one parameters do not use @_("Params: %s and %s") % [param1, param2]@ which is translator-unfriendly
62 45 Lukas Zapletal
 * Therefore for more than one parameters use @_("Params: %{a} and %{b}") % {:a => foo, :b => bar}@
63 30 Dominic Cleal
 * To mark something for translation (but not translate) use @N_("String")@
64 30 Dominic Cleal
 * To use plural form use @n_("One", "Two", number)@ - note this function always accepts three parameters as the base language is usually English but translators are able to define as many plural forms as they need.
65 45 Lukas Zapletal
 * Plural forms are usually used with one parameter, do not forget to add trailing parameter to it: @n_("%s minute", "%s minutes", @param) % @param@
66 47 Lukas Zapletal
 * When using strings with ERB (e.g. for deface gem), escape properly: n_('Test <%%= %{var1} %%>') % { :var1 => "xxx" }
67 47 Lukas Zapletal
 * Note that gettext does not extract from interpolation - this will not work: "blah #{_('key')} blah"
68 30 Dominic Cleal
69 30 Dominic Cleal
h3. Models and columns
70 30 Dominic Cleal
71 30 Dominic Cleal
 * To render name from model use @s_("Modelname|Fieldname")@ - check @./locale/model_attributes.rb@ for all models/fields which are accepted.
72 30 Dominic Cleal
 * All our form helpers have been enriched and understand model and column names - if the field is in the model_attribute.rb (above), it does not need to be translated explicitly (e.g. text_f f, :name is enough and will be translated to "Modelname|Name")
73 30 Dominic Cleal
74 30 Dominic Cleal
h3. Helping translators
75 30 Dominic Cleal
76 1 Lukas Zapletal
 * Do not break strings with newlines because then the strings have many whitespace and it looks confusing for translators like "blah    \\n     blah". If you must separate string on several lines, you can use HEREDOC or you can contatenate strings like "line1" + "line2" because Ruby Gettext detects them both.
77 30 Dominic Cleal
 * If you want to leave a note to the translator, just drop a comment before the string in the format of @# TRANSLATORS: your comment here@
78 1 Lukas Zapletal
 * Note that all HEREDOC strings are automatically extracted, when adding API documentation descriptions via HEREDOC, leave a message to translators not to translate these (API documentation will not be translated at the moment).
79 30 Dominic Cleal
80 31 Dominic Cleal
h3. JavaScript
81 31 Dominic Cleal
82 31 Dominic Cleal
 * Both @_@ and @n_@ functions are available and work in much the same way as in Ruby, with the following exceptions..
83 45 Lukas Zapletal
 * Interpolation of values uses @Jed.sprintf@ on the translated string, so for a single parameter: @Jed.sprintf(_("Foo: %s"), "bar")@
84 45 Lukas Zapletal
 * Multiple parameters must be named: @Jed.sprintf(_("Example: %(foo) %(bar)"), {foo: "a", bar: "b"})@
85 31 Dominic Cleal
86 30 Dominic Cleal
h3. Storing strings
87 30 Dominic Cleal
88 25 Lukas Zapletal
 * Strings get extracted into ./locale/foreman.pot file, model and column names are in ./locale/model_attributes.rb
89 15 Lukas Zapletal
 * Additional Rails strings are in ./config/locale - there is a script to update those from Rails I18N git (branch 3-x).
90 31 Dominic Cleal
 * PO files are converted into JSON objects to be consumed by Jed, stored at @./app/assets/javascripts/locale/$LANG/app.js@
91 15 Lukas Zapletal
 * For more info go here: http://www.yotabanana.com/hiki/ruby-gettext-howto.html
92 15 Lukas Zapletal
93 15 Lukas Zapletal
From time to time it is good to extract strings and update translations with incoming strings, so translators are able to work on them. We usually do this before releases, but it is good idea to do this on a weekly/monthly basis. For string extractions, please *do not* use rake gettext:find but use
94 15 Lukas Zapletal
95 15 Lukas Zapletal
  foreman# rake locale:find
96 15 Lukas Zapletal
97 21 Lukas Zapletal
because it also extracts model names and columns and filters them plus it adds some notes to translators (see locale:find_model rake task). Although locale:find does some checks for malformed strings, it is good idea to run additional pofilter check which is able to find many mistakes like trailing whitespace and others:
98 21 Lukas Zapletal
99 21 Lukas Zapletal
  foreman# make -C locale check -j4
100 21 Lukas Zapletal
  foreman# make -C locale clean
101 15 Lukas Zapletal
102 15 Lukas Zapletal
h2. Generating gettext translate tables
103 15 Lukas Zapletal
104 15 Lukas Zapletal
For production environment, you need to compile PO files into binary translate tables (MO files). This is *not needed* for development or test environments as in these modes Foreman reads PO files directly.
105 15 Lukas Zapletal
106 15 Lukas Zapletal
To generate gettext MO files, you can do either
107 15 Lukas Zapletal
108 15 Lukas Zapletal
  foreman# rake gettext:pack
109 15 Lukas Zapletal
110 15 Lukas Zapletal
or
111 15 Lukas Zapletal
112 15 Lukas Zapletal
  foreman# make -C locale
113 15 Lukas Zapletal
114 15 Lukas Zapletal
Both tools generate the same result, the latter is a bit faster and allows additional checks (see locale/Makefile targets). If you install from distribution packages, you do not need to run this because everything has been pre-compiled already.
115 15 Lukas Zapletal
116 8 Lukas Zapletal
h2. Adding new language
117 6 Lukas Zapletal
118 2 Lukas Zapletal
Adding new language into Foreman is easy. You need to take two steps - first of all create new gettext PO file as a copy from POT and edit the header (at least set plural configuration):
119 12 Lukas Zapletal
120 3 Lukas Zapletal
  # cp locale/foreman.pot locale/xx/foreman.po
121 6 Lukas Zapletal
  # vim locale/xx/foreman.po
122 6 Lukas Zapletal
123 12 Lukas Zapletal
Then pull Rails translation strings from upstream 3-x branch:
124 12 Lukas Zapletal
125 46 Dominic Cleal
  # touch config/locales/xx.yml (replace underscores with hyphens)
126 26 Lukas Zapletal
  # script/update-rails-locales.sh
127 12 Lukas Zapletal
128 12 Lukas Zapletal
And add the language to Transifex and Zanata using their web interfaces.
129 2 Lukas Zapletal
130 6 Lukas Zapletal
h2. How to pull translations
131 1 Lukas Zapletal
132 4 Lukas Zapletal
To get updated translations from Transifex you will need account there (https://www.transifex.com) and the tx cli tool.
133 4 Lukas Zapletal
134 4 Lukas Zapletal
On Fedora:
135 4 Lukas Zapletal
136 4 Lukas Zapletal
  # yum -y install transifex-client gettext make intltool
137 4 Lukas Zapletal
138 4 Lukas Zapletal
On Debian:
139 4 Lukas Zapletal
140 4 Lukas Zapletal
  # apt-get install transifex-client gettext make intltool-debian
141 4 Lukas Zapletal
142 4 Lukas Zapletal
Then configure your account:
143 4 Lukas Zapletal
144 4 Lukas Zapletal
  $ cat ~/.transifexrc
145 4 Lukas Zapletal
  [https://www.transifex.net]
146 4 Lukas Zapletal
  hostname = https://www.transifex.net
147 4 Lukas Zapletal
  username = <your_username>
148 4 Lukas Zapletal
  password = <your_password>
149 4 Lukas Zapletal
  token = <should be empty>
150 4 Lukas Zapletal
151 4 Lukas Zapletal
And then prepare new topic branch (because the following command will make new commits to your git repo):
152 4 Lukas Zapletal
153 4 Lukas Zapletal
  git checkout -b update-translations
154 4 Lukas Zapletal
155 43 Dominic Cleal
Do the translation pull, or download the translations "for use" from the web site:
156 4 Lukas Zapletal
157 1 Lukas Zapletal
  make -C locale tx-update
158 43 Dominic Cleal
159 43 Dominic Cleal
Finally re-run the rake task, which will regenerate the JavaScript locale files:
160 43 Dominic Cleal
161 43 Dominic Cleal
  rake locale:find
162 4 Lukas Zapletal
163 4 Lukas Zapletal
And then you can push changes.
164 4 Lukas Zapletal
165 4 Lukas Zapletal
  git push ...
166 9 Lukas Zapletal
167 9 Lukas Zapletal
h2. Not translated
168 9 Lukas Zapletal
169 9 Lukas Zapletal
Some parts are (yet) not translated. These include:
170 9 Lukas Zapletal
171 9 Lukas Zapletal
 * permission names
172 9 Lukas Zapletal
 * predefined role names
173 9 Lukas Zapletal
 * predefined user names
174 20 Dominic Cleal
 * names of settings?
175 11 Dominic Cleal
 * default bookmark names (active, disabled etc)
176 11 Dominic Cleal
 * INTERNAL auth method
177 13 Lukas Zapletal
 * audit entries
178 16 Dominic Cleal
 * reorder the More submenus alphabetically?
179 18 Dominic Cleal
 * predefined install media names ("mirror")
180 18 Dominic Cleal
 * predefined partition table names
181 19 Dominic Cleal
 * template types/kinds
182 1 Lukas Zapletal
 * predefined template names
183 20 Dominic Cleal
 * "Clear" tooltip in scoped_search
184 22 Dominic Cleal
 * any external assert gems, e.g. SPICE HTML 5 console, noVNC?
185 1 Lukas Zapletal
 * column names used in scoped_search
186 1 Lukas Zapletal
 * smart variable/class parameter data and validator types
187 40 Dominic Cleal
 * email notifications/reports
188 41 Dominic Cleal
 * rake tasks
189 41 Dominic Cleal
 * logs?
190 35 Dominic Cleal
191 35 Dominic Cleal
Some parts live in external libraries or vendored assets:
192 36 Dominic Cleal
193 35 Dominic Cleal
 * will_paginate (Dom working on this)
194 38 Dominic Cleal
 ** @page_entries_info .. :model@ has unextracted strings in places, but we can't change this easily without fixing will_paginate
195 35 Dominic Cleal
 * jquery.dataTables (this has its own localisation method)
196 35 Dominic Cleal
 * Puppet log messages, log levels
197 35 Dominic Cleal
 * noVNC, spice-html5
198 10 Lukas Zapletal
199 10 Lukas Zapletal
Some items from the list above will never be translated due to technical reasons or to avoid confusion.