NodeJS 如何在无服务器节点js中使用i18next?

9o685dep  于 2023-03-07  发布在  Node.js
关注(0)|答案(2)|浏览(165)

我正在使用Node JS Azure函数。我正在尝试使用i18next将函数返回的错误消息国际化。我可以找到express或plain node server的示例。在这些情况下,可以使用中间件模式。
但是对于函数,我需要一种方法来调用i18next.t('key '),可能带有一个我找不到的语言参数。在每次调用i18next.t('key')之前调用i18next.changeLanguage()似乎并不实用。
我的框架代码如下所示

const i18next = require("i18next");
const backend = require("i18next-node-fs-backend");

const options = {
    // path where resources get loaded from
    loadPath: '../locales/{{lng}}/{{ns}}.json',
    // path to post missing resources
    addPath: '../locales/{{lng}}/{{ns}}.missing.json',
    // jsonIndent to use when storing json files
    jsonIndent: 4
};

i18next.use(backend).init(options);

exports.getString = (key, lang) => {
   //i18next.changeLanguage(lang,
   return i18next.t(key);
}

有没有可能获取翻译而不做changeLanguage每次?

v09wglhw

v09wglhw1#

正如注解中所指出的,无论何时需要定义或更改语言,都需要调用i18next.changeLanguage(lang)函数。
您可以在这里查看文档。
代码可能如下所示

const i18next = require('i18next')
const backend = require('i18next-node-fs-backend')

const options = {
    // path where resources get loaded from
    loadPath: '../locales/{{lng}}/{{ns}}.json',
    // path to post missing resources
    addPath: '../locales/{{lng}}/{{ns}}.missing.json',
    // jsonIndent to use when storing json files
    jsonIndent: 4
}

i18next.use(backend).init(options)

exports.getString = (key, lang) => {
    return i18next
        .changeLanguage(lang)
        .then((t) => {
            t(key) // -> same as i18next.t
        })
}
lp0sw83n

lp0sw83n2#

我建议使用getFixedT函数,并且不要使用过时的i18next-node-fs-backend,而是使用i18next-fs-backend。

import { dirname, join } from 'path'
import { readdirSync, lstatSync } from 'fs'
import { fileURLToPath } from 'url'
import i18next from 'i18next'
import Backend from 'i18next-fs-backend'

const __dirname = dirname(fileURLToPath(import.meta.url))
const localesFolder = join(__dirname, './locales')

i18next
  .use(Backend)
  .init({
    // debug: true,
    initImmediate: false, // setting initImediate to false, will load the resources synchronously
    fallbackLng: 'en',
    preload: readdirSync(localesFolder).filter((fileName) => {
      const joinedPath = join(localesFolder, fileName)
      return lstatSync(joinedPath).isDirectory()
    }),
    ns: 'news-mailer',
    backend: {
      loadPath: join(localesFolder, '{{lng}}/{{ns}}.json')
    }
  })

export default (lng) => i18next.getFixedT(lng)

在此阅读更多信息:https://locize.com/blog/i18n-serverless/

相关问题