完善浏览器配置库与未保存提示

- 新增 IndexedDB 配置保存、加载、删除及批量导入导出

- 配置列表支持选中、双击加载和悬浮操作提示

- 新增未保存提示设置,默认关闭并持久化到浏览器

- 优化配置管理界面并同步九种语言文案

- 更新开发文档与生产构建产物
This commit is contained in:
tianmo committed 2026-10-23 11:48:21 +08:00
1 parent 8bd9154414
commit 46083c8d2a
30 files changed
+2244 -1293

No files matched your search

+31 -2
View File
@@ -75,12 +75,13 @@
"tickWidth": "Dicke der Teilstriche",
"axisColor": "Achsenfarbe",
"showAxisLabels": "Skalenwert anzeigen",
"unsavedPrompt": "Warnung bei ungespeicherten Änderungen",
"cacheNote": "Die gesamten Systemeinstellungen werden automatisch im aktuellen Browser gespeichert"
},
"config": {
"title": "Konfiguration",
"save": "Konfiguration speichern",
"saveTitle": "Alle Editorkonfigurationen speichern (Ctrl+S)",
"saveTitle": "Konfiguration im Browser-Cache speichern",
"load": "Konfiguration laden",
"loadTitle": "Lokale Editorkonfiguration laden",
"presets": "Voreinstellungsliste",
@@ -98,7 +99,35 @@
"presetRestoring": "Standardressourcen werden analysiert und wiederhergestellt...",
"presetComplete": "Das Laden der Voreinstellungen ist abgeschlossen",
"presetListError": "Voreinstellungsliste kann nicht gelesen werden",
"presetReadError": "Voreinstellung konnte nicht gelesen werden: {file}"
"presetReadError": "Voreinstellung konnte nicht gelesen werden: {file}",
"local": {
"listTitle": "Konfigurationsliste",
"empty": "Keine Konfigurationen in diesem Browser gespeichert",
"saveTitle": "Konfiguration im Browser-Cache speichern",
"name": "Konfigurationsname",
"namePlaceholder": "Zum Beispiel: Feuerwerkseffekt",
"load": "Laden",
"loadHint": "Doppelklicken zum Laden",
"download": "Herunterladen",
"delete": "Löschen",
"downloadCurrent": "Aktuelle Konfiguration herunterladen",
"downloadAll": "Alle Konfigurationen herunterladen",
"loadAll": "Alle Konfigurationen laden",
"loadAllConfirm": "{count} Konfigurationsdateien importieren? Gleichnamige Konfigurationen werden überschrieben.",
"loadAllDone": "{count} Konfigurationen aus Dateien geladen",
"loadAllPartial": "{imported} Konfigurationen importiert; {failed} Dateien fehlgeschlagen",
"overwriteSave": "„{name}“ existiert bereits. Überschreiben?",
"loadOverwrite": "Beim Laden von „{name}“ wird die aktuelle Szene ersetzt und ungespeicherte Änderungen gehen verloren. Fortfahren?",
"deleteConfirm": "„{name}“ löschen?",
"nameRequired": "Geben Sie einen Konfigurationsnamen ein",
"nameInvalid": "Der Name darf \\ / : * ? \" < > | nicht enthalten",
"storageUnavailable": "Der lokale Browserspeicher ist nicht verfügbar",
"saved": "Im Browser gespeichert: {name}",
"loaded": "Aus dem Browser geladen: {name}",
"deleted": "Browserkonfiguration gelöscht: {name}",
"downloadEmpty": "Keine Konfigurationen zum Herunterladen",
"downloaded": "Heruntergeladen: {name}"
}
},
"curve": {
"bezierHint": "Ziehen Sie den quadratischen Griff, um den Bogen anzupassen. · Doppelklicken Sie auf eine leere Stelle, um einen neuen zu erstellen. · Doppelklicken Sie auf einen Knoten, um ihn zu löschen",
+31 -2
View File
@@ -87,12 +87,13 @@
"tickWidth": "Tick line width",
"axisColor": "Axis color",
"showAxisLabels": "Show tick values",
"unsavedPrompt": "Prompt for unsaved changes",
"cacheNote": "Settings are saved automatically in this browser"
},
"config": {
"title": "Configuration",
"save": "Save Config",
"saveTitle": "Save the complete editor configuration (Ctrl+S)",
"saveTitle": "Save configuration to browser cache",
"load": "Load Config",
"loadTitle": "Load an editor configuration file",
"presets": "Preset list",
@@ -110,7 +111,35 @@
"presetRestoring": "Parsing and restoring preset resources…",
"presetComplete": "Preset loaded",
"presetListError": "Unable to read preset list",
"presetReadError": "Unable to read preset: {file}"
"presetReadError": "Unable to read preset: {file}",
"local": {
"listTitle": "Configuration List",
"empty": "No configurations saved in this browser",
"saveTitle": "Save configuration to browser cache",
"name": "Configuration name",
"namePlaceholder": "For example: Firework effect",
"load": "Load",
"loadHint": "Double-click to load",
"download": "Download",
"delete": "Delete",
"downloadCurrent": "Download Current Configuration",
"downloadAll": "Download All Configurations",
"loadAll": "Load All Configurations",
"loadAllConfirm": "Import {count} configuration files? Existing configurations with the same names will be overwritten.",
"loadAllDone": "Loaded {count} configurations from files",
"loadAllPartial": "Imported {imported} configurations; {failed} files failed",
"overwriteSave": "“{name}” already exists. Overwrite it?",
"loadOverwrite": "Loading “{name}” will replace the current scene and discard unsaved changes. Continue?",
"deleteConfirm": "Delete “{name}”?",
"nameRequired": "Enter a configuration name",
"nameInvalid": "The name cannot contain \\ / : * ? \" < > |",
"storageUnavailable": "Browser local storage is unavailable",
"saved": "Saved to browser: {name}",
"loaded": "Loaded from browser: {name}",
"deleted": "Deleted browser configuration: {name}",
"downloadEmpty": "No configurations to download",
"downloaded": "Downloaded: {name}"
}
},
"curve": {
"bezierHint": "Drag square handles · Double-click empty space to add · Double-click a node to delete",
+31 -2
View File
@@ -75,12 +75,13 @@
"tickWidth": "espesor de la marca de verificación",
"axisColor": "color del eje",
"showAxisLabels": "Mostrar valor de escala",
"unsavedPrompt": "Avisar sobre cambios sin guardar",
"cacheNote": "Toda la configuración del sistema se guarda automáticamente en el navegador actual."
},
"config": {
"title": "Gestión de configuración",
"save": "Guardar configuración",
"saveTitle": "Guarde todas las configuraciones del editor (Ctrl+S)",
"saveTitle": "Guardar configuración en la caché del navegador",
"load": "Cargar configuración",
"loadTitle": "Cargar la configuración del editor local",
"presets": "Lista preestablecida",
@@ -98,7 +99,35 @@
"presetRestoring": "Analizando y restaurando recursos predeterminados...",
"presetComplete": "Carga preestablecida completada",
"presetListError": "No se puede leer la lista preestablecida",
"presetReadError": "No se puede leer el ajuste preestablecido: {file}"
"presetReadError": "No se puede leer el ajuste preestablecido: {file}",
"local": {
"listTitle": "Lista de configuraciones",
"empty": "No hay configuraciones guardadas en este navegador",
"saveTitle": "Guardar configuración en la caché del navegador",
"name": "Nombre de la configuración",
"namePlaceholder": "Por ejemplo: Efecto de fuegos artificiales",
"load": "Cargar",
"loadHint": "Doble clic para cargar",
"download": "Descargar",
"delete": "Eliminar",
"downloadCurrent": "Descargar configuración actual",
"downloadAll": "Descargar todas las configuraciones",
"loadAll": "Cargar todas las configuraciones",
"loadAllConfirm": "¿Importar {count} archivos de configuración? Las configuraciones con el mismo nombre se sobrescribirán.",
"loadAllDone": "{count} configuraciones cargadas desde archivos",
"loadAllPartial": "{imported} configuraciones importadas; {failed} archivos fallaron",
"overwriteSave": "«{name}» ya existe. ¿Sobrescribir?",
"loadOverwrite": "Cargar «{name}» sustituirá la escena actual y descartará los cambios no guardados. ¿Continuar?",
"deleteConfirm": "¿Eliminar «{name}»?",
"nameRequired": "Introduce un nombre de configuración",
"nameInvalid": "El nombre no puede contener \\ / : * ? \" < > |",
"storageUnavailable": "El almacenamiento local del navegador no está disponible",
"saved": "Guardado en el navegador: {name}",
"loaded": "Cargado desde el navegador: {name}",
"deleted": "Configuración eliminada del navegador: {name}",
"downloadEmpty": "No hay configuraciones para descargar",
"downloaded": "Descargado: {name}"
}
},
"curve": {
"bezierHint": "Arrastre el controlador cuadrado para ajustar el arco · Haga doble clic en un espacio en blanco para crear uno nuevo · Haga doble clic en un nodo para eliminarlo",
+31 -2
View File
@@ -75,12 +75,13 @@
"tickWidth": "épaisseur de la graduation",
"axisColor": "couleur de l'axe",
"showAxisLabels": "Afficher la valeur de l'échelle",
"unsavedPrompt": "Avertir des modifications non enregistrées",
"cacheNote": "L'ensemble des paramètres du système sont automatiquement enregistrés dans le navigateur actuel"
},
"config": {
"title": "Configuration",
"save": "Enregistrer",
"saveTitle": "Enregistrez toutes les configurations de l'éditeur (Ctrl+S)",
"saveTitle": "Enregistrer la configuration dans le cache du navigateur",
"load": "Charger",
"loadTitle": "Charger la configuration de l'éditeur local",
"presets": "Liste des préréglages",
@@ -98,7 +99,35 @@
"presetRestoring": "Analyse et restauration des ressources par défaut...",
"presetComplete": "Chargement du préréglage terminé",
"presetListError": "Impossible de lire la liste des préréglages",
"presetReadError": "Impossible de lire le préréglage : {file}"
"presetReadError": "Impossible de lire le préréglage : {file}",
"local": {
"listTitle": "Liste des configurations",
"empty": "Aucune configuration enregistrée dans ce navigateur",
"saveTitle": "Enregistrer la configuration dans le cache du navigateur",
"name": "Nom de la configuration",
"namePlaceholder": "Par exemple : Effet de feux d’artifice",
"load": "Charger",
"loadHint": "Double-cliquez pour charger",
"download": "Télécharger",
"delete": "Supprimer",
"downloadCurrent": "Télécharger la configuration actuelle",
"downloadAll": "Télécharger toutes les configurations",
"loadAll": "Charger toutes les configurations",
"loadAllConfirm": "Importer {count} fichiers de configuration ? Les configurations portant le même nom seront écrasées.",
"loadAllDone": "{count} configurations chargées depuis les fichiers",
"loadAllPartial": "{imported} configurations importées ; {failed} fichiers en échec",
"overwriteSave": "« {name} » existe déjà. L’écraser ?",
"loadOverwrite": "Le chargement de « {name} » remplacera la scène actuelle et perdra les modifications non enregistrées. Continuer ?",
"deleteConfirm": "Supprimer « {name} » ?",
"nameRequired": "Saisissez un nom de configuration",
"nameInvalid": "Le nom ne peut pas contenir \\ / : * ? \" < > |",
"storageUnavailable": "Le stockage local du navigateur est indisponible",
"saved": "Enregistré dans le navigateur : {name}",
"loaded": "Chargé depuis le navigateur : {name}",
"deleted": "Configuration supprimée du navigateur : {name}",
"downloadEmpty": "Aucune configuration à télécharger",
"downloaded": "Téléchargé : {name}"
}
},
"curve": {
"bezierHint": "Faites glisser la poignée carrée pour ajuster l'arc · Double-cliquez sur un espace vide pour en créer un nouveau · Double-cliquez sur un nœud pour le supprimer",
+31 -2
View File
@@ -75,12 +75,13 @@
"tickWidth": "目盛りの太さ",
"axisColor": "軸の色",
"showAxisLabels": "表示スケール値",
"unsavedPrompt": "未保存の変更を確認",
"cacheNote": "システム設定全体が現在のブラウザに自動的に保存されます"
},
"config": {
"title": "設定管理",
"save": "設定を保存",
"saveTitle": "すべてのエディタ設定を保存する (Ctrl+S)",
"saveTitle": "設定をブラウザキャッシュに保存",
"load": "設定を読み込む",
"loadTitle": "ローカルエディタ設定をロードする",
"presets": "プリセットリスト",
@@ -98,7 +99,35 @@
"presetRestoring": "デフォルトのリソースを解析して復元しています...",
"presetComplete": "プリセットのロードが完了しました",
"presetListError": "プリセットリストを読み取れません",
"presetReadError": "プリセットを読み取れません: {file}"
"presetReadError": "プリセットを読み取れません: {file}",
"local": {
"listTitle": "設定一覧",
"empty": "このブラウザに保存された設定はありません",
"saveTitle": "設定をブラウザキャッシュに保存",
"name": "設定名",
"namePlaceholder": "例:花火エフェクト",
"load": "読み込む",
"loadHint": "ダブルクリックで読み込む",
"download": "ダウンロード",
"delete": "削除",
"downloadCurrent": "現在の設定をダウンロード",
"downloadAll": "すべての設定をダウンロード",
"loadAll": "すべての設定を読み込む",
"loadAllConfirm": "{count} 個の設定ファイルを読み込みます。同名の設定は上書きされます。続行しますか?",
"loadAllDone": "ファイルから {count} 個の設定を読み込みました",
"loadAllPartial": "{imported} 個の設定を読み込み、{failed} 個のファイルが失敗しました",
"overwriteSave": "「{name}」は既に存在します。上書きしますか?",
"loadOverwrite": "「{name}」を読み込むと現在のシーンが置き換えられ、未保存の変更は失われます。続行しますか?",
"deleteConfirm": "「{name}」を削除しますか?",
"nameRequired": "設定名を入力してください",
"nameInvalid": "設定名に \\ / : * ? \" < > | は使用できません",
"storageUnavailable": "ブラウザのローカルストレージを利用できません",
"saved": "ブラウザに保存しました:{name}",
"loaded": "ブラウザから読み込みました:{name}",
"deleted": "ブラウザの設定を削除しました:{name}",
"downloadEmpty": "ダウンロードできる設定がありません",
"downloaded": "ダウンロードしました:{name}"
}
},
"curve": {
"bezierHint": "四角いハンドルをドラッグして円弧を調整します。 · 空白スペースをダブルクリックして新しいスペースを作成します。 · ノードをダブルクリックして削除します。",
+31 -2
View File
@@ -75,12 +75,13 @@
"tickWidth": "눈금 표시 두께",
"axisColor": "축 색상",
"showAxisLabels": "표시 스케일 값",
"unsavedPrompt": "저장되지 않은 변경 확인",
"cacheNote": "전체 시스템 설정이 현재 브라우저에 자동으로 저장됩니다."
},
"config": {
"title": "설정 관리",
"save": "설정 저장",
"saveTitle": "모든 편집기 구성 저장(Ctrl+S)",
"saveTitle": "브라우저 캐시에 설정 저장",
"load": "설정 불러오기",
"loadTitle": "로컬 편집기 구성 로드",
"presets": "프리셋 목록",
@@ -98,7 +99,35 @@
"presetRestoring": "기본 리소스를 구문 분석하고 복원하는 중...",
"presetComplete": "프리셋 로딩 완료",
"presetListError": "사전 설정 목록을 읽을 수 없습니다.",
"presetReadError": "사전 설정을 읽을 수 없습니다: {file}"
"presetReadError": "사전 설정을 읽을 수 없습니다: {file}",
"local": {
"listTitle": "설정 목록",
"empty": "이 브라우저에 저장된 설정이 없습니다",
"saveTitle": "브라우저 캐시에 설정 저장",
"name": "설정 이름",
"namePlaceholder": "예: 폭죽 효과",
"load": "불러오기",
"loadHint": "더블클릭하여 불러오기",
"download": "다운로드",
"delete": "삭제",
"downloadCurrent": "현재 설정 다운로드",
"downloadAll": "모든 설정 다운로드",
"loadAll": "모든 설정 불러오기",
"loadAllConfirm": "설정 파일 {count}개를 가져옵니다. 같은 이름의 설정은 덮어씁니다. 계속할까요?",
"loadAllDone": "파일에서 설정 {count}개를 불러왔습니다",
"loadAllPartial": "설정 {imported}개를 가져왔고 {failed}개 파일이 실패했습니다",
"overwriteSave": "'{name}'이(가) 이미 있습니다. 덮어쓸까요?",
"loadOverwrite": "'{name}'을(를) 불러오면 현재 장면이 교체되고 저장하지 않은 변경 사항이 사라집니다. 계속할까요?",
"deleteConfirm": "'{name}'을(를) 삭제할까요?",
"nameRequired": "설정 이름을 입력하세요",
"nameInvalid": "설정 이름에는 \\ / : * ? \" < > | 문자를 사용할 수 없습니다",
"storageUnavailable": "브라우저 로컬 저장소를 사용할 수 없습니다",
"saved": "브라우저에 저장했습니다: {name}",
"loaded": "브라우저에서 불러왔습니다: {name}",
"deleted": "브라우저 설정을 삭제했습니다: {name}",
"downloadEmpty": "다운로드할 설정이 없습니다",
"downloaded": "다운로드했습니다: {name}"
}
},
"curve": {
"bezierHint": "원호를 조정하려면 사각형 핸들을 드래그하세요. · 새 공간을 만들려면 빈 공간을 두 번 클릭하세요. · 삭제하려면 노드를 두 번 클릭하세요.",
+31 -2
View File
@@ -75,12 +75,13 @@
"tickWidth": "espessura da marca",
"axisColor": "cor do eixo",
"showAxisLabels": "Exibir valor da escala",
"unsavedPrompt": "Avisar sobre alterações não salvas",
"cacheNote": "Todas as configurações do sistema são salvas automaticamente no navegador atual"
},
"config": {
"title": "Gerenciamento de configuração",
"save": "Salvar configuração",
"saveTitle": "Salve todas as configurações do editor (Ctrl+S)",
"saveTitle": "Salvar configuração no cache do navegador",
"load": "Carregar configuração",
"loadTitle": "Carregar configuração do editor local",
"presets": "Lista predefinida",
@@ -98,7 +99,35 @@
"presetRestoring": "Analisando e restaurando recursos padrão...",
"presetComplete": "Carregamento predefinido concluído",
"presetListError": "Não é possível ler a lista predefinida",
"presetReadError": "Não é possível ler a predefinição: {file}"
"presetReadError": "Não é possível ler a predefinição: {file}",
"local": {
"listTitle": "Lista de configurações",
"empty": "Nenhuma configuração salva neste navegador",
"saveTitle": "Salvar configuração no cache do navegador",
"name": "Nome da configuração",
"namePlaceholder": "Por exemplo: Efeito de fogos",
"load": "Carregar",
"loadHint": "Clique duplo para carregar",
"download": "Baixar",
"delete": "Excluir",
"downloadCurrent": "Baixar configuração atual",
"downloadAll": "Baixar todas as configurações",
"loadAll": "Carregar todas as configurações",
"loadAllConfirm": "Importar {count} arquivos de configuração? Configurações com o mesmo nome serão substituídas.",
"loadAllDone": "{count} configurações carregadas dos arquivos",
"loadAllPartial": "{imported} configurações importadas; {failed} arquivos falharam",
"overwriteSave": "“{name}” já existe. Substituir?",
"loadOverwrite": "Carregar “{name}” substituirá a cena atual e descartará alterações não salvas. Continuar?",
"deleteConfirm": "Excluir “{name}”?",
"nameRequired": "Digite um nome de configuração",
"nameInvalid": "O nome não pode conter \\ / : * ? \" < > |",
"storageUnavailable": "O armazenamento local do navegador não está disponível",
"saved": "Salvo no navegador: {name}",
"loaded": "Carregado do navegador: {name}",
"deleted": "Configuração excluída do navegador: {name}",
"downloadEmpty": "Nenhuma configuração para baixar",
"downloaded": "Baixado: {name}"
}
},
"curve": {
"bezierHint": "Arraste a alça quadrada para ajustar o arco · Clique duas vezes em um espaço em branco para criar um novo · Clique duas vezes em um nó para excluí-lo",
+31 -2
View File
@@ -87,12 +87,13 @@
"tickWidth": "刻度线粗细",
"axisColor": "坐标轴颜色",
"showAxisLabels": "显示刻度数值",
"unsavedPrompt": "未保存提示",
"cacheNote": "整个系统设置会自动保存到当前浏览器"
},
"config": {
"title": "配置管理",
"save": "保存配置",
"saveTitle": "保存全部编辑器配置 (Ctrl+S)",
"saveTitle": "保存配置到浏览器缓存",
"load": "加载配置",
"loadTitle": "加载本地编辑器配置",
"presets": "预设列表",
@@ -110,7 +111,35 @@
"presetRestoring": "正在解析并恢复预设资源…",
"presetComplete": "预设加载完成",
"presetListError": "无法读取预设列表",
"presetReadError": "无法读取预设:{file}"
"presetReadError": "无法读取预设:{file}",
"local": {
"listTitle": "配置列表",
"empty": "浏览器中还没有保存的配置",
"saveTitle": "保存配置到浏览器缓存",
"name": "配置名称",
"namePlaceholder": "例如:烟花效果",
"load": "加载",
"loadHint": "双击以加载",
"download": "下载",
"delete": "删除",
"downloadCurrent": "下载当前配置",
"downloadAll": "下载所有配置",
"loadAll": "加载所有配置",
"loadAllConfirm": "将导入 {count} 个配置文件,同名配置会被覆盖。是否继续?",
"loadAllDone": "已从文件加载 {count} 个配置",
"loadAllPartial": "已导入 {imported} 个配置,{failed} 个文件失败",
"overwriteSave": "“{name}”已存在,是否覆盖?",
"loadOverwrite": "加载“{name}”会覆盖当前场景,未保存的修改将丢失。是否继续?",
"deleteConfirm": "确定删除“{name}”吗?",
"nameRequired": "请输入配置名称",
"nameInvalid": "配置名称不能包含 \\ / : * ? \" < > |",
"storageUnavailable": "浏览器本地存储不可用",
"saved": "已保存到浏览器:{name}",
"loaded": "已从浏览器加载:{name}",
"deleted": "已删除缓存配置:{name}",
"downloadEmpty": "没有可下载的配置",
"downloaded": "已下载:{name}"
}
},
"curve": {
"bezierHint": "拖动方形手柄调整弧度 · 双击空白新建 · 双击节点删除",
+31 -2
View File
@@ -75,12 +75,13 @@
"tickWidth": "刻度線粗細",
"axisColor": "座標軸顏色",
"showAxisLabels": "顯示刻度數值",
"unsavedPrompt": "未儲存提示",
"cacheNote": "整個系統設定會自動儲存到目前瀏覽器"
},
"config": {
"title": "設定管理",
"save": "儲存設定",
"saveTitle": "儲存全部編輯器配置 (Ctrl+S)",
"saveTitle": "儲存設定到瀏覽器快取",
"load": "載入設定",
"loadTitle": "載入本機編輯器配置",
"presets": "預設列表",
@@ -98,7 +99,35 @@
"presetRestoring": "正在解析並恢復預設資源…",
"presetComplete": "預設載入完成",
"presetListError": "無法讀取預設列表",
"presetReadError": "無法讀取預設:{file}"
"presetReadError": "無法讀取預設:{file}",
"local": {
"listTitle": "設定列表",
"empty": "瀏覽器中尚無已儲存的設定",
"saveTitle": "儲存設定到瀏覽器快取",
"name": "設定名稱",
"namePlaceholder": "例如:煙花效果",
"load": "載入",
"loadHint": "按兩下以載入",
"download": "下載",
"delete": "刪除",
"downloadCurrent": "下載目前設定",
"downloadAll": "下載所有設定",
"loadAll": "載入所有設定",
"loadAllConfirm": "將匯入 {count} 個設定檔,同名設定會被覆寫。是否繼續?",
"loadAllDone": "已從檔案載入 {count} 個設定",
"loadAllPartial": "已匯入 {imported} 個設定,{failed} 個檔案失敗",
"overwriteSave": "「{name}」已存在,是否覆寫?",
"loadOverwrite": "載入「{name}」會覆寫目前場景,未儲存的修改將遺失。是否繼續?",
"deleteConfirm": "確定刪除「{name}」嗎?",
"nameRequired": "請輸入設定名稱",
"nameInvalid": "設定名稱不能包含 \\ / : * ? \" < > |",
"storageUnavailable": "瀏覽器本機儲存空間無法使用",
"saved": "已儲存到瀏覽器:{name}",
"loaded": "已從瀏覽器載入:{name}",
"deleted": "已刪除瀏覽器設定:{name}",
"downloadEmpty": "沒有可下載的設定",
"downloaded": "已下載:{name}"
}
},
"curve": {
"bezierHint": "拖曳方形手把調整弧度 · 雙擊空白新建 · 雙擊節點刪除",