SvelteKit에서 Langsys 사용하기

패턴은 어디서나 같습니다. 서버가 카탈로그를 한 번 가져오고(쓰기 키는 서버에만 보관), 클라이언트는 그 시드로 읽기 전용 키를 사용해 langsys-js-svelte를 초기화합니다. 중복 요청은 없습니다. 번역 자체는 브라우저에서 이루어집니다. 서버가 보내는 HTML은 기본 언어로 되어 있고 검색 엔진도 이를 색인하며, 페이지는 로드되면서 방문자의 언어로 전환됩니다.

1 · +layout.server.ts에서 카탈로그 로드하기

서버 load 함수는 페이지를 렌더링할 때마다 카탈로그를 한 번 가져오며, SvelteKit이 이를 페이지 데이터로 직렬화합니다. 쓰기 키는 서버에만 남고 클라이언트는 읽기 전용 키를 받습니다. 양쪽 모두 같은 카탈로그를 사용하며, 클라이언트는 초기 가져오기만 건너뜁니다.

// src/routes/+layout.server.ts
import { LANGSYS_API_KEY, LANGSYS_PROJECT_ID } from '$env/static/private';

export const load = async ({ fetch }) => {
  const locale = 'en-US'; // from cookie / Accept-Language
  const res = await fetch(
    `https://api.langsys.dev/api/projects/${LANGSYS_PROJECT_ID}/translations?locale=${locale}`,
    { headers: { 'x-Authorization': LANGSYS_API_KEY } }
  );
  const { data: translations } = await res.json();
  return { locale, translations };
};

2 · +layout.svelte에서 초기화하기

표준 Svelte writable이 로케일 스토어이며, Svelte 바인딩이 이를 SDK에 맞게 변환합니다. 초기화는 시드된 카탈로그와 함께 onMount에서 실행되므로 아무것도 두 번 가져오지 않습니다. onMount가 실행되면 텍스트가 기본 언어에서 방문자의 언어로 전환됩니다.

<!-- src/routes/+layout.svelte -->
<script>
  import { onMount } from 'svelte';
  import { writable } from 'svelte/store';
  import { LangsysApp } from 'langsys-js-svelte';
  import { PUBLIC_LANGSYS_API_KEY, PUBLIC_LANGSYS_PROJECT_ID } from '$env/static/public';

  export let data;

  const locale = writable(data.locale);

  onMount(() => {
    LangsysApp.init({
      projectid: PUBLIC_LANGSYS_PROJECT_ID,
      key: PUBLIC_LANGSYS_API_KEY, // read-only
      UserLocaleStore: locale,
      initialTranslations: data.translations,
      initialTranslationsLocale: data.locale,
      ssrTokenStrategy: 'client',
    });
  });
</script>

<slot />

3 · 아래 어디서나 사용하기

여기서부터는 일반 Svelte SDK입니다. 어떤 컴포넌트에서든 $t를 사용할 수 있고(시그널은 Svelte의 스토어 규약을 기본적으로 충족합니다), $locale = 'fr-FR'로 앱 전체의 언어를 전환할 수 있습니다.

<script>
  import { t } from 'langsys-js-svelte';
</script>

<h1>{$t('Welcome to our store', 'Home')}</h1>
문서 및 학습 센터 검색