netcore - Localización ASP.NET con singular y plural
resource file asp net core (7)
No hay nada integrado, terminamos codificando algo como esto: Otra solución puede ser:
utilice marcadores de posición como {CAR} en las cadenas de archivos de recursos Mantenga entradas de recursos separadas para palabras en singular y en plural para "car": CAR_SINGULAR car
CAR_PLURAL autosDesarrolla 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";
}
¿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 más alto, "Tienes% n autos"?
¿O estoy obligado a tener lógica en mi opinión para ver si es singular o plural?
No es necesario que la lógica esté bajo 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 existe un lenguaje que requiera algo más complicado que singular / plural, pero puede haber algunos en los que expresar el equivalente a "tienes 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 generalmente se dio por vencido en 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.
Jason True escribió:
To the best of my knowledge, there isn''t a language
that requires something more complicated than singular/plural
Tales idiomas existen 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, esto es lo que recomendaría:
Si es posible, use formularios que pongan el número al final:
a: Number of cars: %d
Esto significa que la forma del sustantivo "automóvil" 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 una oración completa un recurso traducible. Es decir, usa
b: You have 1 car.
c: You have %d cars.
Pero nunca separe esas unidades en fragmentos más pequeños, como
d: You have
e: car(s)
(En otro lugar, tiene un recurso no localizable sch como "% s% d% s")
La diferencia es que, aunque no puedo traducir (c) directamente, dado que la forma del nombre cambiará, puedo ver el problema y puedo cambiar la oración por la forma (a) en la traducción.
Por otro lado, cuando me enfrento con los fragmentos (d) y (e), no hay forma de asegurarme de que la oración resultante sea gramatical. De nuevo: el uso de fragmentos garantiza que en algunos idiomas la traducción sea desde gramática incómoda hasta completamente incompleta.
Esto se aplica en todos los ámbitos, 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.
moodforaday escribió:
Esto se aplica en todos los ámbitos, 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.
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 was deleted.", Use una cadena de traducción separada para cada tipo: "La transacción se eliminó". "El usuario fue eliminado". etc.
De esta forma, cada cuerda se puede traducir correctamente.
La solución para manejar formas plurales en diferentes idiomas se puede encontrar aquí: http://www.gnu.org/software/gettext/manual/html_node/Plural-forms.html
Si bien no puede usar el software anterior en una aplicación comercial (está cubierto por GPL), puede usar 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.
AFAIK, no hay nada incorporado en el marco para hacerlo ...
Aquí hay un ejemplo de una solución generalizada para el problema:
anvilis escribió:
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 was deleted.", Use una cadena de traducción separada para cada tipo: "La transacción se eliminó". "El usuario fue eliminado". etc.
Siempre tuve curiosidad por saber cuál es la forma correcta de hacer cosas similares a las anteriores, pero eso incluye una cadena que no se pudo incluir 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 usar un comentario - No puedo encontrar el enlace de comentario)
He estado trabajando en una biblioteca para ayudar con 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 toneladas de excelentes características que facilitan la creación de mensajes naturales y gramaticalmente correctos.
También trata con posibles formatos, listas y mucho más específicos de género.