
Product
Socket for Jira Is Now Available
Socket for Jira lets teams turn alerts into Jira tickets with manual creation, automated ticketing rules, and two-way sync.
Internationalization with easy syntax for node.js and browser.
Classic solutions use multiple phrases for plurals. Babelfish defines plurals
inline instead - that's more compact, and easy for programmers. Also, phrases
are grouped into nested scopes, like in Ruby.
BabelFish supports all plural rules from unicode CLDR
(via plurals-cldr).
node.js:
$ npm install babelfish
browser:
$ bower install babelfish
Use es5-shim for old browsers compatibility.
#{varname} Echoes value of variable((Singular|Plural1|Plural2)):count Plural formexample:
А у меня в кармане #{nails_count} ((гвоздь|гвоздя|гвоздей)):nails_countYou can also omit anchor variable for plurals, by default it will be count.
Thus following variants are equal:
I have #{count} ((nail|nails))I have #{count} ((nail|nails)):countAlso you can use variables in plural parts:
I have ((#{count} nail|#{count} nails))Need special zero form or overwrite any specific value? No problems:
I have ((=0 no nails|#{count} nail|#{count} nails))If you need #{, ((, | or )) somewhere in text, where it can be considered
as markup part - just escape them with \.
As BabelFish flatten scopes, it's really fun and nice to store translations in YAML files:
---
ru-RU:
profile: Профиль
forums: Форумы
apps:
forums:
new_topic: Новая тема
last_post:
title : Последнее сообщение
by : от
demo:
apples: "На столе лежит #{count} ((яблоко|яблока|яблок))"
// Create new instance of BabelFish with default language/locale: 'en-GB'
var BabelFish = require('babelfish');
var i18n = new BabelFish('en-GB');
// Fill in some phrases
i18n.addPhrase('en-GB', 'demo.hello', 'Hello, #{user.name}.');
i18n.addPhrase('en-GB', 'demo.conv.wazup', 'Whats up?');
i18n.addPhrase('en-GB', 'demo.conv.alright', 'Alright, man!');
i18n.addPhrase('en-GB', 'demo.coerce', 'Total: #{count}.');
i18n.addPhrase('ru-RU', 'demo.hello', 'Привет, #{user.name}.');
i18n.addPhrase('ru-RU', 'demo.conv.wazup', 'Как дела?');
i18n.addPhrase('uk-UA', 'demo.hello', 'Здоровенькі були, #{user.name}.');
// Set locale fallback to use the most appropriate translation when possible
i18n.setFallback('uk-UA', 'ru-RU');
// Translate
var params = {user: {name: 'ixti'}};
i18n.t('ru-RU', 'demo.hello', params); // -> 'Привет, ixti.'
i18n.t('ru-RU', 'demo.conv.wazup'); // -> 'Как дела?'
i18n.t('ru-RU', 'demo.conv.alright'); // -> 'Alright, man!'
i18n.t('uk-UA', 'demo.hello', params); // -> 'Здоровенькі були, ixti.'
i18n.t('uk-UA', 'demo.conv.wazup'); // -> 'Как дела?'
i18n.t('uk-UA', 'demo.conv.alright'); // -> 'Alright, man!'
// When params is number or strings, it will be coerced to
// `{ count: XXX, value: XXX }` - use any of those in phrase.
i18n.t('en-GB', 'demo.coerce', 5); // -> 'Total: 5.'
// You may wish to "dump" translations to load in browser later
// Dump will include all fallback translations and fallback rules
var locale_dump = i18n.stringify('ru-RU');
var i18n_new = require('babelfish')('en-GB'); // init without `new` also works
i18n_new.load(locale_dump);
// Use objects instead of strings (object/array/number/boolean) - can be
// useful to prepare bulk data for external libraries.
// Note, only JSON-supported types are ok (no date & regex)
i18n.addPhrase('en-GB', 'demo.boolean', true);
i18n.addPhrase('en-GB', 'demo.number', 123);
i18n.addPhrase('en-GB', 'demo.array', [1, 2, 3]);
// fourth param required for hashes (objects) to disable flattening,
// other types are autodetected
i18n.addPhrase('en-GB', 'demo.array', { foo:1, bar:"2" }, false);
View the LICENSE file (MIT).
FAQs
i18n with human friendly syntax
The npm package babelfish receives a total of 316 weekly downloads. As such, babelfish popularity was classified as not popular.
We found that babelfish demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Product
Socket for Jira lets teams turn alerts into Jira tickets with manual creation, automated ticketing rules, and two-way sync.

Company News
Socket won two 2026 Reppy Awards from RepVue, ranking in the top 5% of all sales orgs. AE Alexandra Lister shares what it's like to grow a sales career here.

Security News
NIST will stop enriching most CVEs under a new risk-based model, narrowing the NVD's scope as vulnerability submissions continue to surge.