Locos x Rails

7,106 views

Published on

My talk at Locos x Rails, in Argentina, about Rails I18n (internationalization) support, tips and tricks.

Published in: Technology, News & Politics
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
7,106
On SlideShare
0
From Embeds
0
Number of Embeds
198
Actions
Shares
0
Downloads
35
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Locos x Rails

  1. I18n Rails Globalization Tuesday, April 7, 2009
  2. Fabio Akita AkitaOnRails.com Tuesday, April 7, 2009
  3. Tuesday, April 7, 2009
  4. Tuesday, April 7, 2009
  5. Tuesday, April 7, 2009
  6. Tuesday, April 7, 2009
  7. Tuesday, April 7, 2009
  8. Tuesday, April 7, 2009
  9. Tutorial-like Tuesday, April 7, 2009
  10. Tuesday, April 7, 2009
  11. I18n Before 2.2 Tuesday, April 7, 2009
  12. Chaos Tuesday, April 7, 2009
  13. Monkey Patch Approach Tuesday, April 7, 2009
  14. Many incompatible projects Tuesday, April 7, 2009
  15. Reinventing the Wheel all the time Tuesday, April 7, 2009
  16. September 2007 Tuesday, April 7, 2009
  17. Rails I18n Project Tuesday, April 7, 2009
  18. Lead from Sven Fuchs adva-cms.org Tuesday, April 7, 2009
  19. Every plugin creator gathered Tuesday, April 7, 2009
  20. Common Goals: Tuesday, April 7, 2009
  21. 100% swappable Tuesday, April 7, 2009
  22. The Least Denominator Tuesday, April 7, 2009
  23. Not a full blown L10n solution Tuesday, April 7, 2009
  24. Common, Powerful API Tuesday, April 7, 2009
  25. Simple Backend (en_US only) Tuesday, April 7, 2009
  26. Getting Started ... Tuesday, April 7, 2009
  27. rails locos Tuesday, April 7, 2009
  28. rails locos ./script/generate nifty_layout Tuesday, April 7, 2009
  29. rails locos ./script/generate nifty_layout Tuesday, April 7, 2009
  30. rails locos ./script/generate nifty_layout ./script/generate nifty_scaffold Contact name:string email:string phone:string mobile:string Tuesday, April 7, 2009
  31. rails locos ./script/generate nifty_layout ./script/generate nifty_scaffold Contact name:string email:string phone:string mobile:string Tuesday, April 7, 2009
  32. Tuesday, April 7, 2009
  33. Tuesday, April 7, 2009
  34. Tuesday, April 7, 2009
  35. Tuesday, April 7, 2009
  36. Getting i18n files Tuesday, April 7, 2009
  37. Tuesday, April 7, 2009
  38. Tuesday, April 7, 2009
  39. Tuesday, April 7, 2009
  40. config/locales/pt-BR_rails.yml Tuesday, April 7, 2009
  41. config/locales/pt-BR.rb Tuesday, April 7, 2009
  42. >> I18n.locale = :en Tuesday, April 7, 2009
  43. >> I18n.locale = :en >> I18n.translate quot;helloquot; => quot;Hello worldquot; Tuesday, April 7, 2009
  44. >> I18n.locale = :en >> I18n.translate quot;helloquot; => quot;Hello worldquot; >> I18n.localize Time.now => quot;Wed, 01 Apr 2009 22:52:08 -0300quot; Tuesday, April 7, 2009
  45. >> I18n.locale = :en >> I18n.translate quot;helloquot; => quot;Hello worldquot; >> I18n.localize Time.now => quot;Wed, 01 Apr 2009 22:52:08 -0300quot; Tuesday, April 7, 2009
  46. >> I18n.locale = :en >> I18n.translate quot;helloquot; => quot;Hello worldquot; >> I18n.localize Time.now => quot;Wed, 01 Apr 2009 22:52:08 -0300quot; Tuesday, April 7, 2009
  47. >> I18n.locale = :en >> I18n.t quot;helloquot; => quot;Hello worldquot; >> I18n.l Time.now => quot;Wed, 01 Apr 2009 22:52:08 -0300quot; Tuesday, April 7, 2009
  48. >> I18n.locale = :quot;pt-BRquot; Tuesday, April 7, 2009
  49. >> I18n.locale = :quot;pt-BRquot; >> I18n.t quot;helloquot; => quot;Alo Mundoquot; Tuesday, April 7, 2009
  50. >> I18n.locale = :quot;pt-BRquot; >> I18n.t quot;helloquot; => quot;Alo Mundoquot; >> I18n.l Time.now => quot;Quarta, 01 de Abril de 2009, 22:49 hsquot; Tuesday, April 7, 2009
  51. >> I18n.locale = :quot;pt-BRquot; >> I18n.t quot;helloquot; => quot;Alo Mundoquot; >> I18n.l Time.now => quot;Quarta, 01 de Abril de 2009, 22:49 hsquot; >> I18n.l Time.now, :format => :short => quot;01/04, 22:52 hsquot; Tuesday, April 7, 2009
  52. >> I18n.locale = :quot;pt-BRquot; >> I18n.t quot;helloquot; => quot;Alo Mundoquot; >> I18n.l Time.now => quot;Quarta, 01 de Abril de 2009, 22:49 hsquot; >> I18n.l Time.now, :format => :short => quot;01/04, 22:52 hsquot; Tuesday, April 7, 2009
  53. >> time_ago_in_words(1.month.ago) => quot;about 1 monthquot; >> time_ago_in_words(1.5.hours.ago) => quot;about 2 hoursquot; Tuesday, April 7, 2009
  54. >> time_ago_in_words(1.month.ago) => quot;about 1 monthquot; >> time_ago_in_words(1.5.hours.ago) => quot;about 2 hoursquot; >> I18n.locale = :quot;pt-BRquot; >> time_ago_in_words(1.month.ago) => quot;aproximadamente 1 mêsquot; >> time_ago_in_words(1.5.hours.ago) => quot;aproximadamente 2 horasquot; Tuesday, April 7, 2009
  55. >> I18n.t [:hello, :world] => [quot;aloquot;, quot;mundoquot;] Tuesday, April 7, 2009
  56. >> I18n.t [:hello, :world] => [quot;aloquot;, quot;mundoquot;] >> I18n.t :brazil, :defaults => [:argentina, quot;Chilequot;] => quot;Argentinaquot; Tuesday, April 7, 2009
  57. message: quot;Hello, {{name}}!quot; Tuesday, April 7, 2009
  58. message: quot;Hello, {{name}}!quot; I18n.t :message, :name => quot;Johnquot; # => quot;Hello John!quot; Tuesday, April 7, 2009
  59. message: quot;Hello, {{name}}!quot; I18n.t :message, :name => quot;Johnquot; # => quot;Hello John!quot; # en-US :days => { :one => quot;one dayquot; :other => quot;{{count}} daysquot; } Tuesday, April 7, 2009
  60. message: quot;Hello, {{name}}!quot; I18n.t :message, :name => quot;Johnquot; # => quot;Hello John!quot; # en-US :days => { :one => quot;one dayquot; :other => quot;{{count}} daysquot; } I18n.t :days, :count => 1 # => quot;one dayquot; I18n.t :days, :count => 2 # => quot;2 daysquot; Tuesday, April 7, 2009
  61. Extracting Strings Tuesday, April 7, 2009
  62. app/views/contacts/views/index.html.erb <tr> <th>Name</th> <th>Email</th> <th>Phone</th> <th>Mobile</th> </tr> Tuesday, April 7, 2009
  63. app/views/contacts/views/index.html.erb config/locales/pt-BR.rb <tr> <th>Name</th> <th>Email</th> <th>Phone</th> <th>Mobile</th> </tr> Tuesday, April 7, 2009
  64. app/views/contacts/views/index.html.erb config/locales/pt-BR.rb { :quot;pt-BRquot; => { :hello => quot;Alô Mundoquot;, :contacts => { :index => { <tr> :name => quot;Nomequot;, <th>Name</th> :email => quot;Emailquot;, <th>Email</th> :phone => quot;Telefonequot;, <th>Phone</th> :mobile => quot;Celularquot; <th>Mobile</th> } </tr> } } } Tuesday, April 7, 2009
  65. app/views/contacts/views/index.html.erb <tr> <th><%= t(quot;contacts.index.namequot;) %></th> <th><%= t(quot;index.emailquot;, :scope => quot;contactsquot;) %></th> <th><%= t(quot;phonequot;, :scope => quot;contacts.indexquot;) %></th> <th><%= t(quot;.mobilequot;) %></th> </tr> Tuesday, April 7, 2009
  66. Tuesday, April 7, 2009
  67. Tuesday, April 7, 2009
  68. config/locales/en.yml en: hello: quot;Hello worldquot; contacts: index: name: Name email: Email phone: Phone mobile: Mobile Tuesday, April 7, 2009
  69. Tuesday, April 7, 2009
  70. Setting Locale Tuesday, April 7, 2009
  71. app/controllers/application_controller.rb class ApplicationController < ActionController::Base helper :all protect_from_forgery before_filter :set_locale private def set_locale I18n.locale = params[:locale] if params[:locale] end end Tuesday, April 7, 2009
  72. app/controllers/application_controller.rb class ApplicationController < ActionController::Base helper :all protect_from_forgery before_filter :set_locale private def set_locale I18n.locale = params[:locale] if params[:locale] end end Tuesday, April 7, 2009
  73. Tuesday, April 7, 2009
  74. Tuesday, April 7, 2009
  75. More strings Tuesday, April 7, 2009
  76. app/views/contacts/views/index.html.erb <td><%= link_to t(quot;common.showquot;), contact %></td> <td><%= link_to t(quot;common.editquot;), edit_contact_path(contact) %></td> <td><%= link_to t(quot;common.destroyquot;), contact, :confirm => t('common.destroy_confirm'), :method => :delete %></td> Tuesday, April 7, 2009
  77. config/locales/pt-BR.rb { :quot;pt-BRquot; => { :hello => quot;Alô Mundoquot;, :common => { :show => quot;Mostrarquot;, :edit => quot;Editarquot;, :destroy => quot;Apagarquot;, :destroy_confirm => quot;Tem certeza?quot; }, ... } } Tuesday, April 7, 2009
  78. config/locales/en.yml en: hello: quot;Hello worldquot; common: show: Show edit: Edit destroy: Destroy destroy_confirm: Are you sure? ... Tuesday, April 7, 2009
  79. Tuesday, April 7, 2009
  80. Tuesday, April 7, 2009
  81. ActiveRecord Tuesday, April 7, 2009
  82. <% form_for @contact do |f| %> <%= f.error_messages %> <p> <%= f.label :name %><br /> <%= f.text_field :name %> </p> <p> <%= f.label :email %><br /> <%= f.text_field :email %> </p> <p> <%= f.label :phone %><br /> <%= f.text_field :phone %> </p> <p> <%= f.label :mobile %><br /> <%= f.text_field :mobile %> </p> <p><%= f.submit t(quot;common.submitquot;) %></p> <% end %> Tuesday, April 7, 2009
  83. <% form_for @contact do |f| %> <%= f.error_messages %> <p> <%= f.label :name %><br /> <%= f.text_field :name %> </p> <p> <%= f.label :email %><br /> <%= f.text_field :email %> </p> <p> <%= f.label :phone %><br /> <%= f.text_field :phone %> </p> <p> <%= f.label :mobile %><br /> <%= f.text_field :mobile %> </p> <p><%= f.submit t(quot;common.submitquot;) %></p> <% end %> Tuesday, April 7, 2009
  84. ... :activerecord => { :models => { :contact => quot;Contatoquot; }, :attributes => { :contact => { :name => quot;Nomequot;, :email => quot;Emailquot;, :phone => quot;Telefonequot;, :mobile => quot;Celularquot; } } } ... Tuesday, April 7, 2009
  85. Tuesday, April 7, 2009
  86. Tuesday, April 7, 2009
  87. Tuesday, April 7, 2009
  88. ./script/plugin install git://github.com/iain/i18n_label.git Tuesday, April 7, 2009
  89. Tuesday, April 7, 2009
  90. Tuesday, April 7, 2009
  91. Tuesday, April 7, 2009
  92. app/views/contacts/views/show.html.erb <p> <strong>Name:</strong> <%=h @contact.name %> </p> <p> <strong>Email:</strong> <%=h @contact.email %> </p> <p> <strong>Phone:</strong> <%=h @contact.phone %> </p> <p> <strong>Mobile:</strong> <%=h @contact.mobile %> </p> Tuesday, April 7, 2009
  93. app/views/contacts/views/show.html.erb <p> <strong>Name:</strong> <%=h @contact.name %> </p> <p> <strong>Email:</strong> <%=h @contact.email %> </p> <p> <strong>Phone:</strong> <%=h @contact.phone %> </p> <p> <strong>Mobile:</strong> <%=h @contact.mobile %> </p> Tuesday, April 7, 2009
  94. app/views/contacts/views/show.html.erb <p> <strong><%= Contact.human_attribute_name('name') %>:</strong> <%=h @contact.name %> </p> <p> <strong><%= Contact.human_attribute_name('email') %>:</strong> <%=h @contact.email %> </p> <p> <strong><%= Contact.human_attribute_name('phone') %>:</strong> <%=h @contact.phone %> </p> <p> <strong><%= Contact.human_attribute_name('mobile') %>:</strong> <%=h @contact.mobile %> </p> Tuesday, April 7, 2009
  95. app/views/contacts/views/show.html.erb <p> <strong><%= Contact.human_attribute_name('name') %>:</strong> <%=h @contact.name %> </p> <p> <strong><%= Contact.human_attribute_name('email') %>:</strong> <%=h @contact.email %> </p> <p> <strong><%= Contact.human_attribute_name('phone') %>:</strong> <%=h @contact.phone %> </p> <p> <strong><%= Contact.human_attribute_name('mobile') %>:</strong> <%=h @contact.mobile %> </p> Tuesday, April 7, 2009
  96. Tuesday, April 7, 2009
  97. app/controllers/contacts_controller.rb flash[:notice] = quot;Successfully created contact.quot; flash[:notice] = t(quot;contacts.messages.successful_createquot;) messages: successful_create: Successfully created contact. successful_update: Successfully updated contact. successful_destroy: Successfully destroyed contact. :messages => { :successful_create => quot;Contato criado com sucesso.quot;, :successful_update => quot;Contato atualizado com sucesso.quot;, :successful_destroy => quot;Contato apagado com sucesso.quot;, }, Tuesday, April 7, 2009
  98. app/models/contact.rb class Contact < ActiveRecord::Base validates_presence_of :name end Tuesday, April 7, 2009
  99. Tuesday, April 7, 2009
  100. Routing Tuesday, April 7, 2009
  101. http://localhost:3000/pt-BR/contacts/new { :locale => :quot;pt-BRquot;, :controller => quot;contactsquot;, :action => quot;newquot;} Tuesday, April 7, 2009
  102. http://localhost:3000/pt-BR/contacts/new { :locale => :quot;pt-BRquot;, :controller => quot;contactsquot;, :action => quot;newquot;} ./script/plugin install git://github.com/svenfuchs/routing-filter.git Tuesday, April 7, 2009
  103. http://localhost:3000/pt-BR/contacts/new { :locale => :quot;pt-BRquot;, :controller => quot;contactsquot;, :action => quot;newquot;} ./script/plugin install git://github.com/svenfuchs/routing-filter.git ActionController::Routing::Routes.draw do |map| map.filter 'locale' map.resources :contacts end Tuesday, April 7, 2009
  104. http://localhost:3000/pt-BR/contacts/new { :locale => :quot;pt-BRquot;, :controller => quot;contactsquot;, :action => quot;newquot;} ./script/plugin install git://github.com/svenfuchs/routing-filter.git ActionController::Routing::Routes.draw do |map| map.filter 'locale' map.resources :contacts end Tuesday, April 7, 2009
  105. Tuesday, April 7, 2009
  106. Tuesday, April 7, 2009
  107. Tuesday, April 7, 2009
  108. Tuesday, April 7, 2009
  109. Views Tuesday, April 7, 2009
  110. ./script/generate controller page Tuesday, April 7, 2009
  111. ./script/generate controller page class PageController < ApplicationController def show render :template => params[:id] end end Tuesday, April 7, 2009
  112. ./script/generate controller page class PageController < ApplicationController def show render :template => params[:id] end end app/views/page/_header.html.erb app/views/page/about.html.erb Tuesday, April 7, 2009
  113. Tuesday, April 7, 2009
  114. app/views/page/_header.pt-BR.html.erb app/views/page/about.pt-BR.html.erb Tuesday, April 7, 2009
  115. app/views/page/_header.pt-BR.html.erb app/views/page/about.pt-BR.html.erb Tuesday, April 7, 2009
  116. app/views/page/about.html.erb <%= render :partial => quot;headerquot; %> <p>Faster than a bullet<br/> Terrifying scream<br/> Enraged and full of anger<br/> He’s half man and half machine</p> Tuesday, April 7, 2009
  117. app/views/page/about.html.erb <%= render :partial => quot;headerquot; %> <p>Faster than a bullet<br/> Terrifying scream<br/> Enraged and full of anger<br/> He’s half man and half machine</p> app/views/page/about.pt-BR.html.erb <%= render :partial => quot;headerquot; %> <p>Mais rápido que uma bala<br/> Um grito apavorante<br/> Enfurecido e cheio de raiva<br/> Ele é metade homem, metade máquina</p> Tuesday, April 7, 2009
  118. app/views/page/about.html.erb <%= render :partial => quot;headerquot; %> <p>Faster than a bullet<br/> Terrifying scream<br/> Enraged and full of anger<br/> He’s half man and half machine</p> app/views/page/about.pt-BR.html.erb <%= render :partial => quot;headerquot; %> <p>Mais rápido que uma bala<br/> Um grito apavorante<br/> Enfurecido e cheio de raiva<br/> Ele é metade homem, metade máquina</p> Tuesday, April 7, 2009
  119. app/views/page/about.html.erb <%= render :partial => quot;headerquot; %> <p>Faster than a bullet<br/> Terrifying scream<br/> Enraged and full of anger<br/> He’s half man and half machine</p> app/views/page/about.pt-BR.html.erb <%= render :partial => quot;headerquot; %> <p>Mais rápido que uma bala<br/> Um grito apavorante<br/> Enfurecido e cheio de raiva<br/> Ele é metade homem, metade máquina</p> Tuesday, April 7, 2009
  120. app/views/page/_header.html.erb <% title quot;Official Rails I18n Project Hymnquot; %> <h3>Judas Priest - Painkiller</h3> app/views/page/_header.pt-BR.erb <% title quot;Hino Oficial do Projeto Rails I18nquot; %> <h3>Judas Priest - Painkiller</h3> Tuesday, April 7, 2009
  121. Tuesday, April 7, 2009
  122. Browser Languages Tuesday, April 7, 2009
  123. Tuesday, April 7, 2009
  124. ./script/plugin install git://github.com/iain/http_accept_language.git Tuesday, April 7, 2009
  125. ./script/plugin install git://github.com/iain/http_accept_language.git app/controllers/application_controller.rb Tuesday, April 7, 2009
  126. ./script/plugin install git://github.com/iain/http_accept_language.git app/controllers/application_controller.rb def set_locale # comment the next line to disable http_accept_language recognition params[:locale] = request.compatible_language_from( I18n.available_locales) unless params[:locale] I18n.locale = params[:locale] if params[:locale] end Tuesday, April 7, 2009
  127. ./script/plugin install git://github.com/iain/http_accept_language.git app/controllers/application_controller.rb def set_locale # comment the next line to disable http_accept_language recognition params[:locale] = request.compatible_language_from( I18n.available_locales) unless params[:locale] I18n.locale = params[:locale] if params[:locale] end Tuesday, April 7, 2009
  128. Tuesday, April 7, 2009
  129. Tuesday, April 7, 2009
  130. Tuesday, April 7, 2009
  131. Tuesday, April 7, 2009
  132. Tuesday, April 7, 2009
  133. Fast Backend Tuesday, April 7, 2009
  134. ./script/plugin install git://github.com/thedarkone/i18n.git Tuesday, April 7, 2009
  135. ./script/plugin install git://github.com/thedarkone/i18n.git I18n.backend = I18n::Backend::Fast.new Tuesday, April 7, 2009
  136. ./script/plugin install git://github.com/thedarkone/i18n.git I18n.backend = I18n::Backend::Fast.new 6 ~ 20x faster at lookups Slightly less memory efficient Slower to reload Faster for production Tuesday, April 7, 2009
  137. Globalize 2 Tuesday, April 7, 2009
  138. ./script/plugin install git://github.com/joshmh/globalize2.git Tuesday, April 7, 2009
  139. ./script/generate migration AddDescriptionFieldForContact Tuesday, April 7, 2009
  140. ./script/generate migration AddDescriptionFieldForContact class AddDescriptionFieldForContact < ActiveRecord::Migration def self.up add_column :contacts, :description, :text Contact.create_translation_table! :description => :text end def self.down remove_column :contacts, :description Contact.drop_translation_table! end end Tuesday, April 7, 2009
  141. app/models/contact.rb class Contact < ActiveRecord::Base translates :description validates_presence_of :name end Tuesday, April 7, 2009
  142. app/models/contact.rb class Contact < ActiveRecord::Base translates :description validates_presence_of :name end Tuesday, April 7, 2009
  143. app/models/contact.rb class Contact < ActiveRecord::Base translates :description validates_presence_of :name end app/views/contacts/views/_form.html.erb ... <p> <%= f.label :description %><br /> <%= f.text_area :description %> </p> <p><%= f.submit t(quot;common.submitquot;) %></p> Tuesday, April 7, 2009
  144. Tuesday, April 7, 2009
  145. Tuesday, April 7, 2009
  146. Tuesday, April 7, 2009
  147. Tuesday, April 7, 2009
  148. Tuesday, April 7, 2009
  149. Tuesday, April 7, 2009
  150. Tuesday, April 7, 2009
  151. Tuesday, April 7, 2009
  152. Tuesday, April 7, 2009
  153. config/initializers/globalize.rb I18n.fallbacks[:en] Tuesday, April 7, 2009
  154. Tuesday, April 7, 2009
  155. Tuesday, April 7, 2009
  156. Tuesday, April 7, 2009
  157. Tuesday, April 7, 2009
  158. Tuesday, April 7, 2009
  159. Globalize2 • Model Translation • Custom Pluralization • Locale Fallbacks • Globalize::LoadPath • Globalize::Translation classes • Missing Translation Log Handler Tuesday, April 7, 2009
  160. More Resources • Gettext • Masao’s Mutoh • http://github.com/mutoh/gettext • Fernando Blat • http://github.com/ferblape/i18n_gettext • http://guides.rails.info/i18n.html • http://rails-i18n.org/ Tuesday, April 7, 2009
  161. git clone git://github.com/akitaonrails/locosxrails_i18n_demo.git Tuesday, April 7, 2009
  162. Muchas Gracias! www.akitaonrails.com fabioakita@gmail.com Tuesday, April 7, 2009

×