由于近期应用加强了对多语言的适配,所以现在应用内有n种语言(10多种),然后统计的时候产品说只要上传英文的字符串.所以对于应用内的数据,在不修改语言的前提下,要将上传的字符串统一为英语.
废话不多说,直接附上代码
/**
* Created by panruijie on 2017/12/26.
* Email : zquprj@gmail.com
*/
public class LanguageUtil {
public static final String TAG = "LanguageUtil";
private static final String APPNAME = "you app packagename";
public static final String ERROR_LABEL = "";
private static final String DEFAULT_COUNTRY = "US";
private static final String DEFAULT_LANGUAGE = "en";
public static String getStringByLocale(Context context, int stringId, String language, String country) {
/*for (Locale locale : getAvailableLocales()) {
String lang = locale.getLanguage();
String coun = getCountryPrivate(locale);
String localeStr = country.equals("") ? language : (language + "_" + country);
Loger.w("ruijie", "language = " + lang + ", country = " + coun + "," +
"localeStr = " + localeStr);
}*/
Resources resources = getApplicationResource(context.getApplicationContext().getPackageManager(),
APPNAME, new Locale(language, country));
if (resources == null) {
return ERROR_LABEL;
} else {
try {
return resources.getString(stringId);
} catch (Exception e) {
return ERROR_LABEL;
}
}
}
public static String getStringToEnglish(Context context, int stringId) {
return getStringByLocale(context, stringId, DEFAULT_LANGUAGE, DEFAULT_COUNTRY);
}
private static Resources getApplicationResource(PackageManager pm, String pkgName, Locale l) {
Resources resourceForApplication = null;
try {
resourceForApplication = pm.getResourcesForApplication(pkgName);
updateResource(resourceForApplication, l);
} catch (PackageManager.NameNotFoundException e) {
}
return resourceForApplication;
}
private static void updateResource(Resources resource, Locale l) {
Configuration config = resource.getConfiguration();
config.locale = l;
resource.updateConfiguration(config, null);
}
}
思路在于通过应用名找到对于的应用的Resources,在不修改resources的前提下,不影响当前应用的语言,获取其资源.同理,只要知道其他应用的包名,可以获取其所有的字符串.
后来在测试种,给一个bean设置了一个字符串id,如R.string.appname:
Bean bean = new Bean();
bean.setId(R.string.appname);
这样进行设置之后,会发现错误.会抛出ResourceNotFoundException,这是因为对于字符串,或者图片drawable之类进行id获取,需要通过以下方法进行获取:
int stringId = context.getResources().getIdentifier(resourceId, "srting", "your package name");
int drawableId = context.getResources().getIdentifier(resourceId, "drawable", "your package name");
这样,经过这样的方法,我们可以轻松的拿到字符串了.用法如下:
String appName = LanguageUtil.getStringToEnglish(context, stringId);
如果要获取指定国家和语言的字符串,同理,加入国家和语言即可:
String appName = LanguageUtil.getStringByLocale(context, stringId, “en”, “US”);