oak-frontend-base/lib/platforms/wechatMp/i18n/wxs.js

138 lines
4.6 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.t = t;
/**
* 在wxs环境下实现部分i18n-js内的逻辑
* 参见i18n-js/src/i18n.ts中的translate逻辑
*
* 这里为了能在小程序的wxs环境中运行部分代码写的很奇怪
* 还需要在编译时将正则统一编译成小程序的 getRegExp 语法
*/
function isSet(value) {
return value !== undefined && value !== null;
}
function get(object, path) {
// 沿着路径寻找到对应的值,未找到则返回默认值 defaultValue
return (path.split('.').reduce((o, k) => {
return (o || {})[k];
}, object));
}
function _getPlural(count) {
switch (count) {
case 0: {
return 'zero';
}
case 1: {
return 'one';
}
default: {
return 'other';
}
}
}
const PlaceHolder = /(?:\{\{|%\{)(.*?)(?:\}\}?)/gm;
function interpolate(message, options) {
if (typeof message === 'string') {
// 实测下这个正则在小程序wxs环境中过不去原因未知 by Xc
const matches = message.match(PlaceHolder);
if (!matches) {
return message;
}
while (matches.length) {
let value;
const placeholder = matches.shift();
const name = placeholder.replace(PlaceHolder, "$1");
if (isSet(options[name])) {
value = options[name].toString().replace(/\$/gm, "_#$#_");
}
else if (options.hasOwnProperty(name)) {
value = '';
}
else {
value = `!missing placeholder ${name}`;
}
const regex = new RegExp(placeholder.replace(/\{/gm, "\\{").replace(/\}/gm, "\\}"));
message = message.replace(regex, value);
}
return message.replace(/_#\$#_/g, "$");
}
else if (typeof message === 'object' && isSet(options.count)) {
// 复数形式
const pluralization = _getPlural(options.count);
const message2 = message[pluralization];
return interpolate(message2, options);
}
else {
return `!unrecoganized locales: ${JSON.stringify(message)}`;
}
}
function constructFullKey(key, namespace, moduleName) {
let key2 = key;
if (key.indexOf('::') > 0) {
// 公共模块
key2 = `${moduleName}-l-${key}`.replace('::', '.');
}
else if (key.indexOf(':') > 0) {
// entity
key2 = key.replace(':', '.');
}
else {
// 自身模块
key2 = `${namespace}.${key}`;
}
return key2;
}
let Instance = undefined;
function t(key, p1, p2, p3, p4, p5, p6) {
let fullKey = '';
let hasLocale = false;
if (arguments.length === 7) {
// key, params, oakLocales, oakLng, oakDefaultLng, namespace, module
const params = p1, locales = p2, lng = p3, defaultLng = p4, namespace = p5, moduleName = p6;
if (locales && lng) {
hasLocale = true;
fullKey = constructFullKey(key, namespace, moduleName);
const { [lng]: lngLocales } = locales;
const lngTrans = lngLocales && get(lngLocales, fullKey);
if (lngTrans) {
return interpolate(lngTrans, params);
}
if (defaultLng) {
const { [defaultLng]: dftLngLocales } = locales;
const dftLngTrans = dftLngLocales && get(dftLngLocales, fullKey);
if (dftLngTrans) {
return interpolate(dftLngTrans, params);
}
}
}
}
else if (arguments.length === 6) {
const locales = p1, lng = p2, defaultLng = p3, namespace = p4, moduleName = p5;
if (locales && lng) {
hasLocale = true;
fullKey = constructFullKey(key, namespace, moduleName);
const { [lng]: lngLocales } = locales;
const lngTrans = lngLocales && get(lngLocales, fullKey);
if (lngTrans) {
return lngTrans;
}
if (defaultLng) {
const { [defaultLng]: dftLngLocales } = locales;
const dftLngTrans = dftLngLocales && get(dftLngLocales, fullKey);
if (dftLngTrans) {
return dftLngTrans;
}
}
}
}
// 到这里说明miss了通知AppService层并返回value
if (hasLocale && Instance) {
// todo
Instance.callMethod('loadMissedLocales', fullKey);
}
return fullKey.split('.').pop();
}
function propObserver(locales, oldValue, instance) {
Instance = instance;
}