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

2019/05/02

GWはひたすらFlutterと戯れています。いろいろ学んだはずなんですが、アウトプットを意識的に残さないと忘れちゃいますね……。

ということで、今回はFlutterで多言語対応したときのメモ。Androidに慣れている身からするとちょっと面倒でした。

ちゃんと理解したいぜ!という方は公式ドキュメントの Internation­alizing 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にコメントされているように独自の仕組みを実装するのもアリと言えばアリなのかもしれません。




関連(するかもしれない)記事


おススメ