Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Fearless Internationalization and Localization Across the Nations


Published on

Many people are intimidated by localization (l10n) and internationalization (i18n) but they don’t have to be—Android provides many tools out of the box to aide you in global domination. Learn what to watch out for while coding your app that will make your life easier once you receive localized content. We’ll cover alternate resources, strings files, date and number formatters and other tips from Android Studio, Google, and third parties that will turn you into an i18n and l10n champion.

This talk was given at Droidcon NYC on August 27th, 2015.
These slides were revised for DroidKaigi in Tokyo, presented on February 19th, 2016.

Published in: Software
  • Be the first to comment

Fearless Internationalization and Localization Across the Nations

  1. 1. Fearless Internationalization and Localization Across the Nations Siena Aguayo Software Engineer at Indiegogo @sienatime
  2. 2. @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?
  3. 3. @sienatime
  4. 4. @sienatime
  5. 5. @sienatime What are l10n and i18n?
  6. 6. @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
  7. 7. @sienatime Localization •  Displaying data (dates, numbers, currencies, etc.) according to target region •  Adjusting branding according to target culture BUSINESS •  Translating content into target languages
  8. 8. @sienatime Internationalization •  Preparing your app for localized content •  Defining alternate resource files •  Using number and date formatters •  Designing and implementing flexible layouts ENGINEERING
  9. 9. @sienatime localization internationalization not just translation™
  10. 10. @sienatime Why should I care?
  11. 11. @sienatime EMPATHY
  12. 12. Android peeps made with Android is everywhere! @sienatime
  13. 13. @sienatime From a technical perspective... •  Separation of concerns •  Organization & readability
  14. 14. @sienatime ya ain’t gonna need it (you’re not going to need it)
  15. 15. @sienatime How do I internationalize my Android app?
  16. 16. @sienatime How do I prepare my Android app for localized content?
  17. 17. @sienatime What content is localizable? •  Strings •  Numbers and currency •  Dates and time •  Images with text on them (avoid) •  Audio and video files
  18. 18. @sienatime Resource Files Java Strings Images Audio Video Numbers Currency Dates Time
  19. 19. @sienatime Resource Files •  Have a set of default resources •  Define alternates as you need them res values strings.xml
  20. 20. @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
  21. 21. @sienatime Android Is on Your Side
  22. 22. @sienatime <string name="app_name" translatable="false"> Indiegogo </string> Hey, Don’t Translate This Helpful lint errors
  23. 23. @sienatime <string name="campaign_ended_label" note="example: Ended on January 21, 2014"> Ended on %s </string> XML Is Extensible
  24. 24. @sienatime Numbers & Currencies import java.text.NumberFormat; NumberFormat numberFormat = NumberFormat.getInstance(); textView.setText(numberFormat.format(36965));
  25. 25. @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
  26. 26. @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);
  27. 27. @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月
  28. 28. @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
  29. 29. @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
  30. 30. @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>
  31. 31. @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?
  32. 32. @sienatime What other cool things can I do?
  33. 33. @sienatime Android Studio Translations Editor
  34. 34. @sienatime Google Play App Translation Service
  35. 35. @sienatime Google Play Developer Console → Statistics •  What languages and countries your users are in •  How your app compares to others in your category
  36. 36. @sienatime Smartling •  Paid translation service •  API and Java SDK •  Update strings files with a push and a pull
  37. 37. @sienatime Smartling: Push $ ./ push Pushing strings.xml to smartling... ApiResponse[data=UploadFileData[stringCount=207,wordCount= 506,overWritten=false],code=SUCCESS,messages=[]]
  38. 38. @sienatime Smartling: Pull $ ./ 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
  39. 39. @sienatime Further Reading ●  Localizing with Resources localization.html ●  Localization Checklist checklist.html ●  Google Play App Translation Service blog post translation-service-now-available.html ●  Smartling API ●  Smartling Java SDK
  40. 40. @sienatime Go out and be fearless! Any questions? @sienatime