Android获取指定语言字符串

由于近期应用加强了对多语言的适配,所以现在应用内有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”);

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值