@@ -76,15 +76,22 @@ impl Localisations {
76
76
let default_namespace = "common" . to_string ( ) ;
77
77
let default_language = "en" . to_string ( ) ;
78
78
79
- let language = language. to_string ( ) ;
79
+ let language_with_dialect = language. to_string ( ) ;
80
+ // e.g. if language is "en-GB" then base_language is "en"
81
+ let base_language = language. split ( '-' ) . next ( ) . unwrap_or ( language) . to_string ( ) ;
82
+
80
83
let namespace = namespace. unwrap_or ( default_namespace. clone ( ) ) ;
81
84
82
85
// make cascading array of fallback options:
83
86
for ( language, namespace, key) in [
84
87
// first look for key in nominated namespace
85
- ( & language , & namespace, & key) ,
88
+ ( & language_with_dialect , & namespace, & key) ,
86
89
// then look for key in common.json
87
- ( & language, & default_namespace, & key) ,
90
+ ( & language_with_dialect, & default_namespace, & key) ,
91
+ // then look for key in nominated namespace in base lang
92
+ ( & base_language, & namespace, & key) ,
93
+ // then look for key in common.json in base lang
94
+ ( & base_language, & default_namespace, & key) ,
88
95
// then look for key in nominated namespace in en
89
96
( & default_language, & namespace, & key) ,
90
97
// then look for key in common.json in en
@@ -182,13 +189,22 @@ mod test {
182
189
} ;
183
190
let translated_value = localisations. get_translation ( args, lang) . unwrap ( ) ;
184
191
assert_eq ! ( "fallback wrong key" , translated_value) ;
192
+ // // test missing translation in dialect falls back to base language
193
+ let args = GetTranslation {
194
+ namespace : Some ( "common" . to_string ( ) ) ,
195
+ fallback : Some ( "fallback" . to_string ( ) ) ,
196
+ key : "button.close" . to_string ( ) ,
197
+ } ;
198
+ let lang = "fr-MISSING_DIALECT" ;
199
+ let translated_value = localisations. get_translation ( args, lang) . unwrap ( ) ;
200
+ assert_eq ! ( "Fermer" , translated_value) ;
185
201
// // test wrong language dir falls back to english translation
186
202
let args = GetTranslation {
187
203
namespace : Some ( "common" . to_string ( ) ) ,
188
204
fallback : Some ( "fallback wrong key" . to_string ( ) ) ,
189
205
key : "button.close" . to_string ( ) ,
190
206
} ;
191
- let lang = "fr-non-existent-lang " ;
207
+ let lang = "non_existent_lang " ;
192
208
let translated_value = localisations. get_translation ( args, lang) . unwrap ( ) ;
193
209
assert_eq ! ( "Close" , translated_value) ;
194
210
// test no translation in namespace falls back to common.json namespace
0 commit comments