The document discusses localization and internationalization challenges and proposes a universal translation memory and markup language as potential solutions. It outlines issues with current localization approaches, such as differing file formats, complex rules for pluralization and gender, and bottlenecks in development workflows from content extraction and file management. Alternative solutions like proxy servers, JavaScript libraries, and SDKs are presented along with their tradeoffs. The ideal solution is proposed to have consistency, adaptability, allow in-context translation, and keep development agile. A demonstration of a proposed translation markup language is provided.
4. 1990 (pre internet)
OS introduced support for multiple languages and ability to switch
between them
Localization is based on resource files and language bundles
2016
Progress has been made in better file resource management but
localization complexity still exists.
We still live in the same localization paradigm.
5. 1990 (pre internet)
OS introduced support for multiple languages and ability to switch
between them
Localization is based on resource files and language bundles
2016
Progress has been made in better file resource management but
localization complexity still exists.
We still live in the same localization paradigm.
6. Content Translation
Date & Time Conversion
Number Formatting
Currency Conversion
User Interface Adjustments
{COMPLICATED
It’s
8. 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
9. 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
YAML .yaml
Subtitles .srt
MicroDVD .sub
Subviewer .sub
Mozilla Web L10N
Text .txt
CSV Spreadsheet
Excel Spreadsheet
Word Document
10. 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
11. 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
12. Some companies build their own
CUSTOM TOOLS
WhatsApp Facebook AirBnB Twitter LinkedIn Evernote
14. 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
15. What are the
Proxy Servers
Smartling, Easyling
Javascript based
solutions
Localizejs, Bablic,
Transifex Live
SDK based
solutions
Translation Exchange
ALTERNATIVE SOLUTIONS
16. ● Depends on external servers uptime
● Search engines penalize content in
ranking (from external DNS)
● Increase response time
● Does not work for dynamic content
Proxy Server Solutions
● Easy to configure
● updated automatically
● Changes can be applied outside of
source code and developer’s time
Good Bad
17. ● Easy to implement
● Content is all in one place
● Automatic updates
● Served from your domain
● Bad for SEO (only Google does any JS)
● Adds time in rendering
● Flicker effect
● Depends on external server uptime
Javascript Solutions
Good Bad
18. ● Easy to install
● No manual content extraction
● Content is under developer’s control
● All content is in one place
● Served by your servers
● Good for SEO
● Translations can be done in context
● Supports agile methodology
● Same syntax across all frameworks
● Translations are reused across all apps
● Supports context rules
● Does not depend on external uptime
SDK Solutions
20. Caching Translations
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
Dynamic Cache
● Redis, Memcached (and others)
updated from CDN release
● Cache is shared across all
processes
● Can be deployed without
restarting servers
21. Translation
Tools
Developer friendly syntax for marking
up application content.
Supports language context rules and
language cases, making translations
significantly more accurate for any
language.
29. Decoration Tokens
tr('Hello <link>World</link>', {link: {‘href’:‘www.google.com’}})
link: ‘<a href=”{$href}”>{$0}</a>’
With Predefined Default Decorators
Hello WorldWorld
where link is a default decoration defined as
33. <%= tml_source('common/navigation') do %>
<ul>
<li><%= tr('Home') %></li>
<li><%= tr('Features') %></li>
<li><%= tr('Languages') %></li>
<li><%= tr('Pricing') %></li>
<li><%= tr('Docs') %></li>
</ul>
<% end %>
Sources are arbitrary groups of related strings
Sources & String Grouping
34. <%= trh(source: 'common/navigation') do %>
<ul>
<li>Home</li>
<li>Features</li>
<li>Languages</li>
<li>Pricing</li>
<li>Docs</li>
</ul>
<% end %>
Translation Blocks
Entire blocks can be translated without markup.
35. <%= trh(source: 'common/navigation') do %>
<nav>
<ul>
<li>You have <a href=’/messages’>unread messages</a></li>
<li><a href=’/logout’>Logout</a></li>
</ul>
</nav>
<% end %>
Blocks
You have [link: unread messages]
You have unread messages
48. Contextualization by Gender
Michael uploaded 3 photos
tr('{user} uploaded {count || photo}', {user: user, count: 3})
user = {name: ‘Michael’, gender: ‘male’}
49. Contextualization by Gender
Michael загрузил 3 фотографии
'{user || загрузил, загрузила} {count || фотографию, фотографии, фотографий}'
Russian Translation
dependant on gender of user dependant on value of count
male onefemale few many
56. {date} = ‘{month_name} {days}, {years}’
Dates
English Date Format
tr('{user} was born on {date}', {user: user, date: user.birthday.tr(:verbose)})
%B = {month_name}
%d = {days}
%Y = {years}
Alex was born on July 4, 2002
verbose = ‘%B %d, %Y’ #July 4, 2002
57. Dates
Russian Date Format
Alex родился 4 Июля, 2002
“{user || родился, родилась} {date::gen}”
‘%d %B, %Y’ #4 Июль, 2002
{date} = ‘{days} {month_name}, {years}’
58. tr('[link: {user}] completed [bold: {count || mile}] on {user | his, her} last run.',{
user: [user, :name],
count: 3,
link: {href: ‘/profile’}
})
Mixing it all together
Michael completed 3 miles on his last run.
59. Mixing it all together
Russian Translation
Michael пробежал 3 мили в своем последнем забеге.
'[link: {user}] {user | пробежал, пробежала} [bold: {count || милю, мили, миль}]
в своем последнем забеге.'
63. ● Translations should be reusable across
multiple projects
● Each translation key can have many
translation options for a language based
on context
● Translation keys and translations are
unique and are only stored once in the
entire system
What is UTM?
64. Translation
Rankings
● Ranks are derived from user input
● Translators have ranks and voting powers
that change based on their input and
acceptable translations
● Translation usability score is derived from
how often the translation has been
locked in other projects
¡Hola Mundo!
hola mundo!
Hello Mundo
Hola World
Yo Mundo!
Que Paso, Mundo?
@!*#&
+45
+2
-2
-17
-55
-58
-99
Hello World!
65. +45
+22
+1
-99
Translator
Rankings
Translators have ranks and voting powers
that change based on their input and
acceptable translations.
Jenny Smith
Admin
Jeremy Swanson
Proofreader
Jessica Sawyer
Translator
Jake Stephens
Translator
66. Hello World Hola Mundo
안녕하세요
Привет Мир
Hallo Welt עולם שלום
你好,世界
UTM Graph