Free tool
Convert .resx to JSON
.NET resource files on one side, plain i18n JSON on the other, with the resheader block Visual Studio insists on when you go back.
Runs in your browser. No account, no upload, nothing leaves your machine.
Runs in your browser. The file is never uploaded.
The four header blocks you cannot omit
A .resx is XML, so writing one looks trivial until Visual Studio refuses to open the result. The file needs four resheader entries (resmimetype, version, reader and writer, the last two with fully qualified assembly names) or the designer treats it as corrupt. This tool writes all four. It also puts xml:space="preserve" on every entry, because without it the .NET reader trims leading and trailing whitespace, and those are exactly the spaces that separate the words in "Hello " + name.
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.
Binary resources are skipped on the way in. A data element carrying a type or mimetype attribute is an embedded image, icon or serialized object; writing its base64 body into a translation file as if it were a string is not a conversion, it is garbage in your language file. Comments survive in both directions.
How it works
- Step 1
Drop the file in
Drag your .resx onto the left box, pick it with the file button, or paste the text. Nothing is uploaded. The conversion runs in this tab.
- 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.
- 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
- Will Visual Studio open the .resx this produces?
- Yes. The four required resheader entries are written on every file, and each entry gets xml:space="preserve" so whitespace at the ends of strings is not silently trimmed.
- What happened to my images?
- Deliberately skipped. Entries with a type or mimetype attribute hold binary data, not text. Converting them to JSON would produce megabytes of base64 that no translator can act on, and the round trip back would not reproduce a valid image resource.
- Do the comments come across?
- Yes, both ways. A comment element inside a data element becomes the translator note, and going back it is written into a comment element again.
- Does this work for .resx files from ASP.NET Core?
- Yes. It is the same format WinForms, WPF and ASP.NET all use. Only the naming convention around culture suffixes differs, and that is a filename question, not a file format question.