---
title: "Translate Java, INI, Fluent and PHP files"
description: "Translate Java .properties, INI, Joomla, Inno Setup and .lang files, Mozilla Fluent .ftl and PHP language files up to 4 MB, with keys, comments and placeholders kept."
canonical: "https://ai-glot.com/docs/formats/java-ini-fluent-php"
updated: "2026-10-12"
---

# Translate Java, INI, Fluent and PHP files

Four resource formats share this page because they share the same promise: keys and structure stay as written, and only the values change. Each is accepted up to **4 MB**. Each has its own quoting and placeholder rules, listed below. All four hold **one language per file**.

> **Tip: Try it free**
>
> Drop a file of up to 2 MB on the free translators for [Java properties](https://ai-glot.com/file-formats/properties-translation), [INI](https://ai-glot.com/file-formats/ini-translation), [Fluent](https://ai-glot.com/file-formats/fluent-translation) or [PHP language files](https://ai-glot.com/file-formats/php-translation) to try them with no account, five files a day. The app, the API and the CLI take files up to 4 MB.

## Java properties (`.properties`)

Keys, the separator (`=` or `:`), comments and blank lines come back as written. MessageFormat placeholders such as `{0}` and `{0,number,currency}` are kept with their index and format type. The bundle is read and written as **UTF-8**: save an old ISO-8859-1 bundle as UTF-8 first. A value continued on the next line with a trailing backslash is not supported yet, and only the first line of it is translated, so put each value on one line before you upload.

**A Spring bundle**

messages.properties becomes `messages_fr.properties.`

Translate the values into French. Keep MessageFormat placeholders such as \{0} and \{1,number} unchanged, and leave keys and comments as they are.

## INI, Joomla, Inno Setup and `.lang` (`.ini`, `.isl`, `.lang`)

Keys, `[sections]`, comments and quoting stay as written. The file is rewritten line by line, so a line you did not need translated comes back byte for byte. A quoted value stays quoted, and a quote inside a translation is escaped the way that line already escaped it, including Joomla's `"_QQ_"`. Unquoted values are written literally, because in Inno Setup a quote would become part of the text. An INI value is one line: a line break in a translation becomes a space. A file that is **not UTF-8** (Inno Setup files are often Windows-1252) is refused rather than converted, so save it as UTF-8 first.

**A Joomla language file**

Keeps the `COM_` keys and the quoting.

Translate the values into German. Keep placeholders such as %s, %d and \[name] unchanged, and leave all keys and comments as they are.

**An Inno Setup installer**

Only the message sections of an .isl file.

Translate only the \[Messages] and \[CustomMessages] sections into Spanish. Keep %1 and %n unchanged.

## Fluent (`.ftl`)

Used by Firefox, Thunderbird and many apps. Message ids, attribute names and term names come back exactly as sent. Variables such as `{ $count }` are protected, and every plural or select variant (`[one]`, `*[other]`) is translated as its own string while the variant keys never change. The file is not reformatted: each translation is written where the original text was. A literal brace, or a line starting with `[`, `*` or a dot, is escaped so the file stays valid.

**A Fluent catalogue**

Translates messages, attributes and every plural variant.

Translate into Italian. Keep variables such as \{ $count } and \{ $name } unchanged, and translate every plural variant in context.

## PHP language files (`.php`)

For Laravel, Symfony, CodeIgniter and PrestaShop language files: a `return [ ... ]` or `array( ... )` of messages, `$lang[...]` assignments and `$_MODULE` strings. **Only plain string values change.** Array keys, function arguments, concatenations, heredocs and any other code come back exactly as they were, and each string keeps its own quoting. Placeholders such as `:attribute`, `{field}`, `%s` and `$name` are kept. A PHP file that is not a language file is refused rather than guessed at: AI Glot does not translate code. A Laravel plural such as `"one apple|:count apples"` is one plain string, so check the number of forms your language needs in the result.

**Laravel validation messages**

Keeps the :attribute placeholders working.

Translate the messages into Portuguese. Keep :attribute, :min, :max and %s unchanged, and do not change array keys.

## Good to know

- **One target language per upload** for all four formats. If you ask for two, the plan translates one and says so. Run the file once per language: your [glossary](/docs/platform/glossaries) carries over, so the German file uses the same terms as the French one.
- **Several files at once.** Put a `lang` folder in a [ZIP](/docs/formats/zip) to translate it in one job.
- **Output filter.** Not available for these formats: the whole file comes back.
- **Ceiling.** 4 MB for all four.

## Related

- [YAML and TOML](/docs/formats/yaml-and-toml), [JSON](/docs/formats/json) and [gettext PO](/docs/formats/gettext-po) for other locale formats.
- [All file formats](/docs/formats)
