😎升级组件monaco-editor 去掉汉化不兼容文件

This commit is contained in:
zuohuaijun 2025-09-14 23:53:01 +08:00
parent 69be46b158
commit a04e1ea469
4 changed files with 1 additions and 14733 deletions

View File

@ -51,7 +51,7 @@
"magic-string": "^0.30.19", "magic-string": "^0.30.19",
"md-editor-v3": "^6.0.1", "md-editor-v3": "^6.0.1",
"mitt": "^3.0.1", "mitt": "^3.0.1",
"monaco-editor": "^0.52.2", "monaco-editor": "^0.53.0",
"mqtt": "^5.14.0", "mqtt": "^5.14.0",
"nprogress": "^0.2.0", "nprogress": "^0.2.0",
"ol": "^10.6.1", "ol": "^10.6.1",

View File

@ -1,257 +0,0 @@
import fs from 'node:fs'
import path from 'node:path'
import type { Plugin } from 'vite'
import MagicString from 'magic-string'
export enum Languages {
bg = 'bg',
cs = 'cs',
de = 'de',
en_gb = 'en-gb',
es = 'es',
fr = 'fr',
hu = 'hu',
id = 'id',
it = 'it',
ja = 'ja',
ko = 'ko',
nl = 'nl',
pl = 'pl',
ps = 'ps',
pt_br = 'pt-br',
ru = 'ru',
tr = 'tr',
uk = 'uk',
zh_hans = 'zh-hans',
zh_hant = 'zh-hant',
}
export interface Options {
locale: Languages;
localeData?: Record<string, any>
}
/**
* vite中dev模式下会使用esbuild对node_modules进行预编译filepath
*
* @param options
* @returns
*/
export function esbuildPluginMonacoEditorNls(options: Options) {
options = Object.assign({ locale: Languages.en_gb }, options)
const CURRENT_LOCALE_DATA = getLocalizeMapping(options.locale, options.localeData)
return {
name: 'esbuild-plugin-monaco-editor-nls',
setup(build) {
build.onLoad({ filter: /esm[/\\]vs[/\\]nls\.js/ }, async() => {
return {
contents: getLocalizeCode(CURRENT_LOCALE_DATA),
loader: 'js',
}
})
build.onLoad(
{ filter: /monaco-editor[/\\]esm[/\\]vs.+\.js/ },
async args => {
return {
contents: transformLocalizeFuncCode(
args.path,
CURRENT_LOCALE_DATA,
),
loader: 'js',
}
},
)
},
}
}
/**
* 使monaco-editor-nls的语言映射包localize(data, message)localize(path, data, defaultMessage)
* vite build 使rollup处理
* @param options
* @returns
*/
export default function(options: Options): Plugin {
options = Object.assign({ locale: Languages.en_gb }, options)
const CURRENT_LOCALE_DATA = getLocalizeMapping(options.locale, options.localeData)
return {
name: 'rollup-plugin-monaco-editor-nls',
enforce: 'pre',
load(filepath) {
if (/esm[/\\]vs[/\\]nls\.js/.test(filepath)) {
return getLocalizeCode(CURRENT_LOCALE_DATA)
}
},
transform(code, filepath) {
if (
/monaco-editor[/\\]esm[/\\]vs.+\.js/.test(filepath)
&& !/esm[/\\]vs[/\\].*nls\.js/.test(filepath)
) {
const re = /monaco-editor[/\\]esm[/\\](.+)(?=\.js)/
if (re.exec(filepath) && code.includes('localize(')) {
let path = RegExp.$1
path = path.replace(/\\/g, '/')
code = code.replace(/localize\(/g, `localize('${path}', `)
return {
code: code,
/** 使用magic-string 生成 source map */
map: new MagicString(code).generateMap({
includeContent: true,
hires: true,
source: filepath,
}),
}
}
}
},
}
}
/**
*
* @param filepath
* @param CURRENT_LOCALE_DATA
* @returns
*/
function transformLocalizeFuncCode(
filepath: string,
_CURRENT_LOCALE_DATA: string,
) {
let code = fs.readFileSync(filepath, 'utf8')
const re = /monaco-editor[/\\]esm[/\\](.+)(?=\.js)/
if (re.exec(filepath)) {
let path = RegExp.$1
path = path.replace(/\\/g, '/')
// if (filepath.includes('contextmenu')) {
// console.log(filepath);
// console.log(JSON.parse(CURRENT_LOCALE_DATA)[path]);
// }
// console.log(path, JSON.parse(CURRENT_LOCALE_DATA)[path])
code = code.replace(/localize\(/g, `localize('${path}', `)
}
return code
}
/**
*
* @param locale
* @param localeData
* @returns
*/
function getLocalizeMapping(locale: Languages, localeData: Record<string, any> | undefined = undefined) {
if(localeData)return JSON.stringify(localeData)
const locale_data_path = path.join(__dirname, `./locale/${locale}.json`)
return fs.readFileSync(locale_data_path) as unknown as string
}
/**
*
* @param CURRENT_LOCALE_DATA
* @returns
*/
function getLocalizeCode(CURRENT_LOCALE_DATA: string) {
return `
/*---------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
// eslint-disable-next-line local/code-import-patterns
import { getNLSLanguage, getNLSMessages } from './nls.messages.js';
// eslint-disable-next-line local/code-import-patterns
export { getNLSLanguage, getNLSMessages } from './nls.messages.js';
const isPseudo = getNLSLanguage() === 'pseudo' || (typeof document !== 'undefined' && document.location && document.location.hash.indexOf('pseudo=true') >= 0);
function _format(message, args) {
let result;
if (args.length === 0) {
result = message;
}
else {
result = message.replace(/\\{(\\d+)\\}/g, (match, rest) => {
const index = rest[0];
const arg = args[index];
let result = match;
if (typeof arg === 'string') {
result = arg;
}
else if (typeof arg === 'number' || typeof arg === 'boolean' || arg === void 0 || arg === null) {
result = String(arg);
}
return result;
});
}
if (isPseudo) {
// FF3B and FF3D is the Unicode zenkaku representation for [ and ]
result = '\uFF3B' + result.replace(/[aouei]/g, '$&$&') + '\uFF3D';
}
return result;
}
/**
* @skipMangle
*/
// export function localize(data /* | number when built */, message /* | null when built */, ...args) {
// if (typeof data === 'number') {
// return _format(lookupMessage(data, message), args);
// }
// return _format(message, args);
// }
// ------------------------invoke----------------------------------------
export function localize(path, data, defaultMessage, ...args) {
if (typeof data === 'number') {
return _format(lookupMessage(data, message), args);
}
var key = typeof data === 'object' ? data.key : data;
var data = ${CURRENT_LOCALE_DATA} || {};
var message = (data[path] || data?.contents?.[path] || {})[key];
if (!message) {
message = defaultMessage;
}
return _format(message, args);
}
// ------------------------invoke----------------------------------------
/**
* Only used when built: Looks up the message in the global NLS table.
* This table is being made available as a global through bootstrapping
* depending on the target context.
*/
function lookupMessage(index, fallback) {
const message = getNLSMessages()?.[index];
if (typeof message !== 'string') {
if (typeof fallback === 'string') {
return fallback;
}
throw new Error(\`!!! NLS MISSING: \${index} !!!\`);
}
return message;
}
/**
* @skipMangle
*/
export function localize2(data /* | number when built */, originalMessage, ...args) {
let message;
if (typeof data === 'number') {
message = lookupMessage(data, originalMessage);
}
else {
message = originalMessage;
}
const value = _format(message, args);
return {
value,
original: originalMessage === message ? value : _format(originalMessage, args)
};
}
`
}

File diff suppressed because it is too large Load Diff

View File

@ -9,9 +9,6 @@ import { CodeInspectorPlugin } from 'code-inspector-plugin';
import fs from 'fs'; import fs from 'fs';
import { visualizer } from 'rollup-plugin-visualizer'; import { visualizer } from 'rollup-plugin-visualizer';
import { webUpdateNotice } from '@plugin-web-update-notification/vite'; import { webUpdateNotice } from '@plugin-web-update-notification/vite';
// monaco 菜单汉化 https://wf0.github.io/example/plugins/I18n.html
import monacoZhHans from './public/monaco/zh-hans.json';
import nlsPlugin, { Languages, esbuildPluginMonacoEditorNls } from './public/monaco/vite-plugin-i18n-nls';
import vitePluginsAutoI18n, { EmptyTranslator, VolcengineTranslator, YoudaoTranslator, GoogleTranslator } from 'vite-auto-i18n-plugin'; import vitePluginsAutoI18n, { EmptyTranslator, VolcengineTranslator, YoudaoTranslator, GoogleTranslator } from 'vite-auto-i18n-plugin';
const pathResolve = (dir: string) => { const pathResolve = (dir: string) => {
@ -56,11 +53,6 @@ const viteConfig = defineConfig((mode: ConfigEnv) => {
// exclude: [/\.(br)$/, /\.(gz)$/], // 排除指定文件 // exclude: [/\.(br)$/, /\.(gz)$/], // 排除指定文件
}), }),
JSON.parse(env.VITE_OPEN_CDN) ? buildConfig.cdn() : null, JSON.parse(env.VITE_OPEN_CDN) ? buildConfig.cdn() : null,
// 生产环境 monaco 汉化
nlsPlugin({
locale: Languages.zh_hans,
localeData: monacoZhHans,
}),
vitePluginsAutoI18n({ vitePluginsAutoI18n({
// 是否触发翻译 // 是否触发翻译
enabled: false, enabled: false,
@ -103,15 +95,6 @@ const viteConfig = defineConfig((mode: ConfigEnv) => {
base: mode.command === 'serve' ? './' : env.VITE_PUBLIC_PATH, base: mode.command === 'serve' ? './' : env.VITE_PUBLIC_PATH,
optimizeDeps: { optimizeDeps: {
exclude: ['vue-demi'], exclude: ['vue-demi'],
// 开发环境 monaco 汉化 使用 esbuild 配置实现
esbuildOptions: {
plugins: [
esbuildPluginMonacoEditorNls({
locale: Languages.zh_hans,
localeData: monacoZhHans,
}),
],
},
}, },
server: { server: {
host: '0.0.0.0', host: '0.0.0.0',