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