无法在 Vercel 上使用 serverSideTranslations

Nad*_*ror 6 netlify next.js vercel next-i18next

在我的索引页中,我正在使用serverSideTranslations函数。查找翻译文件时出现错误。此错误仅发生在使用 的页面上serverSideTranslations

我部署到 Vercel 和 Netlify。在他们两个中我都遇到了同样的错误。

_app.js我正在使用appWithTranslation.

依赖项:

"dependencies": {
    "@fortawesome/fontawesome-free": "^5.15.4",
    "@netlify/plugin-nextjs": "^3.9.2",
    "axios": "^0.21.1",
    "bootstrap": "^4.6.0",
    "dayjs": "^1.10.4",
    "dotenv": "^8.2.0",
    "fs-extra": "^10.0.0",
    "is-mobile": "^3.0.0",
    "next": "^11.1.2",
    "next-i18next": "^8.9.0",
    "next-seo": "^4.20.0",
    "node-fetch": "^2.6.1",
    "parse": "^3.1.0",
    "react": "17.0.1",
    "react-bootstrap": "^1.5.0",
    "react-dom": "17.0.1",
    "react-infinite-scroller": "^1.2.4",
    "recoil": "^0.1.2",
    "sass": "^1.43.2",
    "ts-node": "^9.1.1"
  }
Run Code Online (Sandbox Code Playgroud)

next.config.js

const path = require('path');
const { PHASE_DEVELOPMENT_SERVER } = require('next/constants')
const i18NextConfig = require('./next-i18next.config');

const prodConfig = {
    generateBuildId: () => 'build-id',
    compress: true,
    target: 'serverless',
    i18n: i18NextConfig.i18n,
    sassOptions: {
        includePaths: [path.join(__dirname, 'styles')],
    },
}
module.exports = (phase, { defaultConfig }) => {
    if (phase === PHASE_DEVELOPMENT_SERVER) {
        return {
            ...defaultConfig,
            ...prodConfig,
            compress: false,
        }
    }

    return prodConfig;
}

Run Code Online (Sandbox Code Playgroud)

下一个-i18next.config.js

const path = require('path');

module.exports = {
  i18n: {
    defaultLocale: 'he',
    locales: ['he'],
    localePath: path.resolve('./locales'), // <<< i tried to put this line here
  },
  keySeparator: '>',
  nsSeparator: '|',
  reloadOnPrerender: false,
  localePath: path.resolve('./locales'), // <<< and also here
};
Run Code Online (Sandbox Code Playgroud)

来自 Vercel lambda 函数的错误消息

ng 请求:错误:ENOENT:没有这样的文件或目录,scandir '/var/task/public/locales/he' at Object.readdirSync (fs.js:1043:3) at getLocaleNamespaces (/var/task/node_modules/next) -i18next/dist/commonjs/config/createConfig.js:175:23) 在 /var/task/node_modules/next-i18next/dist/commonjs/config/createConfig.js:181:20 在 Array.map () 在 getNamespaces (/var/task/node_modules/next-i18next/dist/commonjs/config/createConfig.js:180:44)在createConfig(/var/task/node_modules/next-i18next/dist/commonjs/config/createConfig.js: 221:29) 在 _callee$ (/var/task/node_modules/next-i18next/dist/commonjs/serverSideTranslations.js:199:53) 在 tryCatch (/var/task/node_modules/regenerator-runtime/runtime.js:63 :40) 在 Generator.invoke [as _invoke] (/var/task/node_modules/regenerator-runtime/runtime.js:294:22) 在 Generator.next (/var/task/node_modules/regenerator-runtime/runtime.js) :119:21) { errno: -2, 系统调用: 'scandir', 路径: '/var/task/public/locales/he' }

Lic*_*hte 12

您应该修改项目中的 next-i18next.config.js 文件,并将 path.resolve 添加到区域设置路径。您可以在此存储库中查看示例。确保您知道区域设置文件夹所在的位置,并写入正确的路径。这个问题的答案可以在这个github 线程中找到。


Dev*_*dra 10

注意(Vercel 和 Netlify)

某些无服务器 PaaS 可能无法找到翻译的路径并需要额外的配置。如果您在使用时遇到文件系统问题serverSideTranslations,请设置config.localePath为 use path.resolve

解决方案

你必须设置config.localePath到文件中next-i18next.config.js

例如,

// next-i18next.config.js

const path = require("path");

module.exports = {
  i18n: {
    defaultLocale: 'en',
    locales: ['en', 'fr'],
  },
  // Path to the translation files
  // i.e., ./public/locales/en.json, ./public/locales/fr.json
  localePath: path.resolve("./public/locales"),
}
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅文档