java - Android getting wrong localization strings -
i'm writing app want add multiple language support. have english , bulgarian, when start activities has default values instead of localized. i'm setting manually location via overriding attachbasecontext. when change language english, again bulgarian (without leaving activity, recreating it) working properly. when start app (in mainactivity) working properly. strings in string.xml under values , values-bg folders.
mycontextwrapper
import android.annotation.targetapi; import android.content.context; import android.content.contextwrapper; import android.content.res.configuration; import android.os.build; import java.util.locale; public class mycontextwrapper extends contextwrapper { public mycontextwrapper(context base) { super(base); } public static contextwrapper wrap(context context, string language) { configuration config = context.getresources().getconfiguration(); locale syslocale; if (build.version.sdk_int >= build.version_codes.n) { syslocale = getsystemlocale(config); } else { syslocale = getsystemlocalelegacy(config); } if (!language.equals("") && !syslocale.getlanguage().equals(language)) { locale locale = new locale(language); locale.setdefault(locale); if (build.version.sdk_int >= build.version_codes.n) { setsystemlocale(config, locale); } else { setsystemlocalelegacy(config, locale); } context = context.createconfigurationcontext(config); } return new mycontextwrapper(context); } @suppresswarnings("deprecation") public static locale getsystemlocalelegacy(configuration config){ return config.locale; } @targetapi(build.version_codes.n) public static locale getsystemlocale(configuration config){ return config.getlocales().get(0); } @suppresswarnings("deprecation") public static void setsystemlocalelegacy(configuration config, locale locale){ config.locale = locale; } @targetapi(build.version_codes.n) public static void setsystemlocale(configuration config, locale locale){ config.setlocale(locale); } }
classes.basics
import android.content.context; import android.content.contextwrapper; import android.content.sharedpreferences; import android.preference.preferencemanager; import <appname>.r; public class basics { // used in activity creation (auto) language public static contextwrapper getbasecontext(context newbase){ return mycontextwrapper.wrap(newbase, getlanguage(newbase)); } // shared preferences public static sharedpreferences sharedprefs(context context){ return preferencemanager.getdefaultsharedpreferences(context); } public static string getlanguage(context context){ return sharedprefs(context).getstring( context.getstring(r.string.pref_language), context.getstring(r.string.default_language)); } }
part of mainactivity
@override protected void attachbasecontext(context newbase) { super.attachbasecontext(basics.getbasecontext(newbase)); } @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); ..... }
part of languageselectactivity
@override protected void attachbasecontext(context newbase) { super.attachbasecontext(basics.getbasecontext(newbase)); } @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_language_select); log.e("oncreate info", "" + "\n" + locale.getdefault().getlanguage() + "\n" + locale.getdefault().getiso3language() + "\n" + locale.getdefault().getcountry() + "\n" + locale.getdefault().getiso3country() + "\n" + locale.getdefault().getdisplaycountry() + "\n" + locale.getdefault().getdisplayname() + "\n" + locale.getdefault().getdisplaylanguage() + "\n" + locale.getdefault().tostring() ); ...... }
the result of log.e is:
oncreate info: bg bul български български bg
strings pref_language , default_language not translated , in files different string.xml
Comments
Post a Comment