Upload your .properties files, translate values while keeping interpolation and comments intact, and export a file your JVM app loads without changes.
# Polish
user.hello=Witaj, {0}
login.title=Zaloguj się
login.email=Adres e-mail
login.password=Hasło
login.button=ZalogujEach line pairs a key and a value with an equals sign, comments start with #, and one file holds one language, typically named like messages_pl-PL.properties. Java's standard library reads the format natively, so there is no parsing step at runtime.
Dynamic values use {0} positional interpolation, or named parameters like {name}, both read and written back exactly as they were.
Properties messages = new Properties();
messages.load(
new FileInputStream("messages_en.properties")
);Beyond key and value
Tabs, newlines, # and = are escaped on export and unescaped on import by default.
Optional options keep single quotes safe with Spring's MessageSource, so MessageFormat parsing doesn't break.
Files are encoded in UTF-8, matching the default Java has used since Java 9.
Positional {0} and named {name} placeholders stay intact through auto-translation.
End-to-end workflow
Upload a source messages_en.properties file, translate values while keeping interpolation intact, and download one file per language.
simplelocalize upload \
--apiKey PROJECT_API_KEY \
--uploadFormat java-properties \
--uploadPath ./messages_en.propertiesmessages_en.properties to SimpleLocalize with the CLI. Comments and {0} / {name} interpolation import as-is.simplelocalize download \
--apiKey PROJECT_API_KEY \
--downloadFormat java-properties \
--downloadPath ./messages_{lang}.properties \
--downloadOptions ESCAPE_SINGLE_QUOTESMessageSource, add ESCAPE_SINGLE_QUOTES on export (and UNESCAPE_SINGLE_QUOTES on import) so quotes survive MessageFormat parsing.user.hello=Witaj, {0}
login.title=Zaloguj sięsimplelocalize download \
--apiKey PROJECT_API_KEY \
--downloadFormat java-properties \
--downloadPath ./messages_{lang}.propertiesmessages_{lang}.properties, ready to drop next to your existing bundles with no renaming step.Java Properties files historically used ISO-8859-1 encoding, limited to a small character set. Since Java 9, the default changed to UTF-8, and SimpleLocalize encodes every properties file in UTF-8 to match. If your app still expects the older default, set the encoding explicitly.
A lesser-known option: *.properties content can also be represented as XML, using a <properties> root and one <entry> per key, still loadable through Java's native Properties class.
<?xml version="1.0" encoding="utf-8"?>
<properties>
<entry key="hello-world">Witaj Świecie</entry>
<entry key="sign-in">Zaloguj się</entry>
</properties>For developers
The details that break a hand-edited properties file are handled automatically on import and export.
Special characters like tabs, newlines, # and = are escaped on export and unescaped on import, by default.
Optional import and export options keep single quotes safe with Spring's MessageSource, so MessageFormat parsing doesn't break.
Translate new and changed messages with DeepL, Google Translate, OpenAI, Claude or Gemini.
Upload and download properties files from the CLI, or automate the same logic through the REST API.

Every JVM language
Read natively by every JVM-based language, and used for configuration as well as translations.




Not the only option
Property files are the JVM default, but SimpleLocalize supports the same project in any of these formats too.
More conversions
Free online converter, no account required. Upload a .properties file and download it in the format you need.
See the latest news from our blog, including product updates, tutorials, and more.

A practical guide to Java internationalization across LTS versions. Learn how Locale, ResourceBundle, DateTimeFormatter, and number formatting work in Java 21, Java 25 LTS, and Java 26.

Learn how to implement internationalization in Spring Boot 3.5 application. Translate page and email using message.properties files, Thymeleaf templates, LocaleResolver, and more.
Yes. Characters like \t, \n, \r, \f, backslash, # and = are escaped on export and unescaped on import by default, with no configuration needed.
Add the ESCAPE_SINGLE_QUOTES export option (and UNESCAPE_SINGLE_QUOTES on import) so single quotes survive MessageFormat parsing, and remember to set alwaysUseMessageFormat to true in your bean configuration.
UTF-8, matching the default Java has used since Java 9. Older ISO-8859-1 based projects should set their encoding explicitly if they haven't migrated.
Any JVM-based application: Java, Spring Boot, Kotlin, Scala and Groovy projects, plus tools like the Thymeleaf template engine, all read translations from .properties files.