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