From f30a582c7b39a42e60714a412242789d85b11438 Mon Sep 17 00:00:00 2001 From: tzugen Date: Sat, 19 Mar 2022 16:21:21 +0100 Subject: [PATCH] Add locale chooser --- .../ultrasonic/activity/NavigationActivity.kt | 12 +++++ .../org/moire/ultrasonic/util/Constants.kt | 1 + .../org/moire/ultrasonic/util/LocaleHelper.kt | 50 +++++++++++++++++++ .../org/moire/ultrasonic/util/Settings.kt | 4 ++ ultrasonic/src/main/res/values-de/strings.xml | 1 - ultrasonic/src/main/res/values-es/strings.xml | 1 - ultrasonic/src/main/res/values-nl/strings.xml | 1 - .../src/main/res/values-zh-rCN/strings.xml | 1 - ultrasonic/src/main/res/values/arrays.xml | 33 ++++++++++++ ultrasonic/src/main/res/values/strings.xml | 17 ++++++- ultrasonic/src/main/res/xml/settings.xml | 24 +++++---- 11 files changed, 130 insertions(+), 15 deletions(-) create mode 100644 ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/LocaleHelper.kt 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"/> + - - - +