Flutter本地化服务插件lit_localization_service的使用

Flutter本地化服务插件lit_localization_service的使用

概述

Lit Localization Service 是一个用于通过JSON文件创建本地化的Flutter包。

屏幕截图

英文本地化 德语本地化
'Hello Word' in English Localization 'Hello Word' in German Localization

如何工作

JSON文件在本地化委托中被获取。其内容将被提取到一个本地的Map中,并通过BuildContext访问。本地化的字符串可以通过调用LitLocalizations.of(context).getLocalizedValue("your_key_you_specified_on_the_json_file")来读取。

从本地存储读取重要值(如文本)需要在启动时检查当前获取过程的状态。这会增加应用的加载时间。它最适合在已经依赖于持久存储解决方案的情况下使用,因为启动时加载过程已经是必需的。

如何使用

设置

  1. 提供一个包含所有本地化字符串的JSON文件,并按预定义结构组织(见下文)。
  2. 在应用的pubspec.yaml文件中包含JSON文件资源。
    assets:
      - assets/json/
    
  3. lit_localization_service作为git依赖添加到应用的pubspec.yaml文件中:
    lit_localization_service:
      git: https://github.com/litlifesoftware/lit_localization_service.git
    
    或者作为pub依赖:
    lit_localization_service:
    
  4. 通过初始化LitLocalizationServiceDelegate设置MaterialApplocalizationsDelegates属性。提供JSON文件的位置。
    localizationsDelegates: [
      // 这里传递LitLocalizationServiceDelegate。
      LitLocalizationServiceDelegate(
        // 设置你的资产URL
        jsonAssetURL: 'assets/json/localized_strings.json',
        // 设置JSON文件中可用的所有语言代码
        supportedLanguages: ['en', 'de'],
        // 设置是否输出日志
        debug: true,
      ),
      GlobalMaterialLocalizations.delegate,
      GlobalWidgetsLocalizations.delegate,
      GlobalCupertinoLocalizations.delegate,
    ],
    
  5. 创建一个FutureBuilder以调用initLocalizations方法,以便监控解析状态,并根据解析状态有条件地返回包含本地化字符串的屏幕或回退/加载屏幕。
    class ParsingStateBuilder extends StatelessWidget {
      [@override](/user/override)
      Widget build(BuildContext context) {
        return FutureBuilder(
          future: LitLocalizationController().initLocalizations('assets/json/localized_strings.json'),
          builder: (context, localizatonsInitalization) {
            return localizatonsInitalization.connectionState == ConnectionState.waiting
                ? LoadingScreen()
                : MyHomeScreen();
          },
        );
      }
    }
    
  6. 一旦解析完成,通过访问BuildContext调用本地化的字符串。
    Text(LitLocalizations.of(context).getLocalizedValue("hello")),
    

JSON文件结构

JSON文件应包含一个对象列表,键可以是任意的。每个对象将有一系列键值对,表示语言和本地化字符串 <code>"languageCode": "Localized String"</code>

{
  "hello": {
    "en": "Hello",
    "de": "Hallo"
  },
  "world": {
    "en": "World",
    "de": "Welt"
  }
}

示例

example文件夹包含一个演示最基础实现的应用,使用本地JSON资源文件。

完整示例Demo

以下是一个完整的示例Demo,展示了如何使用lit_localization_service插件进行本地化。

import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:lit_localization_service/lit_localization_service.dart';

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

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Lit Localization Service Demo',
      home: ParsingStateBuilder(),
      debugShowCheckedModeBanner: false,
      localizationsDelegates: [
        // 这里传递LitLocalizationServiceDelegate。
        LitLocalizationServiceDelegate(
          // 设置你的资产URL
          jsonAssetURL: 'assets/json/localized_strings.json',
          // 设置JSON文件中可用的所有语言代码
          supportedLanguages: ['en', 'de'],
          // 设置是否输出日志
          debug: true,
        ),
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
        GlobalCupertinoLocalizations.delegate,
      ],
      supportedLocales: [
        // 英语(无国家代码)
        const Locale('en', ''),
        // 德语(无国家代码)
        const Locale('de', '')
      ],
    );
  }
}

/// 加载屏幕。
class LoadingScreen extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Text("Loading localizations ..."),
      ),
    );
  }
}

/// 一个根据JSON解析当前状态构建[LoadingScreen]或[MyHomeScreen]的小部件。
///
/// 必须使用未来的函数初始化本地化,以获得当前状态。一旦JSON解析完成,实际小部件就可以显示。如果还没有,只要解析还在进行中,就应该显示加载屏幕。
class ParsingStateBuilder extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return FutureBuilder(
      future: LitLocalizationController().initLocalizations('assets/json/localized_strings.json'),
      builder: (context, localizatonsInitalization) {
        return localizatonsInitalization.connectionState == ConnectionState.waiting
            ? LoadingScreen()
            : MyHomeScreen();
      },
    );
  }
}

/// 显示本地化字符串的主屏幕。
class MyHomeScreen extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Lit Localization Service Demo"),
      ),
      body: Center(
          child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          Text(LitLocalizations.of(context).getLocalizedValue("hello")),
          Text(LitLocalizations.of(context).getLocalizedValue("world")),
        ],
      )),
    );
  }
}

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

1 回复

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


lit_localization_service 是一个用于 Flutter 应用本地化的插件,它可以帮助你轻松地管理和切换应用中的多语言支持。以下是如何在 Flutter 项目中使用 lit_localization_service 的基本步骤。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 lit_localization_service 依赖:

dependencies:
  flutter:
    sdk: flutter
  lit_localization_service: ^1.0.0

然后运行 flutter pub get 来安装依赖。

2. 创建本地化文件

在项目中创建一个 locales 文件夹,并在其中为每种支持的语言创建一个 JSON 文件。例如:

  • locales/en.json
  • locales/es.json

每个 JSON 文件包含键值对,表示应用中的文本内容。例如:

en.json:

{
  "welcome": "Welcome",
  "goodbye": "Goodbye"
}

es.json:

{
  "welcome": "Bienvenido",
  "goodbye": "Adiós"
}

3. 初始化 LitLocalizationService

main.dart 文件中初始化 LitLocalizationService,并设置默认语言:

import 'package:flutter/material.dart';
import 'package:lit_localization_service/lit_localization_service.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  
  await LitLocalizationService.initialize(
    localesPath: 'locales',
    defaultLocale: 'en',
  );

  runApp(MyApp());
}

4. 使用 LitLocalizationService 获取本地化文本

在应用中使用 LitLocalizationService 来获取本地化文本。例如:

import 'package:flutter/material.dart';
import 'package:lit_localization_service/lit_localization_service.dart';

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text(LitLocalizationService.get('welcome')),
        ),
        body: Center(
          child: Text(LitLocalizationService.get('goodbye')),
        ),
      ),
    );
  }
}

5. 切换语言

你可以通过调用 LitLocalizationService.setLocale 方法来动态切换语言。例如:

ElevatedButton(
  onPressed: () {
    LitLocalizationService.setLocale('es');
  },
  child: Text('Switch to Spanish'),
)

6. 监听语言变化

如果你希望在语言变化时更新 UI,可以使用 LitLocalizationService.localeStream 来监听语言变化:

StreamBuilder(
  stream: LitLocalizationService.localeStream,
  builder: (context, snapshot) {
    return Text(LitLocalizationService.get('welcome'));
  },
)

7. 使用 LitLocalizationDelegate 进行更高级的本地化

如果你需要更高级的本地化功能,可以使用 LitLocalizationDelegate 来与 MaterialApp 集成:

return MaterialApp(
  locale: LitLocalizationService.currentLocale,
  supportedLocales: LitLocalizationService.supportedLocales,
  localizationsDelegates: [
    LitLocalizationDelegate(),
    GlobalMaterialLocalizations.delegate,
    GlobalWidgetsLocalizations.delegate,
  ],
  home: MyHomePage(),
);

8. 处理动态参数

如果你的本地化字符串包含动态参数,可以使用 LitLocalizationService.getWithParams 方法:

{
  "greeting": "Hello, {name}!"
}
Text(LitLocalizationService.getWithParams('greeting', {'name': 'John'}))

9. 支持的语言列表

确保在 LitLocalizationService.initialize 中提供支持的语言列表:

await LitLocalizationService.initialize(
  localesPath: 'locales',
  defaultLocale: 'en',
  supportedLocales: ['en', 'es'],
);
回到顶部