Flutter 非対応言語に対する多言語対応 カスタムローカリゼーションの利用方法

flutter_localizationsで対応していない国の言語を実装する方法の一つとして、カスタムローカリゼーションという方法があったのでその対応方法をメモ。カスタムローカリゼーションを使う場合、以下の2種類の考え方があるが、別々に管理するのは面倒なので②で対応してみた。

①非対応言語だけをカスタムローカリゼーションとして管理(対応言語は従来の方法で管理)
②全ての言語をカスタムローカリゼーションで管理する方法

1. カスタムローカライゼーションクラスの作成
import 'package:flutter/material.dart';

class CustomLocalizations {
  final Locale locale;

  CustomLocalizations(this.locale);

  static CustomLocalizations of(BuildContext context) {
    return Localizations.of<CustomLocalizations>(context, CustomLocalizations)!;
  }

  // ここにローカライズされた文字列を追加。gen-l10で生成された内容を記述する。
  String get title => _localizedValues[locale.languageCode]!['title']!;

  static Map<String, Map<String, String>> _localizedValues = {
  // ここにARBファイルに記載した各言語の情報を記述する。
    'en': {
      'title': 'Title in English',
    },
    'ja': {
      'title': 'タイトル(日本語)',
    },
    'xx': {
      'title': 'Title in xx',  
    },
    // 他の言語の追加
  };
}

class CustomLocalizationsDelegate extends LocalizationsDelegate<CustomLocalizations> {
  const CustomLocalizationsDelegate();

  @override
  bool isSupported(Locale locale) => ['en', 'ja','xx'].contains(locale.languageCode);

  @override
  Future<CustomLocalizations> load(Locale locale) async {
    return CustomLocalizations(locale);
  }

  @override
  bool shouldReload(CustomLocalizationsDelegate old) => false;
}
2.新しい言語の翻訳情報の追加

こちらは、Flutter-Devのドキュメントを参考に。
リンクのnn_intl.dartをコピーし、言語の’nn’を’xx’に、’Nn’を’Xx’に変更する。
このファイルがないと実行時エラーが発生する。

3. MaterialAppの変更
MaterialApp(
  localizationsDelegates: [
    const CustomLocalizationsDelegate(),
    //AppLocalizations.delegate,           こっちは不要
    GlobalMaterialLocalizations.delegate,
    GlobalWidgetsLocalizations.delegate,
    GlobalCupertinoLocalizations.delegate,
    XxMaterialLocalizations.delegate,      // 上記2で追加した言語情報 
  ],
  supportedLocales: [
    const Locale('en', ''), // 英語
    const Locale('ja', ''), // 日本語
    const Locale('xx', ''), // サポート非対象言語
    // 他のサポートする言語
  ],
  // 他のプロパティ
)
4.言語参照する画面側の変更
//変更前
Text(AppLocalizations.of(context)!.hoge)
//変更後
Text(CustomLocalizations.of(context).hoge)

●参考
カスタムローカリゼーション以外にも多言語対応の実装方法は色々あるようです。
https://zenn.dev/flutteruniv_dev/articles/20220422-140216-flutter-localizations