feat: in-app display language switcher (Settings → Appearance) (#604)
Add a Language selector to Settings → Appearance that overrides the app display language independent of the device locale. Persists a BCP-47 code in ServerStoreState.appLanguage; MainActivity.attachBaseContext applies it via a ContextWrapper (works on minSdk 26, no AppCompat dependency needed since the Activity is a plain ComponentActivity). Selecting a language recreates the activity so resources re-resolve immediately. Includes System default / English / 한국어 options, plus a unit test for the locale-code resolver. Note: the new string keys (settings_item_language, language_system, language_english, language_korean) should be backfilled into values-ko once PR #602 lands. Co-authored-by: hy4ri <hy4ri@users.noreply.github.com>
This commit is contained in:
1 parent
4314bddaae
commit
b3765bd106
9 files changed
+200
No files matched your search
@@ -0,0 +1,45 @@
|
||||
package com.m57.hermescontrol.util
|
||||
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Test
|
||||
import java.util.Locale
|
||||
|
||||
class LocaleContextWrapperTest {
|
||||
@Test
|
||||
fun systemReturnsDeviceDefault() {
|
||||
assertEquals(Locale.getDefault(), LocaleContextWrapper.localeForCode("system"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun emptyReturnsDeviceDefault() {
|
||||
assertEquals(Locale.getDefault(), LocaleContextWrapper.localeForCode(""))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun bareLanguageCode() {
|
||||
val locale = LocaleContextWrapper.localeForCode("ko")
|
||||
assertEquals("ko", locale.language)
|
||||
assertEquals("", locale.country)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun regionSeparator_r() {
|
||||
val locale = LocaleContextWrapper.localeForCode("zh-rCN")
|
||||
assertEquals("zh", locale.language)
|
||||
assertEquals("CN", locale.country)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun regionSeparator_hyphen() {
|
||||
val locale = LocaleContextWrapper.localeForCode("pt-BR")
|
||||
assertEquals("pt", locale.language)
|
||||
assertEquals("BR", locale.country)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun regionSeparator_underscore() {
|
||||
val locale = LocaleContextWrapper.localeForCode("en_US")
|
||||
assertEquals("en", locale.language)
|
||||
assertEquals("US", locale.country)
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user