Flutter - International 国际化,Localization 本地化, 使用字符串Map

简介: 记录一种简单的方式实现字符串的国际化。这里没有用到Intl包,而是将所需的字符串存放在一个map中。步骤:MaterialApp中添加本地化代理和语言类型创建文字资源文件新建一个类继承LocalizationsDelegate,和文字资源文件联系起来使用代理获取想要的文字资源新建项目international_demo,得到一个带按钮示例工程。

记录一种简单的方式实现字符串的国际化。
这里没有用到Intl包,而是将所需的字符串存放在一个map中。

步骤:

  • MaterialApp中添加本地化代理和语言类型
  • 创建文字资源文件
  • 新建一个类继承LocalizationsDelegate,和文字资源文件联系起来
  • 使用代理获取想要的文字资源

新建项目international_demo,得到一个带按钮示例工程。改造一下MaterialApp

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Demo',
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      localizationsDelegates: [// 添加区域
        // 准备在这里添加我们自己创建的代理
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      supportedLocales: [ // 添加区域
        const Locale('en', 'US'), // English
        const Locale('he', 'IL'), // Hebrew
        // 可以继续添加我们想要支持的语言类型
      ],
      home: new MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

创建资源文件

新建localization_src.dart,将字符串存入一个map中。

import 'package:flutter/material.dart';

class DemoLocalizations {
  DemoLocalizations(this.locale);

  final Locale locale;

  static DemoLocalizations of(BuildContext context) {
    return Localizations.of<DemoLocalizations>(context, DemoLocalizations);
  }

  static Map<String, Map<String, String>> _localizedValues = {
    'en': {
      'title': 'Hello World',
    },
    'es': {
      'title': 'Hola Mundo',
    },
    'zh': {
      'title': '你好呀',
    },
  };

  String get title {
    return _localizedValues[locale.languageCode]['title'];
  }
}

这里仅以title为例,有英语、西班牙语和中文三种。

创建代理

新建一个类继承LocalizationsDelegate,复写3个方法。

import 'dart:async';

import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:international_demo/localization_src.dart';

class DemoLocalizationsDelegate
    extends LocalizationsDelegate<DemoLocalizations> {
  const DemoLocalizationsDelegate();

  @override
  bool isSupported(Locale locale) =>
      ['en', 'es', 'zh'].contains(locale.languageCode);

  @override
  Future<DemoLocalizations> load(Locale locale) {
    return SynchronousFuture<DemoLocalizations>(DemoLocalizations(locale));
  }

  @override
  bool shouldReload(DemoLocalizationsDelegate old) => false;
}

复写的load方法中,使用了SynchronousFuture

使用代理

回到main.dart

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new MaterialApp(
      title: 'Flutter Demo',
      theme: new ThemeData(
        primarySwatch: Colors.blue,
      ),
      localizationsDelegates: [
        DemoLocalizationsDelegate(),// 这是我们新建的代理
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      supportedLocales: [
        const Locale('en', 'US'), // English
        const Locale('he', 'IL'), // Hebrew
        const Locale('zh', ''),   // 新添中文,后面的countryCode暂时不指定
      ],
      home: new MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

_MyHomePageState中调用DemoLocalizations

    DemoLocalizations localizations = DemoLocalizations.of(context);
    print(localizations); // 打印出 I/flutter (25535): Instance of 'DemoLocalizations'

观察logcat,可知我们获得了DemoLocalizations的实例。

获取title

DemoLocalizations.of(context).title

如果需要更多的字符串,需要我们手动在资源文件的map中添加。
这里仅以title为例。

文件

参考:

  • 官方文档 https://flutter.io/tutorials/internationalization/
目录
相关文章
|
12月前
|
Java
【Java每日一题,Map和字符串】Ananagrams
【Java每日一题,Map和字符串】Ananagrams
|
30天前
|
JSON 自然语言处理 Android开发
Flutter本地化(国际化)之App名称
Flutter本地化(国际化)之App名称
34 1
|
2月前
|
存储 Dart 开发工具
flutter实现语言的国际化
【7月更文挑战第16天】
27 1
|
4月前
|
Go
|
4月前
|
自然语言处理 前端开发 开发者
【Flutter前端技术开发专栏】Flutter中的国际化与本地化支持
【4月更文挑战第30天】Flutter支持国际化与本地化,借助`Intl`包和`Localizations`类,帮助开发者实现多语言应用。`Intl`提供日期、时间格式化,而`Localizations`管理不同语言环境的资源。在`pubspec.yaml`添加`intl`依赖,创建本地化资源文件并定义`LocalizationsDelegate`。通过`Localizations.of()`获取本地化资源,实现应用适应不同语言环境。
179 0
【Flutter前端技术开发专栏】Flutter中的国际化与本地化支持
|
4月前
|
存储 自然语言处理 API
Flutter应用的国际化支持:实现多语言环境的优雅策略
【4月更文挑战第26天】Flutter提供强大的国际化(i18n)和本地化(l10n)支持,使开发者能轻松实现应用多语言特性。通过定义`.arb`文件来管理字符串资源,使用`LocalizationsDelegate`加载资源,设置应用语言环境,以及在UI中使用`S.of(context).someString`访问字符串。进阶技巧包括字符串格式化、复数形式、双向文本和Unicode支持。充分测试确保所有语言正确显示。随着全球化需求增长,Flutter的国际化支持成为应用开发关键。
|
前端开发 JavaScript API
ES6-ES11-第一部分-let、const、解构赋值、模板字符串、简化对象写法、箭头函数、函数参数默认值、rest 参数、扩展运算符、Symbol、迭代器、生成器、Promise、Set、Map(五)
ES6-ES11-第一部分-let、const、解构赋值、模板字符串、简化对象写法、箭头函数、函数参数默认值、rest 参数、扩展运算符、Symbol、迭代器、生成器、Promise、Set、Map(五)
|
4月前
|
存储 容器
Flutter 应用服务:主题、暗黑、国际化、本地化-app_service库
Flutter 应用服务:主题、暗黑、国际化、本地化-app_service库
219 0
|
4月前
|
算法 测试技术 C#
【map】【滑动窗口】【字典树】C++算法:最长合法子字符串的长度
【map】【滑动窗口】【字典树】C++算法:最长合法子字符串的长度
|
10月前
|
JSON 数据格式
JSON字符串与Map互转
JSON字符串与Map互转
360 0