Lean-Intl is a lean polyfill for
Intl-APIs for browsers which are not yet supporting this API. It's a
modern fork of Intl.js for modern development and tooling requirements.
In December 2012, ECMA International published the first edition of Standard ECMA-402, better known as the ECMAScript Internationalization API. This specification provides the framework to bring long overdue localization methods to ECMAScript implementations.
All modern browsers and NodeJS (except Safari <= 10 and IE <= 10) have implemented this API.
Lean-Intl fills the void of
availability for this API. It will provide the framework as described by the specification,
so that developers can take advantage of the native API
in environments that support it, or
Lean-Intl for legacy or unsupported environments.
See browser support on the official CanIUse Database for details
Changes compared to Intl.js
- Removed previous manual library publishing with preppy
- Updated ECMA Test Suite from 99 tests to 126 tests.
- Removed special IE8 support in test suite. We are focusing on >= IE10 and other modern browsers.
- Removed HTML output for test suite as we only test compatibility in NodeJS via CI.
- Removed Bower support. That's the past. Either use Webpack or Fusebox, please.
- Cleaned up Readme from old hints on using direct scripts and NodeJS support.
- Prettified source code using Prettier and ESLint.
- Cleaned up dependencies from all unused packages dramatically improving CI speed.
- Removed JSONP data.
- Removed "complete" UMD package which contains everything.
Lean Intl is meanted to be used by module bundlers. We are not offering any pre-built browser-ready scripts anymore. In todays landscape it's much better to rely on some kind of bundling for delivering your frontend goods.
- NodeJS is natively supporting Intl. Just make sure to install it with full ICU data for real i18n support. (On Mac this can be easily done via
brew install node --with-full-icu)
- For browsers install the package via NPM or Yarn. Then use tools like Webpack, Rollup or Parcel for bundling.
Current progress is as follows:
- All internal methods except for some that are implementation dependent
- Checking structural validity of language tags
- Canonicalizing the case and order of language subtags
- Locale Sensitive Functions of the ECMAScript Language Specification
- Implementation-dependent numbering system mappings
- Calendars other than Gregorian
- Support for time zones
- Collator objects (
Intl.Collator) (see below)
- Properties of the
A few of the implemented functions may currently be non-conforming and/or incomplete. Most of those functions have comments marked as 'TODO' in the source code.
What about Intl.Collator?
Intl.Collator implementation is no longer a goal of this project. There
are several reasons, including:
- The CLDR convertor does not automatically convert collation data to JSON
- The Unicode Collation Algorithm is more complicated that originally anticipated, and would increase the code size of Lean Intl too much.
Lean Intl is designed to be compatible with ECMAScript 3.1 environments in order to
follow the specification as closely as possible. However, some consideration is given
to legacy (ES3) environments, and the goal of this project is to at least provide a
working, albeit non-compliant implementation where ES5 methods are unavailable.
A subset of the tests in the test suite are run in IE 8. Tests that are not passable are skipped, but these tests are mostly about ensuring built-in function behavior.
Lean Intl uses the Unicode CLDR locale data, as recommended by the specification. The main
file contains no locale data itself. The
IntlPolyfill.__addLocaleData() method. Alternatively there is a JS data file available as well
for each locale which directly executes that code.
Contents of the
locale-data directory are a modified form of the Unicode CLDR
data found at http://www.unicode.org/cldr/.
RegExp cache / restore
Lean Intl attempts to cache and restore static RegExp properties before executing any
regular expressions in order to comply with ECMA-402. This process is imperfect,
and some situations are not supported. This behavior is not strictly necessary, and is only
required if the app depends on RegExp static properties not changing (which is highly
unlikely). To disable this functionality, invoke
- Pull requests and stars are always welcome.
- For bugs and feature requests, please create an issue.
- Pull requests must be accompanied by passing automated tests (
$ npm test).
This software is licensed under the MIT license. See the