Skip to content

Commit 4d2ae95

Browse files
committed
add support for Chinese language tags and update tests
1 parent feaa2c8 commit 4d2ae95

2 files changed

Lines changed: 24 additions & 3 deletions

File tree

app/src/main/kotlin/com/vrem/util/LocaleUtils.kt

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ private val countriesLocales: SortedMap<String, Locale> =
2929
.toSortedMap()
3030

3131
val BULGARIAN: Locale = Locale.forLanguageTag("bg")
32+
val CHINESE: Locale = Locale.forLanguageTag("zh")
3233
val CHINESE_SIMPLIFIED: Locale = Locale.forLanguageTag("zh-Hans")
3334
val CHINESE_TRADITIONAL: Locale = Locale.forLanguageTag("zh-Hant")
3435
val DUTCH: Locale = Locale.forLanguageTag("nl")
@@ -81,13 +82,26 @@ fun supportedLanguageTags(): List<String> = listOf("") + baseSupportedLocales.ma
8182

8283
private fun normalizeLanguageTag(languageTag: String): String = languageTag.replace('_', '-').trim()
8384

85+
private val chineseCountryToLocale: Map<String, Locale> = mapOf(
86+
"CN" to CHINESE_SIMPLIFIED,
87+
"SG" to CHINESE_SIMPLIFIED,
88+
"TW" to CHINESE_TRADITIONAL,
89+
"HK" to CHINESE_TRADITIONAL,
90+
"MO" to CHINESE_TRADITIONAL,
91+
)
92+
8493
fun findByLanguageTag(languageTag: String): Locale {
8594
val normalizedLanguageTag = normalizeLanguageTag(languageTag)
8695
if (normalizedLanguageTag.isEmpty()) return currentLocale
8796

8897
val target = Locale.forLanguageTag(normalizedLanguageTag)
8998
if (target.language.isEmpty()) return currentLocale
9099

100+
if (target.language == "zh" && target.script.isEmpty()) {
101+
if (target.country.isEmpty()) return CHINESE
102+
return chineseCountryToLocale[target.country] ?: CHINESE
103+
}
104+
91105
return baseSupportedLocales.find { it == target }
92106
?: baseSupportedLocales.find { it.language == target.language && it.script == target.script }
93107
?: baseSupportedLocales.find { it.language == target.language && it.country == target.country }

app/src/test/kotlin/com/vrem/util/LocaleUtilsTest.kt

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,15 +86,22 @@ class LocaleUtilsTest {
8686
@Test
8787
fun findByLanguageTagWithKnownTag() {
8888
// BCP-47 format (new)
89-
assertThat(findByLanguageTag("zh-Hans")).isEqualTo(CHINESE_SIMPLIFIED)
90-
assertThat(findByLanguageTag("zh-Hant")).isEqualTo(CHINESE_TRADITIONAL)
9189
assertThat(findByLanguageTag("en")).isEqualTo(ENGLISH)
9290
assertThat(findByLanguageTag("en-US")).isEqualTo(ENGLISH)
91+
assertThat(findByLanguageTag("zh")).isEqualTo(CHINESE)
92+
assertThat(findByLanguageTag("zh-CN")).isEqualTo(CHINESE_SIMPLIFIED)
93+
assertThat(findByLanguageTag("zh-Hans")).isEqualTo(CHINESE_SIMPLIFIED)
94+
assertThat(findByLanguageTag("zh-Hant")).isEqualTo(CHINESE_TRADITIONAL)
95+
assertThat(findByLanguageTag("zh-TW")).isEqualTo(CHINESE_TRADITIONAL)
96+
assertThat(findByLanguageTag("zh-XX")).isEqualTo(CHINESE)
9397

9498
// Backward compatibility: underscore format (old)
99+
assertThat(findByLanguageTag("en_US")).isEqualTo(ENGLISH)
100+
assertThat(findByLanguageTag("zh_CN")).isEqualTo(CHINESE_SIMPLIFIED)
95101
assertThat(findByLanguageTag("zh_Hans")).isEqualTo(CHINESE_SIMPLIFIED)
96102
assertThat(findByLanguageTag("zh_Hant")).isEqualTo(CHINESE_TRADITIONAL)
97-
assertThat(findByLanguageTag("en_US")).isEqualTo(ENGLISH)
103+
assertThat(findByLanguageTag("zh_TW")).isEqualTo(CHINESE_TRADITIONAL)
104+
assertThat(findByLanguageTag("zh_XX")).isEqualTo(CHINESE)
98105
}
99106

100107
@Test

0 commit comments

Comments
 (0)