備忘録です。
多言語対応準備
pubspec.yamlに追記
公式サイトで「flutter pub get ライブラリ名」で導入する方法は信じない方がいいです。
dependencies:
flutter:
sdk: flutter
intl: ^0.18.0
slang: ^3.15.0
slang_flutter: ^3.15.0
flutter_localizations:
sdk: flutter
一旦pub get
当たり前ですが、pub getしてくださいね。
多言語ファイルを作成
多言語ファイルをまとめて入れておくフォルダを作る
lib>translationsというフォルダを作ります。
多言語ファイルを作る
最初に、参考になるサイトを貼っておきます。
![](https://res.cloudinary.com/zenn/image/upload/s--syDuXElO--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:%25E3%2580%2590Flutter%25E3%2580%2591fast_i18n%25E3%2582%2592%25E3%2582%25A4%25E3%2583%25B3%25E3%2582%25B9%25E3%2583%2588%25E3%2583%25BC%25E3%2583%25AB%25E3%2581%2599%25E3%2582%258B%25E3%2580%2590i18n%25E3%2580%2591%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:airRnot%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyL2MxYzlkMTkxNjQuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png)
先ほど作ったtranslationsフォルダにファイルを作ります。
基本的なファイル名は「translations_ロケール.i18n.json」です。
japaneseの場合は「translations_ja.i18n.json」となりますね。
正し、englishの場合のみ「translations.i18n.json」のようにロケールは省略する必要があります。
多言語の中身を書く
以下を参考にしてください。
translations.i18n.json
"home_page": {
"appbar_title": "HomePage",
"body": {
"category": "Category",
}
}
translations_ja.i18n.json
"home_page": {
"appbar_title": "ホームページ",
"body": {
"category": "カテゴリ",
}
}
こんな感じに階層で作ることが可能です。
⚠️「予約語」はkeyにしないでください。この後の工程でエラーが出ます。
多言語ファイル作成トピック
正規表現でシングルクォートに囲まれた文字だけ取り出す
ファイル内のコードをコピーし、VSCode等に貼り付けて正規表現でシングルクォートに囲まれた文字以外を消しましょう。
^(?!.*'([^']*)').*$
作成した多言語を使えるようにする
ターミナルで以下のコマンドを実行してください
flutter pub run slang
lib>translationsに「strings.g.dart」が生成されます。
一度開いてエラーが出ていないか確認してください。
ここでエラーが出る場合、おそらく多言語ファイルのkeyに予約語が使われているか、多言語ファイルの中に足りないkeyがある可能性があります。
実際にコードで呼び出す
下準備
まずmain.dartのrunApp前を修正します。
import 'package:flutter_localizations/flutter_localizations.dart'; import 'package:flutter_widget/translations/strings.g.dart'; Future<void> main() async { WidgetsFlutterBinding.ensureInitialized(); // 端末の言語を取得する LocaleSettings.useDeviceLocale(); runApp( TranslationProvider( child: const MyApp(), ), ); }
次にMaterialAppの中を修正します。
return MaterialApp(
locale: TranslationProvider.of(context).flutterLocale,
supportedLocales: AppLocaleUtils.supportedLocales,
localizationsDelegates: GlobalMaterialLocalizations.delegates,
child: YourProject()
);
iOSのみ、info.plistに以下を追記してください。
<key>CFBundleLocalizations</key>
<array>
<string>ja</string>
<string>en</string>
</array>
実際に使う方法
各階層を辿っていく方法で呼び出せます。
import '../translations/strings.g.dart';
print(t.home_page.body.category)
英語設定時:Category
日本語設定時:カテゴリ
最後に
参考になりました記事です。
![](https://res.cloudinary.com/zenn/image/upload/s--2Hbji18Q--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:ChatGPT%25E3%2581%25A8slang%25E3%2581%25A7Flutter%2520Web%25E3%2582%2592%25E5%25A4%259A%25E8%25A8%2580%25E8%25AA%259E%25E5%258C%2596%25E3%2581%2599%25E3%2582%258B%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_34:kboy%2Cx_220%2Cy_108/bo_3px_solid_rgb:d6e3ed%2Cg_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyL2Y0ODUxNDkwOTcuanBlZw==%2Cr_20%2Cw_90%2Cx_92%2Cy_102/co_rgb:6e7b85%2Cg_south_west%2Cl_text:notosansjp-medium.otf_30:Flutter%25E5%25A4%25A7%25E5%25AD%25A6%2Cx_220%2Cy_160/bo_4px_solid_white%2Cg_south_west%2Ch_50%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyLzkxZjA3ZTJmOGYuanBlZw==%2Cr_max%2Cw_50%2Cx_139%2Cy_84/v1627283836/default/og-base-w1200-v2.png)
![](https://res.cloudinary.com/zenn/image/upload/s--syDuXElO--/c_fit%2Cg_north_west%2Cl_text:notosansjp-medium.otf_55:%25E3%2580%2590Flutter%25E3%2580%2591fast_i18n%25E3%2582%2592%25E3%2582%25A4%25E3%2583%25B3%25E3%2582%25B9%25E3%2583%2588%25E3%2583%25BC%25E3%2583%25AB%25E3%2581%2599%25E3%2582%258B%25E3%2580%2590i18n%25E3%2580%2591%2Cw_1010%2Cx_90%2Cy_100/g_south_west%2Cl_text:notosansjp-medium.otf_37:airRnot%2Cx_203%2Cy_121/g_south_west%2Ch_90%2Cl_fetch:aHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3plbm4tdXNlci11cGxvYWQvYXZhdGFyL2MxYzlkMTkxNjQuanBlZw==%2Cr_max%2Cw_90%2Cx_87%2Cy_95/v1627283836/default/og-base-w1200-v2.png)