Flutter语言转换插件slang的使用

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

Flutter语言转换插件slang的使用

简介

Slang 是一个类型安全的国际化解决方案,支持JSON、YAML、CSV或ARB文件。它具有最小化配置、无错别字或缺少参数、快速访问翻译、组织良好、Flutter独立等特性。

快速开始

添加依赖

pubspec.yaml中添加以下依赖:

dependencies:
  slang: ^latest_version
  slang_flutter: ^latest_version # 如果你使用Flutter

dev_dependencies:
  build_runner: ^latest_version # 只有当你使用build_runner时需要
  slang_build_runner: ^latest_version # 只有当你使用build_runner时需要

创建JSON文件

创建包含翻译内容的JSON文件,通常放在assets/i18nlib/i18n目录下。例如:

// File: en.i18n.json
{
  "hello": "Hello $name",
  "save": "Save",
  "login": {
    "success": "Logged in successfully",
    "fail": "Logged in failed"
  }
}
// File: de.i18n.json
{
  "hello": "Hallo $name",
  "save": "Speichern",
  "login": {
    "success": "Login erfolgreich",
    "fail": "Login fehlgeschlagen"
  }
}

生成Dart代码

使用命令行生成Dart代码:

dart run slang

或者如果你使用build_runner

dart run build_runner build -d

初始化应用

确保在main.dart中初始化设备语言并包装应用:

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  LocaleSettings.useDeviceLocale(); // 使用设备语言
  runApp(TranslationProvider(
    child: MyApp(),
  ));
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      locale: TranslationProvider.of(context).flutterLocale,
      supportedLocales: AppLocaleUtils.supportedLocales,
      localizationsDelegates: GlobalMaterialLocalizations.delegates,
      home: MyHomePage(),
    );
  }
}

使用翻译

在你的Widget中使用翻译:

final t = Translations.of(context);
String a = t.login.success; // 获取翻译

示例代码

以下是完整的示例代码,展示了如何在一个简单的Flutter应用程序中使用Slang进行多语言支持:

import 'package:example/i18n/strings.g.dart';
import 'package:flutter/material.dart';
import 'package:flutter_localizations/flutter_localizations.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  LocaleSettings.useDeviceLocale(); // initialize with the right locale
  runApp(TranslationProvider(
    // wrap with TranslationProvider
    child: MyApp(),
  ));
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      locale: TranslationProvider.of(context).flutterLocale,
      supportedLocales: AppLocaleUtils.supportedLocales,
      localizationsDelegates: [
        ...GlobalMaterialLocalizations.delegates,
      ],
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  @override
  void initState() {
    super.initState();

    LocaleSettings.getLocaleStream().listen((event) {
      print('locale changed: $event');
    });
  }

  @override
  Widget build(BuildContext context) {
    final t = Translations.of(context);

    return Scaffold(
      appBar: AppBar(
        title: Text(t.mainScreen.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(t.mainScreen.counter(n: _counter)),
            Row(
              mainAxisAlignment: MainAxisAlignment.center,
              children: AppLocale.values.map((locale) {
                bool active = LocaleSettings.currentLocale == locale;

                return Padding(
                  padding: const EdgeInsets.all(8.0),
                  child: OutlinedButton(
                    style: OutlinedButton.styleFrom(
                      backgroundColor: active ? Colors.blue.shade100 : null,
                    ),
                    onPressed: () {
                      LocaleSettings.setLocale(locale);
                    },
                    child: Text(t.locales[locale.languageTag]!),
                  ),
                );
              }).toList(),
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () {
          setState(() => _counter++);
        },
        tooltip: context.t.mainScreen.tapMe, // using extension method
        child: Icon(Icons.add),
      ),
    );
  }
}

通过以上步骤和示例代码,你可以轻松地在Flutter项目中集成Slang插件,实现多语言支持。


更多关于Flutter语言转换插件slang的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter语言转换插件slang的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用Slang插件来实现语言转换的示例代码。Slang是一个用于Flutter的国际化(i18n)和本地化(l10n)的插件,它可以帮助你轻松地管理应用的多语言支持。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加Slang的依赖:

dependencies:
  flutter:
    sdk: flutter
  slang: ^最新版本号  # 请替换为最新版本号

然后运行flutter pub get来获取依赖。

2. 配置Slang

在你的Flutter项目的根目录中创建一个locales文件夹,并在其中添加你的语言文件。例如,你可以创建en.jsonzh.json文件来分别存储英文和中文的翻译。

locales/en.json

{
  "welcome_message": "Welcome to our app!",
  "goodbye_message": "Goodbye!"
}

locales/zh.json

{
  "welcome_message": "欢迎来到我们的应用!",
  "goodbye_message": "再见!"
}

3. 初始化Slang

在你的主文件(例如main.dart)中初始化Slang:

import 'package:flutter/material.dart';
import 'package:slang/slang.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Slang Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Slang Example'),
        ),
        body: SlangProvider(
          initialLocale: 'en',  // 默认语言
          locales: ['en', 'zh'],  // 支持的语言列表
          assets: 'locales',  // 语言文件的目录
          child: MyHomePage(),
        ),
      ),
    );
  }
}

4. 使用Slang

现在你可以在你的组件中使用Slang上下文来获取翻译后的文本:

import 'package:flutter/material.dart';
import 'package:slang/slang.dart';

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final TextEditingController _controller = TextEditingController();

  void _changeLanguage(String languageCode) {
    Slang.of(context).setLocale(languageCode);
  }

  @override
  Widget build(BuildContext context) {
    final SlangLocalizations slangLocalizations = Slang.of(context);

    return Padding(
      padding: const EdgeInsets.all(16.0),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: <Widget>[
          Text(
            slangLocalizations.translate('welcome_message'),
            style: TextStyle(fontSize: 24),
          ),
          SizedBox(height: 16),
          ElevatedButton(
            onPressed: () => _changeLanguage('zh'),
            child: Text('切换到中文'),
          ),
          SizedBox(height: 8),
          ElevatedButton(
            onPressed: () => _changeLanguage('en'),
            child: Text('切换到英文'),
          ),
          SizedBox(height: 32),
          Text(
            slangLocalizations.translate('goodbye_message'),
            style: TextStyle(fontSize: 24),
          ),
        ],
      ),
    );
  }
}

5. 运行项目

现在你可以运行你的Flutter项目,并看到应用根据选择的语言显示相应的翻译文本。

这个示例展示了如何在Flutter项目中使用Slang插件进行语言转换。你可以根据需要扩展这个示例,添加更多的语言和翻译文本。

回到顶部