Flutter语言构建插件language_builder的使用

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

Flutter语言构建插件language_builder的使用

Getting started

这个包是为了方便你轻松地在自定义的语言选项之间切换应用程序的语言。

  • 你的应用程序将支持你在 language.dart 文件中添加的所有语言。
  • 在使用部分你会找到关于 Language 类的解释,你需要创建这个类。

Usage

使用这个包非常简单。只需将你的根 widget 包裹在 LanguageBuilder 中。

void main() {
  runApp(
    MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Language Builder Example',
      home: LanguageBuilder(
        useDeviceLanguage: false,
        defaultLanguage: 'en',
        textsMap: Languages.languages,
        child: MainPage(),
        //splash: Container(),
      ),
    ),
  );
}
  • useDeviceLanguage – 如果这个参数为 true,那么应用将使用手机的语言。如果为 false,则可以从应用内部切换语言。
  • defaultLanguage – 这个字符串值应该是你希望默认使用的语言的缩写。并且当然,该语言配置必须添加到你的自定义 Language 类中。
  • textsMap – 这一部分你要告诉 LanguageBuilder 它应该使用哪些语言和准备好的文本。
  • child – 这是你根 widget。
  • splash – 这个 widget 可以用于启动时的 splash 屏幕。默认为空 widget。(可选)

Information About Language Class

为了创建自定义的语言配置,你应该在项目路径下创建一个 dart 文件。例如,创建 language.dart 文件并使用以下格式插入配置。

class Languages {
  static Map<String, String> languages = {
    "tr": """{
        "main_page": {
            "title": "Ana Sayfa",
            "second_page": "İkinci Sayfa"
        },
        "second_page": {
            "title": "İkinci Sayfa",
            "main_page": "Ana Sayfa",
            "message":"Bu sayfa 2. sayfadır."
        }
    }""",
    "en": """{
        "main_page": {
            "title": "Main Page",
            "second_page": "Second Page"
        },
        "second_page": {
            "title": "Second Page",
            "main_page": "Main Page",
            "message":"This is 2nd page."
        }
    }""",
    "de": """{
        "main_page": {
            "title": "Hauptseite",
            "second_page": "Zweite Seite"
        },
        "second_page": {
            "title": "Zweite Seite",
            "main_page": "Hauptseite",
            "message":"Dies ist die 2. Seite."
        }
    }"""
  };
}

我们有三种语言选项:土耳其 (tr)、英语 (en) 和德语 (de)。这个结构基本上是一个 Map。 [键: 语言代码, 值: 页面文本的 JSON 数据]。 LanguageBuilder 解析这种格式,并在应用中设置你的文本。

Additional information

你可以获取此包的源文件,请访问:

https://github.com/aedemirsen/language_builder

此包仍在开发中。欢迎贡献。如果你遇到任何错误或异常,请发送邮件给我。

示例代码

// ignore_for_file: prefer_const_constructors

import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:language_builder/language_builder.dart';
import 'languages.dart';

void main() {
  runApp(
    MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Language Builder Example',
      home: LanguageBuilder(
        useDeviceLanguage: false,
        defaultLanguage: 'en',
        textsMap: Languages.textsBylanguages,
        child: MainPage(),
        splash: Container(),
      ),
    ),
  );
}

// ignore: must_be_immutable
class MainPage extends StatelessWidget {
  //1st method
  //Define _texts here to reach from whole MainPage widget
  //But assigning must be done in the build method.(38th line)
  Map<String, dynamic> _texts = {};

  MainPage({Key? key}) : super(key: key);

  //2nd method
  //Or just use the LanguageBuilder's static field called 'texts'
  //Example --&gt; LanguageBuilder.texts['main_page']['title'];
  //this example gives us the title text at the main_page.

  [@override](/user/override)
  Widget build(BuildContext context) {
    //
    _texts = LanguageBuilder.texts!['main_page'];
    //
    return Scaffold(
      appBar: AppBar(
        title: Text(LanguageBuilder.texts!['main_page']['title']),
      ),
      floatingActionButton: ElevatedButton(
        child: Text(LanguageBuilder.texts!['main_page']['second_page']),
        onPressed: () {
          Navigator.push(
            context,
            MaterialPageRoute(builder: (context) =&gt; SecondPage()),
          );
        },
      ),
      body: Flex(
        direction: Axis.vertical,
        //we get the number of available language configs at our custom language.dart file.
        //for this example we have 3 language options. [turkish,english,german]
        children: LanguageBuilder.getAvailableLanguages().map((e) {
          return Column(
            children: [
              SizedBox(
                height: 50,
                child: TextButton(
                  onPressed: () {
                    //if click at the current language do nothing.
                    if (e != LanguageBuilder.getCurrentLang()) {
                      LanguageBuilder.changeLanguage(e, context);
                    }
                  },
                  child: Builder(
                    builder: (context) {
                      if (e == 'tr') {
                        return Text('Türkçe');
                      } else if ( e == 'en') {
                        return Text('English');
                      } else if (e == ' de') {
                        return Text('Deutsch');
                      } else {
                        return Text('NULL');
                      }
                    },
                  ),
                ),
              ),
              Divider(
                height: 0,
              ),
            ],
          );
        }).toList(),
      ),
    );
  }
}

class SecondPage extends StatelessWidget {
  const SecondPage({Key? key}) : super(key: key);

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(LanguageBuilder.texts!['second_page']['title']),
      ),
      body: Center(
        child: Text(LanguageBuilder.texts!['second_page']['message']),
      ),
      floatingActionButton: ElevatedButton(
        child: Text(LanguageBuilder.texts!['second_page']['main_page']),
        onPressed: () {
          Navigator.pop(
            context,
          );
        },
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何使用Flutter构建插件language_builder的示例代码案例。假设language_builder是一个假设的插件,用于根据用户选择的语言动态生成界面文本。我们将展示如何设置这个插件,并在Flutter应用中使用它。

1. 添加依赖

首先,在你的pubspec.yaml文件中添加language_builder插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  language_builder: ^1.0.0  # 假设版本号为1.0.0

然后运行flutter pub get来安装依赖。

2. 导入插件

在你的Dart文件中导入language_builder插件:

import 'package:language_builder/language_builder.dart';

3. 配置插件

假设language_builder插件提供了一个LanguageProvider类,用于管理应用的语言设置。我们可以创建一个单例来管理这个实例。

class LanguageService {
  static final LanguageService _instance = LanguageService._internal();

  factory LanguageService() => _instance;

  LanguageProvider _languageProvider;

  LanguageService._internal() {
    _languageProvider = LanguageProvider();
    // 初始化语言,比如设置为英语
    _languageProvider.setLanguage('en');
  }

  String translate(String key) {
    return _languageProvider.translate(key);
  }

  void setLanguage(String languageCode) {
    _languageProvider.setLanguage(languageCode);
  }
}

4. 使用插件

在你的Flutter应用中,你可以使用LanguageService来获取翻译后的文本。例如,在一个简单的Flutter应用中:

import 'package:flutter/material.dart';
import 'language_service.dart';  // 假设你将LanguageService放在这个文件中

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

class MyApp extends StatelessWidget {
  final LanguageService _languageService = LanguageService();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Language Builder Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text(_languageService.translate('app_title')),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                _languageService.translate('hello_world'),
                style: TextStyle(fontSize: 24),
              ),
              SizedBox(height: 20),
              ElevatedButton(
                onPressed: () {
                  // 切换语言,比如从英语切换到中文
                  setState(() {
                    _languageService.setLanguage('zh');
                  });
                },
                child: Text(_languageService.translate('change_language')),
              ),
            ],
          ),
        ),
      ),
      // 这里使用Builder来重建UI,当语言改变时
      builder: (context, child) {
        return Localizations(
          locale: Locale(_languageService._languageProvider.currentLanguageCode),
          child: child!,
        );
      },
      // 本地化委托(假设language_builder插件提供了这个委托)
      localizationsDelegates: [
        _languageService._languageProvider.delegate,
        // 其他本地化委托
        GlobalMaterialLocalizations.delegate,
        GlobalWidgetsLocalizations.delegate,
      ],
      supportedLocales: _languageService._languageProvider.supportedLocales,
    );
  }
}

5. 语言资源文件

假设language_builder插件要求你提供语言资源文件,你可能需要在项目的assets文件夹下创建这些文件,例如:

  • assets/locales/en.json
  • assets/locales/zh.json

这些文件应该包含键值对,例如:

en.json

{
  "app_title": "My Application",
  "hello_world": "Hello, World!",
  "change_language": "Change Language"
}

zh.json

{
  "app_title": "我的应用",
  "hello_world": "你好,世界!",
  "change_language": "切换语言"
}

然后,在pubspec.yaml中声明这些资源文件:

flutter:
  assets:
    - assets/locales/en.json
    - assets/locales/zh.json

注意

以上代码是一个假设的示例,因为实际上并不存在一个名为language_builder的官方Flutter插件。在实际应用中,你可能需要参考具体插件的文档来配置和使用它。不过,上述代码展示了如何在Flutter应用中集成和使用一个假设的国际化插件的基本步骤。

回到顶部