2011-02-27 16 views
13

Estoy internacionalizando mi aplicación y estoy buscando una solución para lidiar con formularios plurales. Me encontré con el proyecto Mozilla's PluralForm, que esencialmente abstrae el tema de los plurales para la internacionalización. Así es como funciona:International Pluralization Lib para Objective-C?

  1. Existen varias "reglas plurales" que los idiomas pueden seguir. Cada idioma encaja en una y solo una de las muchas reglas en plural (la documentación de Mozilla tiene 15 reglas potenciales en plural). Por ejemplo, en los idiomas con la regla 0 (como el chino), no hay formas en plural, por lo que solo hay una forma de palabra necesaria. En los idiomas con la regla 1 (como el alemán), cada palabra tiene dos formas distintas de plural. Y así sucesivamente, dependiendo de cómo coincidan las reglas.

  2. Cuando se está programando una cadena internacionalizada, pasar, no sólo la cadena a ser internacionalizada, pero el número que desea pluralizar el sustantivo con:

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

    En Objective-C, una lo haría de forma diferente:

    NSString *str = [NSString stringWithFormat:NSLocalizedStringFromTable(@"%d Items"), myNumber];

    Por supuesto, este ejemplo de Objective-C anterior no resuelve la cuestión de las formas plurales.

  3. Cuando la función PluralForm.get recibe una llamada, dependiendo del idioma actualmente en uso, aplica la forma plural, y extrae la cadena internacionalizada adecuada del archivo de cadenas dependiendo de la sub-regla específica que debe seguir .

La ventaja para PluralForm es clara (al menos para mí). Se abstrae las reglas de lenguaje reales del codificador, por lo que no es necesario que se dupliquen en todas las ubicaciones donde tiene que tratar con una forma plural.

Me gustaría utilizar un sistema como al programar las aplicaciones de mi iPhone. ¿Hay algún proyecto o código disponible que conecte el PluralForm de Mozilla al objetivo-c?

+0

He editado la pregunta un poco para que sea más general. Espero que no te importe. –

Respuesta

0

Al mirar el implementation of PluralForm.jsm de Mozilla, debería ser bastante fácil implementar su propia versión del PluralForm.get en Objective-C.

Primero recupera regla plural número desde su localización y úselo para seleccionar el getter apropiado, que implementa la regla. Hay 16 (1) expresiones que devuelven el índice de forma plural para usar para el número dado. Por suerte parece que están escritas en JavaScript subconjunto que es también el código C válido ... expresiones booleanas y ternarios con algunas operaciones de módulo mezclados.

Las formas plurales son suministrados por sus traductores como lista separada por punto y coma en la cadena localizada por la palabra dada. El orden de los formularios se describe en el list of plural rules. Se divide por punto y coma y usando el índice del getter se selecciona el formulario correspondiente.

Técnicamente, no hay problema. El único problema es que no sé cómo derivar correctamente su código y respetar el MPL license.

(1) La aplicación contiene la regla 17a de Breton, pero sus formas no están documentados todavía, así que ...

2

Smartling (una plataforma de gestión de traducción) ha publicado una open source library para la gestión de los plurales en IOS. Después de haber tratado con numerosos clientes que tenían problemas de plural de iOS y no encontrar una solución que funcionara como nosotros y nuestros clientes querían, decidimos construir la nuestra.

La biblioteca toma las claves para las cadenas plurales y las extiende para contener la forma plural basada en las reglas de plural CLDR. La biblioteca proporciona una función alternativa a NSLocalizedString llamada SLPluralizedString para realizar la búsqueda.

Un archivo de origen Inglés se vería así:

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

Y usted usaría la función SLPluralizedString para buscar la cadena:

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

Un traducida archivo rusa tendría la cantidad apropiada de claves/values ​​for the language:

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

El código real no sería necesidad de cambiar dependiendo del idioma. Una función funcionaría en todos los idiomas y devolvería la cadena traducida apropiada.

Siéntase libre de compartir comentarios, mejoras, etc.

+0

Esto tiene una idea similar a los archivos stringsdict de Apple. Consulte la sección 'Manejo de títulos de sustantivos y unidades de medida' de su [Guía de internacionalización y localización] (https://developer.apple.com/library/ios/documentation/MacOSX/Conceptual/BPInternational/LocalizingYourApp/LocalizingYourApp.html) – user2067021