どうも、たくチャレ(@takuchalle)です。
Flutterで作ってるアプリの多言語対応した時のメモです。 多言語対応といっても今は日本語しかサポートしていません。例え1言語しかサポートしなくてもソースコードに直値があるのは気持ち悪いので、この対応を行うことでソースコードがスッキリすると思います。
公式サイトに詳しく記載されているので、英語に抵抗がない方・詳しく見たい方はこちらを参照してください。
flutter_localizations
をインストールするFlutterはデフォルトでは英語しかサポートしていないので、flutter_localizations
パッケージをインストールことで他の言語をサポートすることができます。
サポートされている言語はこちらで確認できます。
pubspec.yaml
に記載します。
dependencies:
flutter:
sdk: flutter
flutter_localizations: # 追加
sdk: flutter # 追加
インストールすると下記のようにMaterialApp
のlocalizationsDelegates
とsupportedLocales
を指定します。
import 'package:flutter_localizations/flutter_localizations.dart';
return const MaterialApp(
title: 'サンプル',
localizationsDelegates: [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: [
Locale('ja', ''), // 日本語追加
Locale('en', ''), // 英語追加
],
home: MyHomePage(),
);
Widgetのbuildメソッド内でMaterialLocalizations.of(context)
でMaterialLocalizations
にアクセスできるので、
Text(MaterialLocalizations.of(context).cancelButtonLabel)
と記述すると日本語の場合キャンセル
、英語の場合Cancel
と表示されます。1
Widgetでよく使われる単語はMaterialLocalizations
に定義されているので自分で用意する必要はありません。
こちらにすべて定義されているので、一度見てみることをオススメします。命名ルールも参考になるかと思います。
intl
をインストールここから自分で定義した単語や文章を使用する準備をします。
大まかな流れは以下のようになります。
.arb
拡張子の定義ファイルを用意する.dart
に変換するMaterialApp
に追加するまずいつもどおりpubspec.yaml
にintl
を追加します。
dependencies:
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
intl: # 追加
更にflutter
セクションにgenerate: true
も追加します。
これでビルド時に.arb
から.dart
に変換してくれます。
flutter:
generate: true
次に変換するための定義ファイルを作成します。
ルートディレクトリにl10n.yaml
ファイルを作成し、以下のように書きます。
arb-dir: lib/l10n # .arb を配置する任意のディレクトリ
template-arb-file: app_ja.arb # 日本語を定義するファイル
output-localization-file: app_localizations.dart # 変換後のファイル名
lib/l10n/app_ja.arb
の中身を書いていきます。
{
"helloWorld": "こんにちわ、世界",
"@helloWorld": {
"description": "生まれたてのプログラマの最初の挨拶です"
}
}
VSCode を使用しているなら、Flutter Intlというプラグインで.arb
ファイルの色付けとかしてくれるので便利です。
今後言語を増やしていきたい場合は、app_ja.arb
のja
の部分を言語コードにして定義ファイルを書いていけば良いです。
ここまでの準備ができたらアプリをビルドします。すると${FLUTTER_PROJECT}/.dart_tool/flutter_gen/gen_l10n
に.arb
から変換されたapp_localizations.dart
が生成されているはずです。
生成されたファイルはflutter_gen/gen_l10n/app_localizations.dart
で参照できるのでインポートして、AppLocalizations.delegate
をlocalizationsDelegates
に指定します。
ひとまとめにしたコードがこちらです。
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
return const MaterialApp(
title: 'サンプル',
localizationsDelegates: [
AppLocalizations.delegate, // 追加
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: [
Locale('ja', ''), // 日本語追加
],
home: MyHomePage(),
);
最後にWidget内で以下のように参照して表示できれば完成です。
Text(AppLocalizations.of(context)!.helloWorld);
MaterialApp
は以下のように書くこともできます。これらは自動生成されるので、新規の言語の.arb
ファイルを追加するだけで、ソースコードは修正せずに新規の言語に対応できます。
const MaterialApp(
title: 'サンプル',
localizationsDelegates: AppLocalizations.localizationsDelegates,
supportedLocales: AppLocalizations.supportedLocales,
);
もう少し短く書けるといいが… ↩︎