Vai al contenuto
JavaScript i18n

Internazionalizzazione JavaScript: internazionalizzazione nativa del browser con l'API Intl

JavaScript include l'API Intl come standard integrato per la formattazione di numeri, date ed elenchi, nonché per la gestione delle regole di pluralizzazione nelle diverse impostazioni locali. Non sono necessarie librerie esterne. L'API è supportata da tutti i browser moderni e da Node.js, fornendo fin da subito funzionalità di confronto delle stringhe in base alle impostazioni locali, segmentazione e formattazione dell'ora relativa.

Setup

Add i18n to plain JavaScript in three steps

There is no JavaScript-specific package to install: @better-i18n/core is the plain-JavaScript client every other SDK here wraps.

Install the client

One dependency-free package. It runs in browsers, Node, Deno, Bun and Cloudflare Workers.

terminalbash
npm install @better-i18n/core

# Zero dependencies. Runs in browsers, Node, Deno,
# Bun and Cloudflare Workers.

Create the client once

Instantiate at module scope so the 60-second in-memory cache is shared instead of rebuilt on every call.

i18n.jsjs
import { createI18nCore } from '@better-i18n/core'

export const i18n = createI18nCore({
  projectId: 'your-org/your-project', // Settings → General → Project ID
  defaultLocale: 'en',
})

Read a message

getMessages returns a plain nested object, so a four-line lookup helper is the whole runtime you need.

main.jsjs
import { i18n } from './i18n.js'

const messages = await i18n.getMessages('en')

// getMessages resolves to { namespace: { key: value } }
const t = (path) =>
  path.split('.').reduce((node, part) => node?.[part], messages) ?? path

document.querySelector('h1').textContent = t('home.title')

// Locales come from the project manifest, not a hardcoded array
const languages = await i18n.getLanguages()

How it works

Where a JavaScript string comes from

No build step and no bundled locale files: the client resolves a locale at runtime and the edge answers it.

Read path — every locale load

Your JavaScript app

Reads from the plain object getMessages() already returned.

0 network calls per render

@better-i18n/core

getMessages(locale) — served from the in-memory cache if it is warm.

60s TTL · 0 deps

CDN edge

Cloudflare worker answers from the nearest edge cache.

max-age=60 · always 200

R2 object store

The published translation files the sync worker wrote.

source of truth

Fallback chain — tried in order when a hop fails

1In-memory TTL cache
2CDN fetch, with timeout and one retry
3Persistent storage, if configured
4staticData bundled with the app
5Throw — after everything above missed

Write path — dashboard to app

AI or translator

Proposal reviewed in the dashboard, glossary enforced.

MCP · dashboard · CLI

Publish

Sync worker writes the locale files to R2.

better-i18n publish

CDN purge

Fire-and-forget purge of the affected keys and the manifest.

non-critical by design

Live in the app

The next getMessages() past the TTL returns the new copy.

~60s worst case

0dependencies in core
60scache TTL, client and edge
200CDN status, even on failure
5fallback layers before an error
Two ways

With the client, or with fetch

The client adds caching, retries and the fallback chain. If you would rather own that yourself, the CDN is a plain JSON endpoint.

locale.js
import { i18n } from './i18n.js'
import { normalizeLocale } from '@better-i18n/core'

let current = 'en'
let messages = await i18n.getMessages(current)

export async function setLocale(next) {
  // The CDN stores locales lowercased: pt-BR → pt-br
  current = normalizeLocale(next)
  messages = await i18n.getMessages(current)
  document.documentElement.lang = current
  render()
}
Formatting

L'API Intl di JavaScript in Pratica

Formatta valute, date e numeri ordinali utilizzando i costruttori Intl integrati con output specifico per locale in qualsiasi browser moderno o runtime Node.js.

format.jsjs
// Using the built-in Intl API
const formatter = new Intl.NumberFormat('de-DE', {
  style: 'currency',
  currency: 'EUR',
});
console.log(formatter.format(1234.56)); // "1.234,56 €"

// Date formatting
const date = new Intl.DateTimeFormat('ja-JP', {
  year: 'numeric',
  month: 'long',
  day: 'numeric',
});
console.log(date.format(new Date())); // "2026年3月2日"

// Pluralization
const plural = new Intl.PluralRules('en');
const suffixes = { one: 'st', two: 'nd', few: 'rd', other: 'th' };
function ordinal(n) {
  return `${n}${suffixes[plural.select(n)]}`;
}
Capabilities

Funzionalità dell'API Intl di JavaScript

API Intl integrata senza dipendenze esterne per le operazioni i18n di base
Intl.NumberFormat per la formattazione di valute, percentuali e unità in base al locale
Intl.DateTimeFormat per i modelli di visualizzazione di data e ora specifici per le impostazioni locali
Regole internazionali per la pluralizzazione degli ordinali e dei numerali cardinali in oltre 100 impostazioni locali
Sintassi ICU MessageFormat per messaggi complessi con plurali, selezioni e annidamenti
Intl.RelativeTimeFormat per date relative leggibili (es. "3 giorni fa")
Intl.ListFormat per elenchi di congiunzioni e disgiunzioni sensibili alle impostazioni locali
Collator internazionale per l'ordinamento e il confronto di stringhe in base alle impostazioni locali
Segmentatore internazionale per il rilevamento dei confini di parole, frasi e grafemi

Scopra altre guide sui framework

Get started

Iniziate oggi stesso con l'internazionalizzazione di JavaScript

Gestisci le traduzioni JavaScript con flussi di lavoro basati sull'AI, sincronizzazione CLI e distribuzione CDN in meno di 50ms.