From 3d207912cbc0998bd1267796a368a46f32288f11 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Krzysztof=20Cie=C5=9Blik?= Date: Sun, 14 Jun 2026 06:18:19 +0200 Subject: [PATCH] fix(i18n): force context recreation on locale change and fix hardcoded strings --- .../java/com/example/retroha/BaseActivity.kt | 7 ++++- .../com/example/retroha/LanguageActivity.kt | 5 +--- .../com/example/retroha/i18n/LocaleHelper.kt | 30 ++++++++++++++----- .../example/retroha/ui/LightControlDialog.kt | 9 ++++-- app/src/main/res/layout/activity_main.xml | 4 +-- 5 files changed, 39 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/com/example/retroha/BaseActivity.kt b/app/src/main/java/com/example/retroha/BaseActivity.kt index b0c143b..e8cff8e 100644 --- a/app/src/main/java/com/example/retroha/BaseActivity.kt +++ b/app/src/main/java/com/example/retroha/BaseActivity.kt @@ -1,10 +1,15 @@ package com.example.retroha import android.app.Activity +import android.content.Context import android.os.Bundle import com.example.retroha.i18n.LocaleHelper + abstract class BaseActivity : Activity() { + override fun attachBaseContext(newBase: Context) { + super.attachBaseContext(LocaleHelper.setLocale(newBase)) + } + override fun onCreate(savedInstanceState: Bundle?) { - LocaleHelper.setLocale(this) super.onCreate(savedInstanceState) } } diff --git a/app/src/main/java/com/example/retroha/LanguageActivity.kt b/app/src/main/java/com/example/retroha/LanguageActivity.kt index 09771ea..43ccc8d 100644 --- a/app/src/main/java/com/example/retroha/LanguageActivity.kt +++ b/app/src/main/java/com/example/retroha/LanguageActivity.kt @@ -12,13 +12,12 @@ import android.widget.TextView import com.example.retroha.data.Prefs import com.example.retroha.i18n.LocaleHelper import com.example.retroha.theme.Colors -class LanguageActivity : Activity() { +class LanguageActivity : BaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val isFirstLaunch = Prefs.getLanguage(this) == null val fromSettings = intent.getBooleanExtra("from_settings", false) if (!isFirstLaunch && !fromSettings) { - LocaleHelper.setLocale(this) startMainActivity() return } @@ -72,12 +71,10 @@ class LanguageActivity : Activity() { } root.addView(createBauhausButton("POLSKI", Colors.BLUE) { Prefs.setLanguage(this, "pl") - LocaleHelper.setLocale(this) startMainActivity() }) root.addView(createBauhausButton("ENGLISH", Colors.YELLOW) { Prefs.setLanguage(this, "en") - LocaleHelper.setLocale(this) startMainActivity() }) setContentView(root) diff --git a/app/src/main/java/com/example/retroha/i18n/LocaleHelper.kt b/app/src/main/java/com/example/retroha/i18n/LocaleHelper.kt index b4571b7..0c8603a 100644 --- a/app/src/main/java/com/example/retroha/i18n/LocaleHelper.kt +++ b/app/src/main/java/com/example/retroha/i18n/LocaleHelper.kt @@ -1,16 +1,32 @@ package com.example.retroha.i18n import android.content.Context import android.content.res.Configuration +import android.os.Build import com.example.retroha.data.Prefs import java.util.Locale + object LocaleHelper { - fun setLocale(context: Context) { - val lang = Prefs.getLanguage(context) ?: return - val locale = Locale(lang) + + fun setLocale(context: Context): Context { + val lang = Prefs.getLanguage(context) ?: "pl" + return updateResources(context, lang) + } + + private fun updateResources(context: Context, language: String): Context { + val locale = Locale(language) Locale.setDefault(locale) - val resources = context.resources - val config = Configuration(resources.configuration) - config.locale = locale - resources.updateConfiguration(config, resources.displayMetrics) + + val configuration = Configuration(context.resources.configuration) + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + configuration.setLocale(locale) + return context.createConfigurationContext(configuration) + } else { + @Suppress("DEPRECATION") + configuration.locale = locale + @Suppress("DEPRECATION") + context.resources.updateConfiguration(configuration, context.resources.displayMetrics) + return context + } } } diff --git a/app/src/main/java/com/example/retroha/ui/LightControlDialog.kt b/app/src/main/java/com/example/retroha/ui/LightControlDialog.kt index 404e1cd..4085177 100644 --- a/app/src/main/java/com/example/retroha/ui/LightControlDialog.kt +++ b/app/src/main/java/com/example/retroha/ui/LightControlDialog.kt @@ -43,20 +43,25 @@ class LightControlDialog( layoutParams = LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, dp(2)) setBackgroundColor(Colors.BLACK) }) + + val brightnessLabel = context.getString(com.example.retroha.R.string.dialog_brightness) + val tvBrightness = TextView(context).apply { - text = "JASNOŚĆ: ${(initialBrightness * 100 / 255)}%" + text = "$brightnessLabel: ${(initialBrightness * 100 / 255)}%" typeface = android.graphics.Typeface.MONOSPACE textSize = 14f setTextColor(Colors.BLACK) setPadding(0, dp(24), 0, dp(8)) } root.addView(tvBrightness) + + // SeekBar val seekBar = SeekBar(context).apply { max = 255 progress = initialBrightness setOnSeekBarChangeListener(object : SeekBar.OnSeekBarChangeListener { override fun onProgressChanged(s: SeekBar?, p: Int, fromUser: Boolean) { - tvBrightness.text = "JASNOŚĆ: ${(p * 100 / 255)}%" + tvBrightness.text = "$brightnessLabel: ${(p * 100 / 255)}%" } override fun onStartTrackingTouch(s: SeekBar?) {} override fun onStopTrackingTouch(s: SeekBar?) { diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index da28cd4..cab11ad 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -56,7 +56,7 @@