# MBT_Nodejs_i18n
**Repository Path**: mbt_tlt/mbt_-nodejs_i18n
## Basic Information
- **Project Name**: MBT_Nodejs_i18n
- **Description**: 一款轻量级 Nodejs i18n 插件
- **Primary Language**: NodeJS
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-11-26
- **Last Updated**: 2022-12-04
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# MBT_Nodejs_i18n
一款由 MBT_TLT 团队开发的轻量化 NodeJS i18n 插件
# 亮点
- 轻量化, 该插件核心仅占约 18 kb
- 支持插值文本的 i18n
- 可在项目运行时主动重置 i18n 对象
- 全局 CLI 指令, 快速构建 i18n 基础文件
# 开发日志
- v1.0.0
- 完成 mbt_nodejs_i18n 核心开发
- v1.0.1
- 更新相关测试代码
- v1.0.2(已废弃)
- 更新 CLI 相关功能
- v1.0.3
- 修复一个在非包本体路径下且不存在相关 i18n 文件时调用自身 i18n 所导致无限回调的致命错误
- 新增 i18n 内置库设计, 目前暂时仅用于供给 mbt_nodejs_i18n 自身防止出现无限回调异常使用, 未来版本考虑提供一些常用的语句翻译
- i18n 函数新增 isUseBuildInLibrary 可选参数, 默认为 false, 用于指定当前语句是使用 i18n 内置库还是项目 i18n 库
- i18nInit 函数新增 i18nTable 可选参数, 默认为 项目 i18n 库对象, 用于指定初始化或重置哪一个 i18n 库对象
- 新增 getI18nTable 函数, 用于获取哪一个 i18n 库的虚拟表对象
- 提供 i18nTableKey 可选参数(string), 目前仅提供 `default` 与 `build-in`, 默认为 `default`, 意为获取项目 i18n 库的虚拟表对象
- 前向兼容更新, 该更新不会影响原有使用
# 未来计划
- 兼容 CommonJS
- 优化 i18nInit 相关逻辑, 使其仅加载并解析做出修复的 i18n 文件
# 安装
```shell
# 使用 MBT_Nodejs_i18n 的全部功能
npm install -g mbt_nodejs_i18n
# 仅使用 MBT_Nodejs_i18n 核心功能
npm install -s mbt_nodejs_i18n
```
# CLI 指令
当全局安装 mbt_nodejs_i18n 时, 你将可以以 mbt-i18n 为 CLI Controller 运行给定的指令:
## 1、create - 创建 i18n 基础文件
```shell
mbt-i18n create [folderPath] [languageArr...]
# folderPath i18n 文件路径 (default: `${ path.resolve('./') }`)
# languageArr 需要翻译的目标语言标志数组 (default: [`${ osLocaleSync() || 'en-US' }`]) osLocaleSync() 用于获取当前系统所设置的语言标识
```
该指令将在给定的 folderPath(默认为当前路径) 路径下创建一个 i18n 文件夹与 languageArr 所给定的所有 i18n json 文件,
若 folderPath 尾路径节点为 i18n 则将会在该路径下直接创建 i18n json 文件
【注意:给定的 folderPath 路径尾节点需保证其符合 npm package 命名规范】
该指令还将会运行以下子指令:
- npm init -y `仅当给定路径下不存在 package.json 时执行该子指令`
- npm install -s mbt_nodejs_i18n `将 mbt_nodejs_i18n 添加到给定路径下项目的运行依赖中`
示例:
```shell
# 1. 在当前路径下创建 i18n 文件夹与相关默认的 i18n 文件(若存在则忽略)
# 2. 依据当前路径下是否存在 package.json 文件选择执行 npm init -y
# 3. 运行 npm install -s mbt_nodejs_i18n 引入 mbt_nodejs_i18n 最新包
mbt-i18n create
# 1. 在 F:/exampleI18n 文件夹下创建 i18n 文件夹与相关默认的 i18n 文件(若存在则忽略)
# 如上例所示...
mbt-i18n create F:/exampleI18n
# 1. 在 F:/exampleI18n 文件夹下创建 i18n 文件夹与 zh-CN.json 与 en-US.json i18n 文件(若存在则忽略)
# 如上例所示...
mbt-i18n create F:/exampleI18n zh-CN en-US
```
# 使用方法
## 0、导入
你可以选择使用以下方法导入并使用 MBT_Nodejs_i18n
1.对于 ES6 而言
```javascript
import i18n from 'mbt_nodejs_i18n'
```
或是
```javascript
import { i18n } from 'mbt_nodejs_i18n'
```
2.对于 NodeJS 而言
非常抱歉, 由于 MBT_Nodejs_i18n 采用 ES module 规范开发, 并且暂时没有提供对于 CommonJS 的相关兼容,
所以若想要使用该插件, 你需要将导入该组件的 JavaScript 文件后缀命名为 .ejs, 然后使用与 ES6 一样的方式导入并使用。
或者可以在你 NodeJS 项目的 package.json 根节点中添加以下配置代码将你的 NodeJS 修改为 ES module 规范
【注意:若你的项目原先遵循 CommonJS 规范开发, 这将导致你的项目出现兼容性问题!】
```text
"type": "module",
```
MBT_Nodejs_i18n 提供了两个暴露方法, 分别为:
- `i18n` - i18n 主函数
- `i18nInit` - i18n 初始化函数, 传入一个存放你项目的 i18n 文件的路径字符串, 若 i18n 文件存放于项目根目录下的名为 i18n 文件夹中, 则无需主动调用该函数
## 1、初始化
MBT_Nodejs_i18n 提供了 i18nInit 函数, 其用于初始化或重置该插件的 i18n 数据信息对象, 该函数文档为:
```javascript
/**
* i18nInit - 支持重新初始化,重新初始化的内容将覆盖原始的 i18nObj 和 i18nLanguageArr
*
* @export
* @const
* @function
* @param { string } [i18nDirPath = path.resolve('./', 'i18n')] - i18n 文件夹路径, 默认为项目根目录的 i18n 文件夹
* */
```
如果你项目的 i18n 相关文件存放于你项目根目录下的 i18n 文件夹中, 无需主动调用该函数, MBT_Nodejs_i18n 已经为你做好了一切 😎
如果你的 i18n 相关文件并不存放于你项目根目录下的 i18n 文件夹中, 则你需要在使用 i18n 前主动调用 i18nInit 函数并传入你项目 i18n 文件的存放路径, 就像这样:
```javascript
// 假设 i18n 文件存放于 'D://i18n' 这个路径下
import { i18nInit } from 'mbt_nodejs_i18n';
// you code ...
i18nInit('D://i18n');
// you code ...
```
## 2、简单的文本
对于简单的文本来说, 直接给定该文本的 key 即可
假设 i18n 相关文件中为:
```json
{
"test": "this is a text"
}
```
示例:
```javascript
const a = i18n('test')
// will show "this is a text" in your console
console.log(a);
```
## 3、插值文本
对于一些需要在文本中进行插值的复杂场景, 只需要在给定该文本的 key 的基础上额外给定一个替换对象 replaceObj 即可,
需要注意的是, 给定的 replaceObj 中必须包含与文本插值相同的 replaceKey 索引
假设 i18n 相关文件中为:
```json
{
"test": "this is a ${ a }"
}
```
示例:
```javascript
const b = i18n('test', {
a: 'text'
});
// will show "this is a text" in your console
console.log(b);
```
## 4、指定 i18n 语言
有些时候, 我们需要特别指定文本输出为某个 i18n 语言, 这时只需要给定其 language 标识即可
假设有 en-US.json 与 zh-CN.json 两个 i18n 相关文件
```json
{
"test": "this is a ${ a }"
}
```
```json
{
"test": "这是一段${ a }"
}
```
示例:
```javascript
const c = i18n('test', {
a: '文本'
}, 'zh-CN');
// will show "这是一段文本" in your console
console.log(c);
```
## 5、指定是否使用 i18n 内置库
在 v1.0.2.1 版本开始, mbt_nodejs_i18n 新增了 i18n 内置库设计, 你可以使用一些 mbt_nodejs_i18n 所提供的 i18n 翻译
假设 mbt_nodejs_i18n i18n 内置库(即 mbt_nodejs_i18n/i18n 中) 有 en-US.json 与 zh-CN.json 两个 i18n 相关文件:
```json
{
"test": "this is a ${ a }"
}
```
```json
{
"test": "这是一段${ a }"
}
```
示例:
```javascript
const d = i18n('test', {
a: '文本'
}, 'zh-CN', true);
const e = i18n('test', {
a: '文本'
}, 'en-US', true);
// will show "这是一段文本 this is a 文本" in your console
console.log(d, e);
```
## 6、重置 i18n 对象
MBT_Nodejs_i18n 所提供的 i18nInit 函数除了用于实现上文提到的初始化功能, 还可以用于随时重置 i18n 对象
应用场景:
- 假设你的 i18n 文件夹中的 i18n 文件会在项目运行时发生改变
- 假设你的 i18n 文件夹会在运行过程中动态加入或删除一些 i18n 文件
那么以上场景发生后, 你可以主动调用 i18nInit 函数来重置 i18n 对象
【注意:调用 i18nInit 将会重新读取并解析给定的 i18n 文件夹下的所有 i18n 文件, 这是一个很耗费性能的过程】
【警告:i18nInit 提供了一个可选参数用于初始化或重置指定的 i18n 库虚拟表对象, 但为了保证正常运行, 请不要使用其去初始化或重置 MBT_Nodejs_i18n i18n 内置库虚拟对象 !】
---
如果你在使用中发现了任何异常, 在此表示抱歉, 请你第一时间提交 Issues 并详细描述异常发生的条件与使用场景, 我们将尽快排查并修复相关异常
如果你觉得这个插件很棒, 请给这个项目一个 Star, 大家的支持是我们进步的最大动力😉