next-i18next - 是否可以动态更改默认语言?

Pio*_*r O 2 javascript next.js next-i18next

我正在使用 next-i18next 来处理 next.js 应用程序的国际化。

是否可以动态更改默认语言?例如基于顶级域名?

const defaultLanguage = topLevelDomain === "de" : "de" ? "it";
Run Code Online (Sandbox Code Playgroud)

编辑:我也在使用 localeSubpaths 所以这就是我试图调查这个主题的原因。

yoh*_*nes 11

对于使用此处v10.0.0所写的Nextjs 的人来说,我们必须使用最新的配置

next-i18next.config.js

module.exports = {
  i18n: {
    defaultLocale: 'it',
    locales: ['it', 'de'],
  },
}
Run Code Online (Sandbox Code Playgroud)

next.config.js

const { i18n } = require('./next-i18next.config')

module.exports = {
  i18n,
}
Run Code Online (Sandbox Code Playgroud)

要更改语言,我们必须使用next/linknext/router

import Link from 'next/link'
import { useRouter } from 'next/router'
import { Menu } from 'antd'
import { BorderOutlined, CheckSquareOutlined } from '@ant-design/icons'

.
.
.

export default function YourComponent() {
  .
  .
  const router = useRouter()

  const selectedLang = lang => {
    return router.locale === lang ? <CheckSquareOutlined /> : <BorderOutlined />
  }

  return (
    .
    .
    .
    <Menu onClick={handleLangMenuClick}>
      <Menu.Item key="it" icon={selectedLang('it')}>
        <Link href={router.pathname} locale="it" >
          <a>Italian</a>
        </Link>
      </Menu.Item>
      <Menu.Item key="en" icon={selectedLang('de')}>
        <Link href={router.pathname} locale="de" >
          <a>German</a>
        </Link>
      </Menu.Item>
    </Menu>
    .
    .
  )

.
.
}

Run Code Online (Sandbox Code Playgroud)

但你必须记住:

  1. 第一次渲染时,默认语言将始终引用Accept- Language浏览器发送的标头。换句话说,默认语言将基于目标用户的浏览器语言设置。

    假设Accept-Language浏览器发送的标头如下( 和 都de存在it):

    Accept-Language: de, de;q=0.9, it;q=0.8, en;q=0.7, *;q=0.5
    
    # Note: the `q` value may be differs, the bigger will get the most priority
    
    Run Code Online (Sandbox Code Playgroud)

    那么默认语言将为,忽略处的German配置。defaultLocalenext-i18next.config.js

  2. 如果两者de均未it列出,Accept-Language例如:

    Accept-Language: fr-CH, fr;q=0.9, en;q=0.8, cn;q=0.7, *;q=0.5
    
    Run Code Online (Sandbox Code Playgroud)

    那么默认语言将Italian遵循我们所做的配置。

  3. 出于开发目的,我们可以更改浏览器语言设置(我使用谷歌浏览器)chrome://settings/?search=language并根据您的偏好订购语言。

  4. 我们可以根据目标用户的选择,以编程方式将 cookie 添加NEXT_LOCALE到目标用户的浏览器,从而设置下一次渲染的默认语言。例子:

    Accept-Language: de, de;q=0.9, it;q=0.8, en;q=0.7, *;q=0.5
    
    # Note: the `q` value may be differs, the bigger will get the most priority
    
    Run Code Online (Sandbox Code Playgroud)
  5. 请务必检查文档以获取最新更新。