Implement language switcher (#563)
* Implement language switching using BaseActivity * Add requested changes * Cleanup App.kt Imports and add pref_language_key * Acutally use @string for key * Use string resource for language preference title
This commit is contained in:
parent
4061c7450b
commit
cc9fd53abb
12 changed files with 114 additions and 0 deletions
|
@ -2,10 +2,12 @@ package eu.kanade.tachiyomi
|
|||
|
||||
import android.app.Application
|
||||
import android.content.Context
|
||||
import android.content.res.Configuration
|
||||
import android.support.multidex.MultiDex
|
||||
import com.evernote.android.job.JobManager
|
||||
import eu.kanade.tachiyomi.data.library.LibraryUpdateJob
|
||||
import eu.kanade.tachiyomi.data.updater.UpdateCheckerJob
|
||||
import eu.kanade.tachiyomi.util.LocaleHelper
|
||||
import org.acra.ACRA
|
||||
import org.acra.annotation.ReportsCrashes
|
||||
import timber.log.Timber
|
||||
|
@ -31,6 +33,8 @@ open class App : Application() {
|
|||
|
||||
setupAcra()
|
||||
setupJobManager()
|
||||
|
||||
LocaleHelper.updateCfg(this, baseContext.resources.configuration)
|
||||
}
|
||||
|
||||
override fun attachBaseContext(base: Context) {
|
||||
|
@ -40,6 +44,11 @@ open class App : Application() {
|
|||
}
|
||||
}
|
||||
|
||||
override fun onConfigurationChanged(newConfig: Configuration) {
|
||||
super.onConfigurationChanged(newConfig)
|
||||
LocaleHelper.updateCfg(this, newConfig)
|
||||
}
|
||||
|
||||
protected open fun setupAcra() {
|
||||
ACRA.init(this)
|
||||
}
|
||||
|
|
|
@ -101,4 +101,6 @@ class PreferenceKeys(context: Context) {
|
|||
|
||||
val libraryAsList = context.getString(R.string.pref_display_library_as_list)
|
||||
|
||||
val lang = context.getString(R.string.pref_language_key)
|
||||
|
||||
}
|
||||
|
|
|
@ -138,4 +138,6 @@ class PreferencesHelper(context: Context) {
|
|||
|
||||
fun downloadNew() = prefs.getBoolean(keys.downloadNew, false)
|
||||
|
||||
fun lang() = prefs.getInt(keys.lang, 0)
|
||||
|
||||
}
|
||||
|
|
|
@ -1,9 +1,13 @@
|
|||
package eu.kanade.tachiyomi.ui.base.activity
|
||||
|
||||
import android.support.v7.app.AppCompatActivity
|
||||
import eu.kanade.tachiyomi.util.LocaleHelper
|
||||
|
||||
abstract class BaseActivity : AppCompatActivity(), ActivityMixin {
|
||||
|
||||
override fun getActivity() = this
|
||||
init {
|
||||
LocaleHelper.updateCfg(this)
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -110,6 +110,8 @@ class MainActivity : BaseActivity() {
|
|||
} else if (resultCode and SettingsActivity.FLAG_THEME_CHANGED != 0) {
|
||||
// Delay activity recreation to avoid fragment leaks.
|
||||
nav_view.post { recreate() }
|
||||
} else if (resultCode and SettingsActivity.FLAG_LANG_CHANGED != 0) {
|
||||
nav_view.post { recreate() }
|
||||
}
|
||||
} else {
|
||||
super.onActivityResult(requestCode, resultCode, data)
|
||||
|
|
|
@ -78,6 +78,7 @@ class SettingsActivity : BaseActivity(),
|
|||
companion object {
|
||||
const val FLAG_THEME_CHANGED = 0x1
|
||||
const val FLAG_DATABASE_CLEARED = 0x2
|
||||
const val FLAG_LANG_CHANGED = 0x4
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@ import eu.kanade.tachiyomi.R
|
|||
import eu.kanade.tachiyomi.data.database.DatabaseHelper
|
||||
import eu.kanade.tachiyomi.data.library.LibraryUpdateJob
|
||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||
import eu.kanade.tachiyomi.util.LocaleHelper
|
||||
import eu.kanade.tachiyomi.util.plusAssign
|
||||
import eu.kanade.tachiyomi.widget.preference.IntListPreference
|
||||
import eu.kanade.tachiyomi.widget.preference.LibraryColumnsDialog
|
||||
|
@ -17,6 +18,7 @@ import net.xpece.android.support.preference.MultiSelectListPreference
|
|||
import rx.Observable
|
||||
import rx.android.schedulers.AndroidSchedulers
|
||||
import uy.kohesive.injekt.injectLazy
|
||||
import java.util.*
|
||||
|
||||
class SettingsGeneralFragment : SettingsFragment(),
|
||||
PreferenceFragmentCompat.OnPreferenceDisplayDialogCallback {
|
||||
|
@ -44,6 +46,8 @@ class SettingsGeneralFragment : SettingsFragment(),
|
|||
|
||||
val categoryUpdate: MultiSelectListPreference by bindPref(R.string.pref_library_update_categories_key)
|
||||
|
||||
val langPreference: IntListPreference by bindPref(R.string.pref_language_key)
|
||||
|
||||
override fun onViewCreated(view: View, savedState: Bundle?) {
|
||||
super.onViewCreated(view, savedState)
|
||||
|
||||
|
@ -101,6 +105,15 @@ class SettingsGeneralFragment : SettingsFragment(),
|
|||
activity.recreate()
|
||||
true
|
||||
}
|
||||
|
||||
langPreference.setOnPreferenceChangeListener { preference, newValue ->
|
||||
(activity as SettingsActivity).parentFlags = SettingsActivity.FLAG_LANG_CHANGED
|
||||
LocaleHelper.setLocale(Locale(LocaleHelper.intToLangCode(newValue.toString().toInt())))
|
||||
LocaleHelper.updateCfg(activity.application, activity.baseContext.resources.configuration)
|
||||
activity.recreate()
|
||||
true
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
override fun onPreferenceDisplayDialog(p0: PreferenceFragmentCompat?, p: Preference): Boolean {
|
||||
|
|
48
app/src/main/java/eu/kanade/tachiyomi/util/LocaleHelper.kt
Normal file
48
app/src/main/java/eu/kanade/tachiyomi/util/LocaleHelper.kt
Normal file
|
@ -0,0 +1,48 @@
|
|||
package eu.kanade.tachiyomi.util
|
||||
|
||||
import android.app.Application
|
||||
import android.content.res.Configuration
|
||||
import android.os.Build
|
||||
import android.view.ContextThemeWrapper
|
||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
||||
import uy.kohesive.injekt.injectLazy
|
||||
import java.util.Locale
|
||||
|
||||
|
||||
object LocaleHelper {
|
||||
|
||||
private val preferences: PreferencesHelper by injectLazy()
|
||||
private var pLocale = Locale(LocaleHelper.intToLangCode(preferences.lang()))
|
||||
|
||||
fun setLocale(locale: Locale) {
|
||||
pLocale = locale
|
||||
Locale.setDefault(pLocale)
|
||||
}
|
||||
|
||||
fun updateCfg(wrapper: ContextThemeWrapper) {
|
||||
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
|
||||
val config = Configuration()
|
||||
config.setLocale(pLocale)
|
||||
wrapper.applyOverrideConfiguration(config)
|
||||
}
|
||||
}
|
||||
|
||||
fun updateCfg(app: Application, config: Configuration){
|
||||
if(Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN_MR1) {
|
||||
config.locale = pLocale
|
||||
app.baseContext.resources.updateConfiguration(config, app.baseContext.resources.displayMetrics)
|
||||
}
|
||||
}
|
||||
|
||||
fun intToLangCode(i: Int): String {
|
||||
return when(i){
|
||||
1 -> "en"
|
||||
2 -> "es"
|
||||
3 -> "it"
|
||||
4 -> "pt"
|
||||
// System Language
|
||||
else -> ""
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -188,4 +188,20 @@
|
|||
<item>2</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="languages">
|
||||
<item>@string/system_default</item>
|
||||
<item>@string/english</item>
|
||||
<item>@string/spanish</item>
|
||||
<item>@string/italian</item>
|
||||
<item>@string/portuguese</item>
|
||||
</string-array>
|
||||
|
||||
<string-array name="languages_values">
|
||||
<item>0</item>
|
||||
<item>1</item>
|
||||
<item>2</item>
|
||||
<item>3</item>
|
||||
<item>4</item>
|
||||
</string-array>
|
||||
|
||||
</resources>
|
|
@ -21,6 +21,7 @@
|
|||
<string name="pref_theme_key">pref_theme_key</string>
|
||||
<string name="pref_library_update_restriction_key">library_update_restriction</string>
|
||||
<string name="pref_start_screen_key">start_screen</string>
|
||||
<string name="pref_language_key">language</string>
|
||||
|
||||
<string name="pref_default_viewer_key">pref_default_viewer_key</string>
|
||||
<string name="pref_image_scale_type_key">pref_image_scale_type_key</string>
|
||||
|
|
|
@ -111,6 +111,14 @@
|
|||
<string name="light_theme">Main theme</string>
|
||||
<string name="dark_theme">Dark theme</string>
|
||||
<string name="pref_start_screen">Start screen</string>
|
||||
<string name="pref_language">Language</string>
|
||||
|
||||
<!-- Languages -->
|
||||
<string name="system_default">System Default</string>
|
||||
<string name="english">English</string>
|
||||
<string name="spanish">Spanish</string>
|
||||
<string name="italian">Italian</string>
|
||||
<string name="portuguese">Portuguese</string>
|
||||
|
||||
<!-- Reader section -->
|
||||
<string name="pref_fullscreen">Fullscreen</string>
|
||||
|
|
|
@ -56,6 +56,14 @@
|
|||
android:key="@string/pref_update_only_non_completed_key"
|
||||
android:title="@string/pref_update_only_non_completed" />
|
||||
|
||||
<eu.kanade.tachiyomi.widget.preference.IntListPreference
|
||||
android:defaultValue="0"
|
||||
android:entries="@array/languages"
|
||||
android:entryValues="@array/languages_values"
|
||||
android:key="@string/pref_language_key"
|
||||
android:summary="%s"
|
||||
android:title="@string/pref_language" />
|
||||
|
||||
</PreferenceScreen>
|
||||
|
||||
</PreferenceScreen>
|
Reference in a new issue