diff --git a/README.md b/README.md index 65a1e47..509c2f3 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ Saved profiles appear in a visible list above the settings form. Select a row to edit it; use **New project** to create another. Invalid entries keep the settings window open and show an error. **Discard changes** cancels unsaved edits. -In **Projects…**, every profile has **Редагувати** (Edit) and **Видалити** (Delete) +In **Projects…**, every profile has **Edit** and **Delete** buttons. Confirmed deletion is saved immediately. It removes the profile, while its folder, files, and running terminals remain. Save or discard an open settings draft before deleting from the project manager. @@ -176,7 +176,7 @@ leave the active settings unchanged. | Quit | Ctrl+Shift+Q | **F1** opens quick-start guidance, searchable shortcuts, customization help, and -**Проєкти**, a Ukrainian guide to project creation, tasks, logs, and deletion. +**Projects**, a guide to project creation, tasks, logs, and deletion. Tooltips reflect your configured shortcuts. Right-click a terminal for Copy/Paste; **Ctrl+C** retains its normal role of interrupting the foreground command. diff --git a/docs/images/project-settings.png b/docs/images/project-settings.png index 8622f35..21e73e1 100644 Binary files a/docs/images/project-settings.png and b/docs/images/project-settings.png differ diff --git a/docs/images/projects.png b/docs/images/projects.png index f690644..7a3216b 100644 Binary files a/docs/images/projects.png and b/docs/images/projects.png differ diff --git a/src/help.rs b/src/help.rs index 072bdb5..00f319c 100644 --- a/src/help.rs +++ b/src/help.rs @@ -329,12 +329,12 @@ fn customize( fn project_guide() -> gtk::ScrolledWindow { let (scroll, body) = page(); for (title, text) in [ - ("Створення проєкту", "1. Відкрийте Projects… → Manage profiles (або Settings → Profiles).\n2. Натисніть Choose folder… та виберіть папку проєкту. Назву можна вказати самостійно; якщо залишити порожньою, вона буде взята з назви папки.\n3. Shell можна залишити порожнім — використається стандартна оболонка.\n4. Натисніть Save project або Save and close. Apply і хрестик вікна налаштувань також зберігають форму. Discard changes відкидає лише незбережені зміни.\n5. Відкрийте Projects…, виберіть проєкт і натисніть Open project. Збережені проєкти видно списком над формою. Натисніть рядок, щоб редагувати його, або New project для нового профілю."), - ("Видалення збереженого проєкту", "Відкрийте Projects…: біля кожного проєкту є кнопки Редагувати та Видалити. Натисніть Видалити й підтвердьте дію — профіль одразу зникне зі списку та буде видалений із налаштувань. Папка, файли й уже запущені термінали залишаться. Якщо налаштування відкриті, спочатку збережіть або відкиньте їхні зміни. У Settings → Profiles також можна вибрати видимий рядок та натиснути Видалити вибраний проєкт, потім зберегти зміни."), - ("Автозапуск команд", "У полі Startup tasks введіть по одному завданню на рядок: Назва | команда. Наприклад:\nServer | npm run dev\nTests | npm test\nLogs | tail -f app.log\n\nЦе приклади: вкажіть команди саме вашого проєкту. Для звичайного термінала залиште поле порожнім. Увімкніть Run tasks automatically when I open this project та збережіть налаштування. Кожна команда запускається паралельно у своїй вкладці з папки проєкту. Сервер залишайте на передньому плані, без & в кінці команди."), - ("Логи, помилки та сповіщення", "Вивід програми й повідомлення про помилки з’являються в її терміналі під час роботи. ▶ означає запуск, ✓ — успішне завершення, ✗ — ненульовий код завершення або сигнал зупинки. Текст помилки у ще працюючій програмі не змінює статус автоматично.\nУ профілі виберіть Notify on errors only (лише помилки), Notify on every completion (усі завершення) або No desktop notifications. Сповіщення потребують служби повідомлень вашого робочого столу.\nЛоги залишаються у вкладці до її закриття або виходу з TermLook; на диск вони автоматично не архівуються."), - ("Зупинка та повторний запуск", "Ctrl+C у вкладці зупиняє команду; закриття вкладки потребує підтвердження. Повторне Open project повертає до робочого простору без дублювання завдань. Open + run tasks запускає завершений набір ще раз у нових вкладках. Поки хоча б одне завдання працює, повторний запуск заблокований. Після перезапуску TermLook відкрийте профіль через Projects, щоб запустити команди знову."), - ("Якщо проєкт не зберігається", "Після успішного Save project або Apply внизу налаштувань з’явиться Settings and projects saved. Якщо папка відсутня, оболонка не виконується або формат команди неправильний, буде показано помилку, а вікно залишиться відкритим. Виправте дані та збережіть ще раз. Якщо назва папки вже зайнята іншим профілем, задайте унікальну назву. Зміна профілю впливає на наступні запуски, а не перезапускає поточні процеси."), + ("Create a project", "1. Open Projects… → Manage profiles (or Settings → Profiles).\n2. Click Choose folder… and select your project folder. Enter a name, or leave it blank to use the folder name.\n3. Leave Shell empty to use the default shell.\n4. Click Save project or Save and close. Apply and the Settings window close button also save your form. Discard changes cancels unsaved edits.\n5. Open Projects…, select the project, and click Open project. Saved projects appear in the list above the form. Select a row to edit it, or click New project to create another."), + ("Delete a saved project", "Open Projects… to see Edit and Delete buttons next to each saved project. Click Delete and confirm to remove the profile from the list and saved settings immediately. Its folder, files, and running terminals are kept. If Settings is open, save or discard its changes first. You can also select a row in Settings → Profiles, click Delete selected project, and save your changes."), + ("Startup tasks", "Enter one task per line in Startup tasks using Name | command. For example:\nServer | npm run dev\nTests | npm test\nLogs | tail -f app.log\n\nUse commands that exist in your project. Leave the field empty for a normal terminal. Enable Run tasks automatically when I open this project and save. Each command runs concurrently in its own tab, from the project folder. Keep servers in the foreground, without a trailing &."), + ("Logs, errors, and notifications", "Standard output and error messages appear in the task terminal while it runs. ▶ means running, ✓ means success, and ✗ indicates a nonzero exit code or termination signal. Error text from a still-running program does not automatically change its status.\nChoose Notify on errors only, Notify on every completion, or No desktop notifications in the profile. Desktop notifications require your desktop notification service.\nLogs remain until the tab or TermLook closes. They are not automatically archived to disk."), + ("Stop and rerun tasks", "Press Ctrl+C in a task tab to stop its foreground command. Closing a tab asks for confirmation. Opening the same project again selects its workspace without duplicating tasks. Open + run tasks reruns a finished template in new tabs. Rerunning is blocked while any template task is still running. After restarting TermLook, open the profile from Projects to launch its tasks again."), + ("Troubleshooting saving", "After Save project or Apply succeeds, Settings and projects saved appears at the bottom of Settings. A missing folder, an invalid shell, or an incorrectly formatted task shows an error and keeps the window open. Correct the form and save again. If the folder name is already used by another profile, enter a unique project name. Profile changes affect future launches and do not restart current processes."), ] { body.pack_start(&card(title, text), false, false, 0); } scroll } @@ -373,7 +373,7 @@ pub fn show(window: >k::ApplicationWindow, settings: &Settings, dir: &Path, we let stack = gtk::Stack::new(); stack.set_transition_type(gtk::StackTransitionType::Crossfade); stack.add_titled(&quick_start(settings), "start", "Quick start"); - stack.add_titled(&project_guide(), "projects", "Проєкти"); + stack.add_titled(&project_guide(), "projects", "Projects"); stack.add_titled(&shortcuts(settings), "shortcuts", "Shortcuts"); stack.add_titled( &customize(settings, dir, &dialog, weak), diff --git a/src/projects.rs b/src/projects.rs index a9adc2d..97b74ef 100644 --- a/src/projects.rs +++ b/src/projects.rs @@ -115,13 +115,13 @@ impl Editor { default: >k::Entry, ) -> Self { let widget = gtk::Box::new(gtk::Orientation::Vertical, 10); - let heading = gtk::Label::new(Some("Збережені проєкти — натисніть рядок для редагування")); + let heading = gtk::Label::new(Some("Saved projects — select a row to edit")); heading.set_xalign(0.0); heading.set_line_wrap(true); widget.pack_start(&heading, false, false, 0); let selected = ProfileList::new(); let empty = gtk::Label::new(Some( - "Проєктів ще немає. Виберіть папку нижче та натисніть Save project.", + "No saved projects yet. Choose a folder below and click Save project.", )); empty.set_line_wrap(true); selected.0.set_placeholder(Some(&empty)); @@ -182,7 +182,7 @@ impl Editor { }); let save = gtk::Button::with_label("Save project"); let new = gtk::Button::with_label("New project"); - let delete = gtk::Button::with_label("Видалити вибраний проєкт"); + let delete = gtk::Button::with_label("Delete selected project"); delete.set_sensitive(false); delete.set_widget_name("project-remove"); for button in [&save, &new, &delete] { @@ -504,9 +504,9 @@ impl State { let contents = gtk::Box::new(gtk::Orientation::Horizontal, 12); label.set_ellipsize(pango::EllipsizeMode::Middle); contents.pack_start(&label, true, true, 0); - let edit = gtk::Button::with_label("Редагувати"); + let edit = gtk::Button::with_label("Edit"); edit.set_widget_name(&format!("edit-project-{name}")); - let delete = gtk::Button::with_label("Видалити"); + let delete = gtk::Button::with_label("Delete"); delete.set_widget_name(&format!("delete-project-{name}")); edit.set_valign(gtk::Align::Center); delete.set_valign(gtk::Align::Center); @@ -532,9 +532,9 @@ impl State { // An open settings draft must be saved/discarded before editing the on-disk list. delete.set_sensitive(self.preferences.is_none()); delete.set_tooltip_text(Some(if self.preferences.is_some() { - "Спочатку збережіть або закрийте налаштування." + "Save or close Settings first." } else { - "Видалити лише профіль. Файли та запущені термінали залишаться." + "Delete only the profile. Files and running terminals are kept." })); let weak = self.weak.clone(); let key = name.clone(); @@ -548,15 +548,15 @@ impl State { gtk::DialogFlags::MODAL | gtk::DialogFlags::DESTROY_WITH_PARENT, gtk::MessageType::Question, gtk::ButtonsType::None, - &format!("Видалити проєкт «{key}» зі збережених?"), + &format!("Delete saved project “{key}”?"), ); confirm.set_widget_name("project-delete-confirmation"); confirm.set_secondary_text(Some( - "Видаляється лише профіль. Папка, файли та запущені термінали залишаться.", + "Only the profile will be deleted. Its folder, files, and running terminals are kept.", )); confirm.add_buttons(&[ - ("Скасувати", gtk::ResponseType::Cancel), - ("Видалити", gtk::ResponseType::Accept), + ("Cancel", gtk::ResponseType::Cancel), + ("Delete", gtk::ResponseType::Accept), ]); confirm.set_default_response(gtk::ResponseType::Cancel); let weak = weak.clone();