当前位置: 首页 > 知识库问答 >
问题:

对react生产构建使用i18next会导致转换只显示字符串

臧梓
2023-03-14

我相信我已经在互联网上搜索了所有的部分来寻找答案和修复,但没有一个似乎有效。

问题:

构建生产构建之后,在浏览器控制台(使用chrome)中会显示以下错误:Fetch API不能加载文件:///documents/streaming_site/build/static/locales/en/translation.json。对于CORS请求,URL方案必须是“HTTP”或“HTTPS”。

import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import Backend from 'i18next-http-backend';
import LanguageDetector from 'i18next-browser-languagedetector';
import XHR from 'i18next-xhr-backend';

// don't want to use this?
// have a look at the Quick start guide 
// for passing in lng and translations on init

const Languages = ['en', 'fr'];

i18n
  .use(XHR)
  // load translation using http -> see /public/locales (i.e. https://github.com/i18next/react-i18next/tree/master/example/react/public/locales)
  // learn more: https://github.com/i18next/i18next-http-backend
  .use(Backend)
  // detect user language
  // learn more: https://github.com/i18next/i18next-browser-languageDetector
  .use(LanguageDetector)
  // pass the i18n instance to react-i18next.
  .use(initReactI18next)
  // init i18next
  // for all options read: https://www.i18next.com/overview/configuration-options
  .init({
    lng : 'en',
    react: { 
      useSuspense: false,
      wait: true
    },
    fallbackLng: 'en',
    debug: false,
    whitelist: Languages,
    interpolation: {
      escapeValue: false, // not needed for react as it escapes by default
    },
    nsSeperator : false,
    keySeperator : false,
    backend:{
      loadPath: () => {

        var cors = require('cors');
        var app = cors();
        
        // check the domain
        const host = window.location.host;
        return (host === 'index.html#' ? '':'') + '/static/locales/{{lng}}/{{ns}}.json';
      },
    }
  });


export default i18n;

i18next.init({// <-- This was added
  interpolation: {escapeValue: false},
});
i18next.init().then(() => // <-- This was added
  ReactDOM.render(
    <React.StrictMode>
    <Suspense fallback={<div>Loading...</div>}>// <-- This was added
      <I18nextProvider i18n={i18next}>// <-- This was added
        <App />
      </I18nextProvider>
    </Suspense>
    </React.StrictMode>,
    document.getElementById('root')
  )
);

这使我相信,如果没有承载en和fr的translation.json文件的后端服务器,就不可能在本地访问它们。

我的问题是:在构建生产构建后,是否可以在本地运行i18n翻译,而不需要服务器来托管json文件?如果是,我将如何进行?

对于参考资料,我已经从这个网站上尝试了一些修复方法,例如:

当我尝试-->res.header('access-control-allog-origin',“*”);时,我已经接近了,尽管这是以引起一些安全问题为代价的,我不希望出现这种情况。虽然如果这是一个潜在的修复,我愿意尝试它。

所以在这里我没有主意...:/

共有1个答案

佟和平
2023-03-14

看起来i18next服务有一些错误配置。

首先,i18next-http-backend&i18next-xhr-backend正在解决相同的问题,获取json文件。

删除第二个(i18next-xhr-backend),因为它不推荐使用i18next-http-backend

import i18n from 'i18next';
import { initReactI18next } from 'react-i18next';
import Backend from 'i18next-http-backend';
import LanguageDetector from 'i18next-browser-languagedetector';

// don't want to use this?
// have a look at the Quick start guide
// for passing in lng and translations on init

const Languages = ['en', 'fr'];

i18n
  .use(Backend)
  // detect user language
  // learn more: https://github.com/i18next/i18next-browser-languageDetector
  .use(LanguageDetector)
  // pass the i18n instance to react-i18next.
  .use(initReactI18next)
  // init i18next
  // for all options read: https://www.i18next.com/overview/configuration-options
  .init({
    lng: 'en',
    react: {
      useSuspense: false,
      wait: true,
    },
    fallbackLng: 'en',
    debug: false,
    whitelist: Languages,
    interpolation: {
      escapeValue: false, // not needed for react as it escapes by default
    },
    nsSeperator: false,
    keySeperator: false,
    backend: {
      loadPath: '/locales/{{lng}}/{{ns}}.json',
    },
  });

export default i18n;

 类似资料:
  • 我正在运行一个React-Native应用程序,但当我试图在android目录下gradlew installDebug时,我得到了一个构建失败。以下是我使用时得到的信息: 这是该项目的回购是从我试图设置应用程序到我的genymotion模拟器,但构建从未完成。 我已经运行了react-native start命令,并设置了与couchbase lite服务器的同步。不确定这是否是相关信息。我对本

  • 问题内容: 最近,我按照这篇文章的建议删除了项目中的所有scriptlet 。但是现在,如果我尝试更改其中一个视图,则会收到deferredExpression错误。为了摆脱错误,我只需要终止,然后重新启动项目即可。 这里发生了什么?eclipse是否无法即时编译jstl?有什么我可以更改的,所以我不必每次进行更改都重新部署吗? 堆栈跟踪 问题答案: java.lang.NoSuchFieldEr

  • 我有两个文本文件:PatientForms。txt和主代码列表。txt。 每个文件的每一行都包含一个JSON字符串。例如,我使用以下方法读入文件的内容并将其存储在SortedMap中。 这是我的服务代码。java代码: 以下是我读取文件并将其放置在地图中的方法: 所以,问题是这在IntelliJ中没有错误,但是当我从我的jar文件中运行它时,我得到了一个错误。当我运行程序时,IDE输出的字符串显示

  • 我运行以下命令(它是一个lib项目,但我也在常规项目中得到它):

  • 我试图使用带有外来字符的JSON发出POST请求,例如在其上带有“~”的西班牙语n,但我不断收到此请求和响应错误: 我已经可以使用普通ASCII字符成功发出POST请求,但现在我支持外语,我需要将外文字符转换为UTF-8(或正确的编码最终是什么),除非有更好的方法做到这一点。 这是我的代码: 当我放置断点并在提交之前查看se时,字符看起来是正确的。 更新:代码更新为上面几行的答案,并带有标识它的注