Flutter國際化 多語言 使用Flutter intl插件實現多語言

前言

開始的時候我以爲沒有必要使用插件來實現國際化 , 幾個json文件一加載就完事了,而後配置一下語言相關的處理. 可是使用了插件以後我真香了 , 真的是簡單了太多了.git

準備工做

搜索插件並安裝 : Flutter Intl

插件

項目配置

添加依賴:github

dev_dependencies:
...
  //add this
  flutter_localizations:
    sdk: flutter

複製代碼

在菜單欄的Tool下找到Flutter Intl 並選擇Initalize for the project, 配置結束後效果以下:json

image-20200819233727693

  1. 會在 pubspec.yaml中增長如下字段
flutter_intl:  
    enabled: true
複製代碼
  1. 會在lib目錄下增長 generated 和 l10n兩個包

image-20200819234311852

  • generated包下的intl包默認存在一個messages_all.dartmessages_en.dart文件,messages開頭的文件會在添加語言後自動生成
  • l10n包下存在一個intl_en.arb文件
  1. 使用Add Locale生成其餘語言的arb文件markdown

    image-20200819234431082

例如:zh_CN , 會在l10n包下生成Intl_zh_CN.arb文件 , 可在其中填入對應的文案.oop

  1. 設置國際化語言
return MaterialApp(
  ...
    localizationsDelegates: const [
      S.delegate,
      GlobalMaterialLocalizations.delegate,
      GlobalCupertinoLocalizations.delegate,
      GlobalWidgetsLocalizations.delegate
    ],
    supportedLocales: S.delegate.supportedLocales,
    localeListResolutionCallback: (locales, supportedLocales) {
      print(locales);
      return;
    },
  ...
);

複製代碼
  1. 使用

在須要配置國際化的地方調用S.of(context).key便可.ui

沒有context 時可使用S.current.keythis

具體使用方式請參考本項目的代碼spa

注意 :.net

  1. 支持語言的順序爲字符串排序 (如zh_A會在zh_B以前) , 並不是添加語言的順序.
  2. 假設系統語言爲zh_TW , 項目並不支持,會優先尋找zh的其餘語言 , 以supportedLocales順序從上向下尋找.
  3. 舊版本i18n插件生成的爲i18n文件夾 , 而flutter intl生成的爲l10n , 首字母不一樣 , 須要注意.
  4. 此方式無需依賴intl包 , 但不提供intl相關功能. 須要額外功能才須要依賴intl.
  5. 如不想棄用舊版intl的AS插件,但AS版本又不支持,可以使用該插件生成的dart代碼替代i18n中的代碼,但可能須要修改類名.

從flutter i18n過渡

  1. 成功初始化以後,複製原有的arb文件到l10n文件夾下, 並修更名字 ,例如:intl_en.arb , intl_zh_CN.arb
  2. 將以前使用導入i18n.dart的地方替換成l10n.dart,通常只修改導入的頭文件便可。
  3. flutter i18n中的帶變量的寫法爲${param},而flutter intl插件爲{param},要注意去掉$.
相關文章
相關標籤/搜索