くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

Flutterのアプリ名を多言語化する

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の多言語対応

公式ドキュメントはこのあたり

iOSの場合は、Xcodeから操作が必要

$ 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.stringsInfo.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との兼ね合いがむずい。。

参考にしたサイトさま