get the application's resources languages

后端 未结 11 1117
庸人自扰
庸人自扰 2020-12-02 23:30

Is it possible, at runtime, to know which resources languages are embedded in my app?

i.e the presence of this folders:

values-en
values-de
values-fr         


        
11条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-03 00:17

    It's complicated because even if you have a folder named values-de it doesn't mean you have any resources there. If you have string.xml in values-de it doesn't mean you have string value there.

    values:

    
        LocTest
        Hello world!
        Settings
    
    

    values-de:

    
        Hallo Welt!
    
    

    You can test if a resource for a specific locale is different than the default:

    DisplayMetrics metrics = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(metrics);
    Resources r = getResources();
    Configuration c = r.getConfiguration();
    String[] loc = r.getAssets().getLocales();
    for (int i = 0; i < loc.length; i++) {
        Log.d("LOCALE", i + ": " + loc[i]);
    
        c.locale = new Locale(loc[i]);
        Resources res = new Resources(getAssets(), metrics, c);
        String s1 = res.getString(R.string.hello_world);
        c.locale = new Locale("");
        Resources res2 = new Resources(getAssets(), metrics, c);
        String s2 = res2.getString(R.string.hello_world);
    
        if(!s1.equals(s2)){
            Log.d("DIFFERENT LOCALE", i + ": "+ s1+" "+s2 +" "+ loc[i]);
        }
    }
    

    It has one fault - you can check one value whether it has translation.

    The dirty code above will print something like:

    LOCALE(5667): 51: en_NZ LOCALE(5667): 52: uk_UA LOCALE(5667): 53: nl_BE LOCALE(5667): 54: de_DE DIFFERENT LOCALE(5667): 54: Hallo Welt! Hello world! de_DE LOCALE(5667): 55: ka_GE LOCALE(5667): 56: sv_SE LOCALE(5667): 57: bg_BG LOCALE(5667): 58: de_CH DIFFERENT LOCALE(5667): 58: Hallo Welt! Hello world! de_CH LOCALE(5667): 59: fr_CH LOCALE(5667): 60: fi_FI

提交回复
热议问题