diff --git a/frontend/src/components/editor/FileExplorer.tsx b/frontend/src/components/editor/FileExplorer.tsx index 043e3cfd..235dc573 100644 --- a/frontend/src/components/editor/FileExplorer.tsx +++ b/frontend/src/components/editor/FileExplorer.tsx @@ -1,4 +1,5 @@ import React, { useState, useRef, useEffect, useCallback } from 'react'; +import { useTranslation } from 'react-i18next'; import { useEditorStore } from '../../store/useEditorStore'; import { useSimulatorStore } from '../../store/useSimulatorStore'; import type { BoardKind } from '../../types/board'; @@ -151,6 +152,7 @@ interface FileExplorerProps { } export const FileExplorer: React.FC = ({ onSaveClick, onNewClick }) => { + const { t } = useTranslation(); const { fileGroups, activeFileId, @@ -244,7 +246,7 @@ export const FileExplorer: React.FC = ({ onSaveClick, onNewCl setContextMenu(null); const files = fileGroups[groupId] ?? []; if (files.length <= 1) return; - if (!window.confirm('Delete this file?')) return; + if (!window.confirm(t('editor.fileExplorer.confirmDelete'))) return; deleteFile(fileId); }; @@ -270,18 +272,18 @@ export const FileExplorer: React.FC = ({ onSaveClick, onNewCl return (
- WORKSPACE + {t('editor.fileExplorer.workspace')}
@@ -335,13 +337,19 @@ export const FileExplorer: React.FC = ({ onSaveClick, onNewCl {/* New file button — visible on hover */}
); @@ -429,7 +437,7 @@ export const FileExplorer: React.FC = ({ onSaveClick, onNewCl {/* Fallback: no boards yet */} {boards.length === 0 && (
- Add a board to the canvas to start editing code. + {t('editor.fileExplorer.emptyState')}
)}
@@ -441,14 +449,14 @@ export const FileExplorer: React.FC = ({ onSaveClick, onNewCl onClick={(e) => e.stopPropagation()} >
)} diff --git a/frontend/src/components/editor/FileTabs.tsx b/frontend/src/components/editor/FileTabs.tsx index 60cd4758..3b524743 100644 --- a/frontend/src/components/editor/FileTabs.tsx +++ b/frontend/src/components/editor/FileTabs.tsx @@ -1,8 +1,10 @@ import React, { useState } from 'react'; +import { useTranslation } from 'react-i18next'; import { useEditorStore } from '../../store/useEditorStore'; import './FileTabs.css'; export const FileTabs: React.FC = () => { + const { t } = useTranslation(); const { files, openFileIds, activeFileId, setActiveFile, closeFile } = useEditorStore(); const [confirmCloseId, setConfirmCloseId] = useState(null); @@ -34,12 +36,14 @@ export const FileTabs: React.FC = () => { onClick={() => setActiveFile(file.id)} title={file.name} > - {file.modified && } + {file.modified && ( + + )} {file.name} @@ -50,12 +54,12 @@ export const FileTabs: React.FC = () => { {confirmCloseId && (
setConfirmCloseId(null)}>
e.stopPropagation()}> -

Close file with unsaved changes?

+

{t('editor.fileTabs.confirmClose')}

- +
diff --git a/frontend/src/i18n/locales/de/common.json b/frontend/src/i18n/locales/de/common.json index fa66c026..5c876c21 100644 --- a/frontend/src/i18n/locales/de/common.json +++ b/frontend/src/i18n/locales/de/common.json @@ -108,6 +108,35 @@ "cta": "Bibliotheksmanager", "dismiss": "Schließen" } + }, + "fileExplorer": { + "workspace": "ARBEITSBEREICH", + "newWorkspace": "Neuer Arbeitsbereich (entfernt Boards, Bauteile, Drähte und Dateien)", + "saveProject": "Projekt speichern (Strg+S)", + "clickToEdit": "zum Bearbeiten klicken", + "collapse": "Einklappen", + "expand": "Aufklappen", + "newFileInBoard": "Neue Datei auf diesem Board", + "unsavedChanges": "Nicht gespeicherte Änderungen", + "unsavedSuffix": "nicht gespeichert", + "emptyState": "Füge ein Board zur Leinwand hinzu, um Code zu schreiben.", + "confirmDelete": "Diese Datei löschen?", + "status": { + "running": "Läuft", + "compiled": "Kompiliert", + "idle": "Inaktiv" + }, + "contextMenu": { + "rename": "Umbenennen", + "delete": "Löschen" + } + }, + "fileTabs": { + "unsavedChanges": "Nicht gespeicherte Änderungen", + "close": "Schließen", + "confirmClose": "Datei mit nicht gespeicherten Änderungen schließen?", + "closeAnyway": "Trotzdem schließen", + "cancel": "Abbrechen" } } } diff --git a/frontend/src/i18n/locales/en/common.json b/frontend/src/i18n/locales/en/common.json index 174c283e..6876a49f 100644 --- a/frontend/src/i18n/locales/en/common.json +++ b/frontend/src/i18n/locales/en/common.json @@ -108,6 +108,35 @@ "cta": "Library Manager", "dismiss": "Dismiss" } + }, + "fileExplorer": { + "workspace": "WORKSPACE", + "newWorkspace": "New workspace (clears boards, components, wires and files)", + "saveProject": "Save project (Ctrl+S)", + "clickToEdit": "click to edit", + "collapse": "Collapse", + "expand": "Expand", + "newFileInBoard": "New file in this board", + "unsavedChanges": "Unsaved changes", + "unsavedSuffix": "unsaved", + "emptyState": "Add a board to the canvas to start editing code.", + "confirmDelete": "Delete this file?", + "status": { + "running": "Running", + "compiled": "Compiled", + "idle": "Idle" + }, + "contextMenu": { + "rename": "Rename", + "delete": "Delete" + } + }, + "fileTabs": { + "unsavedChanges": "Unsaved changes", + "close": "Close", + "confirmClose": "Close file with unsaved changes?", + "closeAnyway": "Close anyway", + "cancel": "Cancel" } } } diff --git a/frontend/src/i18n/locales/es/common.json b/frontend/src/i18n/locales/es/common.json index 3fa2678d..cd780e83 100644 --- a/frontend/src/i18n/locales/es/common.json +++ b/frontend/src/i18n/locales/es/common.json @@ -108,6 +108,35 @@ "cta": "Gestor de librerías", "dismiss": "Descartar" } + }, + "fileExplorer": { + "workspace": "ESPACIO DE TRABAJO", + "newWorkspace": "Nuevo espacio de trabajo (borra placas, componentes, cables y archivos)", + "saveProject": "Guardar proyecto (Ctrl+S)", + "clickToEdit": "haz clic para editar", + "collapse": "Plegar", + "expand": "Expandir", + "newFileInBoard": "Nuevo archivo en esta placa", + "unsavedChanges": "Cambios sin guardar", + "unsavedSuffix": "sin guardar", + "emptyState": "Añade una placa al lienzo para empezar a editar código.", + "confirmDelete": "¿Eliminar este archivo?", + "status": { + "running": "En ejecución", + "compiled": "Compilado", + "idle": "Inactivo" + }, + "contextMenu": { + "rename": "Renombrar", + "delete": "Eliminar" + } + }, + "fileTabs": { + "unsavedChanges": "Cambios sin guardar", + "close": "Cerrar", + "confirmClose": "¿Cerrar archivo con cambios sin guardar?", + "closeAnyway": "Cerrar igualmente", + "cancel": "Cancelar" } } } diff --git a/frontend/src/i18n/locales/fr/common.json b/frontend/src/i18n/locales/fr/common.json index 990bd9a7..057ca019 100644 --- a/frontend/src/i18n/locales/fr/common.json +++ b/frontend/src/i18n/locales/fr/common.json @@ -108,6 +108,35 @@ "cta": "Gestionnaire de bibliothèques", "dismiss": "Fermer" } + }, + "fileExplorer": { + "workspace": "ESPACE DE TRAVAIL", + "newWorkspace": "Nouvel espace de travail (efface cartes, composants, fils et fichiers)", + "saveProject": "Enregistrer le projet (Ctrl+S)", + "clickToEdit": "cliquer pour modifier", + "collapse": "Réduire", + "expand": "Développer", + "newFileInBoard": "Nouveau fichier sur cette carte", + "unsavedChanges": "Modifications non enregistrées", + "unsavedSuffix": "non enregistré", + "emptyState": "Ajoutez une carte au canevas pour commencer à éditer du code.", + "confirmDelete": "Supprimer ce fichier ?", + "status": { + "running": "En cours", + "compiled": "Compilé", + "idle": "Inactif" + }, + "contextMenu": { + "rename": "Renommer", + "delete": "Supprimer" + } + }, + "fileTabs": { + "unsavedChanges": "Modifications non enregistrées", + "close": "Fermer", + "confirmClose": "Fermer le fichier avec des modifications non enregistrées ?", + "closeAnyway": "Fermer quand même", + "cancel": "Annuler" } } } diff --git a/frontend/src/i18n/locales/it/common.json b/frontend/src/i18n/locales/it/common.json index 729511a2..c3a35011 100644 --- a/frontend/src/i18n/locales/it/common.json +++ b/frontend/src/i18n/locales/it/common.json @@ -108,6 +108,35 @@ "cta": "Gestore Librerie", "dismiss": "Ignora" } + }, + "fileExplorer": { + "workspace": "WORKSPACE", + "newWorkspace": "Nuovo workspace (cancella schede, componenti, fili e file)", + "saveProject": "Salva progetto (Ctrl+S)", + "clickToEdit": "clic per modificare", + "collapse": "Comprimi", + "expand": "Espandi", + "newFileInBoard": "Nuovo file su questa scheda", + "unsavedChanges": "Modifiche non salvate", + "unsavedSuffix": "non salvato", + "emptyState": "Aggiungi una scheda sul canvas per iniziare a scrivere codice.", + "confirmDelete": "Eliminare questo file?", + "status": { + "running": "In esecuzione", + "compiled": "Compilato", + "idle": "Inattivo" + }, + "contextMenu": { + "rename": "Rinomina", + "delete": "Elimina" + } + }, + "fileTabs": { + "unsavedChanges": "Modifiche non salvate", + "close": "Chiudi", + "confirmClose": "Chiudere il file con modifiche non salvate?", + "closeAnyway": "Chiudi comunque", + "cancel": "Annulla" } } } diff --git a/frontend/src/i18n/locales/ja/common.json b/frontend/src/i18n/locales/ja/common.json index a8b91d02..231de11f 100644 --- a/frontend/src/i18n/locales/ja/common.json +++ b/frontend/src/i18n/locales/ja/common.json @@ -108,6 +108,35 @@ "cta": "ライブラリマネージャー", "dismiss": "閉じる" } + }, + "fileExplorer": { + "workspace": "ワークスペース", + "newWorkspace": "新しいワークスペース(ボード、コンポーネント、配線、ファイルをすべて削除)", + "saveProject": "プロジェクトを保存 (Ctrl+S)", + "clickToEdit": "クリックして編集", + "collapse": "折りたたむ", + "expand": "展開", + "newFileInBoard": "このボードに新規ファイル", + "unsavedChanges": "未保存の変更", + "unsavedSuffix": "未保存", + "emptyState": "キャンバスにボードを追加してコードの編集を開始しましょう。", + "confirmDelete": "このファイルを削除しますか?", + "status": { + "running": "実行中", + "compiled": "コンパイル済み", + "idle": "アイドル" + }, + "contextMenu": { + "rename": "名前を変更", + "delete": "削除" + } + }, + "fileTabs": { + "unsavedChanges": "未保存の変更", + "close": "閉じる", + "confirmClose": "未保存の変更があるファイルを閉じますか?", + "closeAnyway": "それでも閉じる", + "cancel": "キャンセル" } } } diff --git a/frontend/src/i18n/locales/pt-br/common.json b/frontend/src/i18n/locales/pt-br/common.json index c8ea1238..ff3970da 100644 --- a/frontend/src/i18n/locales/pt-br/common.json +++ b/frontend/src/i18n/locales/pt-br/common.json @@ -108,6 +108,35 @@ "cta": "Gerenciador de Bibliotecas", "dismiss": "Dispensar" } + }, + "fileExplorer": { + "workspace": "ESPAÇO DE TRABALHO", + "newWorkspace": "Novo espaço de trabalho (limpa placas, componentes, fios e arquivos)", + "saveProject": "Salvar projeto (Ctrl+S)", + "clickToEdit": "clique para editar", + "collapse": "Recolher", + "expand": "Expandir", + "newFileInBoard": "Novo arquivo nesta placa", + "unsavedChanges": "Alterações não salvas", + "unsavedSuffix": "não salvo", + "emptyState": "Adicione uma placa à tela para começar a editar código.", + "confirmDelete": "Excluir este arquivo?", + "status": { + "running": "Em execução", + "compiled": "Compilado", + "idle": "Inativo" + }, + "contextMenu": { + "rename": "Renomear", + "delete": "Excluir" + } + }, + "fileTabs": { + "unsavedChanges": "Alterações não salvas", + "close": "Fechar", + "confirmClose": "Fechar arquivo com alterações não salvas?", + "closeAnyway": "Fechar mesmo assim", + "cancel": "Cancelar" } } } diff --git a/frontend/src/i18n/locales/ru/common.json b/frontend/src/i18n/locales/ru/common.json index ee815f88..046c05bc 100644 --- a/frontend/src/i18n/locales/ru/common.json +++ b/frontend/src/i18n/locales/ru/common.json @@ -108,6 +108,35 @@ "cta": "Менеджер библиотек", "dismiss": "Закрыть" } + }, + "fileExplorer": { + "workspace": "РАБОЧАЯ ОБЛАСТЬ", + "newWorkspace": "Новая рабочая область (удалит платы, компоненты, провода и файлы)", + "saveProject": "Сохранить проект (Ctrl+S)", + "clickToEdit": "нажмите, чтобы редактировать", + "collapse": "Свернуть", + "expand": "Развернуть", + "newFileInBoard": "Новый файл на этой плате", + "unsavedChanges": "Несохранённые изменения", + "unsavedSuffix": "не сохранено", + "emptyState": "Добавьте плату на холст, чтобы начать писать код.", + "confirmDelete": "Удалить этот файл?", + "status": { + "running": "Работает", + "compiled": "Скомпилировано", + "idle": "Простой" + }, + "contextMenu": { + "rename": "Переименовать", + "delete": "Удалить" + } + }, + "fileTabs": { + "unsavedChanges": "Несохранённые изменения", + "close": "Закрыть", + "confirmClose": "Закрыть файл с несохранёнными изменениями?", + "closeAnyway": "Всё равно закрыть", + "cancel": "Отмена" } } } diff --git a/frontend/src/i18n/locales/zh-cn/common.json b/frontend/src/i18n/locales/zh-cn/common.json index d54dc954..3365ee1d 100644 --- a/frontend/src/i18n/locales/zh-cn/common.json +++ b/frontend/src/i18n/locales/zh-cn/common.json @@ -108,6 +108,35 @@ "cta": "库管理器", "dismiss": "关闭" } + }, + "fileExplorer": { + "workspace": "工作区", + "newWorkspace": "新建工作区(清空开发板、元件、连线和文件)", + "saveProject": "保存项目 (Ctrl+S)", + "clickToEdit": "点击编辑", + "collapse": "折叠", + "expand": "展开", + "newFileInBoard": "在此开发板上新建文件", + "unsavedChanges": "未保存的更改", + "unsavedSuffix": "未保存", + "emptyState": "请将开发板添加到画布上以开始编写代码。", + "confirmDelete": "删除此文件?", + "status": { + "running": "运行中", + "compiled": "已编译", + "idle": "空闲" + }, + "contextMenu": { + "rename": "重命名", + "delete": "删除" + } + }, + "fileTabs": { + "unsavedChanges": "未保存的更改", + "close": "关闭", + "confirmClose": "确定关闭包含未保存更改的文件吗?", + "closeAnyway": "仍然关闭", + "cancel": "取消" } } }