@new-inventor/pluralization
TypeScript icon, indicating that this package has built-in type declarations

1.0.1 • Public • Published

JavaScript and TypeScript Smart Pluralisation

Overview

This module provides extendable service for pluralize words.

Instead of "zero | one | more" notation, we provide endings notation.

In the code do something like this {{'{n} {билет|genitive}' | pluralizeTemplate(value)}} or this {{value}} {{'билет' | pluralize(value, 'genitive')}}

This paradigm make code cleaner and make pluralization config slimmer.

Installation

npm install @new-inventor/smart_pluralization

Usage

To use this library in stand alone(not framework) environment you can use this code:

//Initialize service in the beginning of the code
import SmartPluralizationService from '@new-inventor/pluralization/SmartPluralization.service';
import {LocaleName, RUModifier, RUWord} from '@new-inventor/pluralization/locales';
import RU from '@new-inventor/pluralization/locales/RU';
import WordsList from '@new-inventor/pluralization/WordsList';
import ruWords from './ru.pluralization.json';

const pluralizationService = SmartPluralizationService.make(LocaleName.RU, {[LocaleName.RU]: new RU(new WordsList<RUWord>(ruWords))});

//somewhere in the code below
pluralizationService.pluralize('билет', 1, RUModifier.DATIVE);
pluralizationService.pluralizeTemplate('{n} {билет|nominative}', 1);


//or you can implement your own locale by extending the Locale class

import Locale from "@new-inventor/pluralization/Locale";
export default class RU extends Locale {
  public readonly rule: Array<(value: number) => boolean> = [
    (value: number): boolean => {
      return value % 10 === 1;
    },
    (value: number): boolean => {
      return value % 10 >= 2;
    },
    (value: number): boolean => {
      return value % 10 >= 5 || value % 10 === 0 || (value > 10 && value < 20);
    },
  ];

  constructor(public words: WordsList<RUWord> = new WordsList<RUWord>()) {
    super();
  }

  public pluralize(word: string, count: number, modifier?: RUModifier): string {
    return word + this.getEnding(count, this.getCaseVariations(word, modifier));
  }

  protected getCaseVariations(word: string, modifier?: RUModifier): string[] {
    const rawWord = this.words.get(word);
    return rawWord.cases[modifier ? modifier : Object.keys(rawWord.cases)[0]];
  }
}

You should provide file with config for pluralization (ruWords in example above) like this:

{
  "билет": {
    "base": "билет",
    "cases": {
      "nominative": ["", "а", "ов"],
      "genitive": ["а", "ов", "ов"],
      "dative": ["у", "ам", "ам"],
      "accusative": ["", "а", "ов"],
      "instrumental": ["ом", "ами", "ами"],
      "prepositional": ["е", "ах", "ах"]
    }
  },
  "подразделение": {
    "base": "подразделени",
      "cases": {
        "nominative": ["е", "я", "й"],
        "genitive": ["я", "й", "й"],
        "dative": ["ю", "ям", "ям"],
        "accusative": ["е", "я", "й"],
        "instrumental": ["ем", "ями", "ями"],
        "prepositional": ["е", "ях", "ях"]
    }
  }
}

this file can be of type json, js and ts.

This Version implement next locales out of the box:

  • EN - english
  • RU - russian

All locales names written in two upper case letters notation.

Vue usage

Use this package: @new-inventor/vue-pluralization

npm install @new-inventor/vue-pluralization

in main.ts/js

import SmartPluralizationPlugin from '@new-inventor/vue-pluralization';
import {LocaleName, RUWord} from '@new-inventor/pluralization/locales';
import RU from '@new-inventor/pluralization/locales/RU';
import WordsList from '@new-inventor/pluralization/WordsList';
import ruWords from './ru.pluralization.json';
//...
Vue.use(SmartPluralizationPlugin, {currentLocale: 'RU', locales: {[LocaleName.RU]: new RU(new WordsList<RUWord>(ruWords))}});

in templates

<div>{{ n }} {{'билет' | pluralize(1, 'nominative')}}</div>
<div>{{ '{n} {билет|nominative}' | pluralizeTemplate(1)}}</div>

in components

this.$pluralizer.pluralize('билет', 1, RUModifier.DATIVE);
this.$pluralizer.pluralizeTemplate('{n} {билет|nominative}', 1);

Angular usage

use this package: @new-inventor/angular-pluralization

npm install @new-inventor/angular-pluralization

import module

@NgModule({
  imports:      [ SmartPluralizationModule ],
  // ...
})

inject in component or service

import SmartPluralizationService from '@new-inventor/angular-pluralization/SmartPluralization.service';

class SomeClass{
  constructor(private pluralizationService: SmartPluralizationService){}
}

use in component

this.pluralizationService.pluralize('билет', 1, RUModifier.DATIVE);
this.pluralizationService.pluralizeTemplate('{n} {билет|nominative}', 1);

use in templates

<div>{{ n }} {{ 'билет' | pluralize:1:'nominative' }}</div>
<div>{{ '{n} {билет|nominative}' | pluralizeTemplate:1 }}</div>

Contribute

Pull requests are always welcome.

Issues you can add here: https://github.com/new-inventor/smart_pluralization/issues

LICENCE

MIT

Package Sidebar

Install

npm i @new-inventor/pluralization

Weekly Downloads

2

Version

1.0.1

License

MIT

Unpacked Size

19.4 kB

Total Files

19

Last publish

Collaborators

  • newinventor