FlutterのLocalization

最終更新日: 2021/3/18
Flutter

アプリケーションを世界中の人に使ってもらう上で、Localization は欠かすことのできない重要な要件です。Flutter では ARB ファイルを使って簡単にアプリケーションの Localization 対応が可能となっています。本記事では、その方法を解説します。ちなみに、Flutter のバージョンによってやり方が変わってきます(昔は AppLocalizations クラスとかは自作していた)。本記事は Flutter 2.0.1 を使用して動作確認しています。

1. pubspec.yaml の修正

pubspec.yaml に下記の dependencies を追加します。

pubspec.yaml
dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter
  intl: ^0.16.1

これらのパッケージはアプリケーションをローカライズする上で必要となるものです。

2. pubspec.yaml の generate フラグを true にする

pubspec.yaml
flutter:
  generate: true

このフラグをつけることで、後述する ARB ファイルから AppLocalizations のクラスを自動生成することができます。

3. l10n.yaml ファイルを作成する

l10n.yaml
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 クラスのファイル名です。

4. ARB ファイルを作成する

l10n.yaml で指定したディレクトリに ARB ファイルを作成します。 ARB ファイルは json 形式のファイルで key-value 形式で key に対して対応する文言を記載していきます。この key のことを resource id、value のことを Resource Value と呼びます。

app_en.arb
{
  "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 ファイルを作成します。

app_ja.arb
{
  "helloWorld": "こんにちは世界!"
}

ARB ファイルでは様々な記載が可能になっていますが、ここで、一例として placeholder を紹介します。placeholder を使うと下記のように文言の中に外部からパラメータを指定することができます。

placeholder_example.arb
"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);

5. AppLocalizations クラスの自動生成

flutter pub get もしくは、build することで自動的に AppLocalizations クラスのファイルが生成されます。ファイル名は先ほど l10n.yaml で指定したものになります。 上の例だと.darttool/fluttergen/genl10n/applocalizations.dart ですね。ディレクトリは固定のようです。 ちなみに、この app_localizations.dart は git 等にコミットする必要はないです。arb ファイルを更新すればビルド時に毎回最新の状態を反映して自動生成されるので。

6. Material/Widget/CupertinoApp の設定

あとは、Material/Widget/CupertinoApp で、localizationsDelegates と supportedLocales パラメータを設定します。 自動生成されたクラスの import も忘れずに。

MaterialApp
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: // ...
  );
}

7. 呼び出す

あとは、文言を呼び出します。下記のようにAppLocalizations.of(context).<resource id>という形式です。

call_l10n
Text(AppLocalizations.of(context).helloWorld);

日付などの l10n

日付などを locale に合わせて変えたいときは、下記のようにします。

date_l10n
Locale locale = Localizations.localeOf(context);
DateFormat.yMd(locale.toString()).format(DateTime.now());

参考文献

2019 Copyright Channel.241