gpt4 book ai didi

flutter - 在 Flutter 中使用多个 LocalizationsDelegate

转载 作者:行者123 更新时间:2023-12-02 17:12:49 28 4
gpt4 key购买 nike

我遇到一个问题,我试图在 MaterialApp 中使用多个 LocalizationsDelegates

我正在使用 Dart intl 工具为我的标签提供翻译。当我有多个 LocalizationsDelegates 时,只有指定的第一个获得翻译值。下一个委托(delegate)的标签,获取Intl.message()函数中提供的默认值。

简短、独立、正确的示例

我设置了一个最小项目作为此问题的示例 on GitHub .

代码片段

MaterialApp 中,我定义了一堆 localizationsDelegate,其中包括两个特定于应用程序的:DogLocalizationsDelegateCatLocalizationsDelegate >.

MaterialApp(
// other properties
locale: Locale("en"),
localizationsDelegates: [
CatLocalizationsDelegate(),
DogLocalizationsDelegate(),
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: [
const Locale('en'),
const Locale('nl'),
],
);

代表具有相同的样板代码,但提供不同的标签。下面是 DogLocalizations 及其 DogLocalizationsDelegate 的外观。

import 'package:flutter/material.dart';
import 'package:intl/intl.dart';
import 'messages_all.dart';

class DogLocalizations {
static Future<DogLocalizations> load(Locale locale) {
final String name = locale.languageCode;
final String localeName = Intl.canonicalizedLocale(name);
return initializeMessages(localeName).then((_) {
Intl.defaultLocale = localeName;
return DogLocalizations();
});
}

static DogLocalizations of(BuildContext context) {
return Localizations.of<DogLocalizations>(context, DogLocalizations);
}

String get bark {
return Intl.message(
'<insert dog sound>',
name: 'bark',
);
}
}

class DogLocalizationsDelegate extends LocalizationsDelegate<DogLocalizations> {
const DogLocalizationsDelegate();

@override
bool isSupported(Locale locale) => ['en', 'nl'].contains(locale.languageCode);

@override
Future<DogLocalizations> load(Locale locale) => DogLocalizations.load(locale);

@override
bool shouldReload(DogLocalizationsDelegate old) => false;
}

CatLocalizations 是相同的,但具有 meow 字符串 getter。 GitHub 项目中的完整示例。

用于生成翻译文件的命令

我使用多个提取和生成命令,而不是在一个命令中包含多个文件。这是因为我实际上遇到了一个库(有自己的标签)和该库的使用者(也有自己的标签)的问题。

  1. 提取猫和狗的标签

flutter pub run intl_translation:extract_to_arb --output-dir=lib/cat_labels/gen lib/cat_labels/CatLabels.dart

flutter pub run intl_translation:extract_to_arb --output-dir=lib/dog_labels/gen lib/dog_labels/DogLabels.dart

  • 将生成的 intl_messages.arb 翻译为两种语言文件

    • intl_en.arb
    • intl_nl.arb然后将正确的翻译值添加到这些文件中。
  • 从 ARB 生成 dart 文件

  • flutter pub run intl_translation:generate_from_arb --output-dir=lib/cat_labels lib/cat_labels/CatLabels.dart lib/cat_labels/gen/intl_*.arb

    flutter pub run intl_translation:generate_from_arb --output-dir=lib/dog_labels lib/dog_labels/DogLabels.dart lib/dog_labels/gen/intl_*.arb

    问题

    在此演示项目中,委托(delegate)的顺序如下:

    // main.dart (line 20)
    DogLocalizationsDelegate(),
    CatLocalizationsDelegate(),

    将为 bark 标签提供翻译,但不会为 meow 标签提供翻译。

    切换时:

    // main.dart (line 20)
    CatLocalizationsDelegate(),
    DogLocalizationsDelegate(),

    将为 meow 标签提供翻译,但不会为 bark 标签提供翻译。

    为什么需要多个本地化代表

    如果您想知道原因:我在库和该库的消费者应用程序中使用标签。重要要知道的是,因此不可能(真的)在同一个生成器命令中指定两个本地化文件。

    最佳答案

    据我所知,不,您不能像这样使用多个本地化委托(delegate)。这是因为 intl 的 initializeMessages 每个语言环境只能调用一次。

    因此,在您的示例中,一旦您的 CatLocalizationsDelegate 运行 initializeMessagesDogLocalizationsDelegate 就不起作用。这就是为什么您只能看到翻译 Meow! 而看不到 Dog 的翻译,或者无论哪个先运行它的翻译。

    如需更多阅读,请查看https://phrase.com/blog/posts/how-to-internationalize-a-flutter-app/并请通过 https://github.com/flutter/flutter/issues/41437 分享反馈.

    关于flutter - 在 Flutter 中使用多个 LocalizationsDelegate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57267141/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com