中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Flutter多語言實踐

發布時間:2020-08-07 15:31:01 來源:ITPUB博客 閱讀:406 作者:趙鈺瑩 欄目:移動開發

簡單來講,流程圖如下:

Flutter多語言實踐 簡單講一下整個流程:

  1. 我們先寫一個AppStrings.dart,這個文件是整個多語言的核心,生成和使用都需要這個文件。在這個文件里可以定義獲得文本的api,比如

String order_list_waiting_for_review() => Intl.message(
        'Waiting for the review',
        name: "order_list_waiting_for_review",
          locale: _localeName
      );

其中,方法名和name必須保持一致(不要問我為何會有這種坑爹要求)。'Waiting for the review'是默認文案,locale是當前的locale。
這樣定義的話,可以用下面的方式獲得文本

String text = AppStrings.of(context).order_list_waiting_for_review();
// text == "Waiting for the review"

很好理解,AppStrings.of(context)就是通過context獲得對應的locale的AppStrings,進而獲得對應的文案。

  1. 在上面以那種格式定義后,我們可以執行下面這個命令把AppStrings.dart生成intl_messages.arb

flutter pub pub run intl_translation:extract_to_arb --output-dir=lib/l10n lib/app_strings.dart

*.arb是個中間產物,其內就是JSON文本。其實會有更多附加信息,描述這個文本,不過在此省略。

{
  "order_list_waiting_for_review": "Waiting for the review",
}
  1. 生成的arb文件只是一種語言的,我們可以把它拷貝成N種語言對應的文件,比如intl_en.arb,intl_es.arb等,并把內容的value都替換成對應語言的文案。

  2. 然后再執行下面這個命令,生成messages_*.dart

flutter pub pub run intl_translation:generate_from_arb --output-dir=lib/l10n \
   --no-use-deferred-loading lib/app_strings.dart lib/l10n/intl_*.arb

可以看到,作為入參的是lib/app_strings.dart和lib/l10n/intl_*.arb,flutter工具黨確保lib/app_strings.dart中的方法名、方法中的name參數,和lib/l10n/intl_*.arb中的json的key一致的時候,才會在生成的messages_*.dart文件中加入對應的文案,缺一不可。

我們再回過頭來看這段代碼

String order_list_waiting_for_review() => Intl.message(
        'Waiting for the review',
        name: "order_list_waiting_for_review",
          locale: _localeName
      );

Intl.message()方法實際上是根據locale獲取對應的message_*.dart文件,然后再通過name找到對應的文案返回。

  1. 當然,還需要對MaterialApp定義localizationsDelegates本地化代理和supportedLocales支持的多語言,這部分在文章最開始的文檔里寫的很詳細了,就不再贅述了。

官方方案的問題

官方的方案雖然很長很繁瑣,但還是可以實現多語言的功能的,只是對于我們來講,它存在以下幾個問題:

  1. 需要在AppStrings.dart中定義文本獲得的方法,一個文本就需要定義一個方法,并且方法名和name必須一致才能和arb文件一起生成最后的dart文件。一個文案對應一個方法,代碼寫起來很冗余,并且不利于文案的枚舉使用(比如文案的key之間有關系)。和native開發之前的習慣也不同。使用和生成的邏輯放到一起,倘若有幾千個文案,AppStrings.dart估計要爆表。

  2. 流程太長,不利于自動化下載語言的腳本的實現

我們的流程

Flutter多語言實踐 起點的i18n.py是我們自己寫的python腳本,一共有兩個作用

  1. 從美杜莎(阿里國際化文案管理平臺)上獲得多語言文案,并重命名成arb文件。

前面說到,arb文件其實是json格式的,美杜莎支持以json格式導出文本,所以我們做的只是重命名,不需要對內容進行更改。

  1. 在arb文件處理好后,會拿默認的(英語)文本去生成一個dart文件,這個dart文件只用來作為中間產物,不會被其他dart使用的。
    其中只包含如下內容

import 'package:intl/intl.dart';
class MessagesIndex {
  String order_list_waiting_for_review() => Intl.message(
        'Waiting for the review',
        name: "order_list_waiting_for_review",
      );
  // ......
}

那么,我們繼續調用生成最終產物的命令行

flutter pub pub run intl_translation:generate_from_arb --output-dir=lib/l10n \
   --no-use-deferred-loading lib/messages_index.dart lib/l10n/intl_*.arb

發現文件以及其內的文案已經被正確生成了。

調用方式

我之所以這樣更改流程,其實只有兩個目的:

  1. 可以像讀map一樣的讀取多語言文案,而不是像調用方法那樣去讀取。

  2. 拉取、生成多語言文案的過程可以自動化。
    通過上面一頓操作,生成文案的工作都被自動化搞定了,那我們只需要在AppStrings.dart中添加一個方法,傳入name,傳出想要的多語言文案即可:

class AppStrings {
  final String _localeName;
  // ......
  static AppStrings of(BuildContext context) {
    return Localizations.of<AppStrings>(context, AppStrings);
  }
  // AppStrings.of(context).str(stringKey)
  String str(String name) {
    return Intl.message(name, name: name, locale: _localeName);
  }
  // 重寫操作符,減少代碼量
  // AppStrings.of(context)[stringKey]
  operator [](String messageName) => str(messageName);
}

【本文轉載自云棲社區,作者: shoulder ,原文鏈接:https://yq.aliyun.com/articles/624559?spm=a2c4e.11157919.spm-cont-list.8.146c27aewVdE98】

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

包头市| 滨州市| 琼中| 刚察县| 安龙县| 钟山县| 崇仁县| 扎鲁特旗| 阜南县| 盘锦市| 西乡县| 天台县| 定结县| 方山县| 安阳县| 同德县| 长治市| 潮安县| 华亭县| 科技| 绥滨县| 天门市| 泸溪县| 榆林市| 孟连| 探索| 临汾市| 金乡县| 府谷县| 个旧市| 永靖县| 达州市| 汕头市| 和林格尔县| 章丘市| 江阴市| 肥乡县| 古丈县| 垣曲县| 平武县| 扎鲁特旗|