HackerReposA FIELD GUIDE TO OPEN SOURCE
ProSponsor the shelf♧ 0
← Back to top all-time
projectfluent
fluent
JavaScript2018–2026
projectfluent / fluent

fluent

Fluent — planning, spec and documentation

10Distinct people
16Mentions
0Explicit recommenders
1.7KGitHub stars
REPOSITORY AT A GLANCE

What to know before exploring

What it is

Fluent — planning, spec and documentation

GitHub

Where it is used

No documented product use has been verified yet.

What people are saying

No recommendation phrase was found in the indexed comments.

No classified warning is attached to this page. Read the discussions before treating silence as approval.

Also in these discussions

No other repository is repeatedly linked in the same discussions.

This week on Hacker News

Nov 8–Nov 15 UTC · Direct repository links and separately labeled related project stories. Indexed through 11/15/2026, 12:45:45 PM UTC.

No direct repository links were found in the indexed HN discussions over the past seven days. Older discussions are available below.

Mentions over time

HN mentions by year16 dated mentions

Observed mentions: 2018-04-05 14:41:50 UTC to 2026-02-17 11:22:59 UTC.

0123452018-01-01 00:00:00 UTC to 2019-01-01 00:00:00 UTC (exclusive): 2 mentions; 0 submissions, 2 comments20182019-01-01 00:00:00 UTC to 2020-01-01 00:00:00 UTC (exclusive): 5 mentions; 0 submissions, 5 comments2020-01-01 00:00:00 UTC to 2021-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2021-01-01 00:00:00 UTC to 2022-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments2022-01-01 00:00:00 UTC to 2023-01-01 00:00:00 UTC (exclusive): 0 mentions; 0 submissions, 0 comments20222023-01-01 00:00:00 UTC to 2024-01-01 00:00:00 UTC (exclusive): 4 mentions; 0 submissions, 4 comments2024-01-01 00:00:00 UTC to 2025-01-01 00:00:00 UTC (exclusive): 1 mentions; 1 submissions, 0 comments2025-01-01 00:00:00 UTC to 2026-01-01 00:00:00 UTC (exclusive): 1 mentions; 0 submissions, 1 comments2026-01-01 00:00:00 UTC to 2027-01-01 00:00:00 UTC (exclusive): 3 mentions; 0 submissions, 3 comments. Incomplete calendar period.2026*

* An incomplete calendar period is marked with an outlined bar. Its count is not directly comparable with a full period.

Counts come from the repository’s dated source evidence. Index cutoff: 2026-11-02 08:16:59 UTC.

View mention counts and date ranges
UTC ranges include their start and exclude their end. Select a period to filter the source evidence.
PeriodStart (UTC)End (exclusive, UTC)MentionsSubmissionsComments
20182018-01-01 00:00:00 UTC2019-01-01 00:00:00 UTC202
20192019-01-01 00:00:00 UTC2020-01-01 00:00:00 UTC505
20202020-01-01 00:00:00 UTC2021-01-01 00:00:00 UTC000
20212021-01-01 00:00:00 UTC2022-01-01 00:00:00 UTC000
20222022-01-01 00:00:00 UTC2023-01-01 00:00:00 UTC000
20232023-01-01 00:00:00 UTC2024-01-01 00:00:00 UTC404
20242024-01-01 00:00:00 UTC2025-01-01 00:00:00 UTC110
20252025-01-01 00:00:00 UTC2026-01-01 00:00:00 UTC101
2026 (partial)2026-01-01 00:00:00 UTC2027-01-01 00:00:00 UTC303

What Hacker News says

16 sources
Definitely the former, apologies for making it confusing. > What is the equivalent of xgettext.pl There is no standard one, although people build their own. The general consensus is that source strings should not be inlined into code. The closest analogy is to "style" vs "class" in HTML/CSS - the clean separation of concerns comes from the "id" being the contract. You can read more about it here: https://github.com/projectfluent/fluent/wiki/Fluent-vs-gette... There are attempts to "merge" those two philosophies, by extracting and "generating" slugs as ids. Examples: - https://formatjs.github.io/docs/getting-started/message-extr... - https://lingui.dev/guides/message-extraction - https://app.studyraid.com/en/read/15768/550728/setting-up-th... I'm fairly skeptical of this approach. > the file extension for the main catalog file `.po` In
Read the rest
MF1.0 world, the file format is JSON or XML. You encode id=>Message pairs. In Fluent world there is a Fluent (FTL) file format. In MF2.0 the format itself is, again, message scoped. On top of it there's a proposal by Mozilla to create MessageResource - https://github.com/w3c/i18n-discuss/blob/gh-pages/explainers... and that may feed into DOM L10n - https://github.com/mozilla/explainers/blob/main/dom-localiza... > the __ function? see the (1) and links to "generated ids". > How does gender work (small example)? MF 1.0: ``` {GENDER, select, male {He answered} female {She answered} other {They answered} } ``` Fluent: ``` user-answered = { $gender -> [male] He answered. [female] She answered. *[other] They answered. } ``` > How does layering pt_BR on pt_PT work? MF does not prescribe fallback behavior. It also more popular to treat each locale as "complete" and fill "gaps" at build time. So at runtime you have `pt-BR` which has pt-BR strings and missing ones "completed" from `pt` (parent locale). Fluent has a "resource manager" (simple one like this: https://github.com/projectfluent/fluent-rs/tree/main/fluent-... or more complex like Mozilla L10nRegistry), which can fallback at runtime, allowing for what we call "partial locales" which can roll out to production with gaps and the resource manager will fetch the fallback strings from the parent locale. > What is a compelling reason to switch? If you and your users are happy with gettext, none! If either of those groups complain, there may be many: - https://github.com/projectfluent/fluent/wiki/Fluent-vs-gette... Hope that helps!
In MessageFormat: Unicode standard for localizable message strings
I think modern Japanese is LTR, but besides that - I believe the project you worked in the past solves an important problem. Besides pluralization (and e.g. Arabic having 6 forms zero/one/two/few/many/other), turned out number internationalization and currency conversion are big next challenges the community wants to address next. > create ICU compliant JSON. I think this is an excellent idea. I have a feeling in the future we will need ICU v2.0, sort of, but unfortunately it's an extremely hard problem and the probability to fail is pretty high (looks like project fluent is not actively maintained anymore: https://github.com/projectfluent/fluent)
In Show HN: Localize React apps without rewriting code
Hi! Thank you for your critique! > 1) “Your knight has killed a dragon with a crossbow” We have a proposal for dynamic references to address this problem - https://github.com/projectfluent/fluent/issues/80 - it's non-trivial but I hope we'll see it solved in Fluent and/or in MessageFormat 2. > 2) The parser is extremely sensitive True. It's on purpose. We wanted to start with strict and loosen, rather than the opposite. > 3) The input files mandate a weird arrangement of new lines for even the simplest branching Same as above. > 4) The documentation is too Spartan to know what happens in edge cases. We're a small team :) > It heralds itself to be the saviour of all i18n, but it’s literally worse than the mess that came before it. I'm sorry to hear it doesn't work for you. I'm relieved that your criticism is seems more subjective except o
Read the rest
f one missing feature that no other l10n system has as of yet. We'll keep pushing, but if you encounter a better l10n system, please let me know! We're working on Unicode MessageFormat 2.0 based on Fluent and incorporating lessons learned.
In Lessons From Linguistics: i18n Best Practices for Front-End Developers
I've never worked on a localized project but Fluent's explanation for why they use identifiers makes a lot of sense to me. I didnt see anything in your blog post addressing their issues with English source identifiers. https://github.com/projectfluent/fluent/wiki/Fluent-vs-gette... > The most important difference between gettext and Fluent is the choice of a message identifier. Gettext approaches the problem by taking the source string (often English). While the choice seem simple, it has long standing consequences in form of two limitations that this choice imposes. First of all, it means that any change to the source string invalidate all translations of the string. This severely increases the burden on the developers to never alter messages in the source language as it results in all translations having to be updated. > Secondly, it ma
Read the rest
kes it harder to introduce multiple messages with the same source string which should be translated differently ... > Fluent establishes a social contract between the developer and localizers. The developer introduces a unique identifier and provides a set of variables such as number of unread emails or the name of the user, and localizers are using Fluent syntax features to construct the best possible translation for that identifier.
In Fluent – A localization system for natural-sounding translations
Thank you! That's a good feedback. In our experience of working with the gettext based localizations we noticed that developers almost always omit the context and in result localizers are stripped of the ability to distinguish the message variant which makes them have to ask the developer to introduce it. This, in turn, breaks the design principle #1 of Fluent - https://github.com/projectfluent/fluent/wiki/Design-Principl... I'll update the Wiki to reflect that!
In Fluent 1.0: a localization system for natural-sounding translations
Hi! We've been working with and evaluating Gettext when we started Fluent. Our opinion is similar to Unicode's - Gettext is fundamentally flawed design for internationalization purposes. Here's you can find more detailed explanation of our position - https://github.com/projectfluent/fluent/wiki/Fluent-vs-gette... Please, don't take it as a criticism of using it. We just don't think it scales and we don't think it's possible to produce high quality sophisticated multilingual UI's with it, but if it works for you, don't touch it :)
In Fluent 1.0: a localization system for natural-sounding translations
This is an excellent question and a very good use-case. I'm a Polish speaker myself, so I can definitely relate. It's also a good excuse for me to talk a little bit more about the advanced features of Fluent. The Fluent Syntax is a simple declarative DSL. By design, it doesn't allow translators to build complex conditionals or use arithmetic. There is, however, an escape hatch. The problem you described can be solved in Fluent with a little bit of one-time help from the developer of the source code, through a feature of Fluent called custom functions. Translations in Fluent can use functions to format values or decide between variants. There exist built-in functions like NUMBER and DATETIME. They are rarely used because the Fluent runtime calls them on numeric and temporal values implicitly, but they can be helpful when localizers wish to
Read the rest
use custom formatting options. weekday-today = Today is {DATETIME($today, weekday: "long")}. See https://projectfluent.org/play/?id=a3540d4f02c104a634adbfc0e... for a live example of DATETIME. There can also be custom functions, defined during the initialization of the runtime. In Firefox, we use one such function called PLATFORM: https://searchfox.org/mozilla-central/rev/d33d470140ce3f9426.... It can be used as follows: open-preferences = {PLATFORM() -> [windows] Open Options *[other] Open Preferences } The logic of custom functions is entirely up to developers and the localization needs of the UI. In https://github.com/projectfluent/fluent/issues/228#issuecomm..., for instance, I suggested using a custom function to handle negative and positive floor numbers. A custom function can also cater to the use-case you described. A simple and possibly naive implementation in JavaScript could look like the following one: function NUMBER_HEAD(num) { while (num > 999) { num /= 1e3; } let first = num.toString()[0]; return num < 10 ? first : num < 100 ? first + "x" : first + "xx"; } I wrote this with Polish in mind, but it could be useful to other languages in which numerals are named after the first thousand-triple, in a left to right order. Depending on the exact product requirements, the function could be called NUMBER_HEAD_POLISH, or perhaps NUMBER_HEAD_TRIPLE_FIRST_DIGIT :) Once defined, the function can be used as follows: # The Polish copy can take advantage of the custom function. page-of = {NUMBER_HEAD($pageTotal) -> [1xx] Strona {$pageCurrent} ze {$pageTotal} *[other] Strona {$pageCurrent} z {$pageTotal} } This method still requires some work from developers, but it only needs to happen once and in a single palce in code: where the Fluent runtime is initialized. Because they are code, custom functions can be reviewed and tested just as any other code in the code base, to help ensure that they do what they claim to :) Importantly, the use of the custom function is completely opt-in. # The English copy doesn't need any special handling. page-of = Page {$pageCurrent} of {$pageTotal} All localization callsites remain unchanged, and all existing translations remain functional.
In Fluent 1.0: a localization system for natural-sounding translations
The comparison with gettext is really interesting: https://github.com/projectfluent/fluent/wiki/Fluent-vs-gette... Especially the advantages and drawbacks of using the source string as a message identifier, compared to a developer provided ID. I'm wondering if fluent has something similar to xgettext, to extract the IDs from the source code? Edit: Looks like there is some discussion about extraction here: https://github.com/projectfluent/fluent.js/wiki/React-Bindin...
In Fluent 1.0: a localization system for natural-sounding translations
Thanks! We decided to start kind of low level and build blocks and combine them per use case. Here's our roadmap - https://github.com/projectfluent/fluent/wiki/Roadmap For 1.0 we're aiming at JavaScript, Rust and Python. But if you look at the issues people are talking about Java, C#, Kotlin etc. ports so Swift sounds like a good candidate as well! It all comes down to use cases. We're currently finalizing 0.7 release which we hope will be the last one including syntax changes (very, very minor - mostly white space relaxation and normalization), and it will allow us to stabilize our EBNF and parser/serializers which, in turn, will make it easier for ports to be written. Contributors welcomed :)
In Fluent: a localization system designed to improve how software is translated

Showing the 15 most recent of 16 sources. Enable JavaScript to search and browse every indexed mention.

MAKE YOURSELF AT HOME

A few shortcuts

/
Search the collection
?
Open this guide
Esc
Close dialogs and navigation

Your saved repositories and interests stay in this browser.