Fearless Internationalization and Localization Across the Nations

Fearless Internationalization and Localization Across the Nations

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.

Ee5d76ef07f4e8ac107ebde8c104f3b7?s=128

Siena Aguayo

August 27, 2015
Tweet

Transcript

  1. Fearless Internationalization and Localization Across the Nations Siena Aguayo Software

    Engineer at Indiegogo @sienatime
  2. • 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. None
  4. None
  5. What are l10n and i18n?

  6. 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. Localization • Translating content into target languages • Displaying data

    (dates, numbers, currencies, etc.) according to target region • Adjusting branding according to target culture BUSINESS
  8. Internationalization • Preparing your app for localized content ◦ Defining

    alternate resource files ◦ Using number and date formatters ◦ Designing flexible layouts ENGINEERING
  9. localization internationalization not just translation™

  10. Why should I care?

  11. EMPATHY

  12. Android peeps made with androidify.com Android is everywhere!

  13. From a technical perspective... • Separation of concerns • Organization

    & readability
  14. ya ain’t gonna need it

  15. How do I internationalize my Android app?

  16. How do I prepare my Android app for localized content?

  17. What content is localizable? • Strings • Numbers and currency

    • Dates and time • Images with text on them (avoid) • Audio and video files
  18. Resource Files Java Strings Images Audio Video Numbers Currency Dates

    Time
  19. Resource Files • Have a set of default resources •

    Define alternates as you need them res values strings.xml
  20. 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. Android Is on Your Side

  22. <string name="app_name" translatable="false"> Indiegogo </string> Hey, Don’t Translate This Helpful

    lint errors
  23. <string name="campaign_ended_label" note="example: Ended on January 21, 2014"> Ended on

    %s </string> XML Is Extensible
  24. Numbers & Currencies import java.text.NumberFormat; NumberFormat numberFormat = NumberFormat.getInstance(); textView.setText(numberFormat.format(36965));

  25. 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 *.java res.getQuantityString( R.plurals.number_of_fb_friends, count, numberFormat.format(count) );
  26. Dates & Time // DateFormat.getDateFormat (short) // DateFormat.getMediumDateFormat // DateFormat.getLongDateFormat

    en_US short: 8/23/2015 medium: Aug 23, 2015 long: August 23, 2015 ja_JP short: 2015/08/23 medium: 2015/08/23 long: 2015年8月23日 DateFormat dateFormatter = DateFormat.getDateFormat(context); Date now = new Date(); dateFormatter.format(now);
  27. 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. 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. SpannableString & String.format • Try to avoid • Replace, if

    you can, with HTML in your strings.xml (limited tag support) public void setSpan (Object what, int start, int end, int flags) textView.setText(Html.fromHtml( res.getString(R.string.fixed_funding)) );
  30. 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?
  31. What other cool things can I do?

  32. Android Studio Translations Editor

  33. Google Play App Translation Service

  34. Google Play Developer Console → Statistics • What languages and

    countries your users are in • How your app compares to others in your category
  35. Smartling • Paid translation service • API and Java SDK

    • Update strings files with a push and a pull
  36. Smartling: Push $ ./smartling.sh push Pushing strings.xml to smartling... ApiResponse[data=UploadFileData[stringCount=207,

    wordCount=506,overWritten=false],code=SUCCESS,messages=[]]
  37. 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
  38. 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
  39. Go out and be fearless! Any questions? @sienatime