44
55use std:: collections:: { BTreeMap , BTreeSet } ;
66
7+ use icu:: locale:: {
8+ fallback:: { LocaleFallbackConfig , LocaleFallbackPriority , LocaleFallbacker } ,
9+ locale, LocaleExpander ,
10+ } ;
711use icu_experimental:: displaynames:: provider:: RegionDisplayNamesV1 ;
8- use icu_provider_source:: SourceDataProvider ;
912use icu_provider:: prelude:: * ;
10- use icu :: locale :: { fallback :: { LocaleFallbackConfig , LocaleFallbackPriority , LocaleFallbacker } , locale } ;
13+ use icu_provider_source :: SourceDataProvider ;
1114use ndarray:: { Array2 , Axis } ;
1215use tinystr:: TinyAsciiStr ;
1316
1417#[ test]
1518fn 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