remix-i18n
安装
npm install --save remix-i18n
配置
export interface RemixI18nOptions {
// 支持的语言
supportedLanguages: string[];
// 失败备选
fallbackLng: string;
}
const i18n = new RemixI18n({
supportedLanguages: ['en', 'tl', 'da', 'zh'],
fallbackLng: 'zh'
});
添加语言翻译
i18n.set('locale', {
hello: '你好'
});
客户端设置
// entry.client.tsx
import { RemixBrowser } from '@remix-run/react';
import { startTransition, StrictMode } from 'react';
import { hydrateRoot } from 'react-dom/client';
import { I18nProvider } from 'remix-i18n';
import { i18n, getLocale } from './i18n';
const locale = getLocale(window.location.pathname);
i18n.locale(locale);
startTransition(() => {
hydrateRoot(
document,
<StrictMode>
<I18nProvider i18n={i18n}>
<RemixBrowser />
</I18nProvider>
</StrictMode>
);
});
服务器端设置
// entry.server.tsx
import isbot from 'isbot';
import { renderToReadableStream } from 'react-dom/server';
import { RemixServer } from '@remix-run/react';
import { I18nProvider } from 'remix-i18n';
import { i18n, getLocale } from './i18n';
export default async function handleRequest(
request: Request,
responseStatusCode: number,
responseHeaders: Headers,
remixContext: EntryContext,
loadContext: AppLoadContext
) {
const locale = getLocale(new URL(request.url).pathname);
i18n.locale(locale);
const body = await renderToReadableStream(
<I18nProvider i18n={i18n}>
<RemixServer context={remixContext} url={request.url} />
</I18nProvider>,
{
signal: request.signal,
onError(error: unknown) {
// Log streaming rendering errors from inside the shell
console.error(error);
responseStatusCode = 500;
}
}
);
if (isbot(request.headers.get('user-agent'))) {
await body.allReady;
}
responseHeaders.set('Content-Type', 'text/html');
return new Response(body, {
headers: responseHeaders,
status: responseStatusCode
});
}
语言切换
const i18n = useI18n();
const location = useLocation();
useEffect(() => {
const locale = getLocale(location.pathname);
if (locale !== i18n.locale()) {
i18n.locale(locale);
}
}, [location]);
使用模板
const { t } = useI18n();
// jsx
<h1>{t('hello')}</h1>;
复数
Ref: https://github.com/lukeed/rosetta/issues/4