Flutter多语言 2022-11-15 周二

2022-11-15  本文已影响0人  勇往直前888

方案选择

GetX中关于多语言介绍

import 'package:get/get.dart';

class Messages extends Translations {
  @override
  Map<String, Map<String, String>> get keys => {
        'en_US': {
          'hello': 'Hello World',
        },
        'de_DE': {
          'hello': 'Hallo Welt',
        }
      };
}
Text('hello'.tr);
import 'package:get/get.dart';


Map<String, Map<String, String>> get keys => {
    'en_US': {
        'logged_in': 'logged in as @name with email @email',
    },
    'es_ES': {
       'logged_in': 'iniciado sesión como @name con e-mail @email',
    }
};

Text('logged_in'.trParams({
  'name': 'Jhon',
  'email': 'jhon@example.com'
  }));
return GetMaterialApp(
    translations: Messages(), // your translations
    locale: Locale('en', 'US'), // translations will be displayed in that locale
    fallbackLocale: Locale('en', 'UK'), // specify the fallback locale in case an invalid locale is selected.
);
var locale = Locale('en', 'US');
Get.updateLocale(locale);
return GetMaterialApp(
    locale: Get.deviceLocale,
);

修改方案

所有的语言定义都在Translations一个文件中,很容易出现文件过长的问题。所以会把两级的Map进行拆分,把第二级的Map独立为各个语言文件。

class TranslationService extends Translations {
  @override
  Map<String, Map<String, String>> get keys => {
        'en': en_language,
        'es': es_language,
        'zh': zh_language,
      };
}
const Map<String, String> en_language = {
  /// 公共部分-基础
  WidgetIds.commonBaseTitle: 'Title',
  WidgetIds.commonBaseContent: 'Content',
  WidgetIds.commonBaseDescription: 'Description',
  WidgetIds.commonBaseOk: 'OK',
  WidgetIds.commonBaseCancel: 'Cancel',
  WidgetIds.commonBaseSubmit: 'Submit',
}
class WidgetIds {
  /// 简要说明:
  /// 这里定义组件的id
  /// 变量定义采用小驼峰的命名习惯
  /// 变量的值采用小写加点隔离的方式,类似包名的习惯
  /// 可以用来区分组件: dart中组件统一用Widget表示,所以这里命名为WidgetIds
  /// 使用场景有多语言,统计等等需要组件定位的场景。
  /// 多语言:使用的时候,需要加上.tr后缀,比如:  WidgetIds.commonBaseTitle.tr
  /// 多语言:定义文件中,作为字典的key来用,比如: WidgetIds.commonBaseTitle: 'Title',

  /// 公共部分-基础
  static const String commonBaseTitle = 'common.base.title';
  static const String commonBaseContent = 'common.base.content';
  static const String commonBaseDescription = 'common.base.description';
  static const String commonBaseOk = 'common.base.ok';
}
企业微信截图_8eeea650-0d45-4533-8170-207242935534.png

简略方案

const Map<String, String> zh_language = {
  /// 公共部分-基础
  'Title': '标题',
  'Content': '内容',
  'Description': '描述',
  'OK': '确定',
  'Cancel': '取消',
}
    Text(
      'Cancel'.tr,
      style: TextStyle(
        color: const Color(0xFF333333),
        fontSize: 12.sp,
        fontWeight: FontWeight.w400,
      ),
    );

Locale简介

const Locale(
    this._languageCode, [
    this._countryCode,
  ])
企业微信截图_b4c1ae98-aab3-41bc-92c5-d4f6be5b9384.png 企业微信截图_19fd2a9c-c866-414e-9a99-e2f245f2df72.png
class MultiLanguage extends Translations {
  @override
  Map<String, Map<String, String>> get keys => {
        /// 英文
        'en_US': en_US,

        /// 中文
        'zh_CN': zh_CN,
      };
}

更新的话,给Get.updateLocale(const Locale('en', 'TT'));仍然能够选出英文。
既然如此,干脆key值只给语言代码,不管区域代码。

简单实践

企业微信截图_7ad8d70c-d49a-4abe-9a1d-6a02ace8c5a6.png
import 'en.dart';
import 'zh.dart';

class MultiLanguage extends Translations {
  @override
  Map<String, Map<String, String>> get keys => {
        /// 英文
        'en': en,

        /// 中文
        'zh': zh,
      };
}
/// 中文多语言字典
const Map<String, String> zh = {
  'title': '这是标题',
  'login': '登录用户 @name,邮箱账号 @email',
};
/// 英文多语言字典
const Map<String, String> en = {
  'title': 'This is Title!',
  'login': 'logged in as @name with email @email',
};
Get.updateLocale(const Locale('en'));
import 'package:flutter/material.dart';
import 'package:get/get.dart';

import 'home_controller.dart';

class HomePage extends GetView<HomeController> {
  const HomePage({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return GetBuilder<HomeController>(
      builder: (context) {
        return Scaffold(
          appBar: AppBar(
            title: const Text('HomePage'),
            centerTitle: true,
          ),
          body: Center(
            child: GestureDetector(
              behavior: HitTestBehavior.opaque,
              onTap: () {
                Get.updateLocale(const Locale('en'));
              },
              child: Text(
                'login'.trParams(
                    {'name': 'zhang san', 'email': 'zhangsan@baidu.com'}),
                style: const TextStyle(fontSize: 20),
                textAlign: TextAlign.center,
              ),
            ),
          ),
        );
      },
    );
  }
}

初始界面:(手机设置为中文)

企业微信截图_d81b0547-16a3-478b-9eb1-99157ec2fdfa.png

点一下文字,就切换为英文

企业微信截图_3b40853e-876c-4b76-be43-ccbafed21f78.png

我们一开始是用方法(1)的;很规范,但是真的烦。 后来就改成了方法(2);工作量减少很多。

系统日期组件多语言

Flutter配置国际化localizations

上一篇下一篇

猜你喜欢

热点阅读