diff --git a/app/src/main/java/net/vonforst/evmap/MapsActivity.kt b/app/src/main/java/net/vonforst/evmap/MapsActivity.kt index c638718d..3966654a 100644 --- a/app/src/main/java/net/vonforst/evmap/MapsActivity.kt +++ b/app/src/main/java/net/vonforst/evmap/MapsActivity.kt @@ -1,5 +1,6 @@ package net.vonforst.evmap +import android.content.Context import android.content.Intent import android.net.Uri import android.os.Bundle @@ -19,6 +20,7 @@ import com.google.android.material.navigation.NavigationView import com.google.android.material.snackbar.Snackbar import net.vonforst.evmap.api.goingelectric.ChargeLocation import net.vonforst.evmap.storage.PreferenceDataSource +import net.vonforst.evmap.utils.LocaleContextWrapper const val REQUEST_LOCATION_PERMISSION = 1 @@ -34,6 +36,14 @@ class MapsActivity : AppCompatActivity() { var fragmentCallback: FragmentCallback? = null private lateinit var prefs: PreferenceDataSource + override fun attachBaseContext(newBase: Context) { + return super.attachBaseContext( + LocaleContextWrapper.wrap( + newBase, PreferenceDataSource(newBase).language + ) + ); + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) diff --git a/app/src/main/java/net/vonforst/evmap/fragment/SettingsFragment.kt b/app/src/main/java/net/vonforst/evmap/fragment/SettingsFragment.kt index 6f2f70fd..ed9ff76f 100644 --- a/app/src/main/java/net/vonforst/evmap/fragment/SettingsFragment.kt +++ b/app/src/main/java/net/vonforst/evmap/fragment/SettingsFragment.kt @@ -1,5 +1,6 @@ package net.vonforst.evmap.fragment +import android.content.SharedPreferences import android.os.Bundle import android.view.View import androidx.appcompat.widget.Toolbar @@ -11,7 +12,8 @@ import net.vonforst.evmap.MapsActivity import net.vonforst.evmap.R -class SettingsFragment : PreferenceFragmentCompat() { +class SettingsFragment : PreferenceFragmentCompat(), + SharedPreferences.OnSharedPreferenceChangeListener { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) val toolbar = view.findViewById(R.id.toolbar) as Toolbar @@ -33,4 +35,26 @@ class SettingsFragment : PreferenceFragmentCompat() { } } + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { + when (key) { + "language" -> { + activity?.let { + it.finish(); + it.startActivity(it.intent); + } + } + } + } + + override fun onResume() { + super.onResume() + preferenceManager.sharedPreferences.registerOnSharedPreferenceChangeListener(this) + } + + override fun onPause() { + preferenceManager.sharedPreferences + .unregisterOnSharedPreferenceChangeListener(this) + super.onPause() + } + } \ No newline at end of file diff --git a/app/src/main/java/net/vonforst/evmap/storage/PreferenceDataSource.kt b/app/src/main/java/net/vonforst/evmap/storage/PreferenceDataSource.kt index b1d399a2..8341cc1e 100644 --- a/app/src/main/java/net/vonforst/evmap/storage/PreferenceDataSource.kt +++ b/app/src/main/java/net/vonforst/evmap/storage/PreferenceDataSource.kt @@ -30,4 +30,7 @@ class PreferenceDataSource(context: Context) { set(value) { sp.edit().putLong("last_chargecard_update", value.toEpochMilli()).apply() } + + val language: String + get() = sp.getString("language", "default")!! } \ No newline at end of file diff --git a/app/src/main/java/net/vonforst/evmap/utils/LocaleContextWrapper.kt b/app/src/main/java/net/vonforst/evmap/utils/LocaleContextWrapper.kt new file mode 100644 index 00000000..df1b6be5 --- /dev/null +++ b/app/src/main/java/net/vonforst/evmap/utils/LocaleContextWrapper.kt @@ -0,0 +1,42 @@ +package net.vonforst.evmap.utils + +import android.annotation.TargetApi +import android.content.Context +import android.content.ContextWrapper +import android.content.res.Configuration +import android.os.Build +import java.util.* + + +class LocaleContextWrapper(base: Context?) : ContextWrapper(base) { + companion object { + fun wrap(context: Context, language: String): ContextWrapper { + val config: Configuration = context.resources.configuration + var sysLocale: Locale? = null + sysLocale = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + config.locales.get(0) + } else { + @Suppress("DEPRECATION") + config.locale + } + var ctx = context + if (language != "" && language != "default" && sysLocale.language != language) { + val locale = Locale(language) + Locale.setDefault(locale) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + config.setLocale(locale) + } else { + @Suppress("DEPRECATION") + config.locale = locale + } + ctx = context.createConfigurationContext(config) + } + return LocaleContextWrapper(ctx) + } + + @TargetApi(Build.VERSION_CODES.N) + fun setSystemLocale(config: Configuration, locale: Locale?) { + config.setLocale(locale) + } + } +} \ No newline at end of file diff --git a/app/src/main/res/values-de/arrays.xml b/app/src/main/res/values-de/arrays.xml new file mode 100644 index 00000000..bc97baa4 --- /dev/null +++ b/app/src/main/res/values-de/arrays.xml @@ -0,0 +1,8 @@ + + + + Gerätesprache verwenden + Englisch + Deutsch + + \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 60908d03..e4fd7270 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -90,4 +90,6 @@ bearbeiten Abbrechen OK + Sprache + App-Sprache ändern \ No newline at end of file diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml new file mode 100644 index 00000000..823cb663 --- /dev/null +++ b/app/src/main/res/values/arrays.xml @@ -0,0 +1,13 @@ + + + + Device default + English + German + + + default + en + de + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 47ca8f35..234268f0 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -89,4 +89,6 @@ edit Cancel OK + Language + Change the app language diff --git a/app/src/main/res/xml/settings.xml b/app/src/main/res/xml/settings.xml index 001ee7f7..e37feb9e 100644 --- a/app/src/main/res/xml/settings.xml +++ b/app/src/main/res/xml/settings.xml @@ -10,6 +10,13 @@ android:summaryOff="@string/pref_navigate_use_maps_off" android:defaultValue="true" /> + \ No newline at end of file