Svelte langsys-js-svelte

Un binding ligero de Svelte 5 sobre langsys-js-typescript, el binding canónico y maduro. Las señales base ya cumplen el contrato de stores de Svelte, por lo que las traducciones se leen con la sintaxis de store $.

Ver · 1:00 Svelte: el recorrido paso a paso
¿Usas un agente de programación con IA? Dale este 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.

Instalar

npm install langsys-js-svelte

¿Aún no tienes proyecto ni claves? El Inicio rápido te da ambos en dos minutos.

Inicializar

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,
});

Área de pruebas interactiva

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

Edita la frase y la categoría, define los parámetros como campos o en JSON sin procesar, y luego cambia la configuración regional y observa cómo el SDK real traduce en vivo.

Ejemplos
Parámetros
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() — cadena en línea, en un componente Ver código fuente ↗
<script>
  import { t } from 'langsys-js-svelte';
  let name = 'Sarah';
</script>

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

¿Cuál debo usar?

Estás traduciendo… Usar Por qué
Una cadena simple en tu código: una etiqueta, un título, un mensaje. Con parámetros incluidos; escribe las cantidades de forma plana y Langsys genera las formas plurales. $t Devuelve una cadena. La frase en tu código es a la vez la clave de búsqueda y el valor predeterminado en el idioma base.
Una oración con marcado en línea o valores dinámicos, que se mantiene completa. <Phrase> Los elementos en línea se convierten en tokens neutros, de modo que los traductores reordenan la oración completa, incluida la posición del marcado, y los elementos reales se reconstruyen al renderizar.
Una región de marcado con varias frases: un hero, un pie de página, una tarjeta. <Translate> Una sola etiqueta registra la región como un único bloque de contenido: cada fragmento de texto se extrae como una frase independiente y se conserva la estructura del marcado.
Algo que nunca debe traducirse: nombres de marca, código, IDs. <DontTranslate> El tokenizador y el renderizador omiten el subárbol; este queda tal cual mientras se traduce la oración que lo rodea.

Regla general: cadena → $t · oración con marcado → <Phrase> · región con marcado → <Translate> · intocable → <DontTranslate>.

Cada componente de contenido se muestra en vivo a la izquierda; el código que lo produce, a la derecha, y su corte de demostración encima del par.

Ver · 1:04 <Translate>

<Translate> — content block

Welcome to our store

Browse the catalog in your language.

<Translate> — bloque de contenido Ver código fuente ↗
<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>
Ver · 1:06 <Phrase>

<Phrase> — params & markup

Hi %name%, you have %count% items in your cart.
<Phrase> — parámetros y marcado (%name%) Ver código fuente ↗
<Phrase category="Cart" params={{ name: 'Sarah', count: 3 }}>
  Hi %name%, you have %count% items in your cart.
</Phrase>
Ver · 0:34 <DontTranslate>

<DontTranslate> — never translated

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

<DontTranslate> Ver código fuente ↗
<!-- 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>

Concordancia de género

Ver · 0:39 Concordancia de género

El español, el francés o el ruso flexionan {username} has been invited según la persona a la que se refiere. Langsys genera esas ramas durante la traducción, igual que genera los plurales, y el argumento lleva el nombre de la variable con _gender al final: male, female u other. Pásalo siempre que lo sepas. Cómo funciona y cómo encontrar las frases que lo necesitan →

Cómo pasar el argumento de género
<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>

¿No sabes el género? Pasa 'other' de forma explícita: es la variante neutra. Si aun así falta, el SDK usa la variante other por ti (langsys-js-typescript 0.6.4 y posteriores), de modo que la oración se lea correctamente.

Bloques de contenido

Ver · 0:42 Bloques de contenido

Una región <Translate> se registra como un bloque de contenido: la sección se traduce y se revisa como una unidad en el Translation Manager, pero cada fragmento de texto dentro de ella sigue siendo una frase independiente. Si escribes la misma oración en otro lugar, reutiliza la traducción que ya existe.

Un bloque, tres frases
<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>

Categorías

Ver · 0:34 Categorías

Otras bibliotecas de i18n te obligan a inventar una clave para cada cadena porque una misma palabra puede significar dos cosas. En Langsys la oración se queda en tu código y la categoría hace ese trabajo: la frase junto con su categoría es la clave, así que la misma palabra en dos categorías se convierte en dos traducciones.

La misma palabra, dos significados
<!-- 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 -->

Atributos

Ver · 1:07 Atributos

Un formulario queda traducido a medias si cambia el texto visible, pero el marcador de posición, la descripción de la imagen y la etiqueta para lectores de pantalla siguen en inglés. <Translate> los alcanza en la misma pasada: placeholder, alt, title, aria-label y aria-placeholder se traducen junto con el texto, sin marcado adicional. Todo lo marcado con translate="no" se omite, incluidos sus elementos hijos.

Texto y atributos, una sola etiqueta
<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>

Números y fechas

Ver · 0:46 Números y fechas

Pasa números y fechas como parámetros y el SDK los formatea según el idioma que se muestra, siguiendo CLDR (los datos de configuración regional de Unicode): un número pasa por Intl.NumberFormat y un Date por Intl.DateTimeFormat. Eso abarca más que el separador: la agrupación es una forma, así que 1234567 es 1,234,567 en inglés de EE. UU. y 12,34,567 en inglés de la India (en-IN).

La otra cara de la moneda: todo lo que se pasa como número se trata como una cantidad. Un número de pedido no lo es, así que pásalo como cadena de texto, o en alemán se mostrará tu referencia de pedido como 1.048.576.

Con formato según la configuración regional
<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>

Renderizado del lado del servidor

Obtén el catálogo en el servidor (SvelteKit) y entrégaselo al cliente, para que el SDK inicie sin volver a obtenerlo. El SDK traduce en el navegador, así que el HTML renderizado en el servidor está en el idioma base hasta que el SDK inicia.

// 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',
});
Buscar en la documentación y el Centro de aprendizaje