🗾

FlutterFire UIを日本語で表示

2021/12/23に公開

はじめに

2021年12月にFlutterFire UI(flutterfire_ui)が公開されました。
FlutterFire UIを使用すれば、ログイン画面(SignInScreen)やアカウント登録画面(RegisterScreen)など自分で構築することなく簡単に作成することができます。
ただ、日本語での表示は別途対応が必要なので、実際に試した内容を投稿します。

環境

  • Flutter 2.8.1
  • flutterfire_ui 0.3.0

画面イメージ

SignInScreen RegisterScreen
日本語
英語

日本語の表示方法

https://firebase.flutter.dev/docs/ui/auth/localization

If you need to support multiple languages – follow the official flutter localization guide and make sure that your custom delegate extends LocalizationsDelegate<FlutterFireUILocalizations>.

公式ドキュメントにあるように、LocalizationsDelegate<FlutterFireUILocalizations>を継承したクラスを作成し、それを使用します。

FlutterFireUIJaLocalizationsDelegate

class FlutterFireUIJaLocalizationsDelegate
    extends LocalizationsDelegate<FlutterFireUILocalizations> {
  
  bool isSupported(Locale locale) {
    return locale.languageCode == 'ja';
  }

  
  Future<FlutterFireUILocalizations<FlutterFireUILocalizationLabels>> load(
      Locale locale) {
    final flutterFireUILocalizations =
        FlutterFireUILocalizations(locale, FlutterFireUIJaLocalizationLabels());
    return SynchronousFuture<FlutterFireUILocalizations>(
        flutterFireUILocalizations);
  }

  
  bool shouldReload(
      covariant LocalizationsDelegate<
              FlutterFireUILocalizations<FlutterFireUILocalizationLabels>>
          old) {
    return false;
  }
}

class FlutterFireUIJaLocalizationLabels
    extends FlutterFireUILocalizationLabels {
  
  String get emailInputLabel => 'メールアドレス';

  
  String get passwordInputLabel => 'パスワード';

  
  String get signInActionText => 'ログイン';

  
  String get registerActionText => 'アカウント登録';

  
  String get linkEmailButtonText => '次へ';

  
  String get signInButtonText => 'ログイン';

  
  String get registerButtonText => 'アカウント登録';

  
  String get signInWithPhoneButtonText => '電話番号でログイン';

  
  String get signInWithGoogleButtonText => 'Googleでログイン';

  
  String get signInWithAppleButtonText => 'Appleでログイン';

  
  String get signInWithFacebookButtonText => 'Facebookでログイン';

  
  String get signInWithTwitterButtonText => 'Twitterでログイン';

  
  String get phoneVerificationViewTitleText => '電話番号を入力';

  
  String get verifyPhoneNumberButtonText => '次へ';

  
  String get verifyCodeButtonText => '確認';

  
  String get verifyingPhoneNumberViewTitle => 'SMSに記載されたコードを入力';

  
  String get unknownError => '不明なエラーが発生しました';

  
  String get smsAutoresolutionFailedError =>
      'SMSコードの自動解決に失敗しました。コードを手動で入力してください。';

  
  String get smsCodeSentText => 'SMSコード送信';

  
  String get sendingSMSCodeText => 'SMSコード送信中...';

  
  String get verifyingSMSCodeText => 'SMSコードの確認中...';

  
  String get enterSMSCodeText => 'SMSコードを入力';

  
  String get emailIsRequiredErrorText => 'メールアドレスは必須です';

  
  String get isNotAValidEmailErrorText => '有効なメールアドレスを入力してください';

  
  String get userNotFoundErrorText => 'アカウントは存在しません';

  
  String get emailTakenErrorText => '入力されたメールアドレスのアカウントはすでに存在しています';

  
  String get accessDisabledErrorText => 'このアカウントへのアクセスは一時的に無効化されました';

  
  String get wrongOrNoPasswordErrorText => 'パスワードが無効です';

  
  String get signInText => 'ログイン';

  
  String get registerText => 'アカウント登録';

  
  String get registerHintText => 'アカウントをお持ちでない方はこちら';

  
  String get signInHintText => 'すでにアカウントをお持ちの方はこちら';

  
  String get signOutButtonText => 'ログアウト';

  
  String get phoneInputLabel => '電話番号';

  
  String get phoneNumberIsRequiredErrorText => '電話番号は必須です';

  
  String get phoneNumberInvalidErrorText => '電話番号が無効です';

  
  String get profile => 'プロフィール';

  
  String get name => '名前';

  
  String get deleteAccount => 'アカウント削除';

  
  String get passwordIsRequiredErrorText => 'パスワードは必須です';

  
  String get confirmPasswordIsRequiredErrorText => 'パスワードを確認する';

  
  String get confirmPasswordDoesNotMatchErrorText => 'パスワードが一致しません';

  
  String get confirmPasswordInputLabel => 'パスワード(確認用)';

  
  String get forgotPasswordButtonLabel => 'パスワードを忘れた方はこちら';

  
  String get forgotPasswordViewTitle => 'パスワードを忘れた方';

  
  String get resetPasswordButtonLabel => 'パスワードリセット';

  
  String get verifyItsYouText => 'あなたであることを確認する';

  
  String get differentMethodsSignInTitleText => '次のいずれかの方法でサインインしてください';

  
  String get findProviderForEmailTitleText => '続行するには、メールアドレスを入力してください';

  
  String get continueText => '続ける';

  
  String get countryCode => 'コード';

  
  String get codeRequiredErrorText => '国コードは必須です';

  
  String get invalidCountryCode => '無効なコード';

  
  String get chooseACountry => '国を選択してください';

  
  String get enableMoreSignInMethods => 'より多くのログイン方法を有効にする';

  
  String get signInMethods => 'ログイン方法';

  
  String get provideEmail => 'メールアドレスとパスワードを入力してください';

  
  String get goBackButtonLabel => '戻る';

  
  String get passwordResetEmailSentText =>
      'パスワードをリセットするためのリンクを記載したメールを送信しました。メールをご確認ください。';

  
  String get forgotPasswordHintText => 'パスワードをリセットするためのリンクを送信します';

  
  String get emailLinkSignInButtonLabel => 'マジックリンクでログイン';

  
  String get signInWithEmailLinkViewTitleText => 'マジックリンクでログイン';

  
  String get signInWithEmailLinkSentText =>
      'マジックリンクが記載された電子メールを送信しました。メールをご確認の上、リンクからサインインしてください。';

  
  String get sendLinkButtonLabel => 'マジックリンクの送信';

  
  String get arrayLabel => 'array';

  
  String get booleanLabel => 'boolean';

  
  String get mapLabel => 'map';

  
  String get nullLabel => 'null';

  
  String get numberLabel => 'number';

  
  String get stringLabel => 'string';

  
  String get typeLabel => 'type';

  
  String get valueLabel => 'value';

  
  String get cancelLabel => 'キャンセル';

  
  String get updateLabel => '更新';

  
  String get northInitialLabel => 'N';

  
  String get southInitialLabel => 'S';

  
  String get westInitialLabel => 'W';

  
  String get eastInitialLabel => 'E';

  
  String get timestampLabel => 'timestamp';

  
  String get latitudeLabel => 'longitude';

  
  String get longitudeLabel => 'latitude';

  
  String get geopointLabel => 'geopoint';

  
  String get referenceLabel => 'reference';
}

日本語の内容は、適切な文言へ変更ください。

MaterialApp localizationsDelegatesに設定

MaterialApp.router(
  localizationsDelegates: [
    ...L10n.localizationsDelegates,
    FlutterFireUILocalizations.delegate,
    FlutterFireUIJaLocalizationsDelegate()
  ],
  supportedLocales: L10n.supportedLocales,
  locale: locale,
  // 以下省略

上記のように、localizationsDelegatesにFlutterFireUIJaLocalizationsDelegateを設定します。
(L10nは、flutter_localizationsで自動生成されたものです)

まとめ

FlutterFire UIで用意されたログイン画面・アカウント登録画面を日本語で表示することができました。
特別な要件などなければ、FlutterFire UI + 日本語表示もいかがでしょうか。

Discussion