resolveLocale
Elige cuál de las configuraciones regionales que admites hay que usar, siguiendo la cadena de siempre: consulta → cookie → localStorage → navigator → recurso final.
El catálogo de mensajes es cosa tuya; esto solo elige la clave.
API
resolveLocale(options)
| Opción | Descripción | Tipo | Por defecto |
|---|---|---|---|
supported | Las configuraciones que realmente publicas, de la más específica a la menos | readonly string[] | Obligatorio |
fallback | Lo que se devuelve cuando nada coincide | string | supported[0] |
query | Parámetro de consulta que lleva una elección explícita, por ejemplo lang | string | — |
cookie | Nombre de la cookie que lleva la elección | string | — |
storageKey | Clave de localStorage con lo último que la persona eligió | string | — |
useNavigator | Consultar navigator.languages y navigator.language antes de recurrir al último recurso | boolean | true |
url | URL de la que se lee la consulta | string | La ubicación actual |
Devuelve
La entrada de supported que coincida: siempre una de ellas, nunca una cadena cualquiera.
Ejemplo
La cadena completa
import { resolveLocale } from 'ranuts';
const locale = resolveLocale({
supported: ['en', 'zh-CN'],
query: 'lang',
cookie: 'lang',
storageKey: 'app-lang',
});
document.documentElement.lang = locale;
render(messages[locale]);Las variantes regionales caen en el idioma base
import { resolveLocale } from 'ranuts';
const supported = ['en', 'zh-CN'];
resolveLocale({ supported, query: 'lang', url: '?lang=en-GB' }); // 'en'
resolveLocale({ supported, query: 'lang', url: '?lang=zh' }); // 'zh-CN'
resolveLocale({ supported, query: 'lang', url: '?lang=de' }); // 'en' (no admitido → último recurso)Combinado con las URL por idioma
import { resolveLocale, createLocalePath } from 'ranuts';
const paths = createLocalePath({
locales: [{ code: 'en' }, { code: 'zh-CN', prefix: 'zh' }],
});
// Prefiere lo que ya dice la URL; si no, la preferencia de la propia persona.
const locale = paths.localeFromPath(location.pathname) ?? resolveLocale({ supported: ['en', 'zh-CN'] });Notas
El orden es lo importante. Un
?lang=en la URL es explícito, se puede compartir y vale para esa vez, así que gana a todo lo demás. Una cookie es una decisión que el servidor ve, así que gana al estado que solo conoce el cliente. localStorage es lo último que la persona eligió dentro de la aplicación.navigator.languageno es más que una conjetura sobre quien llega por primera vez. Invertir este orden produce el fallo clásico: un enlace compartido con?lang=enque se sigue mostrando en el idioma guardado de quien lo recibe.El resultado siempre es uno de
supported. Un valor que no esté en la lista se ignora en vez de devolverse, así que con el resultado se puede indexar un catálogo de mensajes sin riesgo.La coincidencia no distingue mayúsculas y cae al idioma base. Con
supported: ['en', 'zh-CN'],en-GBcasa conenyzhcasa conzh-CN.Se recorre
navigator.languagesen orden, no solonavigator.language: esa lista es la preferencia real y ordenada de la persona, y su primer elemento a menudo no es la mejor coincidencia disponible.Cada fuente se retira sin ruido. Sin
window, sindocument.cookie, sin localStorage: cada una simplemente no aporta nada, de modo que la cadena funciona en el servidor y en scripts de compilación.