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. Fearless
    Internationalization and
    Localization Across the
    Nations
    Siena Aguayo
    Software Engineer at Indiegogo
    @sienatime

    View Slide

  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?

    View Slide

  3. View Slide

  4. View Slide

  5. What are l10n and i18n?

    View Slide

  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

    View Slide

  7. Localization
    ● Translating content into target languages
    ● Displaying data (dates, numbers, currencies,
    etc.) according to target region
    ● Adjusting branding according to target
    culture
    BUSINESS

    View Slide

  8. Internationalization
    ● Preparing your app for localized content
    ○ Defining alternate resource files
    ○ Using number and date formatters
    ○ Designing flexible layouts
    ENGINEERING

    View Slide

  9. localization
    internationalization
    not just translation™

    View Slide

  10. Why should I care?

    View Slide

  11. EMPATHY

    View Slide

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

    View Slide

  13. From a technical perspective...
    ● Separation of concerns
    ● Organization & readability

    View Slide

  14. ya ain’t gonna need it

    View Slide

  15. How do I internationalize my
    Android app?

    View Slide

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

    View Slide

  17. What content is localizable?
    ● Strings
    ● Numbers and currency
    ● Dates and time
    ● Images with text on them (avoid)
    ● Audio and video files

    View Slide

  18. Resource Files Java
    Strings
    Images
    Audio
    Video
    Numbers
    Currency
    Dates
    Time

    View Slide

  19. Resource Files
    ● Have a set of default resources
    ● Define alternates as you need them
    res
    values
    strings.xml

    View Slide

  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

    View Slide

  21. Android Is on Your Side

    View Slide


  22. Indiegogo

    Hey, Don’t Translate This
    Helpful lint errors

    View Slide

  23. note="example: Ended on January 21, 2014">
    Ended on %s

    XML Is Extensible

    View Slide

  24. Numbers & Currencies
    import java.text.NumberFormat;
    NumberFormat numberFormat = NumberFormat.getInstance();
    textView.setText(numberFormat.format(36965));

    View Slide

  25. strings.xml

    %s friend
    %s friends

    Plurals
    beware of %d
    *.java
    res.getQuantityString(
    R.plurals.number_of_fb_friends,
    count,
    numberFormat.format(count)
    );

    View Slide

  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);

    View Slide

  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月

    View Slide

  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

    View Slide

  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))
    );

    View Slide

  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?

    View Slide

  31. What other cool things can I do?

    View Slide

  32. Android Studio Translations Editor

    View Slide

  33. Google Play App Translation Service

    View Slide

  34. Google Play Developer Console → Statistics
    ● What languages and countries your users
    are in
    ● How your app compares to others in your
    category

    View Slide

  35. Smartling
    ● Paid translation service
    ● API and Java SDK
    ● Update strings files with a push and a pull

    View Slide

  36. Smartling: Push
    $ ./smartling.sh push
    Pushing strings.xml to smartling...
    ApiResponse[data=UploadFileData[stringCount=207,
    wordCount=506,overWritten=false],code=SUCCESS,messages=[]]

    View Slide

  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

    View Slide

  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

    View Slide

  39. Go out and be fearless!
    Any questions?
    @sienatime

    View Slide