如何使用 withFonts() 配置 i18n

Posted

技术标签:

【中文标题】如何使用 withFonts() 配置 i18n【英文标题】:How to configure i18n with withFonts() 【发布时间】:2021-04-23 14:23:28 【问题描述】:

我正在开发一个使用 Tailwind CSS 进行样式设置的 Next.js 项目。我被困在next.config 文件中。

我几乎已经尝试了一切来使这段代码工作,但不能。

const withPlugins = require("next-compose-plugins");
const withImages = require("next-images");
const withSass = require("@zeit/next-sass");
const withCSS = require("@zeit/next-css");
const withFonts = require("next-fonts");
const webpack = require("webpack");
const path = require("path");

module.exports = withFonts(
  withCSS(
    withImages(
      withSass(
        webpack(config, options) 
          config.module.rules.push(
            test: /\.(eot|ttf|woff|woff2)$/,
            use: 
              loader: "url-loader",
            ,
          );
          config.resolve.modules.push(path.resolve("./"));
          return config;
        ,
      )
    )
  )
);

module.exports = 
  i18n: 
    locales: ['en', 'fr'],
    defaultLocale: 'en',
  ,

我想知道如何将这两件事结合起来。

这是我正在使用的index.js 的代码。

import  useRouter  from 'next/router';
import fr from '../locales/fr';
import en from '../locales/en';

function sth () 
  const router = useRouter();
  const  locale  = router;
  const t = locale === 'en' || 'undefined' ? en : fr;
  console.log(locale);

  return t;

export default function Index() 
  const t  = sth();
  return (
    <>
      <IndexNavbar fixed />
      <section className="header relative pt-16 items-center flex h-screen max-h-860-px">
        <div className="container mx-auto items-center flex flex-wrap">
          <div className="w-full md:w-8/12 lg:w-6/12 xl:w-6/12 px-4">
            <div className="pt-32 sm:pt-0">
              <h2 className="font-semibold text-4xl text-gray-700">
                t.homeMainTitle
              </h2>
            </div>
          </div>
        </div>
      </section>
    </>
);

sth() 函数的内容在Index() 内部,但无论如何都不起作用。

【问题讨论】:

【参考方案1】:

每个文件/模块只能有一个module.exports。您的 next.config.js 应如下所示:

const withPlugins = require("next-compose-plugins");
const withImages = require("next-images");
const withSass = require("@zeit/next-sass");
const withCSS = require("@zeit/next-css");
const withFonts = require("next-fonts");
const webpack = require("webpack");
const path = require("path");

module.exports = withFonts(
  withCSS(
    withImages(
      withSass(
        i18n: 
          locales: ['en', 'fr'],
          defaultLocale: 'en',
        ,
        webpack(config, options) 
          config.module.rules.push(
            test: /\.(eot|ttf|woff|woff2)$/,
            use: 
              loader: "url-loader",
            ,
          );
          config.resolve.modules.push(path.resolve("./"));
          return config;
        ,
      )
    )
  )
);

您传递给最内层插件的对象(在本例中为withSass())是您的Next config 对象。

编辑: 至于您的组件代码,您不能在这样的函数中调用钩子(在本例中为 useRouter)。您需要将其移动到组件中。

export default function Index() 
    const router = useRouter();
    const  locale  = router;
    const t = locale === 'en' ? en : fr;
    
    return (
        // Your render code
    );

【讨论】:

感谢您的回复,我之前尝试过,应用程序启动正常,一切正常。但仍然无法检测到语言。我使用useRouter() 来获取用户的语言。该值未定义。 能否将您尝试检测语言的组件代码添加到原始问题中? @azzmi 您需要将sth() 中的代码移动到组件本身。检查我更新的答案。 我照你说的做了。但。没有什么变化。我仍然得到法语版本,问题不在useRouter() 部分。因为连路线/fr 都不存在。我在主要路线上得到法语版本,在正常世界中应该是英语,这太奇怪了。 还有一点,当我删除withFonts() 部分和所有依赖它的组件时,我的应用程序运行良好。它适用于默认英语和法语/fr

以上是关于如何使用 withFonts() 配置 i18n的主要内容,如果未能解决你的问题,请参考以下文章

如何为仅支持Ruby的项目向i18n添加可用的语言环境?

如何使用 i18n 和 rails 配置语言环境别名?

Java国际化(i18n)

vue前端国际化Vue I18n使用入门

如何使 Angular 11 i18n 在 NRWL NX workspace.json 中工作?

前端不使用 i18n,如何优雅的实现多语言?