Извините за плохой английский.
Я пишу (или нахожу, копирую) некоторые коды для изменения языка приложения. Это работает, когда я строю через Android Studio. Но после того, как я нажал на Google Play Store, коды не удалось!
Я зарегистрировал его полностью, и 95% уверены, что в моем коде нет ошибок.
Первая часть скопирована из stackoverflow.
package com.my.package;
import android.annotation.TargetApi;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Build;
import android.util.Log;
import java.util.Locale;
/**
* Created by devdeeds.com on 18/4/17.
* by Jayakrishnan P.M
*/
public class LocaleHelper {
private static final String DEFAULT_LANGUAGE = "en";
private static final String SELECTED_LANGUAGE = "Locale.Helper.Selected.Language";
public static String getLanguage(Context context) {
Log.i("lang", "getLanguage");
String lang = getPersistedData(context);
Log.i("lang", "getLanguage, lang = "+lang);
return lang;
}
public static Context setPrevLanguage(Context context) {
Log.i("lang", "setPrevLanguage");
String lang = getLanguage(context);
Log.i("lang", "setPrevLanguage, prev lang = "+lang);
return _setLang(context, lang);
}
public static Context setLanguage(Context context, String language) {
Log.i("lang", "setLanguage");
getPersistedData(context);
persist(context, language);
getPersistedData(context);
return _setLang(context, language);
}
private static Context _setLang(Context context, String lang) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return updateResources(context, lang);
}
return updateResourcesLegacy(context, lang);
}
private static String getPersistedData(Context context) {
Log.i("lang", "getPersistedData");
Log.i("lang", "getPersistedData, applic ID = "+BuildConfig.APPLICATION_ID);
SharedPreferences prefs = context.getSharedPreferences(BuildConfig.APPLICATION_ID, Activity.MODE_PRIVATE);
String lang = prefs.getString(SELECTED_LANGUAGE, DEFAULT_LANGUAGE);
Log.i("lang", "getPersistedData, lang = "+lang);
return lang;
}
private static void persist(Context context, String language) {
SharedPreferences prefs = context.getSharedPreferences(BuildConfig.APPLICATION_ID, Activity.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString(SELECTED_LANGUAGE, language);
editor.apply();
}
@TargetApi(Build.VERSION_CODES.N)
private static Context updateResources(Context context, String language) {
Resources resources = context.getResources();
Configuration activityConf = resources.getConfiguration();
Locale newLocale = new Locale(language);
activityConf.setLocale(newLocale);
resources.updateConfiguration(activityConf, resources.getDisplayMetrics());
Resources applicationRes = context.getApplicationContext().getResources();
Configuration applicationConf = applicationRes.getConfiguration();
applicationConf.setLocale(newLocale);
applicationRes.updateConfiguration(applicationConf, applicationRes.getDisplayMetrics());
return context.createConfigurationContext(activityConf);
}
@SuppressWarnings("deprecation")
private static Context updateResourcesLegacy(Context context, String language) {
Locale locale = new Locale(language);
Locale.setDefault(locale);
Resources resources = context.getResources();
Configuration configuration = resources.getConfiguration();
configuration.locale = locale;
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
return context;
}
}
Вторая часть - как я их использую.
//when changing app language based on previous setting
LocaleHelper.setPrevLanguage(StartActivity.this);
LocaleHelper.setPrevLanguage((HomeActivity)this);
//when setting app language through Setting/Language
String lang = "fil"; //its an app for fillipino
LocaleHelper.setLanguage(getContext(), lang);
при работе
LocaleHelper.setPrevLanguage(StartActivity.this);
, он корректно регистрируется как в режиме отладки (сборка через android studio), так и в версии play-store.
Но только версия отладки хорошо изменит версию приложения, а версия play-store - нет.
Кто-то тоже сталкивался с этим, те же самые коды делают разные работы в отладочной и игровой версии?