You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在remix-i18next中实现用户自定义语言切换功能

在Remix中使用remix-i18next实现手动语言切换按钮

要实现手动切换语言,核心是通过action处理语言切换请求,并在loader中优先读取用户已选择的语言(存在cookie里),未选择时再用request的默认语言。下面是具体修改步骤:

1. 更新Loader逻辑,优先读取用户选择的语言

修改loader,先从request的cookie中获取用户手动设置的语言,没有的话再用i18next.getLocale(request)获取默认语言:

import { useChangeLanguage } from "remix-i18next";
import { useTranslation } from "react-i18next";
import i18next from "~/i18next.server";
import { json, LoaderArgs, ActionArgs, redirect } from "@remix-run/node";
import { Form, useLoaderData } from "@remix-run/react";

export async function loader({ request }: LoaderArgs) {
  // 先从cookie读取用户已选语言
  const userSelectedLocale = request.headers.get("Cookie")?.match(/locale=([a-z-]+)/)?.[1];
  // 优先用用户选择的,否则用默认检测的语言
  let locale = userSelectedLocale || await i18next.getLocale(request);
  return json({ locale });
}

export let handle = {
  i18n: "common",
};

2. 添加Action处理语言切换请求

新增action函数,接收用户提交的语言参数,设置cookie后重定向回当前页面:

export async function action({ request }: ActionArgs) {
  const formData = await request.formData();
  const newLocale = formData.get("locale") as string;
  // 验证语言是否在你的支持列表里,可自行调整
  const supportedLocales = ["en", "zh-CN"];
  if (!supportedLocales.includes(newLocale)) {
    return redirect(request.url);
  }

  // 设置cookie,有效期可按需调整
  return redirect(request.url, {
    headers: {
      "Set-Cookie": `locale=${newLocale}; Path=/; Max-Age=31536000; HttpOnly; SameSite=Lax`,
    },
  });
}

3. 在Root组件中添加语言切换按钮

用Remix的Form组件提交语言切换请求,按钮点击时提交对应语言:

export default function Root() {
  const { locale } = useLoaderData<typeof loader>();
  const { i18n } = useTranslation();
  useChangeLanguage(locale);

  return (
    <html lang={locale} dir={i18n.dir()}>
      <head>
        <Meta />
        <Links />
      </head>
      <body>
        {/* 语言切换按钮区域 */}
        <div style={{ position: "fixed", top: 10, right: 10 }}>
          <Form method="post">
            {/* 根据当前语言显示切换文案 */}
            <button type="submit" name="locale" value={locale === "zh-CN" ? "en" : "zh-CN"}>
              {locale === "zh-CN" ? "Switch to English" : "切换到中文"}
            </button>
          </Form>
        </div>

        <Outlet />
        <ScrollRestoration />
        <Scripts />
        <LiveReload />
      </body>
    </html>
  );
}

关键说明

  • 用cookie存储用户选择的语言,确保刷新页面或跳转后语言偏好保留
  • action中加入语言合法性校验,避免非法语言参数请求
  • useChangeLanguage(locale)会自动根据loader返回的locale更新i18n实例语言,保证页面内容同步切换

内容的提问来源于stack exchange,提问作者Martí Serra Molina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 23:30:32