SlideShare a Scribd company logo
translationexchange.com
Powered by Translation Exchange
Translation Markup Language
for Ruby on Rails
Michael Berkovich
michael@translationexchange.com
@translationx
translationexchange.com
Localization is cumbersome
translationexchange.com
There are many
standards, but little
guidance.
“
Every i18n framework has its own “right way”
of doing things, with a different syntax and file
format.
Developers often hack together their own
solutions to try and simplify the process.
No universality
in the current
standards
Android .xml
Apple .strings
Apple .plist
Gettext .po
Gettext .pot
Java .properties
Java .xml
Microsoft .resx
Microsoft .resw
Microsoft .resjson
Microsoft .aspx
FILE FORMATS
Lots of translation
Microsoft .rc
PHP .ini
PHP .conf
Babel Flash .xml
Blackberry .rrc
NSIS .insh
QT Linguist .ts
Latex .latex
Docbook .dbk
TBX .tbx
TMX .tmx
XLIFF .xliff
YouTube .sbv
Rails YAML .yaml
Subtitles .srt
MicroDVD .sub
Subviewer .sub
Mozilla Web L10N
Text .txt
CSV Spreadsheet
Excel Spreadsheet
Word Document
Extract content into
files
Upload files to a TMS
or an LSP
Wait... Download translated
files
Put translations back
in your app
Repeat when new content is added or changed
BOTTLENECK
File management is a
File Management
● Not DRY (Don’t Repeat Yourself)
● Requires content extraction, sync with a TMS or an LSP
● Mini “waterfalls” in the agile process
● Slows down development cycle and releases
● High upfront cost and maintenance
How can we make it
BETTER FOR
EVERYONE
What would an ideal solution
look like?
● Consistency
Provide tools that offer a clear and
consistent way for internationalizing
content across all frameworks
● Adaptability
Tools must be extensible and adaptable
and should be able to solve any arising
internationalization and localization
problem
● Contextualization
Allow translators to translate in context
from within the application
● Agility
Keep the development cycle agile -
localization must not add significant
overhead for developers - it must be done
in parallel to the development process
あ
A
Translation Management
Service
Global CDN
Local Cache
Application
with SDK
A Better Way
A truly automated and continuous localization
Translation Caching
static and dynamic cache adapters for
storing translations in your application
Inline Translation Tools
Translation can be done in context of the
application
Access Professional Translators
Connect your application to thousands of
professional translators around the world
Open Source
all SDKs are available on github
Multiple Platforms
support for Rails, Node, PHP, Python, iOS,
Android and more
Universal Translation Memory
Translations are shared across all
applications
translationexchange.com
Core Benefits
Getting Started
translationexchange.com
gem 'tml-rails'
Integration
# Gemfile
translationexchange.com
Configuration
# initializers/tml.rb
Tml.configure do |config|
config.application = {
key: “YOUR_APPLICATION_KEY”
}
end
translationexchange.com
# layouts/application.html.erb
<%= tml_scripts_tag %>
<%= tml_language_selector_tag(:flags) %>
Translation Markup Language
Developer friendly syntax for marking up application content.
Supports language context rules and language cases, making translations
significantly more accurate for any language.
translationexchange.com
Hello World
<%= tr('Hello World') %>
translationexchange.com
Translation Markup Language
tr('Eats shoots and leaves', 'a panda')
Eats shoots and leaves
tr('Eats shoots and leaves', 'a violent restaurant patron')
Translation Markup Language
Description & Context
Hello Michael
translationexchange.com
Translation Markup Language
Data Tokens & Interpolation
<%= tr('Hello {name}', {name:'Michael'}) %>
Hello Michael
<%= tr('Hello [bold: {user}]', {
user: current_user
}) %>
translationexchange.com
Translation Markup Language
Decoration Tokens
Hello Michael
<%= tr('Hello <strong>{user}</strong>', {
user: current_user
}) %>
translationexchange.com
Translation Markup Language
Decoration Tokens
Hello Michael
<%= tr('Hello [bold: {user}]', {
user: current_user,
bold: '<strong>{$0}</strong>'
}) %>
translationexchange.com
Translation Markup Language
Decoration Tokens
You have 5 messages
<%= tr(You have {count || message}', {
count: 5
}) %>
translationexchange.com
Translation Markup Language
Pluralization
Michael uploaded 3 photos
<%= tr('{user} uploaded {count || photo}', {
user: current_user,
count: 3
}) %>
translationexchange.com
Translation Markup Language
Pluralization
Michael liked Anna’s post
<%= tr('{actor} liked {target::pos} post', {
actor: current_user,
target: other_user
}) %>
translationexchange.com
Translation Markup Language
Language Cases
This is your second warning
<%= tr(This is your {count::ord} warning', {
count: 2
}) %>
translationexchange.com
Translation Markup Language
Language Cases
Michael completed 3 miles on his last run.
<%= tr('[link: {user}] completed [bold: {count || mile}]
on {user | his, her} last run.', {
user: current_user,
link: { href: user_path },
count: 3
}) %>
translationexchange.com
Translation Markup Language
Demo
❏ Use TML SDK to localize an online recipes application
❏ Demonstrate crowdsourced localization tools
❏ Deploy translation release and update application realtime
❏ Download release snapshot and run Foody independently from the
service
translationexchange.com
How is Translation Done?
translationexchange.com
Machine Translation
provided by Google,
Microsoft and Yandex.
Translations are ranked to
get the best result.
Crowdsourced Translation
Some developers may
choose to use their own
users to translate their
content, similar to how
Facebook and Twitter
translated their sites.
Professional Translation
Order are received and
processed by our partners
and are made available in our
system within hours.
Caching Options
translationexchange.com
Static Cache
File based cache. Loaded into the process
memory and must be deployed with the
source code. Each process contains the
entire translation cache.
$ bundle exec rake tml:cache:generate
Dynamic Cache
Redis, Memcached (and others) updated
from CDN release. Cache is shared
across all processes. Can be deployed
without restarting servers.
$ bundle exec rake tml:cache:upgrade
SDKs https://github.com/translationexchange
Documentation http://translationexchange.com/docs
Blog http://blog.translationexchange.com
Foody Source https://github.com/translationexchange/tml-rails-samples-foody
Foody Live http://foody.translationexchange.com
Facebook https://www.facebook.com/translationexchange
Twitter @translationx
Feedback feedback@translationexchange.com
translationexchange.com
Resources
Thank You
Find out more at translationexchange.com
translationexchange.com

More Related Content

What's hot (20)

PPTX
C compilation process
RajKumar Rampelli
 
PDF
Livecode widget course
crazyaxe
 
ODP
IDE as a Front-end and Fast time-to-market language support in Eclipse IDE re...
Mickael Istria
 
PDF
Ballerina: A Cloud Native Programming Language
WSO2
 
PPTX
Transpilers(Source-to-Source Compilers)
Shivang Bajaniya
 
PPTX
Overview of microsoft dot net platforms
Abhijit B.
 
PDF
201801 CSE240 Lecture 04
Javier Gonzalez-Sanchez
 
PDF
Enforcing API Design Rules for High Quality Code Generation
Tim Burks
 
PDF
蔡学镛 Rebol漫谈
d0nn9n
 
PDF
Build your next REST API with gRPC
Tim Burks
 
PDF
Onivim: Modal Editing from the Future
Bryan Phelps
 
PPT
Programming paradigm and web programming
Mohammad Kamrul Hasan
 
PDF
Flink Forward Berlin 2018: Robert Bradshaw & Maximilian Michels - "Universal ...
Flink Forward
 
PDF
Challenges in Debugging Bootstraps of Reflective Kernels
ESUG
 
PPT
CGI Introduction
Chaffey College
 
PDF
Object oriented-programming-in-c-sharp
Abefo
 
PDF
Implementing OpenAPI and GraphQL services with gRPC
Tim Burks
 
PPTX
Onivim 2: Re-architecting for Performance
Bryan Phelps
 
KEY
Language Engineering in the Cloud
lennartkats
 
PPT
CGI Presentation
Sopan Shewale
 
C compilation process
RajKumar Rampelli
 
Livecode widget course
crazyaxe
 
IDE as a Front-end and Fast time-to-market language support in Eclipse IDE re...
Mickael Istria
 
Ballerina: A Cloud Native Programming Language
WSO2
 
Transpilers(Source-to-Source Compilers)
Shivang Bajaniya
 
Overview of microsoft dot net platforms
Abhijit B.
 
201801 CSE240 Lecture 04
Javier Gonzalez-Sanchez
 
Enforcing API Design Rules for High Quality Code Generation
Tim Burks
 
蔡学镛 Rebol漫谈
d0nn9n
 
Build your next REST API with gRPC
Tim Burks
 
Onivim: Modal Editing from the Future
Bryan Phelps
 
Programming paradigm and web programming
Mohammad Kamrul Hasan
 
Flink Forward Berlin 2018: Robert Bradshaw & Maximilian Michels - "Universal ...
Flink Forward
 
Challenges in Debugging Bootstraps of Reflective Kernels
ESUG
 
CGI Introduction
Chaffey College
 
Object oriented-programming-in-c-sharp
Abefo
 
Implementing OpenAPI and GraphQL services with gRPC
Tim Burks
 
Onivim 2: Re-architecting for Performance
Bryan Phelps
 
Language Engineering in the Cloud
lennartkats
 
CGI Presentation
Sopan Shewale
 

Viewers also liked (20)

PDF
Laura Dent: Single-Source and Localization
Jack Molisani
 
PPTX
TAUS 2.0 and the Game Changers in Localization (Jaap van der Meer, director o...
TAUS - The Language Data Network
 
PDF
Jim Tivy: The Localization Lifecycle
Jack Molisani
 
PPTX
WiL Agile Localization event
Patricia Gómez Jurado
 
PDF
Quality and Localization Effectiveness
TAUS - The Language Data Network
 
DOCX
Yogesh Updated_C.V
Yogesh Chaturvedi
 
PPTX
How cloud are you?
TAUS - The Language Data Network
 
PDF
Move Our DITA Content to Another CCMS? Seriously? - IXIASOFT User Conference ...
IXIASOFT
 
PDF
Parkour: Lessons in Agility - July 2016
patricia_gale
 
PPTX
Language Service and Technology Providers role in an Agile i18n and L10n proc...
TAUS - The Language Data Network
 
PDF
Single-Sourcing and Localization stc16
Laura Dent
 
PDF
2016 content trends
Scriptorium Publishing
 
PPTX
Quality estimation: the Holy Grail in the MT scene (Gábor Bessenyei, CEO of M...
TAUS - The Language Data Network
 
PDF
Game Localization, Indie devs edition by Silvia Fornós
Silvia Fornós
 
PPTX
Localization and DITA: What you Need to Know - LocWorld32
IXIASOFT
 
PDF
LavaCon keynote: But Father, I'm Goldleafing as Fast as I Can!
Scriptorium Publishing
 
PDF
How to write effective requirements in an Agile environment by Matteo Taddei
Bosnia Agile
 
POTX
Agile Linguistic QA, by Vince He, HP Enterprise
TAUS - The Language Data Network
 
PPTX
Enterprise Localization Trends Webinar
Memsource
 
PDF
Continuous Globalization Workflow Webinar Slides
Adam Asnes
 
Laura Dent: Single-Source and Localization
Jack Molisani
 
TAUS 2.0 and the Game Changers in Localization (Jaap van der Meer, director o...
TAUS - The Language Data Network
 
Jim Tivy: The Localization Lifecycle
Jack Molisani
 
WiL Agile Localization event
Patricia Gómez Jurado
 
Quality and Localization Effectiveness
TAUS - The Language Data Network
 
Yogesh Updated_C.V
Yogesh Chaturvedi
 
Move Our DITA Content to Another CCMS? Seriously? - IXIASOFT User Conference ...
IXIASOFT
 
Parkour: Lessons in Agility - July 2016
patricia_gale
 
Language Service and Technology Providers role in an Agile i18n and L10n proc...
TAUS - The Language Data Network
 
Single-Sourcing and Localization stc16
Laura Dent
 
2016 content trends
Scriptorium Publishing
 
Quality estimation: the Holy Grail in the MT scene (Gábor Bessenyei, CEO of M...
TAUS - The Language Data Network
 
Game Localization, Indie devs edition by Silvia Fornós
Silvia Fornós
 
Localization and DITA: What you Need to Know - LocWorld32
IXIASOFT
 
LavaCon keynote: But Father, I'm Goldleafing as Fast as I Can!
Scriptorium Publishing
 
How to write effective requirements in an Agile environment by Matteo Taddei
Bosnia Agile
 
Agile Linguistic QA, by Vince He, HP Enterprise
TAUS - The Language Data Network
 
Enterprise Localization Trends Webinar
Memsource
 
Continuous Globalization Workflow Webinar Slides
Adam Asnes
 
Ad

Similar to Tml for Ruby on Rails (20)

PDF
Tml for Laravel
Michael Berkovich
 
PDF
Translation Markup Language and Universal Translation Memory
Michael Berkovich
 
PDF
Tml for Objective C
Michael Berkovich
 
PDF
99translations For Developers
99translations
 
PDF
Tr8n for php - Michael Berkovich
Caroline_Rose
 
PDF
99translations For Developers
rogovskiy
 
PDF
AIM | HDC 2016 Globalization As a Service
Ramzi Yassine
 
PDF
Telelingua Corporate Brochure - EN
Christophe Gevaert
 
PDF
Telelingua Corporate Brochure 2016 - EN LRs
Sven Lekeu
 
PPTX
Localization: How to do a global project
Alconost
 
PDF
Improving App Translations
João Orui
 
PDF
App Localization Tools Guide
Appindex
 
PPTX
5 Steps to Open Your Website to a Global Audience
Acquia
 
PDF
Managing Translation Workflows in Drupal 7
Suzanne Dergacheva
 
PPT
Language Exchange Client Presentation
Shamusd
 
PPT
Language Exchange Client Presentation
Shamusd
 
PPTX
Opening the Black Box of Software Localization
Kenneth Farrall
 
PDF
Translation Management
Amazee Labs
 
PPTX
TranslateKarate - Pitchdeck
translatekarate
 
PPTX
Easyling at atc London
Skawa Innovation
 
Tml for Laravel
Michael Berkovich
 
Translation Markup Language and Universal Translation Memory
Michael Berkovich
 
Tml for Objective C
Michael Berkovich
 
99translations For Developers
99translations
 
Tr8n for php - Michael Berkovich
Caroline_Rose
 
99translations For Developers
rogovskiy
 
AIM | HDC 2016 Globalization As a Service
Ramzi Yassine
 
Telelingua Corporate Brochure - EN
Christophe Gevaert
 
Telelingua Corporate Brochure 2016 - EN LRs
Sven Lekeu
 
Localization: How to do a global project
Alconost
 
Improving App Translations
João Orui
 
App Localization Tools Guide
Appindex
 
5 Steps to Open Your Website to a Global Audience
Acquia
 
Managing Translation Workflows in Drupal 7
Suzanne Dergacheva
 
Language Exchange Client Presentation
Shamusd
 
Language Exchange Client Presentation
Shamusd
 
Opening the Black Box of Software Localization
Kenneth Farrall
 
Translation Management
Amazee Labs
 
TranslateKarate - Pitchdeck
translatekarate
 
Easyling at atc London
Skawa Innovation
 
Ad

Recently uploaded (20)

PDF
Advancing WebDriver BiDi support in WebKit
Igalia
 
PDF
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
PDF
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
PDF
Reverse Engineering of Security Products: Developing an Advanced Microsoft De...
nwbxhhcyjv
 
PDF
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
PDF
POV_ Why Enterprises Need to Find Value in ZERO.pdf
darshakparmar
 
DOCX
Cryptography Quiz: test your knowledge of this important security concept.
Rajni Bhardwaj Grover
 
PDF
July Patch Tuesday
Ivanti
 
PPTX
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
PPTX
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
PDF
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
PDF
Staying Human in a Machine- Accelerated World
Catalin Jora
 
PDF
"AI Transformation: Directions and Challenges", Pavlo Shaternik
Fwdays
 
PPTX
Future Tech Innovations 2025 – A TechLists Insight
TechLists
 
PDF
Empower Inclusion Through Accessible Java Applications
Ana-Maria Mihalceanu
 
PPTX
WooCommerce Workshop: Bring Your Laptop
Laura Hartwig
 
DOCX
Python coding for beginners !! Start now!#
Rajni Bhardwaj Grover
 
PDF
LOOPS in C Programming Language - Technology
RishabhDwivedi43
 
PDF
How Startups Are Growing Faster with App Developers in Australia.pdf
India App Developer
 
PDF
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 
Advancing WebDriver BiDi support in WebKit
Igalia
 
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
Reverse Engineering of Security Products: Developing an Advanced Microsoft De...
nwbxhhcyjv
 
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
POV_ Why Enterprises Need to Find Value in ZERO.pdf
darshakparmar
 
Cryptography Quiz: test your knowledge of this important security concept.
Rajni Bhardwaj Grover
 
July Patch Tuesday
Ivanti
 
AUTOMATION AND ROBOTICS IN PHARMA INDUSTRY.pptx
sameeraaabegumm
 
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
Staying Human in a Machine- Accelerated World
Catalin Jora
 
"AI Transformation: Directions and Challenges", Pavlo Shaternik
Fwdays
 
Future Tech Innovations 2025 – A TechLists Insight
TechLists
 
Empower Inclusion Through Accessible Java Applications
Ana-Maria Mihalceanu
 
WooCommerce Workshop: Bring Your Laptop
Laura Hartwig
 
Python coding for beginners !! Start now!#
Rajni Bhardwaj Grover
 
LOOPS in C Programming Language - Technology
RishabhDwivedi43
 
How Startups Are Growing Faster with App Developers in Australia.pdf
India App Developer
 
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 

Tml for Ruby on Rails

  • 1. translationexchange.com Powered by Translation Exchange Translation Markup Language for Ruby on Rails
  • 4. There are many standards, but little guidance. “
  • 5. Every i18n framework has its own “right way” of doing things, with a different syntax and file format. Developers often hack together their own solutions to try and simplify the process. No universality in the current standards
  • 6. Android .xml Apple .strings Apple .plist Gettext .po Gettext .pot Java .properties Java .xml Microsoft .resx Microsoft .resw Microsoft .resjson Microsoft .aspx FILE FORMATS Lots of translation Microsoft .rc PHP .ini PHP .conf Babel Flash .xml Blackberry .rrc NSIS .insh QT Linguist .ts Latex .latex Docbook .dbk TBX .tbx TMX .tmx XLIFF .xliff YouTube .sbv Rails YAML .yaml Subtitles .srt MicroDVD .sub Subviewer .sub Mozilla Web L10N Text .txt CSV Spreadsheet Excel Spreadsheet Word Document
  • 7. Extract content into files Upload files to a TMS or an LSP Wait... Download translated files Put translations back in your app Repeat when new content is added or changed BOTTLENECK File management is a
  • 8. File Management ● Not DRY (Don’t Repeat Yourself) ● Requires content extraction, sync with a TMS or an LSP ● Mini “waterfalls” in the agile process ● Slows down development cycle and releases ● High upfront cost and maintenance
  • 9. How can we make it BETTER FOR EVERYONE
  • 10. What would an ideal solution look like? ● Consistency Provide tools that offer a clear and consistent way for internationalizing content across all frameworks ● Adaptability Tools must be extensible and adaptable and should be able to solve any arising internationalization and localization problem ● Contextualization Allow translators to translate in context from within the application ● Agility Keep the development cycle agile - localization must not add significant overhead for developers - it must be done in parallel to the development process
  • 11. あ A Translation Management Service Global CDN Local Cache Application with SDK A Better Way A truly automated and continuous localization
  • 12. Translation Caching static and dynamic cache adapters for storing translations in your application Inline Translation Tools Translation can be done in context of the application Access Professional Translators Connect your application to thousands of professional translators around the world Open Source all SDKs are available on github Multiple Platforms support for Rails, Node, PHP, Python, iOS, Android and more Universal Translation Memory Translations are shared across all applications translationexchange.com Core Benefits
  • 15. Configuration # initializers/tml.rb Tml.configure do |config| config.application = { key: “YOUR_APPLICATION_KEY” } end translationexchange.com # layouts/application.html.erb <%= tml_scripts_tag %> <%= tml_language_selector_tag(:flags) %>
  • 16. Translation Markup Language Developer friendly syntax for marking up application content. Supports language context rules and language cases, making translations significantly more accurate for any language. translationexchange.com
  • 17. Hello World <%= tr('Hello World') %> translationexchange.com Translation Markup Language
  • 18. tr('Eats shoots and leaves', 'a panda') Eats shoots and leaves tr('Eats shoots and leaves', 'a violent restaurant patron') Translation Markup Language Description & Context
  • 19. Hello Michael translationexchange.com Translation Markup Language Data Tokens & Interpolation <%= tr('Hello {name}', {name:'Michael'}) %>
  • 20. Hello Michael <%= tr('Hello [bold: {user}]', { user: current_user }) %> translationexchange.com Translation Markup Language Decoration Tokens
  • 21. Hello Michael <%= tr('Hello <strong>{user}</strong>', { user: current_user }) %> translationexchange.com Translation Markup Language Decoration Tokens
  • 22. Hello Michael <%= tr('Hello [bold: {user}]', { user: current_user, bold: '<strong>{$0}</strong>' }) %> translationexchange.com Translation Markup Language Decoration Tokens
  • 23. You have 5 messages <%= tr(You have {count || message}', { count: 5 }) %> translationexchange.com Translation Markup Language Pluralization
  • 24. Michael uploaded 3 photos <%= tr('{user} uploaded {count || photo}', { user: current_user, count: 3 }) %> translationexchange.com Translation Markup Language Pluralization
  • 25. Michael liked Anna’s post <%= tr('{actor} liked {target::pos} post', { actor: current_user, target: other_user }) %> translationexchange.com Translation Markup Language Language Cases
  • 26. This is your second warning <%= tr(This is your {count::ord} warning', { count: 2 }) %> translationexchange.com Translation Markup Language Language Cases
  • 27. Michael completed 3 miles on his last run. <%= tr('[link: {user}] completed [bold: {count || mile}] on {user | his, her} last run.', { user: current_user, link: { href: user_path }, count: 3 }) %> translationexchange.com Translation Markup Language
  • 28. Demo ❏ Use TML SDK to localize an online recipes application ❏ Demonstrate crowdsourced localization tools ❏ Deploy translation release and update application realtime ❏ Download release snapshot and run Foody independently from the service translationexchange.com
  • 29. How is Translation Done? translationexchange.com Machine Translation provided by Google, Microsoft and Yandex. Translations are ranked to get the best result. Crowdsourced Translation Some developers may choose to use their own users to translate their content, similar to how Facebook and Twitter translated their sites. Professional Translation Order are received and processed by our partners and are made available in our system within hours.
  • 30. Caching Options translationexchange.com Static Cache File based cache. Loaded into the process memory and must be deployed with the source code. Each process contains the entire translation cache. $ bundle exec rake tml:cache:generate Dynamic Cache Redis, Memcached (and others) updated from CDN release. Cache is shared across all processes. Can be deployed without restarting servers. $ bundle exec rake tml:cache:upgrade
  • 31. SDKs https://github.com/translationexchange Documentation http://translationexchange.com/docs Blog http://blog.translationexchange.com Foody Source https://github.com/translationexchange/tml-rails-samples-foody Foody Live http://foody.translationexchange.com Facebook https://www.facebook.com/translationexchange Twitter @translationx Feedback [email protected] translationexchange.com Resources
  • 32. Thank You Find out more at translationexchange.com translationexchange.com