Skip to content

Commit bf3388f

Browse files
committed
Add script fallback
1 parent ec1899e commit bf3388f

File tree

1 file changed

+93
-22
lines changed

1 file changed

+93
-22
lines changed

provider/source/tests/dnametest.rs

Lines changed: 93 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4,50 +4,107 @@
44

55
use std::collections::{BTreeMap, BTreeSet};
66

7+
use icu::locale::{
8+
fallback::{LocaleFallbackConfig, LocaleFallbackPriority, LocaleFallbacker},
9+
locale, LocaleExpander,
10+
};
711
use icu_experimental::displaynames::provider::RegionDisplayNamesV1;
8-
use icu_provider_source::SourceDataProvider;
912
use icu_provider::prelude::*;
10-
use icu::locale::{fallback::{LocaleFallbackConfig, LocaleFallbackPriority, LocaleFallbacker}, locale};
13+
use icu_provider_source::SourceDataProvider;
1114
use ndarray::{Array2, Axis};
1215
use tinystr::TinyAsciiStr;
1316

1417
#[test]
1518
fn dnametest() {
1619
let provider = SourceDataProvider::new();
1720

18-
let locales: BTreeMap<DataIdentifierCow<'_>, usize> = IterableDataProvider::<RegionDisplayNamesV1>::iter_ids(&provider).unwrap().into_iter().enumerate().map(|(i, v)| (v, i)).collect();
21+
let locales: BTreeMap<DataIdentifierCow<'_>, usize> =
22+
IterableDataProvider::<RegionDisplayNamesV1>::iter_ids(&provider)
23+
.unwrap()
24+
.into_iter()
25+
.enumerate()
26+
.map(|(i, v)| (v, i))
27+
.collect();
1928

20-
let payloads: BTreeMap<DataIdentifierCow, DataPayload<RegionDisplayNamesV1>> = locales.keys().map(|locale| {
21-
let payload = provider.load(DataRequest {
22-
id: locale.as_borrowed(),
23-
..Default::default()
29+
let payloads: BTreeMap<DataIdentifierCow, DataPayload<RegionDisplayNamesV1>> = locales
30+
.keys()
31+
.map(|locale| {
32+
let payload = provider
33+
.load(DataRequest {
34+
id: locale.as_borrowed(),
35+
..Default::default()
36+
})
37+
.unwrap()
38+
.payload;
39+
(locale.clone(), payload)
2440
})
25-
.unwrap()
26-
.payload;
27-
(locale.clone(), payload)
28-
}).collect();
41+
.collect();
2942

30-
let en_names = payloads.get(&DataIdentifierCow::from_locale(locale!("en").into())).unwrap();
43+
let en_names = payloads
44+
.get(&DataIdentifierCow::from_locale(locale!("en").into()))
45+
.unwrap();
3146

32-
let regions = en_names.get().names.iter_keys().map(|s| s.try_into_tinystr().unwrap()).collect::<BTreeSet<TinyAsciiStr<3>>>();
47+
let regions = en_names
48+
.get()
49+
.names
50+
.iter_keys()
51+
.map(|s| s.try_into_tinystr().unwrap())
52+
.collect::<BTreeSet<TinyAsciiStr<3>>>();
3353

34-
let mut dense_matrix = Array2::<Option<&str>>::default((locales.len(), regions.len()));
54+
let expander = LocaleExpander::try_new_common_unstable(&provider).unwrap();
55+
let fallbacker = LocaleFallbacker::try_new_unstable(&provider).unwrap();
56+
let mut config = LocaleFallbackConfig::default();
57+
config.priority = LocaleFallbackPriority::Script;
58+
let fallbacker = fallbacker.for_config(config);
59+
60+
let script_locales: BTreeMap<DataIdentifierCow, usize> = locales
61+
.keys()
62+
.filter_map(|locale| {
63+
let mut fallback_iterator = fallbacker.fallback_for(locale.locale);
64+
loop {
65+
let parent_locale = fallback_iterator.get();
66+
if parent_locale.is_unknown() {
67+
println!("Didn't find script parent for: {:?}", locale.locale);
68+
break None;
69+
}
70+
if parent_locale.language.is_unknown() && parent_locale.region.is_none() {
71+
break Some(DataIdentifierCow::from_locale(*parent_locale));
72+
}
73+
fallback_iterator.step();
74+
}
75+
})
76+
.collect::<BTreeSet<_>>() // put in order
77+
.into_iter()
78+
.enumerate()
79+
.map(|(a, b)| (b, a))
80+
.collect();
81+
82+
let mut dense_matrix =
83+
Array2::<Option<&str>>::default((locales.len() + script_locales.len(), regions.len()));
3584

3685
for (i, (_locale, payload)) in payloads.iter().enumerate() {
3786
for (j, region) in regions.iter().enumerate() {
3887
dense_matrix[(i, j)] = payload.get().names.get(&region.to_unvalidated());
3988
}
4089
}
4190

42-
let fallbacker = LocaleFallbacker::try_new_unstable(&provider).unwrap();
43-
let mut config = LocaleFallbackConfig::default();
44-
config.priority = LocaleFallbackPriority::Script;
45-
let fallbacker = fallbacker.for_config(config);
91+
for (i, script_locale) in script_locales.keys().enumerate() {
92+
let i = i + locales.len();
93+
let mut locale = script_locale.locale.into_locale();
94+
expander.maximize(&mut locale.id);
95+
expander.minimize_favor_script(&mut locale.id);
96+
if let Some(k) = locales.get(&DataIdentifierCow::from_locale((&locale).into())) {
97+
println!("Copying: {locale:?} to {:?}", script_locale.locale);
98+
for (j, _region) in regions.iter().enumerate() {
99+
dense_matrix[(i, j)] = dense_matrix[(*k, j)];
100+
}
101+
}
102+
}
46103

47104
for (i, (locale, _payload)) in payloads.iter().enumerate() {
48105
'j: for (j, _region) in regions.iter().enumerate() {
49106
let Some(value) = dense_matrix[(i, j)] else {
50-
continue
107+
continue;
51108
};
52109
let mut fallback_iterator = fallbacker.fallback_for(locale.locale);
53110
loop {
@@ -56,8 +113,16 @@ fn dnametest() {
56113
if parent_locale.is_unknown() {
57114
break;
58115
}
59-
if let Some(k) = locales.get(&DataIdentifierCow::from_locale(parent_locale)) {
60-
if let Some(parent_value) = dense_matrix[(*k, j)] {
116+
if let Some(k) = locales
117+
.get(&DataIdentifierCow::from_locale(parent_locale))
118+
.copied()
119+
.or_else(|| {
120+
script_locales
121+
.get(&DataIdentifierCow::from_locale(parent_locale))
122+
.map(|x| x + locales.len())
123+
})
124+
{
125+
if let Some(parent_value) = dense_matrix[(k, j)] {
61126
if parent_value == value {
62127
dense_matrix[(i, j)] = None;
63128
}
@@ -68,9 +133,15 @@ fn dnametest() {
68133
}
69134
}
70135

71-
let large_small = dense_matrix.map_axis(Axis(1), |values| values.iter().filter(|v| v.is_some()).count());
136+
let large_small = dense_matrix.map_axis(Axis(1), |values| {
137+
values.iter().filter(|v| v.is_some()).count()
138+
});
72139

73140
for (i, locale) in locales.keys().enumerate() {
74141
println!("{locale:<3}: {}", large_small[i]);
75142
}
143+
for (i, locale) in script_locales.keys().enumerate() {
144+
let i = i + locales.len();
145+
println!("{locale:<3}: {}", large_small[i]);
146+
}
76147
}

0 commit comments

Comments
 (0)