The reverse of the most-Googled mobile localization conversion is just as common, and just as easy to break with a homemade script. iOS Localizable.strings is a flat key-value list with C-style /* */ comments and string literals delimited by double quotes; Android strings.xml is structured XML with <string name="…">…</string> elements, XML comments, and a different escaping regime. The two formats look superficially similar but disagree on every encoding detail that matters during a real round trip — quote escaping, empty-value handling, key syntax for dotted namespaces like settings.general.title, and where translator comments live in the syntax tree.
i18n-convert reads .strings honoring its "key" = "value"; grammar including C-style comments, then emits a well-formed strings.xml whose <string> elements carry the original key as the name attribute. Comments above an entry become XML comments above the corresponding <string> element, so translator notes survive the trip back to Android. Empty values are emitted as self-closing tags (<string name="empty_value" />) rather than dropped, which matters when a downstream build pipeline relies on a key being present for runtime fallback. Keys containing dots (a common iOS namespacing convention) are kept verbatim and not silently normalized to underscores.
Command
i18n-convert simple.strings --to android-xml -o strings.xml
Input
/* App title */
"app_title" = "My Application";
/* Greeting message */
"greeting" = "Hello, World!";
"no_comment" = "This has no comment";
/* Empty value */
"empty_value" = "";
/* Multi-word key */
"settings.general.title" = "General Settings";
Output
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- App title -->
<string name="app_title">My Application</string>
<!-- Greeting message -->
<string name="greeting">Hello, World!</string>
<string name="no_comment">This has no comment</string>
<!-- Empty value -->
<string name="empty_value" />
<!-- Multi-word key -->
<string name="settings.general.title">General Settings</string>
</resources>