Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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.

Siena Aguayo

August 27, 2015
Tweet

More Decks by Siena Aguayo

Other Decks in Technology

Transcript

  1. • What are l10n and i18n? Overview • Why should

    I care? • How do I internationalize my Android app? • What other cool things can I do?
  2. 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
  3. Localization • Translating content into target languages • Displaying data

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

    alternate resource files ◦ Using number and date formatters ◦ Designing flexible layouts ENGINEERING
  5. What content is localizable? • Strings • Numbers and currency

    • Dates and time • Images with text on them (avoid) • Audio and video files
  6. Resource Files • Have a set of default resources •

    Define alternates as you need them res values strings.xml
  7. 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
  8. 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) );
  9. 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);
  10. 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月
  11. 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
  12. 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)) );
  13. 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?
  14. Google Play Developer Console → Statistics • What languages and

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

    • Update strings files with a push and a pull
  16. 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
  17. 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