Flutterの多言語対応を試してみた

GWはひたすらFlutterと戯れています。いろいろ学んだはずなんですが、アウトプットを意識的に残さないと忘れちゃいますね……。
ということで、今回はFlutterで多言語対応したときのメモ。Androidに慣れている身からするとちょっと面倒でした。
ちゃんと理解したいぜ!という方は公式ドキュメントの Internationalizing Flutter apps を読みましょう。
手っ取り早く把握したい、という方は@monoさんの Dart/Flutter での多言語対応あれこれ がおススメ。後半に多言語対応の具体的なやり方が書かれています。
このやり方を採用したときに新しい文言を追加する手順を簡単にまとめておきます。
まず、ローカライズ用のクラス(l10n.dart
)に定義を追加。
String get example => Intl.message('多言語対応の例', name: 'example');
以下のコマンドで intl_messages.arb
を生成。実態はJSONですね。
> flutter packages pub run intl_translation:extract_to_arb --locale=messages --output-dir=lib/l10n lib/l10n/l10n.dart
intl_messages.arb
をもとに各言語用の .arb
ファイルを生成。 intl_ja.arb
とか intl_en.arb
みたいな感じで。
最後に以下のコマンドで .arb
ファイルから message_XX.dart
を生成。
> flutter packages pub run intl_translation:generate_from_arb --output-dir=lib/l10n --no-use-deferred-loading lib/l10n/l10n.dart lib/l10n/intl_en.arb
> flutter packages pub run intl_translation:generate_from_arb --output-dir=lib/l10n --no-use-deferred-loading lib/l10n/l10n.dart lib/l10n/intl_ja.arb
ちょっと原始的ですがこんな感じ。
この辺をいい感じにやってくれるプラグインがあるみたいなんで、そっちに頼ったほうがラクかも。
ちなみに、多言語設定をした上で initializeDateFormatting()
を呼び出していると処理が衝突するらしく、
Unsupported operation: Cannot set value in unmodifiable Map
のエラーが起きます。地味にハマった……。
あと、「FlutterのLocalizationは複雑過ぎじゃない?」「BuildContextに依存するのはキツい」という意見もあるみたい。
個人的には多少面倒でもFlutterが提供してくれる仕組みを使っておくのが無難と思いますが、上記のissueにコメントされているように独自の仕組みを実装するのもアリと言えばアリなのかもしれません。
関連(するかもしれない)記事
おススメ