Gábor Hojtsy gave a presentation on the history and process of localization and translation for Drupal projects. He discussed how translation strings are extracted from code and stored in .po files to be shared among translators. Localize.drupal.org was created to streamline the translation process by automating tasks like parsing releases and providing a centralized web interface. The site now hosts over 5,600 translated releases and 149,000 translation strings across many projects.
2. ME
• Needed a translated Drupal in 2003
• Became locale.module maintainer,
Drupal 6 core committer
• Developed all kinds of translation tools
• Working for Acquia
3. YOU
• Running translated Drupal sites?
• Translating modules for “self”?
• Contributing to drupal.org translations?
• Writing & translating modules to “self”?
5. 2001 Jan 22
t() is born
Drupal
1.0.0 2.0.0 3.0.0
2001 Feb
locale.module,
translation interface Drupal.org
Disclaimer: time scale not exact
6. 2004 Aug
2002 Jan Gettext based sharing,
Locale cache web admin, plurals
4.0.0 4.3.0 4.5.0 4.7.0
2003 Sep
extractor.php
Disclaimer: time scale not exact
7. 2006 Sep
Translatable installer
5.0
2006 Aug 2007 May
@! Automated import
Disclaimer: time scale not exact
8. 2007 Jun
JS translation
6.0 7.0
2009 Aug
2009 Jun localize.drupal.org
Contexts
Disclaimer: time scale not exact
14. D!"#$% 6 Ch!$for new versions at hojtsy.hu – Freely redistri
By Gábor Hojtsy –
ion API
JavaScript translat to the
Translates ‘Home’ play.
ion API e’) language used for page dis
Core PHP translat to the Drupal.t(‘Hom
Translates ‘Home’
t(‘H ome’) requested language.
Plural Returns the prop er translation for
Drupal.format l rules in
Returns the proper (count, the text based on plura
format_plural
& '(%$&)*'
sed e.
lation for the text ba ‘1 comment’, the page’s langu
ag
eck
($count, trans
GET THE
on plural rules in the
‘@coun t comments’)
‘1 comment’, guage.
’) requested lan can be provided,
‘@count comm
ents placements array
Optional variable realways the page language!
placements array
and language is
Optional variable re provided in this order.
n be ix characters)
language code ca ats (based on pref
Replacement form value escaped with
features Replaced with the ut.
ns using translation
Other PHP functio @count check_plain() for outp
format_date Translates parts
of the
CHEAT SHEET
+,-$& (,--&bu. ble as long as credit is kept.
d
value escaped an
($timesta mp, date/time formatting. Replaced with the r (theme
'medium', ...) ted as a placeholde
%size format
interval in (‘placeh older’)).
Displays the time t
l Translates value as is, withou
format_interva human terms. Replaced with the ting. Insecure! Only
... ) names of the segments.
($timestamp, ional format
!html any addit eady sanitized your text.
provided use if you alr
Formats a file size e MB, y(
FROM
tes. Translate s th irectory’, arra
ize, ...) in by me moved to @d
format_size($s Example: t(‘%na => $dirname);
ta
.
KB and byte labels lename, ‘@dire
ctory’
1.1 - '*.-/0
‘%name’ => $fi
e code at the end.
an optional languag
All functions accept th e installer
Translating text in
ed later y as t(), but
translation and us Works the same wa ckend. Use
Text extracted for y ba
Module/theme nam
e; uses a file+memor
fo files description; package na
me. st(‘Home’ ) only in the installer and in install
HOJTSY.HU
.in
support.
profiles. No plural
names,
Literal permission d
hook_per m() when provided with standar ll files and any
-! 15. 2007.
ns array syntax. Use get_t() in .insta
implementatio could run in the
other code which s ‘t’ or ‘st’
$t = get_t(); installer too. It retu nction to be
d rn
Menu item ‘title’ an
hook_menu() ‘description’ keys
, when $t(‘H ome’); depending on the fu
ings. t.
implem entations provided as literal str used at the momen
sage,
Log type and mes ral nslation, your
and need to use traif your module
when pr ovided as lite have an .install file ler
Remember: if you easily end up running in the instal e get_t()!
u’, strings. Third parameter
watchdog(‘men function calls could core module in an install profile. Us
calls specifies the replacements becomes a
‘Items saved’) pport.
array. No plural su
bal context,
Usage of t() in a glo ST’, t(‘...’)). The
ALSO SEE
mistakes e message eg. for
The most common Reuse of the sam such as define(‘CON t initialized at
lues, such as t($type). d drupal_set_mes
sage() t ye
locale system is no e is incorrect
Using dynamic va s to call watchdog() an
dynamic string allows t(), the later e, so this usag
Whenever you use make sure that all calls. The former dis t possible. that tim
nasty performance
,
the above functions eady in the code is no
requires t(), so this e API functions and also leads to
it.
possibl e values are alr I. Always ca ll the abov problems. Never do
l form using the AP indirection.
elsewhere in litera er provided content. directly, without
us
Do not translate
D.O/NODE/322729
so
e using the API pr
operly ule plugin support, rt a
ar s have coder mod po
Tools to verify you Drupal 6. x-2 or later version rted in reviews. Also feel free to ex .
e API is repo ings appear
improper use of th ule/theme and check whether all str
/project/potx od
http://drupal.org template for your m e t() or some
en you forgot to us
nn ot find mistakes wh localization client has a
The potx module ca late your output. The . If certain
ot her function to trans translate text displayed on the page e API.
_clie nt convenient interface to , you forg ot to use th
rg/project/l10n ing up for translation
http://drupal.o strings are not show
29. SHARING PROCESS
Static
source code
Gettext
.pot
Translated
.po
30. SHARING PROCESS
Static
source code
Gettext
.pot
Translated
.po
31. SHARING PROCESS
Static
source code
Gettext
.pot
Translated
.po
32. •Translation template Static
extractor source code
•http://drupal.org/
project/potx
•Web interface in your Gettext
Drupal install .pot
•Interfaces with coder
review module to help
developers
33. SHARING PROCESS
Static
source code
Gettext
.pot
Translated
.po
34. SHARING PROCESS
Static
source code
Gettext
.pot
Translated
.po
36. SHARING PROCESS
Static
source code
Gettext
.pot
Translated
.po
37. SHARING PROCESS
Static
source code
Gettext
.pot
Translated
.po
38. •Translation teams commit .po files to CVS
•http://drupal.org/project/Translations
and under contributed projects
•Released on the parent project’s
timeframe
•Drupal imports automatically
Translated
.po
39. SHARING PROCESS
Static
source code
Gettext
.pot
Translated
.po
40. SHARING PROCESS
Static
source code
Gettext
.pot
Translated
.po
71. TRANSLATE YOUR CODE
• Open Atrium and Gallery 2 uses
Localization server to translate their
code
• Youcan set up l10n_server to parse
your own code and translate in-house
• Eg. https://translate.openatrium.com/