簡單來講,流程圖如下:
成都創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價比尉氏網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫,直接使用。一站式尉氏網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務覆蓋尉氏地區(qū)。費用合理售后完善,10多年實體公司更值得信賴。簡單講一下整個流程:
我們先寫一個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,進而獲得對應的文案。
在上面以那種格式定義后,我們可以執(zhí)行下面這個命令把AppStrings.dart生成intl_messages.arb
flutter pub pub run intl_translation:extract_to_arb --output-dir=lib/l10n lib/app_strings.dart
*.arb是個中間產(chǎn)物,其內(nèi)就是JSON文本。其實會有更多附加信息,描述這個文本,不過在此省略。
{ "order_list_waiting_for_review": "Waiting for the review", }
生成的arb文件只是一種語言的,我們可以把它拷貝成N種語言對應的文件,比如intl_en.arb,intl_es.arb等,并把內(nèi)容的value都替換成對應語言的文案。
然后再執(zhí)行下面這個命令,生成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
可以看到,作為入?yún)⒌氖莑ib/app_strings.dart和lib/l10n/intl_*.arb,flutter工具黨確保lib/app_strings.dart中的方法名、方法中的name參數(shù),和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()方法實際上是根據(jù)locale獲取對應的message_*.dart文件,然后再通過name找到對應的文案返回。
當然,還需要對MaterialApp定義localizationsDelegates本地化代理和supportedLocales支持的多語言,這部分在文章最開始的文檔里寫的很詳細了,就不再贅述了。
官方方案的問題
官方的方案雖然很長很繁瑣,但還是可以實現(xiàn)多語言的功能的,只是對于我們來講,它存在以下幾個問題:
需要在AppStrings.dart中定義文本獲得的方法,一個文本就需要定義一個方法,并且方法名和name必須一致才能和arb文件一起生成最后的dart文件。一個文案對應一個方法,代碼寫起來很冗余,并且不利于文案的枚舉使用(比如文案的key之間有關(guān)系)。和native開發(fā)之前的習慣也不同。使用和生成的邏輯放到一起,倘若有幾千個文案,AppStrings.dart估計要爆表。
流程太長,不利于自動化下載語言的腳本的實現(xiàn)
我們的流程
起點的i18n.py是我們自己寫的python腳本,一共有兩個作用
從美杜莎(阿里國際化文案管理平臺)上獲得多語言文案,并重命名成arb文件。
前面說到,arb文件其實是json格式的,美杜莎支持以json格式導出文本,所以我們做的只是重命名,不需要對內(nèi)容進行更改。
在arb文件處理好后,會拿默認的(英語)文本去生成一個dart文件,這個dart文件只用來作為中間產(chǎn)物,不會被其他dart使用的。
其中只包含如下內(nèi)容
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", ); // ...... }
那么,我們繼續(xù)調(diào)用生成最終產(chǎn)物的命令行
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
發(fā)現(xiàn)文件以及其內(nèi)的文案已經(jīng)被正確生成了。
調(diào)用方式
我之所以這樣更改流程,其實只有兩個目的:
可以像讀map一樣的讀取多語言文案,而不是像調(diào)用方法那樣去讀取。
拉取、生成多語言文案的過程可以自動化。
通過上面一頓操作,生成文案的工作都被自動化搞定了,那我們只需要在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); }
【本文轉(zhuǎn)載自云棲社區(qū),作者: shoulder ,原文鏈接:https://yq.aliyun.com/articles/624559?spm=a2c4e.11157919.spm-cont-list.8.146c27aewVdE98】
當前文章:Flutter多語言實踐-創(chuàng)新互聯(lián)
文章網(wǎng)址:http://muchs.cn/article12/psggc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站制作、云服務器、小程序開發(fā)、企業(yè)網(wǎng)站制作、商城網(wǎng)站、自適應網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容