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

Next.js i18n路由问题:locale、locales及defaultLocale值为undefined

解决Next.js 13 App Router中i18n locale/locales/defaultLocale undefined问题

你遇到的核心问题是:Next.js 13 App Router(app目录)下,next/navigation导出的useRouter不再提供locale、locales、defaultLocale属性——这些是Pages Router(pages目录)的专属API,在App Router中已被替换。

以下是两种可行的解决方案:


方案一:使用Next.js官方App Router原生i18n方案

1. 调整目录结构

App Router的i18n路由需要对应目录结构,推荐两种方式:

  • 为每个locale创建独立路由目录:app/tr/page.js、app/en/page.js
  • 使用动态路由统一处理:app/[lang]/page.js(更高效,减少重复代码)

2. 获取当前Locale

  • 服务器组件:直接通过params获取(动态路由场景)
    // app/[lang]/page.js
    export default function Home({ params }) {
      const currentLocale = params.lang;
      return (
        <div>
          <h1>Hello World</h1>
          <p>当前Locale:{currentLocale}</p>
          <ClientSideLocale />
        </div>
      );
    }
    
  • 客户端组件:使用next/navigation导出的useLocale()
    "use client";
    import { useLocale } from "next/navigation";
    
    export default function ClientSideLocale() {
      const locale = useLocale();
      return <p>客户端获取Locale:{locale}</p>;
    }
    

3. 获取配置的locales和defaultLocale

客户端无法直接读取next.config.js,建议将i18n配置抽离为单独常量文件,全局复用:

// config/i18n.js
export const i18nConfig = {
  locales: ["tr", "en"],
  defaultLocale: "tr",
};

在next.config.js和组件中引用:

// next.config.js
const { i18nConfig } = require("./config/i18n");

const nextConfig = {
  i18n: i18nConfig,
};

module.exports = nextConfig;

组件内直接使用:

import { i18nConfig } from "../config/i18n";

// 组件渲染部分
<p>默认Locale:{i18nConfig.defaultLocale}</p>
<p>所有配置Locale:{JSON.stringify(i18nConfig.locales)}</p>

方案二:使用next-intl库(更便捷的i18n方案)

next-intl是专为Next.js设计的国际化库,完美适配App Router,支持翻译、日期/数字格式化等功能。

1. 安装依赖

npm install next-intl

2. 创建i18n配置文件

// i18n.js
import { createI18nClient } from "next-intl";
import tr from "./locales/tr.js";
import en from "./locales/en.js";

export default createI18nClient({
  locales: ["tr", "en"],
  defaultLocale: "tr",
  messages: { tr, en },
});

3. 配置根布局

// app/layout.js
import { NextIntlClientProvider } from "next-intl";
import i18n from "../i18n";

export default function RootLayout({ children, params }) {
  return (
    <html lang={params.lang}>
      <body>
        <NextIntlClientProvider i18n={i18n} locale={params.lang}>
          {children}
        </NextIntlClientProvider>
      </body>
    </html>
  );
}

4. 在组件中使用

"use client";
import { useTranslations, useLocale } from "next-intl";
import { i18nConfig } from "../config/i18n";

export default function Home() {
  const t = useTranslations();
  const locale = useLocale();

  return (
    <div>
      <h1>{t("hello")}</h1>
      <p>当前Locale:{locale}</p>
      <p>默认Locale:{i18nConfig.defaultLocale}</p>
      <p>所有配置Locale:{JSON.stringify(i18nConfig.locales)}</p>
    </div>
  );
}

额外注意事项

  • 确保你的Next.js版本≥13.4.0(你的版本13.4.12符合要求),App Router的i18n功能在13.4版本后才稳定。
  • 访问根路径/时,Next.js会自动重定向到默认Locale路径(如/tr),若需关闭自动检测,可在next.config.js的i18n配置中添加localeDetection: false。

内容的提问来源于stack exchange,提问作者ucemrecan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 22:47:12