こんにちは!本記事では、端末の言語設定によってアプリの言語も変わる機能を実装する手順を説明します。ざっくりまとめると、多言語ライブラリ(flutter_localizations)を導入、対応したい言語分の言語対応ファイル作成、文字を変数で指定、していきます。読み進めた通りに操作すれば多言語対応できますし、生じたエラーも下に記載しておきます。
開発環境
macOS Monterey
MacBook Air (M1, 2020)
①多言語パッケージのインストール
flutter_localizationsは、flutter pub add fluuter_localizations
では機能しません。下記のようなエラーが出てきてしまいます。
Because (プロジェクト名) depends on flutter_localizations any which doesn’t exist (could not find package flutter_localizations at https://pub.dartlang.org), version solving failed.
以下に従って、pubspec.yamlを編集してください。
下記のように、pubspec.yamlのdependencies
:の箇所に記載してください
dependencies:
...
flutter_localizations: //ここの二行を追加する
sdk: flutter
また、pubspec.yamlを下にスクロールすると、flutter:
と書いてある箇所があるので、そこに下記一行を追記します。周囲にデフォルトで書いてあるコードも記載しておきます。
# The following section is specific to Flutter.
flutter:
generate: true //これを追記
# The following line ensures that the Material Icons font is
# included with your application, so that you can use the icons in
# the material Icons class.
uses-material-design: true
その後、flutter pub add intl
→flutter pub get
でパッケージをインストールしましょう。
パッケージのインストール方法について詳しくはこちら↓
![](https://www.mechengjp.com/wp-content/uploads/2022/02/d7eb7c5c19c06936a91a655bd1ada043-300x169.jpg)
②多言語対応ファイルの設定
英語単語と日本語単語の一覧ファイルを作成していきます。
l10n.yamlファイルの作成
まず、プロジェクト直下にl10n.yamlを作成し、下記のように記載してください。
arb-dir: lib/l10n
template-arb-file: app_en.arb
output-localization-file: app_localizations.dart
上記は、どこに翻訳ファイル(app_en.arb)があるか、生成されたdartファイル名(app_localization.dart)を記載しています。
次に、l10nフォルダを指定した場所に作成します。
作成後のフォルダ・ファイルは下図のような階層にあるはずです。
![](https://www.mechengjp.com/wp-content/uploads/2022/02/5ab93a311de32ce169d61d26f630d964.png)
言語ファイルの作成
先ほど作成したl10nのフォルダ内に、言語ファイルを作成していきます。日本語のファイルはapp_en.arb、英語のファイルはapp_ja.arbです。
それぞれの書き方は以下の通りです。日本語の場合は、”en”の場所を”ja”に、各行の右側の””内を日本語に書き換えます。左がわの文字は必ず日本語ファイル英語ファイル共に同じものが必要です。ない場合は片方のものを両方に適用します。
{
"@@locale": "en",
"test": "Test",
"hello": "Heeey"
}
{
"@@locale": "ja",
"test": "テスト",
"hello": "こんちゃ"
}
*左の””内は、空白をつけてはいけません。また、小文字から始める必要があります。
* “}”の前には”, “を入れません。
arbファイルの使い方はこちらを参考にしてください。
![](https://localizely.com/img/flutter-arb-file-og-image.png)
③ファイル作成
次に、flutter pub get
をします。
main.dartで、import 'package:flutter_gen/gen_l10n/app_localizations.dart';
が使えるか確認してください。
普通のパッケージでは、左側に出てくる赤い電球マークから該当パッケージをインストールできるのですが、なぜかこれは手動で打ち込まないといけないです。
import
文が反応しない場合は、Android studioを再起動すると治る場合があります。
私の場合はflutter pub get
をする度にエラーが出る(ビルドはできる)ので、その度に再起動してました。ただ、一回pub getをしてしまえば、arbファイルを書き換えると自動的に反映されるようになります。
④アプリファイル内で多言語対応の設定
MaterialApp内で、下記のように記載します。(flutter_localizations.dartをimportしてください)
MaterialApp(
localizationsDelegates: [
AppLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: [
const Locale('en', ''),
const Locale('ja', ''),
// ... 他のlocaleを追加
],
// ...
)
⑤使ってみる。
使う際には、Widget build(Buildcontext context){}
内で、下記のように宣言して使います。
AppLocalizations.of(context)!.test //英語設定なら"Test"、日本語設定なら"テスト"が表示される
testの部分は、app_en.arbファイルとapp_jp.arbファイルで設定した単語を選べます。
発生したエラー一覧
Null check
下記のように表示される場合は、MaterialApp
を2回宣言していないか、④で説明したdelegate文を全て含めているか、を確認してください。
Flutter returns null for AppLocalization.of(context)
関連記事
本HPでは、flutterの記事を準備編、開発編、申請編に分けて解説しています。
![](https://www.mechengjp.com/wp-content/uploads/2022/02/77dc6c5012bcc2906b87c85a17a4c9c4-300x169.jpg)
flutterの開発に関する記事まとめはこちら
参考記事
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9Rmx1dHRlciVFMyU4MSVBRSVFNSVBNCU5QSVFOCVBOCU4MCVFOCVBQSU5RSVFNSVBRiVCRSVFNSVCRiU5QyVFMyU4MSVBRiVFNiU4NCU4RiVFNSVBNCU5NiVFMyU4MSVBQiVFNyVCMCVBMSVFNSU4RCU5OCVFMyU4MSVBMCVFMyU4MSVBMyVFMyU4MSU5RiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZ0eHQtY29sb3I9JTIzMUUyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU2JnM9ZGU2ZTRlOTM5MDkzY2YxM2EzN2FiNzE2Yjc1Y2Q1YzY&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDBrYXp1dHh0JnR4dC1jb2xvcj0lMjMxRTIxMjEmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9MzYmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz02NjQxNjcwYzllOWE4OWY0MmU0ZGQ5ZTkxNWI5OTRiNg&blend-x=142&blend-y=486&blend-mode=normal&s=eb1bcd62f495dae0e0ff393115a6a2e4)
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Fadvent-calendar-ogp-background-7940cd1c8db80a7ec40711d90f43539e.jpg?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9Rmx1dHRlciVFMyU4MSVBN0xvY2FsaXphdGlvbiVFMyU4MSU5OSVFMyU4MiU4QiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZ0eHQtY29sb3I9JTIzM0EzQzNDJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU2JnM9OWUyNzdmMTdjOWRkNmY1MTU4MDI4YjRkNTMyOGVkMmI&mark-x=120&mark-y=96&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9OTcyJnR4dD0lNDBtYXJpYV9tYXJpJnR4dC1jb2xvcj0lMjMzQTNDM0MmdHh0LWZvbnQ9SGlyYWdpbm8lMjBTYW5zJTIwVzYmdHh0LXNpemU9MzYmdHh0LWFsaWduPWxlZnQlMkN0b3Amcz05Zjg3MTRjMTYwZjYyOTVkMzZmMWNmNDU1Yjg0MWMwZQ&blend-x=120&blend-y=500&blend-mode=normal&s=a282bcc929a6b6d9092cdddeff13c611)
コメント