Preact предоставляет возможности для эффективного управления локализацией приложений через динамическую загрузку языковых пакетов. Это особенно важно для крупных приложений с мультиязычным интерфейсом, где требуется минимизация первоначального объёма загрузки и оптимизация скорости рендеринга.
Динамическая загрузка языков заключается в подгрузке только тех
языковых данных, которые необходимы пользователю в текущий момент. Это
достигается через использование асинхронных модулей и механизмов
разделения кода (code splitting).
Ключевые принципы:
import() вместо статического
import.Пример базовой структуры файлов:
/locales
en.json
ru.json
fr.json
Каждый файл содержит JSON с переводами интерфейсных элементов.
Использование динамического импорта:
import { h } from 'preact';
import { useState, useEffect } from 'preact/hooks';
function useLocale(locale) {
const [messages, setMessages] = useState({});
useEffect(() => {
let isMounted = true;
import(`./locales/${locale}.json`).then(module => {
if (isMounted) setMessages(module.default);
});
return () => { isMounted = false; };
}, [locale]);
return messages;
}
В этом хуке происходит:
locale.После получения языковых данных их можно использовать в компонентах:
function App({ currentLocale }) {
const messages = useLocale(currentLocale);
return (
<div>
<h1>{messages.title}</h1>
<p>{messages.description}</p>
</div>
);
}
Это позволяет полностью отделить логику загрузки переводов от визуальных компонентов.
Для крупных проектов важно контролировать размер и частоту загрузки языковых пакетов:
<link rel="preload"> или предварительный импорт при
инициализации.sessionStorage или IndexedDB для хранения
загруженных переводов между сессиями.Пример кэширования в sessionStorage:
useEffect(() => {
const cached = sessionStorage.getItem(locale);
if (cached) {
setMessages(JSON.parse(cached));
} else {
import(`./locales/${locale}.json`).then(module => {
setMessages(module.default);
sessionStorage.setItem(locale, JSON.stringify(module.default));
});
}
}, [locale]);
Preact совместим с популярными библиотеками i18n, такими как i18next. Использование i18next позволяет:
i18next-http-backend.Пример настройки с i18next:
import i18next from 'i18next';
import HttpBackend from 'i18next-http-backend';
i18next
.use(HttpBackend)
.init({
lng: 'en',
fallbackLng: 'en',
backend: {
loadPath: '/locales/{{lng}}.json'
}
});
В Preact можно использовать подход Suspense для
отложенной отрисовки компонентов до завершения загрузки языковых
файлов:
import { Suspense } from 'preact/compat';
function Loader() {
return <div>Загрузка...</div>;
}
<Suspense fallback={<Loader />}>
<App currentLocale="ru" />
</Suspense>
Таким образом, интерфейс не блокируется ожиданием загрузки, а отображается индикатор прогресса.
Динамическая загрузка языков в Preact обеспечивает гибкость и оптимизацию приложений, делая мультиязычные интерфейсы быстрыми и отзывчивыми даже при большом объёме контента.