Respuestas:
También tiene System.Data.Entity.Design.PluralizationServices.PluralizationService .
ACTUALIZACIÓN : La respuesta anterior merece una actualización. Ahora también hay Humanizer: https://github.com/MehdiK/Humanizer
Puedo hacerlo para Esperanto, ¡sin casos especiales!
string plural(string noun) { return noun + "j"; }
Para el inglés, sería útil familiarizarse con las reglas para Plurales regulares de sustantivos , así como Plurales irregulares de sustantivos . Hay un artículo completo de Wikipedia sobre el plural en inglés , que también puede tener información útil.
La mayoría de los ORM lo intentan, aunque generalmente no son perfectos. Sé que Castle tiene su clase Inflector que probablemente puedas hurgar . Sin embargo, hacerlo "perfectamente" no es una tarea fácil (las "reglas" en inglés no son realmente reglas :)), por lo que depende de si está satisfecho con un enfoque de "conjetura razonable".
Hice trampa en Java: quería poder producir una cadena correcta para "No había n algo (s)", así que escribí lo siguiente. método de utilidad poco sobrecargado:
static public String pluralize(int val, String sng) {
return pluralize(val,sng,(sng+"s"));
}
static public String pluralize(int val, String sng, String plu) {
return (val+" "+(val==1 ? sng : plu));
}
invocado así
System.out.println("There were "+pluralize(count,"something"));
System.out.println("You have broken "+pluralize(count,"knife","knives"));
He creado una pequeña biblioteca para esto en .net (C #), llamada Pluralizer (como era de esperar).
Está destinado a funcionar con oraciones completas, algo como String.Format.
Básicamente funciona así:
var target = new Pluralizer();
var str = "There {is} {_} {person}.";
var single = target.Pluralize(str, 1);
Assert.AreEqual("There is 1 person.", single);
// Or use the singleton if you're feeling dirty:
var several = Pluralizer.Instance.Pluralize(str, 47);
Assert.AreEqual("There are 47 people.", several);
También puede hacer mucho más que eso. Lea más sobre esto en mi blog . También está disponible en NuGet.
Batí uno juntos basado en el pluralizador Rails. Puedes ver la publicación de mi blog aquí , o en github aquí.
output = Formatting.Pluralization(100, "sausage");
Como la pregunta era para C #, aquí hay una buena variación de la solución de Software Monkey (de nuevo un poco "trampa", pero para mí es la forma más práctica y reutilizable de hacer esto):
public static string Pluralize(this string singularForm, int howMany)
{
return singularForm.Pluralize(howMany, singularForm + "s");
}
public static string Pluralize(this string singularForm, int howMany, string pluralForm)
{
return howMany == 1 ? singularForm : pluralForm;
}
El uso es el siguiente:
"Item".Pluralize(1) = "Item"
"Item".Pluralize(2) = "Items"
"Person".Pluralize(1, "People") = "Person"
"Person".Pluralize(2, "People") = "People"
Subsonic 3 tiene una Inflector
clase que me impresionó al convertirse Person
enPeople
. Eché un vistazo a la fuente y descubrí que, naturalmente, hace un poco de trampa con una lista codificada, pero esa es realmente la única forma de hacerlo en inglés y cómo lo hacen los humanos: recordamos el singular y el plural de cada palabra y no solo aplicamos una regla . Como no hay masculino / femenino (/ neutral) para agregar a la mezcla, es mucho más simple.
Aquí hay un fragmento:
AddSingularRule("^(ox)en", "$1");
AddSingularRule("(vert|ind)ices$", "$1ex");
AddSingularRule("(matr)ices$", "$1ix");
AddSingularRule("(quiz)zes$", "$1");
AddIrregularRule("person", "people");
AddIrregularRule("man", "men");
AddIrregularRule("child", "children");
AddIrregularRule("sex", "sexes");
AddIrregularRule("tax", "taxes");
AddIrregularRule("move", "moves");
AddUnknownCountRule("equipment");
Explica algunas palabras que no tienen equivalentes en plural, como el ejemplo de equipo. Como probablemente pueda ver, hace un Regex
reemplazo simple usando $ 1.
Actualización:
¡Parece que Subsonic Inflector
es de hecho la clase Castle ActiveRecordInflector
!
No hay mucha documentación de MSDN sobre el uso específico de la clase PluralizationService, así que aquí hay una clase de prueba unitaria (NUnit) para mostrar el uso básico. Observe el extraño caso de prueba en la parte inferior que muestra que el servicio no es perfecto cuando se trata de formas plurales no estándar.
[TestFixture]
public class PluralizationServiceTests
{
[Test]
public void Test01()
{
var service = PluralizationService.CreateService(CultureInfo.CurrentCulture);
Assert.AreEqual("tigers", service.Pluralize("tiger"));
Assert.AreEqual("processes", service.Pluralize("process"));
Assert.AreEqual("fungi", service.Pluralize("fungus"));
Assert.AreNotEqual("syllabi", service.Pluralize("syllabus")); // wrong pluralization
}
}
Esta página muestra cómo utilizar PluralizationService
de System.Data.Entity
(.NET Framework 4.0)
http://zquanghoangz.blogspot.it/2012/02/beginner-with-pluralizationservices.html
Usando la base de datos de ejemplo Northwind de Microsoft:
System.Data.Entity.Design.PluralizationServices.PluralizationService.CreateService(new System.Globalization.CultureInfo("en-US"));
Singularize no Singularize "Order_Details" Devuelve "Order_Details" con el s
al final. ¿Cuál es la solución?