diff --git a/gulpfile.js b/gulpfile.js index 86c9920f3..3f6cf318b 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -8,7 +8,7 @@ const replace = require("gulp-replace"); const terser = require("gulp-terser"); const cssnano = require("gulp-cssnano"); -const locales = require("./locales"); +const locales = require("./locales/legacy.cjs"); const meta = require("./package.json"); const customDir = process.env.ICESHRIMP_CUSTOM_DIR ?? "./custom"; diff --git a/locales/index.js b/locales/index.js index 8a56c8663..09d3932f8 100644 --- a/locales/index.js +++ b/locales/index.js @@ -2,8 +2,8 @@ * Languages Loader */ -const fs = require("fs"); -const yaml = require("js-yaml"); +import * as fs from 'node:fs'; +import * as yaml from 'js-yaml'; const languages = []; const languages_custom = []; const customDir = process.env.ICESHRIMP_CUSTOM_DIR ?? __dirname + "/../custom"; diff --git a/locales/legacy.cjs b/locales/legacy.cjs new file mode 100644 index 000000000..8a56c8663 --- /dev/null +++ b/locales/legacy.cjs @@ -0,0 +1,88 @@ +/** + * Languages Loader + */ + +const fs = require("fs"); +const yaml = require("js-yaml"); +const languages = []; +const languages_custom = []; +const customDir = process.env.ICESHRIMP_CUSTOM_DIR ?? __dirname + "/../custom"; + +const merge = (...args) => + args.reduce( + (a, c) => ({ + ...a, + ...c, + ...Object.entries(a) + .filter(([k]) => c && typeof c[k] === "object") + .reduce((a, [k, v]) => ((a[k] = merge(v, c[k])), a), {}), + }), + {}, + ); + +fs.readdirSync(__dirname).forEach((file) => { + if (file.includes(".yml")) { + file = file.slice(0, file.indexOf(".")); + languages.push(file); + } +}); + +fs.readdirSync(`${customDir}/locales`).forEach((file) => { + if (file.includes(".yml")) { + file = file.slice(0, file.indexOf(".")); + languages_custom.push(file); + } +}); + +const primaries = { + en: "US", + ja: "JP", + zh: "CN", +}; + +// 何故か文字列にバックスペース文字が混入することがあり、YAMLが壊れるので取り除く +const clean = (text) => + text.replace(new RegExp(String.fromCodePoint(0x08), "g"), ""); + +const locales = languages.reduce( + (a, c) => ( + (a[c] = + yaml.load(clean(fs.readFileSync(`${__dirname}/${c}.yml`, "utf-8"))) || + {}), + a + ), + {}, +); +const locales_custom = languages_custom.reduce( + (a, c) => ( + (a[c] = + yaml.load( + clean( + fs.readFileSync(`${customDir}/locales/${c}.yml`, "utf-8"), + ), + ) || {}), + a + ), + {}, +); +Object.assign(locales, locales_custom); + +module.exports = Object.entries(locales).reduce( + (a, [k, v]) => ( + (a[k] = (() => { + const [lang] = k.split("-"); + switch (k) { + case "en-US": + return v; + default: + return merge( + locales["en-US"], + locales[`${lang}-${primaries[lang]}`] || {}, + v, + ); + } + })()), + a + ), + {}, +); diff --git a/packages/client/package.json b/packages/client/package.json index 772dbe47a..92c55cb3c 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -9,6 +9,7 @@ "lint:vue": "paralint --ext .vue --fix '**/*.vue' --cache", "format": "biome format * --write && prettier --write '**/*.{scss,vue}' --cache --cache-strategy metadata" }, + "type": "module", "devDependencies": { "@discordapp/twemoji": "14.1.2", "@eslint-sets/eslint-config-vue3": "^5.6.1", diff --git a/packages/sw/webpack.config.js b/packages/sw/webpack.config.js index 8522eda3a..7e27464d1 100644 --- a/packages/sw/webpack.config.js +++ b/packages/sw/webpack.config.js @@ -1,6 +1,6 @@ const webpack = require("webpack"); const path = require("path"); -const locales = require("../../locales"); +const locales = require("../../locales/legacy.cjs"); const meta = require("../../package.json"); const isProduction = process.env.NODE_ENV === "production";