Skip to content

Commit 7835de8

Browse files
authored
🚀 Support matching script and country code of locales with the text delegate (#668)
Prepare for #667
1 parent ba47c9e commit 7835de8

File tree

2 files changed

+65
-7
lines changed

2 files changed

+65
-7
lines changed

‎lib/src/delegates/asset_picker_text_delegate.dart

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44

55
import 'dart:io' show Platform;
66

7+
import 'package:flutter/foundation.dart';
78
import 'package:flutter/rendering.dart';
89
import 'package:photo_manager/photo_manager.dart' show AssetType;
910

1011
/// All text delegates.
11-
const List<AssetPickerTextDelegate> assetPickerTextDelegates =
12-
<AssetPickerTextDelegate>[
12+
const assetPickerTextDelegates = <AssetPickerTextDelegate>[
1313
AssetPickerTextDelegate(),
1414
EnglishAssetPickerTextDelegate(),
1515
HebrewAssetPickerTextDelegate(),
@@ -28,13 +28,30 @@ AssetPickerTextDelegate assetPickerTextDelegateFromLocale(Locale? locale) {
2828
if (locale == null) {
2929
return const AssetPickerTextDelegate();
3030
}
31+
3132
final String languageCode = locale.languageCode.toLowerCase();
32-
for (final AssetPickerTextDelegate delegate in assetPickerTextDelegates) {
33-
if (delegate.languageCode == languageCode) {
34-
return delegate;
35-
}
33+
final String? scriptCode = locale.scriptCode?.toLowerCase();
34+
final String? countryCode = locale.countryCode?.toLowerCase();
35+
36+
final matchedByLanguage = assetPickerTextDelegates.where(
37+
(e) => e.languageCode == languageCode,
38+
);
39+
if (matchedByLanguage.isEmpty) {
40+
return const AssetPickerTextDelegate();
41+
}
42+
43+
final matchedByScript = scriptCode != null
44+
? matchedByLanguage.where((e) => e.scriptCode == scriptCode)
45+
: null;
46+
if (matchedByScript == null || matchedByScript.isEmpty) {
47+
return matchedByLanguage.first;
3648
}
37-
return const AssetPickerTextDelegate();
49+
50+
final matchedByCountry = countryCode != null
51+
? matchedByScript.where((e) => e.countryCode == countryCode)
52+
: null;
53+
54+
return matchedByCountry?.firstOrNull ?? matchedByScript.first;
3855
}
3956

4057
/// Text delegate that controls text in widgets.
@@ -44,6 +61,17 @@ class AssetPickerTextDelegate {
4461

4562
String get languageCode => 'zh';
4663

64+
String? get scriptCode => 'Hans';
65+
66+
String? get countryCode => null;
67+
68+
@nonVirtual
69+
Locale get locale => Locale.fromSubtags(
70+
languageCode: languageCode,
71+
scriptCode: scriptCode,
72+
countryCode: countryCode,
73+
);
74+
4775
/// Confirm string for the confirm button.
4876
/// 确认按钮的字段
4977
String get confirm => '确认';

‎test/delegates_test.dart

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,40 @@
22
// Use of this source code is governed by an Apache license that can be found
33
// in the LICENSE file.
44

5+
import 'package:flutter/rendering.dart';
56
import 'package:flutter_test/flutter_test.dart';
67
import 'package:wechat_assets_picker/wechat_assets_picker.dart';
78

89
void main() {
10+
group(AssetPickerTextDelegate, () {
11+
test('returns the default when available', () {
12+
expect(
13+
assetPickerTextDelegateFromLocale(null),
14+
equals(const AssetPickerTextDelegate()),
15+
);
16+
expect(
17+
assetPickerTextDelegateFromLocale(const Locale('zh')),
18+
equals(const AssetPickerTextDelegate()),
19+
);
20+
expect(
21+
assetPickerTextDelegateFromLocale(const Locale('zxx')),
22+
equals(const AssetPickerTextDelegate()),
23+
);
24+
});
25+
26+
test('each delegate can be obtained by its locale definition', () {
27+
for (final delegate in assetPickerTextDelegates) {
28+
final locale = Locale.fromSubtags(
29+
languageCode: delegate.languageCode,
30+
scriptCode: delegate.scriptCode,
31+
countryCode: delegate.countryCode,
32+
);
33+
final matchedDelegate = assetPickerTextDelegateFromLocale(locale);
34+
expect(matchedDelegate, equals(delegate));
35+
}
36+
});
37+
});
38+
939
test('Sort paths correctly', () {
1040
final List<PathWrapper<AssetPathEntity>> paths =
1141
<PathWrapper<AssetPathEntity>>[

0 commit comments

Comments
 (0)