Research
Security News
Threat Actor Exposes Playbook for Exploiting npm to Build Blockchain-Powered Botnets
A threat actor's playbook for exploiting the npm ecosystem was exposed on the dark web, detailing how to build a blockchain-powered botnet.
node-polyglot
Advanced tools
node-polyglot is a lightweight internationalization library for JavaScript, designed to handle translation and pluralization of strings. It is particularly useful for applications that need to support multiple languages and locales.
Basic Translation
This feature allows you to define and retrieve translations for specific phrases. The `t` method is used to fetch the translated string.
const Polyglot = require('node-polyglot');
const polyglot = new Polyglot({ phrases: { 'hello': 'Hello' } });
console.log(polyglot.t('hello')); // Output: Hello
Interpolation
Interpolation allows you to insert dynamic values into your translated strings. The placeholders in the phrases are replaced with the provided values.
const Polyglot = require('node-polyglot');
const polyglot = new Polyglot({ phrases: { 'hello_name': 'Hello, %{name}' } });
console.log(polyglot.t('hello_name', { name: 'John' })); // Output: Hello, John
Pluralization
Pluralization allows you to handle singular and plural forms of words based on a count. The `smart_count` variable is used to determine which form to use.
const Polyglot = require('node-polyglot');
const polyglot = new Polyglot({ phrases: { 'num_cars': '%{smart_count} car |||| %{smart_count} cars' } });
console.log(polyglot.t('num_cars', { smart_count: 1 })); // Output: 1 car
console.log(polyglot.t('num_cars', { smart_count: 2 })); // Output: 2 cars
Locale Switching
Locale switching allows you to change the language of your application dynamically. You can extend the phrases for the new locale and switch to it using the `locale` method.
const Polyglot = require('node-polyglot');
const polyglot = new Polyglot({ phrases: { 'hello': 'Hello' }, locale: 'en' });
polyglot.locale('es');
polyglot.extend({ 'hello': 'Hola' });
console.log(polyglot.t('hello')); // Output: Hola
i18next is a powerful internationalization framework for JavaScript that supports translation, interpolation, and pluralization. It offers more advanced features like nested translations, context-based translations, and language detection. Compared to node-polyglot, i18next is more feature-rich and suitable for larger applications.
react-intl is a library specifically designed for internationalizing React applications. It provides components and APIs for formatting dates, numbers, and strings, as well as handling pluralization and translations. While node-polyglot is more general-purpose, react-intl is tailored for React, making it a better choice for React-based projects.
vue-i18n is an internationalization plugin for Vue.js applications. It offers features like translation, pluralization, and locale management, similar to node-polyglot. However, vue-i18n is specifically designed for Vue.js, providing seamless integration with Vue components and the Vue ecosystem.
Polyglot.js is a tiny I18n helper library written in JavaScript, made to work both in the browser and in CommonJS environments (Node). It provides a simple solution for interpolation and pluralization, based off of Airbnb’s experience adding I18n functionality to its Backbone.js and Node apps.
I18n is incredibly important for us at Airbnb, as we have listings in 192 countries, and we translate our site into 30-odd different languages. We’re also hiring talented engineers to help us scale up to meet the challenges of building a global marketplace.
View the documentation on Github.
View the annotated source.
Polyglot is agnostic to your translation backend. It doesn’t perform any translation; it simply gives you a way to manage translated phrases from your client- or server-side JavaScript application.
install with npm:
$ npm install node-polyglot
Clone the repo, run npm install
, and npm test
.
First, create an instance of the Polyglot
class, which you will use for translation.
var polyglot = new Polyglot();
Polyglot is class-based so you can maintain different sets of phrases at the same time, possibly in different locales. This is very useful for example when serving requests with Express, because each request may have a different locale, and you don’t want concurrent requests to clobber each other’s phrases.
See Options Overview for information about the options object you can choose to pass to new Polyglot
.
Tell Polyglot what to say by simply giving it a phrases object, where the key is the canonical name of the phrase and the value is the already-translated string.
polyglot.extend({
"hello": "Hello"
});
polyglot.t("hello");
=> "Hello"
You can also pass a mapping at instantiation, using the key phrases
:
var polyglot = new Polyglot({phrases: {"hello": "Hello"}});
Polyglot doesn’t do the translation for you. It’s up to you to give it the proper phrases for the user’s locale.
A common pattern is to gather a hash of phrases in your backend, and output
them in a <script>
tag at the bottom of the document. For example, in Rails:
app/controllers/home_controller.rb
def index
@phrases = {
"home.login" => I18n.t("home.login"),
"home.signup" => I18n.t("home.signup"),
...
}
end
app/views/home/index.html.erb
<script>
var polyglot = new Polyglot({phrases: <%= raw @phrases.to_json %>});
</script>
And now you can utilize i.e. polyglot.t("home.login")
in your JavaScript application
or Handlebars templates.
Polyglot.t()
also provides interpolation. Pass an object with key-value pairs of
interpolation arguments as the second parameter.
polyglot.extend({
"hello_name": "Hola, %{name}."
});
polyglot.t("hello_name", {name: "DeNiro"});
=> "Hola, DeNiro."
Polyglot also supports nested phrase objects.
polyglot.extend({
"nav": {
"hello": "Hello",
"hello_name": "Hello, %{name}",
"sidebar": {
"welcome": "Welcome"
}
}
});
polyglot.t("nav.sidebar.welcome");
=> "Welcome"
The substitution variable syntax is customizable.
var polyglot = new Polyglot({
phrases: {
"hello_name": "Hola {{name}}"
},
interpolation: {prefix: '{{', suffix: '}}'}
});
polyglot.t("hello_name", {name: "DeNiro"});
=> "Hola, DeNiro."
For pluralization to work properly, you need to tell Polyglot what the current locale is. You can use polyglot.locale("fr")
to set the locale to, for example, French. This method is also a getter:
polyglot.locale()
=> "fr"
You can also pass this in during instantiation.
var polyglot = new Polyglot({locale: "fr"});
Currently, the only thing that Polyglot uses this locale setting for is pluralization.
Polyglot provides a very basic pattern for providing pluralization based on a single string that contains all plural forms for a given phrase. Because various languages have different nominal forms for zero, one, and multiple, and because the noun can be before or after the count, we have to be overly explicit about the possible phrases.
To get a pluralized phrase, still use polyglot.t()
but use a specially-formatted phrase string that separates the plural forms by the delimiter ||||
, or four vertical pipe characters.
For pluralizing "car" in English, Polyglot assumes you have a phrase of the form:
polyglot.extend({
"num_cars": "%{smart_count} car |||| %{smart_count} cars",
});
Please keep in mind that smart_count
is required. No other option name is taken into account to transform pluralization strings.
In English (and German, Spanish, Italian, and a few others) there are only two plural forms: singular and not-singular.
Some languages get a bit more complicated. In Czech, there are three separate forms: 1, 2 through 4, and 5 and up. Russian is even more involved.
var polyglot = new Polyglot({locale: "cs"}); // Czech
polyglot.extend({
"num_foxes": "Mám %{smart_count} lišku |||| Mám %{smart_count} lišky |||| Mám %{smart_count} lišek"
})
polyglot.t()
will choose the appropriate phrase based on the provided smart_count
option, whose value is a number.
polyglot.t("num_cars", {smart_count: 0});
=> "0 cars"
polyglot.t("num_cars", {smart_count: 1});
=> "1 car"
polyglot.t("num_cars", {smart_count: 2});
=> "2 cars"
As a shortcut, you can also pass a number to the second parameter:
polyglot.t("num_cars", 2);
=> "2 cars"
Polyglot provides some default pluralization rules for some locales. You can specify a different set of rules through the pluralRules
constructor param.
var polyglot = new Polyglot({
pluralRules: {
pluralTypes: {
germanLike: function (n) {
// is 1
if (n === 1) {
return 0;
}
// everything else
return 1;
},
frenchLike: function (n) {
// is 0 or 1
if (n <= 1) {
return 0;
}
// everything else
return 1;
}
},
pluralTypeToLanguages: {
germanLike: ['de', 'en', 'xh', 'zu'],
frenchLike: ['fr', 'hy']
}
}
});
This can be useful to support locales that polyglot does not support by default or to change the rule definitions.
The most-used method. Provide a key, and t()
will return the phrase.
polyglot.t("hello");
=> "Hello"
The phrase value is provided first by a call to polyglot.extend()
or polyglot.replace()
.
Pass in an object as the second argument to perform interpolation.
polyglot.t("hello_name", {name: "Spike"});
=> "Hello, Spike"
Pass a number as the second argument as a shortcut to smart_count
:
// same as: polyglot.t("car", {smart_count: 2});
polyglot.t("car", 2);
=> "2 cars"
If you like, you can provide a default value in case the phrase is missing. Use the special option key "_" to specify a default.
polyglot.t("i_like_to_write_in_language", {
_: "I like to write in %{language}.",
language: "JavaScript"
});
=> "I like to write in JavaScript."
Use extend
to tell Polyglot how to translate a given key.
polyglot.extend({
"hello": "Hello",
"hello_name": "Hello, %{name}"
});
The key can be any string. Feel free to call extend
multiple times; it will override any phrases with the same key, but leave existing phrases untouched.
Use unset
to selectively remove keys from a polyglot instance.
unset
accepts one argument: either a single string key, or an object whose keys are string keys, and whose values are ignored unless they are nested objects (in the same format).
Example:
polyglot.unset('some_key');
polyglot.unset({
hello: 'Hello',
hello_name: 'Hello, %{name}',
foo: {
bar: 'This phrase’s key is "foo.bar"'
}
});
Get or set the locale (also can be set using the constructor option, which is used only for pluralization. If a truthy value is provided, it will set the locale. Afterwards, it will return it.
Clears all phrases. Useful for special cases, such as freeing up memory if you have lots of phrases but no longer need to perform any translation. Also used internally by replace
.
Completely replace the existing phrases with a new set of phrases.
Normally, just use extend
to add more phrases, but under certain circumstances, you may want to make sure no old phrases are lying around.
Returns true
if the key does exist in the provided phrases, otherwise it will return false
.
Takes a phrase string and transforms it by choosing the correct plural form and interpolating it. This method is used internally by t.
The correct plural form is selected if substitutions.smart_count is set.
You can pass in a number instead of an Object as substitutions
as a shortcut for smart_count
.
You should pass in a third argument, the locale, to specify the correct plural type. It defaults to 'en'
which has 2 plural forms.
new Polyglot
accepts a number of options:
phrases
: a key/value map of translated phrases. See Translation.locale
: a string describing the locale (language and region) of the translation, to apply pluralization rules. see PluralizationallowMissing
: a boolean to control whether missing keys in a t
call are allowed. If false
, by default, a missing key is returned and a warning is issued.onMissingKey
: if allowMissing
is true
, and this option is a function, then it will be called instead of the default functionality. Arguments passed to it are key
, options
, and locale
. The return of this function will be used as a translation fallback when polyglot.t('missing.key')
is called (hint: return the key).interpolation
: an object to change the substitution syntax for interpolation by setting the prefix
and suffix
fields.pluralRules
: an object of pluralTypes
and pluralTypeToLanguages
to control pluralization logic.FAQs
Give your JavaScript the ability to speak many languages.
The npm package node-polyglot receives a total of 153,730 weekly downloads. As such, node-polyglot popularity was classified as popular.
We found that node-polyglot demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 6 open source maintainers 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.
Research
Security News
A threat actor's playbook for exploiting the npm ecosystem was exposed on the dark web, detailing how to build a blockchain-powered botnet.
Security News
NVD’s backlog surpasses 20,000 CVEs as analysis slows and NIST announces new system updates to address ongoing delays.
Security News
Research
A malicious npm package disguised as a WhatsApp client is exploiting authentication flows with a remote kill switch to exfiltrate data and destroy files.