2008-12-17 13 views
15

Puis-je avec ASP.NET Ressources/Localisation traduire les chaînes de dépendre de l'un ou l'autre (la grammaire anglaise) d'une manière facile, comme je passe le numéro 1 dans ma traduction, il retourne " Vous avez une voiture "ou avec 0, 2 et plus," Vous avez% n voitures "?ASP.NET Localisation avec singulier et pluriel

Ou est-ce que je suis forcé d'avoir une logique à mon sens pour voir si c'est au singulier ou au pluriel?

Répondre

1

AFAIK, il est intégré rien au cadre pour le faire ..

Voici un exemple d'une solution généralisée du problème:

http://dotnetperls.com/plural

+0

Ce lien ne fonctionne pas. –

+0

On dirait que le site a changé le schéma de l'url .. marquer un pour REST. –

0

Il n'y a rien construit, nous fini par coder quelque chose comme ceci: Une autre solution peut être:

utiliser des espaces comme {CAR} dans la chaîne du fichier de ressources s gérer les entrées de ressources distinctes pour les mots au singulier et au pluriel pour « voiture »: voiture CAR_SINGULAR
voitures CAR_PLURAL

Développer une classe avec cette logique:

class MyResource 
{ 

    private List<string> literals = new List<string>(); 
    public MyResource() { literals.Add("{CAR}") } 
    public static string GetLocalizedString(string key,bool isPlural) 
    { 
     string val = rm.GetString(key); 
     if(isPlural) 
     { 
      val = ReplaceLiteralWithPlural(val); 
     } 
     else 
     { 
      val = ReplaceLiteralWithSingular(val); 
     }  
    } 
} 

string ReplaceLiteralWithPlural(string val) 
{ 
    StringBuilder text = new StringBuilder(val) 
    foreach(string literal in literals) 
    { 
     text = text.Replace(literal,GetPluralKey(literal)); 
    } 
} 

string GetPluralKey(string literal) 
{ 
    return literal + "_PLURAL"; 
} 
0

La logique ne doit pas être en votre point de vue, mais ce n'est certainement pas dans le modèle de ressources du framework DotNet. Le vôtre est un cas assez simple que vous pouvez probablement éviter en créant une chaîne de format simple pour le singulier, et une pour le pluriel. "Vous avez 1 voiture."/"Vous avez {0} voitures." Vous devez ensuite écrire une méthode qui distingue le cas pluriel du singulier. Au meilleur de ma connaissance, il n'y a pas une langue qui nécessite quelque chose de plus compliqué que le singulier/pluriel, mais il peut y avoir certains où exprimer l'équivalent de "vous avez 0 voitures" ne sonne pas bien. Il y a aussi un certain nombre de langages où il n'y a pas de distinction entre le singulier et le pluriel, mais cela nécessite juste un peu de duplication dans les chaînes de ressources. (modifier pour ajouter: le genre et parfois les terminaisons changent en fonction du nombre d'unités dans de nombreuses langues, mais cela devrait aller bien tant que vous faites la distinction entre des phrases au singulier et au pluriel, plutôt que seulement des mots).

Microsoft a surtout renoncé à une localisation sémantiquement intelligente, car il est difficile de généraliser même quelque chose comme la pluralisation à plus de 30 langues. C'est pourquoi vous voyez une telle présentation ennuyeuse de quantités numériques dans la plupart des applications qui sont traduites dans de nombreuses langues, sur le modèle de "Cars: {0}". Cela semble boiteux, mais étonnamment, la dernière fois que j'ai vérifié, les études d'utilisabilité n'ont pas vraiment favorisé la présentation verbeuse en langage naturel dans la plupart des cas.

31

JasonTrue a écrit:

To the best of my knowledge, there isn't a language 
that requires something more complicated than singular/plural 

Ces langues existent. Dans mon polonais natal, par exemple, il y a trois formes: pour 1, pour 2-4 et pour zéro et des nombres supérieurs à 4. Puis après que vous atteignez 20, les formes pour 21, 22-24 et 25+ sont encore différentes (mêmes formes grammaticales que pour les chiffres 0-9). Et oui, "vous avez 0 choses" semble maladroit, parce que vous ne risquez pas de voir cela utilisé dans la vraie vie.

En tant que spécialiste de la localisation, voici ce que je recommande:

Si les formes possibles, l'utilisation qui mettent le chiffre à la fin:

a: Number of cars: %d 

Cela signifie que la forme du nom « voiture » ne ne dépend pas du nombre, et 0 est aussi naturel que n'importe quel autre nombre.

Si ce qui précède n'est pas acceptable, faites au moins toujours une phrase complète une ressource traduisible. Autrement dit, n'utilisez

b: You have 1 car.  
c: You have %d cars. 

Mais jamais divisé ces unités en fragments plus petits tels que

d: You have 
e: car(s) 

(Puis un autre endroit que vous avez un sch de ressources non localisables « % s% d% La différence est que si je ne peux pas traduire (c) directement, puisque la forme du nom va changer, je peut voir le problème et je peux changer la phrase pour former (a) en traduction. Par contre, quand je suis confronté à des fragments (d) et (e), il n'y a aucun moyen de m'assurer que la phrase résultante sera grammaticale. Encore une fois: en utilisant des fragments garantit que dans certaines langues la traduction sera quelque chose de grammaticalement maladroit à complètement cassé.

Cela s'applique à tous les niveaux, pas seulement aux chiffres. Par exemple, un fragment tel que "% s a été supprimé" est également intraduisible, puisque la forme du verbe dépendra du genre du nom, qui n'est pas disponible ici. Le mieux que je peux faire pour le polonais est l'équivalent de "Deleted:% s", mais je ne peux le faire que si l'espace réservé% s est inclus dans la ressource traduisible. Si tout ce que j'ai est "a été supprimé" sans aucune indication sur le nom référent, je ne peux que surprendre mon chien en jurant à haute voix et à la fin je dois encore produire de la grammaire des ordures.

+4

Excellente réponse! Des marques de bonus pour l'humour! –

+0

Excellentes suggestions et +1 pour m'éduquer sur plusieurs formes plurielles. – Stimul8d

+3

en arabe, il existe 3 formes: singulier, dual et pluriel –

2

moodforaday a écrit:

Ceci est valable dans tous les domaines, non seulement aux chiffres. Par exemple, un fragment tel que "% s a été supprimé" est également intraduisible, puisque la forme du verbe dépendra du genre du nom, qui n'est pas disponible ici. Le mieux que je peux faire pour le polonais est l'équivalent de "Deleted:% s", mais je ne peux le faire que si l'espace réservé% s est inclus dans la ressource traduisible. Si tout ce que j'ai est "a été supprimé" sans aucune indication sur le nom référent, je ne peux que surprendre mon chien en jurant à haute voix et à la fin je dois encore produire de la grammaire des ordures.

Le point que je voudrais faire ici, n'est jamais d'inclure un nom en tant que paramètre. De nombreuses langues européennes modifient le nom en fonction de son sexe, et dans le cas de l'allemand, qu'il s'agisse du sujet, de l'objet ou de l'objet indirect. Utilisez simplement des messages séparés. Au lieu de "% s was deleted.", Utilisez une chaîne de traduction distincte pour chaque type: "La transaction a été supprimée." "L'utilisateur a été supprimé."

De cette façon, chaque chaîne peut être traduite correctement.

peut être trouvé la solution pour traiter les formes plurielles dans différentes langues ici: http://www.gnu.org/software/gettext/manual/html_node/Plural-forms.html

Bien que vous ne pouvez pas utiliser le logiciel ci-dessus dans une application commerciale (il est couvert par la GPL), vous pouvez utiliser les mêmes concepts . Leurs expressions de forme au pluriel s'adaptent parfaitement aux expressions lambda dans .NET. Il existe un nombre limité d'expressions de formes plurielles qui couvrent un grand nombre de langues. Vous pouvez mapper une langue particulière à une expression lambda qui calcule le pluriel à utiliser en fonction de la langue. Ensuite, recherchez le formulaire pluriel approprié dans un fichier .NET resx.

1

anvilis écrit:

Le point que je voudrais faire ici, n'est jamais inclure un nom comme paramètre. De nombreuses langues européennes modifient le nom en fonction de son sexe, et dans le cas de l'allemand, qu'il s'agisse du sujet, de l'objet ou de l'objet indirect. Utilisez simplement des messages séparés. Au lieu de "% s was deleted.", Utilisez une chaîne de traduction distincte pour chaque type: "La transaction a été supprimée". "L'utilisateur a été supprimé." etc.

J'étais toujours curieux quel est le bon façon de faire des choses semblables ci-dessus, mais qui comprennent la chaîne qui ne pouvait pas être inclus dans le cadre de la traduction, comme « % s dit: » ou " % s a écrit: "(qui peut être vu de nos jours sur facebook). Dans ce cas,% s est le nom d'utilisateur le plus probable, et le verbe dépend du genre de l'utilisateur, par exemple.

(désolé pour écrire cela comme une réponse au lieu d'utiliser un commentaire - Je ne peux pas trouver le lien de commentaire)

+0

Je pense que vous devriez publier ceci comme une nouvelle question. – HappyNomad

4

Je travaille sur une bibliothèque pour aider à l'internationalisation d'une application. Il s'appelle SmartFormat et est open-source sur GitHub.

Il contient des règles de "nombre grammatical" pour de nombreux langages qui déterminent la forme singulier/pluriel correcte en fonction des paramètres régionaux. Lorsque vous traduisez une phrase dont les mots dépendent d'une quantité, vous spécifiez les multiples formulaires et le formateur choisit le bon formulaire en fonction de ces règles.

Par exemple:

var message = "There {0:is:are} {0} {0:item:items} remaining."; 
var output = Smart.Format(culture, message, items.Count); 

Il a une syntaxe similaire à celle String.Format(...), mais a des tonnes de fonctionnalités qui le rendent facile de créer des messages naturels et grammaticalement corrects.

Il traite également de la mise en forme spécifique au genre, des listes, et bien plus encore.