Flutter Excel本地化支持插件excel_localization的使用

发布于 1周前 作者 gougou168 来自 Flutter

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 在表格的第一行指定,格式为 enen_US

默认语言

默认语言从 start_index 指定的列开始。这意味着:

  1. 如果该列没有值,则使用 loca key。
  2. 如果其他语言没有给定 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

1 回复

更多关于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),
      ),
    );
  }
}

注意事项

  1. Excel文件路径:确保localizations.xlsx文件在assets文件夹中,并在pubspec.yaml中声明:

    flutter:
      assets:
        - assets/localizations.xlsx
    
  2. 插件可用性excel_localization是一个假设的插件名称。如果实际中不存在该插件,可以考虑使用其他方式读取Excel文件(如xlsx插件)并手动解析数据。

  3. 本地化Delegate:上面的示例没有实现自定义的LocalizationDelegate,只是简单演示了如何从Excel中读取数据。在实际项目中,你可能需要实现一个自定义的Delegate来与Flutter的本地化系统完全集成。

希望这个示例对你有所帮助!

回到顶部