Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,11 @@ android {
includeInBundle = false
}

// language preference for Android 13 and above
androidResources {
generateLocaleConfig = true
}

namespace = "com.github.libretube"
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package com.github.libretube.extensions

import android.icu.text.CompactDecimalFormat
import com.github.libretube.helpers.LocaleHelper
import java.util.Locale

fun Long?.formatShort(): String = CompactDecimalFormat
.getInstance(LocaleHelper.getAppLocale(), CompactDecimalFormat.CompactStyle.SHORT)
.getInstance(Locale.getDefault(), CompactDecimalFormat.CompactStyle.SHORT)
.format(this ?: 0)
19 changes: 11 additions & 8 deletions app/src/main/java/com/github/libretube/helpers/LocaleHelper.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,19 +9,22 @@ import com.github.libretube.obj.Country
import java.util.Locale

object LocaleHelper {
@Deprecated("Only used for SDKs below 33 for compatibility")
fun getAppLocale(): Locale {
val languageName = PreferenceHelper.getString(PreferenceKeys.LANGUAGE, "sys")
return when {
languageName == "sys" -> Locale.getDefault()
languageName.contains("-") -> {
val languageParts = languageName.split("-")
Locale(
languageParts[0],
languageParts[1].replace("r", "")
)
}
else -> getLocaleFromAndroidCode(languageName)
}
}

else -> Locale(languageName)
fun getLocaleFromAndroidCode(code: String): Locale {
val normalizedCode = code.replace("-r", "-")
return if (normalizedCode.contains("-")) {
val parts = normalizedCode.split("-", limit = 2)
Locale(parts[0], parts[1].uppercase())
} else {
Locale(normalizedCode)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -733,9 +733,7 @@ object PlayerHelper {
context.getString(R.string.unknown_audio_language)
} else {
Locale.forLanguageTag(audioLanguage)
.getDisplayLanguage(
LocaleHelper.getAppLocale()
)
.getDisplayLanguage(Locale.getDefault())
.ifEmpty { context.getString(R.string.unknown_audio_language) }
},
getDisplayAudioTrackTypeFromFormat(context, audioLanguageAndRoleFlags.second)
Expand Down
13 changes: 8 additions & 5 deletions app/src/main/java/com/github/libretube/ui/base/BaseActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.github.libretube.ui.base
import android.content.Context
import android.content.pm.ActivityInfo
import android.content.res.Configuration
import android.os.Build
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.appcompat.app.AppCompatDelegate
Expand Down Expand Up @@ -58,12 +59,14 @@ open class BaseActivity : AppCompatActivity() {
override fun attachBaseContext(newBase: Context?) {
super.attachBaseContext(newBase)

// change the locale according to the user's preference (or system language as fallback)
val locale = LocaleHelper.getAppLocale()
Locale.setDefault(locale)

val configuration = Configuration().apply {
setLocale(locale)
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
// TODO: remove this case in the future
@Suppress("DEPRECATION")
val locale = LocaleHelper.getAppLocale()
Locale.setDefault(locale)
setLocale(locale)
}

val uiPref = PreferenceHelper.getString(PreferenceKeys.THEME_MODE, "A")
AppCompatDelegate.setDefaultNightMode(getThemeMode(uiPref))
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.github.libretube.ui.preferences

import android.os.Build
import android.os.Bundle
import androidx.preference.ListPreference
import androidx.preference.Preference
Expand All @@ -16,9 +17,28 @@ class GeneralSettings : BasePreferenceFragment() {
setPreferencesFromResource(R.xml.general_settings, rootKey)

val language = findPreference<ListPreference>("language")
language?.setOnPreferenceChangeListener { _, _ ->
RequireRestartDialog().show(childFragmentManager, RequireRestartDialog::class.java.name)
true
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.TIRAMISU) {
language?.setOnPreferenceChangeListener { _, _ ->
RequireRestartDialog().show(
childFragmentManager,
RequireRestartDialog::class.java.name
)
true
}
val languages = requireContext().resources.getStringArray(R.array.languageCodes)
.map { code ->
val locale = LocaleHelper.getLocaleFromAndroidCode(code)

// each language's name is displayed in its own language,
// e.g. 'de': 'Deutsch', 'fr': 'Francais', ...
locale.toString() to locale.getDisplayName(locale)
}.sortedBy { it.second.lowercase() }
language?.entries =
arrayOf(requireContext().getString(R.string.systemLanguage)) + languages.map { it.second }
language?.entryValues = arrayOf("sys") + languages.map { it.first }
} else {
// language is set through Android settings
language?.isVisible = false
}

val region = findPreference<ListPreference>("region")
Expand Down
1 change: 1 addition & 0 deletions app/src/main/res/resources.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
unqualifiedResLocale=en-US
90 changes: 0 additions & 90 deletions app/src/main/res/values/array.xml
Original file line number Diff line number Diff line change
@@ -1,95 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="languages">
<item>@string/systemLanguage</item>
<item>العربية</item>
<item>Azərbaycanca</item>
<item>Euskara</item>
<item>বাংলা</item>
<item>Català</item>
<item>کوردی</item>
<item>简体中文</item>
<item>繁體中文</item>
<item>čeština</item>
<item>Dansk</item>
<item>English</item>
<item>Wikang Filipino</item>
<item>Suomi</item>
<item>Français</item>
<item>Deutsch</item>
<item>Ελληνικά</item>
<item>ગુજરાતી</item>
<item>עברית</item>
<item>हिन्दी</item>
<item>Magyar</item>
<item>Bahasa Indonesia</item>
<item>Italiano</item>
<item>日本語</item>
<item>한국어</item>
<item>latviešu</item>
<item>മലയാളം</item>
<item>मराठी</item>
<item>Norsk</item>
<item>فارسی</item>
<item>ଓଡ଼ିଆ</item>
<item>Polski</item>
<item>Português</item>
<item>Português (BR)</item>
<item>Română</item>
<item>Русский</item>
<item>Slovenčina</item>
<item>Español</item>
<item>ภาษาไทย</item>
<item>Türkçe</item>
<item>Türkmençe</item>
<item>Українська</item>
</string-array>

<string-array name="languagesValue">
<item>sys</item>
<item>ar</item>
<item>az</item>
<item>eu</item>
<item>bn</item>
<item>ca</item>
<item>ckb</item>
<item>zh-Hans</item>
<item>zh-Hant</item>
<item>cs</item>
<item>da</item>
<item>en</item>
<item>fil</item>
<item>fi</item>
<item>fr</item>
<item>de</item>
<item>el</item>
<item>gu</item>
<item>he</item>
<item>hi</item>
<item>hu</item>
<item>in</item>
<item>it</item>
<item>ja</item>
<item>ko</item>
<item>lv</item>
<item>ml</item>
<item>mr</item>
<item>nb-rNO</item>
<item>fa</item>
<item>or</item>
<item>pl</item>
<item>pt</item>
<item>pt-rBR</item>
<item>ro</item>
<item>ru</item>
<item>sk</item>
<item>es</item>
<item>th</item>
<item>tr</item>
<item>tk</item>
<item>uk</item>
</string-array>

<string-array name="themes">
<item>@string/systemDefault</item>
<item>@string/lightTheme</item>
Expand Down
74 changes: 74 additions & 0 deletions app/src/main/res/values/languages.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="languageCodes">
<item>tk</item>
<item>km</item>
<item>et</item>
<item>ne</item>
<item>is</item>
<item>ca</item>
<item>gu</item>
<item>ms</item>
<item>fi</item>
<item>ckb</item>
<item>b+es+419</item>
<item>nb-rNO</item>
<item>ja</item>
<item>b+en+Shaw</item>
<item>fil</item>
<item>ast</item>
<item>pl</item>
<item>or</item>
<item>it</item>
<item>tr</item>
<item>af</item>
<item>iw</item>
<item>pt</item>
<item>hu</item>
<item>yue</item>
<item>fa</item>
<item>zh-rTW</item>
<item>ru</item>
<item>uk</item>
<item>ta</item>
<item>as</item>
<item>nl</item>
<item>mr</item>
<item>eu</item>
<item>si</item>
<item>fr</item>
<item>azb</item>
<item>eo</item>
<item>bn</item>
<item>ro</item>
<item>th</item>
<item>in</item>
<item>lv</item>
<item>pt-rBR</item>
<item>lt</item>
<item>ia</item>
<item>sv</item>
<item>be</item>
<item>ar</item>
<item>el</item>
<item>ti</item>
<item>sk</item>
<item>ko</item>
<item>sr</item>
<item>vi</item>
<item>zh-rCN</item>
<item>bg</item>
<item>pa</item>
<item>hi</item>
<item>az</item>
<item>cs</item>
<item>ur</item>
<item>hy</item>
<item>da</item>
<item>de</item>
<item>hr</item>
<item>es</item>
<item>ml</item>
<item>en</item>
</string-array>
</resources>
2 changes: 0 additions & 2 deletions app/src/main/res/xml/general_settings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,6 @@
<ListPreference
android:icon="@drawable/ic_translate"
app:defaultValue="sys"
app:entries="@array/languages"
app:entryValues="@array/languagesValue"
app:key="language"
app:title="@string/changeLanguage"
app:useSimpleSummaryProvider="true" />
Expand Down
32 changes: 32 additions & 0 deletions build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,35 @@ plugins {
tasks.register<Delete>("clean") {
delete(rootProject.layout.buildDirectory)
}

// this builds the list of languages to use for Android versions below 13
tasks.register("buildLanguages") {
val projectDirectory = layout.projectDirectory

// reference: https://docs.gradle.org/current/userguide/working_with_files.html
val resPath = projectDirectory.file("app/src/main/res")
val locales = resPath.asFile.listFiles()
.filter {
it.nameWithoutExtension.startsWith("values-") && File(
it,
"strings.xml"
).exists()
}
.map {
it.nameWithoutExtension.removePrefix("values-")
} + "en" // en is the default locale, its values file has no -en suffix

val localesConfig =
"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n" +
"<resources>\n" +
"<string-array name=\"languageCodes\">\n" +
locales.joinToString("\n") { " <item>$it</item>" } + "\n" +
"</string-array>\n" +
"</resources>"

val outputFile = projectDirectory.file("app/src/main/res/values/languages.xml").asFile
if (!outputFile.exists()) outputFile.createNewFile()
outputFile.bufferedWriter().use {
it.write(localesConfig)
}
}
Loading