diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt
index 2a915be3..571a4ad7 100644
--- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt
+++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/activity/NavigationActivity.kt
@@ -7,6 +7,8 @@
package org.moire.ultrasonic.activity
import android.app.SearchManager
+import android.content.Context
+import android.content.ContextWrapper
import android.content.Intent
import android.content.res.ColorStateList
import android.content.res.Resources
@@ -53,6 +55,7 @@ import org.moire.ultrasonic.service.RxBus
import org.moire.ultrasonic.subsonic.ImageLoaderProvider
import org.moire.ultrasonic.util.Constants
import org.moire.ultrasonic.util.InfoDialog
+import org.moire.ultrasonic.util.LocaleHelper
import org.moire.ultrasonic.util.ServerColor
import org.moire.ultrasonic.util.Settings
import org.moire.ultrasonic.util.Storage
@@ -351,6 +354,15 @@ class NavigationActivity : AppCompatActivity() {
}
}
+ /**
+ * Apply the customized language settings if needed
+ */
+ override fun attachBaseContext(newBase: Context?) {
+ val locale = Settings.overrideLanguage
+ val localeUpdatedContext: ContextWrapper = LocaleHelper.wrap(newBase, locale)
+ super.attachBaseContext(localeUpdatedContext)
+ }
+
private fun loadSettings() {
PreferenceManager.setDefaultValues(this, R.xml.settings, false)
}
diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Constants.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Constants.kt
index 5e9cb2db..f722e7ae 100644
--- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Constants.kt
+++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Constants.kt
@@ -115,6 +115,7 @@ object Constants {
const val PREFERENCES_KEY_PAUSE_ON_BLUETOOTH_DEVICE = "pauseOnBluetoothDevice"
const val PREFERENCES_KEY_SINGLE_BUTTON_PLAY_PAUSE = "singleButtonPlayPause"
const val PREFERENCES_KEY_DEBUG_LOG_TO_FILE = "debugLogToFile"
+ const val PREFERENCES_KEY_OVERRIDE_LANGUAGE = "overrideLanguage"
const val PREFERENCE_VALUE_ALL = 0
const val PREFERENCE_VALUE_A2DP = 1
const val PREFERENCE_VALUE_DISABLED = 2
diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/LocaleHelper.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/LocaleHelper.kt
new file mode 100644
index 00000000..a9ffd06a
--- /dev/null
+++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/LocaleHelper.kt
@@ -0,0 +1,50 @@
+/*
+ * LocaleHelper.kt
+ * Copyright (C) 2009-2021 Ultrasonic developers
+ *
+ * Distributed under terms of the GNU GPLv3 license.
+ */
+
+package org.moire.ultrasonic.util
+
+import android.annotation.TargetApi
+import android.content.Context
+import android.content.ContextWrapper
+import android.content.res.Configuration
+import android.os.Build
+import java.util.Locale
+
+/**
+ * Simple Helper class to "wrap" a context with a new locale.
+ */
+class LocaleHelper(base: Context?) : ContextWrapper(base) {
+ companion object {
+ fun wrap(ctx: Context?, language: String): ContextWrapper {
+ var context = ctx
+ if (context != null && language != "") {
+ val config = context.resources.configuration
+ val locale = Locale(language)
+ Locale.setDefault(locale)
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+ setSystemLocale(config, locale)
+ } else {
+ setSystemLocaleLegacy(config, locale)
+ }
+
+ config.setLayoutDirection(locale)
+ context = context.createConfigurationContext(config)
+ }
+ return LocaleHelper(context)
+ }
+
+ @Suppress("DEPRECATION")
+ private fun setSystemLocaleLegacy(config: Configuration, locale: Locale?) {
+ config.locale = locale
+ }
+
+ @TargetApi(Build.VERSION_CODES.N)
+ fun setSystemLocale(config: Configuration, locale: Locale?) {
+ config.setLocale(locale)
+ }
+ }
+}
diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Settings.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Settings.kt
index 814a926c..dd6697fe 100644
--- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Settings.kt
+++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/Settings.kt
@@ -308,12 +308,16 @@ object Settings {
Constants.PREFERENCE_VALUE_A2DP
)
+ @JvmStatic
var debugLogToFile by BooleanSetting(Constants.PREFERENCES_KEY_DEBUG_LOG_TO_FILE, false)
@JvmStatic
val preferences: SharedPreferences
get() = PreferenceManager.getDefaultSharedPreferences(Util.appContext())
+ @JvmStatic
+ val overrideLanguage by StringSetting(Constants.PREFERENCES_KEY_OVERRIDE_LANGUAGE, "")
+
var useFiveStarRating by BooleanSetting(Constants.PREFERENCES_KEY_USE_FIVE_STAR_RATING, false)
// TODO: Remove in December 2022
diff --git a/ultrasonic/src/main/res/values-de/strings.xml b/ultrasonic/src/main/res/values-de/strings.xml
index 9dd5c3bf..9dee8ff2 100644
--- a/ultrasonic/src/main/res/values-de/strings.xml
+++ b/ultrasonic/src/main/res/values-de/strings.xml
@@ -399,7 +399,6 @@
Inkompatible Versionen. Bitte den subsonic Server aktualisieren.
- Besonderheiten
Fünf-Stern Bewertung
Benutze Bewertungssystem mit fünf Sternen anstatt Lieder mit bloß einem Stern zu markieren.
diff --git a/ultrasonic/src/main/res/values-es/strings.xml b/ultrasonic/src/main/res/values-es/strings.xml
index 4f4644e9..bc29dc60 100644
--- a/ultrasonic/src/main/res/values-es/strings.xml
+++ b/ultrasonic/src/main/res/values-es/strings.xml
@@ -461,7 +461,6 @@
Versiones incompatibles. Por favor actualiza el servidor de Subsonic.
- Características
Use cinco estrellas para las canciones
Utilice el sistema de calificación de cinco estrellas para canciones
en lugar de simplemente marcar / desmarcar elementos.
diff --git a/ultrasonic/src/main/res/values-nl/strings.xml b/ultrasonic/src/main/res/values-nl/strings.xml
index 18088911..6931ce7f 100644
--- a/ultrasonic/src/main/res/values-nl/strings.xml
+++ b/ultrasonic/src/main/res/values-nl/strings.xml
@@ -461,7 +461,6 @@
Incompatibele versies. Werk je Subsonic-server bij.
- Functies
Vijf sterren gebruiken voor nummers
Toon vijf sterren om nummers te beoordelen
in plaats van items toe te voegen aan of te verwijderen uit de favorieten.
diff --git a/ultrasonic/src/main/res/values-zh-rCN/strings.xml b/ultrasonic/src/main/res/values-zh-rCN/strings.xml
index e170c5e4..a31bcdce 100644
--- a/ultrasonic/src/main/res/values-zh-rCN/strings.xml
+++ b/ultrasonic/src/main/res/values-zh-rCN/strings.xml
@@ -444,7 +444,6 @@
不兼容的版本。请升级Subsonic 服务。
- 特性
为歌曲使用五星评分
对歌曲使用五星级评级系统
而不是简单地为项目加星标/取消星标。
diff --git a/ultrasonic/src/main/res/values/arrays.xml b/ultrasonic/src/main/res/values/arrays.xml
index 3ea71240..e18377c2 100644
--- a/ultrasonic/src/main/res/values/arrays.xml
+++ b/ultrasonic/src/main/res/values/arrays.xml
@@ -236,5 +236,38 @@
- @string/settings.playback.bluetooth_a2dp
- @string/settings.playback.bluetooth_disabled
+
+ - @string/language.default
+ - @string/language.zh
+ - @string/language.cs
+ - @string/language.nl
+ - @string/language.en
+ - @string/language.fr
+ - @string/language.de
+ - @string/language.hu
+ - @string/language.it
+ - @string/language.es
+ - @string/language.pl
+ - @string/language.pt
+ - @string/language.pt_br
+ - @string/language.ru
+
+
+
+
+ - zh
+ - cs
+ - nl
+ - en
+ - fr
+ - de
+ - hu
+ - it
+ - es
+ - pl
+ - pt
+ - pt_br
+ - ru
+
\ No newline at end of file
diff --git a/ultrasonic/src/main/res/values/strings.xml b/ultrasonic/src/main/res/values/strings.xml
index 3e08db52..e5ea9f70 100644
--- a/ultrasonic/src/main/res/values/strings.xml
+++ b/ultrasonic/src/main/res/values/strings.xml
@@ -96,6 +96,20 @@
Error
Jukebox By Default
No lyrics found
+ Default
+ Chinese
+ Czech
+ Dutch
+ English
+ French
+ German
+ Hungarian
+ Italian
+ Spanish
+ Polish
+ Portuguese
+ Portuguese (Brazil)
+ Russian
By Artist
By Name
Most Played
@@ -257,6 +271,8 @@
Notifications
Network
Other Settings
+ Override the language
+ You need to restart the app after changing the language
Playback Control Settings
Songs To Preload
1 song
@@ -466,7 +482,6 @@
Incompatible versions. Please upgrade Subsonic server.
- Features
Use five star rating for songs
Use five star rating system for songs instead of simply starring/unstarring items.
diff --git a/ultrasonic/src/main/res/xml/settings.xml b/ultrasonic/src/main/res/xml/settings.xml
index 5f96a81b..ed81370e 100644
--- a/ultrasonic/src/main/res/xml/settings.xml
+++ b/ultrasonic/src/main/res/xml/settings.xml
@@ -122,6 +122,12 @@
a:summary="@string/settings.playback.single_button_bluetooth_device_summary"
a:title="@string/settings.playback.single_button_bluetooth_device"
app:iconSpaceReserved="false"/>
+
-
-
-
+