feat(i18n): 统一国际化系统架构,支持插件独立翻译 (#301)

* feat(i18n): 统一国际化系统架构,支持插件独立翻译

## 主要改动

### 核心架构
- 增强 LocaleService,支持插件命名空间翻译扩展
- 新增 editor-runtime/i18n 模块,提供 createPluginLocale/createPluginTranslator
- 新增 editor-core/tokens.ts,定义 LocaleServiceToken 等服务令牌
- 改进 PluginAPI 类型安全,使用 ServiceToken<T> 替代 any

### 编辑器本地化
- 扩展 en.ts/zh.ts 翻译文件,覆盖所有 UI 组件
- 新增 es.ts 西班牙语支持
- 重构 40+ 组件使用 useLocale() hook

### 插件本地化系统
- behavior-tree-editor: 新增 locales/ 和 useBTLocale hook
- material-editor: 新增 locales/ 和 useMaterialLocale hook
- particle-editor: 新增 locales/ 和 useParticleLocale hook
- tilemap-editor: 新增 locales/ 和 useTilemapLocale hook
- ui-editor: 新增 locales/ 和 useUILocale hook

### 类型安全改进
- 修复 Debug 工具使用公共接口替代 as any
- 修复 ChunkStreamingSystem 添加 forEachChunk 公共方法
- 修复 blueprint-editor 移除不必要的向后兼容代码

* fix(behavior-tree-editor): 使用 ServiceToken 模式修复服务解析

- 创建 BehaviorTreeServiceToken 遵循"谁定义接口,谁导出Token"原则
- 使用 ServiceToken.id (symbol) 注册服务到 ServiceContainer
- 更新 PluginSDKRegistry.resolveService 支持 ServiceToken 检测
- BehaviorTreeEditorPanel 现在使用类型安全的 PluginAPI.resolve

* fix(behavior-tree-editor): 使用 ServiceContainer.resolve 获取类注册的服务

* fix: 修复多个包的依赖和类型问题

- core: EntityDataCollector.getEntityDetails 使用 HierarchySystem 获取父实体
- ui-editor: 添加 @esengine/editor-runtime 依赖
- tilemap-editor: 添加 @esengine/editor-runtime 依赖
- particle-editor: 添加 @esengine/editor-runtime 依赖
This commit is contained in:
YHH
2025-12-09 18:04:03 +08:00
committed by GitHub
parent 995fa2d514
commit 1b0d38edce
103 changed files with 8015 additions and 1633 deletions

View File

@@ -0,0 +1,71 @@
/**
* Material Editor English Translations
* 材质编辑器英文翻译
*/
export const en = {
// Editor Panel
panel: {
loading: 'Loading...',
emptyState: 'Double-click a .mat file to open the material editor',
save: 'Save',
saveTooltip: 'Save (Ctrl+S)',
},
// Properties Section
properties: {
basicTitle: 'Basic Properties',
name: 'Name',
shader: 'Shader',
shaderPath: 'Shader Path',
shaderPathPlaceholder: 'Enter .shader file path',
browse: 'Browse...',
blendMode: 'Blend Mode',
customShader: 'Custom Shader...',
},
// Uniforms Section
uniforms: {
title: 'Uniform Parameters',
empty: 'This shader has no custom parameters',
namePlaceholder: 'Uniform name...',
addTooltip: 'Add uniform',
removeTooltip: 'Remove uniform',
},
// File Info Section
fileInfo: {
title: 'File Info',
path: 'Path',
},
// Blend Mode Options
blendModes: {
none: 'None (Opaque)',
alpha: 'Alpha Blend',
additive: 'Additive',
multiply: 'Multiply',
screen: 'Screen',
premultipliedAlpha: 'Premultiplied Alpha',
},
// Built-in Shader Options
shaders: {
defaultSprite: 'Default Sprite',
grayscale: 'Grayscale',
tint: 'Tint',
flash: 'Flash',
outline: 'Outline',
},
// Inspector Panel
inspector: {
saveTooltip: 'Save (Ctrl+S)',
save: 'Save',
reset: 'Reset',
resetTooltip: 'Reset changes',
basicProperties: 'Basic Properties',
uniforms: 'Uniforms',
loading: 'Loading...',
parseError: 'Failed to parse material file',
},
};

View File

@@ -0,0 +1,71 @@
/**
* Material Editor Spanish Translations
* 材质编辑器西班牙语翻译
*/
export const es = {
// Editor Panel
panel: {
loading: 'Cargando...',
emptyState: 'Haga doble clic en un archivo .mat para abrir el editor de materiales',
save: 'Guardar',
saveTooltip: 'Guardar (Ctrl+S)',
},
// Properties Section
properties: {
basicTitle: 'Propiedades Básicas',
name: 'Nombre',
shader: 'Shader',
shaderPath: 'Ruta del Shader',
shaderPathPlaceholder: 'Ingrese la ruta del archivo .shader',
browse: 'Explorar...',
blendMode: 'Modo de Mezcla',
customShader: 'Shader Personalizado...',
},
// Uniforms Section
uniforms: {
title: 'Parámetros Uniform',
empty: 'Este shader no tiene parámetros personalizados',
namePlaceholder: 'Nombre del uniform...',
addTooltip: 'Agregar uniform',
removeTooltip: 'Eliminar uniform',
},
// File Info Section
fileInfo: {
title: 'Información del Archivo',
path: 'Ruta',
},
// Blend Mode Options
blendModes: {
none: 'Ninguno (Opaco)',
alpha: 'Mezcla Alpha',
additive: 'Aditivo',
multiply: 'Multiplicar',
screen: 'Pantalla',
premultipliedAlpha: 'Alpha Premultiplicado',
},
// Built-in Shader Options
shaders: {
defaultSprite: 'Sprite por Defecto',
grayscale: 'Escala de Grises',
tint: 'Tinte',
flash: 'Destello',
outline: 'Contorno',
},
// Inspector Panel
inspector: {
saveTooltip: 'Guardar (Ctrl+S)',
save: 'Guardar',
reset: 'Restablecer',
resetTooltip: 'Restablecer cambios',
basicProperties: 'Propiedades Básicas',
uniforms: 'Uniforms',
loading: 'Cargando...',
parseError: 'Error al analizar el archivo de material',
},
};

View File

@@ -0,0 +1,7 @@
/**
* Material Editor Locale Exports
* 材质编辑器语言导出
*/
export { en } from './en';
export { zh } from './zh';
export { es } from './es';

View File

@@ -0,0 +1,71 @@
/**
* Material Editor Chinese Translations
* 材质编辑器中文翻译
*/
export const zh = {
// Editor Panel
panel: {
loading: '加载中...',
emptyState: '双击 .mat 文件打开材质编辑器',
save: '保存',
saveTooltip: '保存 (Ctrl+S)',
},
// Properties Section
properties: {
basicTitle: '基本属性',
name: '名称',
shader: '着色器',
shaderPath: '着色器路径',
shaderPathPlaceholder: '输入 .shader 文件路径',
browse: '浏览...',
blendMode: '混合模式',
customShader: '自定义着色器...',
},
// Uniforms Section
uniforms: {
title: 'Uniform 参数',
empty: '该着色器没有自定义参数',
namePlaceholder: 'Uniform 名称...',
addTooltip: '添加 uniform',
removeTooltip: '删除 uniform',
},
// File Info Section
fileInfo: {
title: '文件信息',
path: '路径',
},
// Blend Mode Options
blendModes: {
none: '无 (不透明)',
alpha: 'Alpha 混合',
additive: '叠加',
multiply: '正片叠底',
screen: '滤色',
premultipliedAlpha: '预乘 Alpha',
},
// Built-in Shader Options
shaders: {
defaultSprite: '默认精灵',
grayscale: '灰度',
tint: '着色',
flash: '闪烁',
outline: '描边',
},
// Inspector Panel
inspector: {
saveTooltip: '保存 (Ctrl+S)',
save: '保存',
reset: '重置',
resetTooltip: '重置更改',
basicProperties: '基本属性',
uniforms: 'Uniforms',
loading: '加载中...',
parseError: '材质文件解析失败',
},
};