Fearless Internationalization and Localization Across the Nations
-
Upload
siena-aguayo -
Category
Software
-
view
3.459 -
download
0
Transcript of Fearless Internationalization and Localization Across the Nations
Fearless Internationalization and Localization Across the
Nations Siena Aguayo
Software Engineer at Indiegogo @sienatime
@sienatime
• What are l10n and i18n?
Overview
• Why should I care?
• How do I internationalize my Android app?
• What other cool things can I do?
@sienatime
@sienatime
@sienatime
What are l10n and i18n?
@sienatime
localization internationalization
01 02 03 04 05 06 07 08 09 10
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18
@sienatime
Localization
• Displaying data (dates, numbers, currencies, etc.) according to target region
• Adjusting branding according to target culture
BUSINESS • Translating content into target languages
@sienatime
Internationalization
• Preparing your app for localized content
• Defining alternate resource files
• Using number and date formatters
• Designing and implementing flexible layouts
ENGINEERING
@sienatime
localization internationalization
not just translation™
@sienatime
Why should I care?
@sienatime
EMPATHY
Android peeps made with androidify.com
Android is everywhere!
@sienatime
@sienatime
From a technical perspective...
• Separation of concerns
• Organization & readability
@sienatime
ya ain’t gonna need it (you’re not going to need it)
@sienatime
How do I internationalize my Android app?
@sienatime
How do I prepare my Android app for localized content?
@sienatime
What content is localizable?
• Strings
• Numbers and currency
• Dates and time
• Images with text on them (avoid)
• Audio and video files
@sienatime
Resource Files Java
Strings Images Audio Video
Numbers Currency Dates Time
@sienatime
Resource Files
• Have a set of default resources
• Define alternates as you need them
res values strings.xml
@sienatime
Strings
• Don’t hardcode strings that face the user
• Use position placeholders %1$s %2$s
• Provide context for your translators to help make their job easier
I need to %s interpolate %s I need to %1$s interpolate %2$s
@sienatime
Android Is on Your Side
@sienatime
<string name="app_name" translatable="false"> Indiegogo </string>
Hey, Don’t Translate This
Helpful lint errors
@sienatime
<string name="campaign_ended_label" note="example: Ended on January 21, 2014"> Ended on %s </string>
XML Is Extensible
@sienatime
Numbers & Currencies
import java.text.NumberFormat; NumberFormat numberFormat = NumberFormat.getInstance(); textView.setText(numberFormat.format(36965));
@sienatime
*.java res.getQuantityString(
R.plurals.number_of_fb_friends, count, numberFormat.format(count)
);
strings.xml <plurals name="number_of_fb_friends"> <item quantity="one">%s friend</item> <item quantity="other">%s friends</item> </plurals>
Plurals
beware of %d
@sienatime
Dates & Time // DateFormat.getDateFormat (short) // DateFormat.getMediumDateFormat // DateFormat.getLongDateFormat
en_US short: 08/07/2015 medium: Aug 7, 2015 long: August 7, 2015
en_AU short: 07/08/2015 medium: 7 Aug 2015 long: 7 August 2015
DateFormat dateFormatter = DateFormat.getDateFormat(context); Date now = new Date(); dateFormatter.format(now);
@sienatime
Custom Date Formats: API 18+
String formatString = DateFormat.getBestDateTimePattern( Locale.getDefault(), "MMMMyyyy" ); SimpleDateFormat dateFormatter = new SimpleDateFormat(formatString); Date now = new Date(); String dateString = dateFormatter.format(now);
en_US: August 2015 ja_JP: 2015年8月
@sienatime
Custom Date Formats: API <18 • ¯\_(ツ)_/¯
• Collect date formats you need and keep them in your resources
• ...but Android is still going to format according to the user’s locale even if you don’t support it
• Joda-Time
@sienatime
Multi-Format Spannables
Try to avoid
public void setSpan (Object what, int start, int end, int flags)
I’m some fancy spanned text! spanned
@sienatime
Multi-Format Spannables
Replace, if you can, with HTML in your strings.xml (limited tag support)
textView.setText(Html.fromHtml( res.getString(R.string.fixed_funding)) );
<string name="flexible_funding"> <![CDATA[ <b>Flexible Funding.</b> Campaign keeps all funds raised. ]]> </string>
@sienatime
Build Flexible Layouts
• Thank God for wrap_content
• Be mindful of line lengths
• What would happen if these two pieces of data needed to be switched around?
@sienatime
What other cool things can I do?
@sienatime
Android Studio Translations Editor
@sienatime
Google Play App Translation Service
@sienatime
Google Play Developer Console → Statistics
• What languages and countries your users are in
• How your app compares to others in your category
@sienatime
Smartling
• Paid translation service
• API and Java SDK
• Update strings files with a push and a pull
@sienatime
Smartling: Push
$ ./smartling.sh push Pushing strings.xml to smartling... ApiResponse[data=UploadFileData[stringCount=207,wordCount=506,overWritten=false],code=SUCCESS,messages=[]]
@sienatime
Smartling: Pull $ ./smartling.sh pull Pulling non-English locales from smartling... pulling fr-Fr from smartling... saved fr-Fr to /app/src/main/res/values-fr/strings.xml pulling de-DE from smartling... saved de-DE to /app/src/main/res/values-de/strings.xml pulling es from smartling... saved es to /app/src/main/res/values-es/strings.xml
@sienatime
Further Reading
● Localizing with Resources http://developer.android.com/guide/topics/resources/localization.html
● Localization Checklist http://developer.android.com/distribute/tools/localization-checklist.html
● Google Play App Translation Service blog post http://android-developers.blogspot.com/2013/11/app-translation-service-now-available.html
● Smartling API http://docs.smartling.com/pages/API/v2/ ● Smartling Java SDK
http://docs.smartling.com/pages/API/v2/SDKs/#Java
@sienatime
Go out and be fearless!
Any questions? @sienatime