From f30a582c7b39a42e60714a412242789d85b11438 Mon Sep 17 00:00:00 2001 From: tzugen Date: Sat, 19 Mar 2022 16:21:21 +0100 Subject: [PATCH 1/8] 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"/> + - - - + Date: Sat, 19 Mar 2022 17:36:46 +0100 Subject: [PATCH 2/8] Disable language split in bundle --- ultrasonic/build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ultrasonic/build.gradle b/ultrasonic/build.gradle index 05e93437..ba4ec15a 100644 --- a/ultrasonic/build.gradle +++ b/ultrasonic/build.gradle @@ -18,6 +18,8 @@ android { } + bundle.language.enableSplit = false + buildTypes { release { minifyEnabled true From 2d8b93301f09ed227005d1cb4d939e8995629f0e Mon Sep 17 00:00:00 2001 From: tzugen Date: Sun, 20 Mar 2022 08:50:57 +0100 Subject: [PATCH 3/8] Add traditional german variant --- ultrasonic/build.gradle | 1 - .../src/main/kotlin/org/moire/ultrasonic/util/LocaleHelper.kt | 2 +- ultrasonic/src/main/res/values-b+de+DE+1901/strings.xml | 4 ++++ ultrasonic/src/main/res/values/arrays.xml | 4 +++- ultrasonic/src/main/res/values/strings.xml | 1 + 5 files changed, 9 insertions(+), 3 deletions(-) create mode 100644 ultrasonic/src/main/res/values-b+de+DE+1901/strings.xml diff --git a/ultrasonic/build.gradle b/ultrasonic/build.gradle index ba4ec15a..6b5c2cf2 100644 --- a/ultrasonic/build.gradle +++ b/ultrasonic/build.gradle @@ -14,7 +14,6 @@ android { minSdkVersion versions.minSdk targetSdkVersion versions.targetSdk - resConfigs 'cs', 'de', 'en', 'es', 'fr', 'hu', 'it', 'nl', 'pl', 'pt', 'pt-rBR', 'ru', 'zh-rCN', 'zh-rTW' } diff --git a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/LocaleHelper.kt b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/LocaleHelper.kt index a9ffd06a..8c2e55ba 100644 --- a/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/LocaleHelper.kt +++ b/ultrasonic/src/main/kotlin/org/moire/ultrasonic/util/LocaleHelper.kt @@ -23,7 +23,7 @@ class LocaleHelper(base: Context?) : ContextWrapper(base) { var context = ctx if (context != null && language != "") { val config = context.resources.configuration - val locale = Locale(language) + val locale = Locale.forLanguageTag(language) Locale.setDefault(locale) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { setSystemLocale(config, locale) diff --git a/ultrasonic/src/main/res/values-b+de+DE+1901/strings.xml b/ultrasonic/src/main/res/values-b+de+DE+1901/strings.xml new file mode 100644 index 00000000..4e2fb47b --- /dev/null +++ b/ultrasonic/src/main/res/values-b+de+DE+1901/strings.xml @@ -0,0 +1,4 @@ + + + Interpreten + \ No newline at end of file diff --git a/ultrasonic/src/main/res/values/arrays.xml b/ultrasonic/src/main/res/values/arrays.xml index e18377c2..c25f7f28 100644 --- a/ultrasonic/src/main/res/values/arrays.xml +++ b/ultrasonic/src/main/res/values/arrays.xml @@ -244,6 +244,7 @@ @string/language.en @string/language.fr @string/language.de + @string/language.de_DE_1901 @string/language.hu @string/language.it @string/language.es @@ -262,12 +263,13 @@ en fr de + de-DE-1901 hu it es pl pt - pt_br + 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 e5ea9f70..da8e6403 100644 --- a/ultrasonic/src/main/res/values/strings.xml +++ b/ultrasonic/src/main/res/values/strings.xml @@ -103,6 +103,7 @@ English French German + German (traditional) Hungarian Italian Spanish From c269243a0df96a8d67405bc0954fa1c1d0269799 Mon Sep 17 00:00:00 2001 From: tzugen Date: Sun, 20 Mar 2022 09:14:47 +0100 Subject: [PATCH 4/8] Complete traditional strings --- ultrasonic/src/main/res/values-b+de+DE+1901/strings.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ultrasonic/src/main/res/values-b+de+DE+1901/strings.xml b/ultrasonic/src/main/res/values-b+de+DE+1901/strings.xml index 4e2fb47b..f2f67ca9 100644 --- a/ultrasonic/src/main/res/values-b+de+DE+1901/strings.xml +++ b/ultrasonic/src/main/res/values-b+de+DE+1901/strings.xml @@ -1,4 +1,12 @@ + Interpret Interpreten + Interpreten + Bitrate und Dateityp hinter der Interpret anzeigen + Mehrere Interpreten + Nach Interpret + Alle Titel nach Interpret sortieren + Einen neuen Eintrag in der Interpretenansicht hinzufügen, um auf alle Lieder eines Interprets zuzugreifen + Interpret zeigen \ No newline at end of file From 555ef5b7ff46b24e68e7f879ec75f579c71c2796 Mon Sep 17 00:00:00 2001 From: tzugen Date: Sun, 20 Mar 2022 13:10:40 +0100 Subject: [PATCH 5/8] Differentiate chinese variants --- ultrasonic/src/main/res/values/arrays.xml | 10 ++++++---- ultrasonic/src/main/res/values/strings.xml | 5 +++-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/ultrasonic/src/main/res/values/arrays.xml b/ultrasonic/src/main/res/values/arrays.xml index c25f7f28..c1feeafa 100644 --- a/ultrasonic/src/main/res/values/arrays.xml +++ b/ultrasonic/src/main/res/values/arrays.xml @@ -236,9 +236,10 @@ @string/settings.playback.bluetooth_a2dp @string/settings.playback.bluetooth_disabled - + @string/language.default - @string/language.zh + @string/language.zh_CN + @string/language.zh_TW @string/language.cs @string/language.nl @string/language.en @@ -250,14 +251,15 @@ @string/language.es @string/language.pl @string/language.pt - @string/language.pt_br + @string/language.pt_BR @string/language.ru - zh + zh-CN + zh-TW cs nl en diff --git a/ultrasonic/src/main/res/values/strings.xml b/ultrasonic/src/main/res/values/strings.xml index da8e6403..d94a265b 100644 --- a/ultrasonic/src/main/res/values/strings.xml +++ b/ultrasonic/src/main/res/values/strings.xml @@ -97,7 +97,8 @@ Jukebox By Default No lyrics found Default - Chinese + Chinese (China) + Chinese (Taiwan) Czech Dutch English @@ -109,7 +110,7 @@ Spanish Polish Portuguese - Portuguese (Brazil) + Portuguese (Brazil) Russian By Artist By Name From 34d2b45d712f0faee4e2f90ff894bce2d44f8ab1 Mon Sep 17 00:00:00 2001 From: tzugen Date: Sun, 20 Mar 2022 13:12:47 +0100 Subject: [PATCH 6/8] Add Res Config --- ultrasonic/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ultrasonic/build.gradle b/ultrasonic/build.gradle index 6b5c2cf2..f6fc5607 100644 --- a/ultrasonic/build.gradle +++ b/ultrasonic/build.gradle @@ -14,7 +14,7 @@ android { minSdkVersion versions.minSdk targetSdkVersion versions.targetSdk - + resConfigs 'cs', 'de', 'en', 'es', 'fr', 'hu', 'it', 'nl', 'pl', 'pt', 'pt-rBR', 'ru', 'zh-rCN', 'zh-rTW' } bundle.language.enableSplit = false From 17850980e12ed0b58bb4f702f656fab222b1329b Mon Sep 17 00:00:00 2001 From: tzugen Date: Sun, 20 Mar 2022 13:13:04 +0100 Subject: [PATCH 7/8] Remove traditional german variant --- .../src/main/res/values-b+de+DE+1901/strings.xml | 12 ------------ ultrasonic/src/main/res/values/arrays.xml | 2 -- ultrasonic/src/main/res/values/strings.xml | 1 - 3 files changed, 15 deletions(-) delete mode 100644 ultrasonic/src/main/res/values-b+de+DE+1901/strings.xml diff --git a/ultrasonic/src/main/res/values-b+de+DE+1901/strings.xml b/ultrasonic/src/main/res/values-b+de+DE+1901/strings.xml deleted file mode 100644 index f2f67ca9..00000000 --- a/ultrasonic/src/main/res/values-b+de+DE+1901/strings.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - Interpret - Interpreten - Interpreten - Bitrate und Dateityp hinter der Interpret anzeigen - Mehrere Interpreten - Nach Interpret - Alle Titel nach Interpret sortieren - Einen neuen Eintrag in der Interpretenansicht hinzufügen, um auf alle Lieder eines Interprets zuzugreifen - Interpret zeigen - \ No newline at end of file diff --git a/ultrasonic/src/main/res/values/arrays.xml b/ultrasonic/src/main/res/values/arrays.xml index c1feeafa..511d7be6 100644 --- a/ultrasonic/src/main/res/values/arrays.xml +++ b/ultrasonic/src/main/res/values/arrays.xml @@ -245,7 +245,6 @@ @string/language.en @string/language.fr @string/language.de - @string/language.de_DE_1901 @string/language.hu @string/language.it @string/language.es @@ -265,7 +264,6 @@ en fr de - de-DE-1901 hu it es diff --git a/ultrasonic/src/main/res/values/strings.xml b/ultrasonic/src/main/res/values/strings.xml index d94a265b..26685bdc 100644 --- a/ultrasonic/src/main/res/values/strings.xml +++ b/ultrasonic/src/main/res/values/strings.xml @@ -104,7 +104,6 @@ English French German - German (traditional) Hungarian Italian Spanish From fe3b713241b95efd53399d43c24ac53210d86b7b Mon Sep 17 00:00:00 2001 From: tzugen Date: Mon, 21 Mar 2022 09:47:46 +0100 Subject: [PATCH 8/8] Tweak wording --- ultrasonic/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ultrasonic/src/main/res/values/strings.xml b/ultrasonic/src/main/res/values/strings.xml index 26685bdc..de2ec6c7 100644 --- a/ultrasonic/src/main/res/values/strings.xml +++ b/ultrasonic/src/main/res/values/strings.xml @@ -96,7 +96,7 @@ Error Jukebox By Default No lyrics found - Default + System default Chinese (China) Chinese (Taiwan) Czech