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

1 回复

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

说明

  1. TranslationProvider: 包装整个应用,并配置默认语言和支持的语言。
  2. localizationsDelegates: 添加TranslationDelegate到局部化委托列表中。
  3. supportedLocales 和 localeResolutionCallback: 配置应用支持的语言,并定义如何解析语言设置。
  4. Translation.of(context): 在小部件树中获取Translation实例。
  5. translation.translate(‘key’): 根据当前语言环境翻译字符串。
  6. translation.setLocale(Locale locale): 动态切换语言环境,并调用setState来重建UI以应用新的语言。

这个示例展示了如何使用flutter_translation插件来实现基本的国际化功能。你可以根据需要扩展这个示例,添加更多的语言和支持的功能。

回到顶部