Skip to content Skip to footer

Dive into JavaScript’s Intl: A Developer’s Toolkit for Internationalization

Hey, coding aficionados! Ever found yourself in a pickle trying to make your app play nice with different locales? Well, saddle up because we’re diving into the magical world of JavaScript’s Intl object. This built-in feature is like your Swiss Army knife for internationalization, and I’m here to give you the lowdown.

What’s the Intl Object Anyway?

The Intl object is a namespace that JavaScript provides to enable language-sensitive string comparison, number formatting, and date and time formatting. It’s part of the ECMAScript Internationalization API, and guess what? It’s supported in all modern browsers, so you can breathe easy about compatibility.

Formatting Numbers Like a Pro

Let’s kick things off with number formatting. Whether you’re displaying currency, percentages, or just plain ol’ numbers, Intl.NumberFormat is your new best bud.

Basic Number Formatting

const numberFormatter = new Intl.NumberFormat('en-US');
console.log(numberFormatter.format(1234567.89)); // "1,234,567.89"

Currency Formatting

Got some moolah to show off? Here’s how to format currency like you mean business:

const currencyFormatter = new Intl.NumberFormat('en-US', {
  style: 'currency',
  currency: 'USD'
console.log(currencyFormatter.format(1234.56)); // "$1,234.56"

Percentage Formatting

And for those times when you need to show some stats:

const percentFormatter = new Intl.NumberFormat('en-US', {
  style: 'percent',
  maximumFractionDigits: 2
console.log(percentFormatter.format(0.1234)); // "12.34%"

Making Dates and Times Locale-Friendly

Next up, dates and times. Because nobody wants to get lost in translation when it comes to scheduling a global meetup.

Date Formatting

const dateFormatter = new Intl.DateTimeFormat('en-US');
console.log(dateFormatter.format(new Date())); // "12/31/2020"

Time Formatting

And for the time-conscious:

const timeFormatter = new Intl.DateTimeFormat('en-US', {
  hour: 'numeric',
  minute: 'numeric',
  second: 'numeric',
  timeZoneName: 'short'
console.log(timeFormatter.format(new Date())); // "11:32:45 PM PST"

Handling Multiple Locales

What if your audience is more global? No problemo. Intl.DateTimeFormat can handle multiple locales like a charm.

const multiLocaleFormatter = new Intl.DateTimeFormat(['en-GB', 'en-US']);
console.log(multiLocaleFormatter.format(new Date())); // "31/12/2020" or "12/31/2020"

Collation – Sorting Strings Correctly

Sorting strings isn’t always as simple as A, B, C. With Intl.Collator, you can sort strings according to the specific rules of a language.

Basic Collation

const collator = new Intl.Collator('de');
const words = ['äpfel', 'apples', 'aardvark'];

console.log(words); // ["aardvark", "apples", "äpfel"]

Getting Your Hands Dirty with Intl.PluralRules

Now, let’s talk about plurals. English is easy, but what about languages with multiple plural forms? Intl.PluralRules to the rescue!

const pluralRules = new Intl.PluralRules('ru');
console.log(; // "one"
console.log(; // "few"
console.log(; // "many"

Wrapping Up the First Half

Alright, code wranglers, that’s a wrap on the first half of our Intl deep dive. We’ve covered the basics of number and date/time formatting, collation, and plural rules. But there’s more to the Intl story, so stay tuned for the second half where we’ll talk about relative time formatting, list formatting, and some gotchas to watch out for.

Remember, internationalization is all about making your app accessible and user-friendly to a global audience. So, harness the power of Intl and make your app a worldly wise traveler. Catch you on the flip side for more Intl goodness!

Hey, global developers! Welcome back to the second half of our journey through JavaScript’s Intl object. We’ve already conquered the basics, but the adventure doesn’t stop there. Let’s dive into some of the more advanced features that will make your app a true citizen of the world.

Relative Time Formatting with Intl.RelativeTimeFormat

Keeping track of time is tough, especially when it’s relative. But fear not, Intl.RelativeTimeFormat is here to make sense of “yesterday”, “in two months”, or “3 hours ago”.

Basic Relative Time Formatting

const relativeTimeFormatter = new Intl.RelativeTimeFormat('en', { numeric: 'auto' });
console.log(relativeTimeFormatter.format(-1, 'day')); // "yesterday"
console.log(relativeTimeFormatter.format(2, 'month')); // "in 2 months"
console.log(relativeTimeFormatter.format(-3, 'hour')); // "3 hours ago"

Customizing with Options

You can even customize the output with options for a more precise or casual tone:

const relativeTimeFormatterVerbose = new Intl.RelativeTimeFormat('en', { numeric: 'always' });
console.log(relativeTimeFormatterVerbose.format(-1, 'day')); // "1 day ago"

List Formatting Like a Boss with Intl.ListFormat

Lists are everywhere, and formatting them correctly can be a pain. Enter Intl.ListFormat to save the day.

Formatting a Simple List

const listFormatter = new Intl.ListFormat('en', { style: 'long', type: 'conjunction' });
const movieGenres = ['Action', 'Adventure', 'Comedy'];
console.log(listFormatter.format(movieGenres)); // "Action, Adventure, and Comedy"

Different List Styles

You can tweak the style and type to suit your needs:

const listFormatterShort = new Intl.ListFormat('en', { style: 'short', type: 'disjunction' });
console.log(listFormatterShort.format(movieGenres)); // "Action, Adventure, or Comedy"

Handling Locale Negotiation

Sometimes, you need to be flexible with locale selection. Intl gracefully handles locale negotiation for you.

Fallback Locales

If you pass an array of locales, Intl will use the first one it supports:

const localeNegotiator = new Intl.NumberFormat(['es-ES', 'de-DE', 'en-US']);
console.log(localeNegotiator.format(123456.78)); // "123.456,78" or "123.456,78" or "123,456.78"

Gotchas and Edge Cases

While the Intl object is powerful, it’s not without its quirks. Here are some things to watch out for:

  • Browser Support: Although Intl is widely supported, older browsers might not be fully on board. Always check compatibility if you’re aiming for broad reach.
  • Performance: Creating new instances of Intl formatters can be costly. Reuse them whenever possible to keep your app zippy.
  • Data Size: The Intl API relies on locale data, which can be hefty. For node.js applications, consider using the full-icu npm package to ensure all locales are available.

Conclusion: Embrace the Power of Intl

And there you have it, folks! We’ve explored the depths of JavaScript’s Intl object and emerged with a treasure trove of internationalization tools. From formatting numbers and dates to handling plurals and lists, you’re now equipped to make your web applications shine in any locale.

As developers in an interconnected world, it’s our duty to ensure our apps speak everyone’s language. With the Intl object, you’ve got what it takes to create inclusive, user-friendly experiences for people from all corners of the globe.

So go ahead, put these Intl techniques into practice, and watch your app become the polyglot it was meant to be. Happy coding, and may your apps be as worldly as your ambitions!