Skip to content

Commit 955876a

Browse files
Merge pull request #9 from word-view/locale-by-locales-language
Allow to find languages by the lang of their locale
2 parents 884c2c4 + 90219e4 commit 955876a

2 files changed

Lines changed: 136 additions & 2 deletions

File tree

src/main/kotlin/cc/wordview/gengolex/Language.kt

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,18 @@ import java.util.Locale
1313
enum class Language(val tag: String, val dictionaryName: String, val tokenizer: Tokenizer, @Suppress("unused") val locale: Locale) {
1414
ENGLISH("en", "english", EnglishTokenizer, Locale.ENGLISH),
1515
JAPANESE("ja", "kanji", JapaneseTokenizer, Locale.JAPANESE),
16-
1716
// for some reason the portuguese locale is there but not as an enum value
1817
PORTUGUESE("pt", "portuguese", PortugueseTokenizer, Locale.forLanguageTag("pt"));
1918

2019
companion object {
20+
21+
/**
22+
* Returns the [Language] corresponding to the given language tag.
23+
*
24+
* @param tag The language tag (e.g., `"en"`, `"ja"`, `"pt"`).
25+
* @return The [Language] instance matching the tag.
26+
* @throws LanguageNotFoundException if no language matches the given tag.
27+
*/
2128
@Throws(LanguageNotFoundException::class)
2229
fun byTag(tag: String): Language {
2330
for (lang in Language.entries) {
@@ -27,13 +34,43 @@ enum class Language(val tag: String, val dictionaryName: String, val tokenizer:
2734
throw LanguageNotFoundException("Unable to find a language for the tag: $tag")
2835
}
2936

37+
/**
38+
* Returns the [Language] corresponding to the given [Locale].
39+
*
40+
* This matches by exact [Locale] instance.
41+
*
42+
* @param locale The [Locale] to match.
43+
* @return The [Language] instance matching the locale.
44+
* @throws LanguageNotFoundException if no language matches the given locale.
45+
*/
3046
@Throws(LanguageNotFoundException::class)
3147
fun byLocale(locale: Locale): Language {
3248
for (lang in Language.entries) {
3349
if (lang.locale == locale) return lang
3450
}
3551

36-
throw LanguageNotFoundException("Unable to find a language for the locale: ${locale.displayLanguage}")
52+
throw LanguageNotFoundException("Unable to find a language for the locale: ${locale.displayName}")
53+
}
54+
55+
/**
56+
* Returns the [Language] corresponding to the language code of the given [Locale].
57+
*
58+
* This matches only the language component the locale.
59+
*
60+
* @param locale The [Locale] whose language code will be matched.
61+
* @return The [Language] instance matching the language code.
62+
* @throws LanguageNotFoundException if no language matches the locale's language code.
63+
*/
64+
@Throws(LanguageNotFoundException::class)
65+
fun byLocaleLanguage(locale: Locale): Language {
66+
val localeLanguage = locale.language
67+
68+
for (lang in Language.entries) {
69+
if (lang.locale.language.equals(localeLanguage))
70+
return lang
71+
}
72+
73+
throw LanguageNotFoundException("Unable to find a language for the locale: ${locale.displayName}")
3774
}
3875
}
3976
}

src/test/kotlin/LanguageTest.kt

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,4 +74,101 @@ class LanguageTest {
7474
Language.byLocale(Locale.GERMAN)
7575
}
7676
}
77+
78+
@Test
79+
fun getEnglish_byLocaleLanguage() {
80+
assertDoesNotThrow {
81+
val lang = Language.byLocaleLanguage(Locale.ENGLISH)
82+
assertEquals(Language.ENGLISH, lang)
83+
assertEquals("english", lang.dictionaryName)
84+
}
85+
}
86+
87+
@Test
88+
fun getJapanese_byLocaleLanguage() {
89+
assertDoesNotThrow {
90+
val lang = Language.byLocaleLanguage(Locale.JAPANESE)
91+
assertEquals(Language.JAPANESE, lang)
92+
assertEquals("kanji", lang.dictionaryName)
93+
}
94+
}
95+
96+
@Test
97+
fun getPortuguese_byLocaleLanguage() {
98+
assertDoesNotThrow {
99+
val lang = Language.byLocaleLanguage(Locale.forLanguageTag("pt"))
100+
assertEquals(Language.PORTUGUESE, lang)
101+
assertEquals("portuguese", lang.dictionaryName)
102+
}
103+
}
104+
105+
@Test
106+
fun getInexistent_byLocaleLanguage() {
107+
assertThrows<LanguageNotFoundException> {
108+
Language.byLocaleLanguage(Locale.forLanguageTag("fr-FR"))
109+
}
110+
}
111+
112+
@Test
113+
fun getEnglish_byLocaleLanguage_GreatBritain() {
114+
assertDoesNotThrow {
115+
val lang = Language.byLocaleLanguage(Locale.forLanguageTag("en-GB"))
116+
assertEquals(Language.ENGLISH, lang)
117+
assertEquals("english", lang.dictionaryName)
118+
}
119+
}
120+
121+
@Test
122+
fun getEnglish_byLocaleLanguage_UnitedStates() {
123+
assertDoesNotThrow {
124+
val lang = Language.byLocaleLanguage(Locale.forLanguageTag("en-US"))
125+
assertEquals(Language.ENGLISH, lang)
126+
assertEquals("english", lang.dictionaryName)
127+
}
128+
}
129+
130+
@Test
131+
fun getEnglish_byLocaleLanguage_Australia() {
132+
assertDoesNotThrow {
133+
val lang = Language.byLocaleLanguage(Locale.forLanguageTag("en-AU"))
134+
assertEquals(Language.ENGLISH, lang)
135+
assertEquals("english", lang.dictionaryName)
136+
}
137+
}
138+
139+
@Test
140+
fun getPortuguese_byLocaleLanguage_Portugal() {
141+
assertDoesNotThrow {
142+
val lang = Language.byLocaleLanguage(Locale.forLanguageTag("pt-PT"))
143+
assertEquals(Language.PORTUGUESE, lang)
144+
assertEquals("portuguese", lang.dictionaryName)
145+
}
146+
}
147+
148+
@Test
149+
fun getPortuguese_byLocaleLanguage_Brazil() {
150+
assertDoesNotThrow {
151+
val lang = Language.byLocaleLanguage(Locale.forLanguageTag("pt-BR"))
152+
assertEquals(Language.PORTUGUESE, lang)
153+
assertEquals("portuguese", lang.dictionaryName)
154+
}
155+
}
156+
157+
@Test
158+
fun getPortuguese_byLocaleLanguage_Angola() {
159+
assertDoesNotThrow {
160+
val lang = Language.byLocaleLanguage(Locale.forLanguageTag("pt-AO"))
161+
assertEquals(Language.PORTUGUESE, lang)
162+
assertEquals("portuguese", lang.dictionaryName)
163+
}
164+
}
165+
166+
@Test
167+
fun getPortuguese_byLocaleLanguage_Mozambique() {
168+
assertDoesNotThrow {
169+
val lang = Language.byLocaleLanguage(Locale.forLanguageTag("pt-MZ"))
170+
assertEquals(Language.PORTUGUESE, lang)
171+
assertEquals("portuguese", lang.dictionaryName)
172+
}
173+
}
77174
}

0 commit comments

Comments
 (0)