Flutterの多言語対応(internationalization/l10n)は、
flutter_localizations
をつかった方法が公式ドキュメントはこれ
Android/iOSのビルド関連はこのあたりに書かれているけど、
ホームに表示されたりするアプリ名についてはそれぞれで対応しないといけないっぽい。
Androidの多言語対応
公式ドキュメントはこのあたり
res
配下の各ディレクトリの末尾に、-<language code>
をつければOK。
今回はアプリ名(文字)なので、values/strings.xml
を使う。
res/ values/ ... デフォルト(英語) strings.xml values-ja/ ... 日本語 strings.xml
利用できるのは言語コードなどはこのあたり。
それぞれの言語のディレクトリにあった内容を用意する
<!-- android/app/src/main/res/values/strings.xml --> <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">My App</string> </resources> <!-- android/app/src/main/res/values-ja/strings.xml --> <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">まいアプリ</string> </resources>
あとは、この値(app_name
)を参照するように、
AndroidManifest.xmlを変更すればOK
<!-- android/app/src/main/AndroidManifest.xml --> <manifest xmlns:android="http://schemas.android.com/apk/res/android"> <application android:label="@string/app_name" ...>
flavorを使っている場合
flavorをつかって開発用などを分けている場合は、
必要に応じて、flavor用のリソースディレクトリにも配置すればOK
android/app/src/<flavor_name>/res/values-ja/strings.xml
flutter_flavorizrを使っている場合は、
build.gradle側でresValue
を追加してたりするので、コメントアウトや削除しておく。
// android/app/build.gradle android { // ----- BEGIN flavorDimensions (autogenerated by flutter_flavorizr) ----- flavorDimensions "flavor-type" productFlavors { dev { dimension "flavor-type" applicationId "com.memorylovers.myapp.dev" // resValue "string", "app_name", "DEV: My App" } stag { dimension "flavor-type" applicationId "com.memorylovers.myapp.stag" // resValue "string", "app_name", "STAG: My App" } prod { dimension "flavor-type" applicationId "com.memorylovers.myapp" // resValue "string", "app_name", "My App" } } // ----- END flavorDimensions (autogenerated by flutter_flavorizr) -----
コメントアウトしておかないと、こんなエラーが出る。。
ERROR:[string/app_name] ../app/android/app/src/main/res/values/strings.xml [string/app_name] ../app/build/app/generated/res/resValues/dev/debug/values/gradleResValues.xml: Resource and asset merger: Duplicate resources FAILURE: Build failed with an exception. * What went wrong: Execution failed for task ':app:mergeDevDebugResources'. > [string/app_name] ../app/android/app/src/main/res/values/strings.xml [string/app_name] ../app/build/app/generated/res/resValues/dev/debug/values/gradleResValues.xml: Error: Duplicate resources
iOSの多言語対応
公式ドキュメントはこのあたり
- Localization | Apple Developer Documentation
- Localizing and varying text with a string catalog | Apple Developer Documentation
- What is localization? - Xcode Help
$ open ios/Runner.xcworkspace
言語の追加
RunnerのInfoを選択して、Locatiozationsを開く
「+」から日本語(Japanese)を追加
言語ファイルの追加
メニューから「File > New > File...」を選択
ResourceのStrings Fileを選択
InfoPlist.strings
という名前で作成
違う名前だと認識されないので注意。。
ファイルを作成したら、右のパネルの
「Localize...」から言語を追加
日本語(Japanese)を選択
もう一度、右のパネルから、
Localizationに使う言語にチェックを入れればOK
アプリ名の多言語化
iOSのアプリ名は、Info.plistのCFBundleDisplayName
で指定
InfoPlist.strings
はInfo.plist
用の多言語ファイルで、
多言語対応したいキーをしていすればOK
ファイルを作ったあとは、以下の場所にあるので、
VSCode上でも編集しやすくなる
// ios/en.lproj/InfoPlist.strings CFBundleDisplayName = "My App"; // ios/ja.lproj/InfoPlist.strings CFBundleDisplayName = "まいアプリ";
flavorを使っている場合
flutter_flavorizrを使っている場合は、
こんなふうになっていて、
<!-- ios/Runner/Info.plist --> <dict> <key>CFBundleDisplayName</key> <string>$(BUNDLE_DISPLAY_NAME)</string> </dict>
各設定ファイルで指定されている。
// ios/Flutter/devDebug.xcconfig BUNDLE_DISPLAY_NAME=My App
iOSの場合は、InfoPlist.strings
で上書きされる形のようで、
そのままでも実行はできるけど、削除やデフォルト値にしておいてもいいかも。
以上!! flavorとの兼ね合いがむずい。。