Flutter_i18n國際化全解

查看官方文檔以及Flutter中文網(wǎng).還是覺得國際化處理的太過復(fù)雜.想著是否有合適的第三方控件.還真找到一款能像以往iOS和安卓端.xml格式輸入所有的翻譯文檔.那就是Flutter_i18n.先看看安裝以及使用

安裝:

在Plugins中搜索然后安裝

image.png

自動生成res/values/strings_en.arb.然后在里面編輯
{
"app_name":"app_name",
"app_test": "app_test"
}

即會在lib/目錄下生成generated/i18n.dart(我們代碼中主要是使用該文件)

image.png

如果需要添加新的語言環(huán)境.只需要在values目錄右鍵創(chuàng)建arb文件即可

image.png

即可選出對應(yīng)的語言環(huán)境和地區(qū)


image.png

例如添加中文以后出現(xiàn)strings_zh_CN.arb.在里面編輯
{
"app_name": "",
"app_test": "App調(diào)試"
}

使用:

看了很多文章.總是出現(xiàn)

The getter 'app_name' was called on null , Receiver: null, Tried calling 'app_name'

具體原因個人猜測:
1.onGenerateTitle: (BuildContext context) => S.of(context).app_name,方法未編輯
2.使用地方不正確.不應(yīng)在MyApp中使用.而應(yīng)在home:子Widget中使用

不正確使用.png
正確使用.png

切換當(dāng)前語言環(huán)境.使用GlobalKey綁定一個可變StatefulWidget.去更改當(dāng)前環(huán)境.然后更新所有的Widget即可

完整代碼:

    import 'package:flutter/material.dart';
    import 'generated/i18n.dart';
    import 'package:flutter_localizations/flutter_localizations.dart';

    void main() => runApp(MyApp());

    GlobalKey<_FreeLocalizations> freeLocalizationStateKey =
    new GlobalKey<_FreeLocalizations>(); // 1

    class MyApp extends StatelessWidget {
        @override
        Widget build(BuildContext context) {
            return new MaterialApp(
                                   
                                   onGenerateTitle: (BuildContext context) => S.of(context).app_name,
                                   localizationsDelegates: const [
                                                                  S.delegate,
                                                                  //如果你在使用 material library宛乃,需要添加下面兩個delegate
                                                                  GlobalMaterialLocalizations.delegate,
                                                                  GlobalWidgetsLocalizations.delegate,
                                                                  ],
                                   supportedLocales: S.delegate.supportedLocales,
                                   //      localeListResolutionCallback: S.delegate.listResolution(fallback: const Locale('zh', 'CN')),
                                   title: S.of(context).app_test,
                                   theme: new ThemeData(
                                                        primarySwatch: Colors.blue,
                                                        ),
                                   home: new Builder(builder: (context) {
                return new FreeLocalizations(
                                             key: freeLocalizationStateKey,
                                             child: new MyHomePage(),
                                             );
            }),
                                   );
        }
    }

    class MyHomePage extends StatefulWidget {
        MyHomePage({Key key}) : super(key: key);
        
        @override
        _MyHomePageState createState() => _MyHomePageState();
    }

    class _MyHomePageState extends State<MyHomePage> {
        int _counter = 0;
        bool flag = true;
        
        void changeLocale() {
            if (flag) {
                freeLocalizationStateKey.currentState
                .changeLocale(const Locale('zh', "CN"));
            } else {
                freeLocalizationStateKey.currentState
                .changeLocale(const Locale('en', ""));
            }
            flag = !flag;
        }
        
        @override
        Widget build(BuildContext context) {
            return new Scaffold(
                                appBar: AppBar(
                                               title: new Text(S.of(context).app_test), // 此處
                                               ),
                                body: Center(
                                             child: Column(
                                                           mainAxisAlignment: MainAxisAlignment.center,
                                                           children: <Widget>[
                                                                              Text(
                                                                                   S.of(context).app_test,
                                                                                   ),
                                                                              Text(
                                                                                   '$_counter',
                                                                                   style: Theme.of(context).textTheme.display1,
                                                                                   ),
                                                                              ],
                                                           ),
                                             ),
                                floatingActionButton: FloatingActionButton(
                                                                           onPressed: changeLocale,
                                                                           tooltip: 'Increment',
                                                                           child: Icon(Icons.add),
                                                                           )); // Th
        }
    }

    class FreeLocalizations extends StatefulWidget {
        final Widget child;
        
        FreeLocalizations({Key key, this.child}) : super(key: key);
        
        @override
        State<FreeLocalizations> createState() {
            return new _FreeLocalizations();
        }
    }

    class _FreeLocalizations extends State<FreeLocalizations> {
        Locale _locale = const Locale('en', '');
        
        changeLocale(Locale locale) {
            setState(() {
                _locale = locale;
            });
        }
        
        @override
        Widget build(BuildContext context) {
            return new Localizations.override(
                                              context: context,
                                              locale: _locale,
                                              child: widget.child,
                                              );
        }
    }

項目鏈接https://github.com/FQDEVER/Flutter_LanguageDemo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖迎变,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡沿侈,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門市栗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缀拭,“玉大人,你說我怎么就攤上這事填帽≈肓埽” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵篡腌,是天一觀的道長褐荷。 經(jīng)常有香客問我,道長哀蘑,這世上最難降的妖魔是什么诚卸? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮绘迁,結(jié)果婚禮上合溺,老公的妹妹穿的比我還像新娘。我一直安慰自己缀台,他們只是感情好棠赛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般睛约。 火紅的嫁衣襯著肌膚如雪鼎俘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天辩涝,我揣著相機(jī)與錄音贸伐,去河邊找鬼。 笑死怔揩,一個胖子當(dāng)著我的面吹牛捉邢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播商膊,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼伏伐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了晕拆?” 一聲冷哼從身側(cè)響起藐翎,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎实幕,沒想到半個月后吝镣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡昆庇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年赤惊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凰锡。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡未舟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出掂为,到底是詐尸還是另有隱情裕膀,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布勇哗,位于F島的核電站昼扛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏欲诺。R本人自食惡果不足惜抄谐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望扰法。 院中可真熱鬧蛹含,春花似錦、人聲如沸塞颁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至酷窥,卻和暖如春咽安,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蓬推。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工妆棒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沸伏。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓募逞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親馋评。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

推薦閱讀更多精彩內(nèi)容

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 2,698評論 0 3
  • 前言 如果APP有需要支持多種語言,就需要支持國際化,無論是android和ios,現(xiàn)在針對flutter的國際化...
    lebonbill閱讀 10,698評論 4 6
  • flutter 國際化工具flutter_i18n 簡介: flutter_i18n 有插件刺啦,比Intl簡單留特。 1...
    ted4kra閱讀 3,934評論 2 1
  • 大家好,很久不見玛瘸,甚是想念蜕青,今天,我們來學(xué)習(xí)以下如何使用國際化神器Flutter i18n糊渊,該神器為一位叫Razv...
    rhyme_lph閱讀 7,782評論 13 53
  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,456評論 0 13