diff --git a/packages/apps/nodejs/index.js b/packages/apps/nodejs/index.js new file mode 100644 index 0000000..21d6d8f --- /dev/null +++ b/packages/apps/nodejs/index.js @@ -0,0 +1,8 @@ + +const { t,i18nScope } = require("./languages"); + +cn_messages = t("一{}")+t("二")+t("三")+t("四")+t("五") + +console.log(t("这是一个测试:{a}+{b | x}={c}",{a:1,b:2,c:3})) + +console.log("END") \ No newline at end of file diff --git a/packages/apps/nodejs/languages/de.js b/packages/apps/nodejs/languages/de.js new file mode 100644 index 0000000..b10f4f2 --- /dev/null +++ b/packages/apps/nodejs/languages/de.js @@ -0,0 +1,32 @@ +module.exports = { + "1": "Hello world!", + "2": "中华人民共和国", + "3": "迎接中华民族的伟大复兴", + "4": "成立于{}年", + "5": "首都:北京", + "6": "VoerkaI18n多语言解决方案 ", + "7": "现在是{ value | date }", + "8": "现在是{ value | shortdate }", + "9": "现在是{ value | time }", + "10": "现在是{ value | shorttime }", + "11": "现在是{ value | year }", + "12": "现在是{ value | month }", + "13": "现在是{ value | day }", + "14": "现在是{ value | weekdayValue }", + "15": "现在是{ value | weekday }", + "16": "现在是{ value | shortWeekday }", + "17": "现在是{ value | monthName }", + "18": "现在是{ value | shorMonthName }", + "19": "现在是{ value | hour }", + "20": "现在是{ value | hour12 }", + "21": "现在是{ value | minute }", + "22": "现在是{ value | second }", + "23": "现在是{ value | millisecond }", + "24": "现在是{ value | timestamp }", + "25": "商品价格:{ value | currency }", + "26": "商品价格:{ value | capitalizeCurrency }", + "27": "现在是{ value }", + "28": "商品价格:{ value | currency('CNY','元整',3)}", + "29": "商品价格:{ value | capitalizeCurrency(true) }", + "30": "商品数量:{ value | number }" +} \ No newline at end of file diff --git a/packages/apps/nodejs/languages/en.js b/packages/apps/nodejs/languages/en.js new file mode 100644 index 0000000..fa0f511 --- /dev/null +++ b/packages/apps/nodejs/languages/en.js @@ -0,0 +1,34 @@ +module.exports = { + "1": "VoerkaI18n多语言解决方案 ", + "2": "EN Hello world!", + "3": "The People's Republic of China", + "4": "Welcome the great rejuvenation of the Chinese nation", + "5": "Founded in {}", + "6": "Capital: Beijing", + "7": "Price:{ value | currency }", + "8": "Price:{ value | capitalizeCurrency }", + "9": "Price:{ value | capitalizeCurrency(true) }", + "10": "Count:{ value | number }", + "11": "Now is { value }", + "12": "Now is { value | date }", + "13": "Now is { value | date | empty }", + "14": "Now is { value | date | empty('无') }", + "15": "Now is { value | shortdate }", + "16": "Now is { value | time }", + "17": "Now is { value | shorttime }", + "18": "Now is { value | year }", + "19": "Now is { value | month }", + "20": "Now is { value | day }", + "21": "Now is { value | weekdayValue }", + "22": "Now is { value | weekday }", + "23": "Now is { value | shortWeekday }", + "24": "Now is { value | monthName }", + "25": "Now is { value | shorMonthName }", + "26": "Now is { value | hour }", + "27": "Now is { value | hour12 }", + "28": "Now is { value | minute }", + "29": "Now is { value | second }", + "30": "Now is { value | millisecond }", + "31": "Now is { value | timestamp }", + "32": "Price:{ value | currency('CNY','元整',3)}" +} \ No newline at end of file diff --git a/packages/apps/nodejs/languages/formatters/de.js b/packages/apps/nodejs/languages/formatters/de.js new file mode 100644 index 0000000..e927210 --- /dev/null +++ b/packages/apps/nodejs/languages/formatters/de.js @@ -0,0 +1,66 @@ +/** + + 格式化器用来对翻译文本内容中的插值变量进行处理 + + 比如将一个数字格式化为货币格式,或者将一个日期格式化为友好的日期格式。 + + - 以下定义了一些格式化器,在中文场景下,会启用这些格式化器。 + import dayjs from "dayjs"; + export default { + $types:{ + Date:(value)=>dayjs(value).format("YYYY年MM月DD日 HH:mm:ss"), + }, + date:(value)=>dayjs(value).format("YYYY年MM月DD日") + bjTime:(value)=>"北京时间"+ value, + [格式化器名称]:(value)=>{...}, + [格式化器名称]:(value)=>{...}, + [格式化器名称]:(value)=>{...}, + } + } + - 在翻译函数中使用格式化器的方法,示例如下: + + t("Now is { value | date | bjTime }",{value: new Date()}) + 其等效于: + t(`Now is ${bjTime(date(value))",{value: new Date()}) + 由于value分别经过两个管道符转换,上一个管道符的输出作为下一个管道符的输入,可以多次使用管道符。 + 最终的输出结果: + 中文: "现在是北京时间2022年3月1日" + 英文: "Now is BeiJing 2022/03/01" + */ + + +module.exports = { + // 格式化器参数 + $settings:{ }, + // 指定数据类型的默认格式化器 + $types:{ + // "*" : { }, + // Date : { }, + // Number: { }, + // String: { }, + // Array : { }, + // Object: { } + } + // 允许重载内置的格式化器 + // date : value => { ... }, + // shortdate : value => { ... }, + // time : value => { ... }, + // shorttime : value => { ... }, + // year : value => { ... }, + // month : value => { ... }, + // day : value => { ... }, + // weekdayValue : value => { ... }, + // weekday : value => { ... }, + // shortWeekday : value => { ... }, + // monthName : value => { ... }, + // shorMonthName : value => { ... }, + // // 时间 + // hour : value => { ... }, + // hour12 : value => { ... }, + // minute : value => { ... }, + // second : value => { ... }, + // millisecond : value => { ... }, + // timestamp : value => { ... }, + // currency : value => { ... }, + // number : value => { ... }, +} diff --git a/packages/apps/nodejs/languages/formatters/en.js b/packages/apps/nodejs/languages/formatters/en.js new file mode 100644 index 0000000..8678987 --- /dev/null +++ b/packages/apps/nodejs/languages/formatters/en.js @@ -0,0 +1,86 @@ +/** + + 格式化器用来对翻译文本内容中的插值变量进行格式化, + 比如将一个数字格式化为货币格式,或者将一个日期格式化为友好的日期格式。 + + - 以下定义了一些格式化器,在中文场景下,会启用这些格式化器。 + import dayjs from "dayjs"; + const formatters = { + "*":{ // 在所有语言下生效的格式化器 + $types:{...}, // 只作用于特定数据类型的默认格式化器 + .... // 全局格式化器 + }, + zh:{ + // 只作用于特定数据类型的格式化器 + $types:{ + Date:(value)=>dayjs(value).format("YYYY年MM月DD日 HH:mm:ss"), + }, + date:(value)=>dayjs(value).format("YYYY年MM月DD日") + bjTime:(value)=>"北京时间"+ value, + [格式化器名称]:(value)=>{...}, + [格式化器名称]:(value)=>{...}, + [格式化器名称]:(value)=>{...}, + }, + en:{ + $types:{ + Date:(value)=>dayjs(value).format("YYYY/MM/DD HH:mm:ss"), // 默认的格式化器 + }, + date:(value)=>dayjs(value).format("YYYY/MM/DD") + bjTime:(value)=>"BeiJing "+ value, + [格式化器名称]:(value)=>{...}, + [格式化器名称]:(value)=>{...}, + [格式化器名称]:(value)=>{...}, + } + } + - 在翻译函数中使用格式化器的方法,示例如下: + + t("Now is { value | date | bjTime }",{value: new Date()}) + 其等效于: + t(`Now is ${bjTime(date(value))",{value: new Date()}) + 由于value分别经过两个管道符转换,上一个管道符的输出作为下一个管道符的输入,可以多次使用管道符。 + + 最终的输出结果: + 中文: "现在是北京时间2022年3月1日" + 英文: "Now is BeiJing 2022/03/01" + + * + */ + + + +module.exports = { + $settings:{ + + }, + // 所有类型的默认格式化器 + $types:{ + // "*" : { }, + // Date : { }, + // Number: { }, + // String: { }, + // Array : { }, + // Object: { } + } + // 允许重载内置的格式化器 + // date : value => { ... }, + // shortdate : value => { ... }, + // time : value => { ... }, + // shorttime : value => { ... }, + // year : value => { ... }, + // month : value => { ... }, + // day : value => { ... }, + // weekdayValue : value => { ... }, + // weekday : value => { ... }, + // shortWeekday : value => { ... }, + // monthName : value => { ... }, + // shorMonthName : value => { ... }, + // // 时间 + // hour : value => { ... }, + // hour12 : value => { ... }, + // minute : value => { ... }, + // second : value => { ... }, + // millisecond : value => { ... }, + // timestamp : value => { ... }, + // currency : value => { ... }, + // number : value => { ... }, +} diff --git a/packages/apps/nodejs/languages/formatters/zh.js b/packages/apps/nodejs/languages/formatters/zh.js new file mode 100644 index 0000000..1e04500 --- /dev/null +++ b/packages/apps/nodejs/languages/formatters/zh.js @@ -0,0 +1,86 @@ +/** + + 格式化器用来对翻译文本内容中的插值变量进行格式化, + 比如将一个数字格式化为货币格式,或者将一个日期格式化为友好的日期格式。 + + - 以下定义了一些格式化器,在中文场景下,会启用这些格式化器。 + import dayjs from "dayjs"; + const formatters = { + "*":{ // 在所有语言下生效的格式化器 + $types:{...}, // 只作用于特定数据类型的默认格式化器 + .... // 全局格式化器 + }, + zh:{ + // 只作用于特定数据类型的格式化器 + $types:{ + Date:(value)=>dayjs(value).format("YYYY年MM月DD日 HH:mm:ss"), + }, + date:(value)=>dayjs(value).format("YYYY年MM月DD日") + bjTime:(value)=>"北京时间"+ value, + [格式化器名称]:(value)=>{...}, + [格式化器名称]:(value)=>{...}, + [格式化器名称]:(value)=>{...}, + }, + en:{ + $types:{ + Date:(value)=>dayjs(value).format("YYYY/MM/DD HH:mm:ss"), // 默认的格式化器 + }, + date:(value)=>dayjs(value).format("YYYY/MM/DD") + bjTime:(value)=>"BeiJing "+ value, + [格式化器名称]:(value)=>{...}, + [格式化器名称]:(value)=>{...}, + [格式化器名称]:(value)=>{...}, + } + } + - 在翻译函数中使用格式化器的方法,示例如下: + + t("Now is { value | date | bjTime }",{value: new Date()}) + 其等效于: + t(`Now is ${bjTime(date(value))",{value: new Date()}) + 由于value分别经过两个管道符转换,上一个管道符的输出作为下一个管道符的输入,可以多次使用管道符。 + + 最终的输出结果: + 中文: "现在是北京时间2022年3月1日" + 英文: "Now is BeiJing 2022/03/01" + + * + */ + + + + module.exports ={ + $settings:{ + + }, + // 所有类型的默认格式化器 + $types:{ + // "*" : { }, + // Date : { }, + // Number: { }, + // String: { }, + // Array : { }, + // Object: { } + } + // 允许重载内置的格式化器 + // date : value => { ... }, + // shortdate : value => { ... }, + // time : value => { ... }, + // shorttime : value => { ... }, + // year : value => { ... }, + // month : value => { ... }, + // day : value => { ... }, + // weekdayValue : value => { ... }, + // weekday : value => { ... }, + // shortWeekday : value => { ... }, + // monthName : value => { ... }, + // shorMonthName : value => { ... }, + // // 时间 + // hour : value => { ... }, + // hour12 : value => { ... }, + // minute : value => { ... }, + // second : value => { ... }, + // millisecond : value => { ... }, + // timestamp : value => { ... }, + // currency : value => { ... }, + // number : value => { ... }, +} diff --git a/packages/apps/nodejs/languages/idMap.js b/packages/apps/nodejs/languages/idMap.js new file mode 100644 index 0000000..ce5e9c8 --- /dev/null +++ b/packages/apps/nodejs/languages/idMap.js @@ -0,0 +1,34 @@ +module.exports = { + "VoerkaI18n多语言解决方案 ": 1, + "Hello world!": 2, + "中华人民共和国": 3, + "迎接中华民族的伟大复兴": 4, + "成立于{}年": 5, + "首都:北京": 6, + "商品价格:{ value | currency }": 7, + "商品价格:{ value | capitalizeCurrency }": 8, + "商品价格:{ value | capitalizeCurrency(true) }": 9, + "商品数量:{ value | number }": 10, + "现在是{ value }": 11, + "现在是{ value | date }": 12, + "现在是{ value | date | empty }": 13, + "现在是{ value | date | empty('无') }": 14, + "现在是{ value | shortdate }": 15, + "现在是{ value | time }": 16, + "现在是{ value | shorttime }": 17, + "现在是{ value | year }": 18, + "现在是{ value | month }": 19, + "现在是{ value | day }": 20, + "现在是{ value | weekdayValue }": 21, + "现在是{ value | weekday }": 22, + "现在是{ value | shortWeekday }": 23, + "现在是{ value | monthName }": 24, + "现在是{ value | shorMonthName }": 25, + "现在是{ value | hour }": 26, + "现在是{ value | hour12 }": 27, + "现在是{ value | minute }": 28, + "现在是{ value | second }": 29, + "现在是{ value | millisecond }": 30, + "现在是{ value | timestamp }": 31, + "商品价格:{ value | currency('CNY','元整',3)}": 32 +} \ No newline at end of file diff --git a/packages/apps/nodejs/languages/index.js b/packages/apps/nodejs/languages/index.js new file mode 100644 index 0000000..592ee5d --- /dev/null +++ b/packages/apps/nodejs/languages/index.js @@ -0,0 +1,60 @@ + +const messageIds =require("./idMap.js") // 语言ID映射文件 +const runtime = require("../../../runtime/index.js"); +const { translate,VoerkaI18nScope } = runtime +const defaultFormatters =require("./formatters/zh") +const activeFormatters = defaultFormatters +const defaultMessages =require("./zh.js") +const activeMessages = defaultMessages + + +// 语言配置文件 +const scopeSettings = { + "languages": [ + { + "name": "zh", + "title": "中文" + }, + { + "name": "en", + "title": "英文" + }, + { + "name": "de", + "title": "德语" + } + ], + "defaultLanguage": "zh", + "activeLanguage": "zh", + "namespaces": {} +} +const formatters = { + 'zh' : defaultFormatters, + 'en' : require("./formatters/en.js"), + 'de' : require("./formatters/de.js") +} +// 语言包加载器 +const loaders = { + "en" : ()=>import("./en.js"), + "de" : ()=>import("./de.js") +} + +// 语言作用域 +const scope = new VoerkaI18nScope({ + ...scopeSettings, // languages,defaultLanguage,activeLanguage,namespaces,formatters + id : "vueapp", // 当前作用域的id,自动取当前工程的package.json的name + debug : false, // 是否在控制台输出高度信息 + default : defaultMessages, // 默认语言包 + messages : activeMessages, // 当前语言包 + idMap : messageIds, // 消息id映射列表 + formatters, // 扩展自定义格式化器 + loaders // 语言包加载器 +}) +// 翻译函数 +const scopedTtranslate = translate.bind(scope) + +module.exports = { + t:scopedTtranslate , + i18nScope:scope +} + diff --git a/packages/apps/nodejs/languages/settings.json b/packages/apps/nodejs/languages/settings.json new file mode 100644 index 0000000..ecdb463 --- /dev/null +++ b/packages/apps/nodejs/languages/settings.json @@ -0,0 +1,19 @@ +{ + "languages": [ + { + "name": "zh", + "title": "中文" + }, + { + "name": "en", + "title": "英文" + }, + { + "name": "de", + "title": "德语" + } + ], + "defaultLanguage": "zh", + "activeLanguage": "zh", + "namespaces": {} +} \ No newline at end of file diff --git a/packages/apps/nodejs/languages/translates/default.json b/packages/apps/nodejs/languages/translates/default.json new file mode 100644 index 0000000..0c00abb --- /dev/null +++ b/packages/apps/nodejs/languages/translates/default.json @@ -0,0 +1,227 @@ +{ + "VoerkaI18n多语言解决方案 ": { + "en": "VoerkaI18n多语言解决方案 ", + "de": "VoerkaI18n multilingual solution ", + "$file": [ + "App.vue" + ] + }, + "Hello world!": { + "en": "EN Hello world!", + "de": "DE Hello world!", + "$file": [ + "App.vue", + "components\\formatters.vue" + ] + }, + "中华人民共和国": { + "en": "The People's Republic of China", + "de": "中华人民共和国", + "$file": [ + "App.vue" + ] + }, + "迎接中华民族的伟大复兴": { + "en": "Welcome the great rejuvenation of the Chinese nation", + "de": "迎接中华民族的伟大复兴", + "$file": [ + "App.vue" + ] + }, + "成立于{}年": { + "en": "Founded in {}", + "de": "成立于{}年", + "$file": [ + "components\\china.vue" + ] + }, + "首都:北京": { + "en": "Capital: Beijing", + "de": "首都:北京", + "$file": [ + "components\\china.vue" + ] + }, + "商品价格:{ value | currency }": { + "en": "Price:{ value | currency }", + "de": "DE Price:{ value | currency }", + "$file": [ + "components\\formatters.vue" + ] + }, + "商品价格:{ value | capitalizeCurrency }": { + "en": "Price:{ value | capitalizeCurrency }", + "de": "商品价格:{ value | capitalizeCurrency }", + "$file": [ + "components\\formatters.vue" + ] + }, + "商品价格:{ value | capitalizeCurrency(true) }": { + "en": "Price:{ value | capitalizeCurrency(true) }", + "de": "商品价格:{ value | capitalizeCurrency(true) }", + "$file": [ + "components\\formatters.vue" + ] + }, + "商品数量:{ value | number }": { + "en": "Count:{ value | number }", + "de": "商品数量:{ value | number }", + "$file": [ + "components\\formatters.vue" + ] + }, + "现在是{ value }": { + "en": "Now is { value }", + "de": "D现在是{ value }", + "$file": [ + "components\\formatters.vue" + ] + }, + "现在是{ value | date }": { + "en": "Now is { value | date }", + "de": "D现在是{ value | date }", + "$file": [ + "components\\formatters.vue" + ] + }, + "现在是{ value | date | empty }": { + "en": "Now is { value | date | empty }", + "de": "D现在是{ value | date | empty }", + "$file": [ + "components\\formatters.vue" + ] + }, + "现在是{ value | date | empty('无') }": { + "en": "Now is { value | date | empty('无') }", + "de": "D现在是{ value | date | empty('无') }", + "$file": [ + "components\\formatters.vue" + ] + }, + "现在是{ value | shortdate }": { + "en": "Now is { value | shortdate }", + "de": "D现在是{ value | shortdate }", + "$file": [ + "components\\formatters.vue" + ] + }, + "现在是{ value | time }": { + "en": "Now is { value | time }", + "de": "D现在是{ value | time }", + "$file": [ + "components\\formatters.vue" + ] + }, + "现在是{ value | shorttime }": { + "en": "Now is { value | shorttime }", + "de": "D现在是{ value | shorttime }", + "$file": [ + "components\\formatters.vue" + ] + }, + "现在是{ value | year }": { + "en": "Now is { value | year }", + "de": "D现在是{ value | year }", + "$file": [ + "components\\formatters.vue" + ] + }, + "现在是{ value | month }": { + "en": "Now is { value | month }", + "de": "D现在是{ value | month }", + "$file": [ + "components\\formatters.vue" + ] + }, + "现在是{ value | day }": { + "en": "Now is { value | day }", + "de": "D现在是{ value | day }", + "$file": [ + "components\\formatters.vue" + ] + }, + "现在是{ value | weekdayValue }": { + "en": "Now is { value | weekdayValue }", + "de": "D现在是{ value | weekdayValue }", + "$file": [ + "components\\formatters.vue" + ] + }, + "现在是{ value | weekday }": { + "en": "Now is { value | weekday }", + "de": "D现在是{ value | weekday }", + "$file": [ + "components\\formatters.vue" + ] + }, + "现在是{ value | shortWeekday }": { + "en": "Now is { value | shortWeekday }", + "de": "D现在是{ value | shortWeekday }", + "$file": [ + "components\\formatters.vue" + ] + }, + "现在是{ value | monthName }": { + "en": "Now is { value | monthName }", + "de": "D现在是{ value | monthName }", + "$file": [ + "components\\formatters.vue" + ] + }, + "现在是{ value | shorMonthName }": { + "en": "Now is { value | shorMonthName }", + "de": "D现在是{ value | shorMonthName }", + "$file": [ + "components\\formatters.vue" + ] + }, + "现在是{ value | hour }": { + "en": "Now is { value | hour }", + "de": "D现在是{ value | hour }", + "$file": [ + "components\\formatters.vue" + ] + }, + "现在是{ value | hour12 }": { + "en": "Now is { value | hour12 }", + "de": "D现在是{ value | hour12 }", + "$file": [ + "components\\formatters.vue" + ] + }, + "现在是{ value | minute }": { + "en": "Now is { value | minute }", + "de": "D现在是{ value | minute }", + "$file": [ + "components\\formatters.vue" + ] + }, + "现在是{ value | second }": { + "en": "Now is { value | second }", + "de": "D现在是{ value | second }", + "$file": [ + "components\\formatters.vue" + ] + }, + "现在是{ value | millisecond }": { + "en": "Now is { value | millisecond }", + "de": "D现在是{ value | millisecond }", + "$file": [ + "components\\formatters.vue" + ] + }, + "现在是{ value | timestamp }": { + "en": "Now is { value | timestamp }", + "de": "D现在是{ value | timestamp }", + "$file": [ + "components\\formatters.vue" + ] + }, + "商品价格:{ value | currency('CNY','元整',3)}": { + "en": "Price:{ value | currency('CNY','元整',3)}", + "de": "D商品价格:{ value | currency('CNY','元整',3)}", + "$file": [ + "components\\formatters.vue" + ] + } +} \ No newline at end of file diff --git a/packages/apps/nodejs/languages/zh.js b/packages/apps/nodejs/languages/zh.js new file mode 100644 index 0000000..b10f4f2 --- /dev/null +++ b/packages/apps/nodejs/languages/zh.js @@ -0,0 +1,32 @@ +module.exports = { + "1": "Hello world!", + "2": "中华人民共和国", + "3": "迎接中华民族的伟大复兴", + "4": "成立于{}年", + "5": "首都:北京", + "6": "VoerkaI18n多语言解决方案 ", + "7": "现在是{ value | date }", + "8": "现在是{ value | shortdate }", + "9": "现在是{ value | time }", + "10": "现在是{ value | shorttime }", + "11": "现在是{ value | year }", + "12": "现在是{ value | month }", + "13": "现在是{ value | day }", + "14": "现在是{ value | weekdayValue }", + "15": "现在是{ value | weekday }", + "16": "现在是{ value | shortWeekday }", + "17": "现在是{ value | monthName }", + "18": "现在是{ value | shorMonthName }", + "19": "现在是{ value | hour }", + "20": "现在是{ value | hour12 }", + "21": "现在是{ value | minute }", + "22": "现在是{ value | second }", + "23": "现在是{ value | millisecond }", + "24": "现在是{ value | timestamp }", + "25": "商品价格:{ value | currency }", + "26": "商品价格:{ value | capitalizeCurrency }", + "27": "现在是{ value }", + "28": "商品价格:{ value | currency('CNY','元整',3)}", + "29": "商品价格:{ value | capitalizeCurrency(true) }", + "30": "商品数量:{ value | number }" +} \ No newline at end of file diff --git a/packages/apps/nodejs/package.json b/packages/apps/nodejs/package.json new file mode 100644 index 0000000..33433f6 --- /dev/null +++ b/packages/apps/nodejs/package.json @@ -0,0 +1,7 @@ +{ + "name": "@voerkai18n/testapp", + "main": "./index.js", + "scripts": { + "release": "pnpm autopublish" + } +} \ No newline at end of file