fluent
Fluent 는 자연어의 표현력을 극대화하기 위해 설계된 로컬라이제이션 프레임워크인 Project Fluent 의 Dart 구현입니다.
Project Fluent 의 Dart 구현 https://projectfluent.org/
아래는 영문 원문 스냅샷입니다. 최신 내용은 GitHub에서 확인하세요.
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.
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.
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)
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.
We do not yet support NUMBER(..., currencyDisplay="...", minimumSignificantDigits="...", maximumSignificantDigits=".. ")
Most options to DATETIME are not yet supported.
Help with the above would be welcome!