<Translate> — content block
Welcome to our store
Browse the catalog in your language.
langsys-js-vueUn enlace delgado de Vue 3 sobre langsys-js-typescript, construido con composables que conectan las señales base con shallowRefs. La frase en tu código es a la vez la clave de búsqueda y el valor predeterminado en el idioma base.
Add Langsys translation to this Vue app.
1. Read https://docs.langsys.dev/llms.txt, then follow
https://docs.langsys.dev/learn/sdk/vue/ 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. npm install langsys-js-vue ¿Aún no tienes proyecto ni claves? El Inicio rápido te da ambos en dos minutos.
import { LangsysApp, createLocaleStore } from 'langsys-js-vue';
const locale = createLocaleStore('en-US');
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,
}); ¿Necesitas leer el almacén de idiomas —o cualquier señal del SDK base, como un almacén que compartes fuera de Vue— de forma reactiva? useSignal(store) lo conecta con un shallowRef que Vue puede rastrear. (Svelte no necesita un equivalente: las señales cumplen de forma nativa su contrato de stores.)
<script setup>
import { useSignal, useCurrentLocale } from 'langsys-js-vue';
// Vue tracks only its own refs — a base-SDK signal is invisible to it.
// useSignal(signal) bridges it into a shallowRef Vue can track.
const selected = useSignal(locale); // your createLocaleStore(...)
const loaded = useCurrentLocale(); // shortcut for the loaded locale
</script>
<template>
<footer>selected {{ selected }} · loaded {{ loaded }}</footer>
</template> 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.
count a 1 y de vuelta: la gramática lo sigue. La frase se escribe plana: Langsys genera las formas plurales de cada idioma durante la traducción (incluido el idioma base) y el SDK elige la rama a partir de count. Nadie escribe ICU. Hello, Sarah! You have 3 new messages.
const t = useT();
<p>{{ t("Hello, {name}! You have {count} new messages.", "Greetings", {"name":"Sarah","count":3}) }}</p><script setup>
import { useT } from 'langsys-js-vue';
const t = useT();
const name = 'Sarah';
</script>
<template>
<p>{{ t('Hello, {name}!', 'Greetings', { name }) }}</p>
</template> | 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. | useT() | 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 → useT() · 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.
Ver Por ahora, las demostraciones de estas primitivas están en la página de Svelte; la superficie es idéntica, solo cambia la sintaxis: <Translate> (1:04) · <Phrase> (1:06) · <DontTranslate> (0:34).
<Translate> — content blockBrowse the catalog in your language.
<script setup>
import { Translate } from 'langsys-js-vue';
</script>
<template>
<Translate category="Home">
<h3>Welcome to our store</h3>
<p>Browse the catalog in your language.</p>
</Translate>
</template> <Phrase> — params & markup<Phrase category="Cart" :params="{ name: 'Sarah', count: 3 }">
Hi %name%, you have %count% items in your cart.
</Phrase> <DontTranslate> — never translatedWelcome! This sentence always stays in English. Thanks for visiting!
<!-- 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> 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 →
<script setup>
import { useT } from 'langsys-js-vue';
const props = defineProps({ user: Object });
const t = useT();
</script>
<template>
<!-- Pass the agreement argument alongside the value it inflects.
user.gender is 'male' | 'female' | 'other'. -->
<p>{{ t('{username} has been invited', 'Team',
{ username: props.user.name, username_gender: props.user.gender }) }}</p>
</template> ¿No conoces el género? Pasa 'other' de forma explícita: es la rama neutra. Si de todos modos falta, el SDK toma la rama other por ti (langsys-js-typescript 0.6.4 y posteriores), de modo que la oración se lea correctamente. Actualmente TypeScript rechaza username_gender en un objeto de parámetros en línea (error TS2353; hay una corrección en revisión). Hasta que se publique, crea primero el objeto de parámetros y pasa la variable.
Obtén el catálogo en el servidor (Nuxt) y pásalo al cliente, para que el SDK inicie sin volver a solicitarlo. El SDK traduce en el navegador, por lo que el HTML renderizado en el servidor está en el idioma base hasta que el SDK inicia.
// Nuxt: the server plugin 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',
});