Flutter

FlutterアプリをiOS・Androidで多言語対応する方法:easy_localizationで3言語に対応

· SEADICE

FlutterアプリをiOS・Android両対応で多言語化するには、easy_localization(バージョン3.0.7)を使うのが最速だ。JSONファイルに翻訳テキストを書くだけで英語・日本語・中国語に対応でき、コード生成なしで実装できる。

なぜ多言語対応が必要か

App Storeのダウンロード数の約65%は英語圏以外のユーザーによるものだ。日本語のみで作ったアプリは、海外ユーザーへのリーチを最初から諦めていることになる。

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での多言語設定

アプリ内の多言語対応とは別に、ストアのメタデータも各言語で登録する必要がある。これをしないと英語圏以外のストアで検索に出ない。

よくある質問

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(通常は英語)が表示されます。

← ブログ一覧へ