本地化与翻译

以人类的方式进行 Flutter 本地化,帮助您本地化您的应用程序。

教程

视频

方法

方法 工作
init() 在 runApp() 之前初始化内容
translate('word') 单词翻译
translate('word',{"key":"value"}) 带替换参数的单词翻译
<!-- googleTranslate('word', from: 'en', to: 'ar')
setNewLanguage(context,newLanguage:'en',restart: true, remember: true,) 更改语言
isDirectionRTL() 检查方向是否为 RTL
currentLanguage 当前语言代码
locale Active Locale
locals() 本地化列表
delegates 本地化委托

安装

  • .json 翻译文件添加为资源
  • 例如:'assets/langs/ar.json' | 'assets/langs/en.json'
  • 结构应如下所示
{
  "appTitle" : "تطبيق",
  "textArea" : "Thisi is just a test text"
}
  • 在 pubspec.yaml 中将它们定义为资源
flutter:
  assets:
    - assets/langs/en.json
    - assets/langs/ar.json

初始化

  • 在 main.dart 中添加导入
  • 使 main() 成为 async 并执行以下操作
  • 确保 flutter 激活了 WidgetsFlutterBinding.ensureInitialized()
  • 定义语言列表 LIST_OF_LANGS
  • 定义资源目录 LANGS_DIR
  • 初始化 await translator.init();
  • runApp() 中,将入口类包裹在 LocalizedApp()
  • 注意:** 确保将其子项定义在不同的地方,而不是在里面 **
import 'package:flutter/material.dart';
import 'package:localize_and_translate/localize_and_translate.dart';

main() async {
  // if your flutter > 1.7.8 :  ensure flutter activated
  WidgetsFlutterBinding.ensureInitialized();

  LIST_OF_LANGS = ['ar', 'en']; // define languages
  LANGS_DIR = 'assets/langs/'; // define directory
  await translator.init(); // intialize

  runApp(
    LocalizedApp(
      child: MyApp(),
    ),
  );
}
  • LocalizedApp() 子项示例 -> MaterialApp()
class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Home(),
      localizationsDelegates: translator.delegates, // Android + iOS Delegates
      locale: translator.locale, // Active locale
      supportedLocales: translator.locals(), // Locals list
    );
  }
}

用法

  • 使用 translate("appTitle")
  • 使用 googleTranslate("test", from: 'en', to: 'ar')
  • 使用 `setNewLanguage(context, newLanguage: 'ar', remember: true, restart: true);`
class Home extends StatefulWidget {
  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  String testText =
      translator.currentLanguage == 'ar' ? 'جار الترجمة' : 'Translating..';

  @override
  void initState() {
    super.initState();
    Future.delayed(Duration.zero, () async {
      testText = await translator.googleTranslate(
        testText,
        from: 'en',
        to: translator.currentLanguage,
      );
      setState(() {});
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      drawer: Drawer(),
      appBar: AppBar(
        title: Text(translator.translate('appTitle')),
        // centerTitle: true,
      ),
      body: Container(
        width: double.infinity,
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          mainAxisAlignment: MainAxisAlignment.spaceAround,
          children: <Widget>[
            SizedBox(height: 50),
            Text(
              translator.translate('textArea'),
              textAlign: TextAlign.center,
              style: TextStyle(fontSize: 35),
            ),
            Text(
              testText,
              textAlign: TextAlign.center,
              style: TextStyle(fontSize: 35),
            ),
            OutlineButton(
              onPressed: () {
                translator.setNewLanguage(
                  context,
                  newLanguage: translator.currentLanguage == 'ar' ? 'en' : 'ar',
                  remember: true,
                  restart: true,
                );
              },
              child: Text(translator.translate('buttonTitle')),
            ),
          ],
        ),
      ),
    );
  }
}

GitHub

https://github.com/msayed-net/localize_and_translate