@radicalstorage-lingo/sdk
v0.1.0
Published
Build-time typed accessor for Lingo translations — works over bundled JSON, no runtime fetch.
Maintainers
Readme
@radicalstorage-lingo/sdk
A tiny, build-time typed accessor over your bundled translation JSON (the
files lingo pull writes). No network, no runtime fetch — messages are
formatted with ICU via intl-messageformat.
Install
npm i @radicalstorage-lingo/sdkreact and i18next are optional peer dependencies, only required if you
use the @radicalstorage-lingo/sdk/react or @radicalstorage-lingo/sdk/i18next entries.
Core: createTranslator
import { createTranslator } from '@radicalstorage-lingo/sdk';
import en from './messages/en.json';
const t = createTranslator({
messages: en, // flat or nested; nested is flattened to dotted keys
language: 'en', // drives ICU plural/number/date formatting
onMissing: (key) => key, // optional; default returns the key
});
t.t('home.title', { name: 'Ada' });
t.t('cart.items', { count: 3 }); // "3 items"
t.has('home.title'); // booleanCompiled ICU messages are cached per key.
React: @radicalstorage-lingo/sdk/react
import { LingoProvider, useTranslations } from '@radicalstorage-lingo/sdk/react';
import en from './messages/en.json';
function App() {
return (
<LingoProvider messages={en} language="en">
<Hero />
</LingoProvider>
);
}
function Hero() {
const { t } = useTranslations('home'); // namespace is prefixed onto keys
return <h1>{t('title', { name: 'Ada' })}</h1>;
}i18next: @radicalstorage-lingo/sdk/i18next
Already use i18next? Shape pulled bundles into its resources (build-time,
no custom backend):
import i18next from 'i18next';
import { toI18nextResources } from '@radicalstorage-lingo/sdk/i18next';
import en from './messages/en.json';
import fr from './messages/fr.json';
await i18next.init({
lng: 'en',
resources: toI18nextResources([
{ language: 'en', namespace: 'translation', messages: en },
{ language: 'fr', namespace: 'translation', messages: fr },
]),
});Types
lingo pull (from @radicalstorage-lingo/cli) writes .lingo/types.ts — a LingoMessages
interface (key → variable shape) and a LingoKey union — so you can type
your keys and interpolation args.
License
MIT
