1

我正在为 NextJS Typescript 项目中的next-i18next集成而苦苦挣扎——在任何地方几乎没有最近的例子。我已经配置了国际化路由,但是只要getServerSideProps语法困扰我,我就无法正确设置 i18next。

我对 Typescript 了解不多,也不熟悉类型声明。

代码看起来像这样,大部分是从 next-i18next 文档中复制的:

### index.tsx

// rest of index.tsx...

export const getServerSideProps: GetServerSideProps = async ({locale}) => ({
  props: {
    ...await serverSideTranslations(locale, ['common', 'header']),
  },
})

export default Home

在我的 IDE 中抛出关于“语言环境”的错误。即使我正在使用 getServerSideProps,我什至不确定它是否是大多数静态项目的最佳解决方案,但如果我最终计划一个 SSR,我似乎无法避免它。提供正确翻译的内容的简单方法 + 具有匹配的 URL 区域设置会很棒。

4

3 回答 3

4

关于 locale 的输入错误是正确的,因为在未设置 i18n 时它可以为空。请参阅此处的讨论:https ://github.com/isaachinman/next-i18next/issues/1307

有多种方法可以处理这个问题

  1. 将语言环境转换为字符串
export const getServerSideProps: GetServerSideProps = async ({ locale }) => ({
  props: {
    ...await serverSideTranslations(locale as string, ['common', 'header']),
  },
})
  1. 在不是可选的地方定义您自己的GetServerSideProps类型并使用该类型。locale
type CustomGetServerSideProps<
  P extends { [key: string]: any } = { [key: string]: any },
  Q extends ParsedUrlQuery = ParsedUrlQuery
> = (context: GetServerSidePropsContext<Q>) => Promise<GetServerSidePropsResult<P>>

type GetServerSidePropsContext<Q extends ParsedUrlQuery = ParsedUrlQuery> = {
  req: IncomingMessage & {
    cookies: NextApiRequestCookies
  }
  res: ServerResponse
  params?: Q
  query: ParsedUrlQuery
  preview?: boolean
  previewData?: PreviewData
  resolvedUrl: string
  locale: string // This is where the magic happens.
  locales?: string[]
  defaultLocale?: string
}

export const getServerSideProps: CustomGetServerSideProps = async ({ locale }) => ({
  props: {
    ...await serverSideTranslations(locale, ['common', 'header']),
  },
})

我自己使用第二个选项,因为这样我就不必一直转换同一个变量,这也已经是一个字符串。

于 2021-11-02T12:29:53.890 回答
1
import { useTranslation } from 'next-i18next'
import { serverSideTranslations } from 'next-i18next/serverSideTranslations'
.....
//try cxt or context (or locale) variables
export const getServerSideProps: GetServerSideProps = async (ctx) => ({
      props: {
        ...await serverSideTranslations(ctx.locale, ['common', 'header']),
      },
    })
    
export default Home

如果它不起作用,请通知我,我将分享我的解决方案。

于 2021-11-02T12:20:50.247 回答
0

从示例中我也想出尝试访问 { locale },它在 getServerSideProps 中是空的。

使用建议的上下文(感谢@illia chill)就像一种魅力。

由于我已经在使用上下文对象 - 将语言环境作为属性访问是一个简单的解决方案。(不能评论,所以需要像这样重新迭代;))

于 2021-12-17T15:20:42.230 回答