ibird-i18n
Version:
i18n addon for ibird.
177 lines (162 loc) • 3.68 kB
JavaScript
/**
* 国际化模块
*/
const utility = require('ibird-utils');
const Mustache = require('mustache');
const namespace = 'ibird-i18n';
const presetLocale = 'en_US';
const zh_CN = require('./locales/zh_CN.json');
const en_US = require('./locales/en_US.json');
/**
* 当前启用的语言环境
*/
const enabled = {
name: presetLocale,
locale: en_US
};
/**
* 全局变量
*/
var locales = {
zh_CN,
en_US
};
var ctx = {};
var routes = ['i18n_name', 'i18n_switch', 'i18n_list'];
/**
* 加载插件
* @param app
* @param options
*/
function onload(app, options) {
locales = {
zh_CN,
en_US
};
ctx = {};
ctx.app = app;
ctx.options = options || {};
const config = app.c();
// 注册所有配置
if (ctx.options.locales && Object.keys(ctx.options.locales).length > 0) {
utility.assign(locales, ctx.options.locales);
}
ctx.options.defaultLocale = ctx.options.defaultLocale || presetLocale;
// 切换默认环境
switchLocale(ctx.options.defaultLocale);
// 挂载目录
if (ctx.options.dir) {
addLocaleDir(ctx.options.dir);
}
// 加工路由
for (const key of routes) {
const item = require(`./routes/${key}`);
routes[key] = item(ctx);
}
app.locales = locales;
app.defaultLocale = ctx.options.defaultLocale;
}
/**
* 添加语言环境
* @param name 名称
* @param locale 配置对象
*/
function addLocale(name, locale) {
if (!name) return;
if (typeof name !== 'string' && !locale) return;
locales[name] = locale;
}
/**
* 自动挂载国际化资源目录
* @param dir 文件目录
*/
function addLocaleDir(dir) {
utility.recursiveDir(dir, (obj, parse) => {
addLocale(parse.name, obj);
}, parse => ['.js', '.json'].indexOf(parse.ext) >= 0);
}
/**
* 切换语言环境
* @param name 名称
* @param locale 配置对象
*/
function switchLocale(name) {
if (!name) return;
enabled.name = name;
enabled.locale = locales[name] || {};
return enabled.locale;
}
/**
* 刪除语言环境
* @param name 名称
* @param locale 配置对象
*/
function removeLocale(name) {
if (!name) return;
delete locales[name];
}
/**
* 清空所有语言环境
*/
function clearLocale() {
for (const name in locales) {
removeLocale(name)
}
}
/**
* 获取语言环境
* @param name 名称
*/
function getLocale(name) {
return name ? (locales[name] || null) : null;
}
/**
* 获取所有语言环境
*/
function getLocaleList() {
return locales;
}
/**
* 获取国际化值
* @param key
* @param params
* @param localeOrName
*/
function getLocaleString(key, params, localeOrName) {
let locale = (typeof localeOrName === 'string') ? locales[localeOrName] : null;
if (!locale || Object.keys(locale).length === 0) {
localeOrName = presetLocale;
locale = locales[localeOrName]
}
if (!locale || Object.keys(locale).length === 0) {
localeOrName = ctx.options.defaultLocale;
locale = locales[localeOrName]
}
if (!locale || Object.keys(locale).length === 0) {
throw new Error('Invalid i18n settings.');
}
const value = locale[key];
if (!key || !value) return null;
return Mustache.render(value, params);
}
/**
* 导出模块
*/
module.exports = {
namespace,
onload,
api: {
enabledLocale: enabled,
addLocale,
addLocaleDir,
removeLocale,
clearLocale,
switchLocale,
getLocale,
getLocaleList,
getLocaleString,
L: getLocaleString,
locale: getLocaleString
},
routes
};