123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- 'use strict';
- const { vsprintf } = require('sprintf-js');
- function i18n(options = {}) {
- this.data = {};
- this.languages = options.languages || ['default'];
- if (!Array.isArray(this.languages)) {
- this.languages = [this.languages];
- }
- }
- i18n.prototype.get = function(languages) {
- const { data } = this;
- const result = {};
- if (languages) {
- if (!Array.isArray(languages)) {
- languages = [languages];
- }
- } else {
- languages = this.languages;
- }
- for (let i = 0, leni = languages.length; i < leni; i++) {
- const lang = languages[i];
- const langData = data[lang];
- if (!langData) continue;
- const keys = Object.keys(langData);
- for (let j = 0, lenj = keys.length; j < lenj; j++) {
- const key = keys[j];
- if (!Object.prototype.hasOwnProperty.call(result, key)) result[key] = langData[key];
- }
- }
- return result;
- };
- i18n.prototype.set = function(lang, data) {
- if (typeof lang !== 'string') throw new TypeError('lang must be a string!');
- if (typeof data !== 'object') throw new TypeError('data is required!');
- this.data[lang] = flattenObject(data);
- return this;
- };
- i18n.prototype.remove = function(lang) {
- if (typeof lang !== 'string') throw new TypeError('lang must be a string!');
- delete this.data[lang];
- return this;
- };
- i18n.prototype.list = function() {
- return Object.keys(this.data);
- };
- function flattenObject(data, obj = {}, parent = '') {
- const keys = Object.keys(data);
- for (let i = 0, len = keys.length; i < len; i++) {
- const key = keys[i];
- const item = data[key];
- if (typeof item === 'object') {
- flattenObject(item, obj, parent + key + '.');
- } else {
- obj[parent + key] = item;
- }
- }
- return obj;
- }
- i18n.prototype.__ = function(lang) {
- const data = this.get(lang);
- return (key, ...args) => {
- if (!key) return '';
- const str = data[key] || key;
- return vsprintf(str, args);
- };
- };
- i18n.prototype._p = function(lang) {
- const data = this.get(lang);
- return (key, ...args) => {
- if (!key) return '';
- const number = args.length ? +args[0] : 0;
- let str = key;
- if (!number && Object.prototype.hasOwnProperty.call(data, key + '.zero')) {
- str = data[key + '.zero'];
- } else if (number === 1 && Object.prototype.hasOwnProperty.call(data, key + '.one')) {
- str = data[key + '.one'];
- } else if (Object.prototype.hasOwnProperty.call(data, key + '.other')) {
- str = data[key + '.other'];
- } else if (Object.prototype.hasOwnProperty.call(data, key)) {
- str = data[key];
- }
- return vsprintf(str, args);
- };
- };
- module.exports = i18n;
|