Fils RSS pour les
Articles
Commentaires

Dans la poursuite de la découverte et de la mise en route de Ruby on Rails, je vais vous montrer comment on peut facilement internationaliser un projet Rails avec l'aide du plugin Globalize.

Nous allons pour cela reprendre CapTest, le projet que nous avons créé dans notre série d'article 'Le 57ième guide pour débuter avec Ruby on Rails' et tout particulièrement l'article qui traite de la création de notre application test sous Windows XP.

Le but de cet article est de 'franciser' notre projet pour qu'il nous affiche, notamment, les dates en français.

Situation de départ et outils utilisés

  • nous sommes sous Windows XP
  • nous venons tout juste de créer l'application CapTest comme expliqué dans cet article
  • cela suppose que nous avons installé:
    • MySQL
    • EasyEclipse
    • un utilitaire de gestion de MySQL . Dans cet article, j'ai utilisé HeidiSQL

(i) Toutes les captures d'écrans de cet article sont affichées grâce aux plugins ImageManager et LightBox. Elles forment, pour ceux qui le désirent, un diaporama complet de l'article via l'utilisation des flèches de navigation de l'affichage dans LightBox.

Un dernière chose avant de commencer, parmi tous les articles consacrés au plugin Globalize, j'ai tout particulièrement apprécié l'article (en) de Sven Fuchs cité sur le site du plugin.

Mettons MySQL en route

mysql start.jpg
 
mysql starting.jpg

Créons les bases de données

connect mysql.jpg
 
create db 01.jpg
 
create db 02.jpg
 

db created.jpg

Créons l'utilisateur

edit user 01.jpg
 
edit user 02.jpg
 
edit user 03.jpg
 
edit user 04.jpg
 
edit user 05.jpg
 

Mettons database.yml à jour

databse yml.jpg
 

Installons le plugin Globalize

C:\57ieme_espace\CapTest>

  • lançons le téléchargement du plugin1

(i) Attention de bien prendre la version /branches/for-1.2

(i) Pour ceux qui ont fait la mise à jour vers Rails 1.2.x, il faudra probablement d'abord désinstaller le version précédente (for-1.1) via ruby script/plugin remove globalize

C:\57ieme_espace\CapTest>ruby script/plugin install http://svn.globalize-rails.org/svn/globalize/branches/for-1.2
+ ./for-1.2/LICENSE
+ ./for-1.2/README
+ ./for-1.2/data/country_data.csv
+ ./for-1.2/data/language_data.csv
+ ./for-1.2/data/translation_data.csv
+ ./for-1.2/generators/globalize/USAGE
+ ./for-1.2/generators/globalize/globalize_generator.rb
+ ./for-1.2/generators/globalize/templates/migration.rb.gz
+ ./for-1.2/generators/globalize/templates/tiny_migration.rb.gz
+ ./for-1.2/init.rb
+ ./for-1.2/lib/globalize/localization/core_ext.rb
+ ./for-1.2/lib/globalize/localization/core_ext_hooks.rb
+ ./for-1.2/lib/globalize/localization/db_translate.rb
+ ./for-1.2/lib/globalize/localization/db_view_translator.rb
+ ./for-1.2/lib/globalize/localization/locale.rb
+ ./for-1.2/lib/globalize/localization/rfc_3066.rb
+ ./for-1.2/lib/globalize/models/country.rb
+ ./for-1.2/lib/globalize/models/currency.rb
+ ./for-1.2/lib/globalize/models/language.rb
+ ./for-1.2/lib/globalize/models/model_translation.rb
+ ./for-1.2/lib/globalize/models/translation.rb
+ ./for-1.2/lib/globalize/models/view_translation.rb
+ ./for-1.2/lib/globalize/rails/action_mailer.rb
+ ./for-1.2/lib/globalize/rails/action_view.rb
+ ./for-1.2/lib/globalize/rails/active_record.rb
+ ./for-1.2/lib/globalize/rails/active_record_helper.rb
+ ./for-1.2/lib/globalize/rails/date_helper.rb
+ ./for-1.2/populators/pop_dates.rb
+ ./for-1.2/populators/pop_migration.rb
+ ./for-1.2/populators/pop_pluralization.rb
+ ./for-1.2/populators/pop_seps.rb
+ ./for-1.2/tasks/data.rake
+ ./for-1.2/test/action_mailer_test/globalize_mailer/test.en-US.plain.text.rhtml
+ ./for-1.2/test/action_mailer_test/globalize_mailer/test.en.plain.text.rhtml
+ ./for-1.2/test/action_mailer_test/globalize_mailer/test.he.plain.text.rhtml
+ ./for-1.2/test/action_mailer_test/globalize_mailer/test.plain.text.rhtml
+ ./for-1.2/test/action_mailer_test.rb
+ ./for-1.2/test/config/database.yml.default
+ ./for-1.2/test/config/database.yml.example
+ ./for-1.2/test/core_ext_test.rb
+ ./for-1.2/test/currency_test.rb
+ ./for-1.2/test/date_helper_test.rb
+ ./for-1.2/test/db/schema.rb
+ ./for-1.2/test/db_translation_test.rb
+ ./for-1.2/test/fixtures/globalize_categories.yml
+ ./for-1.2/test/fixtures/globalize_categories_products.yml
+ ./for-1.2/test/fixtures/globalize_countries.yml
+ ./for-1.2/test/fixtures/globalize_languages.yml
+ ./for-1.2/test/fixtures/globalize_manufacturers.yml
+ ./for-1.2/test/fixtures/globalize_products.yml
+ ./for-1.2/test/fixtures/globalize_simples.yml
+ ./for-1.2/test/fixtures/globalize_translations.yml
+ ./for-1.2/test/locale_test.rb
+ ./for-1.2/test/mime_responds_test.rb
+ ./for-1.2/test/model_test.rb
+ ./for-1.2/test/render_test.rb
+ ./for-1.2/test/standard_data_test_helper.rb
+ ./for-1.2/test/test_helper.rb
+ ./for-1.2/test/test_standard_data.rb
+ ./for-1.2/test/validation_test.rb
+ ./for-1.2/test/view_picking_test.rb
+ ./for-1.2/test/view_translation_test.rb
+ ./for-1.2/test/views/layouts/standard.rhtml
+ ./for-1.2/test/views/render/test.rhtml
+ ./for-1.2/test/views/respond_to/all_types_with_layout.rhtml
+ ./for-1.2/test/views/respond_to/all_types_with_layout.rjs
+ ./for-1.2/test/views/respond_to/using_defaults.en.rhtml
+ ./for-1.2/test/views/respond_to/using_defaults.en.rjs
+ ./for-1.2/test/views/respond_to/using_defaults.en.rxml
+ ./for-1.2/test/views/respond_to/using_defaults.fr.rhtml
+ ./for-1.2/test/views/respond_to/using_defaults.fr.rjs
+ ./for-1.2/test/views/respond_to/using_defaults.fr.rxml
+ ./for-1.2/test/views/respond_to/using_defaults.rhtml
+ ./for-1.2/test/views/respond_to/using_defaults.rjs
+ ./for-1.2/test/views/respond_to/using_defaults.rxml
+ ./for-1.2/test/views/respond_to/using_defaults_with_type_list.en.rhtml
+ ./for-1.2/test/views/respond_to/using_defaults_with_type_list.en.rjs
+ ./for-1.2/test/views/respond_to/using_defaults_with_type_list.en.rxml
+ ./for-1.2/test/views/respond_to/using_defaults_with_type_list.fr.rhtml
+ ./for-1.2/test/views/respond_to/using_defaults_with_type_list.fr.rjs
+ ./for-1.2/test/views/respond_to/using_defaults_with_type_list.fr.rxml
+ ./for-1.2/test/views/respond_to/using_defaults_with_type_list.rhtml
+ ./for-1.2/test/views/respond_to/using_defaults_with_type_list.rjs
+ ./for-1.2/test/views/respond_to/using_defaults_with_type_list.rxml
+ ./for-1.2/test/views/test.he-IL.rhtml
+ ./for-1.2/test/views/test.rhtml
+ ./for-1.2/test/views/test2.he.rhtml
+ ./for-1.2/test/views/test2.rhtml
 
C:\57ieme_espace\CapTest>

  • après un 'refresh', constatons qu'il est bien arrivé dans l'arborescence de notre projet

plugin refresh.jpg

  • renommons-le en 'globalize'

plugin rename.jpg
 
plugin renamed.jpg
 

  • configurons notre environnement EasyEclipse pour rendre fonctionnel l'onglet 'Rake Tasks' de notre perspective

rake windows pref.jpg
 
rake rails config 01.jpg
 

(i) les chemins à renseigner sont dans notre cas:
 
C:\ruby\lib\ruby\gems\1.8\gems\rake-0.7.1\bin\rake
C:\ruby\lib\ruby\gems\1.8\gems\rails-1.1.6\bin\rails

 
Depuis le passage à la version Rails 1.2.x les nouvelles valeurs sont:
 

c:\ruby\bin\rails
c:\ruby\bin\rake
 
il faut également modifier dans config/environment.rb la ligne
RAILS_GEM_VERSION = '1.2.2'2

 

  • utilisons cet onglet pour installer Globalize
    rake globalize setup 01.jpg
     
    rake globalize setup 02.jpg
     
    rake globalize setup 03.jpg
     

  • le 'témoin' rouge nous indique que rake génère les tables

rake globalize setup 04.jpg
 

  • lorsque le "témoin s'éteint" nous pouvons vérifier avec HeidiSQL que les tables de Globalize sont bien présentes.

rake globalize setup db check.jpg

Modifions environment.rb à jour pour inclure le plugin

modif environment.jpg

(i) il est important de conserver en-US comme langage de base3

Modifions notre index.rhtml afin de visualiser les variables loacles

  1.       <head>
  2.          <title>CapTest</title>
  3.       </head>
  4.       <body>
  5.          <p>
  6.             Il est <%= Time.now.loc "%A %d %B %Y" %>.
  7.           </p>
  8.        </body>
  9.    </html>

(i) on peut trouver les variables de format notamment dans:
 
http://www.rubycentral.com/book/ref_c_time.html#Time.strftime
http://pwet.fr/man/linux/fonctions_bibliotheques/strftime
 

Un petit passage par le navigateur donne:

before_1.jpg

Modifions le contrôleur application.rb

  • la modification de ce contrôleur va nous permettre de déclarer les variables locales françaises pour l'ensemble de notre projet4
  1. # Filters added to this controller will be run for all controllers in the application.
  2. # Likewise, all the methods added will be available for all controllers.
  3. class ApplicationController <ActionController::Base
  4.  
  5.   Locale.set("fr-FR")
  6.  
  7. end

Rechargeons la page dans le navigateur

after.jpg

:d ça marche :d

A suivre...

Retour vers l'article d'introduction

 


  1. comme indiqué sur le site de Globalize ou dans l'article mentionné [retour]
  2. dans une application générée par Rails 1.2.2 la ligne devient RAILS_GEM_VERSION = '1.2.2' unless defined? RAILS_GEM_VERSION [retour]
  3. ce qui nous permet de garder la structure de base intacte et de placer toutes les traductions dans les tables de Globalize [retour]
  4. pour ceux que cela intéresse, vous pouvez remplacer fr-FR par exemple par de-DE et voir ce que cela donne... [retour]

Tags: , , , , , , , , , ,

7 réponses à “Franciser un projet Rails: avec le plugin Globalize, c’est facile et ça marche!”

  1. le 22 jan 2007 à 9:02 Laurent

    Dans l’exemple Globalize est utilisé sur un format de date. Peut il etre utilisé pour tous les labels/prompts d’une page. Si oui, comment stocker (en base, fichier) les traductions, et comment y acceder.

  2. le 22 jan 2007 à 9:44 Marc Charlet

    bonjour Laurent,

    le but de cet article était justement d’afficher les dates en français…
    Bien sûr il y a moyen de faire (beaucoup) plus (mieux?) avec le plugin!
    A partir de moment où tu sais qu’il fonctionne (but de l’article), je te conseille d’approfondir le sujet en lisant, par exemple, les articles de sven http://www.artweb-design.de/articles/2006/11/10/globalize-five-minutes-instant-overview
    et/ou les articles sur le site du plugin http://wiki.globalize-rails.org/globalize/

    bien à toi

    une autre piste à suivre se trouve dans le livre ‘Rails Recipes’ (http://www.pragmaticprogrammer.com/titles/fr_rr/) avec la possibilité de télécharger l’extrait qui parle du plugin: http://media.pragprog.com/titles/fr_rr/Localize.pdf

  3. le 10 fév 2007 à 20:42 Yohann

    Bonjour Marc,

    Merci pour cet excellent article et pour les informations de la mise à jour vers la version 1,2.

    Je voudrais savoir si il existe un moyen d’accéder au paramètre de localistation (comme “en” ou “fr” par exemple) depuis une méthode d’un modèle.

    Certains des attributs dans mes tables sont nommés comme “name_en”, “name_fr” ect…

    je souhaiterais faire une méthode “name” dans le modèle qui fasse la réflection sur ces attributs.

    Merci beaucoup si tu vois une solution a cette question -)

    Cordialement,

    yohann

  4. le 10 fév 2007 à 22:27 Marc Charlet

    Bonjour Yohann,

    je n’ai pas de réponse immédiate à la question que tu me poses :s. Je suis encore bien débutant dans beaucoup de domaines et le but de ma série d’articles était de partager mes expériences dans ma découverte de Ruby on Rails.

    J’ai quand même trouvé un début de réponse, une piste donnée par Sven sur son site artweb design. Il y donne un lien vers le site de Saimon Moore qui parle dans son article (en) ‘Alternative implementation of Globalize Model Translations‘ de nouvelles possibilités du plugin Globalize qui me semblent correspondre à tes besoins.

    Désolé de ne pouvoir t’aider davantage.

    Tiens-nous au courant.

  5. le 11 fév 2007 à 0:48 Yohann

    Merci Marc !!

    je pense que c’est exactement ca,

    Locale.active.language.code est capable de renvoyer l’equivalent du params[:locale] dans les modèles.

    C’est une méthode complémentaire à Globalize que d’avoir un accès au traductions dans la même table que la requête originale. Cela sert de backup en même temps que d’accélérer la localistaion -) .

    Dans certains cas, si les requêtes ne se font pas sur les id…cela permet de garder les paramètres traduits sans écrire ["attribut#{params[:locale]] partout ( ce qui rend fou d’ailleurs )

    Je reposterai ici si je trouve un moyen plus simple que sur le dernier lien.

    Merci encore de ton aide !

    Yohann

  6. le 11 fév 2007 à 10:10 Marc Charlet

    :d ravi d’avoir pu t’aider

  7. le 28 avr 2007 à 22:14 julien

    Bonjour,

    M’étant mis à lire des docs sur RoR seulement aujourd’hui je me suis vite demandé s’il était possible de “multi-langué” les applis. Ca a l’air d’être le cas et ça m’encourage à continuer à potasser )

    Merci beaucoup !