FlutterアプリをiOS・Androidで多言語対応する方法:easy_localizationで3言語に対応
FlutterアプリをiOS・Android両対応で多言語化するには、easy_localization(バージョン3.0.7)を使うのが最速だ。JSONファイルに翻訳テキストを書くだけで英語・日本語・中国語に対応でき、コード生成なしで実装できる。
なぜ多言語対応が必要か
App Storeのダウンロード数の約65%は英語圏以外のユーザーによるものだ。日本語のみで作ったアプリは、海外ユーザーへのリーチを最初から諦めていることになる。
- App Store評価が上がる: ユーザーの母国語でUIが表示されると離脱率が下がり、レビュー評価が平均0.3〜0.5点向上する
- 検索に引っかかる: App Store Connectで各言語のメタデータを登録すると、その国のストア検索に表示される
- 実装コストが低い: easy_localizationなら既存コードの変更量は最小限。文字列をJSONに分離するだけで済む
easy_localizationの導入手順
pubspec.yamlへの追加からアプリ起動設定まで、3ステップで完了する。
Step 1: パッケージを追加する
pubspec.yaml に以下を追加して flutter pub get を実行する。
dependencies:
easy_localization: ^3.0.7
flutter_localizations:
sdk: flutter
flutter:
assets:
- assets/lang/
Step 2: main.dartを更新する
import 'package:easy_localization/easy_localization.dart';
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await EasyLocalization.ensureInitialized();
runApp(
EasyLocalization(
supportedLocales: const [
Locale('en'),
Locale('ja'),
Locale('zh'),
],
path: 'assets/lang',
fallbackLocale: const Locale('en'),
child: const MyApp(),
),
);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
localizationsDelegates: context.localizationDelegates,
supportedLocales: context.supportedLocales,
locale: context.locale,
home: const HomePage(),
);
}
}
Step 3: iOSの設定を追加する
ios/Runner/Info.plist に対応言語を追加しないと、iOSシステム言語の切り替えが機能しない。
<key>CFBundleLocalizations</key>
<array>
<string>en</string>
<string>ja</string>
<string>zh-Hans</string>
</array>
言語JSONファイルの作成
JSONファイルはキーと翻訳テキストのペアで記述する。ファイルをassets/lang/に置くだけで自動的に読み込まれる。
assets/lang/en.json
{
"app_title": "My App",
"home_greeting": "Hello!",
"quiz_correct": "Correct!",
"quiz_wrong": "Wrong! The answer is {answer}",
"score_label": "Score: {score} / {total}"
}
assets/lang/ja.json
{
"app_title": "マイアプリ",
"home_greeting": "こんにちは!",
"quiz_correct": "正解!",
"quiz_wrong": "不正解!答えは{answer}です",
"score_label": "スコア: {score} / {total}"
}
assets/lang/zh.json
{
"app_title": "我的应用",
"home_greeting": "你好!",
"quiz_correct": "正确!",
"quiz_wrong": "错误!答案是{answer}",
"score_label": "得分: {score} / {total}"
}
コードで翻訳テキストを使う
文字列の末尾に .tr() を付けるだけで翻訳が適用される。プレースホルダーは namedArgs で渡す。
// シンプルな翻訳
Text('home_greeting'.tr())
// プレースホルダーあり
Text('quiz_wrong'.tr(namedArgs: {'answer': 'ねこ'}))
// スコア表示
Text('score_label'.tr(namedArgs: {
'score': score.toString(),
'total': total.toString(),
}))
| 機能 | 書き方 |
|---|---|
| シンプルな翻訳 | 'key'.tr() |
| プレースホルダー | 'key'.tr(namedArgs: {'name': value}) |
| 複数形 | 'key'.plural(count) |
| 言語切り替え | context.setLocale(Locale('en')) |
| 現在の言語 | context.locale.languageCode |
App Store・Google Playでの多言語設定
アプリ内の多言語対応とは別に、ストアのメタデータも各言語で登録する必要がある。これをしないと英語圏以外のストアで検索に出ない。
- App Store Connect: 「App情報」→「ローカライズ」で言語を追加し、説明文・キーワードを各言語で入力する
- Google Play Console: 「ストアの掲載情報」→「翻訳を管理」から各言語のメタデータを追加する
- スクリーンショットも言語ごとに用意すると審査通過率が上がる
- 中国語(簡体字)対応時は
zh-Hans、繁体字はzh-Hantを使う
よくある質問
easy_localizationとflutter_localizationsの違いは何ですか?
flutter_localizationsはFlutter公式のパッケージで、ARBファイルとコード生成が必要です。easy_localizationはJSONファイルに書くだけで動き、個人開発の規模では圧倒的に速く実装できます。
多言語対応するとApp Storeの審査に影響しますか?
審査自体への影響はありません。ただしApp Store ConnectでもメタデータをApp内の対応言語に合わせて登録すると、各国のストア検索に表示されやすくなります。
翻訳をAIで自動生成することはできますか?
できます。en.jsonをClaudeやDeepLに渡して「このJSONをja.jsonとzh.jsonに翻訳して」と依頼するのが最速です。固有名詞や専門用語は人力で確認することを推奨します。
言語切り替えボタンをアプリ内に実装するべきですか?
基本的には不要です。easy_localizationはiOS・Androidのシステム言語設定を自動で読み取ります。未対応言語の場合はfallbackLocale(通常は英語)が表示されます。