😎升级组件monaco-editor 去掉汉化不兼容文件
This commit is contained in:
parent
69be46b158
commit
a04e1ea469
@ -51,7 +51,7 @@
|
||||
"magic-string": "^0.30.19",
|
||||
"md-editor-v3": "^6.0.1",
|
||||
"mitt": "^3.0.1",
|
||||
"monaco-editor": "^0.52.2",
|
||||
"monaco-editor": "^0.53.0",
|
||||
"mqtt": "^5.14.0",
|
||||
"nprogress": "^0.2.0",
|
||||
"ol": "^10.6.1",
|
||||
|
||||
@ -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
@ -9,9 +9,6 @@ import { CodeInspectorPlugin } from 'code-inspector-plugin';
|
||||
import fs from 'fs';
|
||||
import { visualizer } from 'rollup-plugin-visualizer';
|
||||
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';
|
||||
|
||||
const pathResolve = (dir: string) => {
|
||||
@ -56,11 +53,6 @@ const viteConfig = defineConfig((mode: ConfigEnv) => {
|
||||
// exclude: [/\.(br)$/, /\.(gz)$/], // 排除指定文件
|
||||
}),
|
||||
JSON.parse(env.VITE_OPEN_CDN) ? buildConfig.cdn() : null,
|
||||
// 生产环境 monaco 汉化
|
||||
nlsPlugin({
|
||||
locale: Languages.zh_hans,
|
||||
localeData: monacoZhHans,
|
||||
}),
|
||||
vitePluginsAutoI18n({
|
||||
// 是否触发翻译
|
||||
enabled: false,
|
||||
@ -103,15 +95,6 @@ const viteConfig = defineConfig((mode: ConfigEnv) => {
|
||||
base: mode.command === 'serve' ? './' : env.VITE_PUBLIC_PATH,
|
||||
optimizeDeps: {
|
||||
exclude: ['vue-demi'],
|
||||
// 开发环境 monaco 汉化 使用 esbuild 配置实现
|
||||
esbuildOptions: {
|
||||
plugins: [
|
||||
esbuildPluginMonacoEditorNls({
|
||||
locale: Languages.zh_hans,
|
||||
localeData: monacoZhHans,
|
||||
}),
|
||||
],
|
||||
},
|
||||
},
|
||||
server: {
|
||||
host: '0.0.0.0',
|
||||
|
||||
Loading…
Reference in New Issue
Block a user