Obtenir les langues de ressources de l'application

Est-il possible, au moment de l'exécution, de savoir quelles ressources les langues sont intégrées dans mon application?

C'est-à-dire la présence de ce dossier:

  • GetOpenSourceSoftwareLicenseInfo renvoie null maintenant
  • Java REST API client pour Android
  • Comment configurer la barre de progression Android au centre de l'écran
  • Android quand exactement est onLocationChanged appelé
  • Désactiver le basculement entre les onglets
  • Les images listview Android disparaissent lors du défilement
  • values-en values-de values-fr ... 

    9 Solutions collect form web for “Obtenir les langues de ressources de l'application”

    AssetManager.getLocales () est en fait la façon de le faire. Cependant, à partir de l'API publique, tous les AssetManager que vous créez ont également les ressources de structure incluses dans son chemin de recherche … alors, lorsque vous appelez AssetManager.getLocales (), vous verrez également les paramètres régionaux qui font partie des ressources du framework. Il n'y a aucun moyen de contourner cela avec le SDK, désolé.

    C'est compliqué parce que même si vous avez un dossier nommé values-de cela ne signifie pas que vous avez des ressources là-bas. Si vous avez string.xml dans les values-de cela ne signifie pas que vous avez une valeur de chaîne là-bas.

    valeurs:

     <resources> <string name="app_name">LocTest</string> <string name="hello_world">Hello world!</string> <string name="menu_settings">Settings</string> </resources> 

    Valeurs-de:

     <resources> <string name="hello_world">Hallo Welt!</string> </resources> 

    Vous pouvez tester si une ressource pour une locale spécifique est différente de celle par défaut:

     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]); } } 

    Il a une faute – vous pouvez vérifier une valeur si elle a une traduction.

    Le code sale ci-dessus va imprimer quelque chose comme:

    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! Bonjour le monde! 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! Bonjour le monde! De_CH LOCALE (5667): 59: fr_CH LOCALE (5667): 60: fi_FI

    Ces langages fonctionnels dépendent réellement de Locales, donc vous devez obtenir des paramètres régionaux à partir d'un périphérique et vous pouvez obtenir quelle langue est affichée à partir de la localisation ..

     Locale myPhoneLocale = Locale.getDefault(); 

    Vous pouvez ensuite appeler getDisplayLanguage () pour savoir quelle langue est affichée.

    Référence: local

    Inspiré par les réponses ci-dessus, j'ai créé une méthode simple pour obtenir toutes les langues de l'application en fonction des traductions fournies:

     public static Set<String> getAppLanguages( Context ctx, int id ) { DisplayMetrics dm = ctx.getResources().getDisplayMetrics(); Configuration conf = ctx.getResources().getConfiguration(); Locale originalLocale = conf.locale; conf.locale = Locale.ENGLISH; final String reference = new Resources( ctx.getAssets(), dm, conf ).getString( id ); Set<String> result = new HashSet<>(); result.add( Locale.ENGLISH.getLanguage() ); for( String loc : ctx.getAssets().getLocales() ){ if( loc.isEmpty() ) continue; Locale l = Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT_WATCH ? new Locale( loc.substring( 0, 2 ) ) : Locale.forLanguageTag( loc ); conf.locale = l; if( !reference.equals( new Resources( ctx.getAssets(), dm, conf ).getString( id ) ) ) result.add( l.getLanguage() ); } conf.locale = originalLocale; return result; } 

    Où, comme id arg, il faut utiliser un R.string.some_message qui est fourni dans toutes les traductions et contient un texte clairement distinctif, comme "Do you really want to delete the object?"

    Peut-être que cela aiderait quelqu'un …

    Parlez-vous de cela?

     String language = Locale.getDefault().getDisplayLanguage(); 

    Essayez d'appeler AssetManager.getLocales() :

    Obtenez les paramètres régionaux pour lesquels ce gestionnaire d'actifs contient des données.

    Ou vous pouvez essayer si vous pouvez obtenir une liste à l'aide de la list() .

    Renvoie un ensemble de chaînes de tous les atouts sur le chemin donné.

    Tu veux dire:

     String[] locales = getAssets().getLocales(); 

    Cela vous permettrait d'obtenir la langue que votre appareil possède.

    Pour ceux qui utilisent Gradle, je l'ai fait comme si en bas, il traverse toutes les strings.xml , saisit les noms des répertoires et décrive les lieux à partir de là. Il ajoute String[] à BuildConfig auquel vous pouvez accéder en tant que BuildConfig.TRANSLATION_ARRAY

     task buildTranslationArray << { def foundLocales = new StringBuilder() foundLocales.append("new String[]{") fileTree("src/main/res").visit { FileVisitDetails details -> if(details.file.path.endsWith("strings.xml")){ def languageCode = details.file.parent.tokenize('/').last().replaceAll('values-','').replaceAll('-r','-') languageCode = (languageCode == "values") ? "en" : languageCode; foundLocales.append("\"").append(languageCode).append("\"").append(",") } } foundLocales.append("}") //Don't forget to remove the trailing comma def foundLocalesString = foundLocales.toString().replaceAll(',}','}') android.defaultConfig.buildConfigField "String[]", "TRANSLATION_ARRAY", foundLocalesString } preBuild.dependsOn buildTranslationArray 

    Donc, après l'apparition de la tâche ci-dessus (en pré-construction), BuildConfig.TRANSLATION_ARRAY possède votre liste de paramètres régionaux.

    Je ne suis pas un expert de Gradle / Groovy, ce qui pourrait certainement être un peu plus simple.

    Raisonnement – J'ai rencontré trop de problèmes pour mettre en œuvre la solution de pawelzieba, je n'avais aucune chaîne fiable pour «comparer» car les traductions étaient animées. Le moyen le plus simple était donc de regarder les valeurs – les dossiers bla disponibles.

    Inspiré du code par @ Injecteer, j'ai fait ce qui suit:

    Pour la liste des langues que l'application prend en charge, il faut passer la langue par défaut, car il n'est pas possible de détecter

     public static Map<String,String> getAppLanguages(Context context, String appDefaultLang) { Map<String, String> listAppLocales = new LinkedHashMap<>(); listAppLocales.put("default","Auto"); DisplayMetrics metrics = new DisplayMetrics(); Resources res = context.getResources(); Configuration conf = res.getConfiguration(); String[] listLocates = res.getAssets().getLocales(); for (String locate : listLocates) { conf.locale = new Locale(locate); Resources res1 = new Resources(context.getAssets(), metrics, conf); String s1 = res1.getString(R.string.title_itinerary); String value = ucfirst(conf.locale.getDisplayName()); conf.locale = new Locale(""); Resources res2 = new Resources(context.getAssets(), metrics, conf); String s2 = res2.getString(R.string.title_itinerary); if (!s1.equals(s2)) { listAppLocales.put(locate, value); } else if (locate.equals(appDefaultLang)) { listAppLocales.put(locate, value); } } return listAppLocales; } 

    Le résultat est une liste map<key,value> des langues supportées par l'application, la première chose est pour si vous souhaitez utiliser pour remplir une listePréférence

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.