Internationalization is an important feature in a worldwide project. All-important projects required at some point to be used by people with different cultures and languages. This constraint must be understood from the application architecture to the implementation.
Symfony is bundled with many tools to create a full stack internationalized and localized application. However it can be hard to know how to handle all these tools: from the database layer (doctrine / propel) to the view, without missing the sfForm sub-framework.
The translation process can be very long as it involves the technical team to update and deploy the new translation files. Moreover it also requires some technical knowledge from the client to work with translation files. All these issues can be nicely resolved by using one plugin: mgI18nPlugin.
mgI18nPlugin is a n interactive GUI build on top of the symfony framework to translate messages used in the current pages. The plugin can also parse lib and action class to find translatable messages.
The session will demonstrate:
- All i18n features provided by the symfony framework
- Good practices
- Presentation of the mg18nPlugin which allows to edit project translations from within the website.
2. Thomas Rabaix
• freelance
• symfony fan
– Conference #sflive09
– Book : more with symfony
– Plugins
• swFunctionalTestGenerationPlugin : generate ready-to-be-customized
test skeletons in a matter of minutes
• swCrossLinkApplicationPlugin : add cross application link in your project
• sfSolrPlugin : integrates Solr into symfony framework.
• Many more
Internationalization|
Thomas
Rabaix
–
h-p://www.soleoweb.com
3. What is internationalization and localization ?
• Internationalization
• Localization
Internationalization|
Thomas
Rabaix
–
h-p://www.soleoweb.com
4. Culture ?
• Culture is the addition of
– Language + Region
• fr : french
• fr_FR : french from France
• fr_BE : french from Belgium
• en_UK : english from United-Kingdom
• en_US : english from United-States
Internationalization|
Thomas
Rabaix
–
h-p://www.soleoweb.com
5. What elements can be i18n and l10n ?
• Internationalization
– url : routing
– Model : doctrine + propel
– form : sfForm framework
• Localization
– number
– currency
– date / time
Internationalization|
Thomas
Rabaix
–
h-p://www.soleoweb.com
6. Internationalization
• most of the i18n code is based on the Prado framework
• ICU data has been updated on sf1.3 and sf1.4
• edit your settings.yml and enable i18n options
Internationalization|
Thomas
Rabaix
–
h-p://www.soleoweb.com
7. Culture detection
Internationalization|
Thomas
Rabaix
–
h-p://www.soleoweb.com
9. Culture in URL
• This is a feature built in the sfRouting class and
symfony uses the value to update the user current
culture.
• example : /en/recipes/search => sf_culture = en
Internationalization|
Thomas
Rabaix
–
h-p://www.soleoweb.com
10. Creating i18n url
• example
– /recettes/recherche
– /recipes/search
• This is not a built in feature, however plugins or code
can help you to create translated url.
Internationalization|
Thomas
Rabaix
–
h-p://www.soleoweb.com
11. Solution 1 : ysfDimensionPlugin
• You can create custom configuration files per dimension,
– a culture dimension with 'fr' or 'en'
• then you just have to create :
– SF_APP_FOLDER/config/en/routing.yml
– SF_APP_FOLDER/config/fr/routing.yml
• con: duplicate routes configurations on each routing.yml
files and can be tricky to setup
• pro : no performances overhead
Internationalization|
Thomas
Rabaix
–
h-p://www.soleoweb.com
12. Solution 2 : custom code
• Create a custom sfRouting class
• Usage
Internationalization|
Thomas
Rabaix
–
h-p://www.soleoweb.com
13. Model definition
• Propel and Doctrine both have built in feature to handle
translation version
Doctrine Propel
Internationalization|
Thomas
Rabaix
–
h-p://www.soleoweb.com
14. Model and culture
• The default model culture value can be accessed
through :
– sfDoctrineRecord::getDefaultCulture()
– sfPropel::getDefaultCulture()
• The default model culture value can be updated
through :
– sfDoctrineRecord::setDefaultCulture()
– sfPropel::setDefaultCulture()
Internationalization|
Thomas
Rabaix
–
h-p://www.soleoweb.com
15. Model i18n properties
• Accessing i18n property :
– always uses the default culture
• Doctrine
• Propel
Internationalization|
Thomas
Rabaix
–
h-p://www.soleoweb.com
16. Model : query
• ORM never automatically left join the translation table
• Doctrine
• Propel
Internationalization|
Thomas
Rabaix
–
h-p://www.soleoweb.com
18. Helpers - DateHelper
• format_date helper and format_datetime helper
– Output format (culture = en)
the
format_date
and
date.me
helpers
automa.cally
localize
and
translate
date
using
ICU
data
Internationalization|
Thomas
Rabaix
–
h-p://www.soleoweb.com
21. Behind helpers
• Helpers are just shortcut functions to internal class
– sfNumberFormat and sfDateFormat
– sfI18n
• You can use these classes in your actions or custom lib
– Check out the symfony API
Internationalization|
Thomas
Rabaix
–
h-p://www.soleoweb.com
22. sfForm – i18n friendly widgets
• the sfForm framework provides with many i18n widget :
– sfWidgetFormI18nChoiceCountry
– sfWidgetFormI18nChoiceCurrency
– sfWidgetFormI18nChoiceLanguage
– sfWidgetFormI18nChoiceTimezone
– sfWidgetFormI18nDate
– sfWidgetFormI18nDateTime
– sfWidgetFormI18nTime
• And the related validator :
zh
– sfValidatorI18nChoiceTimezone
– sfValidatorI18nChoiceLanguage
– sfValidatorI18nChoiceCountry
All
these
widgets
accept
a
culture
op.on
en
Internationalization|
Thomas
Rabaix
–
h-p://www.soleoweb.com
23. sfForm - swCultureDemoForm
Culture
is
set
in
the
controller
DO
NOT
USE
sfContext::getInstance()
Internationalization|
Thomas
Rabaix
–
h-p://www.soleoweb.com
24. sfForm – elements translation
• The sfForm has a translation callback function through the
sfWidgetFormSchemaFormatter class
• Label, error message, help messages are translated by
using the callable method
• warning : with sf1.3 and sf1.4 "choice" widgets which
extends the sfWidgetFormChoiceBase class automatically
translates choices provided when the widget is rendered.
Internationalization|
Thomas
Rabaix
–
h-p://www.soleoweb.com
25. sfForm + ORM
• symfony provides an unified API between both ORM to
handle i18n model.
• If you need to build a form to edit translation from a
model, you can use the `embedI18n` method
– method declared in the sfFromDoctrine and sfFormPropel
Internationalization|
Thomas
Rabaix
–
h-p://www.soleoweb.com
26. sfForm – backend form
• Create a custom BaseForm[Doctrine|Propel] class in
the backend/lib/form folder.
Internationalization|
Thomas
Rabaix
–
h-p://www.soleoweb.com
27. Translation management …
• Sources available
– Gettext
– MySQL
– SQLite
– XLIFF
• Not really user friendly
Internationalization|
Thomas
Rabaix
–
h-p://www.soleoweb.com
28. … an alternative
• mgI18nPlugin : interactive GUI to translate webpage
• Open sourced by menugourmet.com : online quality
recipes
Internationalization|
Thomas
Rabaix
–
h-p://www.soleoweb.com
29. Menugourmet.com
Internationalization|
Thomas
Rabaix
–
h-p://www.soleoweb.com
30. example
Internationalization|
Thomas
Rabaix
–
h-p://www.soleoweb.com
31. mgI18nPlugin - parameters
• The plugin detects parameters in your translated
message
Internationalization|
Thomas
Rabaix
–
h-p://www.soleoweb.com
32. mgI18nPlugin
• Display a popup to translate all messages used in the
current page
• Parse lib and actions to find message (handle
catalogue)
• All messages are stored in database
Internationalization|
Thomas
Rabaix
–
h-p://www.soleoweb.com
33. mgI18nPlugin - tips
• Cache is a key/value, so do not use a full text message.
– Smaller is your cache, quicker it will be loaded
– Use catalogue
• Code message :
– The awesome recipes list => title_recipes
• Always use a prefix :
– btn : btn_submit
– label : label_name
– link : link_to_homepage
Internationalization|
Thomas
Rabaix
–
h-p://www.soleoweb.com
34. mgI18nPlugin – configuration
• read the famous README file
• Tweak security
Internationalization|
Thomas
Rabaix
–
h-p://www.soleoweb.com
35. mgI18nPlugin – tools
• Import xliff into the database
• unreachable messages
Internationalization|
Thomas
Rabaix
–
h-p://www.soleoweb.com
36. mgI18nPlugin – ROADMAP
• Complete export database to xliff files
• Remove Doctrine dependency, full PDO support
• Simplify GUI
Internationalization|
Thomas
Rabaix
–
h-p://www.soleoweb.com