Flutter本地化插件fcm_localization的使用

Flutter本地化插件fcm_localization的使用

在本教程中,我们将详细介绍如何使用 fcm_localization 插件来实现 Flutter 应用程序的本地化。我们将从创建本地化类开始,然后初始化配置,并最终发送包含本地化消息的通知。

初始化

首先,你需要创建一个用于本地化的类:

class MyTranslationMessages extends TranslationMessages {
  @override
  String get defaultLocale => "ar";

  @override
  Map<String, Map<String, String>> get messages => {
        "ar": {
          "new_offer": "عرض جديد",
          "new_offer_body": "لديك عرض جديد علي طلبك رقم {order_id} في تصنيف {category_name_ar}",
        },
        "en": {
          "new_offer": "New offer",
          "new_offer_body": "You have a new offer on your request number {order_id} on {category_name_en}",
        },
      };
}

在这个例子中,我们定义了两种语言(阿拉伯语和英语),并为每种语言提供了相应的本地化字符串。

接下来,你需要初始化 fcm_configfcm_localizations

void main() async {
  // 初始化 fcm_config
  await FCMConfig().init();

  // 初始化 fcm_localizations
  await FCMLocalization.init(MyTranslationMessages());

  runApp(
    // 这里你可以获取已保存的语言环境
    MyHomePage(locale: await FCMLocalization.getSavedLocale(Locale("ar"))),
  );
}

获取已保存的语言环境

你可以通过以下方式获取已保存的语言环境:

// 带默认值
var locale = await FCMLocalization.getSavedLocale(Locale("ar"));

// 不带默认值
var locale = await FCMLocalization.getSavedLocale();

更改应用语言环境时保存

每次更改应用程序的语言环境时,你都需要保存它:

FCMLocalization.setLocale(Locale("ar"));

发送通知

当你从后端或其他方式发送通知时,需要遵循以下步骤:

  1. 仅发送数据部分。
  2. 数据必须包含 title_loc_keybody_loc_key
  3. 消息中的任何参数都必须在数据的根目录下。

示例 JSON 数据:

{
  "to": "...",
  "data": {
    "title_loc_key": "new_offer",
    "body_loc_key": "new_offer_body",
    "category_name_ar": "سيارات",
    "category_name_en": "Cars",
    "order_id": "77676"
  },
  "priority": "high"
}

更多关于Flutter本地化插件fcm_localization的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter本地化插件fcm_localization的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


fcm_localization 是一个用于在 Flutter 应用中实现本地化的插件,特别是结合 Firebase Cloud Messaging (FCM) 进行消息推送时,能够根据用户的语言偏好自动选择推送消息的本地化内容。

安装插件

首先,你需要在 pubspec.yaml 文件中添加 fcm_localization 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  fcm_localization: ^1.0.0  # 请检查最新版本

然后运行 flutter pub get 来安装插件。

配置 Firebase

在使用 fcm_localization 之前,你需要确保已经在项目中正确配置了 Firebase。以下是基本的配置步骤:

  1. 在 Firebase Console 中创建项目:如果你还没有 Firebase 项目,请先在 Firebase 控制台 中创建一个新项目。

  2. 添加 Android 和 iOS 应用

    • 对于 Android:在 Firebase 控制台中添加 Android 应用,并下载 google-services.json 文件,将其放置在 android/app 目录下。
    • 对于 iOS:在 Firebase 控制台中添加 iOS 应用,并下载 GoogleService-Info.plist 文件,将其添加到 Xcode 项目中。
  3. 配置 Flutter 应用

    • android/app/build.gradle 文件中添加 google-services 插件:
      apply plugin: 'com.google.gms.google-services'
      
    • ios/Runner/AppDelegate.swift 文件中添加 Firebase 初始化代码:
      import UIKit
      import Flutter
      import Firebase
      
      @UIApplicationMain
      @objc class AppDelegate: FlutterAppDelegate {
        override func application(
          _ application: UIApplication,
          didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
        ) -> Bool {
          FirebaseApp.configure()
          GeneratedPluginRegistrant.register(with: self)
          return super.application(application, didFinishLaunchingWithOptions: launchOptions)
        }
      }
      
  4. 添加 Firebase 依赖: 在 pubspec.yaml 中添加 Firebase Core 和 Firebase Messaging 插件:

    dependencies:
      flutter:
        sdk: flutter
      firebase_core: latest_version
      firebase_messaging: latest_version
      fcm_localization: ^1.0.0
    

使用 fcm_localization

  1. 初始化 fcm_localization: 在 main.dart 文件中初始化 fcm_localization

    import 'package:flutter/material.dart';
    import 'package:fcm_localization/fcm_localization.dart';
    
    void main() async {
      WidgetsFlutterBinding.ensureInitialized();
      await Firebase.initializeApp();
      await FcmLocalization.initialize(
        defaultLanguage: 'en',  // 默认语言
        supportedLanguages: ['en', 'es', 'fr'],  // 支持的语言
      );
      runApp(MyApp());
    }
    
  2. 处理 FCM 消息: 使用 FirebaseMessaging 来处理收到的消息,并根据语言显示本地化内容:

    import 'package:firebase_messaging/firebase_messaging.dart';
    import 'package:fcm_localization/fcm_localization.dart';
    
    class MyApp extends StatelessWidget {
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          home: Scaffold(
            appBar: AppBar(
              title: Text('FCM Localization Example'),
            ),
            body: Center(
              child: Text('Hello, World!'),
            ),
          ),
        );
      }
    
      void _initializeFcm() async {
        FirebaseMessaging messaging = FirebaseMessaging.instance;
    
        // 请求通知权限
        NotificationSettings settings = await messaging.requestPermission();
    
        if (settings.authorizationStatus == AuthorizationStatus.authorized) {
          FirebaseMessaging.onMessage.listen((RemoteMessage message) {
            String? localizedTitle = FcmLocalization.getLocalizedString(
              message.data['title'],
              message.data['title_es'],
              message.data['title_fr'],
            );
    
            String? localizedBody = FcmLocalization.getLocalizedString(
              message.data['body'],
              message.data['body_es'],
              message.data['body_fr'],
            );
    
            showDialog(
              context: context,
              builder: (BuildContext context) {
                return AlertDialog(
                  title: Text(localizedTitle ?? 'Notification'),
                  content: Text(localizedBody ?? 'No message body'),
                  actions: [
                    TextButton(
                      child: Text('OK'),
                      onPressed: () {
                        Navigator.of(context).pop();
                      },
                    ),
                  ],
                );
              },
            );
          });
        }
      }
    }
    
  3. 发送本地化消息: 在 Firebase 控制台或通过 API 发送 FCM 消息时,确保消息的 data 字段包含不同语言的标题和内容。例如:

    {
      "data": {
        "title": "Hello",
        "title_es": "Hola",
        "title_fr": "Bonjour",
        "body": "This is a message",
        "body_es": "Esto es un mensaje",
        "body_fr": "Ceci est un message"
      }
    }
回到顶部