SlideShare a Scribd company logo
1 of 18
March 22nd 2016
by @frederikvollert
Internationalization
"i18n"
Internationalization
"i#{'nternationalizatio'.length}n"
i18n: Preparing code for international audience
"Hello!" can become "¡Hola!"
Uber becomes Über, or �ber
ASCII or UTF-8 ?
.de or /de, Accept-Header
03/22/16 2pm PST
or 14:00h 22.03.2016 CET
Anybody got an IBAN or EC-Card?
Copy & Templates
Encoding
Routing & Language detection
Date & Time
Currency & Payment
Tips and Tricks
Prepare early! Use keys in templates from the start;
Use constants and symbols instead of string values for
e.g. <select> options
UI: Allow 20% stretching space for captions (Even more on buttons)
Every time should be stored as UTC
Money should be stored as integer amounts in smallest unit of currency
(No float) with currency name
Make sure you use UTF-8 as encoding
Localization
"l10n"
l10n: Adapting software to a specific locale
Translation of locale file (string file)
Support for local currency
Are your graphics, references and
name culturally adequate?
Is your service legal in China? Tax?
pt-BR:
welcome: "Oi!"
Does your PSP handle ¥ or € ?
Wix.com, Mitsubishi Pajero
"Salud" != "Oi"
br != pt-BR
Language code-Country code
Locale codes are well-defined
(ISO 3166, ISO 639, RFC 5646)
en-GB, en-US, de-DE, pt-BR, pt-PT
Rails i18n support
I18n.t(:welcome, default: "Hello!", scope: [:home, :index])
Partial in path "app/views/home/index"
<h1>t(".welcome")</h1>
<h1>t("home.index.welcome")</h1>
I18n.l(@user.created_at, format: :long)
Localized time and date notations
Pro-Tip: I18n.with_locale(temporary_locale) do … end
Placeholders
Pluralization
html-suffix
Rails i18n features
greeting: "Hello, %{name}!"
t(:greeting, name: "Frederik")
item:
one: "%{count} item"
other: "%{count} items"
t(:item, count: @items.length)
body_html: "<b>Statement!</b>"
Language detection
request.env["HTTP_ACCEPT_LANGUAGE"]
I18n.default_locale = :en
Routing param
(Store in cookie)
config/routes.rb:
scope "/(:language)", language: /(en|de|fr)/ do
get "features" => "home#features"
end
Joining translated chunks is a bad idea (as are elaborate placeholders and
YAML’s :<< )
SEO
Top-level domain brand.de > brand.com/de or de.brand.com
However, Page authority vs. Domain authority, Google vs. Facebook
Gettext as rails-i18n alternative:
https://github.com/grosser/gettext_i18n_rails
Excel spreadsheet-driven processes will not work forever
Additional things to consider
Useful links & gems
Rails i18n guide
https://github.com/enriclluelles/route_translator
I18n routes: /en/cars becomes /de/autos
https://github.com/phrase/slimkeyfy
Extract string file from .slim templates easily (Contributions welcome!)
https://github.com/phrase/phraseapp-in-context-editor-ruby
In-context editor for Rails applications
<5 minutes
via API
<12 hours
with 1-click
export
PhraseApp Translation Platform
Translate and
edit copy
inside your
Rails app.
PhraseApp Rails In-Context Editor
FAMILO achieved
400% global user growth;
surpassed 1 million users.
"PhraseApp helped us
streamline our
localization and become
an industry leader."
Hauke
Windmueller
CEO, FAMILO
Thank you!
Frederik Vollert
@frederikvollert
+1 (650) 898-9785
frederik@phraseapp.com
PhraseApp
720 University Ave
Palo Alto

More Related Content

Similar to Ruby on Rails Internationalization Best Practices, i18n SFRAILS

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 multilingual & multi-country e-commerce site with Drupal 7 @ NYC C...
Building a multilingual & multi-country e-commerce site with Drupal 7 @ NYC C...Building a multilingual & multi-country e-commerce site with Drupal 7 @ NYC C...
Building a multilingual & multi-country e-commerce site with Drupal 7 @ NYC C...valcker
 
I18n
I18nI18n
I18nsoon
 
C5 c++ development environment
C5 c++ development environmentC5 c++ development environment
C5 c++ development environmentsnchnchl
 
Localization: How to do a global project
Localization: How to do a global projectLocalization: How to do a global project
Localization: How to do a global projectAlconost
 
IITK ESC 111M Lec02.pptx .
IITK ESC 111M Lec02.pptx               .IITK ESC 111M Lec02.pptx               .
IITK ESC 111M Lec02.pptx .AbhimanyuChaure
 
Sasaki webtechcon2010
Sasaki webtechcon2010Sasaki webtechcon2010
Sasaki webtechcon2010Felix Sasaki
 
WordPress Multilingual: Benefits and Considerations
WordPress Multilingual: Benefits and ConsiderationsWordPress Multilingual: Benefits and Considerations
WordPress Multilingual: Benefits and ConsiderationsDat Hoang
 
[Test bash NL] Contract testing in practice with Pact
[Test bash NL] Contract testing in practice with Pact[Test bash NL] Contract testing in practice with Pact
[Test bash NL] Contract testing in practice with PactPierre Vincent
 
Writing multi-language documentation using Sphinx
Writing multi-language documentation using SphinxWriting multi-language documentation using Sphinx
Writing multi-language documentation using SphinxMarkus Zapke-Gründemann
 
Compiler design Introduction
Compiler design IntroductionCompiler design Introduction
Compiler design IntroductionAman Sharma
 
JavaScript on HP webOS: Enyo and Node.js
JavaScript on HP webOS: Enyo and Node.jsJavaScript on HP webOS: Enyo and Node.js
JavaScript on HP webOS: Enyo and Node.jsBen Combee
 
Introduction to the Roku SDK
Introduction to the Roku SDKIntroduction to the Roku SDK
Introduction to the Roku SDKChris Adamson
 
Internationalization in Rails 2.2
Internationalization in Rails 2.2Internationalization in Rails 2.2
Internationalization in Rails 2.2Nicolas Jacobeus
 

Similar to Ruby on Rails Internationalization Best Practices, i18n SFRAILS (20)

PHP for Grown-ups
PHP for Grown-upsPHP for Grown-ups
PHP for Grown-ups
 
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 multilingual & multi-country e-commerce site with Drupal 7 @ NYC C...
Building a multilingual & multi-country e-commerce site with Drupal 7 @ NYC C...Building a multilingual & multi-country e-commerce site with Drupal 7 @ NYC C...
Building a multilingual & multi-country e-commerce site with Drupal 7 @ NYC C...
 
I18n
I18nI18n
I18n
 
C5 c++ development environment
C5 c++ development environmentC5 c++ development environment
C5 c++ development environment
 
Localization: How to do a global project
Localization: How to do a global projectLocalization: How to do a global project
Localization: How to do a global project
 
IITK ESC 111M Lec02.pptx .
IITK ESC 111M Lec02.pptx               .IITK ESC 111M Lec02.pptx               .
IITK ESC 111M Lec02.pptx .
 
Sasaki webtechcon2010
Sasaki webtechcon2010Sasaki webtechcon2010
Sasaki webtechcon2010
 
WordPress Multilingual: Benefits and Considerations
WordPress Multilingual: Benefits and ConsiderationsWordPress Multilingual: Benefits and Considerations
WordPress Multilingual: Benefits and Considerations
 
I18n in Rails2.2
I18n in Rails2.2I18n in Rails2.2
I18n in Rails2.2
 
Phpwebdevelping
PhpwebdevelpingPhpwebdevelping
Phpwebdevelping
 
[Test bash NL] Contract testing in practice with Pact
[Test bash NL] Contract testing in practice with Pact[Test bash NL] Contract testing in practice with Pact
[Test bash NL] Contract testing in practice with Pact
 
Writing multi-language documentation using Sphinx
Writing multi-language documentation using SphinxWriting multi-language documentation using Sphinx
Writing multi-language documentation using Sphinx
 
Compiler design Introduction
Compiler design IntroductionCompiler design Introduction
Compiler design Introduction
 
Sencha touch
Sencha touchSencha touch
Sencha touch
 
JavaScript on HP webOS: Enyo and Node.js
JavaScript on HP webOS: Enyo and Node.jsJavaScript on HP webOS: Enyo and Node.js
JavaScript on HP webOS: Enyo and Node.js
 
Introduction to the Roku SDK
Introduction to the Roku SDKIntroduction to the Roku SDK
Introduction to the Roku SDK
 
WEB DEVELOPMENT
WEB DEVELOPMENTWEB DEVELOPMENT
WEB DEVELOPMENT
 
Internationalization in Rails 2.2
Internationalization in Rails 2.2Internationalization in Rails 2.2
Internationalization in Rails 2.2
 
Unicode 101
Unicode 101Unicode 101
Unicode 101
 

Recently uploaded

SHRMPro HRMS Software Solutions Presentation
SHRMPro HRMS Software Solutions PresentationSHRMPro HRMS Software Solutions Presentation
SHRMPro HRMS Software Solutions PresentationShrmpro
 
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...SelfMade bd
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrandmasabamasaba
 
Generic or specific? Making sensible software design decisions
Generic or specific? Making sensible software design decisionsGeneric or specific? Making sensible software design decisions
Generic or specific? Making sensible software design decisionsBert Jan Schrijver
 
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfVishalKumarJha10
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension AidPhilip Schwarz
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdfPearlKirahMaeRagusta1
 
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionIntroducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionOnePlan Solutions
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️Delhi Call girls
 
Exploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfExploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfproinshot.com
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...masabamasaba
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareJim McKeeth
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...masabamasaba
 
%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...masabamasaba
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsJhone kinadey
 
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyviewmasabamasaba
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Steffen Staab
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...masabamasaba
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfkalichargn70th171
 

Recently uploaded (20)

SHRMPro HRMS Software Solutions Presentation
SHRMPro HRMS Software Solutions PresentationSHRMPro HRMS Software Solutions Presentation
SHRMPro HRMS Software Solutions Presentation
 
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
Crypto Cloud Review - How To Earn Up To $500 Per DAY Of Bitcoin 100% On AutoP...
 
%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand%in Midrand+277-882-255-28 abortion pills for sale in midrand
%in Midrand+277-882-255-28 abortion pills for sale in midrand
 
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICECHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
CHEAP Call Girls in Pushp Vihar (-DELHI )🔝 9953056974🔝(=)/CALL GIRLS SERVICE
 
Generic or specific? Making sensible software design decisions
Generic or specific? Making sensible software design decisionsGeneric or specific? Making sensible software design decisions
Generic or specific? Making sensible software design decisions
 
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdfintroduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
introduction-to-automotive Andoid os-csimmonds-ndctechtown-2021.pdf
 
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
Direct Style Effect Systems -The Print[A] Example- A Comprehension AidDirect Style Effect Systems -The Print[A] Example- A Comprehension Aid
Direct Style Effect Systems - The Print[A] Example - A Comprehension Aid
 
Define the academic and professional writing..pdf
Define the academic and professional writing..pdfDefine the academic and professional writing..pdf
Define the academic and professional writing..pdf
 
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) SolutionIntroducing Microsoft’s new Enterprise Work Management (EWM) Solution
Introducing Microsoft’s new Enterprise Work Management (EWM) Solution
 
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
call girls in Vaishali (Ghaziabad) 🔝 >༒8448380779 🔝 genuine Escort Service 🔝✔️✔️
 
Exploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdfExploring the Best Video Editing App.pdf
Exploring the Best Video Editing App.pdf
 
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
%+27788225528 love spells in Atlanta Psychic Readings, Attraction spells,Brin...
 
Announcing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK SoftwareAnnouncing Codolex 2.0 from GDK Software
Announcing Codolex 2.0 from GDK Software
 
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
%+27788225528 love spells in new york Psychic Readings, Attraction spells,Bri...
 
%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...
%+27788225528 love spells in Vancouver Psychic Readings, Attraction spells,Br...
 
Right Money Management App For Your Financial Goals
Right Money Management App For Your Financial GoalsRight Money Management App For Your Financial Goals
Right Money Management App For Your Financial Goals
 
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
%in Hazyview+277-882-255-28 abortion pills for sale in Hazyview
 
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
Shapes for Sharing between Graph Data Spaces - and Epistemic Querying of RDF-...
 
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
%+27788225528 love spells in Colorado Springs Psychic Readings, Attraction sp...
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
 

Ruby on Rails Internationalization Best Practices, i18n SFRAILS

  • 1. March 22nd 2016 by @frederikvollert
  • 4. i18n: Preparing code for international audience "Hello!" can become "¡Hola!" Uber becomes Über, or �ber ASCII or UTF-8 ? .de or /de, Accept-Header 03/22/16 2pm PST or 14:00h 22.03.2016 CET Anybody got an IBAN or EC-Card? Copy & Templates Encoding Routing & Language detection Date & Time Currency & Payment
  • 5. Tips and Tricks Prepare early! Use keys in templates from the start; Use constants and symbols instead of string values for e.g. <select> options UI: Allow 20% stretching space for captions (Even more on buttons) Every time should be stored as UTC Money should be stored as integer amounts in smallest unit of currency (No float) with currency name Make sure you use UTF-8 as encoding
  • 7. l10n: Adapting software to a specific locale Translation of locale file (string file) Support for local currency Are your graphics, references and name culturally adequate? Is your service legal in China? Tax? pt-BR: welcome: "Oi!" Does your PSP handle ¥ or € ? Wix.com, Mitsubishi Pajero
  • 8. "Salud" != "Oi" br != pt-BR Language code-Country code Locale codes are well-defined (ISO 3166, ISO 639, RFC 5646) en-GB, en-US, de-DE, pt-BR, pt-PT
  • 9. Rails i18n support I18n.t(:welcome, default: "Hello!", scope: [:home, :index]) Partial in path "app/views/home/index" <h1>t(".welcome")</h1> <h1>t("home.index.welcome")</h1> I18n.l(@user.created_at, format: :long) Localized time and date notations Pro-Tip: I18n.with_locale(temporary_locale) do … end
  • 10. Placeholders Pluralization html-suffix Rails i18n features greeting: "Hello, %{name}!" t(:greeting, name: "Frederik") item: one: "%{count} item" other: "%{count} items" t(:item, count: @items.length) body_html: "<b>Statement!</b>"
  • 11. Language detection request.env["HTTP_ACCEPT_LANGUAGE"] I18n.default_locale = :en Routing param (Store in cookie) config/routes.rb: scope "/(:language)", language: /(en|de|fr)/ do get "features" => "home#features" end
  • 12. Joining translated chunks is a bad idea (as are elaborate placeholders and YAML’s :<< ) SEO Top-level domain brand.de > brand.com/de or de.brand.com However, Page authority vs. Domain authority, Google vs. Facebook Gettext as rails-i18n alternative: https://github.com/grosser/gettext_i18n_rails Excel spreadsheet-driven processes will not work forever Additional things to consider
  • 13. Useful links & gems Rails i18n guide https://github.com/enriclluelles/route_translator I18n routes: /en/cars becomes /de/autos https://github.com/phrase/slimkeyfy Extract string file from .slim templates easily (Contributions welcome!) https://github.com/phrase/phraseapp-in-context-editor-ruby In-context editor for Rails applications
  • 14.
  • 15. <5 minutes via API <12 hours with 1-click export PhraseApp Translation Platform
  • 16. Translate and edit copy inside your Rails app. PhraseApp Rails In-Context Editor
  • 17. FAMILO achieved 400% global user growth; surpassed 1 million users. "PhraseApp helped us streamline our localization and become an industry leader." Hauke Windmueller CEO, FAMILO
  • 18. Thank you! Frederik Vollert @frederikvollert +1 (650) 898-9785 frederik@phraseapp.com PhraseApp 720 University Ave Palo Alto

Editor's Notes

  1. PhraseApp integrates into the developer’s toolchain and can extract source copy changes automatically from the source code management systems like GitHub. Content is immediately available for translation in PhraseApp’s online editor. It even allows in-context editing of the copy. Our customers either use in-house translators or our directly integrated providers, who will be able to translate 80% of orders within 12 hours.