Android Localization from resources - android

I am currently trying to localize my android app and i have setup everything but it keeps of loading the same string resource whenever i try to change the language.
I have the below string resources
values
values-am
values-om
SharedPreferences sharedPreferences = getSharedPreferences("MY_SHARED_PREF", MODE_PRIVATE);
String languageLocale = sharedPreferences.getString("SAVED_LANGUAGE_LOCALE", "am");
Log.d(TAG,languageLocale);
String languageToLoad = languageLocale; // your language
Locale locale = new Locale(languageToLoad);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config,
getBaseContext().getResources().getDisplayMetrics());
I am also using the code below for selecting the language in a different activity
RadioGroup.OnCheckedChangeListener radioGroupOnCheckedChangeListener =
new RadioGroup.OnCheckedChangeListener(){
#Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
RadioButton checkedRadioButton = (RadioButton)mRadioGroup.findViewById(checkedId);
int checkedIndex = mRadioGroup.indexOfChild(checkedRadioButton);
//AppController languageSetting = (AppController)getApplication();
SavePreferences(KEY_SAVED_RADIO_BUTTON_INDEX, checkedIndex);
mLanguageId = checkedIndex + 1;
languageSetting.setLanguageId(mLanguageId);
switch (mLanguageId){
case 1:
SavePreferencesLocale(KEY_SAVED_LANGUAGE_LOCALE,"en");
mTest = "en";
break;
case 2:
SavePreferencesLocale(KEY_SAVED_LANGUAGE_LOCALE,"am");
mTest = "am";
break;
case 3:
SavePreferencesLocale(KEY_SAVED_LANGUAGE_LOCALE,"om");
mTest = "om";
break;
}
}};
Now the problem is whenever the application started for the first time it loads the correct string resource but when I change the language it keeps the same string resource. that means eg. if the app starts with the values-am string resource when i change it to values-om i still see the values-am strings despite the locale is assigned with the correct value ("om")

Here is something:
String languageLocale = sharedPreferences.getString("SAVED_LANGUAGE_LOCALE", "am");
by **
sharedPreferences.getString(""SAVED_LANGUAGE_LOCALE", "am");
** you dont need string "am". This "am" you need only by .putString()!
Should look like
String languageLocale = sharedPreferences.getString("KEY_SAVED_LANGUAGE_LOCALE");

You need to call the below code on every language selection in onCheckedChanged().
Locale locale = new Locale("Selected language code comes here");
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
After setting the Locale, use recreate() to restart the activity.

Intent Refresh and call
Locale locale = new Locale("ar");
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale; getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
this.setContentView(R.layout.activity_main_category_page);

Related

font styles are not Changing neither numbers in android

I'm getting stuck in this for two days i hope i find a solution..
I'm trying to localize my app (Arabic, and English)
the localization mechanism is working fine, the words, layout directions are working well,
However there are two things are not being localized the first one is numbers.
numbers are not being localized to arabic.
the second one is Font style font style are not being localized neither.
BUT it change the font style and number to arabic, only if i reinstalled the app using my USB and the configuration was in Arabic before the installing. here is my code
public static void changeLocale(Activity context, Bundle... bundles) {
MedfastSharedPreferencesHelper sharakehSharedPreference = new MedfastSharedPreferencesHelper(context);
String lang = sharakehSharedPreference.getKey("locale");
Locale locale = null;
if (null == lang) {
locale = new Locale(Resources.getSystem().getConfiguration().locale.getLanguage());
lang = locale.getDisplayLanguage();
if (locale.getDisplayLanguage().equalsIgnoreCase("English")) {
locale = new Locale("ar");
lang = "ar";
} else {
locale = new Locale("en");
lang = "en";
}
} else if (lang.equalsIgnoreCase("ar")) {
lang = "en";
locale = new Locale("en");
} else if (lang.equalsIgnoreCase("en")) {
lang = "ar";
locale = new Locale("ar");
}
sharakehSharedPreference.setKey("locale", lang);
Resources resources = context.getResources();
DisplayMetrics displayMetrics = resources.getDisplayMetrics();
Locale.setDefault(locale);
Configuration configuration = resources.getConfiguration();
configuration.setLocale(locale);
configuration.locale = locale;
resources.updateConfiguration(configuration, displayMetrics);
Intent intent = new Intent(context, ((Activity) context).getClass());
if (null != bundles && bundles.length > 0 && null != bundles[0])
intent.putExtras(bundles[0]);
context.startActivity(intent);
context.finish();
}
After researching, android does not support font as resource, so i had do create 6 classes in order to customize my fonts and check weather if the locale is Arabic or english, and depending on the locale i load the font, unlike drawable in android
Hey as Basil Battikhi said, the font does not apply to numbers, But there are some solutions:
1: Create your own custom textView to be able to change things you want.
2: Define this in strings.xml
<string name="number">%1d</string>
and set number to your textView like this:
textCoin.text = getString(R.string.number, it)
3: You can use this code for formating your textView for numbers:
public static String convertEngNumToFa(String number) {
if (AppConstants.FA_LOCALE == DataManager.Language.fa) {
StringBuilder res = new StringBuilder();
try {
for (char _ch : number.toCharArray()) {
if ((int) _ch > 47 && (int) _ch < 58) {
int x = (int) _ch + 1632 - 48;
char ch = (char) (x);
res.append(Character.toString(ch));
} else {
res.append(Character.toString(_ch));
}
}
} catch (Exception e) {
return res.toString();
}
return res.toString();
} else return number;
}

How to get String from Localization Strings in Android

strings.xml
<string name="funny">Funny</string>
<string name="love">Love</string>
<string name="happy">Happy</string>
<string name="sad">Sad</string>
<string name="film">Film & TV</string>
<string name="accident">Accident</string>
strings.xml (pt)
<string name="funny">Engraçado</string>
<string name="love">Ame</string>
<string name="happy">Feliz</string>
<string name="sad">Triste</string>
<string name="film">Filme e TV</string>
<string name="accident">Acidente</string>
But, when I Use StringArray, then I want only from English String.xml
<string-array name="categories">
<item>#string/funny</item>
<item>#string/love</item>
<item>#string/happy</item>
<item>#string/sad</item>
<item>#string/film</item>
<item>#string/accident</item>
</string-array>
You can do that programatically :
import android.app.Activity;
import android.content.res.Configuration;
import android.os.Bundle;
public class Main extends Activity {
/** Called when the activity is first created. */
#Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String languageToLoad = "fa"; // your language
Locale locale = new Locale(languageToLoad);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config,
getBaseContext().getResources().getDisplayMetrics());
this.setContentView(R.layout.main);
}
}
for more visit link
Try this code for english .
Locale myLocale = new Locale("en");
Resources res = getResources();
DisplayMetrics dm = res.getDisplayMetrics();
Configuration conf = res.getConfiguration();
conf.locale = myLocale;
res.updateConfiguration(conf, dm);
get String Array:
String[] categories= getResources().getStringArray(R.array.categories);

translate string by value in locale

Does android API support translating string resources by value?
I know that I can create multiple XML files for different locale. My problem is that I am getting the values from the server in a "default locale" so, I can't use getString(int).
I want something like getTranslation("myValueInDefaultLocale", "target locale")
There is no efficient way to do what you are asking, but to modify the server. If you can't change server, then you can do this:
Save current locale
Switch to default locale programmatically
Iterate through all string resources looking for specific string
Save ID of the string
Switch back to saved locale
Get translated value of string by ID in desired locale
But this will work really slow. Don't say I didn't warn you.
Here is the code sample:
String translateFrom = "server reply";
Resources res = getResources();
Configuration conf = res.getConfiguration();
Locale savedLocale = conf.locale;
conf.locale = defaultLocale; // set to default locale here
res.updateConfiguration(conf, null);
// iterate through all string resources in default locale
int idTranslateTo = 0;
Field fields[] = R.string.class.getFields();
for (Field field : fields) {
int id = getResources().getIdentifier(field.getName(), "string", this.getPackageName()));
if (translateFrom.equals(res.getString(id)) {
idTranslateTo = id;
break;
}
}
// restore original locale
conf.locale = savedLocale;
res.updateConfiguration(conf, null);
// retrieve translated string from saved locale
if (idTranslateTo != 0) {
String translateTo = res.getString(idTranslateTo);
}

Get ONLY the list of locales that are shipped with my Android applicaiton

I know there are several ways that I can get the list of all of the Locales supported by the device. Has anyone been able to get the list of locales that you have included in your app?
Using the following code I know I can get the list the device supports:
String[] languages = getAssets().getLocales();
or
String[] languages = Resources.getSystem().getAssets().getLocales();
But I want the list that is shipped w/ my app so i can compare it against the list that the phone supports to create a subset list depending on phone support and app support.
Obviously I could ship w/ a file that has the list of my supported languages, but this is not a route I want to take.
public ArrayList<Locale> getTranslatedLocales(int compairsonStringResourceID, boolean onlyThoseSupportedByThePhone) {
Locale english = Locale.ENGLISH;
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
Resources resources = getResources();
Configuration configuration = resources.getConfiguration();
Locale assignedLanguage = configuration.locale;
ArrayList<Locale> loc = new ArrayList<Locale>();
ArrayList<String> processed = new ArrayList<String>();
String englishConst = english.getLanguage();
if(onlyThoseSupportedByThePhone) {
String[] locales = resources.getAssets().getLocales();
for (String string : locales) {
if(!string.startsWith(englishConst) && !processed.contains(string)) {
processed.add(string);
loc.add(new Locale(string));
}
}
} else {
Locale[] locales = Locale.getAvailableLocales();
for (Locale locale : locales) {
String language = locale.getLanguage();
if(!locale.getLanguage().equals(englishConst) && !processed.contains(language)) {
processed.add(language);
loc.add(locale);
}
}
}
configuration.locale = english;
Resources res = new Resources(getAssets(), metrics, configuration);
String compareString = res.getString(compairsonStringResourceID);
ArrayList<Locale> supported = new ArrayList<Locale>();
supported.add(english);
for (int i = 0; i < loc.size(); i++) {
configuration.locale = loc.get(i);
res = new Resources(getAssets(), metrics, configuration);
Resources res2 = new Resources(getAssets(), metrics, configuration);
String s2 = res2.getString(compairsonStringResourceID);
if(!compareString.equals(s2)){
supported.add(configuration.locale);
}
}
configuration.locale = assignedLanguage;
setLocale(assignedLanguage);
return supported;
}

android: programmatically localize a dynamic string

I have a computed String stored in local variable.
There is no way I can know the string on before hand, however I know for sure in the end it will be one of the Strings whose translations to different languages are inside the string.xml files.
How can I translate such a dynamic string to the current locale?
Although this will take quite long, you could iterate through all the strings, check whether they match, and return the localized version if they do:
public String translatedString(String s)
//Set the locale to en-us
Resources standardResources = context.getResources();
AssetManager assets = standardResources.getAssets();
DisplayMetrics metrics = standardResources.getDisplayMetrics();
Configuration config = new Configuration(standardResources.getConfiguration());
config.locale = Locale.US;
Resources defaultResources = new Resources(assets, metrics, config);
//Iterate over string res
Field fields[] = R.string.class.getFields();
for (Field field : fields) {
String value = defaultResources.getString(defaultResources.getIdentifier(field.getName(), "string", this.getPackageName())));
if (value.equals(s)){
return getResources().getString(getResources().getIdentifier(field.getName(), "string", this.getPackageName())));
}
}
return null;
}

Categories

Resources