Javascript pluralizar una cadena
pluralize (7)
En PHP, uso la clase de Kuwamoto para pluralizar nombres en mis cadenas. No encontré algo tan bueno como este script en javascript, excepto por algunos complementos. Entonces, sería genial tener una función javascript basada en la clase de Kuwamoto.
http://kuwamoto.org/2007/12/17/improved-pluralizing-in-php-actionscript-and-ror/
Utilizar github.com/blakeembrey/pluralize
Hay una pequeña biblioteca llamada github.com/blakeembrey/pluralize que está empaquetada en npm y bower.
Esto es lo que parece utilizar:
import Pluralize from ''pluralize'';
Pluralize( ''Towel'', 42 ); // "Towels"
Pluralize( ''Towel'', 42, true ); // "42 Towels"
Y puedes conseguirlo aquí:
Entonces, respondo a mi propia pregunta compartiendo mi traducción en javascript de la clase de PHP de Kuwamoto.
String.prototype.plural = function(revert){
var plural = {
''(quiz)$'' : "$1zes",
''^(ox)$'' : "$1en",
''([m|l])ouse$'' : "$1ice",
''(matr|vert|ind)ix|ex$'' : "$1ices",
''(x|ch|ss|sh)$'' : "$1es",
''([^aeiouy]|qu)y$'' : "$1ies",
''(hive)$'' : "$1s",
''(?:([^f])fe|([lr])f)$'' : "$1$2ves",
''(shea|lea|loa|thie)f$'' : "$1ves",
''sis$'' : "ses",
''([ti])um$'' : "$1a",
''(tomat|potat|ech|her|vet)o$'': "$1oes",
''(bu)s$'' : "$1ses",
''(alias)$'' : "$1es",
''(octop)us$'' : "$1i",
''(ax|test)is$'' : "$1es",
''(us)$'' : "$1es",
''([^s]+)$'' : "$1s"
};
var singular = {
''(quiz)zes$'' : "$1",
''(matr)ices$'' : "$1ix",
''(vert|ind)ices$'' : "$1ex",
''^(ox)en$'' : "$1",
''(alias)es$'' : "$1",
''(octop|vir)i$'' : "$1us",
''(cris|ax|test)es$'' : "$1is",
''(shoe)s$'' : "$1",
''(o)es$'' : "$1",
''(bus)es$'' : "$1",
''([m|l])ice$'' : "$1ouse",
''(x|ch|ss|sh)es$'' : "$1",
''(m)ovies$'' : "$1ovie",
''(s)eries$'' : "$1eries",
''([^aeiouy]|qu)ies$'' : "$1y",
''([lr])ves$'' : "$1f",
''(tive)s$'' : "$1",
''(hive)s$'' : "$1",
''(li|wi|kni)ves$'' : "$1fe",
''(shea|loa|lea|thie)ves$'': "$1f",
''(^analy)ses$'' : "$1sis",
''((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)ses$'': "$1$2sis",
''([ti])a$'' : "$1um",
''(n)ews$'' : "$1ews",
''(h|bl)ouses$'' : "$1ouse",
''(corpse)s$'' : "$1",
''(us)es$'' : "$1",
''s$'' : ""
};
var irregular = {
''move'' : ''moves'',
''foot'' : ''feet'',
''goose'' : ''geese'',
''sex'' : ''sexes'',
''child'' : ''children'',
''man'' : ''men'',
''tooth'' : ''teeth'',
''person'' : ''people''
};
var uncountable = [
''sheep'',
''fish'',
''deer'',
''moose'',
''series'',
''species'',
''money'',
''rice'',
''information'',
''equipment''
];
// save some time in the case that singular and plural are the same
if(uncountable.indexOf(this.toLowerCase()) >= 0)
return this;
// check for irregular forms
for(word in irregular){
if(revert){
var pattern = new RegExp(irregular[word]+''$'', ''i'');
var replace = word;
} else{ var pattern = new RegExp(word+''$'', ''i'');
var replace = irregular[word];
}
if(pattern.test(this))
return this.replace(pattern, replace);
}
if(revert) var array = singular;
else var array = plural;
// check for matches using regular expressions
for(reg in array){
var pattern = new RegExp(reg, ''i'');
if(pattern.test(this))
return this.replace(pattern, array[reg]);
}
return this;
}
Fácil de usar:
alert("page".plural()); // return plural form => pages
alert("mouse".plural()); // return plural form => mice
alert("women".plural(true)); // return singular form => woman
He creado una biblioteca muy simple que se puede utilizar para la pluralización de palabras en JavaScript. Utiliza de forma transparente la base de datos CLDR para múltiples configuraciones regionales, por lo que admite casi cualquier idioma que le gustaría usar. Su API es muy minimalista y la integración es extremadamente simple. Se llama Numerous .
También le escribí un pequeño artículo de introducción: « ¿Cómo pluralizar cualquier palabra en diferentes idiomas usando JavaScript? ».
Siéntete libre de usarlo en tu proyecto. También estaré encantado por sus comentarios al respecto.
La nueva especificación de API intl de ECMA proporcionará la función de reglas plurales, https://github.com/tc39/proposal-intl-plural-rules
Aquí está el polyfill que se puede usar hoy https://github.com/eemeli/IntlPluralRules
Tomado de mi blog: https://sergiotapia.me/pluralizing-strings-in-javascript-es6-b5d4d651d403
Puedes usar la librería github.com/blakeembrey/pluralize para esto.
NPM:
npm install pluralize --save
Yarn:
yarn add pluralize
Donde quiera que quiera usar la biblioteca, puede requerirla fácilmente.
var pluralize = require(''pluralize'')
Me gusta agregarlo al objeto de la ventana para poder invocar pluralize () donde sea que lo necesite. Dentro de mi archivo raíz de application.js:
window.pluralize = require(''pluralize'')
Luego, solo puede usarlo en cualquier parte, React componentes o simplemente Javascript:
<span className="pull-left">
{`${item.score} ${pluralize(''point'', item.score)}`}
</span>
console.log(pluralize(''point'', item.score))
Versión simple (ES6):
const maybePluralize = (count, noun, suffix = ''s'') =>
`${count} ${noun}${count !== 1 ? suffix : ''''}`;
Uso:
maybePluralize(0, ''turtle''); // 0 turtles
maybePluralize(1, ''turtle''); // 1 turtle
maybePluralize(2, ''turtle''); // 2 turtles
maybePluralize(3, ''fox'', ''es''); // 3 foxes
Esto obviamente no es compatible con todos los casos de borde en inglés, pero es adecuado para la mayoría de los propósitos
function pluralize( /* n, [ n2, n3, ... ] str */ ) {
var n = Array.prototype.slice.call( arguments ) ;
var str = n.pop(), iMax = n.length - 1, i = -1, j ;
str = str.replace( //$/$|/$(/d+)/g,
function( m, p1 ) { return m == ''$$'' ? ''$'' : n[+p1-1] }
) ;
return str.replace( /[(](.*?)([+-])(/d*)(?:,([^,)]*))?(?:,([^)]*))?[)]/g,
function( match, one, sign, abs, not1, zero ) {
// if abs, use indicated element in the array of numbers
// instead of using the next element in sequence
abs ? ( j = +abs - 1 ) : ( i < iMax && i++, j = i ) ;
if ( zero != undefined && n[j] == 0 ) return zero ;
return ( n[j] != 1 ) == ( sign == ''+'' ) ? ( not1 || ''s'' ) : one ;
}
) ;
}
console.log( pluralize( 1, ''the cat(+) live(-) outside'' ) ) ;
// the cat lives outside
console.log( pluralize( 2, ''the child(+,ren) (is+,are) inside'' ) ) ;
// the children are inside
console.log( pluralize( 0, ''$1 dog(+), ($1+,$1,no) dog(+), ($1+,$1,no) dog(+,,)'' ) ) ;
// 0 dogs, no dogs, no dog
console.log( pluralize( 100, 1, ''$1 penn(y+,ies) make(-1) $$$2'' ) ) ;
// 100 pennies make $1
console.log( pluralize( 1, 0.01, ''$1 penn(y+,ies) make(-1) $$$2'' ) ) ;
// 1 penny makes $0.01