internationalization with the symfony framework
DESCRIPTION
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.TRANSCRIPT
Internationalization| Thomas Rabaix – h-p://www.soleoweb.com
Internationalization Thomas Rabaix – Soleoweb SARL
Internationalization| Thomas Rabaix – h-p://www.soleoweb.com
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
What is internationalization and localization ?
• Internationalization
• Localization
Internationalization| Thomas Rabaix – h-p://www.soleoweb.com
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
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
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
Culture detection
Internationalization| Thomas Rabaix – h-p://www.soleoweb.com
Update culture
• sfContext::getInstance()->getUser()->setCulture(‘fr’)
• Notify the user.change_culture (does not change user’s culture)
Internationalization| Thomas Rabaix – h-p://www.soleoweb.com
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
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
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
Solution 2 : custom code
• Create a custom sfRouting class
• Usage
Internationalization| Thomas Rabaix – h-p://www.soleoweb.com
Model definition
• Propel and Doctrine both have built in feature to handle translation version
Doctrine Propel
Internationalization| Thomas Rabaix – h-p://www.soleoweb.com
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
Model i18n properties
• Accessing i18n property : – always uses the default culture
• Doctrine
• Propel
Internationalization| Thomas Rabaix – h-p://www.soleoweb.com
Model : query
• ORM never automatically left join the translation table
• Doctrine
• Propel
Internationalization| Thomas Rabaix – h-p://www.soleoweb.com
Helpers – localization
• NumberHelper: – format_currency
– format_number
Internationalization| Thomas Rabaix – h-p://www.soleoweb.com
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
Helpers – DateHelper
• format_daterange helper
• distance_of_time_in_words helper
Internationalization| Thomas Rabaix – h-p://www.soleoweb.com
Helpers – I18n
• __() helper
• format_number_choice helper
Internationalization| Thomas Rabaix – h-p://www.soleoweb.com
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
sfForm – i18n friendly widgets
• the sfForm framework provides with many i18n widget :
– sfWidgetFormI18nChoiceCountry – sfWidgetFormI18nChoiceCurrency – sfWidgetFormI18nChoiceLanguage – sfWidgetFormI18nChoiceTimezone – sfWidgetFormI18nDate – sfWidgetFormI18nDateTime – sfWidgetFormI18nTime
• And the related validator :
– sfValidatorI18nChoiceTimezone – sfValidatorI18nChoiceLanguage – sfValidatorI18nChoiceCountry
All these widgets accept a culture op.on
en
zh
Internationalization| Thomas Rabaix – h-p://www.soleoweb.com
sfForm - swCultureDemoForm
Culture is set in the controller
DO NOT USE sfContext::getInstance()
Internationalization| Thomas Rabaix – h-p://www.soleoweb.com
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
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
sfForm – backend form
• Create a custom BaseForm[Doctrine|Propel] class in the backend/lib/form folder.
Internationalization| Thomas Rabaix – h-p://www.soleoweb.com
Translation management …
• Sources available – Gettext – MySQL – SQLite – XLIFF
• Not really user friendly
Internationalization| Thomas Rabaix – h-p://www.soleoweb.com
… an alternative
• mgI18nPlugin : interactive GUI to translate webpage
• Open sourced by menugourmet.com : online quality recipes
Internationalization| Thomas Rabaix – h-p://www.soleoweb.com
Menugourmet.com
Internationalization| Thomas Rabaix – h-p://www.soleoweb.com
example
Internationalization| Thomas Rabaix – h-p://www.soleoweb.com
mgI18nPlugin - parameters
• The plugin detects parameters in your translated message
Internationalization| Thomas Rabaix – h-p://www.soleoweb.com
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
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
mgI18nPlugin – configuration
• read the famous README file
• Tweak security
Internationalization| Thomas Rabaix – h-p://www.soleoweb.com
mgI18nPlugin – tools
• Import xliff into the database
• unreachable messages
Internationalization| Thomas Rabaix – h-p://www.soleoweb.com
mgI18nPlugin – ROADMAP
• Complete export database to xliff files
• Remove Doctrine dependency, full PDO support
• Simplify GUI
Internationalization| Thomas Rabaix – h-p://www.soleoweb.com
QUESTIONS ? Thomas Rabaix
hGp://www.soleoweb.com
Images references -‐ hGp://www.flickr.com/photos/photonoob/2164014945/ -‐ hGp://www.flickr.com/photos/vermininc/2389710332/ -‐ hGp://www.flickr.com/photos/16175430@N02/3490488907/ -‐ hGp://www.flickr.com/photos/urville_djasim/2643449676/