如何判断Android应用是使用本地化strings.xml文件还是默认文件?
如何获取应用实际使用的资源语言(而非系统/设备语言)?
首先得搞明白你遇到的这个问题的本质:Android的Locale机制是优先匹配用户设备的偏好语言资源,没有的话就回退到默认资源,但系统提供的那些Locale相关方法(比如Locale.getDefault()、getResources().getConfiguration().locale)返回的始终是用户设备设置的偏好语言,不会因为你的应用没有对应的资源就自动改成默认资源的“语言”——毕竟默认的strings.xml本身是没有绑定任何特定语言的,它只是Android在找不到匹配资源时的兜底选项,系统不会假设它是德语或者其他任何语言。
那怎么才能知道应用当前是不是在使用默认资源,而没有匹配到用户的偏好语言呢?这里给你两个实用的方案:
方案1:对比默认资源与当前资源的内容
找一个你确定在本地化资源中会有不同内容的字符串(比如app_name或者某个固定提示语),对比默认资源中的内容和当前应用获取到的内容:
public Boolean isUsingDefaultResources(Context context) { // 获取默认资源中的目标字符串 String defaultString = context.getResources().getString(R.string.app_name); // 获取当前应用使用的字符串 String currentString = context.getResources().getString(R.string.app_name); // 如果两者相同,说明当前用的是默认资源(没有匹配到用户偏好的语言资源) return defaultString.equals(currentString); }
如果这个方法返回true,就说明Android回退到了默认资源,你可以根据需求返回null或者标记为“默认语言”。
方案2:检查指定Locale是否有对应资源
如果你想明确判断用户的偏好Locale是否有对应的资源,可以创建一个辅助方法来验证:
private boolean hasMatchingLocaleResources(Context context, Locale targetLocale) { // 创建一个使用目标Locale的Configuration Configuration tempConfig = new Configuration(context.getResources().getConfiguration()); tempConfig.setLocale(targetLocale); // 基于这个Configuration创建新的Resources对象 Resources tempResources = context.createConfigurationContext(tempConfig).getResources(); // 对比默认字符串和目标Locale下的字符串 String defaultString = context.getResources().getString(R.string.app_name); String targetString = tempResources.getString(R.string.app_name); // 不同则说明有对应资源,相同则说明用的是默认兜底 return !defaultString.equals(targetString); }
使用的时候,先获取用户的偏好Locale:
Locale userPreferredLocale = context.getResources().getConfiguration().getLocales().get(0); boolean hasMatchingResources = hasMatchingLocaleResources(context, userPreferredLocale); if (!hasMatchingResources) { // 没有匹配到,当前用的是默认资源,返回null或者你需要的标记 }
需要注意的是,这两种方法都依赖于你有一个在本地化资源中会被修改的字符串——如果某个字符串在所有本地化资源中都和默认值一样,那对比就失效了,所以最好选一个你确定每个语言版本都会修改的字符串。
内容的提问来源于stack exchange,提问作者Hector Ricardo
相关产品推荐
相关产品推荐

