Home

Awesome

Globalize

Build Status devDependency Status devDependency Status

A JavaScript library for internationalization and localization that leverage the official Unicode CLDR JSON data. The library works both for the browser and as a Node.js module.

About Globalize

Why globalization?

Each language, and the countries that speak that language, have different expectations when it comes to how numbers (including currency and percentages) and dates should appear. Obviously, each language has different names for the days of the week and the months of the year. But they also have different expectations for the structure of dates, such as what order the day, month and year are in. In number formatting, not only does the character used to delineate number groupings and the decimal portion differ, but the placement of those characters differ as well.

A user using an application should be able to read and write dates and numbers in the format they are accustomed to. This library makes this possible, providing an API to convert user-entered number and date strings - in their own format - into actual numbers and dates, and conversely, to format numbers and dates into that string format.

Even if the application deals only with the English locale, it may still need globalization to format programming language bytes into human-understandable language and vice-versa in an effective and reasonable way. For example, to display something better than "Edited 1 minutes ago".

Why Globalize?

Globalize provides number formatting and parsing, date and time formatting and parsing, currency formatting, message formatting (ICU message format pattern), and plural support.

Design Goals.

Globalize is based on the Unicode Consortium's Common Locale Data Repository (CLDR), the largest and most extensive standard repository of locale data available. CLDR is constantly updated and is used by many large applications and operating systems, so you'll always have access to the most accurate and up-to-date locale data.

Globalize needs CLDR content to function properly, although it doesn't embed, hard-code, or host such content. Instead, Globalize empowers developers to load CLDR data the way they want. Vanilla CLDR in its official JSON format (no pre-processing) is expected to be provided. As a consequence, (a) Globalize avoids bugs caused by outdated i18n content. Developers can use up-to-date CLDR data directly from Unicode as soon as it's released, without having to wait for any pipeline on our side. (b) Developers have full control over which locale coverage they want to provide on their applications. (c) Developers are able to share the same i18n dataset between Globalize and other libraries that leverage CLDR. There's no need for duplicating data.

Globalize is systematically tested against desktop and mobile browsers and Node.js. So, using it you'll get consistent results across different browsers and across browsers and the server.

Globalize doesn't use native Ecma-402 yet, which could potentially improve date and number formatting performance. Although Ecma-402 support is improving among modern browsers and even Node.js, the functionality and locale coverage level varies between different environments (see Comparing JavaScript Libraries slide 25). Globalize needs to do more research and testings to use it reliably.

For alternative libraries and more, check out this JavaScript globalization overview.

Migrating from Globalize 0.x

Are you coming from Globalize 0.x? Read our migration guide to learn what have changed and how to migrate older 0.x code to up-to-date 1.x.

Where to use it?

Globalize is designed to work both in the browser, or in Node.js. It supports both AMD and CommonJS.

Where does the data come from?

Globalize uses the Unicode CLDR, the largest and most extensive standard repository of locale data.

We do NOT embed any i18n data within our library. However, we make it really easy to use. Read How to get and load CLDR JSON data for more information on its usage.

Pick the modules you need

FileMinified + gzipped sizeRuntime minified + gzipped sizeSummary
globalize.js1.5KB1.0KBCore library
globalize/currency.js2.6KB0.6KBCurrency module provides currency formatting and parsing
globalize/date.js5.1KB3.8KBDate module provides date formatting and parsing
globalize/message.js5.4KB0.7KBMessage module provides ICU message format support
globalize/number.js3.1KB1.8KBNumber module provides number formatting and parsing
globalize/plural.js2.3KB0.4KBPlural module provides pluralization support
globalize/relative-time.js0.8KB0.6KBRelative time module provides relative time formatting support
globalize/unit.js0.9KB0.5KBUnit module provides unit formatting support

Browser Support

Globalize 1.x supports the following browsers:

(Current - 1) or Current denotes that we support the current stable version of the browser and the version that preceded it. For example, if the current version of a browser is 24.x, we support the 24.x and 23.x versions.

IE 8 is supported, but it depends on the polyfill of the ES5 methods below, for which we suggest using es5-shim. Alternatives or more information can be found at Modernizr's polyfills list.

Getting Started

Requirements

1. Dependencies

You need to satisfy Globalize dependencies prior to using it. The good news is, there is only one. It's the cldr.js, which is a CLDR low level manipulation tool.

If you use a package manager like bower or npm, you don't need to worry about it. If this isn't the case, then you need to manually download cldr.js yourself. Check the Hello World examples for more information.

2. CLDR content

Globalize is the i18n software (the engine). Unicode CLDR is the i18n content (the fuel). You need to feed Globalize on the appropriate portions of CLDR prior to using it.

(a) How do I figure out which CLDR portions are appropriate for my needs?

Each Globalize function requires a special set of CLDR portions. Once you know which Globalize functionalities you need, you can deduce its respective CLDR requirements. See table below.

ModuleRequired CLDR JSON files
Core modulecldr/supplemental/likelySubtags.json
Currency modulecldr/main/locale/currencies.json<br>cldr/supplemental/currencyData.json<br>+CLDR JSON files from number module<br>+CLDR JSON files from plural module for name style support
Date modulecldr/main/locale/ca-gregorian.json<br>cldr/main/locale/timeZoneNames.json<br>cldr/supplemental/timeData.json<br>cldr/supplemental/weekData.json<br>+CLDR JSON files from number module
Number modulecldr/main/locale/numbers.json<br>cldr/supplemental/numberingSystems.json
Plural modulecldr/supplemental/plurals.json (for cardinals)<br>cldr/supplemental/ordinals.json (for ordinals)
Relative time modulecldr/main/locale/dateFields.json<br>+CLDR JSON files from number and plural modules
Unit modulecldr/main/locale/units.json<br>+CLDR JSON files from number and plural module

As an alternative to deducing this yourself, use this online tool. The tool allows you to select the modules you're interested in using and tells you the Globalize files and CLDR JSON that you need.

(b) How am I supposed to get and load CLDR content?

Learn how to get and load CLDR content....

Installation

By downloading a ZIP or a TAR.GZ...

Click the github releases tab and download the latest available Globalize package.

By using a package manager...

Use bower bower install globalize, or npm npm install globalize cldr-data.

By using source files...

  1. git clone https://github.com/jquery/globalize.git.
  2. Build the distribution files.

Usage

Globalize's consumable-files are located in the ./dist directory. If you don't find it, it's because you are using a development branch. You should either use a tagged version or build the distribution files yourself. Read installation above if you need more information on how to download.

Globalize can be used for a variety of different i18n tasks, eg. formatting or parsing dates, formatting or parsing numbers, formatting messages, etc. You may NOT need Globalize in its entirety. For that reason, we made it modular. So, you can cherry-pick the pieces you need, eg. load dist/globalize.js to get Globalize core, load dist/globalize/date.js to extend Globalize with Date functionalities, etc.

An example is worth a thousand words. Check out our Examples section below.

Performance

When formatting or parsing, there's actually a two-step process: (a) the formatter (or parser) creation and (b) its execution, where creation takes an order of magnitude more time (more expensive) than execution. In the creation phase, Globalize traverses the CLDR tree, processes data (e.g., expands date patterns, parses plural rules, etc), and returns a function that actually executes the formatting or parsing.

// Formatter creation.
var formatter = Globalize.numberFormatter();

// Formatter execution (roughly 10x faster than above).
formatter( Math.PI );
// > 3.141

As a rule of thumb for optimal performance, cache your formatters and parsers. For example: (a) on iterations, generate them outside the loop and reuse while looping; (b) on server applications, generate them in advance and execute when requests arrive.

Compilation and the Runtime modules

Take advantage of compiling your formatters and/or parsers during build time when deploying to production. It's much faster than generating them in real-time and it's also much smaller (i.e., better loading performance).

Your compiled formatters and parsers allow you to skip a big part of the library and also allow you to skip loading CLDR data, because they have already been created (see Performance above for more information).

To illustrate, see our Basic Globalize Compiler example.

Globalize Compiler

For information about the Globalize Compiler CLI or its JavaScript API, see the Globalize Compiler documentation.

Examples

The fastest and easiest way to use Globalize is by integrating it into your existing tools.

If you're using a different tool than the one above, but you're comfortable using JavaScript modules (such as ES6 modules, CommonJS, or AMD) and package managers like npm or bower, you may want to check out the following examples. Note you'll need to compile your code for production yourself.

If you're using none of the tools above, but instead you're using the plain and old script tags only, the following example may interest you. Note Globalize allows you to go low level like this. But, acknowledge that you'll need to handle dependencies and CLDR loading manually yourself.

API

Core module

Date module

Message module

Number module

Currency module

Plural module

Relative time module

Returns a function that formats a relative time according to the given unit, options, and the default/instance locale.

.relativeTimeFormatter( "day" )( 1 )
// > "tomorrow"

.relativeTimeFormatter( "month" )( -1 )
// > "last month"

.relativeTimeFormatter( "month" )( 3 )
// > "in 3 months"

Read more...

Unit module

Error reference

CLDR Errors

Read more...

Parameter Errors

Other Errors

Contributing

If you are having trouble using Globalize after reading the documentation carefully, please post a question to StackOverflow with the "javascript-globalize" tag. Questions that include a minimal demo are more likely to receive responses.

In the spirit of open source software development, we always encourage community code contribution. To help you get started and before you jump into writing code, be sure to read CONTRIBUTING.md.

For ideas where to start contributing, see the following queries to find what best suites your interest: quick changes, new features, bug fixes, documentation improvements, date module, currency module, message module, number module, plural module, relative time module. Last but not least, feel free to get in touch.

Roadmap

Our roadmap is the collection of all open issues and pull requests where you can find:

Development

File structure

├── bower.json (metadata file)
├── CONTRIBUTING.md (doc file)
├── dist/ (consumable files, the built files)
├── external/ (external dependencies, eg. cldr.js, QUnit, RequireJS)
├── Gruntfile.js (Grunt tasks)
├── LICENSE.txt (license file)
├── package.json (metadata file)
├── README.md (doc file)
├── src/ (source code)
│   ├── build/ (build helpers, eg. intro, and outro)
│   ├── common/ (common function helpers across modules)
│   ├── core.js (core module)
│   ├── date/ (date source code)
│   ├── date.js (date module)
│   ├── message.js (message module)
│   ├── number.js (number module)
│   ├── number/ (number source code)
│   ├── plural.js (plural module)
│   ├── plural/ (plural source code)
│   ├── relative-time.js (relative time module)
│   ├── relative-time/ (relative time source code)
│   ├── unit.js (unit module)
│   ├── unit/ (unit source code)
│   └── util/ (basic JavaScript helpers polyfills, eg array.map)
└── test/ (unit and functional test files)
    ├── fixtures/ (CLDR fixture data)
    ├── functional/ (functional tests)
    ├── functional.html
    ├── functional.js
    ├── unit/ (unit tests)
    ├── unit.html
    └── unit.js

Source files

The source files are as granular as possible. When combined to generate the build file, all the excessive/overhead wrappers are cut off. It's following the same build model of jQuery and Modernizr.

Core, and all modules' public APIs are located in the src/ directory, ie. core.js, date.js, message.js, number.js, and plural.js.

Install development external dependencies

Install Grunt and external dependencies. First, install the grunt-cli and bower packages if you haven't before. These should be installed globally (like this: npm install -g grunt-cli bower). Then:

npm install && bower install

Tests

Tests can be run either in the browser or using Node.js (via Grunt) after having installed the external development dependencies (for more details, see above).

Unit tests

To run the unit tests, run grunt test:unit, or run grunt connect:keepalive and open http://localhost:9001/test/unit.html in a browser (or http://localhost:9001/test/unit-es5-shim.html for IE8). It tests the very specific functionality of each function (sometimes internal/private).

The goal of the unit tests is to make it easy to spot bugs, easy to debug.

Functional tests

To run the functional tests, create the dist files by running grunt. Then, run grunt test:functional, or open http://localhost:9001/test/functional.html in a browser (or http://localhost:9001/test/functional-es5-shim.html for IE8). Note that grunt will automatically run unit and functional tests for you to ensure the built files are safe.

The goal of the functional tests is to ensure that everything works as expected when it is combined.

Build

Build the distribution files after having installed the external development dependencies (for more details, see above).

grunt