From 547e7c705d7e4fe9f7f1a29372097d1b5c8ae9de Mon Sep 17 00:00:00 2001 From: qwerty287 Date: Sat, 29 May 2021 18:21:48 +0200 Subject: [PATCH] Use language provided by system (#914) Pr tries to implement support for usage of system language. Currently work in progress. - [x] add option to use system language - [x] use this by default - [x] fix other usages of db value "locale" - [X] fix usages of `Locale.getDefault()` (except [here](https://codeberg.org/gitnex/GitNex/src/branch/main/app/src/main/java/org/mian/gitnex/helpers/ssl/MemorizingTrustManager.java#L429)) - [ ] get language list programmaticaly - [X] localize language names (related to #101) - [X] move languages list to ~~Hashmap~~ TreeMap (it seems that HashMaps sort everything in a random order) I carefully read the [contribution guidelines](https://codeberg.org/GitNex/GitNex/src/branch/main/CONTRIBUTING.md). I'm following the code standards as defined [here](https://codeberg.org/gitnex/GitNex/wiki/Code-Standards). By submitting this pull request, I permit GitNex to license my work under the [GNU General Public License v3](https://codeberg.org/GitNex/GitNex/src/branch/main/LICENSE).
Fixes #899 Co-authored-by: qwerty287 Reviewed-on: https://codeberg.org/gitnex/GitNex/pulls/914 Reviewed-by: opyale Co-authored-by: qwerty287 Co-committed-by: qwerty287 --- .../mian/gitnex/activities/BaseActivity.java | 9 +- .../activities/IssueDetailActivity.java | 2 +- .../SettingsTranslationActivity.java | 108 ++++-------------- .../adapters/AdminCronTasksAdapter.java | 2 +- .../mian/gitnex/adapters/CommitsAdapter.java | 2 +- .../adapters/ExploreRepositoriesAdapter.java | 8 +- .../gitnex/adapters/IssueCommentsAdapter.java | 4 +- .../mian/gitnex/adapters/IssuesAdapter.java | 2 +- .../gitnex/adapters/MilestonesAdapter.java | 2 +- .../gitnex/adapters/MyReposListAdapter.java | 2 +- .../gitnex/adapters/PullRequestsAdapter.java | 2 +- .../mian/gitnex/adapters/ReleasesAdapter.java | 2 +- .../gitnex/adapters/RepoForksAdapter.java | 2 +- .../gitnex/adapters/ReposListAdapter.java | 2 +- .../adapters/RepositoriesByOrgAdapter.java | 2 +- .../gitnex/adapters/SearchIssuesAdapter.java | 2 +- .../adapters/StarredReposListAdapter.java | 2 +- .../org/mian/gitnex/core/MainApplication.java | 5 + .../gitnex/fragments/RepoInfoFragment.java | 8 +- .../org/mian/gitnex/helpers/TimeHelper.java | 2 +- app/src/main/res/values/arrays.xml | 23 ++++ app/src/main/res/values/strings.xml | 1 + 22 files changed, 83 insertions(+), 111 deletions(-) create mode 100644 app/src/main/res/values/arrays.xml diff --git a/app/src/main/java/org/mian/gitnex/activities/BaseActivity.java b/app/src/main/java/org/mian/gitnex/activities/BaseActivity.java index c5642a6c..e054ba6e 100644 --- a/app/src/main/java/org/mian/gitnex/activities/BaseActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/BaseActivity.java @@ -8,6 +8,7 @@ import org.mian.gitnex.helpers.AppUtil; import org.mian.gitnex.helpers.TimeHelper; import org.mian.gitnex.helpers.TinyDB; import org.mian.gitnex.notifications.Notifications; +import java.util.Locale; /** * Author M M Arif @@ -77,7 +78,13 @@ public abstract class BaseActivity extends AppCompatActivity { } - AppUtil.setAppLocale(getResources(), tinyDB.getString("locale")); + String locale = tinyDB.getString("locale"); + if (locale.isEmpty()) { + AppUtil.setAppLocale(getResources(), Locale.getDefault().getLanguage()); + } + else { + AppUtil.setAppLocale(getResources(), locale); + } Notifications.startWorker(appCtx); } diff --git a/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java b/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java index 3760ab8a..2deae15a 100644 --- a/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/IssueDetailActivity.java @@ -569,7 +569,7 @@ public class IssueDetailActivity extends BaseActivity implements LabelsListAdapt } TinyDB tinyDb = TinyDB.getInstance(appCtx); - final String locale = tinyDb.getString("locale"); + final String locale = getResources().getConfiguration().locale.getLanguage(); final String timeFormat = tinyDb.getString("dateFormat"); tinyDb.putString("issueState", singleIssue.getState()); tinyDb.putString("issueTitle", singleIssue.getTitle()); diff --git a/app/src/main/java/org/mian/gitnex/activities/SettingsTranslationActivity.java b/app/src/main/java/org/mian/gitnex/activities/SettingsTranslationActivity.java index 45b3e8ac..8a40543d 100644 --- a/app/src/main/java/org/mian/gitnex/activities/SettingsTranslationActivity.java +++ b/app/src/main/java/org/mian/gitnex/activities/SettingsTranslationActivity.java @@ -11,6 +11,9 @@ import androidx.appcompat.app.AlertDialog; import org.mian.gitnex.R; import org.mian.gitnex.databinding.ActivitySettingsTranslationBinding; import org.mian.gitnex.helpers.Toasty; +import java.util.LinkedHashMap; +import java.util.Locale; +import java.util.TreeMap; /** * Author M M Arif @@ -20,8 +23,6 @@ public class SettingsTranslationActivity extends BaseActivity { private View.OnClickListener onClickListener; - private static String[] langList = {"English", "Arabic", "Chinese", "Czech", "Finnish", "French", "German", "Italian", "Latvian", "Persian", - "Polish", "Portuguese/Brazilian", "Russian", "Serbian", "Spanish", "Turkish", "Ukrainian"}; private static int langSelectedChoice = 0; @Override @@ -29,6 +30,12 @@ public class SettingsTranslationActivity extends BaseActivity { super.onCreate(savedInstanceState); + LinkedHashMap langs = new LinkedHashMap<>(); + langs.put("", getString(R.string.settingsLanguageSystem)); + for(String langCode : getResources().getStringArray(R.array.languages)) { + langs.put(langCode, getLanguageDisplayName(langCode)); + } + ActivitySettingsTranslationBinding activitySettingsTranslationBinding = ActivitySettingsTranslationBinding.inflate(getLayoutInflater()); setContentView(activitySettingsTranslationBinding.getRoot()); @@ -52,15 +59,9 @@ public class SettingsTranslationActivity extends BaseActivity { }); - if(!tinyDB.getString("localeStr").isEmpty()) { + tvLanguageSelected.setText(tinyDB.getString("localeStr")); - tvLanguageSelected.setText(tinyDB.getString("localeStr")); - } - - if(langSelectedChoice == 0) { - - langSelectedChoice = tinyDB.getInt("langId"); - } + langSelectedChoice = tinyDB.getInt("langId"); // language dialog langFrame.setOnClickListener(view -> { @@ -70,89 +71,18 @@ public class SettingsTranslationActivity extends BaseActivity { lBuilder.setTitle(R.string.settingsLanguageSelectorDialogTitle); lBuilder.setCancelable(langSelectedChoice != -1); - lBuilder.setSingleChoiceItems(langList, langSelectedChoice, (dialogInterface, i) -> { + lBuilder.setSingleChoiceItems(langs.values().toArray(new String[0]), langSelectedChoice, (dialogInterface, i) -> { - langSelectedChoice = i; - tvLanguageSelected.setText(langList[i]); - tinyDB.putString("localeStr", langList[i]); + String selectedLanguage = langs.keySet().toArray(new String[0])[i]; + tinyDB.putString("localeStr", langs.get(selectedLanguage)); tinyDB.putInt("langId", i); - - switch(langList[i]) { - case "Arabic": - - tinyDB.putString("locale", "ar"); - break; - case "Chinese": - - tinyDB.putString("locale", "zh"); - break; - case "Czech": - - tinyDB.putString("locale", "cs"); - break; - case "Finnish": - - tinyDB.putString("locale", "fi"); - break; - case "French": - - tinyDB.putString("locale", "fr"); - break; - case "German": - - tinyDB.putString("locale", "de"); - break; - case "Italian": - - tinyDB.putString("locale", "it"); - break; - case "Latvian": - - tinyDB.putString("locale", "lv"); - break; - case "Persian": - - tinyDB.putString("locale", "fa"); - break; - case "Polish": - - tinyDB.putString("locale", "pl"); - break; - case "Portuguese/Brazilian": - - tinyDB.putString("locale", "pt"); - break; - case "Russian": - - tinyDB.putString("locale", "ru"); - break; - case "Serbian": - - tinyDB.putString("locale", "sr"); - break; - case "Spanish": - - tinyDB.putString("locale", "es"); - break; - case "Turkish": - - tinyDB.putString("locale", "tr"); - break; - case "Ukrainian": - - tinyDB.putString("locale", "uk"); - break; - default: - - tinyDB.putString("locale", "en"); - break; - } + tinyDB.putString("locale", selectedLanguage); tinyDB.putBoolean("refreshParent", true); - this.recreate(); this.overridePendingTransition(0, 0); dialogInterface.dismiss(); Toasty.success(appCtx, getResources().getString(R.string.settingsSave)); + this.recreate(); }); lBuilder.setNeutralButton(getString(R.string.cancelButton), null); @@ -167,4 +97,10 @@ public class SettingsTranslationActivity extends BaseActivity { onClickListener = view -> finish(); } + private static String getLanguageDisplayName(String langCode) { + Locale english = new Locale("en"); + Locale translated = new Locale(langCode); + return String.format("%s (%s)", translated.getDisplayName(translated), translated.getDisplayName(english)); + } + } diff --git a/app/src/main/java/org/mian/gitnex/adapters/AdminCronTasksAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/AdminCronTasksAdapter.java index cb53bff4..c8be42c4 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/AdminCronTasksAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/AdminCronTasksAdapter.java @@ -44,7 +44,7 @@ public class AdminCronTasksAdapter extends RecyclerView.Adapter TimeHelper.customDateFormatForToastDateFormat(issueComment.getCreated_at())); } else if(timeFormat.equals("normal")) { - informationBuilder = new StringBuilder(TimeHelper.formatTime(issueComment.getCreated_at(), Locale.getDefault(), "normal", context)); + informationBuilder = new StringBuilder(TimeHelper.formatTime(issueComment.getCreated_at(), context.getResources().getConfiguration().locale, "normal", context)); } if(!issueComment.getCreated_at().equals(issueComment.getUpdated_at())) { diff --git a/app/src/main/java/org/mian/gitnex/adapters/IssuesAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/IssuesAdapter.java index 4a53a42c..6931df10 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/IssuesAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/IssuesAdapter.java @@ -135,7 +135,7 @@ public class IssuesAdapter extends RecyclerView.Adapter void bindData(Issues issue) { TinyDB tinyDb = TinyDB.getInstance(context); - String locale = tinyDb.getString("locale"); + String locale = context.getResources().getConfiguration().locale.getLanguage(); String timeFormat = tinyDb.getString("dateFormat"); int imgRadius = AppUtil.getPixelsFromDensity(context, 3); diff --git a/app/src/main/java/org/mian/gitnex/adapters/MilestonesAdapter.java b/app/src/main/java/org/mian/gitnex/adapters/MilestonesAdapter.java index f805e570..6c5f4a96 100644 --- a/app/src/main/java/org/mian/gitnex/adapters/MilestonesAdapter.java +++ b/app/src/main/java/org/mian/gitnex/adapters/MilestonesAdapter.java @@ -148,7 +148,7 @@ public class MilestonesAdapter extends RecyclerView.Adapter + + en + ar + zh + cs + fi + fr + de + it + lv + fa + pl + pt + ru + ru + sr + es + tr + uk + + + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3574f267..9aff1aef 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -223,6 +223,7 @@ Translation + System Security Delete Trusted Certificates Delete Trusted Certificates?