From f0e711f8d12b60ddc0329d42e20130c45d0389d1 Mon Sep 17 00:00:00 2001 From: Laurent Date: Wed, 14 Jun 2023 15:21:58 +0200 Subject: [PATCH] Adds language edition --- .../ui/activity/components/BaseActivity.kt | 25 +++++++++++++++ .../android/ui/fragment/SettingsFragment.kt | 28 ++++++++++++++++ .../android/ui/view/rows/SettingsRow.kt | 2 +- .../pokeranalytics/android/util/Language.kt | 32 +++++++++++++++++++ .../android/util/Preferences.kt | 11 ++++++- 5 files changed, 96 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/net/pokeranalytics/android/util/Language.kt diff --git a/app/src/main/java/net/pokeranalytics/android/ui/activity/components/BaseActivity.kt b/app/src/main/java/net/pokeranalytics/android/ui/activity/components/BaseActivity.kt index 7ebfac34..0fba94d0 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/activity/components/BaseActivity.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/activity/components/BaseActivity.kt @@ -3,6 +3,7 @@ package net.pokeranalytics.android.ui.activity.components import android.Manifest.permission.ACCESS_FINE_LOCATION import android.content.pm.ActivityInfo import android.content.pm.PackageManager +import android.os.Build import android.os.Bundle import android.os.PersistableBundle import android.view.MenuItem @@ -21,6 +22,8 @@ import net.pokeranalytics.android.ui.view.RowRepresentable import net.pokeranalytics.android.util.CrashLogging import net.pokeranalytics.android.util.LocationManager import net.pokeranalytics.android.util.PermissionRequest +import net.pokeranalytics.android.util.Preferences +import java.util.* class RootBottomSheetViewModel: ViewModel() { var rowRepresentable: RowRepresentable? = null @@ -55,12 +58,14 @@ abstract class BaseActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) CrashLogging.log("$this.localClassName onCreate, savedInstanceState=$savedInstanceState") + setLanguage() } override fun onCreate(savedInstanceState: Bundle?, persistentState: PersistableBundle?) { super.onCreate(savedInstanceState, persistentState) CrashLogging.log("$this.localClassName onCreate: bundle=$savedInstanceState, persistentState=$persistentState") requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT // fixes crash + setLanguage() } override fun onResume() { @@ -129,6 +134,26 @@ abstract class BaseActivity : AppCompatActivity() { fragmentTransaction.commit() } + private fun setLanguage() { + + Preferences.getLanguageCode(this)?.let { languageCode -> + + val config = resources.configuration +// val lang = "de" // your language code + val locale = Locale(languageCode) + Locale.setDefault(locale) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { + config.setLocale(locale) + } else { + config.locale = locale + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) + createConfigurationContext(config) + resources.updateConfiguration(config, resources.displayMetrics) + } + + } /** * Return the realm instance diff --git a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt index 24b6f760..d0ef99c3 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/fragment/SettingsFragment.kt @@ -11,9 +11,11 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Toast +import androidx.appcompat.app.AlertDialog import androidx.core.content.FileProvider import androidx.recyclerview.widget.LinearLayoutManager import com.android.billingclient.api.Purchase +import com.google.android.material.snackbar.Snackbar import com.google.android.play.core.review.ReviewManagerFactory import io.realm.Realm import net.pokeranalytics.android.BuildConfig @@ -237,6 +239,7 @@ class SettingsFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRep this.openPlayStoreAccount() } } + SettingsRow.LANGUAGE -> this.showLanguagePopup() SettingsRow.RATE_APP -> showReviewManager() SettingsRow.CONTACT_US -> parentActivity?.openContactMail(R.string.contact) SettingsRow.BUG_REPORT -> parentActivity?.openContactMail(R.string.bug_report_subject, Realm.getDefaultInstance().path) @@ -266,6 +269,31 @@ class SettingsFragment : RealmFragment(), RowRepresentableDelegate, StaticRowRep } } + private fun showLanguagePopup() { + + context?.let { context -> + + val languages = Language.values() + val labels = Language.values().map { it.dualNames } + + val builder: AlertDialog.Builder = AlertDialog.Builder(context) + builder.setTitle(R.string.language_popup_message) + builder.setItems(labels.toTypedArray()) { _, which -> + // the user clicked on colors[which] + val locale = languages[which] + Preferences.setLanguageCode(locale.code, context) + + this.view?.let { view -> + val snackBar = Snackbar.make(view, R.string.language_should_restart_app_popup_message, Snackbar.LENGTH_INDEFINITE) + snackBar.show() + } + + } + builder.show() + } + + } + private fun editBackupEmail() { context?.let { context -> showEditTextAlertDialog(context, InputType.TYPE_TEXT_VARIATION_EMAIL_ADDRESS, messageResId = R.string.backup_email_title, editTextText = Preferences.getBackupEmail(context)) { value -> diff --git a/app/src/main/java/net/pokeranalytics/android/ui/view/rows/SettingsRow.kt b/app/src/main/java/net/pokeranalytics/android/ui/view/rows/SettingsRow.kt index ad0744fe..7e75ba1a 100644 --- a/app/src/main/java/net/pokeranalytics/android/ui/view/rows/SettingsRow.kt +++ b/app/src/main/java/net/pokeranalytics/android/ui/view/rows/SettingsRow.kt @@ -81,7 +81,7 @@ enum class SettingsRow : RowRepresentable { rows.addAll(arrayListOf(FOLLOW_US, DISCORD, BLOG_TIPS, SHOULD_SHOW_BLOG_TIPS)) rows.add(CustomizableRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = R.string.preferences)) - rows.addAll(arrayListOf(CURRENCY, DEALT_HANDS_PER_HOUR, BACKUP_EMAIL, SHOW_INAPP_BADGES)) + rows.addAll(arrayListOf(LANGUAGE, CURRENCY, DEALT_HANDS_PER_HOUR, BACKUP_EMAIL, SHOW_INAPP_BADGES)) rows.add(CustomizableRowRepresentable(customViewType = RowViewType.HEADER_TITLE, resId = R.string.export)) rows.addAll(arrayListOf(EXPORT_CSV_SESSIONS, EXPORT_CSV_TRANSACTIONS)) diff --git a/app/src/main/java/net/pokeranalytics/android/util/Language.kt b/app/src/main/java/net/pokeranalytics/android/util/Language.kt new file mode 100644 index 00000000..0300b151 --- /dev/null +++ b/app/src/main/java/net/pokeranalytics/android/util/Language.kt @@ -0,0 +1,32 @@ +package net.pokeranalytics.android.util + +import java.util.* + +enum class Language(val code: String) { + ENGLISH("en"), + FRENCH("fr"), + GERMAN("de"), + HINDI("hi"), + ITALIAN("it"), + JAPANESE("ja"), + PORTUGUESE("pt"), + RUSSIAN("ru"), + CHINESE("zh"); + + private val localized: String + get() { + return Locale(code).displayLanguage + } + + private val localName: String + get() { + val locale = Locale(code) + return locale.getDisplayLanguage(locale) + } + + val dualNames: String + get() { + return "$localized / $localName" + } + +} \ No newline at end of file diff --git a/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt b/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt index 24362e6b..338db6b2 100644 --- a/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt +++ b/app/src/main/java/net/pokeranalytics/android/util/Preferences.kt @@ -50,7 +50,8 @@ class Preferences { SHOW_IN_APP_BADGES("showInAppBadges"), LAST_CALENDAR_BADGE_DATE("lastCalendarBadgeDate"), PATCH_RATED_AMOUNT("patchRatedAmount[new field]"), - BACKUP_EMAIL("backupEmail") + BACKUP_EMAIL("backupEmail"), + LANGUAGE_CODE("languageCode") } enum class FeedMessage { @@ -336,6 +337,14 @@ class Preferences { return getString(Keys.BACKUP_EMAIL, context) } + fun setLanguageCode(languageCode: String, context: Context) { + setString(Keys.LANGUAGE_CODE, languageCode, context) + } + + fun getLanguageCode(context: Context): String? { + return getString(Keys.LANGUAGE_CODE, context) + } + } }