更新翻译函数

This commit is contained in:
wxzhang 2022-03-01 21:50:35 +08:00
parent 4a51739f03
commit 47a4fd1c99
7 changed files with 217 additions and 128 deletions

View File

@ -12,6 +12,7 @@
"license": "ISC",
"dependencies": {
"art-template": "^4.13.2",
"dayjs": "^1.10.8",
"deepmerge": "^4.2.2",
"glob": "^7.2.0",
"gulp": "^4.0.2",

239
pnpm-lock.yaml generated
View File

@ -4,6 +4,7 @@ specifiers:
'@babel/cli': ^7.17.6
'@babel/core': ^7.17.5
art-template: ^4.13.2
dayjs: ^1.10.8
deepmerge: ^4.2.2
glob: ^7.2.0
gulp: ^4.0.2
@ -15,6 +16,7 @@ specifiers:
dependencies:
art-template: 4.13.2
dayjs: registry.npmmirror.com/dayjs/1.10.8
deepmerge: 4.2.2
glob: 7.2.0
gulp: 4.0.2
@ -54,8 +56,8 @@ packages:
slash: 2.0.0
source-map: 0.5.7
optionalDependencies:
'@nicolo-ribaudo/chokidar-2': 2.1.8-no-fsevents.3
chokidar: 3.5.3
'@nicolo-ribaudo/chokidar-2': registry.npmmirror.com/@nicolo-ribaudo/chokidar-2/2.1.8-no-fsevents.3
chokidar: registry.npmmirror.com/chokidar/3.5.3
dev: true
/@babel/code-frame/7.16.7:
@ -529,7 +531,7 @@ packages:
dependencies:
callsites: 3.1.0
graceful-fs: 4.2.9
source-map: 0.6.1
source-map: registry.npmmirror.com/source-map/0.6.1
dev: true
/@jest/test-result/27.5.1:
@ -604,12 +606,6 @@ packages:
'@jridgewell/sourcemap-codec': 1.4.11
dev: true
/@nicolo-ribaudo/chokidar-2/2.1.8-no-fsevents.3:
resolution: {integrity: sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==}
requiresBuild: true
dev: true
optional: true
/@sinonjs/commons/1.8.3:
resolution: {integrity: sha512-xkNcLAn/wZaX14RPlwizcKicDk9G3F8m2nU3L7Ukm5zBgTwiT0wsoFAHx9Jq56fJA1z/7uKGtCRu16sOUCLIHQ==}
dependencies:
@ -1063,14 +1059,6 @@ packages:
dev: true
optional: true
/bindings/1.5.0:
resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==}
requiresBuild: true
dependencies:
file-uri-to-path: 1.0.0
dev: false
optional: true
/brace-expansion/1.1.11:
resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
dependencies:
@ -1205,42 +1193,6 @@ packages:
engines: {node: '>=10'}
dev: true
/chokidar/2.1.8:
resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==}
deprecated: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies
dependencies:
anymatch: 2.0.0
async-each: 1.0.3
braces: 2.3.2
glob-parent: 3.1.0
inherits: 2.0.4
is-binary-path: 1.0.1
is-glob: 4.0.3
normalize-path: 3.0.0
path-is-absolute: 1.0.1
readdirp: 2.2.1
upath: 1.2.0
optionalDependencies:
fsevents: 1.2.13
dev: false
/chokidar/3.5.3:
resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
engines: {node: '>= 8.10.0'}
requiresBuild: true
dependencies:
anymatch: 3.1.2
braces: 3.0.2
glob-parent: 5.1.2
is-binary-path: 2.1.0
is-glob: 4.0.3
normalize-path: 3.0.0
readdirp: 3.6.0
optionalDependencies:
fsevents: 2.3.2
dev: true
optional: true
/ci-info/3.3.0:
resolution: {integrity: sha512-riT/3vI5YpVH6/qomlDnJow6TBee2PBKSEpx3O32EGPYbWGIRsIlGRms3Sm74wYE1JMo8RnO04Hb12+v1J5ICw==}
dev: true
@ -1263,7 +1215,7 @@ packages:
resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==}
engines: {node: '>= 4.0'}
dependencies:
source-map: 0.6.1
source-map: registry.npmmirror.com/source-map/0.6.1
dev: false
/cliui/3.2.0:
@ -1662,7 +1614,7 @@ packages:
esutils: 2.0.3
optionator: 0.8.3
optionalDependencies:
source-map: 0.6.1
source-map: registry.npmmirror.com/source-map/0.6.1
dev: false
/escodegen/2.0.0:
@ -1675,7 +1627,7 @@ packages:
esutils: 2.0.3
optionator: 0.8.3
optionalDependencies:
source-map: 0.6.1
source-map: registry.npmmirror.com/source-map/0.6.1
dev: true
/esprima/4.0.1:
@ -1813,12 +1765,6 @@ packages:
bser: 2.1.1
dev: true
/file-uri-to-path/1.0.0:
resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==}
requiresBuild: true
dev: false
optional: true
/fill-range/4.0.0:
resolution: {integrity: sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=}
engines: {node: '>=0.10.0'}
@ -1938,26 +1884,6 @@ packages:
/fs.realpath/1.0.0:
resolution: {integrity: sha1-FQStJSMVjKpA20onh8sBQRmU6k8=}
/fsevents/1.2.13:
resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==}
engines: {node: '>= 4.0'}
os: [darwin]
deprecated: fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.
requiresBuild: true
dependencies:
bindings: 1.5.0
nan: 2.15.0
dev: false
optional: true
/fsevents/2.3.2:
resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
requiresBuild: true
dev: true
optional: true
/function-bind/1.1.1:
resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
@ -2035,7 +1961,7 @@ packages:
dependencies:
anymatch: 2.0.0
async-done: 1.3.2
chokidar: 2.1.8
chokidar: registry.npmmirror.com/chokidar/2.1.8
is-negated-glob: 1.0.0
just-debounce: 1.1.0
normalize-path: 3.0.0
@ -2551,7 +2477,7 @@ packages:
dependencies:
debug: 4.3.3
istanbul-lib-coverage: 3.2.0
source-map: 0.6.1
source-map: registry.npmmirror.com/source-map/0.6.1
transitivePeerDependencies:
- supports-color
dev: true
@ -2750,7 +2676,7 @@ packages:
micromatch: 4.0.4
walker: 1.0.8
optionalDependencies:
fsevents: 2.3.2
fsevents: registry.npmmirror.com/fsevents/2.3.2
dev: true
/jest-jasmine2/27.5.1:
@ -3378,12 +3304,6 @@ packages:
engines: {node: '>= 0.10'}
dev: false
/nan/2.15.0:
resolution: {integrity: sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==}
requiresBuild: true
dev: false
optional: true
/nanomatch/1.2.13:
resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==}
engines: {node: '>=0.10.0'}
@ -4089,7 +4009,7 @@ packages:
define-property: 0.2.5
extend-shallow: 2.0.1
map-cache: 0.2.2
source-map: 0.5.7
source-map: registry.npmmirror.com/source-map/0.5.7
source-map-resolve: 0.5.3
use: 3.1.1
dev: false
@ -4109,7 +4029,7 @@ packages:
resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
dependencies:
buffer-from: 1.1.2
source-map: 0.6.1
source-map: registry.npmmirror.com/source-map/0.6.1
dev: true
/source-map-url/0.4.1:
@ -4125,11 +4045,6 @@ packages:
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
engines: {node: '>=0.10.0'}
/source-map/0.7.3:
resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==}
engines: {node: '>= 8'}
dev: true
/sparkles/1.0.1:
resolution: {integrity: sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==}
engines: {node: '>= 0.10'}
@ -4464,7 +4379,7 @@ packages:
hasBin: true
dependencies:
commander: 2.19.0
source-map: 0.6.1
source-map: registry.npmmirror.com/source-map/0.6.1
dev: false
/unc-path-regex/0.1.2:
@ -4551,7 +4466,7 @@ packages:
dependencies:
'@types/istanbul-lib-coverage': 2.0.4
convert-source-map: 1.8.0
source-map: 0.7.3
source-map: registry.npmmirror.com/source-map/0.7.3
dev: true
/v8flags/3.2.0:
@ -4812,12 +4727,70 @@ packages:
regenerator-runtime: registry.npmmirror.com/regenerator-runtime/0.13.9
dev: false
registry.npmmirror.com/@nicolo-ribaudo/chokidar-2/2.1.8-no-fsevents.3:
resolution: {integrity: sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz}
name: '@nicolo-ribaudo/chokidar-2'
version: 2.1.8-no-fsevents.3
requiresBuild: true
dev: true
optional: true
registry.npmmirror.com/ansicolor/1.1.100:
resolution: {integrity: sha512-Jl0pxRfa9WaQVUX57AB8/V2my6FJxrOR1Pp2qqFbig20QB4HzUoQ48THTKAgHlUCJeQm/s2WoOPcoIDhyCL/kw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/ansicolor/-/ansicolor-1.1.100.tgz}
name: ansicolor
version: 1.1.100
dev: false
registry.npmmirror.com/bindings/1.5.0:
resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/bindings/-/bindings-1.5.0.tgz}
name: bindings
version: 1.5.0
requiresBuild: true
dependencies:
file-uri-to-path: registry.npmmirror.com/file-uri-to-path/1.0.0
dev: false
optional: true
registry.npmmirror.com/chokidar/2.1.8:
resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/chokidar/-/chokidar-2.1.8.tgz}
name: chokidar
version: 2.1.8
deprecated: Chokidar 2 does not receive security updates since 2019. Upgrade to chokidar 3 with 15x fewer dependencies
dependencies:
anymatch: 2.0.0
async-each: 1.0.3
braces: 2.3.2
glob-parent: 3.1.0
inherits: 2.0.4
is-binary-path: 1.0.1
is-glob: 4.0.3
normalize-path: 3.0.0
path-is-absolute: 1.0.1
readdirp: 2.2.1
upath: 1.2.0
optionalDependencies:
fsevents: registry.npmmirror.com/fsevents/1.2.13
dev: false
registry.npmmirror.com/chokidar/3.5.3:
resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz}
name: chokidar
version: 3.5.3
engines: {node: '>= 8.10.0'}
requiresBuild: true
dependencies:
anymatch: 3.1.2
braces: 3.0.2
glob-parent: 5.1.2
is-binary-path: 2.1.0
is-glob: 4.0.3
normalize-path: 3.0.0
readdirp: 3.6.0
optionalDependencies:
fsevents: registry.npmmirror.com/fsevents/2.3.2
dev: true
optional: true
registry.npmmirror.com/core-js-pure/3.21.1:
resolution: {integrity: sha512-12VZfFIu+wyVbBebyHmRTuEE/tZrB4tJToWcwAMcsp3h4+sHR+fMJWbKpYiCRWlhFBq+KNyO8rIV9rTkeVmznQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/core-js-pure/-/core-js-pure-3.21.1.tgz}
name: core-js-pure
@ -4832,6 +4805,12 @@ packages:
requiresBuild: true
dev: false
registry.npmmirror.com/dayjs/1.10.8:
resolution: {integrity: sha512-wbNwDfBHHur9UOzNUjeKUOJ0fCb0a52Wx0xInmQ7Y8FstyajiV1NmK1e00cxsr9YrE9r7yAChE0VvpuY5Rnlow==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/dayjs/-/dayjs-1.10.8.tgz}
name: dayjs
version: 1.10.8
dev: false
registry.npmmirror.com/deepmerge/4.2.2:
resolution: {integrity: sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/deepmerge/-/deepmerge-4.2.2.tgz}
name: deepmerge
@ -4839,12 +4818,52 @@ packages:
engines: {node: '>=0.10.0'}
dev: false
registry.npmmirror.com/file-uri-to-path/1.0.0:
resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz}
name: file-uri-to-path
version: 1.0.0
requiresBuild: true
dev: false
optional: true
registry.npmmirror.com/fsevents/1.2.13:
resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fsevents/-/fsevents-1.2.13.tgz}
name: fsevents
version: 1.2.13
engines: {node: '>= 4.0'}
os: [darwin]
deprecated: fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.
requiresBuild: true
dependencies:
bindings: registry.npmmirror.com/bindings/1.5.0
nan: registry.npmmirror.com/nan/2.15.0
dev: false
optional: true
registry.npmmirror.com/fsevents/2.3.2:
resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz}
name: fsevents
version: 2.3.2
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
requiresBuild: true
dev: true
optional: true
registry.npmmirror.com/jju/1.4.0:
resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/jju/-/jju-1.4.0.tgz}
name: jju
version: 1.4.0
dev: false
registry.npmmirror.com/nan/2.15.0:
resolution: {integrity: sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/nan/-/nan-2.15.0.tgz}
name: nan
version: 2.15.0
requiresBuild: true
dev: false
optional: true
registry.npmmirror.com/readjson/2.2.2:
resolution: {integrity: sha512-PdeC9tsmLWBiL8vMhJvocq+OezQ3HhsH2HrN7YkhfYcTjQSa/iraB15A7Qvt7Xpr0Yd2rDNt6GbFwVQDg3HcAw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/readjson/-/readjson-2.2.2.tgz}
name: readjson
@ -4861,6 +4880,26 @@ packages:
version: 0.13.9
dev: false
registry.npmmirror.com/source-map/0.5.7:
resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz}
name: source-map
version: 0.5.7
engines: {node: '>=0.10.0'}
dev: false
registry.npmmirror.com/source-map/0.6.1:
resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz}
name: source-map
version: 0.6.1
engines: {node: '>=0.10.0'}
registry.npmmirror.com/source-map/0.7.3:
resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/source-map/-/source-map-0.7.3.tgz}
name: source-map
version: 0.7.3
engines: {node: '>= 8'}
dev: true
registry.npmmirror.com/try-catch/3.0.0:
resolution: {integrity: sha512-3uAqUnoemzca1ENvZ72EVimR+E8lqBbzwZ9v4CEbLjkaV3Q+FtdmPUt7jRtoSoTiYjyIMxEkf6YgUpe/voJ1ng==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/try-catch/-/try-catch-3.0.0.tgz}
name: try-catch

View File

@ -13,12 +13,14 @@
*
*
*/
export default {
const dayjs = require("dayjs");
module.exports = {
cn:{
Date:{
default:(value)=>dayjs(value).format("YYYY年MM年DD日"), // 默认的变量格式化器
default:(value)=>dayjs(value).format("YYYY年MM年DD日"), // 默认的格式化器
time:(value)=>dayjs(value).format("HH:mm:ss"),
short:(value)=>dayjs(value).format("YYYY/MM/DD"),
date:(value)=>dayjs(value).format("YYYY/MM/DD")
},
Number:{

View File

@ -1,4 +1,5 @@
import deepMerge from "deepmerge"
const deepMerge = require("deepmerge")
const formatters = require("./formatters")
// 用来提取字符里面的插值变量参数 , 支持管道符 { var | formatter | formatter }
@ -46,18 +47,21 @@ function getDataTypeName(v){
* @param {*} str
* @returns {Array} [[变量名称,[]],[变量名称,[formatter,formatter,...]],...]
*/
function getInterpolatedVars(str){
let result = []
module.exports.getInterpolatedVars = function(str){
let results = []
let match
while ((match = varWidthPipeRegexp.exec(str)) !== null) {
if (match.index === varWidthPipeRegexp.lastIndex) {
varWidthPipeRegexp.lastIndex++;
}
if(match.groups.varname) {
result.push(match.groups.formatters ? [match.groups.varname,match.groups.formatters.trim().split("|")] : [match.groups.varname,[]])
const varname = match.groups.varname
const formatters = match.groups.formatters ? match.groups.formatters.trim().substr(1).trim().split("|").map(r=>r.trim()) : []
if(varname) {
const varDefine = formatters ? [varname,formatters] : [varname,[]]
if(results.findIndex(item=>item[0]===varDefine[0] && item[1].join()===varDefine[1].join()) === -1) results.push(varDefine)
}
}
return result
return results
}
/**
* 将要翻译内容提供了一个非文本内容时进行默认的转换
@ -97,31 +101,39 @@ function transformVarValue(value){
* @param {*} template
* @returns
*/
function replaceInterpolateVars(template,...args) {
module.exports.replaceInterpolateVars = function(template,...args) {
const scope = this
const activeLanguage = scope.activeLanguage
let result=template
if(!hasInterpolation(template)) return template
if(args.length===1 && typeof(args[0]) === "object" && !Array.isArray(args[0])){ // 变量插值
// 取得里面的插值变量
let varNames = getInterpolatedVars(template)
// 变量插值
if(args.length===1 && typeof(args[0]) === "object" && !Array.isArray(args[0])){
// 格式化器只能用在字典变量中
// {var1:[formatter,formatter,...],var2:[formatter,formatter,...],...}
let varNames = getInterpolatedVars(template)
let varValues = args[0]
if(varNames.length===0) return template
for(let [name,formatters] of varNames){
// 计算出变量值
let value = (name in varValues) ? varValues[name] : ''
if(formatters.length >0 ){
// 针对每种数据类型的默认格式化器
let dataType= getDataTypeName(value)
if(dataType in scope.formatters[activeLanguage]){
const formatter = scope.formatters[activeLanguage][dataType]
formatters.splice(0,0,formatter)
}
if(formatters.length > 0 ){
formatters.reduce((v,formatter)=>{
if(formatter in scope.formatters){
return scope.formatters[formatter](v)
}else{
return v
}
},"")
}
},value)
}
// 如果变量中包括|管道符,则需要进行转换以适配更宽松的写法比如data|time能匹配"data |time","data | time"等
let nameRegexp = name.includes("|") ? name.split("|").join("\\s*\\|\\s*") : name
result=result.replaceAll(new RegExp(varReplaceRegexp.replaceAll("{varname}",nameRegexp),"g"),transformVarValue(args[0][name]))
let nameRegexp =new RegExp(`${name}\\s*\\|\\s*${formatters.join("\\s*\\|\\s*")}`,"g")
result=result.replaceAll(nameRegexp,"gm"),transformVarValue(value))
}
}else{ // 位置插值
const params=(args.length===1 && Array.isArray(args[0])) ? [...args[0]] : args
@ -138,13 +150,14 @@ function replaceInterpolateVars(template,...args) {
}
// 默认语言配置
export const defaultLanguageSettings = {
module.exports.defaultLanguageSettings = {
defaultLanguage: "cn",
activeLanguage: "cn",
languages:{
cn:{name:"cn",title:"中文",default:true},
en:{name:"en",title:"英文"},
}
},
formatters
}
function isMessageId(content){
@ -165,7 +178,7 @@ function isMessageId(content){
* this===scope 当前绑定的scope
*
*/
export function translate(message) {
module.exports.translate = function(message) {
const scope = this
const activeLanguage = scope.settings.activeLanguage
let vars={} // 插值变量
@ -175,7 +188,11 @@ export function translate(message) {
Object.assign(vars,arguments[1])
Object.entries(vars).forEach(([key,value])=>{
if(typeof(value)==="function"){
vars[key] =try{value()}catch(e){value}
try{
vars[key] = value()
}catch(e){
vars[key] = value
}
}
if(key.startsWith("$")) pluralVars.push(key) // 复数变量
})
@ -226,7 +243,7 @@ export function translate(message) {
* VoerkaI18n.off("change",(language)=>{})
*
* */
export class I18n{
module.exports.i18n = class I18n{
static instance = null; // 单例引用
callbacks = [] // 当切换语言时的回调事件
constructor(settings={}){

View File

@ -0,0 +1,31 @@
const { getInterpolatedVars, replaceInterpolateVars} = require('../src/index.js')
test("获取表达式中的插值变量",done=>{
const results = getInterpolatedVars("中华人民共和国成立于{date | year | time }年,首都是{city}市");
expect(results.map(r=>r[0]).join(",")).toBe("date,city");
expect(results[0][0]).toEqual("date");
expect(results[0][1]).toEqual(["year","time"]);
expect(results[1][0]).toEqual("city");
expect(results[1][1]).toEqual([]);
done()
})
test("表达式中定义了重复的插值变量",done=>{
const results = getInterpolatedVars("{a}{a}{a|x}{a|x}{a|x|y}{a|x|y}");
expect(results.length).toEqual(3);
expect(results[0][0]).toEqual("a");
expect(results[0][1]).toEqual([]);
expect(results[1][0]).toEqual("a");
expect(results[1][1]).toEqual(["x"]);
expect(results[2][0]).toEqual("a");
expect(results[2][1]).toEqual(["x","y"]);
done()
})
// test("替代表达式中的插值变量",done=>{
// const results = replaceInterpolateVars("中华人民共和国成立于{date}年,首都是{city}市",{
// date:1949,
// city:"北京"
// });
// expect(results).toBe("中华人民共和国成立于1949年,首都是北京市");
// done()
// }

View File

@ -33,7 +33,6 @@ test("启用名称空间后扫描提取翻译文本",(done)=>{
"core":"a/b", // 名称空间
}
}))
expect("core" in texts).toBeFalsy()
expect("core" in texts).toBeTruthy()
expect(Object.keys(texts.core).join()).toBe("a,b,c,d")
Object.entries(texts.core).forEach(([text,langs])=>{

View File

@ -3,16 +3,16 @@ import { translate } from "../src/index.js"
test("默认语言翻译",done=>{
done()
})
test("启用位置插值变量翻译",done=>{
done()
})
test("启用字典插值变量翻译",done=>{
done()
})