Альфа
Lingo.dev Compiler находится в альфа-версии. Он нестабилен, не рекомендуется для production, а API могут меняться от релиза к релизу.
Пользовательские резолверы локали позволяют переопределить то, как Lingo.dev Compiler определяет и сохраняет локаль пользователя. По умолчанию Compiler использует сохранение через cookie, настроенное с помощью опции localePersistence. Если вам нужен более гибкий контроль — маршрутизация по URL, определение по заголовкам, localStorage или любая другая логика — создайте файлы резолвера в каталоге .lingo/.
Файлы резолвера#
Compiler ищет два необязательных файла:
| Файл | Среда | Экспортируемые значения |
|---|---|---|
.lingo/locale-resolver.server.ts | На сервере (SSR, RSC) | resolveLocale(request: Request): string |
.lingo/locale-resolver.client.ts | На клиенте (браузер) | resolveLocale(): string and persistLocale(locale: string): void |
Если файл резолвера существует, Compiler использует его вместо стандартного поведения на основе cookie. Если существует только один файл, во второй среде будет использоваться стандартное поведение.
Серверный резолвер#
Серверный резолвер получает входящий объект Request и возвращает строку с кодом локали:
// .lingo/locale-resolver.server.ts
export function resolveLocale(request: Request): string {
const url = new URL(request.url);
// Check URL path prefix: /es/about -> "es"
const pathLocale = url.pathname.split("/")[1];
const supportedLocales = ["en", "es", "de", "fr", "ja"];
if (supportedLocales.includes(pathLocale)) {
return pathLocale;
}
// Fall back to Accept-Language header
const acceptLanguage = request.headers.get("Accept-Language");
if (acceptLanguage) {
const preferred = acceptLanguage.split(",")[0].split("-")[0];
if (supportedLocales.includes(preferred)) {
return preferred;
}
}
return "en";
}Клиентский резолвер#
Клиентский резолвер состоит из двух функций: одна считывает текущую локаль, вторая сохраняет её изменение:
// .lingo/locale-resolver.client.ts
export function resolveLocale(): string {
// Check URL path prefix
const pathLocale = window.location.pathname.split("/")[1];
const supportedLocales = ["en", "es", "de", "fr", "ja"];
if (supportedLocales.includes(pathLocale)) {
return pathLocale;
}
// Fall back to localStorage
const stored = localStorage.getItem("locale");
if (stored && supportedLocales.includes(stored)) {
return stored;
}
return "en";
}
export function persistLocale(locale: string): void {
localStorage.setItem("locale", locale);
// Navigate to the locale-prefixed URL
const path = window.location.pathname.replace(/^\/[a-z]{2}/, "");
window.location.href = `/${locale}${path}`;
}Частые сценарии для резолверов#
Маршрутизация по префиксу в URL-пути (/es/about, /de/pricing):
// .lingo/locale-resolver.server.ts
export function resolveLocale(request: Request): string {
const url = new URL(request.url);
const locale = url.pathname.split("/")[1];
const supported = ["en", "es", "de", "fr"];
return supported.includes(locale) ? locale : "en";
}// .lingo/locale-resolver.client.ts
export function resolveLocale(): string {
const locale = window.location.pathname.split("/")[1];
const supported = ["en", "es", "de", "fr"];
return supported.includes(locale) ? locale : "en";
}
export function persistLocale(locale: string): void {
const path = window.location.pathname.replace(/^\/[a-z]{2}/, "");
window.location.href = `/${locale}${path}`;
}Функция resolveLocale должна возвращать код локали, который соответствует одной из настроенных targetLocales или sourceLocale. Если вернуть неподдерживаемый код локали, Compiler переключится на исходную локаль.
