iT邦幫忙

2023 iThome 鐵人賽

DAY 12
0
Mobile Development

好好用的 flutter 套件系列 第 12

好好用的 flutter 套件 - Day 12 intl

  • 分享至 

  • xImage
  •  

需求

一個app 最少也有兩種語言 英文和中文 ,但在flutter 要如何實作呢?
那就來看一下 intl 如何用吧

intl - Readme

intl 除了國際化和在地化,還包括訊息翻譯、複數和性別、日期/數字格式和解析以及雙向文字。
Intl.defaultLocale = 'pt_BR'; //set the global locale

Intl.defaultLocale = 'es';
DateFormat.jm().format(DateTime.now());

intl - Installing

直接在 pubspec.yaml 加上 ntl: ^0.18.0 ,然後pub get 
dependencies:
  intl: ^0.18.0  

https://ithelp.ithome.com.tw/upload/images/20230926/20121643I8TvEWSNa0.png

但 intl 有相依性,要再加上 flutter_localizations

dependencies:
    flutter_localizations:
    sdk: flutter

intl - Example

intl 的 package info 沒有 Example 大家要參考官網的說明或搜尋一下
  1. 建立語言資源文件
    建立 en.json和 zh.json 檔,放在 path/locales 目錄中

en.json

{
  "Day12 intl": "Day12 intl internationalization and localization"
}   

zh.json

{
  "Day12 intl": "Day12 intl 國際化和在地化"
}
  1. 在pubspec.yaml中宣告資源
flutter:
  assets:
    - lib/l10n/en.json
    - lib/l10n/zh.json
  1. 加上 AppLocalizations class
class AppLocalizations {
  final Locale locale;
  Map<String, String>? _localizedStrings;

  AppLocalizations(this.locale);

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

  Future<bool> load() async {
    String jsonString = await rootBundle.loadString('lib/l10n/${locale.languageCode}.json');
    Map<String, dynamic> jsonMap = json.decode(jsonString);

    _localizedStrings = jsonMap.map((key, value) {
      return MapEntry(key, value.toString());
    });

    return true;
  }

  String translate(String key) {
    return _localizedStrings?[key] ?? 'Missing translation';
  }
}
  1. 實作 LocalizationsDelegate
class AppLocalizationsDelegate extends LocalizationsDelegate<AppLocalizations> {
  const AppLocalizationsDelegate();

  @override
  bool isSupported(Locale locale) {
    return ['en', 'zh'].contains(locale.languageCode);
  }

  @override
  Future<AppLocalizations> load(Locale locale) async {
    AppLocalizations localizations = new AppLocalizations(locale);
    await localizations.load();
    return localizations;
  }

  @override
  bool shouldReload(AppLocalizationsDelegate old) => false;
}
  1. 配置MaterialApp
return MaterialApp(
...
localizationsDelegates: [
        AppLocalizationsDelegate(),
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      supportedLocales: [
        Locale('en', 'US'),
        Locale('zh', 'TW'),
      ],
      localeResolutionCallback: (locale, supportedLocales) {
        if (locale == null) {
          return supportedLocales.first;
        }
        for (var supportedLocale in supportedLocales) {
          if (supportedLocale.languageCode == locale.languageCode &&
              supportedLocale.countryCode == locale.countryCode) {
            return supportedLocale;
          }
        }
        return supportedLocales.first;
      },
...      
  1. 多語系使用方式
Text(AppLocalizations.of(context)?.translate('Day12 intl')?? "data"),

執行結果

intl zh 中文

https://ithelp.ithome.com.tw/upload/images/20230926/20121643gFvDEvwCLe.png

intl en 英文

https://ithelp.ithome.com.tw/upload/images/20230926/201216432N1ZYZZy3Y.png

心得

intl 使用起來相對沒有前面幾天介紹的簡單,有遇到要相依套件、文件沒有範例,
一一克服後,還算滿好用的

參考

https://docs.flutter.dev/ui/accessibility-and-localization/internationalization


上一篇
好好用的 flutter 套件 - Day 11 share_plus
下一篇
好好用的 flutter 套件 - Day 13 package_info_plus
系列文
好好用的 flutter 套件30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言