Blog
Shipping one Android app in English, Myanmar and Thai
Practical notes on strings, plurals, per-app language switching, fonts and testing when one app has to speak three languages.
Shipping one Android app in English, Myanmar and Thai
Translating an app sounds like a strings job: copy strings.xml, hand
it to someone who speaks the language, done. Then the Myanmar build
clips half its buttons, the Thai build breaks a word in the middle of a
syllable, and a "1 items" shows up in English. Here is what I check now
whenever an app has to speak English, Myanmar and Thai.
Strings: one folder per language, no concatenation
values/holds English, which is also the fallback for anything missing.values-my/is Myanmar andvalues-th/is Thai.- Never build a sentence out of pieces. "Paid " + name + " today" only
works in English; Myanmar and Thai put the verb and the name in a
different order. Use one string with placeholders:
<string name="paid_today">Paid %1$s today</string>. - Give translators context with a comment above each string. "Back" as a button and "back" as a body part are two different words in Thai.
Plurals are not the same everywhere
English needs one and other. Myanmar and Thai do not change the noun
for quantity, so they only use other. Declare plurals properly anyway,
so each language gets the rules it needs:
<plurals name="items_count">
<item quantity="one">%d item</item>
<item quantity="other">%d items</item>
</plurals>
In values-my/ and values-th/ the same entry has a single other
item. Calling pluralStringResource(R.plurals.items_count, n, n) then
does the right thing in all three.
Letting people pick the language
Many people in Myanmar and Thailand keep their phone in English but would rather read an app in their own language, or the other way round. Android 13 added per-app language settings, and AppCompat brings the same API to older versions:
AppCompatDelegate.setApplicationLocales(
LocaleListCompat.forLanguageTags("my")
)
Add a locales_config.xml listing en, my and th, and the app also
shows up in the system's App languages screen.
The script is the hard part
Translation gets the words right. Typography decides whether anyone can actually read them.
- Unicode, not Zawgyi. Older Myanmar content is often in Zawgyi, a font hack that reuses Unicode code points. Store and ship Unicode only, and convert any imported text before it reaches the database.
- Taller glyphs. Myanmar and Thai stack marks above and below the
line. Fixed heights and tight
lineHeightvalues clip them, so let text measure itself and test with the longest string. - No spaces between words. Neither language puts spaces between
words, so line breaking needs a dictionary. Android handles it, but
only if you don't force
maxLines = 1with ellipsis on body text. - Numbers and dates. Format them with the user's locale
(
NumberFormat,DateTimeFormatter) instead of hand-written patterns; Thai devices may use the Buddhist calendar year.
Testing it
Turn on pseudo-locales to catch hard-coded text and layouts that can't grow. Take a screenshot of every main screen in all three languages. And before release, have a native speaker read the app on a real phone — not just the spreadsheet of strings.
What I would do differently
I would add the Myanmar and Thai folders on day one, even with just placeholder text. Every layout built against English alone has to be fixed later, and that is always slower than building it to stretch from the start.