Flutter本地化管理插件jimtl_localazy的使用

Flutter本地化管理插件jimtl_localazy的使用

本文档将详细介绍如何在Flutter项目中使用jimtl_localazy插件进行本地化管理。此插件可以帮助你处理缓存和远程更新你的ARB文件。

安装

首先,在项目的pubspec.yaml文件中添加以下依赖:

dependencies:
  jimtl_localazy:
  flutter_jimtl:

然后运行flutter pub get以安装这些依赖。

初始化LocalazyCdnManager

在Dart侧,你需要创建一个LocalazyCdnManager实例:

import 'package:path/path.dart' as path;
import 'package:flutter/services.dart' show rootBundle;
import 'package:localazy/localazy.dart';
import 'package:jimtl/jimtl.dart';
import 'package:jimtl_localazy/jimtl_localazy.dart';

final manager = LocalazyCdnManager(
  cdnId: '_a860213072234234453319c546',
  getFileName: (String locale, String flavor) {
    return 'myFile_$flavor.arb';
  },
  cacheFolder: path.join((await getTemporaryDirectory()).path, 'translations'),
);

cdnId可以通过运行localazy cdn命令来获取,例如:

Metadata:
 - JSON: https://delivery.localazy.com/_a860213072234234453319c546/_e0.json
 - Javascript: https://delivery.localazy.com/_a860213072234234453319c546/_e0.js
 - Typescript: https://delivery.localazy.com/_a860213072234234453319c546/_e0.ts

在这个例子中,cdnId_a860213072234234453319c546

使用

如果你已经有一个支持本地化的Flutter项目,那么你需要在应用中声明一个LocalizationDelegate。以下是一个示例:

import 'package:flutter/material.dart';
import 'package:flutter/services.dart' show rootBundle;
import 'package:jimtl/jimtl.dart';
import 'package:jimtl_localazy/jimtl_localazy.dart';

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      localizationsDelegates: [
        DefaultMaterialLocalizations.delegate,
        TranslationsDelegate<Translations>.withRemoteManager(
          defaultLocale: 'en',
          supportedLocales: ['en', 'fr'],
          defaultFlavor: 'default',
          currentFlavor: 'flavor1',
          localizationManager: manager,
          dataLoader: (locale, flavor) async {
            print('local load $locale and $flavor');
            if (flavor == 'default') {
              return await rootBundle.loadString('assets/arb/translations_$locale.arb');
            }
            return await rootBundle.loadString('assets/arb/translations_${flavor}_$locale.arb');
          },
          onTranslationsUpdated: () {
            print('TX updated, need rebuild');
            setState(() {});
          },
          translationsBuilder: () => Translations(),
        ),
      ],
      supportedLocales: [Locale('en'), Locale('fr')],
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(AppLocalizations.of(context).title),
      ),
      body: Center(
        child: Text(AppLocalizations.of(context).helloWorld),
      ),
    );
  }
}

示例代码

以下是一个完整的示例代码,展示了如何使用jimtl_localazy插件:

import 'package:flutter/material.dart';
import 'package:jimtl/jimtl.dart';
import 'package:jimtl_localazy/jimtl_localazy.dart';

void main() async {
  final manager = LocalazyCdnManager(
    cdnId: '_a860213072234234453319c546',
    cacheFolder: '.',
    getFileName: (String locale, String flavor) {
      return 'myFile_$flavor.arb';
    },
  );

  runApp(MyApp(manager: manager));
}

class MyApp extends StatelessWidget {
  final LocalazyCdnManager manager;

  MyApp({required this.manager});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      localizationsDelegates: [
        DefaultMaterialLocalizations.delegate,
        TranslationsDelegate<Translations>.withRemoteManager(
          defaultLocale: 'en',
          supportedLocales: ['en', 'fr'],
          defaultFlavor: 'default',
          currentFlavor: 'flavor1',
          localizationManager: manager,
          dataLoader: (locale, flavor) async {
            print('local load $locale and $flavor');
            if (flavor == 'default') {
              return await rootBundle.loadString('assets/arb/translations_$locale.arb');
            }
            return await rootBundle.loadString('assets/arb/translations_${flavor}_$locale.arb');
          },
          onTranslationsUpdated: () {
            print('TX updated, need rebuild');
            setState(() {});
          },
          translationsBuilder: () => Translations(),
        ),
      ],
      supportedLocales: [Locale('en'), Locale('fr')],
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(AppLocalizations.of(context).title),
      ),
      body: Center(
        child: Text(AppLocalizations.of(context).helloWorld),
      ),
    );
  }
}

更多关于Flutter本地化管理插件jimtl_localazy的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter本地化管理插件jimtl_localazy的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


在 Flutter 中,jimtl_localazy 是一个用于本地化管理的插件,它可以帮助开发者轻松地管理和应用多语言支持。以下是如何使用 jimtl_localazy 插件的详细步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 jimtl_localazy 插件的依赖。

dependencies:
  flutter:
    sdk: flutter
  jimtl_localazy: ^1.0.0  # 请使用最新版本

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

2. 初始化 Localazy

在你的 main.dart 文件中,初始化 Localazy 插件。

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

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  await Localazy.initialize(
    apiKey: 'YOUR_API_KEY',  // 替换为你的 Localazy API Key
    projectId: 'YOUR_PROJECT_ID',  // 替换为你的 Localazy Project ID
    supportedLocales: [
      const Locale('en', 'US'),
      const Locale('es', 'ES'),
      // 添加其他支持的语言
    ],
    fallbackLocale: const Locale('en', 'US'),
  );

  runApp(MyApp());
}

3. 配置 MaterialApp

MaterialApp 中配置 localizationsDelegatessupportedLocales

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Localazy Demo',
      localizationsDelegates: Localazy.localizationsDelegates,
      supportedLocales: Localazy.supportedLocales,
      locale: Localazy.locale,
      home: MyHomePage(),
    );
  }
}

4. 使用本地化字符串

在你的应用中,你可以使用 Localazy.of(context).translate('key') 来获取本地化字符串。

class MyHomePage extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(Localazy.of(context).translate('app_title')),
      ),
      body: Center(
        child: Text(Localazy.of(context).translate('welcome_message')),
      ),
    );
  }
}

5. 在 Localazy 平台管理翻译

你需要登录 Localazy 平台,创建一个项目并上传你的翻译文件。你可以通过 Localazy 的 API Key 和 Project ID 来同步翻译内容。

6. 同步翻译

Localazy.initialize 中配置的 API Key 和 Project ID 会自动同步翻译内容。你也可以手动触发同步。

await Localazy.sync();

7. 动态切换语言

你可以使用 Localazy.setLocale 方法来动态切换语言。

Localazy.setLocale(const Locale('es', 'ES'));

8. 处理语言切换事件

你可以在 MaterialApp 中监听语言切换事件,并更新 UI。

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  [@override](/user/override)
  void initState() {
    super.initState();
    Localazy.onLocaleChanged.listen((locale) {
      setState(() {});
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Localazy Demo',
      localizationsDelegates: Localazy.localizationsDelegates,
      supportedLocales: Localazy.supportedLocales,
      locale: Localazy.locale,
      home: MyHomePage(),
    );
  }
}
回到顶部