diff --git a/app/src/main/java/com/m2049r/xmrwallet/LoginActivity.java b/app/src/main/java/com/m2049r/xmrwallet/LoginActivity.java index eeeb18e..b67224b 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/LoginActivity.java +++ b/app/src/main/java/com/m2049r/xmrwallet/LoginActivity.java @@ -52,6 +52,7 @@ import com.m2049r.xmrwallet.model.WalletManager; import com.m2049r.xmrwallet.service.WalletService; import com.m2049r.xmrwallet.util.Helper; import com.m2049r.xmrwallet.util.KeyStoreHelper; +import com.m2049r.xmrwallet.util.LocaleHelper; import com.m2049r.xmrwallet.util.MoneroThreadPoolExecutor; import com.m2049r.xmrwallet.widget.Toolbar; @@ -62,7 +63,12 @@ import java.io.IOException; import java.net.Socket; import java.net.SocketAddress; import java.nio.channels.FileChannel; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Comparator; import java.util.Date; +import java.util.Locale; import timber.log.Timber; @@ -959,6 +965,48 @@ public class LoginActivity extends SecureActivity } } + public void onChangeLocale() { + final ArrayList translatedLocales = LocaleHelper.getAvailableLocales(LoginActivity.this); + String[] localeDisplayName = new String[1 + translatedLocales.size()]; + + Collections.sort(translatedLocales, new Comparator() { + @Override + public int compare(Locale locale1, Locale locale2) { + String localeString1 = LocaleHelper.getLocaleString(LoginActivity.this, locale1, LocaleHelper.COMPARED_RESOURCE_ID); + String localeString2 = LocaleHelper.getLocaleString(LoginActivity.this, locale2, LocaleHelper.COMPARED_RESOURCE_ID); + return localeString1.compareTo(localeString2); + } + }); + + localeDisplayName[0] = getString(R.string.language_system_default); + for (int i = 1; i < localeDisplayName.length; i++) { + Locale locale = translatedLocales.get(i - 1); + localeDisplayName[i] = LocaleHelper.getLocaleString(LoginActivity.this, locale, LocaleHelper.COMPARED_RESOURCE_ID); + } + + int currentLocaleIndex = 0; + String currentLocaleName = LocaleHelper.getLocale(LoginActivity.this); + if (!currentLocaleName.isEmpty()) { + Locale currentLocale = Locale.forLanguageTag(currentLocaleName); + String currentLocalizedString = LocaleHelper.getLocaleString(LoginActivity.this, currentLocale, LocaleHelper.COMPARED_RESOURCE_ID); + currentLocaleIndex = Arrays.asList(localeDisplayName).indexOf(currentLocalizedString); + } + + AlertDialog.Builder builder = new AlertDialog.Builder(LoginActivity.this); + builder.setTitle(getString(R.string.menu_language)); + builder.setSingleChoiceItems(localeDisplayName, currentLocaleIndex, new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int i) { + dialog.dismiss(); + + LocaleHelper.setLocale(LoginActivity.this, + (i == 0) ? "" : translatedLocales.get(i - 1).toLanguageTag()); + startActivity(getIntent().addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK)); + } + }); + builder.show(); + } + @Override public void onBackPressed() { Fragment f = getSupportFragmentManager().findFragmentById(R.id.fragment_container); @@ -1007,6 +1055,9 @@ public class LoginActivity extends SecureActivity case R.id.action_privacy_policy: PrivacyFragment.display(getSupportFragmentManager()); return true; + case R.id.action_language: + onChangeLocale(); + return true; case R.id.action_stagenet: try { LoginFragment loginFragment = (LoginFragment) diff --git a/app/src/main/java/com/m2049r/xmrwallet/SecureActivity.java b/app/src/main/java/com/m2049r/xmrwallet/SecureActivity.java index ee74998..3672895 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/SecureActivity.java +++ b/app/src/main/java/com/m2049r/xmrwallet/SecureActivity.java @@ -16,13 +16,12 @@ package com.m2049r.xmrwallet; +import android.content.Context; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; -import com.m2049r.xmrwallet.util.Helper; - -import java.io.File; +import com.m2049r.xmrwallet.util.LocaleHelper; import static android.view.WindowManager.LayoutParams; @@ -36,4 +35,9 @@ public abstract class SecureActivity extends AppCompatActivity { getWindow().setFlags(LayoutParams.FLAG_SECURE, LayoutParams.FLAG_SECURE); } } + + @Override + protected void attachBaseContext(Context context) { + super.attachBaseContext(LocaleHelper.setLocale(context, LocaleHelper.getLocale(context))); + } } diff --git a/app/src/main/java/com/m2049r/xmrwallet/XmrWalletApplication.java b/app/src/main/java/com/m2049r/xmrwallet/XmrWalletApplication.java index f6fecc5..d7178b8 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/XmrWalletApplication.java +++ b/app/src/main/java/com/m2049r/xmrwallet/XmrWalletApplication.java @@ -18,8 +18,10 @@ package com.m2049r.xmrwallet; import android.app.Application; +import android.content.Context; +import android.content.res.Configuration; -import com.m2049r.xmrwallet.util.Helper; +import com.m2049r.xmrwallet.util.LocaleHelper; import timber.log.Timber; @@ -27,9 +29,21 @@ public class XmrWalletApplication extends Application { @Override public void onCreate() { super.onCreate(); - + if (BuildConfig.DEBUG) { Timber.plant(new Timber.DebugTree()); } } + + @Override + protected void attachBaseContext(Context context) { + super.attachBaseContext(LocaleHelper.setLocale(context, LocaleHelper.getLocale(context))); + } + + @Override + public void onConfigurationChanged(Configuration configuration) { + super.onConfigurationChanged(configuration); + LocaleHelper.updateSystemDefaultLocale(configuration.locale); + LocaleHelper.setLocale(XmrWalletApplication.this, LocaleHelper.getLocale(XmrWalletApplication.this)); + } } diff --git a/app/src/main/java/com/m2049r/xmrwallet/service/WalletService.java b/app/src/main/java/com/m2049r/xmrwallet/service/WalletService.java index 677fc5c..adc08c6 100644 --- a/app/src/main/java/com/m2049r/xmrwallet/service/WalletService.java +++ b/app/src/main/java/com/m2049r/xmrwallet/service/WalletService.java @@ -19,6 +19,7 @@ package com.m2049r.xmrwallet.service; import android.app.Notification; import android.app.PendingIntent; import android.app.Service; +import android.content.Context; import android.content.Intent; import android.os.Binder; import android.os.Bundle; @@ -36,6 +37,7 @@ import com.m2049r.xmrwallet.model.Wallet; import com.m2049r.xmrwallet.model.WalletListener; import com.m2049r.xmrwallet.model.WalletManager; import com.m2049r.xmrwallet.util.Helper; +import com.m2049r.xmrwallet.util.LocaleHelper; import timber.log.Timber; @@ -418,6 +420,11 @@ public class WalletService extends Service { } } + @Override + protected void attachBaseContext(Context context) { + super.attachBaseContext(LocaleHelper.setLocale(context, LocaleHelper.getLocale(context))); + } + public class WalletServiceBinder extends Binder { public WalletService getService() { return WalletService.this; diff --git a/app/src/main/java/com/m2049r/xmrwallet/util/LocaleHelper.java b/app/src/main/java/com/m2049r/xmrwallet/util/LocaleHelper.java new file mode 100644 index 0000000..bd02b9b --- /dev/null +++ b/app/src/main/java/com/m2049r/xmrwallet/util/LocaleHelper.java @@ -0,0 +1,74 @@ +package com.m2049r.xmrwallet.util; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.Configuration; +import android.preference.PreferenceManager; + +import com.m2049r.xmrwallet.R; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.Locale; + +public class LocaleHelper { + public static final int COMPARED_RESOURCE_ID = R.string.language; + + private static final String PREFERRED_LOCALE_KEY = "preferred_locale"; + private static Locale SYSTEM_DEFAULT_LOCALE = Locale.getDefault(); + + public static ArrayList getAvailableLocales(Context context) { + ArrayList locales = new ArrayList<>(); + HashSet localizedStrings = new HashSet<>(); + + for (String localeName : context.getAssets().getLocales()) { + Locale locale = Locale.forLanguageTag(localeName); + String localizedString = getLocaleString(context, locale, COMPARED_RESOURCE_ID); + + if (localizedStrings.add(localizedString)) { + locales.add(locale); + } + } + + return locales; + } + + public static String getLocale(Context context) { + return getPreferredLocale(context); + } + + public static Context setLocale(Context context, String locale) { + setPreferredLocale(context, locale); + + Locale newLocale = (locale.isEmpty()) ? SYSTEM_DEFAULT_LOCALE : Locale.forLanguageTag(locale); + Configuration configuration = context.getResources().getConfiguration(); + + Locale.setDefault(newLocale); + + configuration.setLocale(newLocale); + configuration.setLayoutDirection(newLocale); + + return context.createConfigurationContext(configuration); + } + + public static void updateSystemDefaultLocale(Locale locale) { + SYSTEM_DEFAULT_LOCALE = locale; + } + + public static String getLocaleString(Context context, Locale locale, int resId) { + Configuration configuration = context.getResources().getConfiguration(); + configuration.setLocale(locale); + return context.createConfigurationContext(configuration).getString(resId); + } + + private static String getPreferredLocale(Context context) { + return PreferenceManager.getDefaultSharedPreferences(context) + .getString(PREFERRED_LOCALE_KEY, ""); + } + + @SuppressLint("ApplySharedPref") + private static void setPreferredLocale(Context context, String locale) { + PreferenceManager.getDefaultSharedPreferences(context).edit() + .putString(PREFERRED_LOCALE_KEY, locale).commit(); + } +} diff --git a/app/src/main/res/menu/list_menu.xml b/app/src/main/res/menu/list_menu.xml index 83bdc79..2ae555c 100644 --- a/app/src/main/res/menu/list_menu.xml +++ b/app/src/main/res/menu/list_menu.xml @@ -10,21 +10,27 @@ app:showAsAction="never" /> + + diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 425f260..e9682e6 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -318,4 +318,8 @@ Versende ALLE(!) verfügbaren Gelder aus diesem Konto Subadresse #%1$d Öffentliche Subadresse #%1$d + + Deutsch + Language + Use System Language diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 7e6c64e..71f25bf 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -317,4 +317,8 @@ Send all confirmed funds in this account! Subaddress #%1$d Public Subaddress #%1$d + + Ελληνικά + Language + Use System Language diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 74546cf..95c90aa 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -303,4 +303,8 @@ Send all confirmed funds in this account! Subaddress #%1$d Public Subaddress #%1$d + + Español + Language + Use System Language diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index aae913a..23c446f 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -321,4 +321,8 @@ Send all confirmed funds in this account! Subaddress #%1$d Public Subaddress #%1$d + + Français + Language + Use System Language diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 1d7df5e..11409b6 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -319,4 +319,8 @@ Teljes megerősített egyenleg küldése! Alcím #%1$d Nyilvános alcím #%1$d + + Magyar + Language + Use System Language diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 13b3034..26ccc73 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -319,4 +319,8 @@ Manda tutti i fondi confermati in questo account! Subaddress #%1$d Subaddress pubblico #%1$d + + Italiano + Language + Use System Language diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index 4cc4a7c..1ebc969 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -317,4 +317,8 @@ Send all confirmed funds in this account! Subaddress #%1$d Public Subaddress #%1$d + + Norsk bokmål + Language + Use System Language diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 07d6fb7..8c34bed 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -321,4 +321,8 @@ Send all confirmed funds in this account! Subaddress #%1$d Public Subaddress #%1$d + + Português + Language + Use System Language diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 1816851..3367462 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -317,4 +317,8 @@ Send all confirmed funds in this account! Subaddress #%1$d Public Subaddress #%1$d + + Română + Language + Use System Language diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index f12d679..762a524 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -320,4 +320,8 @@ Отправить все средства на этот счет! Субадрес #%1$d Публичный субадрес #%1$d + + Русский + Language + Use System Language diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 4a5b094..c8483cc 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -302,4 +302,8 @@ Send all confirmed funds in this account! Subaddress #%1$d Public Subaddress #%1$d + + Svenska + Language + Use System Language diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 60f39a9..f68741b 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -315,4 +315,8 @@ 发送这个户口的所有已确认款项! 附属地址 #%1$d 附属公开地址 #%1$d + + 中文(中国) + 语言 + 使用系统语言 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index eb82ac1..a3eacb7 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -308,12 +308,16 @@ 從私鑰回復錢包 從25字種子碼回復錢包 - 開新戶口 - 戶口 - 已新增戶口 #%1$d - 戶口 # + 新增帳戶 + 帳戶 + 已新增帳戶 #%1$d + 帳戶 # - 發送這個戶口的所有已確認款項! - 附屬地址 #%1$d - 附屬公開地址 #%1$d + 發送這個帳戶的所有已確認款項! + 子地址 #%1$d + 公開子地址 #%1$d + + 中文(台灣) + 語言 + 使用系統語言 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 872b38a..a303b42 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -365,4 +365,8 @@ Send all confirmed funds in this account! Subaddress #%1$d Public Subaddress #%1$d + + English + Language + Use System Language