Flutter国际化翻译插件flutter_translation的使用
Flutter国际化翻译插件flutter_translation的使用
一个帮助在Flutter中实现翻译时消除样板代码的包。
开始使用
首先,在pubspec.yaml
文件中添加依赖:
dependencies:
flutter_translation: ^0.0.5
flutter_localizations:
sdk: flutter
接下来,创建翻译类:
// app_translator.dart
abstract class AppTranslator extends ITranslator {
const AppTranslator();
String get title;
}
class PtTranslator extends AppTranslator {
String get title => 'Título'; // 葡萄牙语
}
class EnTranslator extends AppTranslator {
String get title => 'Title'; // 英语
}
然后,创建语言类:
// app_languages.dart
class AppLanguages extends ILanguages {
AppLanguages.singleton();
[@override](/user/override)
LanguageEntity get defaultLanguage =>
languages.firstWhere((lang) => lang.code == 'en');
[@override](/user/override)
List<LanguageEntity> createLanguages() {
return [
LanguageEntity(
code: 'pt',
name: 'Português', // 葡萄牙语
translator: PtTranslator(),
),
LanguageEntity(
code: 'en',
name: 'English', // 英语
translator: EnTranslator(),
),
];
}
}
你需要从AppLanguages
创建一个单例。这里我使用getIt
来完成这个操作。如果你还没有设置getIt
,可以参考以下步骤:
// getIt配置
getIt.registerSingleton<AppLanguages>(AppLanguages.singleton());
接下来,创建本地化类和委托类:
// app_localizations.dart
class AppLocalizations extends ILocalizations<AppTranslator> {
AppLocalizations.singleton(Locale locale) : super(locale);
[@override](/user/override)
AppTranslator getTranslator(String languageCode) {
throw UnimplementedError();
// something like: getIt<AppLanguages>().findByCode(languageCode).translator
}
}
class AppLocalizationsDelegate extends ILocalizationsDelegate<AppLocalizations> {
const AppLocalizationsDelegate();
[@override](/user/override)
List<LanguageEntity> getLanguages() => throw UnimplementedError(); // something like: getIt<AppLanguages>().languages;
[@override](/user/override)
Future<AppLocalizations> load(Locale locale) async {
return AppLocalizations.singleton(locale); // 创建AppLocalizations实例
}
}
现在你的设置完成了!你可以开始使用它了:
// 主应用文件
import 'package:flutter_translation/flutter_translation.dart';
return MaterialApp(
supportedLocales: getIt<AppLanguages>()
.languages
.map((lang) => lang.toLocale()),
locale: getIt<AppLanguages>().defaultLanguage.toLocale(),
localizationsDelegates: [
AppLocalizationsDelegate(),
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
);
然后就可以使用翻译功能了:
// 在某个widget中使用
final translator = getIt.get<AppTranslator>(param1: context);
return Scaffold(
body: Center(
child: Text(translator.title),
),
);
注意:我使用getIt
来进行依赖注入,但你也可以使用其他你喜欢的方式来完成这个操作。如果你想像我一样使用getIt
,请将以下代码添加到你的getIt
配置函数中:
getIt.registerFactoryParam<AppTranslator, BuildContext, Object>(
(context, nullParam) => Localizations.of(context, AppLocalizations).translator,
);
或者简单地使用:
void findTranslator(BuildContext context){
return Localizations.of(context, AppLocalizations).translator;
}
恭喜!你已经为你的应用添加了翻译支持。你可以根据需要扩展语言和字符串。你还可以管理当前语言状态以在不同语言之间切换。
如果你觉得这个实现有点复杂,记住不使用这个包的话会更复杂哦😄。如果喜欢,请不要忘记点赞😉。
完整示例Demo
以下是完整的示例代码:
// main.dart
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:flutter_translation/flutter_translation.dart';
import './translation/app_languages.dart';
import './translation/app_localizations.dart';
import './dependency_injection/getIt.dart';
import './translation/app_translator.dart';
void main() {
AppGetIt.init();
runApp(TranslationExampleApp());
}
class TranslationExampleApp extends StatefulWidget {
const TranslationExampleApp({Key key}) : super(key: key);
[@override](/user/override)
_TranslationExampleAppState createState() => _TranslationExampleAppState();
}
class _TranslationExampleAppState extends State<TranslationExampleApp> {
LanguageBloc _languageBloc;
[@override](/user/override)
void initState() {
super.initState();
_languageBloc = getIt<LanguageBloc>();
}
[@override](/user/override)
void dispose() {
_languageBloc.close();
super.dispose();
}
[@override](/user/override)
Widget build(BuildContext context) {
return BlocProvider.value(
value: _languageBloc,
child: BlocBuilder<LanguageBloc, LanguageState>(
builder: (context, state) {
return MaterialApp(
supportedLocales: getIt<AppLanguages>().languages.map((lang) => lang.toLocale()),
locale: state.locale,
localizationsDelegates: [
AppLocalizationsDelegate(),
GlobalWidgetsLocalizations.delegate,
GlobalMaterialLocalizations.delegate,
],
home: Home(),
);
},
),
);
}
}
class Home extends StatelessWidget {
const Home({Key key}) : super(key: key);
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
children: [
Text(getIt.get<AppTranslator>(param1: context).title),
SizedBox(
width: 200,
child: ExpansionTile(
title: Text('Languages'),
children: getIt<AppLanguages>().languages.map((lang) {
return Container(
height: 50,
child: InkWell(
onTap: () => BlocProvider.of<LanguageBloc>(context).add(LanguageChangeEvent(lang.code)),
child: Center(child: Text(lang.name)),
),
);
}).toList(),
),
),
],
),
),
);
}
}
更多关于Flutter国际化翻译插件flutter_translation的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter国际化翻译插件flutter_translation的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter项目中使用flutter_translation
插件来实现国际化翻译的一个代码示例。
首先,你需要确保你的Flutter项目已经创建,并且在pubspec.yaml
文件中添加了flutter_translation
依赖。
dependencies:
flutter:
sdk: flutter
flutter_translation: ^x.y.z # 请替换为最新版本号
然后运行flutter pub get
来安装依赖。
步骤 1: 创建语言文件
在项目的assets
文件夹下创建一个langs
文件夹,并在其中创建你的语言文件。例如,创建en.json
和zh.json
文件。
assets/langs/en.json
:
{
"welcome_message": "Welcome",
"goodbye_message": "Goodbye"
}
assets/langs/zh.json
:
{
"welcome_message": "欢迎",
"goodbye_message": "再见"
}
步骤 2: 配置pubspec.yaml
确保在pubspec.yaml
中声明了这些语言文件作为资产。
flutter:
assets:
- assets/langs/en.json
- assets/langs/zh.json
步骤 3: 初始化flutter_translation
在你的主文件(通常是main.dart
)中,进行如下配置:
import 'package:flutter/material.dart';
import 'package:flutter_translation/flutter_translation.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
// 初始化翻译
return TranslationProvider(
locale: Locale('en'), // 默认语言
supportedLocales: [Locale('en'), Locale('zh')],
child: MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
localizationsDelegates: [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
TranslationDelegate(
fallbackLocale: Locale('en'), // 备用语言
),
],
supportedLocales: [Locale('en'), Locale('zh')],
localeResolutionCallback: (locale, supportedLocales) {
// 这里可以根据需要自定义语言解析逻辑
for (var supportedLocale in supportedLocales) {
if (supportedLocale.languageCode == locale?.languageCode ||
supportedLocale.countryCode == locale?.countryCode) {
return supportedLocale;
}
}
return supportedLocales.first;
},
),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
Translation translation;
@override
void didChangeDependencies() {
translation = Translation.of(context);
super.didChangeDependencies();
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(translation.translate('welcome_message')),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(translation.translate('welcome_message')),
ElevatedButton(
onPressed: () {
translation.setLocale(Locale('zh'));
setState(() {}); // 强制重建以应用新的语言
},
child: Text('切换到中文'),
),
ElevatedButton(
onPressed: () {
translation.setLocale(Locale('en'));
setState(() {}); // 强制重建以应用新的语言
},
child: Text('切换到英文'),
),
Text(translation.translate('goodbye_message')),
],
),
),
);
}
}
说明
- TranslationProvider: 包装整个应用,并配置默认语言和支持的语言。
- localizationsDelegates: 添加
TranslationDelegate
到局部化委托列表中。 - supportedLocales 和 localeResolutionCallback: 配置应用支持的语言,并定义如何解析语言设置。
- Translation.of(context): 在小部件树中获取
Translation
实例。 - translation.translate(‘key’): 根据当前语言环境翻译字符串。
- translation.setLocale(Locale locale): 动态切换语言环境,并调用
setState
来重建UI以应用新的语言。
这个示例展示了如何使用flutter_translation
插件来实现基本的国际化功能。你可以根据需要扩展这个示例,添加更多的语言和支持的功能。