{"id":294,"date":"2026-06-11T15:16:52","date_gmt":"2026-06-11T15:16:52","guid":{"rendered":"https:\/\/www.forethought-studio.com\/translate\/properties\/"},"modified":"2026-06-11T18:13:48","modified_gmt":"2026-06-11T18:13:48","slug":"properties","status":"publish","type":"page","link":"https:\/\/www.forethought-studio.com\/translate\/properties\/","title":{"rendered":".properties translator that runs in your browser"},"content":{"rendered":"<p class=\"dft-page-lede\">Drop a .properties file in below, pick a target language, download the translated file. The .properties file stays on your device.<\/p>\n<div class=\"dft-mount dft-app\" data-format=\"properties\"><noscript><p class=\"df-noscript-message\">This translator requires JavaScript in your browser.<\/p><\/noscript><section class=\"dft-step dft-step-file dft-skeleton\" data-state=\"active\" aria-hidden=\"true\"><header class=\"dft-step-header\"><span class=\"dft-step-number\">1<\/span><h2 class=\"dft-step-title\">Add your PROPERTIES file<\/h2><span class=\"dft-step-hint\">or paste anywhere<\/span><\/header><div class=\"dft-dropzone-wrap\"><div class=\"dft-dropzone\"><div class=\"dft-dropzone-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 24 24\" width=\"48\" height=\"48\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M14 3v4a1 1 0 0 0 1 1h4\"\/><path d=\"M17 21H7a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h7l5 5v11a2 2 0 0 1-2 2z\"\/><path d=\"M12 11v6\"\/><path d=\"M9 14l3-3 3 3\"\/><\/svg><\/div><p class=\"dft-dropzone-primary\">Drop a PROPERTIES file anywhere, <span class=\"dft-dropzone-click\">click to choose<\/span>, or paste contents<\/p><\/div><p class=\"dft-dropzone-secondary\">PROPERTIES files only. Files stay on your device.<\/p><\/div><\/section><section class=\"dft-step dft-step-language dft-skeleton\" data-state=\"future\" aria-hidden=\"true\"><header class=\"dft-step-header\"><span class=\"dft-step-number\">2<\/span><h2 class=\"dft-step-title\">Choose target language<\/h2><\/header><div class=\"dft-language-body\"><label class=\"dft-target-label\">Translate to<\/label><select class=\"dft-target-select\" disabled aria-hidden=\"true\"><option>Select language<\/option><\/select><\/div><\/section><section class=\"dft-step dft-step-progress dft-skeleton\" data-state=\"future\" aria-hidden=\"true\"><header class=\"dft-step-header\"><span class=\"dft-step-number\">3<\/span><h2 class=\"dft-step-title\">Translating<\/h2><\/header><\/section><section class=\"dft-step dft-step-review dft-skeleton\" data-state=\"future\" aria-hidden=\"true\"><header class=\"dft-step-header\"><span class=\"dft-step-number\">4<\/span><h2 class=\"dft-step-title\">Review<\/h2><\/header><\/section><div class=\"df-loading-overlay\" role=\"status\" aria-live=\"polite\"><span class=\"df-loading-overlay-spinner\" aria-hidden=\"true\"><\/span><span class=\"df-loading-overlay-label\">Loading translator...<\/span><\/div><\/div>\n<h2>How it works<\/h2>\n<p>Drop a .properties file on the page, click to choose one, or paste the contents straight in. The parser reads the file in your browser and tells you how many strings still need translation. Pick a target language and translation starts immediately. The translated file is reassembled from the same parsed structure so the original comments, key order, separator choice, and continuation-line layout all survive the round trip.<\/p>\n<h2>Quality Warning<\/h2>\n<p>Please don&#8217;t rely on the quality of these translations to ship a finalized product. This is just a starting point. It&#8217;s machine translation and there are no guarantees about its quality.<\/p>\n<h2>What we do not do<\/h2>\n<p>The file itself never leaves your device. We do not see what you are translating, we do not store any of the strings, and there is nothing about your file in our logs. The privacy wedge in DropFormat is structural: the .properties parser, the Google Translate caller, and the file writer all run inside your browser tab.<\/p>\n<p>What does leave your device: the individual strings go to <code>translate.googleapis.com<\/code> the same way they would if you pasted them into translate.google.com yourself. We are not in the middle. If your file contains internal product strings you do not want a third party to see, do not translate it here; use an offline tool.<\/p>\n<h2>What it supports<\/h2>\n<p>.properties is the plain-text resource-bundle format Java has shipped since the 1990s and that Spring, Spring Boot, Struts, Android (legacy), Eclipse plugins, and many other JVM and IDE ecosystems still use today. Each line is a &#8220;key = value&#8221; pair (or &#8220;key : value&#8221;, or &#8220;key value&#8221;, since the spec allows all three separators). We preserve all of it on round trip: insertion order, comment lines (both <code>#<\/code> and <code>!<\/code> styles), blank lines, indentation, and per-line separator choice.<\/p>\n<p>Escape sequences are first class. The parser unescapes <code>\\n<\/code>, <code>\\t<\/code>, <code>\\r<\/code>, <code>\\f<\/code>, <code>\\\\<\/code>, <code>\\=<\/code>, <code>\\:<\/code>, <code>\\#<\/code>, <code>\\!<\/code>, and <code>\\uXXXX<\/code> Unicode escapes before translation. The compiler re-escapes them on the way out, so the output file reloads byte-equivalent in any spec-compliant Properties reader (<code>java.util.Properties.load<\/code>, Spring&#8217;s <code>PropertyResourceBundle<\/code>, Android&#8217;s resource loader, IntelliJ&#8217;s localization plugin).<\/p>\n<p>Continuation lines are joined on parse. A line ending in a single backslash continues onto the next physical line; the joined value is what gets translated. On download every entry is emitted on a single line. The file still loads identically because continuation is syntactic sugar.<\/p>\n<p>Java .properties has no native plural concept (the JVM solution is ICU <code>MessageFormat<\/code> patterns inside the value string), so every entry here is a flat single-form key\/value pair. Placeholders like <code>{0}<\/code> and <code>{userName}<\/code> pass through the translator unchanged.<\/p>\n<p>Not yet: locale variants encoded in the file name (e.g. <code>messages_fr_CA.properties<\/code>) are not auto-renamed on download; the output keeps the original file name with a <code>.translated.properties<\/code> suffix. Rename it to match your locale convention before placing it in your resource bundle.<\/p>\n<p><!-- TOLERANCES:START --><\/p>\n<h2>What we tolerate, and what we reject<\/h2>\n<p>Some malformed files we repair on the way in. Others we refuse to load so we do not make things worse. This list is the parser&#8217;s actual behaviour, generated from the format module itself, not aspirational copy.<\/p>\n<p><strong>Repaired automatically:<\/strong><\/p>\n<ul class=\"dft-tolerance-list dft-tolerance-repairs\">\n<li data-tolerance-id=\"bom-stripped\">UTF-8 byte order mark (BOM) at the start of the file<\/li>\n<li data-tolerance-id=\"crlf-normalized\">Windows (CRLF) or mixed line endings<\/li>\n<li data-tolerance-id=\"truncated-tail\">File truncated mid-line at the tail (we keep complete lines)<\/li>\n<\/ul>\n<p><strong>Refused with an explanation:<\/strong><\/p>\n<ul class=\"dft-tolerance-list dft-tolerance-rejects\">\n<li data-tolerance-id=\"PROPERTIES_EMPTY\"><strong>Empty file.<\/strong> Add at least one key=value line and re-upload.<\/li>\n<li data-tolerance-id=\"PROPERTIES_NO_ENTRIES\"><strong>No translatable entries (comments only).<\/strong> Add at least one key=value line.<\/li>\n<li data-tolerance-id=\"PROPERTIES_NOT_PROPERTIES\"><strong>Looks like a different translation format (PO, ARB, XLIFF, .xcstrings).<\/strong> Use the \/translate\/ hub to pick the right translator.<\/li>\n<\/ul>\n<p><!-- TOLERANCES:END --><\/p>\n<h2>Common questions<\/h2>\n<p><strong>Why is the translation in some cases worse than the Google Translate website?<\/strong> The free endpoint we use is the same one the Google Translate website uses, but the API does not always know about the context the website&#8217;s interface provides. For names, branded terms, or jargon, expect to override in the review pane.<\/p>\n<p><strong>What if I am translating something Google&#8217;s endpoint will not accept?<\/strong> The free endpoint occasionally returns the source unchanged for content it would rather not translate. Those entries show &#8220;kept original&#8221; in the review pane so you can hand-translate just those.<\/p>\n<p><strong>Does it cache anything?<\/strong> No. Each run starts fresh.<\/p>\n<p><strong>Will the output be a valid .properties file?<\/strong> Yes. The compiler re-escapes structurally meaningful characters and emits one entry per line. The file loads cleanly in <code>java.util.Properties.load<\/code>, Spring&#8217;s resource-bundle loader, and any IDE plugin that reads .properties.<\/p>\n<p><strong>What about MessageFormat \/ ICU patterns inside values?<\/strong> The translator treats them as opaque strings and passes them through unchanged. Placeholder protection (the same masking layer the PO and XLIFF translators use) keeps <code>{0}<\/code>, <code>{userName}<\/code>, and similar from being mangled by the machine translator.<\/p>\n<p><strong>What about ISO-8859-1 .properties files?<\/strong> The legacy Java spec required ISO-8859-1 encoding with <code>\\uXXXX<\/code> escapes for non-ASCII characters. Modern Java accepts UTF-8 too. We assume UTF-8 on input; if you have a legacy ISO-8859-1 file, save it as UTF-8 first.<\/p>\n<h2>Why this exists<\/h2>\n<p>Most JVM localization tooling expects you to either pay for a managed translation service or run a CLI against your local files. This tool sits in between: free, browser-based, no upload, designed for the &#8220;I just need a fast first pass on this resource bundle&#8221; workflow. Drop the .properties, pick the language, get back a translated file in the same shape.<\/p>\n<h2>What is .properties?<\/h2>\n<p>.properties is the plain-text resource-bundle format defined by <code>java.util.Properties<\/code> in the Java standard library. Each file is a flat list of &#8220;key = value&#8221; pairs that the JVM loads at startup to localize an application&#8217;s UI strings, configuration defaults, or any other text the runtime needs to swap by locale. The format predates JSON, XML resource files, and most modern alternatives, so it shows up across Java, Spring, Spring Boot, Struts, JBoss, Eclipse plugins, IntelliJ plugins, legacy Android resource bundles, and a long tail of JVM-adjacent tools (Gradle, Maven, Ant). A typical resource bundle is a family of files like <code>messages.properties<\/code>, <code>messages_fr.properties<\/code>, <code>messages_de.properties<\/code>; the JVM picks the right file based on the user&#8217;s locale and falls back to the base file when a translation is missing.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Drop a .properties file in below, pick a target language, download the translated file. The .properties file stays on your device. How it works Drop a .properties file on the page, click to choose one, or paste the contents straight in. The parser reads the file in your browser and tells you how many strings [&hellip;]<\/p>\n","protected":false},"author":0,"featured_media":0,"parent":274,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-294","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.forethought-studio.com\/convert\/wp-json\/wp\/v2\/pages\/294","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.forethought-studio.com\/convert\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.forethought-studio.com\/convert\/wp-json\/wp\/v2\/types\/page"}],"replies":[{"embeddable":true,"href":"https:\/\/www.forethought-studio.com\/convert\/wp-json\/wp\/v2\/comments?post=294"}],"version-history":[{"count":1,"href":"https:\/\/www.forethought-studio.com\/convert\/wp-json\/wp\/v2\/pages\/294\/revisions"}],"predecessor-version":[{"id":308,"href":"https:\/\/www.forethought-studio.com\/convert\/wp-json\/wp\/v2\/pages\/294\/revisions\/308"}],"up":[{"embeddable":true,"href":"https:\/\/www.forethought-studio.com\/convert\/wp-json\/wp\/v2\/pages\/274"}],"wp:attachment":[{"href":"https:\/\/www.forethought-studio.com\/convert\/wp-json\/wp\/v2\/media?parent=294"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}