2017-08-04 5 views
1

Je travaille sur une application qui a des chaînes localisées pour le Royaume-Uni, spécifiée dans res/values-en-rGB/strings.xml. Mes implémentations de chaînes par défaut, pour les États-Unis, sont au res/values/strings.xml.Localisation par défaut du Canada au Royaume-Uni; Devrait par défaut à US

Maintenant, j'ajoute des localisations supplémentaires pour le Canada au res/values-en-rCA/strings.xml. Je voudrais comme l'application à se comporter comme suit: Si l'appareil d'un utilisateur est localisé au Canada (ou leur langue est définie sur English(Canada) ou French(Canada)), vérifiez si nous avons une chaîne dans en-rCA, et sinon, repli sur la chaîne dans mon fichier par défaut strings.xml. Cependant, mon application retombe actuellement aux chaînes de en-rGB lorsque le périphérique est défini sur un paramètre régional canadien et la chaîne est introuvable dans en-rCA. Par conséquent, j'ai deux questions:

  1. Comment puis-je configurer mon application telle qu'un appareil avec une recherche de paramètres régionaux au Canada pour une chaîne dans en-rCA puis, si elle ne peut pas le trouver, par défaut la chaîne dans mon défaut values dossier plutôt que en-rGB?

  2. Comment puis-je assurer qu'un appareil dont la langue est French (Canada) par défaut en-rCA plutôt que mon défaut values, comme il le fait actuellement?

Je serais heureux de fournir un exemple si cela serait utile. Merci!

+0

Je rencontre le même problème. Peut-être qu'il y a un bug avec les modifications apportées dans Android N https://developer.android.com/formation/bases/support-devices/languages.html. Sur les anciennes API, cela fonctionne très bien, mais les nouvelles comme 7.1.1, il se comporte de la même manière que vous avez mentionné ci-dessus. Peut-être devrions-nous ouvrir un rapport de bogue? –

+0

Cochez [Android 7.0 Nougat récupère les chaînes par défaut lorsque la langue du périphérique est en_US] (https://stackoverflow.com/q/40906548/1306419) question qui a soulevé une préoccupation similaire avec d'autres locales en anglais. –

+0

J'ai créé un rapport de bug ici: https://issuetracker.google.com/issues/64429534. N'hésitez pas à suggérer des changements pour l'améliorer ou le commenter/starter afin qu'il puisse être regardé. Merci. –

Répondre

1

Mise à jour Finale:

Après l'ouverture d'un bug rapport sur Google Incorrect resource resolution strategy above Android N, defaulting to en_GB and not default strings.xml, ils ont mentionné que cela dans le comportement prévu pour Android N ci-dessus.en_UK est considéré comme "un représentant de l'anglais international". Les chaînes retourneront aux chaînes "International English" ou à leur représentant avant de passer aux chaînes en par défaut. Je cite leur réponse ici:

À partir de N, tous les paramètres régionaux anglais (sauf pour les territoires américains et américains comme Porto Rico et les Samoa américaines) se replient à une variante internationale anglais si un tel lieu est disponible. Donc, pour en-CA, nous essaierons d'abord ces locales, avant de retomber sur en-GB (qui est considéré comme un représentant de l'anglais international s'il n'y a pas de meilleur anglais international): en-rCA (anglais canadien) , b + en + 001 (anglais international), en (anglais). Si vous ne voulez pas que les chaînes en-GB soient capturées pour en-CA, vous devez placer les ressources dans l'un de ces trois répertoires, car elles seraient considérées comme une meilleure correspondance pour en-CA.


Mise à jour 1:

Il semble que ce ne se limite pas à en_CA. Il existe une autre question similaire pour les autres paramètres régionaux anglais: Android 7.0 Nougat picks up default strings when device language is en_US. Ressemble à un bug de plate-forme à ce stade.


Réponse d'origine:

Je ne sais pas si son un bug ou une fonction. A partir du niveau d'API 24 (Android 7.0), ils ont mis à jour comment Android résout les chaînes comme mentionné Improvements to Resource-Resolution Strategy . Prenons un exemple de la documentation ci-dessous:

Avant Android 7.0:

Disons que si l'utilisateur a des paramètres de fr_CH et suivants sont les ressources disponibles dans l'application i.e. de_DE, es_ES, fr_FR, it_IT. Pour les API antérieures à Android 7.0, Android a essayé de trouver une correspondance exacte et si une correspondance exacte n'a pas été trouvée, la valeur par défaut est values/strings.xml, i.e en. Donc, pour en_CA cas, si une chaîne n'est pas trouvée dans res/values-en-rCA/strings.xml, on peut s'attendre à en par défaut. Table 1. Resource resolution without an exact locale match.

Après Android 7.0

Cependant maintenant dans Android 7.0 et plus, pour la situation des fr_CH, il retombera au dialecte parent le plus proche i.e. fr_FR. Table 2. An improved resolution strategy for when there is no exact locale match.

En appliquant la même logique à la situation des en_CA et en_GB présent dans l'application, je pense que Android pense que en_GB est le plus proche dialecte-en_CA et est en baisse revenir au lieu de la valeur par défaut en premier. Je suis confronté au problème dans mon application et c'est la seule explication plausible que je peux expliquer pourquoi ce problème se produit uniquement sur les nouvelles versions d'API et non sur celles antérieures à Android N.

0
  1. Cela devrait se faire automatiquement, sans que vous fassiez quoi que ce soit. Si vous avez values/strings.xml, values-en-rGB/strings.xml et values-en-rCA/strings.xml avec les versions GB et CA contenant uniquement les chaînes qui diffèrent de la ligne de base (values/strings.xml) et si l'utilisateur a ses paramètres régionaux comme en-CA, le système chargera les chaînes de values-en-rCA/strings.xml s'il est introuvable, Je vais revenir à values/strings.xml, la version GB ne viendrait pas dans l'image. Pour cela, vous devrez changer localement les paramètres régionaux de votre application. Fondamentalement, vous obtenez la configuration locale, si elle est fr-CA, vous définissez manuellement les paramètres régionaux à en-CA

    Locale enCALocale = new Locale("en", "CA"); 
    Locale.setDefault(enCALocale); 
    Configuration config = new Configuration(); 
    config.locale = enCALocale; 
    getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics()); 
    

Mise à jour

Comme mentionné Shobhit, à partir de N Android, peut maintenant avoir une liste des endroits sélectionnés dans le cadre et vous pouvez décider de leur priorité:

enter image description here

Dans le cas ci-dessus le système va essayer de chercher en-rCA/strings, sinon trouvé sera examinée dans en-rGB/strings au lieu de base, ce qui est arrivé avant N.

+1

Votre réponse à # 2 a été très utile - merci! Comme pour # 1, je comprends que c'est le comportement attendu, et c'est effectivement la façon dont mon application est configurée. Pourtant, je trouve qu'un appareil avec une locale canadienne revient à des chaînes de 'values-en-rGB', et je me demande si quelqu'un sait pourquoi cela se produit. Si je mets l'appareil dans une langue autre que «English (Canada)», mes valeurs par défaut sont rétablies. On dirait qu'il y a quelque chose d'étrange dans l'anglais canadien. Pensées? – user5194377

+0

Merci pour la nouvelle mise à jour. Je n'ai que l'anglais (Canada) et l'anglais (États-Unis) dans mes préférences linguistiques. Même alors, le problème se produit. –

+0

Même ici, @Shobhit. Difficile de dire si c'est un bug ou une fonctionnalité intentionnelle. Si c'est une fonctionnalité, il semble qu'il devrait y avoir un moyen de passer outre et d'insister sur le fait qu'il revient aux États-Unis plutôt qu'au Royaume-Uni. Peut-être que nous devrions déposer un rapport de bogue. – user5194377