T he t it l e g o t g a rb l d Successful - - PowerPoint PPT Presentation
T he t it l e g o t g a rb l d Successful - - PowerPoint PPT Presentation
T he t it l e g o t g a rb l d Successful Locali(z)(s)ation Kentaro Takiguchi Droidcon Berlin 2016 @rejasupotaro Introduction Introduction > Real World Localizlation > Localization in Development >
Successful Locali(z)(s)ation
Droidcon Berlin 2016 Kentaro Takiguchi @rejasupotaro
Introduction
Introduction > Real World Localizlation > Localization in Development > Translation > Understanding users > ConclusionAbout our service
Cookpad was established in 1998. Cookpad has started expanding business globally from 2014.This is the first step of our 🌐
The previous logo looks “loud” in foreign countriesWhy Go Global
Should we really do it?Global Project - Domestic Project = Localization
The only different between global project and domestic project is localizationGLOBALIZATION = INTERNATIONALIZATION = LOCALIZATION = TRANSLATION = CALTURALIZATION ?
What’s the difference between these terms?Internationalization
- The process of designing a service so that it can
potentially be adapted to various languages and region without engineering changes.
a.k.a. i18nLocalization
- The process of adapting internationalized
service for a specific language or region by adding locale specific components or text.
a.k.a. l10nExtract string resources →Internationalization
i18n and l10n are can’t be separated.Add local language resources →Localization
Globalization Internationalization Localization Translation
Industry Legal Religion Culture
Real World Localization
Introduction > Real World Localizlation > Localization in Development > Translation > Understanding users > ConclusionLocalized version was released 2 months later
What’s the difference between the original version and the localized version? Released on November 2014 Released on January 2015
Violence and Obscene
They have different standard Released on November 2014 Released on January 2015
Each country has different rules
https://support.google.com/googleplay/answer/6209544?hl=enContent Rating in Google Play
- North & South America
- Europe & Middle East
- Germany
- Australia (Games only)
- Brazil
- South Korea
- Other countries
A closed-room mystery made by Quentin Trantino Who will be able to survive? 8 ruffians, all of them are liar This movie should be an Academy Award winning
International availability
- f McDonald’s products
Pasta
Red beans paste
McBeer
Opportunities and Challenges
- Language
- Religion
- History
- Industry
- Legal issues
- Climate
- Infrastructure
- …
Localization in Development
Introduction > Real World Localizlation > Localization in Development > Translation > Understanding users > ConclusionLocalize your app
- LTR, RTL
- Locale
- Format
- Performance
- APK size
- Traffic
- …
- Writing system
- Character
- Encoding
- Font
- Text size
- Grammer
- Text length
Unicode 9.0
128,172 characters
Unicode and Characters
https://medium.com/behancetech/localization-gotchas-for-asian-languages-cjk-e52a57c0fde1
This app doesn’t seem to support Japanese
Uninstall Custom font The same unicode value
Font
The text is rendered perfectly! How about in other languages?Text Size
These font and the text size are the same between screenshotsText Size
According to my colleague, using the same text size doesn’t work in Arabic <!— ar/dimens.xml —> <resources> <dimen name="text_size_xxlarge">27sp</dimen> <dimen name="text_size_xlarge">25sp</dimen> <dimen name="text_size_large">21sp</dimen> <dimen name="text_size_medium">19sp</dimen> <dimen name="text_size_small">17sp</dimen> <dimen name="text_size_xsmall">15sp</dimen> <dimen name="text_size_xxsmall">13sp</dimen> <dimen name="text_size_xxxsmall">11sp</dimen> </resources> <!— dimens.xml —> <resources> <dimen name="text_size_xxlarge">26sp</dimen> <dimen name="text_size_xlarge">24sp</dimen> <dimen name="text_size_large">20sp</dimen> <dimen name="text_size_medium">18sp</dimen> <dimen name="text_size_small">16sp</dimen> <dimen name="text_size_xsmall">14sp</dimen> <dimen name="text_size_xxsmall">12sp</dimen> <dimen name="text_size_xxxsmall">10sp</dimen </resources>Text Size
The difference is small but it helps Arabic users a lotDefault (ar) +1 sp (ar)
- Alphabets:
- Syllabaries:
- Logographies:
Logographies
It can contain a lot of meaning in just one characterHow to say “Butterfly”
Writing systems affect text length
蝶
Farfalla
Mariposa
Papillon
SCHMETTERLING!!!
Word Order: SVO
SVO: 488 languages I eat bread
= [Subject] [Verb] [Object]
Word Order: SOV
SOV: 565 languages I bread eat
= [Subject] [Object] [Verb]
Word Order: VSO
VSO: 95 languages Eat I bread
= [Verb] [Subject] [Object]
Word Order
- = [Subject] [Verb] [Object]
- = [Subject] [Object] [Verb]
- = [Verb] [Subject] [Object]
Quantity: Ingredient Name?
Which does it look natural?Left-To-Right and Right-To-Left
RTL languages start from the right and continue to the leftFlipped
How to support RTL
The cost of supporting RTL is not so high- layout_marginLeft => layout_marginStart
- layout_marginRight => layout_marginEnd
- layout_alignParentLeft => layout_alignParentStart
- layout_alignParentRight => layout_alignParentEnd
- …
<application android:supportsRtl=“true” … >
FloatingActionButton ViewPager
Put your app on a diet 🔦
It affects the number of daily downloads. We should avoid adding locale specific resources as much as possible.Flipped
Locale
- A set of parameters that defines a user language
and country.
- It is used to identify user’s environment.
Locale.getDefault()
en-US
Language codes are defined in ISO 639. Country codes are defined in ISO 3166.ISO 639 ISO 3166 = new Locale(“en”, “US”);
Language != Country
Spanish is spoken widely. We have 4 translations only for Spanish.en-US American English en-GB British English es-ES Spanish Spanish es-419 Latin American Spanish pt-PT Portuguese in Portugal pt-BR Portuguese in Brazil zh-CN Simplified Chinese zh-TW Traditional Chinese
Formatter.format(new Date()); // => 2016/06/09 午後11:50 Formatter.format(new Date()); // => 6/9/16 11:50 PM Formatter.format(new Date()); // => 09/06/16 11:50 PM
Format
We should use formatters. Don’t try to write something by hand, it wouldn’t make sense in some counties. US English French German Spanish Italian Japanese Time hh:mm:ss am/pm (12- hour clock) hh:mm:ss (24-hour clock) hh:mm:ss (24-hour clock) hh:mm:ss (24-hour clock) hh:mm:ss (24-hour clock) hh:mm:ss (24-hour clock) Decimal Separator period (.) comma (,) comma (,) comma (,) comma (,) period (.) Thousand Separator comma (,) space ( ) space ( ) or period (.) space ( ) space ( ) or period (.) comma (,) Number Example 12,345.67 12 345,67 12 345,67 or 12.345,67 12 345,67 12 345,67 or 12.345,67 12,345.67 Currency $12,345.67 12 345,67¢ 12 345,67¢ 12 345,67¢ ¢12.345,67 ¥12,345 Ordinal 1st 2nd 3rd … 1er 2e 3e … or 1re 2e 3e … … 1o 2o 3o … or 1a 2a 3a … 1o 2o 3o … or 1a 2a 3a … 1つ 2つ 3つ … are good at multibyte string are good at time difference
Performance
Performance turning is a part of localization.Traffic
Prepare for events, don’t miss your opportunity.Christmas 📉
Ramadan 📉?
Arabic Indonesian
Prepare for Ramadan
We can prepare if we know when traffic is increased in advanceTranslation
Introduction > Real World Localizlation > Localization in Development > Translation > Understanding users > Conclusionname + “ added ” + number + “ person to his list”
How many problems can you find?MARY + “ added ” + 7 + “ person to his list”
Should be “her” Plurals Number could be changed Female / Male
Don’t concatenate string
Plurals Forms
Use Android internationalization framework<?xml version="1.0" encoding="utf-8"?> <resources> <plurals name="plural_name"> <item quantity=["zero" | "one" | "two" | "few" | "many" | "other"] >text_string</item> </plurals> </resources> English Polish Apples Jablek 1 Apple Jablko 2..4 Apples Jablka 5..21 Apples Jablek 22..24 Apples Jablka 25..34 Apples Jablek
Choose “appropriate words”
I know, but what is “appropriate word”?Semantics Difference
“Appropriate word” is changed by localeAmerican British Holiday Vacation Football Soccer American Football Football Flat Apartment Garden Yard
Move to my library —— Oregon State —— Continue shopping
OR = Oregon State, right…
“Premium” could be offended
“Premium” sounds like “Evil” in some countries“Premium Service”
- Cookpad Premium
- Cookpad Prime
- Cookpad Elite
- Cookpad Deluxe
- Cookpad Extra
- Cookpad Select
- Cookpad First Class
- …
How to make it “appropriate”?
Good workflow makes good translation%1$d replied to your photo of %2$d.
{sender_name} replied to your photo of {recipe_title}.
Phrase.from(context, R.string.reply_to_photo_comment) .put(“sender_name”, user.getName()) .put(“message_count”, messages.size()) .format();
<!— This message is displayed when a user receive a reply—> <string name=“reply_to_photo_comment”> {sender_name} replied to your photo of {recipe_title}. </string>
es-ES es-419
Understanding users
“All German people drink beer everyday?”
“What is national character!?” “What is localization!?” “How to develop global services!?”
I’m getting confusedBuild - Measure - Learn
Unified logging layer for mobile apps
- Buffering
- Filtering
- Batching
- Retrying
- Pluggable
Conclusion
Introduction > Real World Localizlation > Localization in Development > Translation > Understanding users > ConclusionRequirement level
Requirement level is not the same between servicesQuality Cost Requirement level (depends on service)
Localization is fun!
I leaned a lot while locazing my appThank you!
- Kentaro Takiguchi
- GitHub: rejasupotaro
- Speakerdeck: rejasupotaro
- Twitter: @rejasupotaro