A localization system
for natural-sounding translations.

Learn more

Why did we create Fluent?

Software localization has been dominated by an outdated paradigm: translations that map one-to-one to the English copy. The grammar of the source language imposes limits on the expressiveness of the translation.

We created Fluent to change this paradigm. Translators should be able to use the entire expressive power of their language without asking developers for permission. In Fluent, translations are asymmetric. A simple string in English can map to a complex multi-variant translation in another language.

Fluent makes it possible to cater to the grammar and style of many languages, independently of the source language. It happens in isolation; the fact that one language benefits from more advanced logic doesn’t require any other localization to apply it. Each localization is in control of how complex the translation becomes.

Interactive Walkthrough

The English Translation

In Fluent, most messages are simple text strings identified by an identifier. In the first message in the example, tabs-close-button is the identifier and Close is the value.

Sometimes, translations require a little bit of logic to sound right in the target language. In the tabs-close-tooltip message, the correct variant of the translation depends on the value of the $tabCount variable. The names of the variants, [one] and [other], are standard names of the plural categories defined by the Unicode in CLDR.

On the other hand, when no logic is required, translations in Fluent stay simple. The tabs-close-warning message appears in Firefox when the user tries to close a window with more than one tab. The message is only displayed when the tab count is 2 or more, and so in English, the word tab will always appear as the plural tabs.

-sync-brand-name is a special kind of message in Fluent, called a term. Term identifiers always start with a dash. Terms can be referenced by other messages, but cannot be displayed directly in the app. Referencing terms is a powerful tool for ensuring consistency. Once defined, a translation can be reused in other translations.

The -sync-brand-name term can be referenced from other messages, and it will always resolve to the same value. Terms help enforce style guidelines; they can also be swapped in and out to modify the branding in unofficial builds and on beta release channels.

The Italian Translation

In Italian, the messages from the tabs-close family have a similar structure to their English counterparts. Even if the languages are different, the grammar requirements for these particular messages are similar. Fluent doesn't impose any additional complexity when it's not necessary.

The capitalization rules, however, are different in Italian than in English. Thanks to the asymmetric nature of Fluent, the Italian translation is free to define two facets of the brand name. The default one, [uppercase], is suitable for standalone appearances (sync-dialog-titile) and for beginning of sentences (sync-headline-title).

At the same time, the [lowercase] variant can be explicitly requested by passing the first: "lowercase" parameter when the brand name is used inside a larger sentence in the sync-signedout-title message.

The Polish Translation

The Polish translation illustrates how Fluent caters to yet more complex grammars.

The imperative Close command in tabs-close-button, Zamknij, still remains a simple string, same as in English and in Italian. The other messages in the tabs-close group, however, require a bit more attention to sound well in Polish. It's related to the fact that Polish, a Slavic language, has more plural categories than English (a Germanic language) or Italian (a Romance language). For example, the Polish translation for tab takes a different form for counts of 2, 3, and 4 than it does for 5, 6, or 7. Hence, the tabs-close-warning message requires additional variants in Polish: [few] and [many].

Similar to how Italian needed to vary the forms of -sync-brand-name with regards to the capitalization, the Polish translation defines three variants of the brand name corresponding to three grammatical cases: nominative, genitive, and accusative.

Using terms inside sentences requires care in Polish, which is an inflected language. The Polish translation can reference the specific term variant corresponding to the genitive declension to construct a grammatically correct sentence in the sync-signedout-title message.