ITT 2014 - Matt Brenner- Localization 2.0
-
Upload
istanbul-tech-talks -
Category
Engineering
-
view
103 -
download
1
Transcript of ITT 2014 - Matt Brenner- Localization 2.0
English370 million speakers
Español
390 milli
on speakers
Türkçe70 million speakers
Française
270 million speakers
中文1.1 billion speakers
العربية280 million speakers
Localization 2.0 Why? What? How? Pусский
160 million speakers
Istanbul Tech Talks – April 2014
Matt Brenner, UnME2, FiveTongues (founder)mobile software localization
geolocation, Bluetooth
Started localization from scratchJ2ME, word processor, spreadsheet, e-mail
Immediate Results“Bongo” Nokia Ovi, multi-player Bluetooth (11 languages)
1.5 million downloads400k in Vietnam
Hooked on localization but... no good tools(so I built them myself)
Informal PollPlease raise a hand if:
1. you develop or support a mobile app
2. not localized (1 language only)
3. localized into 2 languages
4. localized into 3+ languages
Mobile Means Global
● no language known by more than 1 in 6 people
● < 50% of apps are localized
● < 10% of apps are localized into >2 languages
● thousands of new apps appear monthly...
Apr '09 Jul '09 Oct '09 Apr '10 Oct '10 Apr '11 Oct '11 Apr '12 Oct '12 Apr '13 Oct '130
200,000
400,000
600,000
800,000
1,000,000
1,200,000
Oct '08 Apr '09 Oct '09 Apr '10 Oct '10 Apr '11 Oct '11 Apr '12 Oct '12 Apr '13 Oct '130
200,000
400,000
600,000
800,000
1,000,000
1,200,000
iTunes App Store (1million apps, 5 years old, +25,000/month)
Google Play (1.1million apps, 4 years old, +40,000/month)
Windows Phone (160 K apps, 3 years old, +3,000/month)
why so little localization?
Zillions of apps
Global market (1.5 billion smartphones)
Simple idea
Enormous potential rewards
Question:
Localization is Painful
● locating, vetting, paying translators● always a “few more phrases” to translate (translators get paid by the word)
Why?
Translation “Choke Points”:
Sorry, technology can't solve these problems.
Localization is Painful
● ad hoc: much human intervention● Apple/Android/WP tools incomplete● process varies with platform (iOS / Android / Windows / Phone / HTML5, Firefox OS)● requires custom-coding● multiple translation cycles per release
Why?
Technology “Choke Points”:
Who bears these burdens? Developers
Technology can solve these problems.
Costs of Localization
● translator fees (cost/word)● initial “internationalization”● managing translators
The apparent costs of translation:
The hidden costs of translation:● developer time spent:
● uploading phrase files● downloading/installing translation files● custom-coding translation features
Localization 2.0 means:● cloud-based phrase repository
● automated upload/download/install
● identical tools/process across platforms (Android / iOS / JavaScript / Windows Phone)
● minimal impact on dev process
● automatic support for all language grammars (e.g. pluralization)
● zero-cost/effort to add target languages
Localization 2.0: seamless integration into development
Technology
● simple process, easy-to-use tools
● happy, efficient translators
● happy, efficient developers
● reduced cost
Benefits of Localization 2.0
Localization 2.0: seamless integration into development
1. simple phrases2. phrases with elements not to translate3. phrases which change occasionally4. phrases containing variables5. phrases embedded in XML6. phrases embedded in HTML7. phrases only needed outside app
Phrase Categories
Localization 2.0 Phrase Categories:
Phrase Categories
What would you like to do?Your image has been saved.OKYou've used this app for months, please send us money.
1. Simple Phrases
Phrase Categories
Bongo challenges you by putting your skill and reflexes to the test!Bongo, yeteneklerinizi ve reflekslerinizi sınayarak size meydan okur!
Visit UnME2 at: unme2comBesuche UnME2, im Internet: unme2.com
Developed by Matt BrennerVon Matt Brenner entwickelt
2. Phrases With Elements Not to Xlate
Phrase Categories
You are running version 1.3
3. Phrases Which Change Occasionally
Phrase Categories
You have 10 points.Hey Sonia, you have 10 points.
4. Phrases Containing Variables
Phrase Categories
<string name="tap_to_select">Tap items to Select</string>
5. Phrases Embedded in XML
Accessible from Android xml layout files as:
"@string/tap_to_select"
Accessible from Java source files as:
R.string.tap_to_select
Phrase Categories
6. Phrases Embedded in HTML
<center><table border="0"><tr> <td align="center">
Developed by<font style='color: orange'>Matt Brenner</font><br>Version 1.0<br><hr>Visit UnME2, Inc. at: <a href="http://www.unme2com">unme2.com</a><br>See our: <a href="http://www.unme2.com/gottatxt/privacy.html">privacy policy</a><br>LangDemo © 2011-2013<br><br><font style="font-size: .75em;">Graphic design by Techark Solutions</font>
</td></tr></table></center>
Phrase Categories
App store descriptionMarketing Materials
7. Phrases Only Needed Outside of App
Present: User web-app LangDemo App
Internationalizing Static Phrases● extract phrases from layout files
● extract phrases from menu files
● upload phrases/screen shots
Internationalizing Static Phrases
Observable result of localization: none
Localization 2.0: seamless integration into development
(internationalizing is the hardest step)
● add Lang.jar to Eclipse Project (Java / Objective-C / C# / JavaScript)
● extract phrases from source files
● store phrases in repository
● build/install Language Packs
● use Lang class to fetch/format dynamic phrases
Internationalizing Dynamic Phrases
Localization 2.0: seamless integration into development
Plug-in for Eclipse
● server builds language packs & strings.xml files directly from Eclipse
● downloads/installs language packs directly into Eclipse project
● creates all values-xx directories, installs strings.xml files
Localization 2.0: seamless integration into development
● one static method: go
● go is simple yet powerful
● summons phrases in appropriate language
● fills in placeholders with run-time values
● and much more...
Lang Class
Localization 2.0: seamless integration into development
Phrase Categories
Repository Phrase:What would you like to do?
Within App:text = Lang.go (Lang.GET, L.CHOOSE);
1. Simple Phrases Phrase: What would you like to do?
Phrase Categories
Repository Phrase:{appname} puts your skill and reflexes to the test!
Define the variable at app startup:Lang.go (Lang.DEFINE, "appname", "Bongo");
Later:text = Lang.go (Lang.GET, L.SKILL_TEST);
2. Phrases With Elements Not to XlatePhrase: Bongo puts your skill and reflexes to the test!
Phrase Categories
3. Phrases Which Change Occasionally
Repository Phrase: You are running version {version}
Define the variable at app startup:String ver = getPackageManager( )
.getPackageInfo(getPackageName( ), 0).versionCode;Lang.go (Lang.DEFINE, "version", ver);
Later:text = Lang.go (Lang.GET, L.SHOW_VERSION);
Phrase: You are running version 1.3
Phrase Categories
4. Phrases Containing VariablesPhrase: Hey Sonia, you have 10 points.
Repository Phrase: Hey {1}, you have {2q 1|point| x|points|}.
In app:String name = ...;int points = ...;
text = Lang.go (Lang.GET, L.SCORE, name, points);
Phrase Categories
<string name="tap_to_select">Tap items to Select</string>
5. Phrases Embedded in XML
Adding to Phrase Repository is Sufficient:
xml files can be automatcially generated
Phrase Categories
6. Phrases Embedded in HTML
<center><table border="0"><tr> <td align="center">
Developed by<font style='color: orange'>Matt Brenner</font><br>Version 1.0<br><hr>Visit UnME2, Inc. at: <a href="http://www.unme2com">unme2.com</a><br>See our: <a href="http://www.unme2.com/gottatxt/privacy.html">privacy policy</a><br>LangDemo © 2011-2013<br><br><font style="font-size: .75em;">Graphic design by Techark Solutions</font>
</td></tr></table></center>
Phrase Categories
6. Phrases Embedded in HTML
<center><table border="0"><tr> <td align="center">
{CREATED_BY}
{VERSION}<br><hr>{VISIT}<br>{SEE_OUR} {privacylink}<br>{appname} © 2011-2013<br><br><font style="font-size: .75em;">{DESIGN_BY}</font>
</td></tr></table></center>
Developed by {author}
Version {version}
Visit {corpname} at: {homelink}See our:
Graphic design by {graphics}
Phrase Categories
6. Phrases Embedded in HTMLIn App:
Lang.go (Lang.DEFINE, "appname", "LangDemo");Lang.go (Lang.DEFINE, "author", "Matt Brenner");Lang.go (Lang.DEFINE, "corpname", "UnME2, Inc.");Lang.go (Lang.DEFINE, "homelink", "<a href=...);Lang.go (Lang.DEFINE, "privacylink",
"<a href=...>{PRIVACY_POLICY}</a>");Lang.go (Lang.DEFINE, "version", "1.0");Lang.go (Lang.DEFINE, "graphics", "Techark Solutions");
text = Lang.go (Lang.PROCESS_ASSET, “html/about.html, this);
Phrase Categories
● Add phrases to repository● Adopt naming convention for Abstract Names
7. Phrases Only Needed Outside of App
Lang class has many capabilities:
· GET · SET_LANGUAGE_TO_LOCALE· DEFINE · GET_CURRENT_LANGUAGE· PROCESS_ASSET · GET_LANGPACK_LOCALE· GET_DIRECTION · GET_LANGUAGE_LIST· SET_LANGUAGE · IS_LANGPACK_INSTALLED· EXPAND · LOOKUP_LANGUAGE_NAME· GET_PHONE_LOCALE
Localization 2.0: seamless integration into development
More Lang Class
What must you do to add additional languages?
absolutely nothing!
Localization 2.0: seamless integration into development
Finally