Svelte langsys-js-svelte

Cienka warstwa integracji Svelte 5 nad langsys-js-typescript — dojrzałą, referencyjną integracją. Sygnały bazowe już spełniają kontrakt store'ów Svelte, więc tłumaczenia odczytuje się składnią store $.

Obejrzyj · 1:00 Svelte: instruktaż krok po kroku
Korzystasz z agenta AI do kodowania? Daj mu ten prompt
Add Langsys translation to this Svelte app.

1. Read https://docs.langsys.dev/llms.txt, then follow
   https://docs.langsys.dev/learn/sdk/svelte/ for the install and setup.
2. The English text in the code is the translation key. Wrap user-facing
   strings as they are: no keys file, no extraction step, and no
   hand-written plural or gender branches (Langsys generates those).
3. Read the Langsys project id and API key from environment variables.
   The write key is for development and servers only; anything shipped
   to the browser gets the read-only key.
4. Keep brand names and user-generated content out of translation.

Instalacja

npm install langsys-js-svelte

Nie masz jeszcze projektu ani kluczy? Szybki start zapewni Ci jedno i drugie w dwie minuty.

Zainicjuj

import { writable } from 'svelte/store';
import { LangsysApp } from 'langsys-js-svelte';

const locale = writable('en-US'); // a standard Svelte writable

await LangsysApp.init({
  projectid: import.meta.env.VITE_LANGSYS_PROJECT_ID,
  key: import.meta.env.VITE_LANGSYS_API_KEY, // read-only in the browser
  UserLocaleStore: locale,
});

Interaktywne środowisko testowe

Obejrzyj · 1:09 t(phrase, category, params)

Edytuj frazę i kategorię, ustaw parametry jako pola lub surowy JSON, a następnie zmień ustawienia regionalne i zobacz, jak prawdziwe SDK tłumaczy na żywo.

Przykłady
Parametry
Output

Hello, Sarah! You have 3 new messages.

const value = $derived($t("Hello, {name}! You have {count} new messages.", "Greetings", {"name":"Sarah","count":3}));
t() — ciąg znaków inline, w komponencie Zobacz źródło ↗
<script>
  import { t } from 'langsys-js-svelte';
  let name = 'Sarah';
</script>

<p>{$t('Hello, {name}!', 'Greetings', { name })}</p>

Którego mam użyć?

Tłumaczysz… Użyj Dlaczego
Zwykły ciąg znaków w kodzie — etykieta, tytuł, komunikat. Z parametrami; zapisuj liczby w prostej formie, a Langsys wygeneruje formy liczby mnogiej. $t Zwraca ciąg znaków. Fraza w Twoim kodzie jest zarówno kluczem wyszukiwania, jak i domyślnym tekstem w języku bazowym.
Jedno zdanie zawierające znaczniki inline lub wartości dynamiczne, zachowane w całości. <Phrase> Elementy śródwierszowe zamieniają się w neutralne tokeny, dzięki czemu tłumacze mogą zmieniać szyk całego zdania — łącznie z położeniem znaczników — a właściwe elementy są odtwarzane podczas renderowania.
Fragment znaczników z kilkoma frazami — sekcja główna, stopka, karta. <Translate> Jeden tag rejestruje region jako pojedynczy blok treści: każdy fragment tekstu jest wyodrębniany jako osobna fraza, a struktura znaczników zostaje zachowana.
Coś, czego nigdy nie wolno tłumaczyć — nazwy marek, kod, identyfikatory. <DontTranslate> Tokenizer i renderer pomijają to poddrzewo; pozostaje ono bez zmian, podczas gdy otaczające je zdanie jest tłumaczone.

Zasada praktyczna: ciąg znaków → $t · zdanie ze znacznikami → <Phrase> · obszar ze znacznikami → <Translate> · nietykalne → <DontTranslate>.

Każdy komponent treści wyrenderowany na żywo po lewej; kod, który go tworzy, po prawej — a nad nimi ujęcie demonstracyjne.

Obejrzyj · 1:04 <Translate>

<Translate> — content block

Welcome to our store

Browse the catalog in your language.

<Translate> — blok treści Zobacz źródło ↗
<script>
  import { Translate } from 'langsys-js-svelte';
</script>

<Translate category="Home">
  <h3>Welcome to our store</h3>
  <p>Browse the catalog in your language.</p>
</Translate>
Obejrzyj · 1:06 <Phrase>

<Phrase> — params & markup

Hi %name%, you have %count% items in your cart.
<Phrase> — parametry i znaczniki (%name%) Zobacz źródło ↗
<Phrase category="Cart" params={{ name: 'Sarah', count: 3 }}>
  Hi %name%, you have %count% items in your cart.
</Phrase>
Obejrzyj · 0:34 <DontTranslate>

<DontTranslate> — never translated

Welcome! This sentence always stays in English. Thanks for visiting!

<DontTranslate> Zobacz źródło ↗
<!-- Inside a translated region, the marked span alone stays verbatim. -->
<Translate category="Tour">
  <p>Welcome! <DontTranslate>This sentence always stays in English.</DontTranslate> Thanks for visiting!</p>
</Translate>

Zgodność rodzaju gramatycznego

Obejrzyj · 0:39 Zgodność rodzaju gramatycznego

W hiszpańskim, francuskim czy rosyjskim {username} has been invited odmienia się w zależności od osoby, której dotyczy. Langsys generuje te warianty podczas tłumaczenia — tak samo jak liczbę mnogą — a argument ma nazwę zmiennej z dopiskiem _gender: male, female lub other. Przekaż go zawsze, gdy go znasz. Jak to działa i jak znaleźć frazy, które tego potrzebują →

Przekazywanie argumentu płci
<script>
  import { t } from 'langsys-js-svelte';
  export let user; // user.gender is 'male' | 'female' | 'other'
</script>

<!-- Pass the agreement argument alongside the value it inflects. -->
<p>{$t('{username} has been invited', 'Team',
    { username: user.name, username_gender: user.gender })}</p>

Nie znasz płci? Przekaż jawnie 'other' — to gałąź neutralna. Jeśli mimo to jej zabraknie, SDK samo wybierze gałąź other (langsys-js-typescript w wersji 0.6.4 i nowszych), dzięki czemu zdanie nadal brzmi poprawnie.

Bloki treści

Obejrzyj · 0:42 Bloki treści

Region <Translate> rejestruje się jako jeden blok treści: sekcja jest tłumaczona i weryfikowana jako całość w Translation Manager, ale każdy fragment tekstu wewnątrz niej nadal jest odrębną frazą. Jeśli napiszesz to samo zdanie w innym miejscu, wykorzysta ono istniejące już tłumaczenie.

Jeden blok, trzy frazy
<Translate category="Home">
    <h3>Welcome to our store</h3>
    <p>Browse the catalog in your language.</p>
    <p>Free shipping on orders over $50.</p>
</Translate>

Kategorie

Obejrzyj · 0:34 Kategorie

Inne biblioteki i18n każą wymyślać klucz dla każdego ciągu znaków, bo jedno słowo może mieć dwa znaczenia. W Langsys zdanie zostaje w Twoim kodzie, a tę pracę wykonuje kategoria: kluczem jest fraza wraz z kategorią, więc to samo słowo w dwóch kategoriach daje dwa tłumaczenia.

To samo słowo, dwa znaczenia
<!-- The phrase plus its category is the key. -->
<a href="/">{$t('Home', 'Main menu')}</a>          <!-- es: Inicio -->
<h2>{$t('Home', 'Home repairs')}</h2>           <!-- es: Hogar -->

Atrybuty

Obejrzyj · 1:07 Atrybuty

Formularz jest przetłumaczony tylko w połowie, jeśli widoczny tekst się zmienia, a tekst zastępczy, opis obrazu i etykieta dla czytnika ekranu pozostają po angielsku. <Translate> obejmuje je w tym samym przebiegu: placeholder, alt, title, aria-label i aria-placeholder są tłumaczone razem z tekstem, bez dodatkowych znaczników. Wszystko, co oznaczono jako translate="no", jest pomijane wraz z elementami podrzędnymi.

Tekst i atrybuty, jeden tag
<Translate category="Checkout">
    <label>Email address</label>
    <input placeholder="[email protected]" />
    <img src="/lock.svg" alt="Secure checkout" />
    <button aria-label="Place your order">
        Place order
    </button>
</Translate>

Liczby i daty

Obejrzyj · 0:46 Liczby i daty

Przekazuj liczby i daty jako parametry, a SDK sformatuje je zgodnie z wyświetlanym językiem, według CLDR (danych regionalnych Unicode): liczba przechodzi przez Intl.NumberFormat, a Date przez Intl.DateTimeFormat. Obejmuje to więcej niż separator: grupowanie to wzorzec, więc 1234567 to 1,234,567 w amerykańskim angielskim i 12,34,567 w indyjskim angielskim (en-IN).

Druga strona medalu: wszystko, co zostanie przekazane jako liczba, jest traktowane jak ilość. Numer zamówienia nią nie jest, więc przekaż go jako ciąg znaków, bo inaczej niemiecki pokaże numer zamówienia jako 1.048.576.

Formatowanie zależne od ustawień regionalnych
<script lang="ts">
    import { t } from 'langsys-js-svelte';
    const renewsAt = new Date(2026, 2, 14); // 14 March 2026, local time
</script>

<p>{$t('Balance: {amount}', 'Billing', { amount: 1234.5 })}</p>
<p>{$t('Renews {when}', 'Billing', { when: renewsAt })}</p>

<!-- An order number is not a quantity: pass it as a string. -->
<p>{$t('Order {ref}', 'Billing', { ref: '1048576' })}</p>

Renderowanie po stronie serwera

Pobierz katalog na serwerze (SvelteKit) i przekaż go klientowi, aby SDK uruchamiało się bez ponownego pobierania. SDK tłumaczy w przeglądarce, więc HTML renderowany na serwerze jest w języku bazowym, dopóki SDK się nie uruchomi.

// SvelteKit: +layout.server.ts seeds the catalog, the client init reuses it.
LangsysApp.init({
  projectid, key,
  UserLocaleStore: locale,
  initialTranslations,        // fetched on the server
  initialTranslationsLocale,  // fetched on the server
  ssrTokenStrategy: 'client',
});
Szukaj w dokumentacji i Centrum nauki