Complete and revise every shipped locale against the current English source, preserve locale-specific plurals, and map script-specific Chinese locales through device, Intl, duration, and Plex boundaries. Co-authored-by: emgeje <mgj@mgj.hu> Co-authored-by: junyou1998 <junyou1998@gmail.com>
44 lines
1.5 KiB
Dart
44 lines
1.5 KiB
Dart
import 'package:flutter/widgets.dart';
|
|
|
|
import 'strings.g.dart';
|
|
|
|
/// Resolves device locales in preference order while preserving Chinese script.
|
|
///
|
|
/// Slang's generic resolver cannot disambiguate `zh` and `zh-Hant` after an
|
|
/// exact script-and-region miss, so common Traditional Chinese device tags need
|
|
/// an application-owned canonicalization step.
|
|
AppLocale resolvePreferredAppLocale(Iterable<Locale> preferredLocales) {
|
|
for (final locale in preferredLocales) {
|
|
final resolved = _resolveChineseLocale(locale) ?? AppLocaleUtils.parse(locale.toLanguageTag());
|
|
if (resolved != AppLocale.en || locale.languageCode == AppLocale.en.languageCode) return resolved;
|
|
}
|
|
return AppLocale.en;
|
|
}
|
|
|
|
AppLocale? _resolveChineseLocale(Locale locale) {
|
|
if (locale.languageCode.toLowerCase() != 'zh') return null;
|
|
|
|
switch (locale.scriptCode?.toLowerCase()) {
|
|
case 'hant':
|
|
return AppLocale.zhHant;
|
|
case 'hans':
|
|
return AppLocale.zh;
|
|
}
|
|
|
|
return switch (locale.countryCode?.toUpperCase()) {
|
|
'TW' || 'HK' || 'MO' => AppLocale.zhHant,
|
|
_ => AppLocale.zh,
|
|
};
|
|
}
|
|
|
|
extension AppLocaleExternalFormats on AppLocale {
|
|
/// Locale name accepted by `package:intl`.
|
|
String get intlLocaleName => this == AppLocale.zhHant ? 'zh_TW' : languageCode;
|
|
|
|
/// Locale name accepted by `package:duration`.
|
|
String get durationLocaleName => this == AppLocale.zhHant ? 'zh_Hant' : languageCode;
|
|
|
|
/// Locale identifier sent in Plex request headers.
|
|
String get plexLanguageCode => this == AppLocale.zhHant ? 'zh-TW' : languageCode;
|
|
}
|