8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[Flutter]多言語化対応で、アプリをグローバル化しよう!

Posted at

概要

少々大袈裟なタイトルですが・・・
どうせアプリをリリースするなら、日本だけでなく世界中の方に使ってもらいたいですよね!

Flutterは、多言語対応を容易に行うことができます!
ユーザーの言語設定に応じた表示が可能になるということです。

本記事では、Flutterアプリを日本語、英語、中国語
に対応させるための具体的な手順を解説します!

サンプル(日本語)

スクリーンショット 2024-10-20 19.09.01.png

サンプル(英語)

スクリーンショット 2024-10-20 19.09.37.png

多言語化の説明

Flutterには、flutter_localizationsパッケージが標準で用意されており、
多言語対応を行います。
またintlパッケージを利用することで、ローカライズされた文字列を管理しやすくします。

パッケージをインストールしよう

Flutterで多言語化を実現するために、以下のパッケージを使用します。

・flutter_localizations: Flutterの標準ローカライゼーションサポート。
・intl: 国際化とローカライゼーションをサポートするパッケージ。
これらのパッケージを使って、アプリに多言語対応を追加します!

参考URL

pubspec.yaml

pubspec.yamlに記載でもOKです。

pubspec.yaml
dependencies:
  flutter:
    sdk: flutter
  flutter_localizations: # 上記記載の多言語ライブラリ
    sdk: flutter  
  intl: "^0.17.0" # format等関連ライブラリ
  
flutter:
  generate: true #自動生成フラグの有効化

その後以下コマンドで依存関係をインストールします。

flutter pub get

多言語対応の設定

次にFlutterアプリで多言語対応を有効にするため、MaterialAppの設定を行います。

main.dart
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:intl/intl.dart';
import 'l10n/l10n.dart'; // l10nファイルをインポート

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      
      // 多言語化設定
      // ==============================================
      locale: Locale('en'), // デフォルト言語を英語に設定
      supportedLocales: L10n.all, // 対応する言語を設定
      localizationsDelegates: [
        AppLocalizations.delegate,
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
      // ==============================================
      
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(AppLocalizations.of(context)!.title),
      ),
      body: Center(
        child: Text(AppLocalizations.of(context)!.welcome),
      ),
    );
  }
}

l10nのファイル作成

Flutterでは、l10n(localization)ファイルを使って、
各言語に対応するテキストを管理します。

そもそもl10nって?

アプリケーションの多言語対応のために使われるリソースファイルです。
各言語に対応するテキストがJSON形式で定義され、
「.arb」ファイルとして管理されています。

arb (Application Resource Bundle)

l10nファイルを作成してみよう!

lib/l10nディレクトリを作成し、
その中にintl_<言語コード>.arbファイルを用意します。

arbファイルは、言語によってコードが変わります!
・日本語:intl_ja
・英語:intl_en
・中国語:intl_zh

では日本語・英語・中国語のファイルを作成してみましょう!

lib/l10n/intl_en.arb

intl_en.arb
{
  "title": "Welcome",
  "welcome": "Welcome to our app!"
}

lib/l10n/intl_ja.arb

intl_ja.arb
{
  "title": "ようこそ",
  "welcome": "アプリへようこそ!"
}

lib/l10n/intl_zh.arb

intl_zh.arb
{
  "title": "欢迎",
  "welcome": "欢迎使用我们的应用!"
}

これらのファイルは、それぞれの言語に対応するテキストを定義します。
使用できる表現とそうでない表現もありそうです。

arbファイルを作成してビルドする

arbファイルを作成後にビルドをすると、自動でファイルが生成されます。

スクリーンショット 2024-10-20 19.34.17.png

前章で作成したarbファイルの場合、英語版では下記のようなファイルが
自動で生成されます。

注意!

arbファイルに不備があると、
クラッシュやエラーの原因になりますので注意!

app_localizations_ja.dart
import 'package:intl/intl.dart' as intl;

import 'app_localizations.dart';

// ignore_for_file: type=lint

/// The translations for English (`en`).
class AppLocalizationsEn extends AppLocalizations {
  AppLocalizationsEn([String locale = 'en']) : super(locale);

  @override
  String get title => 'Welcome';
}

アプリに実装しよう!

これらの設定を反映させることで、言語切り替えが可能になります!
Flutterはデバイスの言語設定に基づいて、適切な言語リソースを自動的に選択します。

では実際に実装して動作確認してみましょう!

main.dart
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:intl/intl.dart';
import 'l10n/l10n.dart'; // l10nファイルをインポート

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      
      // 多言語化設定
      // ==============================================
      locale: Locale('en'), // デフォルト言語を英語に設定
      supportedLocales: L10n.all, // 対応する言語を設定
      localizationsDelegates: [
        AppLocalizations.delegate,
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
      // ==============================================
      
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(AppLocalizations.of(context)!.title),
      ),
      body: Center(
        // ここにTextで設定したファイルの内容を表示する
        child: Text(AppLocalizations.of(context)!.title),
      ),
    );
  }
}

動作結果(中国語)

スクリーンショット 2024-10-20 19.42.27.png

動作結果(英語)

冒頭に貼りましたが一応!

スクリーンショット 2024-10-20 19.09.37.png

動作結果(日本語)

スクリーンショット 2024-10-20 19.09.01.png

まとめ

設定やライブラリのインストールはもちろん必要にはなりますが、
意外と簡単ではないでしょうか?

端末の設定によって表示する内容を簡単に変えられます。
日本語ユーザーのみならず、世界中の方が対象になるアプリを作っちゃいましょう!

この記事が参考になれば幸いです!

参考文献

8
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?