The file formats that actually break in production
Software localisation looks simple until you ship it. A team writes en.json and assumes Spanish, German and Arabic will follow the same path. They will not. Every file format has a quirk that breaks the build of an unprepared agency. After 14 years and several thousand SaaS releases, we have a short list of the cases that catch even mature engineering teams.
JSON, YAML and the apostrophe problem
Plain JSON has no comments and no plural support — fine for English, fragile in production once translators add curly apostrophes (' vs '), narrow non-breaking spaces around French punctuation, or German guillemets (», «). A French translator who writes the correct L'application with a typographic apostrophe will pass linguistic QA and break a brittle JSON parser. We normalise apostrophes at import, validate UTF-8 BOM presence, and run a syntax pass before any locale ships.
Android strings.xml: the silent escape
Android stores apostrophes as \' and ampersands as &. Translators routinely paste in Microsoft Word's curly characters that look identical and ship — until the layout renders mojibake at runtime. We use a custom XLIFF round-trip for Android assets so the translator never sees raw XML, and re-escape on export.
iOS .strings and .stringsdict
The classic problem is plural rules. iOS uses CLDR plural categories (zero, one, two, few, many, other) through .stringsdict. A naïve translator will treat the file as one-to-one and lose plural variants — your German app then says "1 Nachrichten". We use a plural-aware editor that surfaces every CLDR category as required for the target locale and refuses export if any category is missing.
.NET .resx and Java .properties
.resx accepts XML comments and embedded code references; .properties uses ISO-8859-1 by default (modern toolchains do support UTF-8, but the wrong combination still ships \uXXXX escapes that defeat translators). We force UTF-8 at import and emit native escapes only at build time.
The XLIFF round trip
Whenever possible, we extract source files to XLIFF 1.2 or 2.0, translate inside our editor with context attached, and re-merge. This lets translators see the source comment, the screenshot, and the constraint (character limit, ICU plural form, RTL mirroring flag) without ever touching the source file. The build pipeline merges back into the format your developers committed.