The Mobile Internationalization (i18n) Landscape: Android vs iOS vs Flutter
Cross-platform and multi-repository mobile engineering requires synchronizing localized copy across distinct resource architectures. Android relies on XML resource files located in res/values-[locale]/strings.xml. Apple traditionally uses UTF-8 or UTF-16 key-value pairs in [locale].lproj/Localizable.strings and .stringsdict, expanding to JSON-based String Catalogs (.xcstrings) in Xcode 15+. Flutter utilizes Application Resource Bundle (.arb) files grounded in ICU MessageFormat syntax. Without automated conversion, manual copy-pasting across these formats introduces format specifier mismatches, unescaped character crashes, and missing key defects.
// Side-by-side localization format comparison
<!-- Android: res/values/strings.xml -->
<resources>
<string name="welcome_user">Welcome back, %1$s! You have %2$d messages.</string>
</resources>
/* iOS: en.lproj/Localizable.strings */
"welcome_user" = "Welcome back, %1$@! You have %2$ld messages.";
// Flutter: lib/l10n/app_en.arb
{
"welcome_user": "Welcome back, {name}! You have {count} messages.",
"@welcome_user": {
"description": "User greeting with message count",
"placeholders": {
"name": { "type": "String" },
"count": { "type": "int" }
}
}
}