Free tool

Convert translation CSV to JSON

Agencies and internal teams work in Excel. Your build needs JSON. This is the round trip, and it survives a line break inside a cell.

Runs in your browser. No account, no upload, nothing leaves your machine.

CSVJSON

Runs in your browser. The file is never uploaded.

Reading the header, not the column order

A spreadsheet that has been through a translation agency never comes back with the columns you sent. There is a status column now, or a translator's notes column, or the order changed. So this reader asks the header row rather than counting positions: it looks for key or id for the key, and the first of value, target, translation, source for the text. Without a key column it stops rather than guessing. A table whose first column is a row number would otherwise produce a language file with the keys 1, 2 and 3.

What survives

Converting is easy. Not breaking the file is the hard part.

Every converter that treats a language file as plain text will eventually ship you a crash. These are the three places it happens.

Placeholders stay placeholders
%@, %lld, %1$s, {name} and {{count}} come out exactly as they went in. A placeholder that got escaped, renumbered or translated is a crash on the device, not a typo.
Plural forms stay separate
Xcode variations, the Android plurals element and gettext msgstr[n] all mean the same thing and all spell it differently. They map onto each other here instead of collapsing into one string. Polish has four forms; all four survive.
Keys keep their shape
Nesting, dotted paths, arrays and translator comments carry across wherever the target format has somewhere to put them. Where it does not, the section below says so.

What does not come across

Written down here, because the alternative is finding out in a broken build.

Only two columns come back out: key and value, plus comment when any entry has one. A status column, a word count or a reviewer name added by the agency is read past, not preserved. Everything else survives, including line breaks and delimiters inside quoted cells.

How it works

  1. Step 1

    Drop the file in

    Drag your CSV onto the left box, pick it with the file button, or paste the text. Nothing is uploaded. The conversion runs in this tab.

  2. Step 2

    Read the result

    The JSON appears as you type. The counter under the box says how many keys came through, so a file that lost half its content is visible immediately.

  3. Step 3

    Copy or download

    Take the text to the clipboard, or download it with the right extension. Swap the arrow to go the other way.

One language file in. 64 languages out.

Converting a format is the part you can do by hand. Translating 3,627 keys into 64 languages without breaking a single placeholder is the part you cannot. On the next release you only pay for the strings that changed.

€19 per month incl. VAT, cancellable monthly.

Questions

Which column names does it recognise?
key or id for the key. For the text: value, target, translation or source, in that order of preference, because a filled-in translation column always wins over the source text. For notes: comment or note.
Will the CSV open correctly in German Excel?
The file is written with a BOM so Excel reads it as UTF-8 rather than Windows-1252. Without it, Größe arrives as Größe. Semicolon-delimited files are detected automatically when reading.
What if a translation contains a comma or a line break?
Handled. The reader tracks quoted state across the whole file rather than splitting on newlines, which is exactly where hand-written CSV readers break: a multi-line translation would otherwise shift every following row by one.
Can I send this file to a translator?
That is the point of the direction. Convert your JSON to CSV, send the spreadsheet, get it back with the value column filled in, convert it back to JSON.