SlideShare a Scribd company logo
1 of 46
SHIPPING YOUR PRODUCT OVERSEAS
an i18n treasure guide to avoid monkey jobs.
dbusanello
dbusanello
dbusanello
diogo_0Diogo Busanello
RD Station
> 5000 Clients
World Domination
Culture Code: Lean
Specialized
Team
Back to
Basics
i18n
I18n.t('some.key') #translation
en:
some:
key: Value
Lazy lookup
en:
# (...)
rubyconf:
# (...)
talk:
hello: Hello Rubyconf!
# (...)
<!-- app/views/rubyconf/talk.html.erb -->
<%= t('.hello') %>
Scope
path = 'rubyconf.talk'
I18n.t('blank', scope: path)
Other Language
I18n.t('blank', scope: path, locale: :en)
Variables
<%= t('.sorry', name: 'Dave') %>
en:
rubyconf:
talk:
sorry: I’m sorry %{name}! I’m afraid I can’t do that.
Pluralize
<%= t('.email', count: @account.emails.count) %>
en:
email:
zero: You don’t have email.
one: You have one email.
few: You have some emails.
many: You have %{count} emails.
en:
(...)
description1: You were desconected.
description2: Try Again
description3: in a few moments
<%= t('.description1') %><strong><%= t('.description2') %></strong>
<%= t('.description3') %>
_html
<%= t('.description_html') %>
en:
(...)
description_html: You were desconected. <strong>
Try Again</strong> in a few moments
Link :(
<%= t('.description_html') %>
en:
(...)
description_html: Lorem ipsum dolor sit amet,
consectetur.<a href="/configuration"
target="_blank">Configuration</a>. Lorem ipsum!
description_html: <p>Get more information from your Lead and place
your brand using your own application in %{link}. Or creat...
configuration: Configuration
Link :D
<%= t('.description_html',
link: link_to( t('.configuration'), configuration_path,
{ target: "_blank" })) %>
The Journey
b e g i n s .
The GOOD
#1 DRY
#2 Automate if possible
#3 Identify Patterns (DRY)
Everything is keyed!
Now what?
#1 Translate
i18n-tasks
#2 Specs
i18n-specs
Choosing the language
class ApplicationController < ActionController::Base
before_action :set_locale
def set_locale
I18n.locale = account.language || I18n.default_locale
end
end
What we’ve
missed
The BAD
I18n-tasks
glebm/i18n-tasks
Librarian
Convention
over
Configuration
rails g scaffold landing_pages/page
create app/models/landing_pages/page.rb
create app/controllers/landing_pages/pages_controller.rb
create app/views/landing_pages/pages
create app/views/landing_pages/pages/index.html.erb
create app/views/landing_pages/pages/edit.html.erb
create app/views/landing_pages/pages/show.html.erb
create app/views/landing_pages/pages/new.html.erb
rails g scaffold landing_pages/page
create app/models/landing_pages/page.rb
create app/controllers/landing_pages/pages_controller.rb
create app/views/landing_pages/pages
create app/views/landing_pages/pages/index.html.erb
create app/views/landing_pages/pages/edit.html.erb
create app/views/landing_pages/pages/show.html.erb
create app/views/landing_pages/pages/new.html.erb
create config/locales/landing_pages/pages/index/en.yml
create config/locales/landing_pages/pages/index/pt-BR.yml
create config/locales/landing_pages/pages/edit/en.yml
create config/locales/landing_pages/pages/edit/pt-BR.yml
# config/locales/landing_pages/pages/index/en.yml
en:
landing_pages:
pages:
index:
hello: Hello Rubyconf!
The
UGLY
#1 I18n-js apdex on the roof
#2 Legacy
#3 The Forgotten
TIME TO TIME
TRAVEL
the mysteries of
class ApplicationController < ActionController::Base
around_action :set_time_zone, if: :current_user
def set_time_zone(&block)
Time.use_zone(current_user.timezone, &block)
end
end
Get Current Time
Correct
Time.zone.now
Time.current
Acceptable
Time.now.in_time_zone
DateTime.now.in_time_zone
Wrong
Time.now
DateTime.now
Correct
Time.zone.local(2012, 6, 10, 12, 00)
Wrong
Time.new(2012, 6, 10, 12, 00)
DateTime.new(2012, 6, 10, 12, 00)
Build Time
Correct
Time.zone.at(timestamp)
Acceptable
Time.at(timestamp).in_time_zone
Wrong
Time.at(timestamp)
Time From Timestamp
Correct
Time.zone.parse(str)
Time.zone.strptime(str, "%Y-%m-%d %H:%M")
Acceptable
DateTime.strptime(str, "%Y-%m-%d %H:%M %Z").in_time_zone
Wrong
Time.parse(str)
DateTime.strptime(str, "%Y-%m-%d %H:%M")
Parse Time
Don’t forget to
use
Time.zone
Rails will handle timezone for you.
Database will store the datetime
in UTC.
But how to GROUP BY Date?
def timezone_offset
Time.current.formatted_offset
end
def create_date_with_timezone(column_name = 'created_at')
"DATE(#{column_name}::TIMESTAMPTZ AT TIME ZONE INTERVAL " +
"'#{timezone_offset}'::INTERVAL) as #{column_name}_timezone"
end
SQL Level
WRAPPING UP
Go for scaffold locales
Break build if you forget a key or a
translation
Start thinking your features globally
THANK YOU!
we’re
h i r i n g
shipit.resultadosdigitais.com.br
diogobusanello@gmail.com

More Related Content

Viewers also liked

Viewers also liked (14)

Invited%20 talk%201 matsuura_wisa2011_0821
Invited%20 talk%201 matsuura_wisa2011_0821Invited%20 talk%201 matsuura_wisa2011_0821
Invited%20 talk%201 matsuura_wisa2011_0821
 
inspirational leadership, bruder fic.new (ini)
inspirational leadership, bruder fic.new (ini)inspirational leadership, bruder fic.new (ini)
inspirational leadership, bruder fic.new (ini)
 
Arquitectura
ArquitecturaArquitectura
Arquitectura
 
Tampa bay Hispanic market info
Tampa bay Hispanic market infoTampa bay Hispanic market info
Tampa bay Hispanic market info
 
Lit research at a distance
Lit research at a distanceLit research at a distance
Lit research at a distance
 
Salario
SalarioSalario
Salario
 
Practicaa1
Practicaa1Practicaa1
Practicaa1
 
Ejercicio 2
Ejercicio 2 Ejercicio 2
Ejercicio 2
 
Practica22
Practica22Practica22
Practica22
 
Osm in argentina
Osm in argentinaOsm in argentina
Osm in argentina
 
Actividades de soplo
Actividades de soploActividades de soplo
Actividades de soplo
 
Jejaring dan kemitraan
Jejaring dan kemitraanJejaring dan kemitraan
Jejaring dan kemitraan
 
Non aligned movement (NAM)
Non aligned movement (NAM)Non aligned movement (NAM)
Non aligned movement (NAM)
 
Praxias con dora la exploradora
Praxias con dora la exploradoraPraxias con dora la exploradora
Praxias con dora la exploradora
 

Similar to SHIPPING YOUR PRODUCT OVERSEAS: A GUIDE TO AVOIDING COMMON MISTAKES

Internationalization in Rails 2.2
Internationalization in Rails 2.2Internationalization in Rails 2.2
Internationalization in Rails 2.2Nicolas Jacobeus
 
Internationalization in Rails 2.2
Internationalization in Rails 2.2Internationalization in Rails 2.2
Internationalization in Rails 2.2Belighted
 
I18n
I18nI18n
I18nsoon
 
Ruby i18n - internationalization for ruby
Ruby i18n - internationalization for rubyRuby i18n - internationalization for ruby
Ruby i18n - internationalization for rubyLingoHub
 
The Ruby On Rails I18n Core Api
The Ruby On Rails I18n Core ApiThe Ruby On Rails I18n Core Api
The Ruby On Rails I18n Core ApiNTT DATA Americas
 
Building a Single Page Application using Ember.js ... for fun and profit
Building a Single Page Application using Ember.js ... for fun and profitBuilding a Single Page Application using Ember.js ... for fun and profit
Building a Single Page Application using Ember.js ... for fun and profitBen Limmer
 
symfony : I18n And L10n
symfony : I18n And L10nsymfony : I18n And L10n
symfony : I18n And L10nWildan Maulana
 
Advanced Internationalization with Rails
Advanced Internationalization with RailsAdvanced Internationalization with Rails
Advanced Internationalization with RailsClinton Dreisbach
 
Writing Software not Code with Cucumber
Writing Software not Code with CucumberWriting Software not Code with Cucumber
Writing Software not Code with CucumberBen Mabey
 
Bdd From The Trenches
Bdd From The TrenchesBdd From The Trenches
Bdd From The Trenchesjjggss
 
Building native Android applications with Mirah and Pindah
Building native Android applications with Mirah and PindahBuilding native Android applications with Mirah and Pindah
Building native Android applications with Mirah and PindahNick Plante
 
Pourquoi Ruby on Rails ça déchire ?
Pourquoi Ruby on Rails ça déchire ?Pourquoi Ruby on Rails ça déchire ?
Pourquoi Ruby on Rails ça déchire ?Simon Courtois
 
Building Single Page Application (SPA) with Symfony2 and AngularJS
Building Single Page Application (SPA) with Symfony2 and AngularJSBuilding Single Page Application (SPA) with Symfony2 and AngularJS
Building Single Page Application (SPA) with Symfony2 and AngularJSAntonio Peric-Mazar
 
Páginas Dinâmicas de Erro em Rails com Goalie
Páginas Dinâmicas de Erro em Rails com GoaliePáginas Dinâmicas de Erro em Rails com Goalie
Páginas Dinâmicas de Erro em Rails com GoalieHelder Ribeiro
 
2012 03 27_philly_jug_rewrite_static
2012 03 27_philly_jug_rewrite_static2012 03 27_philly_jug_rewrite_static
2012 03 27_philly_jug_rewrite_staticLincoln III
 
Beijing Perl Workshop 2008 Hiveminder Secret Sauce
Beijing Perl Workshop 2008 Hiveminder Secret SauceBeijing Perl Workshop 2008 Hiveminder Secret Sauce
Beijing Perl Workshop 2008 Hiveminder Secret SauceJesse Vincent
 

Similar to SHIPPING YOUR PRODUCT OVERSEAS: A GUIDE TO AVOIDING COMMON MISTAKES (20)

I18n in Rails2.2
I18n in Rails2.2I18n in Rails2.2
I18n in Rails2.2
 
Internationalization in Rails 2.2
Internationalization in Rails 2.2Internationalization in Rails 2.2
Internationalization in Rails 2.2
 
Internationalization in Rails 2.2
Internationalization in Rails 2.2Internationalization in Rails 2.2
Internationalization in Rails 2.2
 
I18n
I18nI18n
I18n
 
Ruby i18n - internationalization for ruby
Ruby i18n - internationalization for rubyRuby i18n - internationalization for ruby
Ruby i18n - internationalization for ruby
 
The Ruby On Rails I18n Core Api
The Ruby On Rails I18n Core ApiThe Ruby On Rails I18n Core Api
The Ruby On Rails I18n Core Api
 
Building a Single Page Application using Ember.js ... for fun and profit
Building a Single Page Application using Ember.js ... for fun and profitBuilding a Single Page Application using Ember.js ... for fun and profit
Building a Single Page Application using Ember.js ... for fun and profit
 
symfony : I18n And L10n
symfony : I18n And L10nsymfony : I18n And L10n
symfony : I18n And L10n
 
Advanced Internationalization with Rails
Advanced Internationalization with RailsAdvanced Internationalization with Rails
Advanced Internationalization with Rails
 
Writing Software not Code with Cucumber
Writing Software not Code with CucumberWriting Software not Code with Cucumber
Writing Software not Code with Cucumber
 
Translating ruby OSS
Translating ruby OSSTranslating ruby OSS
Translating ruby OSS
 
Bdd From The Trenches
Bdd From The TrenchesBdd From The Trenches
Bdd From The Trenches
 
Building native Android applications with Mirah and Pindah
Building native Android applications with Mirah and PindahBuilding native Android applications with Mirah and Pindah
Building native Android applications with Mirah and Pindah
 
Pourquoi Ruby on Rails ça déchire ?
Pourquoi Ruby on Rails ça déchire ?Pourquoi Ruby on Rails ça déchire ?
Pourquoi Ruby on Rails ça déchire ?
 
Building Single Page Application (SPA) with Symfony2 and AngularJS
Building Single Page Application (SPA) with Symfony2 and AngularJSBuilding Single Page Application (SPA) with Symfony2 and AngularJS
Building Single Page Application (SPA) with Symfony2 and AngularJS
 
Páginas Dinâmicas de Erro em Rails com Goalie
Páginas Dinâmicas de Erro em Rails com GoaliePáginas Dinâmicas de Erro em Rails com Goalie
Páginas Dinâmicas de Erro em Rails com Goalie
 
Sorbet at Grailed
Sorbet at GrailedSorbet at Grailed
Sorbet at Grailed
 
2012 03 27_philly_jug_rewrite_static
2012 03 27_philly_jug_rewrite_static2012 03 27_philly_jug_rewrite_static
2012 03 27_philly_jug_rewrite_static
 
Pc54
Pc54Pc54
Pc54
 
Beijing Perl Workshop 2008 Hiveminder Secret Sauce
Beijing Perl Workshop 2008 Hiveminder Secret SauceBeijing Perl Workshop 2008 Hiveminder Secret Sauce
Beijing Perl Workshop 2008 Hiveminder Secret Sauce
 

Recently uploaded

DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfRankYa
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clashcharlottematthew16
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024Stephanie Beckett
 

Recently uploaded (20)

DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Search Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdfSearch Engine Optimization SEO PDF for 2024.pdf
Search Engine Optimization SEO PDF for 2024.pdf
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
Powerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time ClashPowerpoint exploring the locations used in television show Time Clash
Powerpoint exploring the locations used in television show Time Clash
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024What's New in Teams Calling, Meetings and Devices March 2024
What's New in Teams Calling, Meetings and Devices March 2024
 

SHIPPING YOUR PRODUCT OVERSEAS: A GUIDE TO AVOIDING COMMON MISTAKES

Editor's Notes

  1. I18n.default_locale = :en
  2. _html além de link para estilos.
  3. _html além de link para estilos.
  4. _html além de link para estilos.