快速開始
SvelteKit
本頁示範 Intor 在 SvelteKit 專案中的最小整合流程。
安裝
本範例以 SvelteKit minimal 模板為基礎,建立方式可參考官方文件:SvelteKit 。
安裝 Intor:
npm install intoryarn add intorpnpm add intorbun add intor
安裝完成後,需調整 vite.config.ts,以確保 Intor 在 SSR 環境中能被正確打包與執行。
export default defineConfig({ plugins: [sveltekit()], ssr: { noExternal: ["intor"] }, // Ensure Intor is bundled for SSR });
專案結構
index.jsonUindex.jsonU+layout.server.tsU+layout.svelteM+page.svelteMintor-config.tsUapp.d.tsMapp.htmlMhooks.server.tsU
整合步驟
♯1 翻譯內容
在專案中建立 messages 資料夾,並依語系建立子資料夾,每個語系提供一個 index.json。
index.jsonUindex.jsonU
{ "hello": "Hello, {name}", "rich": "A <tag>text</tag>." }
{ "hello": "Bonjour, {name}", "rich": "Un <tag>texte</tag>." }
♯2 設定檔
在 src/lib/ 下建立 i18n/ 資料夾,並於其中建立 intor-config.ts。
本範例採用最基本的翻譯內容載入方式,直接將 messages 定義於設定檔中。
詳見:載入翻譯內容
intor-config.tsU
import { defineIntorConfig } from "intor"; import EN from "../../../messages/en/index.json"; import FR from "../../../messages/fr/index.json"; export const intorConfig = defineIntorConfig({ defaultLocale: "en", supportedLocales: ["en", "fr"], messages: { en: EN, fr: FR, }, });
♯3 初始化
- 在
src/下建立hooks.server.ts,用於處理請求流程。
hooks.server.tsU
import { createIntorHandler } from "intor/svelte-kit"; import { intorConfig } from "$lib/i18n/intor-config"; export const handle = createIntorHandler(intorConfig);
- 修改
app.d.ts,補齊相關型別定義。
app.d.tsM
import type { InboundContext } from "intor"; declare global { namespace App { interface Locals { intor: InboundContext; } } } export {};
- 修改
app.html,設定語言屬性佔位。
app.htmlM
// ... <html lang="%lang%"> // ...
- 在
src/routes/下建立+layout.server.ts,並呼叫intor()初始化翻譯系統。
+layout.server.tsU
import { intor } from "intor/server"; import { intorConfig } from "$lib/i18n/intor-config"; export const load = async ({ locals, fetch }) => { const intorValue = await intor(intorConfig, locals.intor.locale, { fetch }); return { intorValue }; };
- 修改
+layout.svelte,使用IntorProvider包裹整個應用。
+layout.svelteM
<script lang="ts"> import favicon from "$lib/assets/favicon.svg"; import { IntorProvider } from "intor/svelte"; let { children, data } = $props(); </script> <svelte:head> <link rel="icon" href={favicon} /> </svelte:head> <IntorProvider value={data.intorValue}> {@render children()} </IntorProvider>
使用範例
透過 useTranslator 取得翻譯相關能力:
t:取得對應文字tRich:渲染包含語意 tag 的結構化翻譯內容
透過 useNavigation 取得導航相關能力:
goto:負責處理頁面導航與語系切換
+page.svelteM
<script lang="ts"> import { useTranslator } from "intor/svelte"; import { useNavigation } from "intor/svelte-kit"; const { t, tRich } = useTranslator(); const { goto } = useNavigation(); </script> <p>{$t("hello", { name: "Intor" })}</p> <p>{@html $tRich("rich", { tag: (children) => `<b>${children}</b>` })}</p> <button onclick={() => goto("/", { locale: "en" })}>English</button> <button onclick={() => goto("/", { locale: "fr" })}>French</button>
Server-side
於 server-side 中,也可以透過 getTranslator() 取得相同的翻譯能力。
可用於 metadata 生成、API routes 或其他 server-only 執行環境。
+layout.server.tsM
import { getTranslator } from "intor/server"; // ... const { t } = await getTranslator(intorConfig, { locale: locals.intor.locale, });