前言
由于我们在使用Flutter中的控件的时候,默认展示的是英文的控件,举个例子当我们想要长按输入框弹出(粘贴、赋值、全选)等选择按钮时,如果没有汉化的话,弹出的就是英文的选择按钮,所以这里就需要我们来汉化一下这个APP了
第一步
配置语言包,直接在pubspec.yaml
中配置即可
flutter:
sdk: flutter
flutter_localizations:
sdk: flutter
第二部
由于IOS环境苹果的cupertino风格中没有汉化的问题,所以我们还需要单独写个文件汉化苹果的控件
创建一个汉化IOS控件的文件 CustomLocalizations.dart
import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
class ChineseCupertinoLocalizations implements CupertinoLocalizations {
final materialDelegate = GlobalMaterialLocalizations.delegate;
final widgetsDelegate = GlobalWidgetsLocalizations.delegate;
final local = const Locale('zh');
MaterialLocalizations ml;
Future init() async {
ml = await materialDelegate.load(local);
print(ml.pasteButtonLabel);
}
@override
String get alertDialogLabel => ml.alertDialogLabel;
@override
String get anteMeridiemAbbreviation => ml.anteMeridiemAbbreviation;
@override
String get copyButtonLabel => ml.copyButtonLabel;
@override
String get cutButtonLabel => ml.cutButtonLabel;
@override
DatePickerDateOrder get datePickerDateOrder => DatePickerDateOrder.mdy;
@override
DatePickerDateTimeOrder get datePickerDateTimeOrder =>
DatePickerDateTimeOrder.date_time_dayPeriod;
@override
String datePickerDayOfMonth(int dayIndex) {
return dayIndex.toString();
}
@override
String datePickerHour(int hour) {
return hour.toString().padLeft(2, "0");
}
@override
String datePickerHourSemanticsLabel(int hour) {
return "$hour" + "时";
}
@override
String datePickerMediumDate(DateTime date) {
return ml.formatMediumDate(date);
}
@override
String datePickerMinute(int minute) {
return minute.toString().padLeft(2, '0');
}
@override
String datePickerMinuteSemanticsLabel(int minute) {
return "$minute" + "分";
}
@override
String datePickerMonth(int monthIndex) {
return "$monthIndex";
}
@override
String datePickerYear(int yearIndex) {
return yearIndex.toString();
}
@override
String get pasteButtonLabel => ml.pasteButtonLabel;
@override
String get postMeridiemAbbreviation => ml.postMeridiemAbbreviation;
@override
String get selectAllButtonLabel => ml.selectAllButtonLabel;
@override
String timerPickerHour(int hour) {
return hour.toString().padLeft(2, "0");
}
@override
String timerPickerHourLabel(int hour) {
return "$hour".toString().padLeft(2, "0") + "时";
}
@override
String timerPickerMinute(int minute) {
return minute.toString().padLeft(2, "0");
}
@override
String timerPickerMinuteLabel(int minute) {
return minute.toString().padLeft(2, "0") + "分";
}
@override
String timerPickerSecond(int second) {
return second.toString().padLeft(2, "0");
}
@override
String timerPickerSecondLabel(int second) {
return second.toString().padLeft(2, "0") + "秒";
}
static const LocalizationsDelegate<CupertinoLocalizations> delegate =
_ChineseDelegate();
static Future<CupertinoLocalizations> load(Locale locale) async {
var localizaltions = ChineseCupertinoLocalizations();
await localizaltions.init();
return SynchronousFuture<CupertinoLocalizations>(localizaltions);
}
@override
// TODO: implement todayLabel
String get todayLabel => null;
}
class _ChineseDelegate extends LocalizationsDelegate<CupertinoLocalizations> {
const _ChineseDelegate();
@override
bool isSupported(Locale locale) {
return locale.languageCode == 'zh';
}
@override
Future<CupertinoLocalizations> load(Locale locale) {
return ChineseCupertinoLocalizations.load(locale);
}
@override
bool shouldReload(LocalizationsDelegate<CupertinoLocalizations> old) {
return false;
}
}
··第三步
在main.js当中引入
import 'package:flutter_localizations/flutter_localizations.dart'; // Flutter 国际化包
import 'plugins/CustomLocalizations.dart'; // 自定义苹果汉化控件
汉化的操作大概就是这些了,如果想要汉化日历选择器什么的,可以直接配置他的属性
注意!!
汉化之后,APP内部的TextField输入框会出现光标与hintText对不齐的问题,所以,我们还需要在main.dart
中声明一个属性
theme: ThemeData(
// 全局修复TextField光标无法与提示文本对齐问题
textTheme: TextTheme(subhead: TextStyle(textBaseline: TextBaseline.alphabetic)),
),