アプリケーションを世界中の人に使ってもらう上で、Localization は欠かすことのできない重要な要件です。Flutter では ARB ファイルを使って簡単にアプリケーションの Localization 対応が可能となっています。本記事では、その方法を解説します。ちなみに、Flutter のバージョンによってやり方が変わってきます(昔は AppLocalizations クラスとかは自作していた)。本記事は Flutter 2.0.1 を使用して動作確認しています。
pubspec.yaml に下記の dependencies を追加します。
dependencies:
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
intl: ^0.16.1
これらのパッケージはアプリケーションをローカライズする上で必要となるものです。
flutter:
generate: true
このフラグをつけることで、後述する ARB ファイルから AppLocalizations のクラスを自動生成することができます。
arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dart
これは Flutter が AppLocalizations クラスを自動生成するときに使用する設定ファイルです。1 つ目の arb-dir には、後述の ARB ファイルのディレクトリを指定します。template-arb-file には、ベースとなる ARB ファイルを指定します。最後の output-localization-file は、自動生成される AppLocalizations クラスのファイル名です。
l10n.yaml で指定したディレクトリに ARB ファイルを作成します。 ARB ファイルは json 形式のファイルで key-value 形式で key に対して対応する文言を記載していきます。この key のことを resource id、value のことを Resource Value と呼びます。
{
"helloWorld": "Hello World!",
"@helloWorld": {
"description": "The conventional newborn programmer greeting"
}
}
ARB ファイルでは resource id に@マークを付けることで、その resource id に関する説明等を記載することができます。上の例では、helloWorld
という resource id に対して@helloWorld
で説明文を追加しています。
あとは、対応言語の数だけ ARB ファイルを作成し、各言語に対応した文言を resource value に記載していきます。
例えば、この helloWorld を日本語に対応させる場合は、下記のように app_ja.arb ファイルを作成します。
{
"helloWorld": "こんにちは世界!"
}
ARB ファイルでは様々な記載が可能になっていますが、ここで、一例として placeholder を紹介します。placeholder を使うと下記のように文言の中に外部からパラメータを指定することができます。
"pricePerMonth": "{price} per month",
"@pricePerMonth": {
"placeholders": {
"price": {
"example": "123.45",
"description": "price"
}
}
}
resource value にパラメータを{price}
という形式で記載します。
次にそのパラメータの情報をplaceholders
として@resource id
の中に記載します。
このようにARBファイルを記載しておくと、AppLocalizationsクラスが自動生成されて、プログラムから呼び出すときには下記のようにpriceをパラメータとして指定できるようになります。
AppLocalizations.of(context).pricePerMonth(100.0);
flutter pub get もしくは、build することで自動的に AppLocalizations クラスのファイルが生成されます。ファイル名は先ほど l10n.yaml で指定したものになります。 上の例だと.darttool/fluttergen/genl10n/applocalizations.dart ですね。ディレクトリは固定のようです。 ちなみに、この app_localizations.dart は git 等にコミットする必要はないです。arb ファイルを更新すればビルド時に毎回最新の状態を反映して自動生成されるので。
あとは、Material/Widget/CupertinoApp で、localizationsDelegates と supportedLocales パラメータを設定します。 自動生成されたクラスの import も忘れずに。
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
Widget build(BuildContext context) {
return MaterialApp(
localizationsDelegates: AppLocalizations.localizationsDelegates, // Add this line
supportedLocales: AppLocalizations.supportedLocales, // Add this line
home: // ...
);
}
あとは、文言を呼び出します。下記のようにAppLocalizations.of(context).<resource id>
という形式です。
Text(AppLocalizations.of(context).helloWorld);
日付などを locale に合わせて変えたいときは、下記のようにします。
Locale locale = Localizations.localeOf(context);
DateFormat.yMd(locale.toString()).format(DateTime.now());