语言切换

如何在你的 Next.js 应用中配置并切换语言

语言切换允许用户更改其首选的 locale,以查看你的应用内容。GT Next 提供多种方式,从简单的编程式切换到结合 middleware 的完整 URL 路由方案。

可用方式

使用 useSetLocale 钩子

useSetLocale 是一个运行在客户端的钩子,可用于切换应用的语言:

import { useSetLocale } from 'gt-next/client';

export default function MyComponent() {
  const setLocale = useSetLocale();

  return <button onClick={() => setLocale('en')}>设置语言</button>;
}

只需将要切换的 locale 作为参数传递给该 hook 返回的函数即可。

使用 <LocaleSelector> 组件

<LocaleSelector> 组件提供了一个即用型下拉菜单,会自动显示所有已配置的 locale:

import { LocaleSelector } from 'gt-next/client';

export default function MyComponent() {
  return <LocaleSelector />;
}

该组件会自动:

  • 显示项目中已配置的所有 locale
  • 以各自的本地语言名称显示 locale
  • 处理切换逻辑
  • 保持当前选择状态

使用 useLocaleSelector 钩子

如果你需要构建自定义的 locale 选择器组件,请使用 useLocaleSelector

import { useLocaleSelector } from 'gt-next/client';

function CustomLocaleSelector() {
  const { 
    locale,              // 当前生效的 locale(例如:'en'、'es')
    locales,             // 项目支持的 locale 列表 ['en'、'es'、'fr']
    setLocale,           // 更改 locale 的函数:setLocale('es')
    getLocaleProperties  // 获取某个 locale 显示信息的函数
  } = useLocaleSelector();
  
  if (!locales?.length) return null;
  
  return (
    <select 
      value={locale || ''} 
      onChange={(e) => setLocale(e.target.value)}
    >
      {locales.map((loc) => {
        const props = getLocaleProperties(loc);
        return (
          <option key={loc} value={loc}>
            {props.nativeNameWithRegionCode} {/* 例如:"English (US)"、"Español (ES)" */}
          </option>
        );
      })}
    </select>
  );
}

基于 URL 的语言切换

为提升 SEO 和用户体验,你可以通过中间件路由在 URL 中包含 locale。可在 Middleware 指南 中了解此方法的更多信息:

/en/products  → 英文产品页  
/es/products  → 西班牙文产品页
/fr/products  → 法文产品页

这种方式带来 SEO 优势、可直接访问的各语种版本链接,以及便于分享的本地化链接。

重要注意事项

仅限客户端组件

所有用于语言切换的 hook 和组件必须在带有 'use client' 标记的客户端组件中使用:

'use client';
import { useSetLocale } from 'gt-next/client';

function LanguageSwitcher() {
  const setLocale = useSetLocale();
  // ... 组件逻辑
}

GTProvider 要求

语言切换组件必须在 <GTProvider> 内使用:

// ✅ 正确
<GTProvider>
  <LanguageSwitcher />
</GTProvider>

// ❌ 错误 - 在 GTProvider 外部
<LanguageSwitcher />

下一步

本指南如何?