diff --git a/packages/apps/vueapp/babel.config.js b/packages/apps/vueapp/babel.config.js
index a9093f4..1eac18a 100644
--- a/packages/apps/vueapp/babel.config.js
+++ b/packages/apps/vueapp/babel.config.js
@@ -1,24 +1,17 @@
const i18nPlugin =require("@voerkai18n/babel")
module.exports = {
presets: [
- "@babel/preset-env",
- {
- corejs: {
- useBuiltIns: 'entry',
- version: "3.8",
- proposals: true
- }
- }
+ "@babel/preset-env"
],
plugins: [
- [
- i18nPlugin,
- {
- // 可选,指定语言文件存放的目录,即保存编译后的语言文件的文件夹
- // 可以指定相对路径,也可以指定绝对路径
- // location:"",
- autoImport:"/src/languages/index.js"
- }
- ]
+ // [
+ // i18nPlugin,
+ // {
+ // // 可选,指定语言文件存放的目录,即保存编译后的语言文件的文件夹
+ // // 可以指定相对路径,也可以指定绝对路径
+ // // location:"",
+ // autoImport:"/src/languages/index.js"
+ // }
+ // ]
]
}
\ No newline at end of file
diff --git a/packages/apps/vueapp/src/App.vue b/packages/apps/vueapp/src/App.vue
index 521f2c8..d307d1f 100644
--- a/packages/apps/vueapp/src/App.vue
+++ b/packages/apps/vueapp/src/App.vue
@@ -1,5 +1,5 @@
-
-

-
{{ t("中华人民共和国")}}
-
{{ t("迎接中华民族的伟大复兴")}}
-
-
+
+

+
{{ t("中华人民共和国") }}
+
{{ t("迎接中华民族的伟大复兴") }}
+
+
默认语言:{{ i18n.defaultLanguage }}
当前语言:{{ i18n.activeLanguage.value }}
-
-
-
-
+
+
+
+
diff --git a/packages/apps/vueapp/vite.config.js b/packages/apps/vueapp/vite.config.js
index 387e36d..d4e3052 100644
--- a/packages/apps/vueapp/vite.config.js
+++ b/packages/apps/vueapp/vite.config.js
@@ -1,4 +1,4 @@
-import { defineConfig } from 'vite'
+import { defineConfig,loadEnv } from 'vite'
import vue from '@vitejs/plugin-vue'
import legacy from '@vitejs/plugin-legacy'
import { babel } from '@rollup/plugin-babel';
@@ -19,5 +19,8 @@ export default defineConfig({
alias:{
//"voerkai18n":"./languages/index.js"
}
+ },
+ define:{
+ 'process.env':{...process.env, ...loadEnv("dev", process.cwd())}
}
})
diff --git a/packages/cli/languages/de.js b/packages/cli/languages/de.js
index 3fb74ad..9c8c69a 100644
--- a/packages/cli/languages/de.js
+++ b/packages/cli/languages/de.js
@@ -1,8 +1,8 @@
-module.exports = {
- "1": "支持的语言\\t: {}",
- "2": "默认语言\\t: {}",
- "3": "激活语言\\t: {}",
- "4": "名称空间\\t: {}",
+export default {
+ "1": "支持的语言\t: {}",
+ "2": "默认语言\t: {}",
+ "3": "激活语言\t: {}",
+ "4": "名称空间\t: {}",
"5": " - 更新格式化器:{}",
"6": " - 访问入口文件: {}",
"7": "加载多语言配置文件<{}>失败: {} ",
@@ -26,7 +26,7 @@ module.exports = {
"25": "编译指定项目的语言包",
"26": "输出模块类型,取值auto,esm,cjs",
"27": "语言包文件夹<{}>不存在",
- "28": "语言配置文件{}文件已存在,跳过创建。\\n使用{}可以重新覆盖创建",
+ "28": "语言配置文件{}文件已存在,跳过创建。\n使用{}可以重新覆盖创建",
"29": "生成语言配置文件:{}",
"30": "拟支持的语言:{}",
"31": "初始化成功,下一步:",
@@ -34,7 +34,7 @@ module.exports = {
"33": " - 运行<{}>扫描提取要翻译的文本",
"34": " - 运行<{}>编译语言包",
"35": "创建语言包文件夹: {}",
- "36": "模块类型\\t: {}",
+ "36": "模块类型\t: {}",
"37": "编译结果输出至:{}",
"38": "读取语言文件{}失败:{}",
"39": " - 语言包文件: {}",
diff --git a/packages/cli/languages/en.js b/packages/cli/languages/en.js
index 083d00e..60c00bd 100644
--- a/packages/cli/languages/en.js
+++ b/packages/cli/languages/en.js
@@ -1,8 +1,8 @@
-module.exports = {
- "1": "Supported languages\\t: {}",
- "2": "Default language\\t: {}",
- "3": "Active language\\t\\t: {}",
- "4": "Namespaces\\t\\t: {}",
+export default {
+ "1": "Supported languages\t: {}",
+ "2": "Default language\t: {}",
+ "3": "Active language\t\t: {}",
+ "4": "Namespaces\t\t: {}",
"5": " - Update formatters:{}",
"6": " - Entry of language: {}",
"7": "Failed to load multilingual configuration file <{}>: {}",
@@ -26,7 +26,7 @@ module.exports = {
"25": "Compiles the language messages for project",
"26": "Output module type, values: auto, esm, cjs",
"27": "The language messages folder <{}> does not exist",
- "28": "Language configuration {} file already exists, skipping creation\\n use {} to overwrite the creation",
+ "28": "Language configuration {} file already exists, skipping creation\n use {} to overwrite the creation",
"29": "Generate language configuration: {}",
"30": "Languages to be supported:{}",
"31": "Initialization succeeded, next step:",
@@ -34,7 +34,7 @@ module.exports = {
"33": " - Run <{}> scan to extract the messages to be translated",
"34": " - Run <{}> compile language messages",
"35": "Create folder: {}",
- "36": "Type of module\\t\\t: {}",
+ "36": "Type of module\t\t: {}",
"37": "Compile to:{}",
"38": "Error while read language file{}: {}",
"39": " - Language file: {}",
diff --git a/packages/cli/languages/formatters.js b/packages/cli/languages/formatters.js
index ec81ae7..85bf0b3 100644
--- a/packages/cli/languages/formatters.js
+++ b/packages/cli/languages/formatters.js
@@ -46,7 +46,7 @@
*
*/
-module.exports = {
+export default {
// 在所有语言下生效的格式化器
"*":{
//[格式化名称]:(value)=>{...},
diff --git a/packages/cli/languages/idMap.js b/packages/cli/languages/idMap.js
index dd07250..7d58237 100644
--- a/packages/cli/languages/idMap.js
+++ b/packages/cli/languages/idMap.js
@@ -1,8 +1,8 @@
-module.exports = {
- "支持的语言\\t: {}": 1,
- "默认语言\\t: {}": 2,
- "激活语言\\t: {}": 3,
- "名称空间\\t: {}": 4,
+export default {
+ "支持的语言\t: {}": 1,
+ "默认语言\t: {}": 2,
+ "激活语言\t: {}": 3,
+ "名称空间\t: {}": 4,
" - 更新格式化器:{}": 5,
" - 访问入口文件: {}": 6,
"加载多语言配置文件<{}>失败: {} ": 7,
@@ -26,7 +26,7 @@ module.exports = {
"编译指定项目的语言包": 25,
"输出模块类型,取值auto,esm,cjs": 26,
"语言包文件夹<{}>不存在": 27,
- "语言配置文件{}文件已存在,跳过创建。\\n使用{}可以重新覆盖创建": 28,
+ "语言配置文件{}文件已存在,跳过创建。\n使用{}可以重新覆盖创建": 28,
"生成语言配置文件:{}": 29,
"拟支持的语言:{}": 30,
"初始化成功,下一步:": 31,
@@ -34,7 +34,7 @@ module.exports = {
" - 运行<{}>扫描提取要翻译的文本": 33,
" - 运行<{}>编译语言包": 34,
"创建语言包文件夹: {}": 35,
- "模块类型\\t: {}": 36,
+ "模块类型\t: {}": 36,
"编译结果输出至:{}": 37,
"读取语言文件{}失败:{}": 38,
" - 语言包文件: {}": 39,
diff --git a/packages/cli/languages/index.js b/packages/cli/languages/index.js
index e5f478b..4abd123 100644
--- a/packages/cli/languages/index.js
+++ b/packages/cli/languages/index.js
@@ -1,9 +1,10 @@
-const messageIds = require("./idMap")
-const { translate,i18nScope } = require("./runtime.js")
+import messageIds from "./idMap.js"
+import runtime from "./runtime.js"
+const { translate,i18nScope } = runtime
-const formatters = require("./formatters.js")
-const defaultMessages = require("./zh.js")
+import formatters from "./formatters.js"
+import defaultMessages from "./zh.js"
const activeMessages = defaultMessages
@@ -12,15 +13,15 @@ const scopeSettings = {
"languages": [
{
"name": "zh",
- "title": "zh"
+ "title": "中文"
},
{
"name": "en",
- "title": "en"
+ "title": "英文"
},
{
"name": "de",
- "title": "de"
+ "title": "德语"
}
],
"defaultLanguage": "zh",
@@ -44,6 +45,8 @@ const scope = new i18nScope({
// 翻译函数
const scopedTtranslate = translate.bind(scope)
-module.exports.t = scopedTtranslate
-module.exports.i18nScope = scope
+export {
+ scopedTtranslate as t,
+ scope as i18nScope
+}
diff --git a/packages/cli/languages/runtime.js b/packages/cli/languages/runtime.js
index 928bd74..df91f86 100644
--- a/packages/cli/languages/runtime.js
+++ b/packages/cli/languages/runtime.js
@@ -1,11 +1,9 @@
-'use strict';
-
/**
* 判断是否是JSON对象
* @param {*} obj
* @returns
*/
- function isPlainObject$2(obj){
+ function isPlainObject$1(obj){
if (typeof obj !== 'object' || obj === null) return false;
var proto = Object.getPrototypeOf(obj);
if (proto === null) return true;
@@ -82,7 +80,7 @@ function deepMerge$1(toObj,formObj,options={}){
var utils ={
- isPlainObject: isPlainObject$2,
+ isPlainObject: isPlainObject$1,
isNumber: isNumber$1,
deepMerge: deepMerge$1,
getDataTypeName: getDataTypeName$1
@@ -121,24 +119,21 @@ var eventemitter = class EventEmitter{
}
};
-const { isPlainObject: isPlainObject$1 } = utils;
-
const DataTypes$1 = ["String","Number","Boolean","Object","Array","Function","Null","Undefined","Symbol","Date","RegExp","Error"];
var scope = class i18nScope {
constructor(options={},callback){
// 每个作用域都有一个唯一的id
this._id = options.id || (new Date().getTime().toString()+parseInt(Math.random()*1000));
- this._languages = options.languages; // 当前作用域的语言列表
+ this._languages = options.languages; // 当前作用域的语言列表
this._defaultLanguage = options.defaultLanguage || "zh"; // 默认语言名称
- this._activeLanguage = options.activeLanguage; // 当前语言名称
+ this._activeLanguage = options.activeLanguage; // 当前语言名称
this._default = options.default; // 默认语言包
this._messages = options.messages; // 当前语言包
this._idMap = options.idMap; // 消息id映射列表
this._formatters = options.formatters; // 当前作用域的格式化函数列表
this._loaders = options.loaders; // 异步加载语言文件的函数列表
this._global = null; // 引用全局VoerkaI18n配置,注册后自动引用
- this._patchMessages = {}; // 语言包补丁信息 {:{....},:{....}}
// 主要用来缓存格式化器的引用,当使用格式化器时可以直接引用,避免检索
this.$cache={
activeLanguage : null,
@@ -154,10 +149,8 @@ var scope = class i18nScope {
activeLanguage : this.activeLanguage,
languages: options.languages,
});
- }
+ }
this.global = globalThis.VoerkaI18n;
- this._mergePatchedMessages();
- this._patch(this._messages,this.activeLanguage);
// 正在加载语言包标识
this._loading=false;
// 在全局注册作用域
@@ -177,8 +170,6 @@ var scope = class i18nScope {
get idMap(){return this._idMap}
// 当前作用域的格式化函数列表
get formatters(){return this._formatters}
- // 当前作用域支持的语言
- get languages(){return this._languages}
// 异步加载语言文件的函数列表
get loaders(){return this._loaders}
// 引用全局VoerkaI18n配置,注册后自动引用
@@ -202,13 +193,6 @@ var scope = class i18nScope {
this.formatters[language][name] = formatter;
}
}
- /**
- * 注册默认文本信息加载器
- * @param {Function} 必须是异步函数或者是返回Promise
- */
- registerDefaultLoader(fn){
- this.global.registerDefaultLoader(fn);
- }
/**
* 回退到默认语言
*/
@@ -226,90 +210,22 @@ var scope = class i18nScope {
// 默认语言,默认语言采用静态加载方式,只需要简单的替换即可
if(newLanguage === this.defaultLanguage){
this._messages = this._default;
- await this._patch(this._messages,newLanguage); // 异步补丁
return
}
// 非默认语言需要异步加载语言包文件,加载器是一个异步函数
// 如果没有加载器,则无法加载语言包,因此回退到默认语言
- let loader = this.loaders[newLanguage];
- try{
- if(typeof(loader) === "function"){
+ const loader = this.loaders[newLanguage];
+ if(typeof(loader) === "function"){
+ try{
this._messages = (await loader()).default;
- this._activeLanguage = newLanguage;
- await this._patch(this._messages,newLanguage);
- }else if(typeof(this.global.defaultMessageLoader) === "function"){// 如果该语言没有指定加载器,则使用全局配置的默认加载器
- this._messages = await this.global.loadMessagesFromDefaultLoader(newLanguage,this);
this._activeLanguage = newLanguage;
- }else {
+ }catch(e){
+ console.warn(`Error while loading language <${newLanguage}> on i18nScope(${this.id}): ${e.message}`);
this._fallback();
- }
- }catch(e){
- console.warn(`Error while loading language <${newLanguage}> on i18nScope(${this.id}): ${e.message}`);
+ }
+ }else {
this._fallback();
- }
- }
- /**
- * 当指定了默认语言包加载器后,会从服务加载语言补丁包来更新本地的语言包
- *
- * 补丁包会自动存储到本地的LocalStorage中
- *
- * @param {*} messages
- * @param {*} newLanguage
- * @returns
- */
- async _patch(messages,newLanguage){
- if(typeof(this.global.loadMessagesFromDefaultLoader) !== 'function') return
- try{
- let pachedMessages = await this.global.loadMessagesFromDefaultLoader(newLanguage,this);
- if(isPlainObject$1(pachedMessages)){
- Object.assign(messages,pachedMessages);
- this._savePatchedMessages(pachedMessages,newLanguage);
- }
- }catch{}
- }
- /**
- * 从本地存储中读取语言包补丁合并到当前语言包中
- */
- _mergePatchedMessages(){
- let patchedMessages= this._getPatchedMessages(this.activeLanguage);
- if(isPlainObject$1(patchedMessages)){
- Object.assign(this._messages,patchedMessages);
- }
- }
- /**
- * 将读取的补丁包保存到本地的LocalStorage中
- *
- * 为什么要保存到本地的LocalStorage中?
- *
- * 因为默认语言是静态嵌入到源码中的,而加载语言包补丁是延后异步的,
- * 当应用启动第一次就会渲染出来的是没有打过补丁的内容。
- *
- * - 如果还需要等待从服务器加载语言补丁合并后再渲染会影响速度
- * - 如果不等待从服务器加载语言补丁就渲染,则会先显示未打补丁的内容,然后在打完补丁后再对应用进行重新渲染生效
- * 这明显不是个好的方式
- *
- * 因此,采用的方式是:
- * - 加载语言包补丁后,将之保存到到本地的LocalStorage中
- * - 当应用加载时会查询是否存在补丁,如果存在就会合并渲染
- * -
- *
- * @param {*} messages
- */
- _savePatchedMessages(messages,language){
- try{
- if(globalThis.localStorage){
- globalThis.localStorage.setItem(`voerkai18n_${this.id}_${language}_patched_messages`, JSON.stringify(messages));
- }
- }catch(e){
- console.error("Error while save voerkai18n patched messages:",e.message);
- }
- }
- _getPatchedMessages(language){
- try{
- return JSON.parse(localStorage.getItem(`voerkai18n_${this.id}_${language}_patched_messages`))
- }catch(e){
- return {}
- }
+ }
}
// 以下方法引用全局VoerkaI18n实例的方法
get on(){return this.global.on.bind(this.global)}
@@ -362,28 +278,20 @@ var formatters = {
$types:{
Date:(value)=>value.toLocaleString()
},
- // 日期
- date: (value)=> value.toLocaleDateString(),
- shortdate: (value)=> `${value.getFullYear()}-${value.getMonth()+1}-${value.getDate()}`,
-
- // 时间
time:(value)=> value.toLocaleTimeString(),
shorttime:(value)=> value.toLocaleTimeString(),
-
+ date: (value)=> value.toLocaleDateString(),
dict, //字典格式化器
},
zh:{
$types:{
Date:(value)=> `${value.getFullYear()}年${value.getMonth()+1}月${value.getDate()}日 ${value.getHours()}点${value.getMinutes()}分${value.getSeconds()}秒`
},
- // 日期
- date: (value)=> `${value.getFullYear()}年${value.getMonth()+1}月${value.getDate()}日`,
- shortdate: (value)=> `${value.getFullYear()}-${value.getMonth()+1}-${value.getDate()}`,
- // 时间
shortime:(value)=> value.toLocaleTimeString(),
time:(value)=>`${value.getHours()}点${value.getMinutes()}分${value.getSeconds()}秒`,
- // 货币
- currency:(value)=>`¥${value}元`,
+ date: (value)=> `${value.getFullYear()}年${value.getMonth()+1}月${value.getDate()}日`,
+ shortdate: (value)=> `${value.getFullYear()}-${value.getMonth()+1}-${value.getDate()}`,
+ currency:(value)=>`${value}元`,
},
en:{
currency:(value)=>{
@@ -931,7 +839,6 @@ function translate(message) {
I18nManager.instance = this;
this._settings = deepMerge(defaultLanguageSettings,settings);
this._scopes=[];
- this._defaultMessageLoader = null; // 默认文本加载器
return I18nManager.instance;
}
get settings(){ return this._settings }
@@ -944,22 +851,17 @@ function translate(message) {
get languages(){ return this._settings.languages}
// 内置格式化器
get formatters(){ return inlineFormatters }
- get defaultMessageLoader(){ return this._defaultMessageLoader}
- // 通过默认加载器加载文件
- async loadMessagesFromDefaultLoader(newLanguage,scope){
- if(typeof(this._defaultMessageLoader) != "function") return //throw new Error("No default message loader specified")
- return await this._defaultMessageLoader.call(scope,newLanguage,scope)
- }
/**
* 切换语言
*/
async change(value){
value=value.trim();
- if(this.languages.findIndex(lang=>lang.name === value)!==-1 || typeof(this._defaultMessageLoader)==="function"){
+ if(this.languages.findIndex(lang=>lang.name === value)!==-1){
// 通知所有作用域刷新到对应的语言包
await this._refreshScopes(value);
- this._settings.activeLanguage = value;
- await this.emit(value); /// 触发语言切换事件
+ this._settings.activeLanguage = value;
+ /// 触发语言切换事件
+ await this.emit(value);
}else {
throw new Error("Not supported language:"+value)
}
@@ -981,7 +883,7 @@ function translate(message) {
}
}catch(e){
console.warn("Error while refreshing i18n scopes:",e.message);
- }
+ }
}
/**
*
@@ -1019,25 +921,6 @@ function translate(message) {
this.formatters[language][name] = formatter;
}
}
- /**
- * 注册默认文本信息加载器
- */
- registerDefaultLoader(fn){
- if(typeof(fn) !== 'function') throw new Error("The default loader must be a async function or promise returned")
- this._defaultMessageLoader = fn;
- this.refresh();
- }
- async refresh(){
- try{
- let requests = this._scopes.map(scope=>scope.refresh());
- if(Promise.allSettled){
- await Promise.allSettled(requests);
- }else {
- await Promise.all(requests);
- }
- }catch{}
- }
-
}
var runtime ={
@@ -1052,4 +935,4 @@ var runtime ={
isPlainObject
};
-module.exports = runtime;
+export { runtime as default };
diff --git a/packages/cli/languages/settings.json b/packages/cli/languages/settings.json
index 00da4a9..ecdb463 100644
--- a/packages/cli/languages/settings.json
+++ b/packages/cli/languages/settings.json
@@ -2,15 +2,15 @@
"languages": [
{
"name": "zh",
- "title": "zh"
+ "title": "中文"
},
{
"name": "en",
- "title": "en"
+ "title": "英文"
},
{
"name": "de",
- "title": "de"
+ "title": "德语"
}
],
"defaultLanguage": "zh",
diff --git a/packages/cli/languages/translates/default.json b/packages/cli/languages/translates/default.json
index e5e1994..e30f518 100644
--- a/packages/cli/languages/translates/default.json
+++ b/packages/cli/languages/translates/default.json
@@ -1,35 +1,35 @@
{
- "支持的语言\\t: {}": {
- "en": "Supported languages\\t: {}",
+ "支持的语言\t: {}": {
+ "en": "Supported languages\t: {}",
"$file": [
"compile.command.js",
"extract.plugin.js"
],
- "de": "支持的语言\\t: {}"
+ "de": "支持的语言\t: {}"
},
- "默认语言\\t: {}": {
- "en": "Default language\\t: {}",
+ "默认语言\t: {}": {
+ "en": "Default language\t: {}",
"$file": [
"compile.command.js",
"extract.plugin.js"
],
- "de": "默认语言\\t: {}"
+ "de": "默认语言\t: {}"
},
- "激活语言\\t: {}": {
- "en": "Active language\\t\\t: {}",
+ "激活语言\t: {}": {
+ "en": "Active language\t\t: {}",
"$file": [
"compile.command.js",
"extract.plugin.js"
],
- "de": "激活语言\\t: {}"
+ "de": "激活语言\t: {}"
},
- "名称空间\\t: {}": {
- "en": "Namespaces\\t\\t: {}",
+ "名称空间\t: {}": {
+ "en": "Namespaces\t\t: {}",
"$file": [
"compile.command.js",
"extract.plugin.js"
],
- "de": "名称空间\\t: {}"
+ "de": "名称空间\t: {}"
},
" - 更新格式化器:{}": {
"en": " - Update formatters:{}",
@@ -192,12 +192,12 @@
],
"de": "语言包文件夹<{}>不存在"
},
- "语言配置文件{}文件已存在,跳过创建。\\n使用{}可以重新覆盖创建": {
- "en": "Language configuration {} file already exists, skipping creation\\n use {} to overwrite the creation",
+ "语言配置文件{}文件已存在,跳过创建。\n使用{}可以重新覆盖创建": {
+ "en": "Language configuration {} file already exists, skipping creation\n use {} to overwrite the creation",
"$file": [
"init.command.js"
],
- "de": "语言配置文件{}文件已存在,跳过创建。\\n使用{}可以重新覆盖创建"
+ "de": "语言配置文件{}文件已存在,跳过创建。\n使用{}可以重新覆盖创建"
},
"生成语言配置文件:{}": {
"en": "Generate language configuration: {}",
@@ -248,12 +248,12 @@
],
"de": "创建语言包文件夹: {}"
},
- "模块类型\\t: {}": {
- "en": "Type of module\\t\\t: {}",
+ "模块类型\t: {}": {
+ "en": "Type of module\t\t: {}",
"$file": [
"compile.command.js"
],
- "de": "模块类型\\t: {}"
+ "de": "模块类型\t: {}"
},
"编译结果输出至:{}": {
"en": "Compile to:{}",
diff --git a/packages/cli/languages/zh.js b/packages/cli/languages/zh.js
index 3fb74ad..9c8c69a 100644
--- a/packages/cli/languages/zh.js
+++ b/packages/cli/languages/zh.js
@@ -1,8 +1,8 @@
-module.exports = {
- "1": "支持的语言\\t: {}",
- "2": "默认语言\\t: {}",
- "3": "激活语言\\t: {}",
- "4": "名称空间\\t: {}",
+export default {
+ "1": "支持的语言\t: {}",
+ "2": "默认语言\t: {}",
+ "3": "激活语言\t: {}",
+ "4": "名称空间\t: {}",
"5": " - 更新格式化器:{}",
"6": " - 访问入口文件: {}",
"7": "加载多语言配置文件<{}>失败: {} ",
@@ -26,7 +26,7 @@ module.exports = {
"25": "编译指定项目的语言包",
"26": "输出模块类型,取值auto,esm,cjs",
"27": "语言包文件夹<{}>不存在",
- "28": "语言配置文件{}文件已存在,跳过创建。\\n使用{}可以重新覆盖创建",
+ "28": "语言配置文件{}文件已存在,跳过创建。\n使用{}可以重新覆盖创建",
"29": "生成语言配置文件:{}",
"30": "拟支持的语言:{}",
"31": "初始化成功,下一步:",
@@ -34,7 +34,7 @@ module.exports = {
"33": " - 运行<{}>扫描提取要翻译的文本",
"34": " - 运行<{}>编译语言包",
"35": "创建语言包文件夹: {}",
- "36": "模块类型\\t: {}",
+ "36": "模块类型\t: {}",
"37": "编译结果输出至:{}",
"38": "读取语言文件{}失败:{}",
"39": " - 语言包文件: {}",
diff --git a/packages/runtime/index.js b/packages/runtime/index.js
index e0b0138..6f82740 100644
--- a/packages/runtime/index.js
+++ b/packages/runtime/index.js
@@ -428,48 +428,6 @@ function getPluraMessage(messages,value){
}
}
-
-
-// if(!String.prototype.replaceAll){
-// String.prototype.replaceAll = function(searchValue,replaceValue){
-// if (!searchValue) return this
-// if(typeof(searchValue)==="string"){
-// return this.replace(new RegExp(searchValue,"gm"),replaceValue);
-// }else if (searchValue instanceof RegExp) {
-// const { global: globalFlag } = searchValue;
-// if (!globalFlag) {
-// throw new TypeError(
-// '`String.prototype.replaceAll` ponyfill called with a non-global RegExp argument'
-// );
-// }
-// return this.replace(searchValue, replaceValue);
-// }
-// }
-// }
-
-function escape(str){
- return str.replaceAll(/\\(?![trnbvf'"]{1})/g,"\\\\")
- .replaceAll("\t","\\t")
- .replaceAll("\n","\\n")
- .replaceAll("\b","\\b")
- .replaceAll("\r","\\r")
- .replaceAll("\f","\\f")
- .replaceAll("\'","\\'")
- .replaceAll('\"','\\"')
- .replaceAll('\v','\\v')
-}
-function unescape(str){
- return str
- .replaceAll("\\t","\t")
- .replaceAll("\\n","\n")
- .replaceAll("\\b","\b")
- .replaceAll("\\r","\r")
- .replaceAll("\\f","\f")
- .replaceAll("\\'","\'")
- .replaceAll('\\"','\"')
- .replaceAll('\\v','\v')
- .replaceAll(/\\\\(?![trnbvf'"]{1})/g,"\\")
-}
/**
* 翻译函数
*
@@ -532,10 +490,8 @@ function translate(message) {
}else{
// 2.2 从当前语言包中取得翻译文本模板字符串
// 如果没有启用babel插件将源文本转换为msgId,需要先将文本内容转换为msgId
- // JSON.stringify在进行转换时会将\t\n\r转换为\\t\\n\\r,这样在进行匹配时就出错
- let msgId = isMessageId(content) ? content : scope.idMap[escape(content)]
+ let msgId = isMessageId(content) ? content : scope.idMap[content]
content = scope.messages[msgId] || content
- content = Array.isArray(content) ? content.map(v=>unescape(v)) : unescape(content)
}
// 2. 处理复数
// 经过上面的处理,content可能是字符串或者数组
@@ -550,8 +506,7 @@ function translate(message) {
}else{ // 如果找不到复数变量,则使用第一个内容
content = content[0]
}
- }
-
+ }
// 进行插值处理
if(vars.length==0){
return content
diff --git a/packages/vite/index.js b/packages/vite/index.js
index d6950f2..1521263 100644
--- a/packages/vite/index.js
+++ b/packages/vite/index.js
@@ -56,24 +56,13 @@ const importTRegex = /^[^\w\r\n]*import\s*\{(.*)\bt\b(.*)\}\sfrom/gm
}
-function escape(str){
- return str.replaceAll(/\\(?![trnbvf'"]{1})/g,"\\\\")
- .replaceAll("\t","\\t")
- .replaceAll("\n","\\n")
- .replaceAll("\b","\\b")
- .replaceAll("\r","\\r")
- .replaceAll("\f","\\f")
- .replaceAll("\'","\\'")
- .replaceAll('\"','\\"')
- .replaceAll('\v','\\v')
-}
+
function replaceCode(code, idmap) {
- return code.replaceAll(TranslateRegex, (text) => {
- let message = escape(text)
+ return code.replaceAll(TranslateRegex, (message) => {
if(message in idmap) {
return idmap[message]
}else{
- return text
+ return message
}
})
}
diff --git a/packages/vue/index.js b/packages/vue/index.js
index 9a5cd5c..7f50482 100644
--- a/packages/vue/index.js
+++ b/packages/vue/index.js
@@ -11,8 +11,25 @@
*/
+import { cat } from "shelljs"
import { computed,reactive,ref } from "vue"
+function forceUpdate(app){
+ function updateComponent(inst){
+ if(inst && inst.update) inst.update()
+ if(inst.subTree && inst.subTree.children){
+ inst.subTree.children.forEach( vnode=>{
+ if(vnode && vnode.component) updateComponent(vnode.component)
+ })
+ }
+ }
+ try{
+ renderComponent(app._instance.root)
+ }catch(e){
+ console.warn("forceUpdate error: ",e.message)
+ }
+}
+
export default {
install: (app, opts={}) => {
let options = Object.assign({
@@ -46,7 +63,8 @@ export default {
get: () => activeLanguage,
set: (value) => i18nScope.global.change(value).then(()=>{
if(options.forceUpdate){
- app._instance.update()
+ //app._instance.update()
+ forceUpdate(app)
}
})
}),