跳转至主要内容
Remix & Hydrogen i18n

面向店面与路由驱动应用的 Remix 和 Hydrogen i18n

使用 Better I18N,在同一个工作流中让服务端渲染的语言状态、本地化店面内容和面向搜索的路由保持一致。

Setup

Get started in 3 steps

Install the app-side SDK

在 Remix 或 Hydrogen 应用中使用基于 provider 的 SDK,让翻译内容可以在各个路由模块之间共享。

terminal
npm install @better-i18n/use-intl use-intl

在服务端解析语言

从请求、路由参数或店面上下文中读取语言,并将其传入应用根节点。

app/root.tsx
export async function loader({ request }: LoaderFunctionArgs) {
  const locale = resolveLocaleFromRequest(request);

  return json({ locale });
}

在根路由中完成 provider 的水合

只需提供一次语言,嵌套路由、产品页和购物车界面便共用同一个翻译来源。

app/root.tsx
export default function App() {
  const { locale } = useLoaderData<typeof loader>();

  return (
    <BetterI18nProvider project="your-org/your-storefront" locale={locale}>
      <Outlet />
    </BetterI18nProvider>
  );
}
Capabilities

为什么在 Remix 和 Hydrogen 中使用 Better I18N?

在服务端加载的语言处理,契合 Remix loader 和 Hydrogen 店面流程
适合对 SEO 敏感的分类页、产品页和内容页
店面界面、账户页面和营销路由共用一套翻译工作流
支持基于路由的语言策略,无需脆弱的文件复制
开发者可以发布本地化的店面更新,无需等待重新部署
让对比内容和购买意向内容与产品本地化页面保持一致
Example

Route-level locale wiring

基于 provider 的配置方式,适合以 loader 驱动的框架和店面路由树。

import { BetterI18nProvider, useTranslations } from '@better-i18n/use-intl';

export async function loader({ request }: LoaderFunctionArgs) {
  return json({
    locale: resolveLocaleFromRequest(request),
  });
}

function ProductHero() {
  const t = useTranslations('product');
  return <h1>{t('title')}</h1>;
}

export default function App() {
  const { locale } = useLoaderData<typeof loader>();

  return (
    <BetterI18nProvider project="your-org/your-storefront" locale={locale}>
      <ProductHero />
      <Outlet />
    </BetterI18nProvider>
  );
}

Other frameworks

Get started

发布本地化店面,无需割裂的工作流

把服务端语言处理、产品内容和购买意向页面放在同一个本地化系统中。