2015-12-21 3 views
11

Dans les chaînes Android, vous pouvez définir des pluriels pour gérer les traductions en fonction du nombre réel fourni à la chaîne comme décrit here. Les chaînes permettent également de spécifier plusieurs paramètres de position similaires à ce que fait sprintf dans de nombreuses langues.Android Plural Strings avec plusieurs paramètres

Cependant, tenez compte de la chaîne suivante:

<resources> 
    <string name="remaining">%1$d hours and %2$d minutes remaining.</string> 
</resources> 

Il contient deux chiffres, comment pourrais-je transformer à un pluriel dans Android? Tous les exemples fonctionnent toujours avec un seul paramètre. Est-ce seulement possible?

Répondre

3

getQuantityString a une version surchargée qui prend un identifiant de chaîne, la quantité et un varargs d'objet que vous pourriez utiliser pour formater votre chaîne. Même s'il semble possible d'utiliser le pluriel, cela me semble étrange pour le temps. Vous pouvez utiliser les méthodes d'assistance contenues dans DateUtil, qui sont déjà localisées et prendre en charge le singulier/pluriel, puis compléter votre chaîne avec les résultats de ces méthodes d'assistance. Par exemple. getRelativeTimeSpanString

<plurals name="numberOfEmails"> 
    <item quantity="one">%d email</item> 
    <item quantity="other">%d emails</item> 
</plurals> 

<plurals name="numberOfMessages"> 
    <item quantity="one">%d message</item> 
    <item quantity="other">%d messages</item> 
</plurals> 

et vous pouvez utiliser getQuantityString pour récupérer les deux pièces et les combiner en un seul.

+2

getRelativeTimeSpanString semble être un bon choix pour mon problème mais ne résoudrait pas ma question initiale. Avoir un texte avec plusieurs numéros n'est pas si rare ("Vous avez 5 mails et 3 messages", "Il reste 5 Dollars et 83 cents."). Je ne vois pas comment je spécifierais le XML pour la version getQuantityString que vous suggérez. –

+0

regardez le premier lien, j'ai posté. Les documentations indiquent que la quantité sera utilisée pour choisir la chaîne et le troisième argument pour la formater. – Blackbelt

+1

Désolé, je ne comprends pas.Pouvez-vous développer votre réponse avec un exemple de a) le XML pour configurer une chaîne pour les 4 formes plurielles nécessaires pour "Vous avez 5 mails et 3 messages" et b) l'appel à getQuantityString avec des mails et des messages comme quantités d'entrée? –

-6

Eh bien voici un moyen qui pourrait fonctionner. Créer une balise pluriels sous les valeurs/strings.xml comme ceci:

<resources> 
    <plurals name="remaining"> 
     <item quantity="one">%1$d hours and</item> 
     <item quantity="other">%2$d minutes remaining.</item> 
    </plurals> 
</resources> 

Puis dans l'activité:

Resources res = getResources(); 
String myString = res.getQuantityString(R.plurals.remaining, count, count); 

J'espère que ça aide !!!

+2

Il ne répond pas à la question .. – user2878850

+4

La solution suggérée ne fonctionnerait pas du tout. Un seul des textes sera sélectionné pour chaque appel à getQuantityString (...). –

5

La réponse précédente utilise une concaténation de chaîne qui est incorrecte d'un point de vue i18n. Pour la chaîne d'origine "% 1 $ d heures et% 2 $ d minutes restantes". l'utilisation de la concaténation de chaîne forcerait la traduction de "restant" à la fin, ce qui pourrait ne pas être approprié pour certaines langues.

Ma solution serait:

<resources> 
    <string name="remaining">Time remaining: Hours:%1$d Minutes:%2$d.</string> 
</resources> 

Ou peut-être avec "Temps restant", comme le titre.

Cette solution est mentionnée dans http://developer.android.com/guide/topics/resources/string-resource.html#FormattingAndStyling

Il est souvent possible d'éviter les chaînes de quantité en utilisant formulations de quantité neutres tels que « Livres: 1 »