# make-plural.js **Repository Path**: mirrors_mjackson/make-plural.js ## Basic Information - **Project Name**: make-plural.js - **Description**: Translates Unicode CLDR pluralization rules to executable JavaScript - **Primary Language**: Unknown - **License**: ISC - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-09-25 - **Last Updated**: 2026-05-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README make-plural =========== A JavaScript module that translates [Unicode CLDR](http://cldr.unicode.org/) [pluralization rules](http://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html) to JavaScript functions. Can be used as a CommonJS or AMD module, or directly in a browser environment. ## Installation ``` npm install make-plural ``` or ``` git clone https://github.com/eemeli/make-plural.js.git ``` ## Usage: Node ```js > MakePlural = require('make-plural') { [Function] opt: {}, rules: {}, load: [Function] } > sk = MakePlural('sk') { [Function] toString: [Function] } > console.log(sk.toString()) function(n) { var s = String(n).split('.'), i = s[0], v0 = !s[1]; return (n == 1 && v0) ? 'one' : ((i >= 2 && i <= 4) && v0) ? 'few' : (!v0) ? 'many' : 'other'; } > sk(1) 'one' > sk(3.0) 'few' > sk('1.0') 'many' > sk('0') 'other' > en = MakePlural('en', {ordinals:1}) { [Function] toString: [Function] } > console.log(en.toString()) function(n,ord) { var s = String(n).split('.'), v0 = !s[1], t0 = Number(s[0]) == n, n10 = t0 && s[0].substr(-1), n100 = t0 && s[0].substr(-2); if (ord) return (n10 == 1 && n100 != 11) ? 'one' : (n10 == 2 && n100 != 12) ? 'two' : (n10 == 3 && n100 != 13) ? 'few' : 'other'; return (n == 1 && v0) ? 'one' : 'other'; } > en(2) 'other' > en(2, true) 'two' ``` ## Usage: Web ```html ``` With outputs: ``` function(n,ord) { var s = String(n).split('.'), i = s[0], v0 = !s[1], i10 = i.substr(-1), i100 = i.substr(-2); if (ord) return 'other'; return (v0 && i10 == 1 && i100 != 11) ? 'one' : (v0 && (i10 >= 2 && i10 <= 4) && (i100 < 12 || i100 > 14)) ? 'few' : (v0 && i10 == 0 || v0 && (i10 >= 5 && i10 <= 9) || v0 && (i100 >= 11 && i100 <= 14)) ? 'many' : 'other'; } 1: one, 3.0: few, "1.0": other, "0": many ``` If `request()` isn't available, the CLDR rules are fetched automatically when required using synchronous `XMLHttpRequest` calls for the JSON files at the default locations. If that doesn't work for you, you should call `MakePlural.load(cldr)` before calling `MakePlural()`. ## Usage: CLI ```sh $ ./bin/make-plural Locales verified ok: af ak am ar asa ast az be bem bez bg bh bm bn bo br brx bs ca cgg chr ckb cs cy da de dsb dv dz ee el en eo es et eu fa ff fi fil fo fr fur fy ga gd gl gsw gu guw gv ha haw he hi hr hsb hu hy id ig ii in is it iu iw ja jbo jgo ji jmc jv jw ka kab kaj kcg kde kea kk kkj kl km kn ko ks ksb ksh ku kw ky lag lb lg lkt ln lo lt lv mas mg mgo mk ml mn mo mr ms mt my nah naq nb nd ne nl nn nnh no nqo nr nso ny nyn om or os pa pap pl prg ps pt pt-PT rm ro rof root ru rwk sah saq se seh ses sg sh shi si sk sl sma smi smj smn sms sn so sq sr ss ssy st sv sw syr ta te teo th ti tig tk tl tn to tr ts tzm ug uk ur uz ve vi vo vun wa wae wo xh xog yi yo zh zu $ ./bin/make-plural fr function fr(n,ord) { if (ord) return (n == 1) ? 'one' : 'other'; return (n >= 0 && n < 2) ? 'one' : 'other'; } $ ./bin/make-plural fr 1.5 one ``` ## Methods ### MakePlural(lc, opt) Returns a function that takes a single argument `n` and returns its plural category for the given locale `lc`. The returned function has an overloaded `toString(name)` method that may be used to generate a clean string representation of the function, with an optional name `name`. The optional `opt` parameter may contain the following members, each of which is assumed false by default: * `no_cardinals` — if true, rules for cardinal values (1 day, 2 days, etc.) are not included * `no_tests` — if true, the generated function is not verified by testing it with each of the example values included in the CLDR rules * `ordinals` — if true, rules for ordinal values (1st, 2nd, etc.) are included * `quiet` — if true, no output is reported to `console.error` on error If `opt.ordinals` is true and `opt.no_cardinals` is not true, the returned function takes a second parameter `ord`. Then, if `ord` is true, the function will return the ordinal rather than cardinal category applicable to `n` in locale `lc`. If `opt` is not set, it takes the value of `MakePlural.opt`. If `lc` is not set, it takes the value of `opt.lc`. In a context where `module.exports` is not available but `exports` is, this function is exported as `MakePlural.get()`. ### MakePlural.load(cldr, ...) Loads CLDR rules from one or more `cldr` variables, each of which may be an object or the path to a JSON file formatted like [this](http://www.unicode.org/repos/cldr-aux/json/26/supplemental/plurals.json). The stored rules are kept in `MakePlural.rules.cardinal` and `MakePlural.rules.ordinal`, which may also be directly accessed. If called within a context where `request()` isn't available and `cldr` is a string, it's taken as the URL of the JSON file that'll be fetched and parsed using a synchronous `XMLHttpRequest`. By default, `MakePlural()` will call `MakePlural.load(cldr)` when required, using the rules included in `data/`, `unicode-cldr-plural-rules.json` and `unicode-cldr-ordinal-rules.json`. ## Dependencies None. CLDR plural rule data is included in JSON format; make-plural supports the [LDML Language Plural Rules](http://unicode.org/reports/tr35/tr35-numbers.html#Language_Plural_Rules) as used in CLDR release 24 and later. Using `MakePlural.load()`, you may make use of external sources of CLDR data. For example, the following works when using together with [cldr-data](https://www.npmjs.org/package/cldr-data): ```js > cldr = require('cldr-data'); > MakePlural = require('make-plural').load( cldr('supplemental/plurals'), cldr('supplemental/ordinals') ); > MakePlural('ar')(3.14); 'other' ```