Flutterの多言語対応時に使用するarbファイルで引数を使用する
はじめに
最近個人で開発しているFlutter製のサブスク管理アプリsubskunでは多言語対応をしている。
Flutterアプリの多言語対応自体は公式ドキュメントに沿って進めれば簡単に導入することができる。
その際に登場するのがarbファイルで、言語ごとにローカライズされたテキストを管理するファイルになっている。
今回はそのファイルの中で引数を扱う方法をまとめておく。
引数の使い方
引数が1つの場合
arbファイルではJSONのようにKey-Valueでデータを管理するが、@
をprefixとしてつけることでキーに対してdescription
などのメタデータを付与することができる。
引数もここで定義することができ、valueの中で{}
を使って引数が挿入される場所を指定し、placeholders
でその引数を定義する。
例えば、userName
を引数として使いたい場合は以下のようになる。userName
をString
型の引数として定義している。
{
"hello": "Hello {userName}",
"@hello": {
"description": "A message with a single parameter",
"placeholders": {
"userName": {
"type": "String",
"example": "Bob"
}
}
}
}
flutter gen-l10n
でローカライズ用のビルドを走らせると、以下のコードが生成される。
/// A message with a single parameter
///
/// In en, this message translates to:
/// **'Hello {userName}'**
String hello(String userName);
これで以下のように引数を渡して利用できるようになった。
AppLocalizations.of(context).hello('Jon')
// -> "Hello Jon"
引数が複数の場合
引数が複数の場合も同様にplaceholders
の中に引数を定義するだけだ。
{
"greeting": "{hello} {world}",
"@greeting": {
"description": "A message with a two parameters",
"placeholders": {
"hello": {},
"world": {}
}
},
}
ちなみに、placeholders
内のtype
やexamaple
は省略することができるが、その場合は生成されるコードの引数の型はObject
型になる。特に理由がない限りは型を指定しておいた方が良いだろう。
/// A message with a two parameters
///
/// In en, this message translates to:
/// **'{hello} {world}'**
String greeting(Object hello, Object world);
利用する場合は関数に引数を順番に渡すだけだ。
AppLocalizations.of(context).greeting(‘Hello’, ‘World’)
// -> "Hello World"
おわり
arbファイルは今回の個人開発で初めて触ることになった。
JSONとほぼほぼ同じだったので導入に際しては特に問題がなかったが、アプリの機能が増えてきてローカライズ用のテキストも増えてくると、arbファイルの行数も増えてきて管理がかなり大変になってきた。
どうやらファイルを分割できるようにするパッケージもあるようなので今度使ってみようと思っている。
参考
ちなみにFlutterの多言語対応で使用するarbファイルは、今回紹介した引数の他に日付や数字のフォーマットもすることができる。
その辺りの詳細な使い方は以下のドキュメントにまとまっているので参照してみてほしい。