Skip to content

Internacionalización (i18n)

PreffX utiliza una única señal de idioma de nivel raíz que impulsa todas las traducciones. El idioma se almacena en el atributo <html lang="..."> y se sincroniza con la señal lang, por lo que cambiarlo actualiza automáticamente todos los diccionarios.

Leer el idioma

La utilidad lang es una señal de solo lectura que contiene el código de idioma actual:

tsx
import type { PC } from 'preffx';

export const CurrentLang: PC = (_props, { lang }) => {
    return <span>Current language: {lang}</span>;
};

Dentro de los bloques computed el valor se rastrea de forma reactiva:

tsx
import type { PC } from 'preffx';

export const Caption: PC = (_props, { computed, lang }) => {
    const greeting = computed(() =>
        lang.value === 'ru' ? 'Привет' : 'Hello'
    );
    return <p>{greeting}</p>;
};

Cambiar el idioma

Llame a setLang para cambiar el idioma. Esta función escribe en el atributo <html lang> y, a su vez, actualiza la señal lang que utilizan todos los diccionarios.

tsx
import type { PC } from 'preffx';

export const LangSwitch: PC = (_props, { setLang }) => {
    return (
        <div>
            <button onClick={() => setLang('en')}>EN</button>
            <button onClick={() => setLang('ru')}>RU</button>
        </div>
    );
};

Diccionarios simples

Pase un objeto plano indexado por idioma y luego seleccione el activo mediante computed:

tsx
import type { PC } from 'preffx';

const dictionary = {
    en: { openProfile: 'Open profile', showStats: 'Show statistics' },
    ru: { openProfile: 'Открыть профиль', showStats: 'Показать статистику' }
};

export const App: PC = (_props, { computed, lang }) => {
    const captions = computed(() => dictionary[lang.value] || dictionary.en);
    return (
        <div>
            <button>{captions.openProfile}</button>
            <button>{captions.showStats}</button>
        </div>
    );
};

Diccionarios perezosos con dict

Cuando una configuración regional es grande o se carga de forma asíncrona, utilice la utilidad dict. Esta toma un mapa de código de idioma → resolutor (síncrono o asíncrono) y devuelve un proxy cuyos campos son señales reactivas. Acceda a un campo como valor o llámelo como función.

tsx
import type { APC } from 'preffx';

const getRuDictionary = async () => {
    return {
        openProfile(name: string) {
            return 'Открыть профиль № ' + name;
        },
        showStats: 'Показать статистику'
    };
};

const getEnDictionary = async () => {
    return {
        openProfile(name: string) {
            return 'Open profile № ' + name;
        },
        showStats: 'Show stats'
    };
};

export const App: APC = async (_props, { dict, setLang }) => {
    const initialDict = await getEnDictionary();
    const captions = dict({ ru: getRuDictionary, en: getEnDictionary }, initialDict);

    return (
        <div>
            <button onClick={() => setLang('en')}>EN</button>
            <button onClick={() => setLang('ru')}>RU</button>
            <span>
                <button>{captions.openProfile('42')}</button>
                <button>{captions.showStats}</button>
            </span>
        </div>
    );
};
  • dict(resolvers) — primer argumento: Record<lang, () => Dict | Promise<Dict>>.
  • dict(resolvers, initial) — el segundo argumento opcional proporciona el objeto inicial que se usa antes de que se resuelva un resolutor.
  • El resolutor para el lang actual se vuelve a ejecutar automáticamente cuando cambia el idioma.
  • Los campos de función se convierten en callables que devuelven señales computadas: captions.openProfile('42') es reactivo.
  • Utilice .peek() en un campo para leerlo sin seguimiento reactivo.

Configurar el idioma inicial

El lang inicial se lee del atributo <html lang> en el momento de createRoot, o se puede configurar explícitamente:

tsx
import { createRoot } from 'preffx';

createRoot({ defaultLang: 'en' }).mount(App);

Resumen de utilidades

OpciónTipoDescripción
defaultLangstringIdioma de respaldo cuando no se define/declara
setLang(value) => voidCambiar el idioma actual
langReadonlySignalIdioma actual (reactivo)
dict(...) => DictProxyDiccionarios reactivos por idioma

Publicado bajo la Licencia Apache 2.0