Flutter Excel本地化支持插件excel_localization的使用
Flutter Excel本地化支持插件excel_localization的使用
简介
excel_localization
是一个用于自动生成Flutter本地化资源的工具,它可以从CSV和Excel文件中导入翻译内容。这使得团队成员可以方便地编辑CSV/Excel文件,并通过终端命令将这些翻译导入项目中。目前,该工具支持基本变量(字符串和整数),但不支持性别和复数形式。如果需要这些功能,建议使用 arb_generator。
开始使用
添加依赖
在 pubspec.yaml
文件中添加以下依赖:
dependencies:
flutter_localizations:
sdk: flutter
dev_dependencies:
excel_localization:
确保你的 Dart SDK 版本 >= 2.12。
定义设置
在 pubspec.yaml
文件中定义 excel_localization
的配置项。input_file_path
是唯一必需的参数。
excel_localization:
input_file_path: "lang.csv" # 必填项:输入CSV/Excel文件路径
output_dir: "lib" # 输出目录,默认为 "lib"
file_name: "i18n" # 生成文件名,默认为 "i18n"
class_name: "I18n" # 生成类名,默认为 "I18n"
delimiter: "," # CSV文件分隔符,默认为 ","
start_index: 1 # 翻译开始的列索引,默认为 1
depend_on_context: true # 是否依赖BuildContext,默认为 true
use_single_quotes: false # 是否使用单引号,默认为 false
replace_no_break_spaces: false # 是否替换不间断空格,默认为 false
expose_get_string: false # 是否暴露getString方法,默认为 false
expose_loca_strings: false # 是否暴露locaStrings getter,默认为 false
expose_locale_maps: false # 是否暴露localeMaps getter,默认为 false
generate_comments: false # 是否生成注释,默认为 false
comment_languages: [] # 注释中显示的语言,默认为空数组
运行包
确保当前工作目录是项目根目录,然后运行以下命令:
flutter pub get
flutter pub run excel_localization
更新iOS Info.plist
对于iOS平台,需要更新 ios/Runner/Info.plist
文件以包含应用支持的语言列表:
<key>CFBundleLocalizations</key>
<array>
<string>fr</string>
<string>en</string>
<string>hi</string>
</array>
更多详情请参阅 国际化 Flutter 应用。
使用生成的 i18n 文件
假设你已经生成了一个名为 i18n.dart
的文件,并且类名为 I18n
。接下来,你需要在应用中使用这个生成的文件。
添加 I18nDelegate 到 delegates
在 MaterialApp
中添加 I18nDelegate
:
import 'package:flutter/material.dart';
import 'package:excel_localization_example/i18n.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
navigatorKey: I18n.languageKey, // 如果需要全局访问上下文,请添加此行
localizationsDelegates: [
const I18nDelegate(),
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: I18nDelegate.supportedLocals,
home: Home(),
);
}
}
使用生成的 I18n 类
在页面中使用生成的 I18n
类来显示多语言文本:
import 'package:flutter/material.dart';
import 'package:excel_localization_example/i18n.dart';
class Home extends StatefulWidget {
@override
State<Home> createState() => _HomeState();
}
class _HomeState extends State<Home> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Excel Localization Sample'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(I18n.of(context).plainText),
Text(I18n.of(context).welcome(name: 'Simran')),
Text(I18n.of(context).favoriteColor),
Text(I18n.translate.plainText), // 全局访问方式
Text(I18n.translate.welcome(name: 'Simran')), // 全局访问方式
Text(I18n.translate.favoriteColor), // 全局访问方式
OutlinedButton(
onPressed: () {
setState(() {
I18n.load(Locale("fr"));
});
},
child: Text("切换到法语"),
)
],
),
),
);
}
}
规则与功能
Locale
Locale 在表格的第一行指定,格式为 en
或 en_US
。
默认语言
默认语言从 start_index
指定的列开始。这意味着:
- 如果该列没有值,则使用 loca key。
- 如果其他语言没有给定 key 的翻译,则使用默认语言的值。
Keys
每个 loca key 必须以小写字母开头,后面可以是小写、大写字母、数字或下划线。
Variables
在 loca 字符串中包含变量的格式为 %<VAR NAME>$<VAR TYPE>
。目前仅支持整数和字符串类型:
%myVariable$d
(d 表示 int)%myVariable$s
(s 表示 String)
所有变量都是必需的。例如,welcome
键的生成函数签名如下:
String welcome({
required String name,
})
如果变量名以数字开头,生成的变量名将变为 var<VAR NAME>
。例如,%1$d
将变成 var1
。
示例代码
以下是完整的示例代码,展示了如何使用 excel_localization
插件:
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';
import 'package:excel_localization_example/i18n.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatefulWidget {
const MyApp({Key? key}) : super(key: key);
@override
State<MyApp> createState() => _MyAppState();
}
class _MyAppState extends State<MyApp> {
@override
void initState() {
super.initState();
}
@override
Widget build(BuildContext context) {
return MaterialApp(
navigatorKey: I18n.languageKey,
localizationsDelegates: const [
I18nDelegate(),
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: I18nDelegate.supportedLocals,
home: Home(),
);
}
}
class Home extends StatefulWidget {
@override
State<Home> createState() => _HomeState();
}
class _HomeState extends State<Home> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Excel Localization Sample'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text(I18n.of(context).plainText),
Text(I18n.of(context).welcome(name: 'Simran')),
Text(I18n.of(context).favoriteColor),
Text(I18n.translate.plainText),
Text(I18n.translate.welcome(name: 'Simran')),
Text(I18n.translate.favoriteColor),
OutlinedButton(
onPressed: () {
setState(() {
I18n.load(Locale("fr"));
});
},
child: Text("切换到法语"),
)
],
),
),
);
}
}
以上就是 excel_localization
插件的详细使用说明和示例代码。希望对你有所帮助!如果你有任何问题,欢迎随时提问。
更多关于Flutter Excel本地化支持插件excel_localization的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter Excel本地化支持插件excel_localization的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,下面是一个关于如何在Flutter项目中使用excel_localization
插件来实现Excel本地化支持的代码案例。请注意,excel_localization
插件的具体名称和API可能会因时间变化而有所不同,因此请确保查阅最新的插件文档。假设该插件允许你从Excel文件中读取本地化资源。
首先,确保在pubspec.yaml
文件中添加excel_localization
插件(如果存在的话,或者类似的插件):
dependencies:
flutter:
sdk: flutter
excel_localization: ^x.y.z # 替换为实际版本号
然后运行flutter pub get
来获取依赖。
接下来,假设你有一个Excel文件localizations.xlsx
,其中包含不同语言的本地化字符串。例如,该Excel文件有两个工作表:en
(英语)和zh
(中文)。
1. 准备Excel文件
确保你的Excel文件结构如下:
-
工作表名:
en
Key Translation welcome Welcome goodbye Goodbye -
工作表名:
zh
Key Translation welcome 欢迎 goodbye 再见
2. 读取Excel文件并加载本地化资源
创建一个新的Dart文件,例如localization_service.dart
,用于处理Excel文件的读取和本地化资源的加载。
import 'package:flutter/material.dart';
import 'package:excel_localization/excel_localization.dart'; // 假设插件名为excel_localization
class LocalizationService {
static Map<String, Map<String, String>> localizedStrings = {};
static Future<void> loadLocalizations(String excelFilePath) async {
try {
var excelData = await ExcelLocalization.loadExcel(excelFilePath);
for (var sheetName in excelData.keys) {
var translations = excelData[sheetName];
localizedStrings[sheetName] = {};
for (var row in translations) {
var key = row['Key']?.toString() ?? '';
var translation = row['Translation']?.toString() ?? '';
localizedStrings[sheetName]![key] = translation;
}
}
} catch (e) {
print('Error loading localizations: $e');
}
}
static String translate(String locale, String key) {
return localizedStrings[locale]?[key] ?? key; // 如果没有找到对应的翻译,返回key本身
}
}
3. 使用本地化服务
在你的MaterialApp
中,使用LocalizationService
来提供本地化支持。
import 'package:flutter/material.dart';
import 'localization_service.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await LocalizationService.loadLocalizations('assets/localizations.xlsx'); // 确保Excel文件在assets文件夹中
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Excel Localization Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
locale: Locale('en'), // 设置默认语言
localizationsDelegates: [
// 添加自定义的LocalizationDelegates(如果需要的话)
// 这里主要是演示如何从Excel中读取数据,实际项目中可能需要自定义Delegate
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
supportedLocales: [
Locale('en'),
Locale('zh'),
],
home: MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(LocalizationService.translate(Localizations.localeOf(context).languageCode, 'welcome')),
),
body: Center(
child: Text(LocalizationService.translate(Localizations.localeOf(context).languageCode, 'goodbye')),
),
floatingActionButton: FloatingActionButton(
onPressed: () {
// 切换语言示例(实际项目中需要更复杂的逻辑)
Locale currentLocale = Localizations.localeOf(context);
Locale newLocale = currentLocale.languageCode == 'en' ? Locale('zh') : Locale('en');
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (context) => MyApp(locale: newLocale)),
);
},
tooltip: 'Switch Language',
child: Icon(Icons.translate),
),
);
}
}
注意事项
-
Excel文件路径:确保
localizations.xlsx
文件在assets
文件夹中,并在pubspec.yaml
中声明:flutter: assets: - assets/localizations.xlsx
-
插件可用性:
excel_localization
是一个假设的插件名称。如果实际中不存在该插件,可以考虑使用其他方式读取Excel文件(如xlsx
插件)并手动解析数据。 -
本地化Delegate:上面的示例没有实现自定义的
LocalizationDelegate
,只是简单演示了如何从Excel中读取数据。在实际项目中,你可能需要实现一个自定义的Delegate来与Flutter的本地化系统完全集成。
希望这个示例对你有所帮助!