Svelte goodies for val-i18n.
npm add val-i18n-svelte val-i18n value-enhancer
<I18nProvide> to set i18n context automatically (supports async loading).
setI18n to set i18n context manually.
useTranslate to get updated i18n.t$ observable.
useLang to get updated i18n.lang$ observable.
useI18n to get i18n$ observable.
<Trans> component to insert Svelte element into the translation message.
You can run the example in this repo by pnpm dev.
See live example on Svelte REPL.
Set i18n context in root component:
<script>
import { setI18n, useTranslate } from "val-i18n-svelte";
import { I18n } from "val-i18n";
const locales = { en: { apple: "apple" } };
const i18n = new I18n("en", locales);
setI18n(i18n);
</script>
<div>....</div>
Access i18n in descendent components (any level):
<script>
import { useTranslate, useLang, useI18n } from "val-i18n-svelte";
const t = useTranslate();
const lang = useLang();
const i18n = useI18n();
</script>
<div>{$t("apple")}</div>
<button on:click={() => $i18n.switchLang("zh")}>{$lang}</button>
Set i18n context in root component:
<script>
import { I18nProvider } from "val-i18n-svelte";
import { I18n } from "val-i18n";
const loader = I18n.preload("en", (lang) => import(`../locales/${lang}.json`));
</script>
<I18nProvider i18n={loader}>.....</I18nProvider>
Access i18n in descendent components (any level):
<script>
import { useTranslate, useLang, useI18n } from "val-i18n-svelte";
const t = useTranslate();
const lang = useLang();
const i18n = useI18n();
</script>
<div>{$t("apple")}</div>
<button on:click={() => $i18n.switchLang("zh")}>{$lang}</button>
If you need to access i18n in root component:
<I18nProvider let:t let:i18n let:lang>
<div>{t("apple")}</div>
<button on:click={() => i18n.switchLang("zh")}>{lang}</button>
</I18nProvider>
To insert Svelte elements into the translation message:
<script>
import { useTranslate, Trans } from "val-i18n-svelte";
/*
with locale:
{
visit: "Visit this address {{fruit}}.",
}
*/
const t = useTranslate();
</script>
<Trans message={$t("visit")}>
<a href="https://github.com/crimx/val-i18n-svelte">val-i18n-svelte</a>
</Trans>
↓Outputs:
Visit this address <a href="https://github.com/crimx/val-i18n-svelte">val-i18n-svelte</a>.
To inset multiple Svelte elements into the translate message, due to the limitation of Svelte (without dynamic slot name support), you need to use let:key to access the key of the placeholder. The key is the name of the placeholder in the translation message.
<script>
import { useTranslate, Trans } from "val-i18n-svelte";
/*
with locale:
{
author: "CRIMX",
fruit: "apple",
eat: "{{name}} eats {{fruit}}.",
}
*/
const t = useTranslate();
</script>
<Trans message={$t("eat")} let:key>
{#if key === "name"}
<strong>{$t("author")}</strong>
{:else if key === "fruit"}
<i>{$t("fruit")}</i>
{/if}
</Trans>
↓Outputs:
<strong>CRIMX</strong> eats <i>apple</i>.
You can add extra setI18n or <Ii18nProvider /> in descendent components to override the context. Only the descendent components of the new context will be affected.
This project is created by create-svelte.
Once you've created a project and installed dependencies with npm install (or pnpm install or yarn), start a development server:
npm run dev
# or start the server and open the app in a new browser tab
npm run dev -- --open
To create a production version of your app:
npm run build
You can preview the production build with npm run preview.