feat: full i18n support - all pages use Lang.t() for zh/en
This commit is contained in:
+23
-23
@@ -38,11 +38,11 @@ const PageScene = {
|
||||
try {
|
||||
const scenes = await API.getScenes(this._currentGameId);
|
||||
if (!scenes || scenes.length === 0) {
|
||||
grid.innerHTML = `<div class="empty-state" style="grid-column:1/-1"><h4>暂无场景</h4><p>点击"新建场景"创建你的场景</p></div>`;
|
||||
grid.innerHTML = `<div class="empty-state" style="grid-column:1/-1"><h4>${Lang.t('noScenes')}</h4><p>${Lang.t('createFirstScene')}</p></div>`;
|
||||
return;
|
||||
}
|
||||
grid.innerHTML = scenes.map(s => this._sceneCardHtml(s)).join('');
|
||||
} catch (e) { grid.innerHTML = '<div class="empty-state"><p>加载失败</p></div>'; }
|
||||
} catch (e) { grid.innerHTML = '<div class="empty-state"><p>' + Lang.t('loadFailed') + '</p></div>'; }
|
||||
},
|
||||
|
||||
async _openEditor(sceneId) {
|
||||
@@ -79,7 +79,7 @@ const PageScene = {
|
||||
<span>${d.icon||'📊'}</span>
|
||||
<span style="flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap">${d.name}</span>
|
||||
</div>`
|
||||
).join('') || '<p style="color:var(--text-tertiary);font-size:12px">无兼容仪表盘</p>';
|
||||
).join('') || '<p style="color:var(--text-tertiary);font-size:12px">' + Lang.t('noCompatibleDashForScene') + '</p>';
|
||||
|
||||
list.querySelectorAll('.editor-dash-item').forEach(el => {
|
||||
el.addEventListener('dragstart', (e) => {
|
||||
@@ -174,9 +174,9 @@ const PageScene = {
|
||||
const created = await API.createScene(data);
|
||||
this._editorSceneId = created.id;
|
||||
}
|
||||
Toast.show('场景保存成功', 'success');
|
||||
Toast.show(Lang.t('sceneSaveSuccess'), 'success');
|
||||
this._showSceneList();
|
||||
} catch (e) { Toast.show('保存失败: ' + e.message, 'error'); }
|
||||
} catch (e) { Toast.show(Lang.t('saveFailed') + e.message, 'error'); }
|
||||
},
|
||||
|
||||
_bindEvents() {
|
||||
@@ -188,8 +188,8 @@ const PageScene = {
|
||||
const fd = new FormData(); fd.append('file', file);
|
||||
const res = await fetch('/api/scenes/import', { method: 'POST', body: fd });
|
||||
const data = await res.json();
|
||||
if (data.ok) { Toast.show('场景导入成功', 'success'); this._showSceneList(); }
|
||||
else Toast.show('导入失败', 'error');
|
||||
if (data.ok) { Toast.show(Lang.t('sceneImportSuccess'), 'success'); this._showSceneList(); }
|
||||
else Toast.show(Lang.t('importFailed'), 'error');
|
||||
}; input.click();
|
||||
});
|
||||
|
||||
@@ -202,7 +202,7 @@ const PageScene = {
|
||||
const action = card.dataset.action, sceneId = card.dataset.sceneId;
|
||||
if (action === 'render') this._renderScene(sceneId);
|
||||
else if (action === 'edit') this._openEditor(sceneId);
|
||||
else if (action === 'delete') { if (confirm('确定删除?')) { API.deleteScene(sceneId); this._showSceneList(); } }
|
||||
else if (action === 'delete') { if (confirm(Lang.t('confirmDelete'))) { API.deleteScene(sceneId); this._showSceneList(); } }
|
||||
else if (action === 'export') { const a = document.createElement('a'); a.href = '/api/scenes/' + sceneId + '/export'; a.download = sceneId + '.tss'; a.click(); }
|
||||
});
|
||||
},
|
||||
@@ -210,7 +210,7 @@ const PageScene = {
|
||||
_renderScene(sceneId) {
|
||||
const url = `${location.origin}/scene/${sceneId}`;
|
||||
window.open(url, '_blank');
|
||||
navigator.clipboard.writeText(url).then(() => Toast.show('链接已复制', 'success')).catch(() => {});
|
||||
navigator.clipboard.writeText(url).then(() => Toast.show(Lang.t('linkCopiedShort'), 'success')).catch(() => {});
|
||||
},
|
||||
|
||||
_sceneCardHtml(scene) {
|
||||
@@ -219,14 +219,14 @@ const PageScene = {
|
||||
return `<div class="glass-card scene-card" data-scene-id="${scene.id}" data-action="render">
|
||||
${preview ? `<div style="height:120px;background:url(${preview}) center/cover;border-radius:8px 8px 0 0"></div>` : ''}
|
||||
<div class="scene-card-name" style="${preview?'':'padding-top:18px'}">${scene.name}</div>
|
||||
<div class="scene-card-game" style="margin-bottom:6px">${this._currentGameName || '未关联游戏'}</div>
|
||||
<div class="scene-card-meta"><span>${canvasCount} 画布</span><span>${scene.updated_at ? new Date(scene.updated_at).toLocaleDateString() : ''}</span></div>
|
||||
<div class="scene-card-game" style="margin-bottom:6px">${this._currentGameName || Lang.t('noGame')}</div>
|
||||
<div class="scene-card-meta"><span>${Lang.t('canvasesLabel').replace('%d', canvasCount)}</span><span>${scene.updated_at ? new Date(scene.updated_at).toLocaleDateString() : ''}</span></div>
|
||||
<div class="scene-canvas-list">${(scene.canvases||[]).map(c => `<span class="scene-canvas-badge">${c.label||c.width+'x'+c.height}</span>`).join('')}</div>
|
||||
<div style="margin-top:12px;display:flex;gap:6px;flex-wrap:wrap">
|
||||
<button class="btn btn-sm btn-primary" data-scene-id="${scene.id}" data-action="render">渲染</button>
|
||||
<button class="btn btn-sm btn-secondary" data-scene-id="${scene.id}" data-action="edit">编辑</button>
|
||||
<button class="btn btn-sm btn-secondary" data-scene-id="${scene.id}" data-action="export">导出</button>
|
||||
<button class="btn btn-sm btn-danger" data-scene-id="${scene.id}" data-action="delete">删除</button>
|
||||
<button class="btn btn-sm btn-primary" data-scene-id="${scene.id}" data-action="render">${Lang.t('render')}</button>
|
||||
<button class="btn btn-sm btn-secondary" data-scene-id="${scene.id}" data-action="edit">${Lang.t('edit')}</button>
|
||||
<button class="btn btn-sm btn-secondary" data-scene-id="${scene.id}" data-action="export">${Lang.t('export')}</button>
|
||||
<button class="btn btn-sm btn-danger" data-scene-id="${scene.id}" data-action="delete">${Lang.t('delete')}</button>
|
||||
</div></div>`;
|
||||
},
|
||||
|
||||
@@ -234,12 +234,12 @@ const PageScene = {
|
||||
return `
|
||||
<div class="scene-header animated" id="scene-list-container">
|
||||
<div>
|
||||
<h2>场景管理</h2>
|
||||
<p style="color:var(--text-secondary);font-size:14px;margin-top:4px">${this._currentGameId ? `当前游戏: ${this._currentGameName}` : '请先在侧边栏选择一个游戏'}</p>
|
||||
<h2>${Lang.t('sceneManagement')}</h2>
|
||||
<p style="color:var(--text-secondary);font-size:14px;margin-top:4px">${this._currentGameId ? Lang.t('currentGamePrefix') + this._currentGameName : Lang.t('noGameSelected')}</p>
|
||||
</div>
|
||||
<div style="display:flex;gap:8px">
|
||||
<button id="btn-import-scene" class="btn btn-secondary btn-sm">导入 .tss</button>
|
||||
<button id="btn-new-scene" class="btn btn-primary btn-sm" ${!this._currentGameId ? 'disabled' : ''}>+ 新建场景</button>
|
||||
<button id="btn-import-scene" class="btn btn-secondary btn-sm">${Lang.t('importTss')}</button>
|
||||
<button id="btn-new-scene" class="btn btn-primary btn-sm" ${!this._currentGameId ? 'disabled' : ''}>${Lang.t('newScene')}</button>
|
||||
</div>
|
||||
</div>
|
||||
<div id="scene-grid" class="scene-grid animated"></div>
|
||||
@@ -247,14 +247,14 @@ const PageScene = {
|
||||
<div id="scene-editor-container" style="display:none;flex-direction:column;height:100%">
|
||||
<div style="display:flex;align-items:center;justify-content:space-between;margin-bottom:12px">
|
||||
<div style="display:flex;align-items:center;gap:12px">
|
||||
<button id="btn-back-to-list" class="btn btn-sm btn-secondary">← 返回</button>
|
||||
<input id="edit-scene-name" placeholder="场景名称" style="font-size:18px;font-weight:600;width:250px" value="New Scene">
|
||||
<button id="btn-back-to-list" class="btn btn-sm btn-secondary">${Lang.t('backToList')}</button>
|
||||
<input id="edit-scene-name" placeholder="${Lang.t('sceneName')}" style="font-size:18px;font-weight:600;width:250px" value="New Scene">
|
||||
</div>
|
||||
<button id="btn-save-scene" class="btn btn-primary btn-sm">保存场景</button>
|
||||
<button id="btn-save-scene" class="btn btn-primary btn-sm">${Lang.t('saveScene')}</button>
|
||||
</div>
|
||||
<div style="display:flex;gap:12px;flex:1;min-height:0">
|
||||
<div style="width:180px;flex-shrink:0;overflow-y:auto;border-right:1px solid var(--border-subtle);padding-right:10px">
|
||||
<h4 style="font-size:13px;color:var(--text-secondary);margin-bottom:10px">仪表盘列表 (拖到画布)</h4>
|
||||
<h4 style="font-size:13px;color:var(--text-secondary);margin-bottom:10px">${Lang.t('dashListDrag')}</h4>
|
||||
<div id="editor-dash-list"></div>
|
||||
</div>
|
||||
<div style="flex:1;overflow:auto;background:var(--bg-tertiary);border-radius:8px;position:relative">
|
||||
|
||||
Reference in New Issue
Block a user