FLUTTER ECOSYSTEM

ryanhz/fluent-dart

Project Fluent 的 Dart 實作 https://projectfluent.org/

fluent-dart 專案封面
Stars
15
Forks
10
最近推送(UTC)
2026年7月8日
專案狀態
未封存
Ryan GitHub avatar
GITHUB User

Ryan ↗

語言DartFluent

技術主題

此儲存庫發佈的套件

使用的依賴

依賴清單 2 項
  • intl>=0.19.0 <0.21.0
  • test開發依賴^1.25.7

原始 README

以下為英文專案原文快照,最新內容請造訪 GitHub。

展開 / 收合專案 README

Fluent

This is a Dart runtime implementation of Project Fluent, a localization framework designed to unleash the entire expressive power of natural language translations.

Project Fluent keeps simple things simple and makes complex things possible. The syntax used for describing translations is easy to read and understand. At the same time it allows, when necessary, to represent complex concepts from natural languages like gender, plurals, conjugations, and others.

Getting Started

Learn the FTL syntax

FTL is a localization file format used for describing translation resources. FTL stands for Fluent Translation List.

FTL is designed to be simple to read, but at the same time allows to represent complex concepts from natural languages like gender, plurals, conjugations, and others.

hello-user = Hello, { $username }!

In order to use fluent.runtime, you will need to create FTL files. Read the Fluent Syntax Guide <http://projectfluent.org/fluent/guide/>_ in order to learn more about the syntax.

Using FluentBundle

Once you have some FTL files, you can generate translations using the fluent package. You start with the FluentBundle class:

import 'package:fluent/fluent.dart';

You pass a locale to the constructor:

final bundle = FluentBundle('en-GB');

You must then add messages. These would normally come from a .ftl file stored on disk, here we will just add them directly:

bundle.addMessages('''
welcome = Welcome to this great app!
greet-by-name = Hello, { $name }!
''');

To generate translations, use the format method, passing a message ID and an optional dictionary of substitution parameters. If the the message ID is not found, null is returned. Otherwise, as per the Fluent philosophy, the implementation tries hard to recover from any formatting errors and generate the most human readable representation of the value.

List<Error> errors = [];
translated = bundle.format('welcome', errors: errors)
translated = bundle.format('greet-by-name', args: {'name': 'Jane'}, errors: errors)

Custom functions

Besides the built-in NUMBER and DATETIME functions, you can register your own functions for use in translations, e.g. a PLATFORM() function used to pick a variant based on the current OS:

FluentValue platform() => FluentString('macos');
final bundle = FluentBundle('en-GB', functions: {'PLATFORM': platform});

bundle.addMessages('''
settings-menu-label = { PLATFORM() ->
    [macos] Preferences
   *[other] Settings
}
''');

A custom function receives its FTL positional and named arguments as plain Dart values (already unwrapped from FluentValue, e.g. String/num/ DateTime), and must return a FluentValue (e.g. FluentString, FluentNumber). Custom functions may also override the built-in NUMBER and DATETIME functions by registering under those names.

Known limitations and bugs

  • We do not yet support NUMBER(..., currencyDisplay="...", minimumSignificantDigits="...", maximumSignificantDigits=".. ")

  • Most options to DATETIME are not yet supported.

Help with the above would be welcome!