flutter 国际化flutter使用 intl插件,provider状态保存

1.下载插件

2.插件下载完成后重启一下android studio,在工具栏tool中会多一个flutter intl的选项

3.点击initialize for project,等待项目生成语言包

其中.arb文件是我们不同语言包,放入需要翻译的字段;intl文件夹是自动生成的,放置的翻译好的dart文件,我们不用管理

4.如果要添加其他语言需要下面操作

创建之后的文件加目录

*打开.arb看下

恭喜准备工作完成

二、代码设置

1.在pubspec.yaml文件添加以下依赖

#包含sp工具
flustars: ^0.3.2
provider: 4.3.1

2.在main文件中注册好语言包,和provider全局通知

 

//注意一定要用comsumer包裹起立(provider需要)
 Consumer<LanguageProvider>(
        builder: (context, languageProvider, child) {
          return OKToast(
            textPadding: EdgeInsets.symmetric(horizontal:32  , vertical: 26 ),
            textStyle: TextStyle(fontSize: 15, color: Colors.white),
            backgroundColor: textColor333,
            radius: 7.0,
            child: MaterialApp(
              title: '交易所',
              ///注册路由
//              onGenerateRoute: (settings) => Routes.findRoutes(settings),
              theme: ThemeData(
                primarySwatch: Colors.blue,
                visualDensity: VisualDensity.adaptivePlatformDensity,
              ),
              locale: _listenerLocal(languageProvider.language),
              localizationsDelegates: [
                S.delegate, //应用程序的翻译回调
                GlobalMaterialLocalizations.delegate,
                GlobalWidgetsLocalizations.delegate,
              ],
              supportedLocales: S.delegate.supportedLocales,
              //支持语系,
              onGenerateTitle: (context) {
                return S.of(context).app_title;
              },
              home:xxpage()

 

locale: _listenerLocal(languageProvider.language)方法在下面第5步中

3.创建语言provider

import 'package:flustars/flustars.dart';
import 'package:flutter/material.dart';

class LanguageProvider with ChangeNotifier {
  ///
  String _language;

  String get language => _language;

  void changeMode(String language) async {
    _language = language;
    notifyListeners();
    SpUtil.putString("language", language);
  }
}

4.在需要设置语言的页面使用方法

 Text(S.of(context).app_title),
import 'package:bourse/generated/l10n.dart';
import 'package:flustars/flustars.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import '../../language_model.dart';
class SettingLanguagePage extends StatefulWidget {
  @override
  _SettingLanguagePageState createState() => _SettingLanguagePageState();
}

class _SettingLanguagePageState extends State<SettingLanguagePage> {
  String groupValue = 'zh';

  void _changed(value) {
    if (value != null) {
      setState(() {
        groupValue = value;
        if (value == "zh") Provider.of<LanguageProvider>(context, listen: false).changeMode("zh");
        if (value == "en") Provider.of<LanguageProvider>(context, listen: false).changeMode("en");
        if (value == "jp") Provider.of<LanguageProvider>(context, listen: false).changeMode("jp");
        if (value == "kr") Provider.of<LanguageProvider>(context, listen: false).changeMode("kr");
        SpUtil.putString("language", groupValue);
      });
    }
  }

  @override
  void initState() {
    // TODO: implement initState
    super.initState();
    groupValue = SpUtil.getString("language");
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("SettingLanguagePage"),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(S.of(context).app_title),
            RadioListTile<String>(
              title: Text('汉语'),
              value: 'zh',
              groupValue: groupValue,
              onChanged: _changed,
            ),
            RadioListTile<String>(
                title: Text('English'),
                value: 'en',
                groupValue: groupValue,
                onChanged: _changed),
            RadioListTile<String>(
                title: Text('日语'),
                value: 'jp',
                groupValue: groupValue,
                onChanged: _changed),
            RadioListTile<String>(
                title: Text('韩语'),
                value: 'kr',
                groupValue: groupValue,
                onChanged: _changed),
          ],
        ),
      ),
    );
  }
}

5.当程序退出重进时,需要取出保存上一次的状态,在mian文件中设置

String value = SpUtil.getString("language");

    _listenerLocal(String lag) {
      if (lag == "zh") {
        return Locale('zh');
      } else if (lag == "en") {
        return Locale('en');
      } else if (lag == "jp") {
        return Locale('jp');
      } else if(lag == "kr"){
        return Locale('kr');
      }else{
        if(value.isEmpty){
          return Locale('zh');
        }else{
          return Locale('$value');
        }
      }
    }

搞定!!!!

更正:语言包不能随便命名的,要根据规范

http://www.webapps-online.com/online-tools/languages-and-locales

修改上述语言包目录

 

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值