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 :
                                                                                                                                           zh	
  
      –  sfValidatorI18nChoiceTimezone
      –  sfValidatorI18nChoiceLanguage
      –  sfValidatorI18nChoiceCountry

                           All	
  these	
  widgets	
  accept	
  a	
  
                           culture	
  op.on	
  
                                                                                                                                          en	
  
                                                                   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/	
  
                                                                           Internationalization|	
  Thomas	
  Rabaix	
  –	
  h-p://www.soleoweb.com	
  

Internationalization with the symfony framework

  • 1.
    Internationalization Thomas Rabaix –Soleoweb SARL Internationalization|  Thomas  Rabaix  –  h-p://www.soleoweb.com  
  • 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 internationalizationand localization ? •  Internationalization •  Localization Internationalization|  Thomas  Rabaix  –  h-p://www.soleoweb.com  
  • 4.
    Culture ? •  Cultureis 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 canbe 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 ofthe 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  
  • 8.
    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  
  • 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 •  Propeland 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  
  • 17.
    Helpers – localization • NumberHelper: –  format_currency –  format_number 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  
  • 19.
    Helpers – DateHelper • format_daterange helper •  distance_of_time_in_words helper Internationalization|  Thomas  Rabaix  –  h-p://www.soleoweb.com  
  • 20.
    Helpers – I18n • __() helper •  format_number_choice helper Internationalization|  Thomas  Rabaix  –  h-p://www.soleoweb.com  
  • 21.
    Behind helpers •  Helpersare 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 – i18nfriendly 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 – elementstranslation •  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 – backendform •  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 apopup 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  
  • 37.
    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/   Internationalization|  Thomas  Rabaix  –  h-p://www.soleoweb.com