UNPKG

@nanostores/i18n

Version:

A tiny (≈600 bytes) i18n library for React/Preact/Vue/Svelte

97 lines (78 loc) 3.04 kB
# Nano Stores I18n <img align="right" width="92" height="92" title="Nano Stores logo" src="https://nanostores.github.io/nanostores/logo.svg"> Tiny and flexible JS library to make your web application translatable. Uses [Nano Stores] state manager and [JS Internationalization API]. * **Small.** Around 1 KB (minified and brotlied). Zero dependencies. * Works with **React**, **Preact**, **Vue**, **Svelte**, and plain JS. * Supports **tree-shaking** and translation **on-demand download**. * **Plain flat JSON** translations compatible with online translation services like [Weblate]. * Out of the box **TypeScript** support for translations. * **Flexible variable translations**. You can change translation, for instance, depends on screen size. ```tsx // components/post.jsx import { params, count } from '@nanostores/i18n' // You can use own functions import { useStore } from '@nanostores/react' import { i18n, format } from '../stores/i18n.js' export const messages = i18n('post', { title: 'Post details', published: params('Was published at {at}'), // TypeScript will get `at` type comments: count({ one: '{count} comment', many: '{count} comments' }) }) export const Post = ({ author, comments, publishedAt }) => { const t = useStore(messages) const { time } = useStore(format) return <article> <h1>{t.title}</h1> <p>{t.published({ at: time(publishedAt) })}</p> <p>{t.comments(comments.length)}</p> </article> } ``` ```ts // stores/i18n.js import { createI18n, localeFrom, browser, formatter } from '@nanostores/i18n' import { persistentAtom } from '@nanostores/persistent' export const setting = persistentAtom<string | undefined>('locale', undefined) export const locale = localeFrom( setting, // User’s locale from localStorage browser({ // or browser’s locale auto-detect available: ['en', 'fr', 'ru'], fallback: 'en' }) ) export const format = formatter(locale) export const i18n = createI18n(locale, { get (code) { return fetchJSON(`/translations/${code}.json`) } }) ``` ```js // public/translations/ru.json { "post": { "title": "Данные о публикации", "published": "Опубликован {at}", "comments": { "one": "{count} комментарий", "few": "{count} комментария", "many": "{count} комментариев", } }, // Translations for all other components } ``` [JS Internationalization API]: https://hacks.mozilla.org/2014/12/introducing-the-javascript-internationalization-api/ [Nano Stores]: https://github.com/nanostores/nanostores [Weblate]: https://weblate.org/ --- <img src="https://cdn.evilmartians.com/badges/logo-no-label.svg" alt="" width="22" height="16" /> Made at <b><a href="https://evilmartians.com/devtools?utm_source=nanostores-i18n&utm_campaign=devtools-button&utm_medium=github">Evil Martians</a></b>, product consulting for <b>developer tools</b>. --- ## Docs Read full docs **[here](https://github.com/nanostores/i18n#readme)**.