我正面临一个问题,我试图LocalizationsDelegates
在MaterialApp
.
我正在使用 Dartintl
工具为我的标签提供翻译。当我有多个时LocalizationsDelegates
,只有指定的第一个获得翻译的值。下一个委托的标签,获取Intl.message()
函数中提供的默认值。
简短、独立、正确的例子
我在 GitHub 上设置了一个最小项目作为此问题的示例。
代码片段
在 中MaterialApp
,我定义了一堆localizationsDelegates
,包括两个应用程序特定的:DogLocalizationsDelegate
和CatLocalizationsDelegate
.
MaterialApp(
// other properties
locale: Locale("en"),
localizationsDelegates: [
CatLocalizationsDelegate(),
DogLocalizationsDelegate(),
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
GlobalCupertinoLocalizations.delegate,
],
supportedLocales: [
const Locale('en'),
const Locale('nl'),
],
);
代表具有相同的样板代码,但提供不同的标签。这是 theDogLocalizations
和它的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
String getter。GitHub 项目中的完整示例。
用于生成翻译文件的命令
我正在使用多个提取和生成命令,而不是在一个命令中包含多个文件。这是因为我实际上遇到了一个库(有自己的标签)和该库的消费者(也有自己的标签)的问题。
- 提取猫和狗的标签
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
问题
在这个演示项目中,代表的顺序如下:
// main.dart (line 20)
DogLocalizationsDelegate(),
CatLocalizationsDelegate(),
将为bark
标签提供翻译,但不为meow
标签提供翻译。
切换时:
// main.dart (line 20)
CatLocalizationsDelegate(),
DogLocalizationsDelegate(),
将为meow
标签提供翻译,但不为bark
标签提供翻译。
为什么需要多个本地化代表
如果您想知道为什么:我在图书馆和该图书馆的消费者应用程序中使用标签。 重要的是要知道,因此(实际上)不可能在同一个生成器命令中指定两个本地化文件。