CINXE.COM
Project Fluent
<!doctype html> <html lang="en"> <head> <base href="https://projectfluent.org/"> <meta charset="utf-8"> <title>Project Fluent</title> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="icon shortcut" href="/favicon.50a2a6f6.ico"> <link rel="stylesheet" href="/index.74f83d51.css"> <link rel="stylesheet" href="/index.5c8efff5.css"> <link href="https://fonts.googleapis.com/css?family=Sarina" rel="stylesheet"> <script type="module" src="/index.ba1a16fd.js"></script> <script src="/index.f6c91609.js" nomodule defer></script> <meta http-equiv="X-Translated-By" content="Google"> <meta http-equiv="X-Translated-To" content="iw"> <script type="text/javascript" src="https://www.gstatic.com/_/translate_http/_/js/k=translate_http.tr.en_GB.1hbgkFx4Qn8.O/am=DgY/d=1/rs=AN8SPfqlmAPxwfG457BPbRXwNq39oSMGHg/m=corsproxy" data-sourceurl="https://projectfluent.org/"></script> <link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL,GRAD@20..48,100..700,0..1,-50..200" rel="stylesheet"> <script type="text/javascript" src="https://www.gstatic.com/_/translate_http/_/js/k=translate_http.tr.en_GB.1hbgkFx4Qn8.O/am=DgY/d=1/exm=corsproxy/ed=1/rs=AN8SPfqlmAPxwfG457BPbRXwNq39oSMGHg/m=phishing_protection" data-phishing-protection-enabled="false" data-forms-warning-enabled="true" data-source-url="https://projectfluent.org/"></script> <meta name="robots" content="none"> </head> <body> <script type="text/javascript" src="https://www.gstatic.com/_/translate_http/_/js/k=translate_http.tr.en_GB.1hbgkFx4Qn8.O/am=DgY/d=1/exm=corsproxy,phishing_protection/ed=1/rs=AN8SPfqlmAPxwfG457BPbRXwNq39oSMGHg/m=navigationui" data-environment="prod" data-proxy-url="https://projectfluent-org.translate.goog" data-proxy-full-url="https://projectfluent-org.translate.goog/?_x_tr_sl=pl&_x_tr_tl=iw&_x_tr_hl=en-GB" data-source-url="https://projectfluent.org/" data-source-language="pl" data-target-language="iw" data-display-language="en-GB" data-detected-source-language="" data-is-source-untranslated="false" data-source-untranslated-url="https://translate.google.com/website?sl=pl&tl=iw&hl=en-GB&u=https://projectfluent.org/&anno=2" data-client="tr"></script> <div> <nav id="topbar"> <div class="logo"><a href="https://projectfluent-org.translate.goog/?_x_tr_sl=pl&_x_tr_tl=iw&_x_tr_hl=en-GB">fluent</a> </div> <ul> <li><a href="https://projectfluent-org.translate.goog/play?_x_tr_sl=pl&_x_tr_tl=iw&_x_tr_hl=en-GB">Playground</a></li> <li></li> <li><a href="https://projectfluent-org.translate.goog/fluent/guide?_x_tr_sl=pl&_x_tr_tl=iw&_x_tr_hl=en-GB">Syntax Guide</a></li> <li><a href="https://translate.google.com/website?sl=pl&tl=iw&hl=en-GB&u=https://github.com/projectfluent/fluent/wiki">Documentation</a></li> <li><a href="https://translate.google.com/website?sl=pl&tl=iw&hl=en-GB&u=https://github.com/projectfluent">GitHub</a></li> </ul> </nav> </div> <div> <header id="intro"> <h1>Fluent</h1> <h2>A localization system<br> for natural-sounding translations.</h2><a href="https://translate.google.com/website?sl=pl&tl=iw&hl=en-GB&u=https://github.com/projectfluent/fluent/wiki/" class="cta">Learn more</a> </header> </div> <div> <main id="above-the-fold"> <ul> <li><h1>Asymmetric Localization</h1><p>Natural-sounding translations with genders and grammatical cases only when necessary. Expressiveness is not limited by the grammar of the source language.</p></li> <li><h1>Progressive Enhancement</h1><p>Translations are isolated; locale-specific logic doesn't leak to other locales. Authors can iteratively improve translations without impact on other languages.</p></li> <li><h1>Fully-Featured</h1><p>Date, time, and number formatting. Plural categories. Bidirectionality support. Custom formatters. Easy-to-read syntax. Runtime translation and re-translation. Robust error handling.</p></li> <li><h1>Open Source</h1><p>Fluent Syntax 1.0 was <a href="https://translate.google.com/website?sl=pl&tl=iw&hl=en-GB&u=https://hacks.mozilla.org/2019/04/fluent-1-0-a-localization-system-for-natural-sounding-translations/">released in April 2019</a>. Client- and server-side implementations in <a href="https://translate.google.com/website?sl=pl&tl=iw&hl=en-GB&u=https://github.com/projectfluent/fluent.js">JS</a>, <a href="https://translate.google.com/website?sl=pl&tl=iw&hl=en-GB&u=https://github.com/projectfluent/python-fluent">Python</a>, and <a href="https://translate.google.com/website?sl=pl&tl=iw&hl=en-GB&u=https://github.com/projectfluent/fluent-rs">Rust</a>. <a href="https://translate.google.com/website?sl=pl&tl=iw&hl=en-GB&u=https://github.com/projectfluent/fluent.js/tree/master/fluent-react">React</a> bindings. Licensed under the <a href="https://translate.google.com/website?sl=pl&tl=iw&hl=en-GB&u=https://www.apache.org/licenses/LICENSE-2.0">Apache 2.0 License</a>.</p></li> </ul> <aside id="demo-app" class="example-vertical"></aside> </main> </div> <div> <section id="explainer"> <h1>Why did we create Fluent?</h1> <p>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.</p> <p>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.</p> <p>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鈥檛 require any other localization to apply it. Each localization is in control of how complex the translation becomes.</p> </section> </div> <div> <section id="examples"> <h1>Interactive Walkthrough</h1> <article> <div id="example1-app" class="example-vertical"></div> <div class="example-description"> <h2>The English Translation</h2> <p>In Fluent, most messages are simple text strings identified by an <em>identifier</em>. In the first message in the example, <code>tabs-close-button</code> is the identifier and <code>Close</code> is the value.</p> <p>Sometimes, translations require a little bit of logic to sound right in the target language. In the <code>tabs-close-tooltip</code> message, the correct variant of the translation depends on the value of the <code>$tabCount</code> variable. The names of the variants, <code>[one]</code> and <code>[other]</code>, are standard names of the plural categories defined by the Unicode in <a href="https://translate.google.com/website?sl=pl&tl=iw&hl=en-GB&u=http://cldr.unicode.org/index/cldr-spec/plural-rules">CLDR</a>.</p> <p>On the other hand, when no logic is required, translations in Fluent stay simple. The <code>tabs-close-warning</code> 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 <em>tab</em> will always appear as the plural <em>tabs</em>.</p> <p><code>-sync-brand-name</code> is a special kind of message in Fluent, called a <em>term</em>. 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.</p> <p>The <code>-sync-brand-name</code> 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.</p> </div> </article> <article> <div id="example2-app" class="example-vertical"></div> <div class="example-description"> <h2>The Italian Translation</h2> <p>In Italian, the messages from the <code>tabs-close</code> 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.</p> <p>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, <code>[uppercase]</code>, is suitable for standalone appearances (<code>sync-dialog-title</code>) and for beginning of sentences (<code>sync-headline-title</code>).</p> <p>At the same time, the <code>[lowercase]</code> variant can be explicitly requested by passing the <code>first: "lowercase"</code> parameter when the brand name is used inside a larger sentence in the <code>sync-signedout-title</code> message.</p> </div> </article> <article> <div id="example3-app" class="example-vertical"></div> <div class="example-description"> <h2>The Polish Translation</h2> <p>The Polish translation illustrates how Fluent caters to yet more complex grammars.</p> <p>The imperative <em>Close</em> command in <code>tabs-close-button</code>, <em>Zamknij</em>, still remains a simple string, same as in English and in Italian. The other messages in the <code>tabs-close</code> 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 <em>tab</em> takes a different form for counts of 2, 3, and 4 than it does for 5, 6, or 7. Hence, the <code>tabs-close-warning</code> message requires additional variants in Polish: <code>[few]</code> and <code>[many]</code>.</p> <p>Similar to how Italian needed to vary the forms of <code>-sync-brand-name</code> with regards to the capitalization, the Polish translation defines three variants of the brand name corresponding to three grammatical cases: <em>nominative</em>, <em>genitive</em>, and <em>accusative</em>.</p> <p>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 <em>genitive</em> declension to construct a grammatically correct sentence in the <code>sync-signedout-title</code> message.</p> </div> </article> </section> </div> <div> <footer> <p>Fluent is a research project by <a href="https://translate.google.com/website?sl=pl&tl=iw&hl=en-GB&u=https://mozilla.org">Mozilla</a>. Content available under the <a rel="license" href="https://translate.google.com/website?sl=pl&tl=iw&hl=en-GB&u=https://mozilla.org/en-US/foundation/licensing/"> Creative Commons BY-SA 3.0</a> license.</p> <ul> <li><a href="https://translate.google.com/website?sl=pl&tl=iw&hl=en-GB&u=https://www.mozilla.org/en-US/privacy/">Privacy</a></li> <li><a href="https://translate.google.com/website?sl=pl&tl=iw&hl=en-GB&u=https://www.mozilla.org/en-US/privacy/websites/">Website Privacy Notice</a></li> <li><a href="https://translate.google.com/website?sl=pl&tl=iw&hl=en-GB&u=https://www.mozilla.org/en-US/privacy/websites/%23cookies">Cookies</a></li> <li><a href="https://translate.google.com/website?sl=pl&tl=iw&hl=en-GB&u=https://www.mozilla.org/en-US/about/legal/">Legal</a></li> </ul> </footer> </div> <script>function gtElInit() {var lib = new google.translate.TranslateService();lib.translatePage('pl', 'iw', function () {});}</script> <script src="https://translate.google.com/translate_a/element.js?cb=gtElInit&hl=en-GB&client=wt" type="text/javascript"></script> </body> </html>