2008-12-17 21 views
15

¿Puedo con ASP.NET Resources/Localization traducir cadenas para que dependan de una u otra (la gramática inglesa) de una manera fácil, como paso el número 1 en mi traducción, me devuelve " Tienes un auto "o con 0, 2 y superior," Tienes% n autos "?Localización ASP.NET con singular y plural

O me veo obligado a tener la lógica en mi opinión para ver si es singular o plural?

Respuesta

1

yo sepa, no hay nada incorporada al marco de hacerlo ..

He aquí un ejemplo de una solución generalizada para el problema:

http://dotnetperls.com/plural

+0

Ese enlace no funciona. –

+0

Parece que el sitio cambió el esquema de URL ... marque uno para REST. –

0

No hay nada construido, nos terminamos de codificación algo como esto: Otra solución puede ser:

uso como marcadores de posición {} CAR en la cadena de archivo de recursos s conservarse las entradas de recursos independientes para las palabras en singular y plural para "coche": coche CAR_SINGULAR
coches CAR_PLURAL

Desarrollar una clase con esta lógica:

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 lógica no necesita estar en su punto de vista, pero ciertamente no está en el modelo de recursos del marco DotNet. El tuyo es un caso bastante simple que probablemente te saldrá bien si creas una cadena de formato simple para singular y una para plural. "Tienes 1 automóvil"./"Tienes {0} autos". Luego necesita escribir un método que discrimine entre el caso singular y el plural.

Que yo sepa, no hay un lenguaje que requiera algo más complicado que el singular/plural, pero puede haber algunos donde expresar el equivalente a "tiene 0 autos" no suena bien. También hay una serie de idiomas donde no hay distinción entre singular y plural, pero esto solo requiere una pequeña duplicación en las cadenas de recursos. (Editar para agregar: el sexo y, a veces, las terminaciones cambian dependiendo del número de unidades en muchos idiomas, pero esto debería estar bien siempre que distingas entre oraciones en singular y en plural, en lugar de solo palabras).

Microsoft en su mayoría abandonó la localización semánticamente inteligente porque es difícil generalizar incluso algo así como la pluralización en más de 30 idiomas. Esta es la razón por la que se ve una presentación tan aburrida de cantidades numéricas en la mayoría de las aplicaciones que se traducen a muchos idiomas, siguiendo el ejemplo de "Cars: {0}". Eso suena cojo, pero sorprendentemente, la última vez que revisé, los estudios de usabilidad en realidad no favorecían la presentación del lenguaje natural detallado en la mayoría de los casos.

31

JasonTrue escribió: existen

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

Tales idiomas. En mi idioma nativo polaco, por ejemplo, hay tres formas: para 1, para 2-4 y para cero y para números mayores que 4. Luego, después de llegar a 20, las formas para 21, 22-24 y 25+ son nuevamente diferentes (mismas formas gramaticales que para los números 0-9). Y sí, "tienes 0 cosas" suena incómodo, porque no es probable que lo veas en la vida real.

Como especialista en localización, aquí es lo que yo recomendaría:

Si formas posibles, el uso que ponen el número al final:

a: Number of cars: %d 

Esto significa que la forma del "coche" sustantivo hace no depende del número, y 0 es tan natural como cualquier otro número.

Si lo anterior no es aceptable, al menos siempre haga que una oración completa sea un recurso traducible. Es decir, hacer uso

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

Pero Nunca divididas tales unidades en fragmentos más pequeños, como

d: You have 
e: car(s) 

(Luego en otro lugar tiene un sch recurso no localizable como "% s% d% s ")

la diferencia es que mientras que no puedo traducir (c) directamente, ya que la forma del sustantivo va a cambiar, yo puedo ver el problema y puedo cambiar la frase para formar (a) en la traducción.

Por otro lado, cuando me enfrento con los fragmentos (d) y (e), no hay forma de asegurarse de que la oración resultante sea gramatical. De nuevo: el uso de los fragmentos garantiza que en algunos idiomas la traducción será desde gramaticalmente incómoda hasta completamente incompleta.

Esto se aplica a todos los niveles, no solo a los números. Por ejemplo, un fragmento como "% s fue eliminado" también es intraducible, ya que la forma del verbo dependerá del género del sustantivo, que no está disponible aquí. Lo mejor que puedo hacer por el polaco es el equivalente a "Eliminado:% s", pero solo puedo hacerlo siempre que el marcador de posición% s esté incluido en el recurso traducible. Si todo lo que tengo es "fue eliminado" sin una pista del nombre del referente, solo puedo asustar a mi perro maldiciendo en voz alta y al final todavía tengo que producir gramática basura.

+4

¡Excelente respuesta! ¡Bonificaciones para el humor! –

+0

Excelentes sugerencias y +1 para educarme en múltiples formas de plural. – Stimul8d

+3

en árabe, hay 3 formas: singular, dual y plural –

2

moodforaday escribió:

Esto se aplica en todos los ámbitos, no sólo para los números. Por ejemplo, un fragmento como "% s fue eliminado" también es intraducible, ya que la forma del verbo dependerá del género del sustantivo, que no está disponible aquí. Lo mejor que puedo hacer por el polaco es el equivalente a "Eliminado:% s", pero solo puedo hacerlo siempre que el marcador de posición% s esté incluido en el recurso traducible. Si todo lo que tengo es "fue eliminado" sin una pista del nombre del referente, solo puedo asustar a mi perro maldiciendo en voz alta y al final todavía tengo que producir gramática basura.

El punto que me gustaría hacer aquí, nunca es incluir un nombre como parámetro. Muchos idiomas europeos modifican el sustantivo en función de su género, y en el caso del alemán, ya sea el sujeto, el objeto o el objeto indirecto. Solo usa mensajes separados. En lugar de, "% s se eliminó.", Use una cadena de traducción separada para cada tipo: "La transacción se eliminó". "El usuario fue eliminado". etc.

De esta manera, cada cuerda se puede traducir correctamente.

La solución para manejar las formas plurales en diferentes idiomas se puede encontrar aquí: http://www.gnu.org/software/gettext/manual/html_node/Plural-forms.html

Aunque no se puede utilizar el software anterior en una aplicación comercial (que está cubierto por la GPL), puede utilizar los mismos conceptos . Sus expresiones de forma plural encajan perfectamente con expresiones lambda en .NET. Hay un número limitado de expresiones de formas plurales que cubren una gran cantidad de idiomas. Puede asignar un idioma particular a una expresión lambda que calcula qué forma de plural usar en función del idioma. Luego, busque la forma plural adecuada en un archivo .NET resx.

1

anvilis escribió:

El punto que quisiera hacer aquí, no se incluye un sustantivo como parámetro. Muchos idiomas europeos modifican el sustantivo en función de su género, y en el caso del alemán, ya sea el sujeto, el objeto o el objeto indirecto. Solo usa mensajes separados. En lugar de "% s was deleted.", Use una cadena de traducción separada para cada tipo: "La transacción se eliminó". "El usuario fue eliminado". etc.

Siempre era curioso lo que es la forma correcta de hacer las cosas similar al anterior, pero que incluyen cadena que no pudo ser incluido como parte de la traducción, como "% s dijo:" o " % s escribió: "(que se puede ver hoy en día en Facebook). En este caso,% s es el nombre de usuario más probable, y el verbo depende del género del usuario, por ejemplo.

(lo siento por escribir esto como una respuesta en lugar de utilizar el comentario - No puedo encontrar comentarios link)

+0

Creo que deberías publicar esto como una nueva pregunta. – HappyNomad

4

que he estado trabajando en una biblioteca para ayudar en la internacionalización de una aplicación. Se llama SmartFormat y es de código abierto en GitHub.

Contiene reglas de "número gramatical" para muchos idiomas que determinan la forma correcta de singular/plural basada en la configuración regional. Al traducir una frase que tiene palabras que dependen de una cantidad, usted especifica las formas múltiples y el formateador elige la forma correcta en base a estas reglas.

Por ejemplo:

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

Tiene una sintaxis muy similar a String.Format(...), pero tiene un montón de grandes características que hacen que sea fácil crear mensajes naturales y gramaticalmente-correctos.

También se trata de posibles formatos específicos de género, listas y mucho más.

Cuestiones relacionadas