Libéral international Pluralization pour Objective-C?

J'internationalise mon application et je cherche une solution à la façon de traiter les forms plurielles. J'ai couru à travers le projet PluralForm de Mozilla , qui résume essentiellement le problème des pluriels pour l'internationalisation. Voici comment cela fonctionne:

  1. Il existe un certain nombre de «règles plurielles» que les langues peuvent suivre. Chaque langue correspond à une et plusieurs des règles du pluriel (la documentation de Mozilla a 15 règles plurielles potentielles). Par exemple, dans les langues avec la règle 0 (comme le chinois), il n'y a pas de forms plurielles et il n'y a donc qu'une seule forme de mot nécessaire. Dans les langues avec la règle 1 (comme l'allemand), chaque mot a deux forms plurielles distinctes. Et ainsi de suite, selon la façon dont les règles correspondent.

  2. Lorsque vous programmez une string internationalisée, vous transmettez non seulement la string à internationaliser, mais le numéro avec lequel vous voulez pluraliser le nom avec:

    print("You have " + num + " " + PluralForm.get(num, downloads) + ".");

    En Objective-C, on le ferait plutôt différemment:

    NSSsortingng *str = [NSSsortingng ssortingngWithFormat:NSLocalizedSsortingngFromTable(@"%d Items"), myNumber];

    Bien sûr, cet exemple Objective-C ci-dessus ne résout pas la question des forms plurielles.

  3. Lorsque la fonction PluralForm.get reçoit un appel, en fonction de la langue actuellement utilisée, elle applique le pluriel et extrait la string internationalisée appropriée du file de strings en fonction de la sous-règle spécifique à suivre.

L'avantage de PluralForm est clair (au less pour moi). Il extrait les règles de langue réelles du codeur, de sorte qu'elles n'ont pas besoin d'être dupliquées dans tous les locations où vous devez traiter une forme plurielle.

Je voudrais utiliser un système comme quand lors de la programmation de mes applications iPhone. Existe-t-il un projet ou un code disponible qui apathe le PluralForm de Mozilla vers l'objective-c?

Smartling (une plate-forme de gestion de traduction) a publié une bibliothèque open source pour gérer les pluriels dans iOS. Après avoir traité avec de nombreux clients ayant des problèmes de pluriels iOS et ne pas find une solution qui fonctionnerait comme nous et nos clients voulions, nous avons décidé de build le notre.

La bibliothèque prend les keys pour les strings du pluriel et les étend pour contenir le pluriel basé sur les règles plurielles du CLDR. La bibliothèque fournit une fonction alternative à NSLocalizedSsortingng appelée SLPluralizedSsortingng pour faire la search.

Un file source anglais ressemblerait à ceci:

 "%d Items Processed##{one}" = "1 Item Processed"; "%d Items Processed##{other}" = "%d Items Processed"; 

Et vous utiliseriez la fonction SLPluralizedSsortingng pour searchr la string:

 SLPluralizedSsortingng(@”%d Items Processed”, numItems, @”Number of items processed”); 

Un file russe traduit aurait le nombre approprié de keys / valeurs pour la langue:

 "%d Items Processed##{one}" = "%d элемент обработан"; "%d Items Processed##{few}" = "%d элемента обработано"; "%d Items Processed##{many}" = "%d элементов обработано"; "%d Items Processed##{other}" = "%d элемента обработано"; 

Le code actuel n'aurait pas besoin de changer selon la langue. Une fonction fonctionnerait dans toutes les langues et renverrait la string traduite appropriée.

N'hésitez pas à partager vos commentaires, améliorations, etc.

En regardant l' implémentation de PluralForm.jsm par Mozilla, il devrait être assez facile d'implémenter votre propre version de PluralForm.get dans Objective-C.

Vous récupérez d'abord le numéro de règle du pluriel de votre localization et l'utilisez pour sélectionner le getter approprié qui implémente la règle. Il y a 16 (1) expressions qui returnnent l'index du pluriel correct à utiliser pour un nombre donné. Heureusement, ils semblent être écrits dans un sous-set JavaScript qui est aussi un code C valide … Expressions booleannes et ternaires avec quelques opérations modulo mélangées.

Les forms plurielles sont fournies par vos traducteurs sous forme de list séparée par des points-virgules dans la string localisée pour le mot donné. L'ordre des formulaires est décrit dans la list des règles plurielles . Vous les divisez par le point-virgule et en utilisant l'index du getter, select le formulaire correspondant.

Techniquement, pas de problème. Le seul problème est que je ne sais pas comment dériver correctement votre code et respecter la licence MPL .

(1) L'implémentation contient la 17ème règle pour le breton, mais ses forms ne sont pas encore documentées, alors …