From b969bae4238d55e60c555e0c5a351df7756e94dc Mon Sep 17 00:00:00 2001 From: Darcy Wong Date: Thu, 14 Jan 2021 16:17:56 +0700 Subject: [PATCH 1/9] feat(android/app): Add Settings menu to change display language --- .../kMAPro/src/main/AndroidManifest.xml | 6 + .../com/tavultesoft/kmapro/ContextUtils.java | 48 +++++++ .../tavultesoft/kmapro/DisplayLanguages.java | 38 ++++++ .../kmapro/KeymanSettingsActivity.java | 1 + .../kmapro/KeymanSettingsFragment.java | 14 +- .../KeymanSettingsLocalizeActivity.java | 128 ++++++++++++++++++ .../com/tavultesoft/kmapro/MainActivity.java | 22 ++- .../main/res/drawable-hdpi/ic_translate.png | Bin 0 -> 425 bytes .../main/res/drawable-mdpi/ic_translate.png | Bin 0 -> 425 bytes .../main/res/drawable-xhdpi/ic_translate.png | Bin 0 -> 526 bytes .../main/res/drawable-xxhdpi/ic_translate.png | Bin 0 -> 1073 bytes .../res/drawable-xxxhdpi/ic_translate.png | Bin 0 -> 1344 bytes .../preference_translate_icon_layout.xml | 5 + .../kMAPro/src/main/res/values/strings.xml | 3 + 14 files changed, 263 insertions(+), 2 deletions(-) create mode 100644 android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/ContextUtils.java create mode 100644 android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/DisplayLanguages.java create mode 100644 android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsLocalizeActivity.java create mode 100644 android/KMAPro/kMAPro/src/main/res/drawable-hdpi/ic_translate.png create mode 100644 android/KMAPro/kMAPro/src/main/res/drawable-mdpi/ic_translate.png create mode 100644 android/KMAPro/kMAPro/src/main/res/drawable-xhdpi/ic_translate.png create mode 100644 android/KMAPro/kMAPro/src/main/res/drawable-xxhdpi/ic_translate.png create mode 100644 android/KMAPro/kMAPro/src/main/res/drawable-xxxhdpi/ic_translate.png create mode 100644 android/KMAPro/kMAPro/src/main/res/layout/preference_translate_icon_layout.xml diff --git a/android/KMAPro/kMAPro/src/main/AndroidManifest.xml b/android/KMAPro/kMAPro/src/main/AndroidManifest.xml index 73b1ae679b..ca79447d3a 100644 --- a/android/KMAPro/kMAPro/src/main/AndroidManifest.xml +++ b/android/KMAPro/kMAPro/src/main/AndroidManifest.xml @@ -261,6 +261,12 @@ android:parentActivityName=".KeymanSettingsActivity" android:launchMode="singleTask" android:theme="@style/AppTheme.Base" /> + = Build.VERSION_CODES.N) { + LocaleList localeList = new LocaleList(localeToSwitchTo); + LocaleList.setDefault(localeList); + configuration.setLocales(localeList); + } else { + configuration.locale = localeToSwitchTo; + } + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { + context = context.createConfigurationContext(configuration); + } else { + resources.updateConfiguration(configuration, resources.getDisplayMetrics()); + } + + return new ContextUtils(context); + } + +} \ No newline at end of file diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/DisplayLanguages.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/DisplayLanguages.java new file mode 100644 index 0000000000..3b53650c82 --- /dev/null +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/DisplayLanguages.java @@ -0,0 +1,38 @@ +/** + * Copyright (C) 2021 SIL International. All rights reserved. + */ + +package com.tavultesoft.kmapro; + +public class DisplayLanguages { + private static final String TAG = "DisplayLanguages"; + public static final String unspecifiedLocale = ""; // empty string for app to use device's default locale + + public static class DisplayLanguageType { + String languageTag; + String languageName; + + public DisplayLanguageType(String languageTag, String languageName) { + this.languageTag = languageTag; + this.languageName = languageName; + } + + public String getLanguageTag() { + return this.languageTag; + } + + public String getLanguageName() { + return this.languageName; + } + } + + // Display Language types (as named in translate.keyman.com) + // Order doesn't matter since we're storing BCP-47 tags in the settings preference + public static final DisplayLanguageType[] DisplayLanguages = + { + new DisplayLanguageType(unspecifiedLocale, "Default Locale"), + new DisplayLanguageType("km-KH", "Khmer"), + new DisplayLanguageType("ann", "Obolo") + }; + +} \ No newline at end of file diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsActivity.java index b681fff7e0..b782f9f37f 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsActivity.java @@ -8,6 +8,7 @@ import androidx.appcompat.widget.Toolbar; public class KeymanSettingsActivity extends AppCompatActivity { protected static final String installedLanguagesKey = "InstalledLanguages"; protected static final String installKeyboardOrDictionaryKey = "InstallKeyboardOrDictionary"; + protected static final String displayLanguageKey = "DisplayLanguage"; protected static final String showBannerKey = "ShowBanner"; protected static final String sendCrashReport = "SendCrashReport"; diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsFragment.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsFragment.java index fa15d4c1b9..8d18470c9d 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsFragment.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsFragment.java @@ -1,3 +1,7 @@ +/** + * Copyright (C) 2020-2021 SIL International. All rights reserved. + */ + package com.tavultesoft.kmapro; import android.content.Context; @@ -19,7 +23,7 @@ public class KeymanSettingsFragment extends PreferenceFragmentCompat { private static final String TAG = "SettingsFragment"; private static Context context; - private Preference languagesPreference, installKeyboardOrDictionary; + private Preference languagesPreference, installKeyboardOrDictionary, displayLanguagePreference; private CheckBoxPreference setSystemKeyboardPreference; private CheckBoxPreference setDefaultKeyboardPreference; @@ -46,6 +50,13 @@ public class KeymanSettingsFragment extends PreferenceFragmentCompat { Intent installIntent = new Intent(context, KeymanSettingsInstallActivity.class); installKeyboardOrDictionary.setIntent(installIntent); + displayLanguagePreference = new Preference(context); + displayLanguagePreference.setKey(KeymanSettingsActivity.displayLanguageKey); + displayLanguagePreference.setTitle(getString(R.string.change_display_language)); + displayLanguagePreference.setWidgetLayoutResource(R.layout.preference_translate_icon_layout); + Intent displayLanguageIntent = new Intent(context, KeymanSettingsLocalizeActivity.class); + displayLanguagePreference.setIntent(displayLanguageIntent); + /* Automatically does the following: SharedPreferences.Editor editor = prefs.edit(); @@ -106,6 +117,7 @@ public class KeymanSettingsFragment extends PreferenceFragmentCompat { screen.addPreference(languagesPreference); screen.addPreference(installKeyboardOrDictionary); + screen.addPreference(displayLanguagePreference); screen.addPreference(setSystemKeyboardPreference); screen.addPreference(setDefaultKeyboardPreference); diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsLocalizeActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsLocalizeActivity.java new file mode 100644 index 0000000000..a62f6fd235 --- /dev/null +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsLocalizeActivity.java @@ -0,0 +1,128 @@ +/** + * Copyright (C) 2021 SIL International. All rights reserved. + */ + +package com.tavultesoft.kmapro; + +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.graphics.Typeface; +import android.os.Bundle; +import android.view.View; +import android.view.Window; +import android.widget.AdapterView; +import android.widget.ListAdapter; +import android.widget.ListView; +import android.widget.SimpleAdapter; +import android.widget.TextView; + +import androidx.appcompat.app.AlertDialog; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; +import androidx.preference.PreferenceManager; + +import com.tavultesoft.kmea.KMManager; +import com.tavultesoft.kmea.data.KeyboardController; +import com.tavultesoft.kmea.util.MapCompat; + +import java.util.ArrayList; +import java.util.HashMap; + +public class KeymanSettingsLocalizeActivity extends AppCompatActivity { + private static final String TAG = "SettingsLocalizeActivity"; + private static ArrayList> localizeOptionList = null; + private static Typeface titleFont = null; + private static final String titleKey = "title"; + private static final String subtitleKey = "subtitle"; + private static final String iconKey = "icon"; + private final String isEnabledKey = "isEnabled"; + private static Context context; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + supportRequestWindowFeature(Window.FEATURE_NO_TITLE); + context = this; + + setContentView(R.layout.activity_list_layout); + final Toolbar toolbar = findViewById(R.id.list_toolbar); + setSupportActionBar(toolbar); + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + getSupportActionBar().setDisplayShowHomeEnabled(true); + getSupportActionBar().setDisplayShowTitleEnabled(false); + + final ListView listView = findViewById(com.tavultesoft.kmea.R.id.listView); + + Bundle bundle = getIntent().getExtras(); + + final TextView textView = findViewById(R.id.bar_title); + textView.setText(getString(R.string.change_display_language)); + if (titleFont != null) { + textView.setTypeface(titleFont, Typeface.BOLD); + } + + localizeOptionList = new ArrayList<>(); + + final String noIcon = "0"; + for(DisplayLanguages.DisplayLanguageType l: DisplayLanguages.DisplayLanguages) { + HashMap hashMap = new HashMap<>(); + hashMap.put(titleKey, l.getLanguageName()); + String icon = String.valueOf(R.drawable.ic_content_add); + hashMap.put(iconKey, icon); + localizeOptionList.add(hashMap); + } + + String[] from = new String[]{titleKey, subtitleKey, iconKey}; + int[] to = new int[]{com.tavultesoft.kmea.R.id.text1, com.tavultesoft.kmea.R.id.text2, com.tavultesoft.kmea.R.id.image1}; + + ListAdapter adapter = new SimpleAdapter(context, localizeOptionList, com.tavultesoft.kmea.R.layout.list_row_layout2, from, to) { + /* + @Override + public boolean isEnabled(int position) { + HashMap hashMap = localizeOptionList.get(position); + String itemTitle = MapCompat.getOrDefault(hashMap, titleKey, ""); + String icon = MapCompat.getOrDefault(hashMap, iconKey, noIcon); + if (itemTitle.equals(getString(R.string.install_from_other_device))) { + // Scan QR code not implemented yet + return false; + } else if (itemTitle.equals(getString(R.string.add_languages_to_installed_keyboard))) { + if (KeyboardController.getInstance().getInstalledPackagesList() == null) { + // Disable if no keyboard packages installed + return false; + } + } + + return super.isEnabled(position); + } + */ + }; + listView.setAdapter(adapter); + listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { + + @Override + public void onItemClick(AdapterView parent, View view, int position, long id) { + HashMap hashMap = (HashMap) parent.getItemAtPosition(position); + + // Store the BCP-47 language tag in shared preference + if (position > 0 && position < DisplayLanguages.DisplayLanguages.length) { + + DisplayLanguages.DisplayLanguageType l = DisplayLanguages.DisplayLanguages[position]; + String languageTag = l.getLanguageTag(); + + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); + SharedPreferences.Editor editor = prefs.edit(); + editor.putString(KeymanSettingsActivity.displayLanguageKey, languageTag); + editor.commit(); + finish(); + } + } + }); + } + + @Override + public boolean onSupportNavigateUp() { + super.onBackPressed(); + return true; + } +} \ No newline at end of file diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/MainActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/MainActivity.java index 2585dcd520..ed6c6ebe04 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/MainActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/MainActivity.java @@ -1,5 +1,5 @@ /** - * Copyright (C) 2018-2020 SIL International. All rights reserved. + * Copyright (C) 2018-2021 SIL International. All rights reserved. */ package com.tavultesoft.kmapro; @@ -15,6 +15,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; +import java.util.Locale; import java.util.Map; import com.tavultesoft.kmea.KMKeyboardDownloaderActivity; @@ -39,6 +40,7 @@ import com.tavultesoft.kmea.util.KMPLink; import android.Manifest; import android.app.ProgressDialog; import android.content.ComponentName; +import android.content.ContextWrapper; import android.content.pm.PackageManager; import android.database.Cursor; import android.net.Uri; @@ -74,6 +76,7 @@ import android.graphics.drawable.Drawable; import android.provider.OpenableColumns; import androidx.annotation.NonNull; import androidx.core.app.ActivityCompat; +import androidx.preference.PreferenceManager; import android.text.Html; import android.util.Log; @@ -120,6 +123,23 @@ public class MainActivity extends AppCompatActivity implements OnKeyboardEventLi DownloadResultReceiver resultReceiver; private static ProgressDialog progressDialog; + @Override + protected void attachBaseContext(Context newBase) { + // Override the app locale using the BCP 47 tag from shared preferences + // Using PreferenceManager because this is before onCreate() + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(newBase); + String languageTag = prefs.getString(KeymanSettingsActivity.displayLanguageKey, DisplayLanguages.unspecifiedLocale); + if (languageTag == null || languageTag.equals(DisplayLanguages.unspecifiedLocale)) { + // Use the default locale + super.attachBaseContext(newBase); + return; + } + + Locale localeToSwitchTo = Locale.forLanguageTag(languageTag); + ContextWrapper localeUpdatedContext = ContextUtils.updateLocale(newBase, localeToSwitchTo); + super.attachBaseContext(localeUpdatedContext); + } + @Override protected void onCreate(Bundle savedInstanceState) { setTheme(R.style.AppTheme); diff --git a/android/KMAPro/kMAPro/src/main/res/drawable-hdpi/ic_translate.png b/android/KMAPro/kMAPro/src/main/res/drawable-hdpi/ic_translate.png new file mode 100644 index 0000000000000000000000000000000000000000..20cf9715e02d31bbe71da596b043298cc817d051 GIT binary patch literal 425 zcmV;a0apHrP)PIA9nczz`rnfDpnV3?YOeKnM^*2q6p*AcSx@ghL3!f2(tSL(+uOaL`@j42ALv=5evLj*VFpE4A)h`_rwk;0q~WDDfI~cub8P_62sG|$ zP$mFo=(*JovyWj*eP<}?4Ly76fF}$*5|J+P+qF7kSJEmC{Y>8_X^Jqlq-_Ckg1%P; zacpjyOR910K+U`uC*=y_9yeX#^Oc&((1-pQhUw|7&7yCqnS~9M1UgUvxsr`hmGzFX zca7b<;}OS)@k7y1H|8aHhzwIDKUGdB?%XsTZHa56h%g*HwxRIqkFfY9_H2&+)2J|n zq24i=?wPZn`iKr=LtQku$Nq2G)=3ljVJu_xWX9lysmC@>8gTLaFur?Ou9KW2aKgCm z@ymCTJ%ZNEjKzzFT0}X?gYKEAfhZ?=Soe5XCxt`zoXN*JDIB_IM?Sujdj0}m4ni=- TD^wx900000NkvXXu0mjfFN3$$ literal 0 HcmV?d00001 diff --git a/android/KMAPro/kMAPro/src/main/res/drawable-mdpi/ic_translate.png b/android/KMAPro/kMAPro/src/main/res/drawable-mdpi/ic_translate.png new file mode 100644 index 0000000000000000000000000000000000000000..20cf9715e02d31bbe71da596b043298cc817d051 GIT binary patch literal 425 zcmV;a0apHrP)PIA9nczz`rnfDpnV3?YOeKnM^*2q6p*AcSx@ghL3!f2(tSL(+uOaL`@j42ALv=5evLj*VFpE4A)h`_rwk;0q~WDDfI~cub8P_62sG|$ zP$mFo=(*JovyWj*eP<}?4Ly76fF}$*5|J+P+qF7kSJEmC{Y>8_X^Jqlq-_Ckg1%P; zacpjyOR910K+U`uC*=y_9yeX#^Oc&((1-pQhUw|7&7yCqnS~9M1UgUvxsr`hmGzFX zca7b<;}OS)@k7y1H|8aHhzwIDKUGdB?%XsTZHa56h%g*HwxRIqkFfY9_H2&+)2J|n zq24i=?wPZn`iKr=LtQku$Nq2G)=3ljVJu_xWX9lysmC@>8gTLaFur?Ou9KW2aKgCm z@ymCTJ%ZNEjKzzFT0}X?gYKEAfhZ?=Soe5XCxt`zoXN*JDIB_IM?Sujdj0}m4ni=- TD^wx900000NkvXXu0mjfFN3$$ literal 0 HcmV?d00001 diff --git a/android/KMAPro/kMAPro/src/main/res/drawable-xhdpi/ic_translate.png b/android/KMAPro/kMAPro/src/main/res/drawable-xhdpi/ic_translate.png new file mode 100644 index 0000000000000000000000000000000000000000..3f804126c280d54317f1f4c763503be0c6bf349a GIT binary patch literal 526 zcmV+p0`dKcP)FoX~`IF{FS z-|_GM?)V=*(AB-~_1*j4;Y=V9_>n09!9Xxz3-Leh1Ovf9PT8D@+yNyDL|3lzgo5!d z2CgX(EfK%qf(%5=7@Ifw&K(z|3Vff4IRXvN(-HCOJlwpGB5FoFC15GX_Q(NcU@gM# z0c9x1eC9b8_p(YI;3%thMKbM}Qmd08FLJUaPyuSdRz4eIGl?-UAVVs;N>Sb~VpgYQ zu4NPsGHV|hzfX9s*`{2BUczs5$e3H%_h>i(ZPGDIFz`&qG|&9~UqB6;x?F$_aFBo~ zXC_{6SeccYuzQ6OFxB?XdXHKEx*KWXuec7g}-5$R26_V@W? zq@CbJykTOb*)OS8m2>@TCvK04O33~x3d~(PLB;P4@s^3Dk^Nm1=xZl<6)z?p zjO;I=K-K7kY{d%|&Hl9G(g`DX@pkrGh($07*qoM6N<$f^I11P5=M^ literal 0 HcmV?d00001 diff --git a/android/KMAPro/kMAPro/src/main/res/drawable-xxhdpi/ic_translate.png b/android/KMAPro/kMAPro/src/main/res/drawable-xxhdpi/ic_translate.png new file mode 100644 index 0000000000000000000000000000000000000000..71b2332aaa821a5f30698a67cbc81e5ad5539216 GIT binary patch literal 1073 zcmV-11kU@3P)+-MyCzZQUyl3*G0*r)XZu3uqXW;~%IzIpW&VLDxg_Af0%Gjs^6X9691Pkdo z%-XubG42Q?_Jxx7AlECPpCM)|z?<;dw**VECH{{&XE|<#&wK|y5G>7= zaB?TW?lQMRVKfOcQ3eLW34Re~jhkX~^>hCIKlMyWg9GuZ=qz~r^e9d=cFB*1_}w2# zj9c*+|HOQ*#h*VXUmk>GCi!Aio!L!*nh@f)8K)lRQ(YKs5~D7jfDy3Cj6Gm1{LENy zI+=?lm%$Czc@NslOaLRpt<=hEhP8`z5<;Im%*NC(S+P>fxY+a?39<>x5E>R7}~3=G+D^BZ}}U!Nb| z?fgFY`2F*{-TSjO(pM*cp7aqI7R;YLT^vIy7~foO=RC^5!yNeg`>cDL|Ib^P-5?!G{X17ou$UH0K+9 zF#UZ)|EWA1*Vidi9sTcWtl(vi^?JYIr=#uT6akavI%(`#*Ve{v4#<L$r1 zu91{@ZfANn z@5~}HiheOeK&`2^>6&{t7>qwWNVwZ^x0Q9%_TEQ* zsb&ZM$k^OC-88u}^~kgECk{?xe?NJMvH!PmG~6zBp@~~sS9x0G55X>uol84%o`)T{ zy>s5izdk?VH1#&?7_^uOI_OL!N5fZG5EccxFVd2D{fd5z2T@SUpDLHLzp6B1y z!r$xCa;`yqx(KJdR42#Q#(nM(v1{fH&9j^#Y(K^aXA~itY{SkdyY?^iU%t4fiQ^%+ zbev|@IVX7sNmju_;Xy$vHEq3o%iUa7SnXLf^Xu16iL?HqZZB-hoGqTdS=^JC^twN9 zf|9v>qKJ#e{Rh`HG+hs=CzYJzIQm}kUNBIzlAHcVj=~-nV_nx%>L#z;l}k7`O`Y#D0VOPdOz>N4rRC(QdFzs$VA&y#Os{1tlxtbOt0@Mr zv#XK`ej)N!wvz z-A-t_E>W%tY1tFxV)do4dxGCYd)|-Cr;jk|>N<&cOfXrn)HOqr@z>fD^G!FV`AA(5 zQa)lizk~7Y{OXP0eIzeTQr^5MMr#R+Zuuti97e%~=MC ghgvv=|JB$r{;3NsdQy-l0xAbRUHx3vIVCg!058q{;{X5v literal 0 HcmV?d00001 diff --git a/android/KMAPro/kMAPro/src/main/res/layout/preference_translate_icon_layout.xml b/android/KMAPro/kMAPro/src/main/res/layout/preference_translate_icon_layout.xml new file mode 100644 index 0000000000..d66b445010 --- /dev/null +++ b/android/KMAPro/kMAPro/src/main/res/layout/preference_translate_icon_layout.xml @@ -0,0 +1,5 @@ + + diff --git a/android/KMAPro/kMAPro/src/main/res/values/strings.xml b/android/KMAPro/kMAPro/src/main/res/values/strings.xml index 8784919a06..1285c9f2e7 100644 --- a/android/KMAPro/kMAPro/src/main/res/values/strings.xml +++ b/android/KMAPro/kMAPro/src/main/res/values/strings.xml @@ -95,6 +95,9 @@ Install Keyboard or Dictionary + + Change display language + Always show banner From 65d6227cecb1e12a594476d5e6e635a5b6646a50 Mon Sep 17 00:00:00 2001 From: Darcy Wong Date: Fri, 15 Jan 2021 07:06:38 +0700 Subject: [PATCH 2/9] chore: Add note about Crowdin API limitation with custom languages --- resources/build/l10n/README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/resources/build/l10n/README.md b/resources/build/l10n/README.md index 0a89c334a5..25c5da1d44 100644 --- a/resources/build/l10n/README.md +++ b/resources/build/l10n/README.md @@ -1,6 +1,6 @@ # Localization Maintenance -Localization for Keyman is maintained at https://crowdin.com/project/keyman +Localization for Keyman is maintained at https://translate.keyman.com Downloading and updating files between Keyman and Crowdin happens automatically on GitHub by way of the Crowdin git integration. The configuration file for all platforms @@ -69,6 +69,9 @@ To download latest translations for the specific language: crowdin download -b master -l {language_code} ``` +Note: the Crowdin API doesn't handle custom languages so those will need to be manually synced. +See https://support.crowdin.com/api/language-codes/ + To display a list of latest translations from Crowdin: ```bash From 1afc3347c131cd8bd68d2d1ef39374ba6c3315ab Mon Sep 17 00:00:00 2001 From: Darcy Wong Date: Mon, 18 Jan 2021 11:17:03 +0700 Subject: [PATCH 3/9] fix(android/app): Use BaseActivity --- .../com/tavultesoft/kmapro/BaseActivity.java | 35 +++++++++++++++++++ .../tavultesoft/kmapro/BookmarksActivity.java | 2 +- .../kmapro/GetStartedActivity.java | 2 +- .../com/tavultesoft/kmapro/InfoActivity.java | 2 +- .../kmapro/KMPBrowserActivity.java | 2 +- .../com/tavultesoft/kmapro/MainActivity.java | 19 +--------- .../kmapro/WebBrowserActivity.java | 2 +- 7 files changed, 41 insertions(+), 23 deletions(-) create mode 100644 android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/BaseActivity.java diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/BaseActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/BaseActivity.java new file mode 100644 index 0000000000..fa9de04f78 --- /dev/null +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/BaseActivity.java @@ -0,0 +1,35 @@ +/** + * Copyright (C) 2021 SIL International. All rights reserved. + */ + +package com.tavultesoft.kmapro; + +import android.content.Context; +import android.content.ContextWrapper; +import android.content.SharedPreferences; + +import androidx.appcompat.app.AppCompatActivity; +import androidx.preference.PreferenceManager; + +import java.util.Locale; + +public class BaseActivity extends AppCompatActivity { + + @Override + protected void attachBaseContext(Context newBase) { + // Override the app locale using the BCP 47 tag from shared preferences + // Using PreferenceManager because this is before onCreate() + SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(newBase); + String languageTag = prefs.getString(KeymanSettingsActivity.displayLanguageKey, DisplayLanguages.unspecifiedLocale); + if (languageTag == null || languageTag.equals(DisplayLanguages.unspecifiedLocale)) { + // Use the default locale + super.attachBaseContext(newBase); + return; + } + + Locale localeToSwitchTo = Locale.forLanguageTag(languageTag); + ContextWrapper localeUpdatedContext = ContextUtils.updateLocale(newBase, localeToSwitchTo); + super.attachBaseContext(localeUpdatedContext); + } + +} \ No newline at end of file diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/BookmarksActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/BookmarksActivity.java index d0d41a8948..c3f8d0fdec 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/BookmarksActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/BookmarksActivity.java @@ -39,7 +39,7 @@ import android.content.Intent; import com.tavultesoft.kmea.util.KMLog; -public class BookmarksActivity extends AppCompatActivity { +public class BookmarksActivity extends BaseActivity { private static final String TAG = "BookmarksActivity"; private static ListView listView; private static ArrayList> list = null; diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/GetStartedActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/GetStartedActivity.java index ede2962217..abead5017a 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/GetStartedActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/GetStartedActivity.java @@ -29,7 +29,7 @@ import android.content.Intent; import android.content.SharedPreferences; import android.widget.TextView; -public class GetStartedActivity extends AppCompatActivity { +public class GetStartedActivity extends BaseActivity { private static ListView listView = null; private static ArrayList> list = null; diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/InfoActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/InfoActivity.java index 01bb79d4f5..91547f6b6e 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/InfoActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/InfoActivity.java @@ -20,7 +20,7 @@ import android.widget.TextView; import android.annotation.SuppressLint; import androidx.appcompat.app.AppCompatActivity; -public class InfoActivity extends AppCompatActivity { +public class InfoActivity extends BaseActivity { private final static String TAG = "InfoActivity"; private WebView webView; private final String HELP_PRODUCTION_HOST = "help.keyman.com"; diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KMPBrowserActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KMPBrowserActivity.java index 6e3ef52681..b0bf400cdc 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KMPBrowserActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KMPBrowserActivity.java @@ -27,7 +27,7 @@ import java.util.regex.Pattern; import static android.app.Application.getProcessName; -public class KMPBrowserActivity extends AppCompatActivity { +public class KMPBrowserActivity extends BaseActivity { private static final String TAG = "KMPBrowserActivity"; // URL for keyboard search web page presented to user when they add a keyboard in the app. diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/MainActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/MainActivity.java index ed6c6ebe04..0a16e6e1ca 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/MainActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/MainActivity.java @@ -95,7 +95,7 @@ import android.widget.Toast; import io.sentry.android.core.SentryAndroid; -public class MainActivity extends AppCompatActivity implements OnKeyboardEventListener, OnKeyboardDownloadEventListener, +public class MainActivity extends BaseActivity implements OnKeyboardEventListener, OnKeyboardDownloadEventListener, ActivityCompat.OnRequestPermissionsResultCallback { public static Context context; @@ -123,23 +123,6 @@ public class MainActivity extends AppCompatActivity implements OnKeyboardEventLi DownloadResultReceiver resultReceiver; private static ProgressDialog progressDialog; - @Override - protected void attachBaseContext(Context newBase) { - // Override the app locale using the BCP 47 tag from shared preferences - // Using PreferenceManager because this is before onCreate() - SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(newBase); - String languageTag = prefs.getString(KeymanSettingsActivity.displayLanguageKey, DisplayLanguages.unspecifiedLocale); - if (languageTag == null || languageTag.equals(DisplayLanguages.unspecifiedLocale)) { - // Use the default locale - super.attachBaseContext(newBase); - return; - } - - Locale localeToSwitchTo = Locale.forLanguageTag(languageTag); - ContextWrapper localeUpdatedContext = ContextUtils.updateLocale(newBase, localeToSwitchTo); - super.attachBaseContext(localeUpdatedContext); - } - @Override protected void onCreate(Bundle savedInstanceState) { setTheme(R.style.AppTheme); diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/WebBrowserActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/WebBrowserActivity.java index a2be8fd173..8229d38231 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/WebBrowserActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/WebBrowserActivity.java @@ -48,7 +48,7 @@ import androidx.appcompat.app.AppCompatActivity; import static android.app.Application.getProcessName; -public class WebBrowserActivity extends AppCompatActivity { +public class WebBrowserActivity extends BaseActivity { private static final String TAG = "WebBrowserActivity"; private WebView webView; private EditText addressField; From ad25f7e1274f42d379a68ddab8de385bc73c7ce2 Mon Sep 17 00:00:00 2001 From: Darcy Wong Date: Mon, 18 Jan 2021 13:13:20 +0700 Subject: [PATCH 4/9] fix(android/app): Fix Settings title and index of display language --- .../java/com/tavultesoft/kmapro/KeymanSettingsActivity.java | 3 ++- .../com/tavultesoft/kmapro/KeymanSettingsLocalizeActivity.java | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsActivity.java index b782f9f37f..84b9c92cdf 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsActivity.java @@ -5,7 +5,7 @@ import android.os.Bundle; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; -public class KeymanSettingsActivity extends AppCompatActivity { +public class KeymanSettingsActivity extends BaseActivity { protected static final String installedLanguagesKey = "InstalledLanguages"; protected static final String installKeyboardOrDictionaryKey = "InstallKeyboardOrDictionary"; protected static final String displayLanguageKey = "DisplayLanguage"; @@ -21,6 +21,7 @@ public class KeymanSettingsActivity extends AppCompatActivity { setContentView(R.layout.keyman_settings_layout); Toolbar toolbar = (Toolbar) findViewById(R.id.keyman_settings_toolbar); toolbar.setTitleTextColor(getResources().getColor(android.R.color.white)); + toolbar.setTitle(R.string.keyman_settings); setSupportActionBar(toolbar); if (getSupportActionBar() != null) { getSupportActionBar().setDisplayHomeAsUpEnabled(true); diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsLocalizeActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsLocalizeActivity.java index a62f6fd235..b9d4474989 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsLocalizeActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsLocalizeActivity.java @@ -105,7 +105,7 @@ public class KeymanSettingsLocalizeActivity extends AppCompatActivity { HashMap hashMap = (HashMap) parent.getItemAtPosition(position); // Store the BCP-47 language tag in shared preference - if (position > 0 && position < DisplayLanguages.DisplayLanguages.length) { + if (position >= 0 && position < DisplayLanguages.DisplayLanguages.length) { DisplayLanguages.DisplayLanguageType l = DisplayLanguages.DisplayLanguages[position]; String languageTag = l.getLanguageTag(); From 2f87fef4c30f470bfda950c6cc112dd06e5cadf8 Mon Sep 17 00:00:00 2001 From: Darcy Wong Date: Mon, 18 Jan 2021 14:12:11 +0700 Subject: [PATCH 5/9] fix(android/engine): Refactor BaseActivity to KMEA --- .../main/java/com/tavultesoft/kmapro/BookmarksActivity.java | 1 + .../java/com/tavultesoft/kmapro/GetStartedActivity.java | 1 + .../src/main/java/com/tavultesoft/kmapro/InfoActivity.java | 1 + .../java/com/tavultesoft/kmapro/KMPBrowserActivity.java | 1 + .../java/com/tavultesoft/kmapro/KeymanSettingsActivity.java | 3 ++- .../java/com/tavultesoft/kmapro/KeymanSettingsFragment.java | 3 ++- .../tavultesoft/kmapro/KeymanSettingsLocalizeActivity.java | 3 ++- .../src/main/java/com/tavultesoft/kmapro/MainActivity.java | 2 +- .../java/com/tavultesoft/kmapro/WebBrowserActivity.java | 1 + android/KMEA/app/build.gradle | 1 + .../src/main/java/com/tavultesoft/kmea}/BaseActivity.java | 6 ++++-- .../main/java/com/tavultesoft/kmea}/DisplayLanguages.java | 3 ++- .../com/tavultesoft/kmea/KMKeyboardDownloaderActivity.java | 2 +- .../java/com/tavultesoft/kmea/KeyboardInfoActivity.java | 2 +- .../java/com/tavultesoft/kmea/KeyboardPickerActivity.java | 2 +- .../main/java/com/tavultesoft/kmea/ModelInfoActivity.java | 2 +- .../main/java/com/tavultesoft/kmea/ModelPickerActivity.java | 2 +- .../main/java/com/tavultesoft/kmea/util}/ContextUtils.java | 2 +- 18 files changed, 25 insertions(+), 13 deletions(-) rename android/{KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro => KMEA/app/src/main/java/com/tavultesoft/kmea}/BaseActivity.java (84%) rename android/{KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro => KMEA/app/src/main/java/com/tavultesoft/kmea}/DisplayLanguages.java (91%) rename android/{KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro => KMEA/app/src/main/java/com/tavultesoft/kmea/util}/ContextUtils.java (97%) diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/BookmarksActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/BookmarksActivity.java index c3f8d0fdec..6cf3f468b4 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/BookmarksActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/BookmarksActivity.java @@ -37,6 +37,7 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; +import com.tavultesoft.kmea.BaseActivity; import com.tavultesoft.kmea.util.KMLog; public class BookmarksActivity extends BaseActivity { diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/GetStartedActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/GetStartedActivity.java index abead5017a..d159e1a197 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/GetStartedActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/GetStartedActivity.java @@ -8,6 +8,7 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import com.tavultesoft.kmea.BaseActivity; import com.tavultesoft.kmea.KMManager; import com.tavultesoft.kmea.data.Keyboard; diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/InfoActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/InfoActivity.java index 91547f6b6e..7802f239ca 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/InfoActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/InfoActivity.java @@ -4,6 +4,7 @@ package com.tavultesoft.kmapro; +import com.tavultesoft.kmea.BaseActivity; import com.tavultesoft.kmea.BuildConfig; import com.tavultesoft.kmea.KMManager; import com.tavultesoft.kmea.KMManager.FormFactor; diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KMPBrowserActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KMPBrowserActivity.java index b0bf400cdc..f25af7371a 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KMPBrowserActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KMPBrowserActivity.java @@ -19,6 +19,7 @@ import android.webkit.WebView; import android.webkit.WebViewClient; import androidx.appcompat.app.AppCompatActivity; +import com.tavultesoft.kmea.BaseActivity; import com.tavultesoft.kmea.KMManager; import com.tavultesoft.kmea.util.KMPLink; diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsActivity.java index 84b9c92cdf..10bd0f9c2c 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsActivity.java @@ -2,13 +2,14 @@ package com.tavultesoft.kmapro; import android.os.Bundle; +import com.tavultesoft.kmea.BaseActivity; + import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; public class KeymanSettingsActivity extends BaseActivity { protected static final String installedLanguagesKey = "InstalledLanguages"; protected static final String installKeyboardOrDictionaryKey = "InstallKeyboardOrDictionary"; - protected static final String displayLanguageKey = "DisplayLanguage"; protected static final String showBannerKey = "ShowBanner"; protected static final String sendCrashReport = "SendCrashReport"; diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsFragment.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsFragment.java index 8d18470c9d..468367f879 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsFragment.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsFragment.java @@ -16,6 +16,7 @@ import androidx.preference.PreferenceFragmentCompat; import androidx.preference.PreferenceScreen; import androidx.preference.SwitchPreference; +import com.tavultesoft.kmea.DisplayLanguages; import com.tavultesoft.kmea.KMManager; import com.tavultesoft.kmea.data.Dataset; @@ -51,7 +52,7 @@ public class KeymanSettingsFragment extends PreferenceFragmentCompat { installKeyboardOrDictionary.setIntent(installIntent); displayLanguagePreference = new Preference(context); - displayLanguagePreference.setKey(KeymanSettingsActivity.displayLanguageKey); + displayLanguagePreference.setKey(DisplayLanguages.displayLanguageKey); displayLanguagePreference.setTitle(getString(R.string.change_display_language)); displayLanguagePreference.setWidgetLayoutResource(R.layout.preference_translate_icon_layout); Intent displayLanguageIntent = new Intent(context, KeymanSettingsLocalizeActivity.class); diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsLocalizeActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsLocalizeActivity.java index b9d4474989..5f00883788 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsLocalizeActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsLocalizeActivity.java @@ -22,6 +22,7 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.preference.PreferenceManager; +import com.tavultesoft.kmea.DisplayLanguages; import com.tavultesoft.kmea.KMManager; import com.tavultesoft.kmea.data.KeyboardController; import com.tavultesoft.kmea.util.MapCompat; @@ -112,7 +113,7 @@ public class KeymanSettingsLocalizeActivity extends AppCompatActivity { SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); SharedPreferences.Editor editor = prefs.edit(); - editor.putString(KeymanSettingsActivity.displayLanguageKey, languageTag); + editor.putString(DisplayLanguages.displayLanguageKey, languageTag); editor.commit(); finish(); } diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/MainActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/MainActivity.java index 0a16e6e1ca..9afa43ce2d 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/MainActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/MainActivity.java @@ -15,9 +15,9 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; -import java.util.Locale; import java.util.Map; +import com.tavultesoft.kmea.BaseActivity; import com.tavultesoft.kmea.KMKeyboardDownloaderActivity; import com.tavultesoft.kmea.KMManager; import com.tavultesoft.kmea.KMManager.KeyboardType; diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/WebBrowserActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/WebBrowserActivity.java index 8229d38231..229b24fdb4 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/WebBrowserActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/WebBrowserActivity.java @@ -10,6 +10,7 @@ import java.net.URL; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; +import com.tavultesoft.kmea.BaseActivity; import com.tavultesoft.kmea.KMManager; import com.tavultesoft.kmea.util.KMPLink; diff --git a/android/KMEA/app/build.gradle b/android/KMEA/app/build.gradle index 20c23e8aa0..d5b7348f28 100644 --- a/android/KMEA/app/build.gradle +++ b/android/KMEA/app/build.gradle @@ -66,6 +66,7 @@ dependencies { implementation 'com.google.android.material:material:1.2.1' implementation 'commons-io:commons-io:2.6' implementation 'io.sentry:sentry-android:3.1.0' + implementation 'androidx.preference:preference:1.1.1' // Robolectric testImplementation 'androidx.test:core:1.2.0' diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/BaseActivity.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/BaseActivity.java similarity index 84% rename from android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/BaseActivity.java rename to android/KMEA/app/src/main/java/com/tavultesoft/kmea/BaseActivity.java index fa9de04f78..860aae9ed6 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/BaseActivity.java +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/BaseActivity.java @@ -2,7 +2,7 @@ * Copyright (C) 2021 SIL International. All rights reserved. */ -package com.tavultesoft.kmapro; +package com.tavultesoft.kmea; import android.content.Context; import android.content.ContextWrapper; @@ -11,6 +11,8 @@ import android.content.SharedPreferences; import androidx.appcompat.app.AppCompatActivity; import androidx.preference.PreferenceManager; +import com.tavultesoft.kmea.util.ContextUtils; + import java.util.Locale; public class BaseActivity extends AppCompatActivity { @@ -20,7 +22,7 @@ public class BaseActivity extends AppCompatActivity { // Override the app locale using the BCP 47 tag from shared preferences // Using PreferenceManager because this is before onCreate() SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(newBase); - String languageTag = prefs.getString(KeymanSettingsActivity.displayLanguageKey, DisplayLanguages.unspecifiedLocale); + String languageTag = prefs.getString(DisplayLanguages.displayLanguageKey, DisplayLanguages.unspecifiedLocale); if (languageTag == null || languageTag.equals(DisplayLanguages.unspecifiedLocale)) { // Use the default locale super.attachBaseContext(newBase); diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/DisplayLanguages.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/DisplayLanguages.java similarity index 91% rename from android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/DisplayLanguages.java rename to android/KMEA/app/src/main/java/com/tavultesoft/kmea/DisplayLanguages.java index 3b53650c82..093ca93a09 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/DisplayLanguages.java +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/DisplayLanguages.java @@ -2,10 +2,11 @@ * Copyright (C) 2021 SIL International. All rights reserved. */ -package com.tavultesoft.kmapro; +package com.tavultesoft.kmea; public class DisplayLanguages { private static final String TAG = "DisplayLanguages"; + public static final String displayLanguageKey = "DisplayLanguage"; public static final String unspecifiedLocale = ""; // empty string for app to use device's default locale public static class DisplayLanguageType { diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KMKeyboardDownloaderActivity.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KMKeyboardDownloaderActivity.java index cd56cf6bc7..c55138ad35 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KMKeyboardDownloaderActivity.java +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KMKeyboardDownloaderActivity.java @@ -22,7 +22,7 @@ import java.util.List; import static com.tavultesoft.kmea.ConfirmDialogFragment.DialogType.DIALOG_TYPE_DOWNLOAD_KEYBOARD; import static com.tavultesoft.kmea.ConfirmDialogFragment.DialogType.DIALOG_TYPE_DOWNLOAD_MODEL; -public class KMKeyboardDownloaderActivity extends AppCompatActivity { +public class KMKeyboardDownloaderActivity extends BaseActivity { // Bundle Keys // Cloud diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KeyboardInfoActivity.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KeyboardInfoActivity.java index 63f95182ab..4c2a316e96 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KeyboardInfoActivity.java +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KeyboardInfoActivity.java @@ -36,7 +36,7 @@ import com.tavultesoft.kmea.util.MapCompat; import com.tavultesoft.kmea.util.QRCodeUtil; // Public access is necessary to avoid IllegalAccessException -public final class KeyboardInfoActivity extends AppCompatActivity { +public final class KeyboardInfoActivity extends BaseActivity { private static final String TAG = "KeyboardInfoActivity"; private static Toolbar toolbar = null; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KeyboardPickerActivity.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KeyboardPickerActivity.java index 5da07ec094..960e29a08f 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KeyboardPickerActivity.java +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/KeyboardPickerActivity.java @@ -45,7 +45,7 @@ import android.widget.Toast; import androidx.appcompat.widget.Toolbar; -public final class KeyboardPickerActivity extends AppCompatActivity { +public final class KeyboardPickerActivity extends BaseActivity { //TODO: view instances should not be static private static Toolbar toolbar = null; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/ModelInfoActivity.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/ModelInfoActivity.java index 7213a2cd68..80f45ed553 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/ModelInfoActivity.java +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/ModelInfoActivity.java @@ -38,7 +38,7 @@ import com.tavultesoft.kmea.util.MapCompat; import static com.tavultesoft.kmea.ConfirmDialogFragment.DialogType.DIALOG_TYPE_DELETE_MODEL; // Public access is necessary to avoid IllegalAccessException -public final class ModelInfoActivity extends AppCompatActivity { +public final class ModelInfoActivity extends BaseActivity { private static ArrayList> infoList = null; private final String titleKey = "title"; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/ModelPickerActivity.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/ModelPickerActivity.java index 741a1eb8d3..a4d03ef3ad 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/ModelPickerActivity.java +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/ModelPickerActivity.java @@ -40,7 +40,7 @@ import java.util.Map; * Gets the list of installable lexical models from Keyman cloud and allows user to download a model. * Displays a list of available models for a language ID. */ -public final class ModelPickerActivity extends AppCompatActivity { +public final class ModelPickerActivity extends BaseActivity { private Context context; private static Toolbar toolbar = null; diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/ContextUtils.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/ContextUtils.java similarity index 97% rename from android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/ContextUtils.java rename to android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/ContextUtils.java index 95b8b8fb3b..bfc982d311 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/ContextUtils.java +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/ContextUtils.java @@ -1,7 +1,7 @@ /** * Copyright (C) 2021 SIL International. All rights reserved. */ -package com.tavultesoft.kmapro; +package com.tavultesoft.kmea.util; import android.content.Context; import android.content.ContextWrapper; From 3985e31381d96a1544d8ef662daee55c86a34512 Mon Sep 17 00:00:00 2001 From: Darcy Wong Date: Mon, 18 Jan 2021 14:51:39 +0700 Subject: [PATCH 6/9] chore(android): Cleanup whitespace --- .../src/main/java/com/tavultesoft/kmapro/MainActivity.java | 2 -- .../app/src/main/java/com/tavultesoft/kmea/BaseActivity.java | 2 +- .../src/main/java/com/tavultesoft/kmea/DisplayLanguages.java | 2 +- .../src/main/java/com/tavultesoft/kmea/util/ContextUtils.java | 4 ++-- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/MainActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/MainActivity.java index 9afa43ce2d..ddaf2ea3fa 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/MainActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/MainActivity.java @@ -40,7 +40,6 @@ import com.tavultesoft.kmea.util.KMPLink; import android.Manifest; import android.app.ProgressDialog; import android.content.ComponentName; -import android.content.ContextWrapper; import android.content.pm.PackageManager; import android.database.Cursor; import android.net.Uri; @@ -76,7 +75,6 @@ import android.graphics.drawable.Drawable; import android.provider.OpenableColumns; import androidx.annotation.NonNull; import androidx.core.app.ActivityCompat; -import androidx.preference.PreferenceManager; import android.text.Html; import android.util.Log; diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/BaseActivity.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/BaseActivity.java index 860aae9ed6..0b63c835a0 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/BaseActivity.java +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/BaseActivity.java @@ -34,4 +34,4 @@ public class BaseActivity extends AppCompatActivity { super.attachBaseContext(localeUpdatedContext); } -} \ No newline at end of file +} diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/DisplayLanguages.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/DisplayLanguages.java index 093ca93a09..112c3ee5d5 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/DisplayLanguages.java +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/DisplayLanguages.java @@ -36,4 +36,4 @@ public class DisplayLanguages { new DisplayLanguageType("ann", "Obolo") }; -} \ No newline at end of file +} diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/ContextUtils.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/ContextUtils.java index bfc982d311..c432dfa63b 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/ContextUtils.java +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/util/ContextUtils.java @@ -13,7 +13,7 @@ import android.os.LocaleList; import java.util.Locale; /** - * Class to programatically change the application locale (#4236) + * Class to programmatically change the application locale (#4236) * References * Tutorial from https://lokalise.com/blog/android-app-localization/#Change_Application_Locale_Programmatically * https://github.com/nirm2009/lokalise/tree/master/android-i18n @@ -45,4 +45,4 @@ public class ContextUtils extends ContextWrapper { return new ContextUtils(context); } -} \ No newline at end of file +} From bc85e08ba460a43084d7487ef039558a2bbfe9c5 Mon Sep 17 00:00:00 2001 From: Darcy Wong Date: Tue, 19 Jan 2021 10:44:50 +0700 Subject: [PATCH 7/9] chore(android): Address review comments * Remove "+" icon from display language list * Restart the app on changing display language * Document updating DisplayLanguages * Misc code cleanup --- .../KeymanSettingsLocalizeActivity.java | 35 ++++--------------- .../com/tavultesoft/kmea/BaseActivity.java | 16 ++++++--- resources/build/l10n/README.md | 6 ++++ 3 files changed, 23 insertions(+), 34 deletions(-) diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsLocalizeActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsLocalizeActivity.java index 5f00883788..2726de23e9 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsLocalizeActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsLocalizeActivity.java @@ -17,15 +17,11 @@ import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.TextView; -import androidx.appcompat.app.AlertDialog; import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.widget.Toolbar; import androidx.preference.PreferenceManager; import com.tavultesoft.kmea.DisplayLanguages; -import com.tavultesoft.kmea.KMManager; -import com.tavultesoft.kmea.data.KeyboardController; -import com.tavultesoft.kmea.util.MapCompat; import java.util.ArrayList; import java.util.HashMap; @@ -37,7 +33,6 @@ public class KeymanSettingsLocalizeActivity extends AppCompatActivity { private static final String titleKey = "title"; private static final String subtitleKey = "subtitle"; private static final String iconKey = "icon"; - private final String isEnabledKey = "isEnabled"; private static Context context; @Override @@ -69,8 +64,7 @@ public class KeymanSettingsLocalizeActivity extends AppCompatActivity { for(DisplayLanguages.DisplayLanguageType l: DisplayLanguages.DisplayLanguages) { HashMap hashMap = new HashMap<>(); hashMap.put(titleKey, l.getLanguageName()); - String icon = String.valueOf(R.drawable.ic_content_add); - hashMap.put(iconKey, icon); + hashMap.put(iconKey, noIcon); localizeOptionList.add(hashMap); } @@ -78,33 +72,12 @@ public class KeymanSettingsLocalizeActivity extends AppCompatActivity { int[] to = new int[]{com.tavultesoft.kmea.R.id.text1, com.tavultesoft.kmea.R.id.text2, com.tavultesoft.kmea.R.id.image1}; ListAdapter adapter = new SimpleAdapter(context, localizeOptionList, com.tavultesoft.kmea.R.layout.list_row_layout2, from, to) { - /* - @Override - public boolean isEnabled(int position) { - HashMap hashMap = localizeOptionList.get(position); - String itemTitle = MapCompat.getOrDefault(hashMap, titleKey, ""); - String icon = MapCompat.getOrDefault(hashMap, iconKey, noIcon); - if (itemTitle.equals(getString(R.string.install_from_other_device))) { - // Scan QR code not implemented yet - return false; - } else if (itemTitle.equals(getString(R.string.add_languages_to_installed_keyboard))) { - if (KeyboardController.getInstance().getInstalledPackagesList() == null) { - // Disable if no keyboard packages installed - return false; - } - } - - return super.isEnabled(position); - } - */ }; listView.setAdapter(adapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, View view, int position, long id) { - HashMap hashMap = (HashMap) parent.getItemAtPosition(position); - // Store the BCP-47 language tag in shared preference if (position >= 0 && position < DisplayLanguages.DisplayLanguages.length) { @@ -115,7 +88,11 @@ public class KeymanSettingsLocalizeActivity extends AppCompatActivity { SharedPreferences.Editor editor = prefs.edit(); editor.putString(DisplayLanguages.displayLanguageKey, languageTag); editor.commit(); - finish(); + + // Restart the app to use selected locale + Intent intent = new Intent(context, MainActivity.class); + intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); + startActivity(intent); } } }); diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/BaseActivity.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/BaseActivity.java index 0b63c835a0..fdd8ed2de1 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/BaseActivity.java +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/BaseActivity.java @@ -7,6 +7,8 @@ package com.tavultesoft.kmea; import android.content.Context; import android.content.ContextWrapper; import android.content.SharedPreferences; +import android.os.Build; +import android.os.LocaleList; import androidx.appcompat.app.AppCompatActivity; import androidx.preference.PreferenceManager; @@ -23,13 +25,17 @@ public class BaseActivity extends AppCompatActivity { // Using PreferenceManager because this is before onCreate() SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(newBase); String languageTag = prefs.getString(DisplayLanguages.displayLanguageKey, DisplayLanguages.unspecifiedLocale); + Locale localeToSwitchTo; if (languageTag == null || languageTag.equals(DisplayLanguages.unspecifiedLocale)) { - // Use the default locale - super.attachBaseContext(newBase); - return; + // If display language not specified, use the default locale + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { + super.attachBaseContext(newBase); + return; + } + localeToSwitchTo = LocaleList.getDefault().get(0); + } else { + localeToSwitchTo = Locale.forLanguageTag(languageTag); } - - Locale localeToSwitchTo = Locale.forLanguageTag(languageTag); ContextWrapper localeUpdatedContext = ContextUtils.updateLocale(newBase, localeToSwitchTo); super.attachBaseContext(localeUpdatedContext); } diff --git a/resources/build/l10n/README.md b/resources/build/l10n/README.md index 25c5da1d44..318e6815e3 100644 --- a/resources/build/l10n/README.md +++ b/resources/build/l10n/README.md @@ -86,6 +86,12 @@ To upload source files to Crowdin: crowdin upload sources ``` +### Updating DisplayLanguages.java in Keyman Engine for Android +In Keyman for Android, the settings menu for changing display languages is maintained in +android/KMEA/app/src/main/java/com/tavultesoft/kmea/DisplayLangugages.java + +For the BCP-47 language tags to use in that file, don't include script names since the Android locales only handle language ID and region. + ## Tip Microsoft offers a website that allows to check how terms used in Windows are translated From 5d929f1c2abe5978a7592d74d0ae47635ec52283 Mon Sep 17 00:00:00 2001 From: Darcy Wong Date: Wed, 20 Jan 2021 09:27:46 +0700 Subject: [PATCH 8/9] chore(android/app): Use list_row_layout1 to center text --- .../tavultesoft/kmapro/KeymanSettingsLocalizeActivity.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsLocalizeActivity.java b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsLocalizeActivity.java index 2726de23e9..fae8c6f463 100644 --- a/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsLocalizeActivity.java +++ b/android/KMAPro/kMAPro/src/main/java/com/tavultesoft/kmapro/KeymanSettingsLocalizeActivity.java @@ -69,9 +69,9 @@ public class KeymanSettingsLocalizeActivity extends AppCompatActivity { } String[] from = new String[]{titleKey, subtitleKey, iconKey}; - int[] to = new int[]{com.tavultesoft.kmea.R.id.text1, com.tavultesoft.kmea.R.id.text2, com.tavultesoft.kmea.R.id.image1}; + int[] to = new int[]{com.tavultesoft.kmea.R.id.text1, com.tavultesoft.kmea.R.id.image1}; - ListAdapter adapter = new SimpleAdapter(context, localizeOptionList, com.tavultesoft.kmea.R.layout.list_row_layout2, from, to) { + ListAdapter adapter = new SimpleAdapter(context, localizeOptionList, com.tavultesoft.kmea.R.layout.list_row_layout1, from, to) { }; listView.setAdapter(adapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { From 3f188c9b7ac08c25bdde9892f20a3f8a3a7e6635 Mon Sep 17 00:00:00 2001 From: Darcy Wong Date: Wed, 20 Jan 2021 09:28:15 +0700 Subject: [PATCH 9/9] chore(android/engine): Add German locale --- .../app/src/main/java/com/tavultesoft/kmea/DisplayLanguages.java | 1 + 1 file changed, 1 insertion(+) diff --git a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/DisplayLanguages.java b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/DisplayLanguages.java index 112c3ee5d5..7ffc3e511d 100644 --- a/android/KMEA/app/src/main/java/com/tavultesoft/kmea/DisplayLanguages.java +++ b/android/KMEA/app/src/main/java/com/tavultesoft/kmea/DisplayLanguages.java @@ -32,6 +32,7 @@ public class DisplayLanguages { public static final DisplayLanguageType[] DisplayLanguages = { new DisplayLanguageType(unspecifiedLocale, "Default Locale"), + new DisplayLanguageType("de-DE", "German"), new DisplayLanguageType("km-KH", "Khmer"), new DisplayLanguageType("ann", "Obolo") };