Ship in any language
Add translations to your Svelte 5 app in under a minute.
pnpm add @nomideusz/svelte-i18nLive preview
myapp.com
Welcome back, Jan!
Runes-native
Built on $state. Reactivity just works.
Tiny
Under 150 lines of TypeScript, zero runtime deps.
Flat keys
Simple JSON files your translators will love.
You have 7 new notifications.
Total: 129 PLN
Try it:
1. i18n.t()
Result (current locale:
en) Welcome back, Jan! Placeholders the translation needs
name
1½. Plurals — t(key, { count })
t('school', { count: 5 }) — locale
en 5 schools 2. interpolate()
Result
Hello Jan, you have 3 unread messages.Placeholders detected
namecount
3. <LocaleSwitcher />
With labels
Without labels (code only)
Translated accessible name (
label) <script>
import { LocaleSwitcher } from '@nomideusz/svelte-i18n';
import { i18n } from '#lib/i18n';
</script>
<LocaleSwitcher {i18n} labels={{ en: 'English', pl: 'Polski' }} />4. URL routing
extractLocale → locale
enextractLocale → pathname
/blog/yoga-for-beginners?utm_source=demolocalizeHref per locale
en:
/blog/yoga-for-beginners?utm_source=demopl: /pl/blog/yoga-for-beginners?utm_source=demode: /de/blog/yoga-for-beginners?utm_source=demouk: /ua/blog/yoga-for-beginners?utm_source=demoalternates() →
<svelte:head> markup <link rel="alternate" hreflang="en" href="https://example.com/blog/yoga-for-beginners?utm_source=demo" /> <link rel="alternate" hreflang="pl" href="https://example.com/pl/blog/yoga-for-beginners?utm_source=demo" /> <link rel="alternate" hreflang="de" href="https://example.com/de/blog/yoga-for-beginners?utm_source=demo" /> <link rel="alternate" hreflang="uk" href="https://example.com/ua/blog/yoga-for-beginners?utm_source=demo" /> <link rel="alternate" hreflang="x-default" href="https://example.com/blog/yoga-for-beginners?utm_source=demo" />
5. formatDateTime() · formatMoney() · intlLocale()
Per locale —
intlLocale · formatDateTime · formatMoney en → en-GB
Monday, 15 June 2026 at 20:00 PLN 90.00en-US → en-US
Monday, June 15, 2026 at 08:00 PM PLN 90.00pl → pl-PL
poniedziałek, 15 czerwca 2026 20:00 90,00 złde → de
Montag, 15. Juni 2026 um 20:00 90,00 PLNuk → uk-UA
понеділок, 15 червня 2026 р. о 20:00 90,00 PLNimport { formatDateTime, formatMoney, intlLocale } from '@nomideusz/svelte-i18n';
formatDateTime(date, 'en', 'Europe/Warsaw'); // "Monday, 15 June 2026 at 18:00"
formatMoney(9000, 'PLN', 'pl'); // "90,00 zł" — integer minor units in
formatMoney(9000, 'JPY', 'en'); // "JP¥9,000" — JPY has no minor unit
intlLocale('en'); // "en-GB"Read the full docs for the complete API.