【Flutter】FirebaseAuthException のメッセージを日本語で返す

Firebase Authentication のサインインなどでは FirebaseAuthException の例外を返してくれますが、message は当然ですが英語です

アプリのダイアログでそのまま出してもユーザーからすれば「何のこっちゃ」になります。

なので、日本語に変換する extension を作ってみました

【Flutter】FirebaseAuthException のメッセージを日本語で返す

enum 定義

先ず、普通に例外コードに応じた enum を定義します。

enum FirebaseAuthError {
  userNotFound,
  userDisabled,
  requiresRecentLogin,
  emailAlreadyInUse,
  invalidEmail,
  wrongPassword,
  tooManyRequests,
  expiredActionCode,
  unknown,
}

extension FirebaseAuthErrorExt

先ほどの enum を拡張して、日本語メッセージの定義と、code から取得するメソッドを作ります。

extension FirebaseAuthErrorExt on FirebaseAuthError {
  /// 表示用メッセージ取得
  String get message => _messages[this]!;

  /// 表示用メッセージ一覧
  static final _messages = {
    FirebaseAuthError.userNotFound: '指定されたユーザーは登録されていません。',
    FirebaseAuthError.userDisabled: '指定されたユーザーは無効化されています。',
    FirebaseAuthError.requiresRecentLogin: 'アカウント削除などのセキュアな操作を行うにはログインによる再認証が必要です。',
    FirebaseAuthError.emailAlreadyInUse: '既に利用されているメールアドレスです。',
    FirebaseAuthError.invalidEmail: '不正なメールアドレスです。',
    FirebaseAuthError.wrongPassword: 'メールアドレス、またはパスワードが間違っています。',
    FirebaseAuthError.tooManyRequests: 'アクセスが集中しています。少し時間を置いてから再度お試しください。',
    FirebaseAuthError.expiredActionCode: 'メールアドレスリンクの期限が切れています。再度認証メールを送信してください。',
    FirebaseAuthError.unknown: '予期しないエラーが発生しました。',
  };

  /// エラーコード(FIRAuth)から独自定義に変換
  static FirebaseAuthError fromCode(String code) {
    switch (code) {
      case 'user-not-found':
        return FirebaseAuthError.userNotFound;
      case 'user-disabled':
        return FirebaseAuthError.userDisabled;
      case 'requires-recent-login':
        return FirebaseAuthError.requiresRecentLogin;
      case 'email-already-in-use':
        return FirebaseAuthError.emailAlreadyInUse;
      case 'invalid-email':
        return FirebaseAuthError.invalidEmail;
      case 'wrong-password':
        return FirebaseAuthError.wrongPassword;
      case 'too-many-requests':
        return FirebaseAuthError.tooManyRequests;
      case 'expired-action-code':
        return FirebaseAuthError.expiredActionCode;
      default:
        return FirebaseAuthError.unknown;
    }
  }
}

使い方

例外を on FirebaseAuthException catch (e) でキャッチして e.code を渡して日本語メッセージを取得する例です。

try {
  await FirebaseAuth.instance.signInWithEmailAndPassword(
    email: 'email',
    password: 'password',
  );
  〜
} on FirebaseAuthException catch (e) {
  var message = FirebaseAuthErrorExt.fromCode(e.code).message;
}

showDialog か Text Widget か何かで message を表示すると良いと思います。

以上