From cef3546bf6a4f78582a320a78be73a2e5b3bf7de Mon Sep 17 00:00:00 2001 From: Anton Arnaudov Date: Sat, 17 Oct 2026 22:17:09 +0300 Subject: [PATCH 1/3] =?UTF-8?q?feat(changes):=20changelists=20=E2=80=94=20?= =?UTF-8?q?park=20files=20that=20Stage=20All=20and=20Commit=20all=20leave?= =?UTF-8?q?=20alone=20(#122)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit A file can be moved into a named changelist from its row, a selection, a folder or by dragging it onto one. Each changelist is its own group under Unstaged (under Changes in the checkbox model). Its files are left out of Stage All, Check all, Commit all and Discard All, and are staged only by hand; the Commit button's "Commit all N" counts what will really be staged. A changelist's header stages its files, and its menu renames or deletes it (deleting hands the files back to Changes and touches nothing). Changelists live in /gitstudio-changelists.json (git-service Changelists.ts), so they are per repository and per worktree and never in the working tree. A parked file committed or discarded clean through GitStudio leaves its changelist; the prune asks git, never vscode.git's cached lists, which can read empty mid-scan. Co-Authored-By: Claude Opus 5.5 --- apps/extension/CHANGELOG.md | 10 + apps/extension/l10n/bundle.l10n.cs.json | 29 + apps/extension/l10n/bundle.l10n.de.json | 29 + apps/extension/l10n/bundle.l10n.es.json | 29 + apps/extension/l10n/bundle.l10n.fr.json | 29 + apps/extension/l10n/bundle.l10n.it.json | 29 + apps/extension/l10n/bundle.l10n.ja.json | 29 + apps/extension/l10n/bundle.l10n.json | 29 + apps/extension/l10n/bundle.l10n.ko.json | 29 + apps/extension/l10n/bundle.l10n.pl.json | 29 + apps/extension/l10n/bundle.l10n.pt-br.json | 29 + apps/extension/l10n/bundle.l10n.ru.json | 29 + apps/extension/l10n/bundle.l10n.tr.json | 29 + apps/extension/l10n/bundle.l10n.zh-cn.json | 29 + apps/extension/l10n/bundle.l10n.zh-tw.json | 29 + apps/extension/src/changes/commitView.ts | 640 +++++++++++++++++- .../extension/test/changesChangelists.test.ts | 249 +++++++ .../test/changesChangelistsPage.test.ts | 288 ++++++++ l10n/cs.json | 28 + l10n/de.json | 28 + l10n/es.json | 28 + l10n/fr.json | 28 + l10n/it.json | 28 + l10n/ja.json | 28 + l10n/ko.json | 28 + l10n/pl.json | 28 + l10n/pt-br.json | 28 + l10n/ru.json | 28 + l10n/tr.json | 28 + l10n/zh-cn.json | 28 + l10n/zh-tw.json | 28 + packages/git-service/src/Changelists.ts | 264 ++++++++ packages/git-service/src/GitContext.ts | 4 + packages/git-service/test/changelists.test.ts | 147 ++++ 34 files changed, 2338 insertions(+), 34 deletions(-) create mode 100644 apps/extension/test/changesChangelists.test.ts create mode 100644 apps/extension/test/changesChangelistsPage.test.ts create mode 100644 packages/git-service/src/Changelists.ts create mode 100644 packages/git-service/test/changelists.test.ts diff --git a/apps/extension/CHANGELOG.md b/apps/extension/CHANGELOG.md index 48676d88..ac5e7a93 100644 --- a/apps/extension/CHANGELOG.md +++ b/apps/extension/CHANGELOG.md @@ -26,6 +26,16 @@ All notable changes to **GitStudio** are documented here. This project adheres t opens on every difference between the two, with its changed files and their diffs; the panel's own ref pickers offer the same choices ([#123](https://github.com/GitStudioHQ/gitstudio/issues/123)). +- **Changelists in the Changes view.** Park files you never want to stage or + commit, such as a local config, in a named changelist: right-click a file + (or a selection, or a folder) and choose **Move to Changelist…**, or drag + files onto a changelist. Each changelist is its own group under Unstaged + (or under Changes with checkboxes). Its files are left out of Stage All, + Check all, Commit all and Discard All, and are staged only when you stage + them yourself. A changelist's menu stages, renames or deletes it; deleting + one puts its files back in Changes and touches no file. Changelists are kept + per repository and per worktree inside `.git`, never in your project + ([#122](https://github.com/GitStudioHQ/gitstudio/issues/122)). ### Changed - **The staging marks in the gutter are dots, not checkboxes.** VS Code lets diff --git a/apps/extension/l10n/bundle.l10n.cs.json b/apps/extension/l10n/bundle.l10n.cs.json index 1c349d94..e1d2147b 100644 --- a/apps/extension/l10n/bundle.l10n.cs.json +++ b/apps/extension/l10n/bundle.l10n.cs.json @@ -69,6 +69,7 @@ "$(check) Committed": "$(check) Commit vytvořen", "$(check) Copied {0}": "$(check) Zkopírováno {0}", "$(check) Created & switched to {0}": "$(check) Vytvořeno a přepnuto na {0}", + "$(check) Deleted changelist “{0}” — its files are back in Changes": "$(check) Seznam změn „{0}“ odstraněn — jeho soubory jsou zpět ve Změnách", "$(check) GitStudio: AI features disabled": "$(check) GitStudio: Funkce AI vypnuty", "$(check) Nothing to push from {0} — up to date": "$(check) Nic k odeslání z {0} — vše aktuální", "$(check) Nothing to push — up to date": "$(check) Nic k odeslání — vše aktuální", @@ -180,6 +181,7 @@ "1 conflicted file": "1 soubor s konfliktem", "1 file": "1 soubor", "1 file has conflicts to resolve.": "1 soubor obsahuje konflikty k vyřešení.", + "1 file in a changelist is left out.": "1 soubor v seznamu změn zůstává stranou.", "1 file selected": "1 vybraný soubor", "1 file still contains": "1 soubor stále obsahuje", "1 incoming commit to pull": "1 příchozí commit ke stažení", @@ -420,6 +422,7 @@ "Changed Files": "Změněné soubory", "Changed files": "Změněné soubory", "Changed on one side, deleted on the other": "Změněno na jedné straně, odstraněno na druhé", + "Changelist name": "Název seznamu změn", "Changes": "Změny", "Changes from cherry-pick {0}": "Změny z cherry-pick {0}", "Changes from worktree {0} ({1}), stashed before removing it": "Změny z pracovního stromu {0} ({1}), uložené do stash před jeho odstraněním", @@ -685,6 +688,7 @@ "Couldn't {0} {1}.": "Nepodařilo se {0} {1}.", "Couldn't {0} {1}: {2}": "Nepodařilo se {0} {1}: {2}", "Couldn't {0}: {1}": "Nepodařilo se {0}: {1}", + "Create": "Vytvořit", "Create Branch": "Vytvořit větev", "Create Branch Here": "Vytvořit větev zde", "Create Branch Here…": "Vytvořit větev zde…", @@ -730,6 +734,7 @@ "Date": "Datum", "DeepSeek-V3 chat & R1 reasoning.": "DeepSeek-V3 chat a R1 reasoning.", "Delete": "Odstranit", + "Delete Changelist": "Odstranit seznam změn", "Delete Remote Branch": "Odstranit vzdálenou větev", "Delete Tag": "Odstranit značku", "Delete branch": "Odstranit větev", @@ -833,6 +838,7 @@ "Drop to apply": "Pustit k použití", "Drop to copy {0}": "Pustit ke kopírování {0}", "Drop to move {0}": "Pustit k přesunu {0}", + "Drop to move {0} to “{1}”": "Pustit k přesunu {0} do „{1}“", "Drop to pop": "Pustit k vyjmutí ze stash", "Drop to stash {0}": "Pustit k uložení {0} do stash", "Drop {0}": "Zahodit {0}", @@ -862,6 +868,7 @@ "Enable LM Studio's local server (Developer ▸ Start Server), then load a model.": "Zapněte místní server LM Studia (Developer ▸ Start Server) a potom načtěte model.", "Encrypted at rest in GitStudio's own store — not your OS keychain, so it never raises a password prompt. The key stays host-side and is never sent to a webview.": "Šifrováno v klidu ve vlastním úložišti GitStudia — ne v klíčence vašeho OS, takže se nikdy nezobrazí výzva k zadání hesla. Klíč zůstává na straně hostitele a nikdy se neodesílá do webview.", "Enter a commit SHA…": "Zadat SHA commitu…", + "Enter a name for the changelist.": "Zadejte název seznamu změn.", "Errored": "Chyba", "Every check on its latest commit": "Každá kontrola na jeho nejnovějším commitu", "Every conflict is resolved, and your stashed changes are in your files. git keeps the stash entry when applying it stops on conflicts, so it is still in your stash list — drop it once you are happy with the result.": "Všechny konflikty jsou vyřešeny a vaše změny ze stash jsou ve vašich souborech. Git ponechá položku stash, když se její použití zastaví na konfliktech, takže je stále v seznamu stashů — zahoďte ji, až budete s výsledkem spokojeni.", @@ -893,6 +900,7 @@ "File too large to show ({0}) at {1}.": "Soubor je příliš velký na zobrazení ({0}) v {1}.", "Files": "Soubory", "Files changed": "Změněné soubory", + "Files in a changelist are left out of Stage All and Commit all until you stage them yourself.": "Soubory v seznamu změn zůstávají mimo Připravit vše a Commitnout vše, dokud je sami nepřipravíte.", "Files resolved": "Vyřešené soubory", "Filter": "Filtr", "Filter branches: {0}": "Filtrovat větve: {0}", @@ -1030,6 +1038,7 @@ "GitStudio: couldn't prepare the push — {0}": "GitStudio: nepodařilo se připravit push — {0}", "GitStudio: couldn't prune — {0}": "GitStudio: nepodařilo se vyčistit (prune) — {0}", "GitStudio: couldn't reset {0} to {1}{2}": "GitStudio: nepodařilo se resetovat {0} na {1}{2}", + "GitStudio: couldn't save the changelists — {0}": "GitStudio: seznamy změn se nepodařilo uložit — {0}", "GitStudio: couldn't stage that change — {0}": "GitStudio: nepodařilo se přidat tuto změnu do stage — {0}", "GitStudio: couldn't stage the changes — {0}": "GitStudio: nepodařilo se přidat změny do stage — {0}", "GitStudio: couldn't stash your changes, so nothing ran — {0}": "GitStudio: nepodařilo se uložit vaše změny do stash, takže se nic neprovedlo — {0}", @@ -1048,6 +1057,8 @@ "GitStudio: no worktree this can be done to.": "GitStudio: není žádný pracovní strom, na kterém by to šlo provést.", "GitStudio: nothing staged, or AI is unavailable.": "GitStudio: nic ve stage, nebo AI není dostupná.", "GitStudio: nothing stashed — every file was unticked.": "GitStudio: nic nebylo uloženo do stash — u všech souborů bylo zrušeno zaškrtnutí.", + "GitStudio: nothing to commit. The only changed file is in a changelist — stage it first to commit it.": "GitStudio: není co commitnout. Jediný změněný soubor je v seznamu změn — nejprve ho připravte, abyste ho mohli commitnout.", + "GitStudio: nothing to commit. The only changed files are in changelists — stage the ones to commit first.": "GitStudio: není co commitnout. Jediné změněné soubory jsou v seznamech změn — nejprve připravte ty, které chcete commitnout.", "GitStudio: nothing to draft (stage changes first), or AI is unavailable.": "GitStudio: nic k návrhu (nejdřív přidejte změny do stage), nebo AI není dostupná.", "GitStudio: nothing to stash — the working tree is clean.": "GitStudio: nic k uložení do stash — pracovní strom je čistý.", "GitStudio: open a file in a Git repository to stage lines.": "GitStudio: otevřete soubor v repozitáři gitu, abyste mohli přidávat řádky do stage.", @@ -1327,10 +1338,14 @@ "Move the selected commits down (Alt+Down)": "Přesunout vybrané commity dolů (Alt+Down)", "Move the selected commits up": "Přesunout vybrané commity nahoru", "Move the selected commits up (Alt+Up)": "Přesunout vybrané commity nahoru (Alt+Up)", + "Move to Changelist…": "Přesunout do seznamu změn…", "Move to Changes": "Přesunout do Změn", "Move up": "Přesunout nahoru", "Move up (Alt+Up)": "Přesunout nahoru (Alt+Up)", + "Move {0} Files to Changelist": "Přesunout {0} souborů do seznamu změn", "Move {0} out of “{1}”": "Přesunout {0} z „{1}“", + "Move {0} to Changelist": "Přesunout {0} do seznamu změn", + "Move {0} to Changelist…": "Přesunout {0} do seznamu změn…", "Move {0} to Changes": "Přesunout {0} do Změn", "Move: take {0} out of the stash, back {1}": "Přesun: vyjmout {0} ze stashe, zpět do {1}", "Moved {0} to Changes": "Přesunuto {0} do Změn", @@ -1349,6 +1364,10 @@ "New Branch from '": "Nová větev z '", "New Branch from These Commits": "Nová větev z těchto commitů", "New Branch…": "Nová větev…", + "New Changelist": "Nový seznam změn", + "New Changelist for {0}": "Nový seznam změn pro {0}", + "New Changelist for {0} Files": "Nový seznam změn pro {0} souborů", + "New Changelist…": "Nový seznam změn…", "New Worktree from '": "Nový pracovní strom z '", "New Worktree…": "Nový pracovní strom…", "New branch": "Nová větev", @@ -1791,6 +1810,8 @@ "Removes git's record of the worktree; the folder stays.": "Odstraní git záznam o pracovním stromu; složka zůstane.", "Removing…": "Odebírání…", "Rename": "Přejmenovat", + "Rename Changelist “{0}”": "Přejmenovat seznam změn „{0}“", + "Rename Changelist…": "Přejmenovat seznam změn…", "Rename branch": "Přejmenovat větev", "Rename branch {0}": "Přejmenovat větev {0}", "Rename it, then check it out.": "Přejmenujte ji a pak na ni přepněte.", @@ -2054,6 +2075,7 @@ "Stage": "Připravit", "Stage All": "Připravit vše", "Stage All Changes": "Připravit všechny změny", + "Stage All in This Changelist": "Připravit vše v tomto seznamu změn", "Stage Changes with Ticks": "Připravit změny podle zaškrtnutí", "Stage Folder": "Připravit složku", "Stage all": "Připravit vše", @@ -2088,6 +2110,7 @@ "Stash 1 selected file…": "Uložit do stash 1 vybraný soubor…", "Stash All Changes": "Uložit všechny změny do stash", "Stash Everything Staged": "Uložit do stash vše připravené", + "Stash These Files": "Uložit tyto soubory do stash", "Stash This File": "Uložit tento soubor do stash", "Stash This Folder": "Uložit tuto složku do stash", "Stash all changes…": "Uložit všechny změny do stash…", @@ -2157,6 +2180,7 @@ "That isn't a stash this app recorded.": "To není stash, který zaznamenala tato aplikace.", "That isn't a usable file path.": "To není použitelná cesta k souboru.", "That isn't a {0} this app made.": "To není {0}, který provedla tato aplikace.", + "That name is too long. Keep it under 80 characters.": "Název je příliš dlouhý. Použijte méně než 80 znaků.", "That path escapes the repository — nothing was changed.": "Tato cesta vede mimo repozitář — nic se nezměnilo.", "That puts back only what it changed, and only where nothing has moved since.": "To vrátí zpět jen to, co to změnilo, a jen tam, kde se od té doby nic nepřesunulo.", "That stash is no longer in the list, so nothing was changed.": "Tento stash už není v seznamu, takže se nic nezměnilo.", @@ -2202,6 +2226,7 @@ "The conflicted files are back to their last committed versions.": "Konfliktní soubory se vrátily do svých posledních commitnutých verzí.", "The conflicts list: every conflicted file of this {0}, and {1}{2}": "Seznam konfliktů: každý konfliktní soubor tohoto {0}, a {1}{2}", "The current commit": "Aktuální commit", + "The default changelist": "Výchozí seznam změn", "The dropped commit is back": "Zahozený commit je zpět", "The file goes back to its committed version. {0}": "Soubor se vrátí do své commitnuté verze. {0}", "The file is deleted. Git has never tracked it, so nothing — not even Undo — can bring it back.": "Soubor je smazán. Git ho nikdy nesledoval, takže ho nic — ani Zpět — nemůže vrátit.", @@ -2276,6 +2301,7 @@ "Their changes return to the Staged group, ready to re-commit.": "Jejich změny se vrátí do skupiny Připravené, připravené k opětovnému commitnutí.", "Theirs": "Jejich", "There are unresolved conflicts — resolve them or cancel first.": "Jsou tu nevyřešené konflikty — nejprve je vyřešte, nebo akci zrušte.", + "There is already a group called “{0}”. Choose another name.": "Skupina s názvem „{0}“ už existuje. Zvolte jiný název.", "There is no '{0}' to reset to — it is not on {1} any more.": "Není tu žádné „{0}“, na které by bylo možné resetovat — už není na {1}.", "There is no '{0}' to reset to, and {1} couldn't be reached to fetch it.": "Není tu žádné „{0}“, na které by bylo možné resetovat, a {1} nebylo dostupné pro jeho stažení.", "There is no Apply to undo here any more.": "Tady už není žádné Použít, které by bylo možné vrátit zpět.", @@ -3058,6 +3084,7 @@ "{0} files ({1}{2}) are": "{0} souborů ({1}{2}) je", "{0} files are left unmerged in it, which git can't stash.": "{0} souborů v něm zůstává nesloučených, což git nemůže stashnout.", "{0} files have conflicts to resolve.": "{0} souborů má konflikty k vyřešení.", + "{0} files in changelists are left out.": "Souborů v seznamech změn, které zůstávají stranou: {0}.", "{0} files selected": "{0} vybraných souborů", "{0} files still contain": "{0} souborů stále obsahuje", "{0} files still have": "{0} souborů stále má", @@ -3227,6 +3254,7 @@ "{0} {1}, {2} to decide": "{0} {1}, {2} k rozhodnutí", "{0} {1}.": "{0} {1}.", "{0} · {1} can be merged automatically": "{0} · {1} lze sloučit automaticky", + "{0} — a changelist: its files stay out of Stage All and Commit all until you stage them. Click to collapse, Ctrl/Cmd-click to select its files, right-click for its actions.": "{0} — seznam změn: jeho soubory zůstávají mimo Připravit vše a Commitnout vše, dokud je nepřipravíte. Klikněte pro sbalení, Ctrl/Cmd-klik pro výběr jeho souborů, pravé tlačítko pro jeho akce.", "{0} — click to collapse, ": "{0} — klikněte pro sbalení, ", "{0} — continue or abort it first.": "{0} — nejdřív to dokončete nebo zrušte.", "{0} — done.": "{0} — hotovo.", @@ -3241,6 +3269,7 @@ "{0}+Enter creates it": "{0}+Enter to vytvoří", "{0}, and PR #{1}'s last commit couldn't be fetched: {2}": "{0}, a poslední commit PR #{1} se nepodařilo stáhnout: {2}", "{0}, but {1} isn't: {2}": "{0}, ale {1} není: {2}", + "{0}, changelist, {1}": "{0}, seznam změn, {1}", "{0}, plus the commits of {1} already rebased onto it": "{0}, plus commity {1} už přerebasované na to", "{0}, so it was checked out as {1} at its last commit — a push from there can't reach the pull request. {2}": "{0}, takže to bylo checkoutnuté jako {1} na jeho posledním commitu — push odtamtud se nemůže dostat k pull requestu. {2}", "{0}, then create a branch to push them.": "{0}, pak vytvořte větev, abyste je mohli odeslat.", diff --git a/apps/extension/l10n/bundle.l10n.de.json b/apps/extension/l10n/bundle.l10n.de.json index ef55e0e3..fbf9e181 100644 --- a/apps/extension/l10n/bundle.l10n.de.json +++ b/apps/extension/l10n/bundle.l10n.de.json @@ -69,6 +69,7 @@ "$(check) Committed": "$(check) Committet", "$(check) Copied {0}": "$(check) {0} kopiert", "$(check) Created & switched to {0}": "$(check) Erstellt und zu {0} gewechselt", + "$(check) Deleted changelist “{0}” — its files are back in Changes": "$(check) Änderungsliste „{0}“ gelöscht – ihre Dateien sind wieder in Changes", "$(check) GitStudio: AI features disabled": "$(check) GitStudio: KI-Funktionen deaktiviert", "$(check) Nothing to push from {0} — up to date": "$(check) Nichts zu pushen von {0} — aktuell", "$(check) Nothing to push — up to date": "$(check) Nichts zu pushen — aktuell", @@ -180,6 +181,7 @@ "1 conflicted file": "1 Datei mit Konflikten", "1 file": "1 Datei", "1 file has conflicts to resolve.": "1 Datei hat zu lösende Konflikte.", + "1 file in a changelist is left out.": "1 Datei in einer Änderungsliste bleibt außen vor.", "1 file selected": "1 Datei ausgewählt", "1 file still contains": "1 Datei enthält noch", "1 incoming commit to pull": "1 eingehender Commit zu pullen", @@ -420,6 +422,7 @@ "Changed Files": "Geänderte Dateien", "Changed files": "Geänderte Dateien", "Changed on one side, deleted on the other": "Auf einer Seite geändert, auf der anderen gelöscht", + "Changelist name": "Name der Änderungsliste", "Changes": "Changes", "Changes from cherry-pick {0}": "Änderungen aus Cherry-Pick {0}", "Changes from worktree {0} ({1}), stashed before removing it": "Änderungen aus Worktree {0} ({1}), vor dem Entfernen gestasht", @@ -685,6 +688,7 @@ "Couldn't {0} {1}.": "{0} {1} konnte nicht durchgeführt werden.", "Couldn't {0} {1}: {2}": "{0} {1} konnte nicht durchgeführt werden: {2}", "Couldn't {0}: {1}": "{0} konnte nicht durchgeführt werden: {1}", + "Create": "Erstellen", "Create Branch": "Branch erstellen", "Create Branch Here": "Branch hier erstellen", "Create Branch Here…": "Branch hier erstellen…", @@ -730,6 +734,7 @@ "Date": "Datum", "DeepSeek-V3 chat & R1 reasoning.": "DeepSeek-V3-Chat & R1-Reasoning.", "Delete": "Löschen", + "Delete Changelist": "Änderungsliste löschen", "Delete Remote Branch": "Remote-Branch löschen", "Delete Tag": "Tag löschen", "Delete branch": "Branch löschen", @@ -833,6 +838,7 @@ "Drop to apply": "Zum Anwenden ablegen", "Drop to copy {0}": "Zum Kopieren von {0} ablegen", "Drop to move {0}": "Zum Verschieben von {0} ablegen", + "Drop to move {0} to “{1}”": "Zum Verschieben von {0} nach „{1}“ ablegen", "Drop to pop": "Zum Pop ablegen", "Drop to stash {0}": "Zum Stashen von {0} ablegen", "Drop {0}": "{0} verwerfen", @@ -862,6 +868,7 @@ "Enable LM Studio's local server (Developer ▸ Start Server), then load a model.": "Den lokalen Server von LM Studio aktivieren (Developer ▸ Start Server), dann ein Modell laden.", "Encrypted at rest in GitStudio's own store — not your OS keychain, so it never raises a password prompt. The key stays host-side and is never sent to a webview.": "Verschlüsselt im eigenen Speicher von GitStudio gespeichert — nicht im Schlüsselbund des Betriebssystems, daher erscheint nie eine Passwortabfrage. Der Schlüssel bleibt hostseitig und wird nie an eine Webview gesendet.", "Enter a commit SHA…": "Commit-SHA eingeben…", + "Enter a name for the changelist.": "Geben Sie einen Namen für die Änderungsliste ein.", "Errored": "Fehlgeschlagen", "Every check on its latest commit": "Jede Prüfung auf dessen letztem Commit", "Every conflict is resolved, and your stashed changes are in your files. git keeps the stash entry when applying it stops on conflicts, so it is still in your stash list — drop it once you are happy with the result.": "Jeder Konflikt ist gelöst, und Ihre gestashten Änderungen sind in Ihren Dateien. git behält den Stash-Eintrag, wenn das Anwenden bei Konflikten stoppt, daher ist er noch in Ihrer Stash-Liste — ihn verwerfen, sobald Sie mit dem Ergebnis zufrieden sind.", @@ -893,6 +900,7 @@ "File too large to show ({0}) at {1}.": "Datei zu groß zum Anzeigen ({0}) bei {1}.", "Files": "Dateien", "Files changed": "Geänderte Dateien", + "Files in a changelist are left out of Stage All and Commit all until you stage them yourself.": "Dateien in einer Änderungsliste bleiben bei „Alle bereitstellen“ und „Alle committen“ außen vor, bis Sie sie selbst bereitstellen.", "Files resolved": "Dateien gelöst", "Filter": "Filter", "Filter branches: {0}": "Branches filtern: {0}", @@ -1030,6 +1038,7 @@ "GitStudio: couldn't prepare the push — {0}": "GitStudio: Der Push konnte nicht vorbereitet werden — {0}", "GitStudio: couldn't prune — {0}": "GitStudio: Bereinigen fehlgeschlagen — {0}", "GitStudio: couldn't reset {0} to {1}{2}": "GitStudio: {0} konnte nicht auf {1} zurückgesetzt werden{2}", + "GitStudio: couldn't save the changelists — {0}": "GitStudio: Die Änderungslisten konnten nicht gespeichert werden – {0}", "GitStudio: couldn't stage that change — {0}": "GitStudio: Diese Änderung konnte nicht bereitgestellt werden — {0}", "GitStudio: couldn't stage the changes — {0}": "GitStudio: Die Änderungen konnten nicht bereitgestellt werden — {0}", "GitStudio: couldn't stash your changes, so nothing ran — {0}": "GitStudio: Ihre Änderungen konnten nicht gestasht werden, daher wurde nichts ausgeführt — {0}", @@ -1048,6 +1057,8 @@ "GitStudio: no worktree this can be done to.": "GitStudio: Kein Worktree, auf den das angewendet werden kann.", "GitStudio: nothing staged, or AI is unavailable.": "GitStudio: Nichts bereitgestellt, oder KI ist nicht verfügbar.", "GitStudio: nothing stashed — every file was unticked.": "GitStudio: Nichts gestasht — alle Dateien waren abgewählt.", + "GitStudio: nothing to commit. The only changed file is in a changelist — stage it first to commit it.": "GitStudio: Nichts zu committen. Die einzige geänderte Datei ist in einer Änderungsliste – stellen Sie sie zuerst bereit, um sie zu committen.", + "GitStudio: nothing to commit. The only changed files are in changelists — stage the ones to commit first.": "GitStudio: Nichts zu committen. Die einzigen geänderten Dateien sind in Änderungslisten – stellen Sie zuerst die bereit, die committet werden sollen.", "GitStudio: nothing to draft (stage changes first), or AI is unavailable.": "GitStudio: Nichts zu entwerfen (zuerst Änderungen bereitstellen), oder KI ist nicht verfügbar.", "GitStudio: nothing to stash — the working tree is clean.": "GitStudio: Nichts zu stashen — das Arbeitsverzeichnis ist unverändert.", "GitStudio: open a file in a Git repository to stage lines.": "GitStudio: Eine Datei in einem Git-Repository öffnen, um Zeilen bereitzustellen.", @@ -1327,10 +1338,14 @@ "Move the selected commits down (Alt+Down)": "Ausgewählte Commits nach unten verschieben (Alt+Unten)", "Move the selected commits up": "Ausgewählte Commits nach oben verschieben", "Move the selected commits up (Alt+Up)": "Ausgewählte Commits nach oben verschieben (Alt+Oben)", + "Move to Changelist…": "In Änderungsliste verschieben…", "Move to Changes": "Zu „Changes“ verschieben", "Move up": "Nach oben verschieben", "Move up (Alt+Up)": "Nach oben verschieben (Alt+Oben)", + "Move {0} Files to Changelist": "{0} Dateien in Änderungsliste verschieben", "Move {0} out of “{1}”": "{0} aus „{1}“ herausnehmen", + "Move {0} to Changelist": "{0} in Änderungsliste verschieben", + "Move {0} to Changelist…": "{0} in Änderungsliste verschieben…", "Move {0} to Changes": "{0} zu „Changes“ verschieben", "Move: take {0} out of the stash, back {1}": "Verschieben: {0} aus dem Stash nehmen, zurück {1}", "Moved {0} to Changes": "{0} zu „Changes“ verschoben", @@ -1349,6 +1364,10 @@ "New Branch from '": "Neuer Branch von '", "New Branch from These Commits": "Neuer Branch aus diesen Commits", "New Branch…": "Neuer Branch…", + "New Changelist": "Neue Änderungsliste", + "New Changelist for {0}": "Neue Änderungsliste für {0}", + "New Changelist for {0} Files": "Neue Änderungsliste für {0} Dateien", + "New Changelist…": "Neue Änderungsliste…", "New Worktree from '": "Neuer Worktree von '", "New Worktree…": "Neuer Worktree…", "New branch": "Neuer Branch", @@ -1791,6 +1810,8 @@ "Removes git's record of the worktree; the folder stays.": "Entfernt Gits Eintrag für den Worktree; der Ordner bleibt.", "Removing…": "Wird entfernt…", "Rename": "Umbenennen", + "Rename Changelist “{0}”": "Änderungsliste „{0}“ umbenennen", + "Rename Changelist…": "Änderungsliste umbenennen…", "Rename branch": "Branch umbenennen", "Rename branch {0}": "Branch {0} umbenennen", "Rename it, then check it out.": "Umbenennen, dann auschecken.", @@ -2054,6 +2075,7 @@ "Stage": "Bereitstellen", "Stage All": "Alle bereitstellen", "Stage All Changes": "Alle Änderungen bereitstellen", + "Stage All in This Changelist": "Alle in dieser Änderungsliste bereitstellen", "Stage Changes with Ticks": "Änderungen mit Haken bereitstellen", "Stage Folder": "Ordner bereitstellen", "Stage all": "Alle bereitstellen", @@ -2088,6 +2110,7 @@ "Stash 1 selected file…": "1 ausgewählte Datei stashen…", "Stash All Changes": "Alle Änderungen stashen", "Stash Everything Staged": "Alles Bereitgestellte stashen", + "Stash These Files": "Diese Dateien stashen", "Stash This File": "Diese Datei stashen", "Stash This Folder": "Diesen Ordner stashen", "Stash all changes…": "Alle Änderungen stashen…", @@ -2157,6 +2180,7 @@ "That isn't a stash this app recorded.": "Das ist kein Stash, den diese App aufgezeichnet hat.", "That isn't a usable file path.": "Das ist kein verwendbarer Dateipfad.", "That isn't a {0} this app made.": "Das ist kein {0}, das diese App vorgenommen hat.", + "That name is too long. Keep it under 80 characters.": "Der Name ist zu lang. Bleiben Sie unter 80 Zeichen.", "That path escapes the repository — nothing was changed.": "Dieser Pfad verlässt das Repository — nichts wurde geändert.", "That puts back only what it changed, and only where nothing has moved since.": "Das stellt nur wieder her, was geändert wurde, und nur dort, wo sich seitdem nichts verschoben hat.", "That stash is no longer in the list, so nothing was changed.": "Dieser Stash ist nicht mehr in der Liste, daher wurde nichts geändert.", @@ -2202,6 +2226,7 @@ "The conflicted files are back to their last committed versions.": "Die konfliktbehafteten Dateien gehen zurück auf ihre letzten committeten Versionen.", "The conflicts list: every conflicted file of this {0}, and {1}{2}": "Die Konfliktliste: jede konfliktbehaftete Datei dieses {0}, und {1}{2}", "The current commit": "Der aktuelle Commit", + "The default changelist": "Die Standard-Änderungsliste", "The dropped commit is back": "Der verworfene Commit ist zurück", "The file goes back to its committed version. {0}": "Die Datei geht zurück auf ihre committete Version. {0}", "The file is deleted. Git has never tracked it, so nothing — not even Undo — can bring it back.": "Die Datei wird gelöscht. Git hat sie nie verfolgt, daher kann nichts — auch nicht Rückgängig — sie zurückbringen.", @@ -2276,6 +2301,7 @@ "Their changes return to the Staged group, ready to re-commit.": "Deren Änderungen kehren zur Gruppe Bereitgestellt zurück, bereit zum erneuten Committen.", "Theirs": "Deren Version", "There are unresolved conflicts — resolve them or cancel first.": "Es gibt ungelöste Konflikte — sie zuerst auflösen oder abbrechen.", + "There is already a group called “{0}”. Choose another name.": "Es gibt bereits eine Gruppe namens „{0}“. Wählen Sie einen anderen Namen.", "There is no '{0}' to reset to — it is not on {1} any more.": "Es gibt kein „{0}“, auf das zurückgesetzt werden kann — es ist nicht mehr auf {1}.", "There is no '{0}' to reset to, and {1} couldn't be reached to fetch it.": "Es gibt kein „{0}“, auf das zurückgesetzt werden kann, und {1} konnte nicht erreicht werden, um es abzurufen.", "There is no Apply to undo here any more.": "Es gibt hier kein Apply mehr, das rückgängig gemacht werden könnte.", @@ -3058,6 +3084,7 @@ "{0} files ({1}{2}) are": "{0} Dateien ({1}{2}) sind", "{0} files are left unmerged in it, which git can't stash.": "{0} Dateien bleiben darin unverschmolzen, die Git nicht stashen kann.", "{0} files have conflicts to resolve.": "{0} Dateien haben zu lösende Konflikte.", + "{0} files in changelists are left out.": "{0} Dateien in Änderungslisten bleiben außen vor.", "{0} files selected": "{0} Dateien ausgewählt", "{0} files still contain": "{0} Dateien enthalten noch", "{0} files still have": "{0} Dateien haben noch", @@ -3227,6 +3254,7 @@ "{0} {1}, {2} to decide": "{0} {1}, {2} noch zu entscheiden", "{0} {1}.": "{0} {1}.", "{0} · {1} can be merged automatically": "{0} · {1} kann automatisch gemergt werden", + "{0} — a changelist: its files stay out of Stage All and Commit all until you stage them. Click to collapse, Ctrl/Cmd-click to select its files, right-click for its actions.": "{0} – eine Änderungsliste: ihre Dateien bleiben bei „Alle bereitstellen“ und „Alle committen“ außen vor, bis Sie sie bereitstellen. Klicken zum Einklappen, Strg/Cmd-Klick zum Auswählen ihrer Dateien, Rechtsklick für ihre Aktionen.", "{0} — click to collapse, ": "{0} — klicken, um einzuklappen, ", "{0} — continue or abort it first.": "{0} — zuerst fortsetzen oder abbrechen.", "{0} — done.": "{0} — erledigt.", @@ -3241,6 +3269,7 @@ "{0}+Enter creates it": "{0}+Enter erstellt es", "{0}, and PR #{1}'s last commit couldn't be fetched: {2}": "{0}, und der letzte Commit von PR #{1} konnte nicht abgerufen werden: {2}", "{0}, but {1} isn't: {2}": "{0}, aber {1} nicht: {2}", + "{0}, changelist, {1}": "{0}, Änderungsliste, {1}", "{0}, plus the commits of {1} already rebased onto it": "{0}, plus die Commits von {1}, die bereits darauf rebasiert wurden", "{0}, so it was checked out as {1} at its last commit — a push from there can't reach the pull request. {2}": "{0}, daher wurde es als {1} bei seinem letzten Commit ausgecheckt — ein Push von dort kann den Pull Request nicht erreichen. {2}", "{0}, then create a branch to push them.": "{0}, dann einen Branch erstellen, um sie zu pushen.", diff --git a/apps/extension/l10n/bundle.l10n.es.json b/apps/extension/l10n/bundle.l10n.es.json index e12be935..d1005090 100644 --- a/apps/extension/l10n/bundle.l10n.es.json +++ b/apps/extension/l10n/bundle.l10n.es.json @@ -69,6 +69,7 @@ "$(check) Committed": "$(check) Confirmado", "$(check) Copied {0}": "$(check) {0} copiado", "$(check) Created & switched to {0}": "$(check) Creada y cambiada a {0}", + "$(check) Deleted changelist “{0}” — its files are back in Changes": "$(check) Lista de cambios «{0}» eliminada: sus archivos vuelven a Cambios", "$(check) GitStudio: AI features disabled": "$(check) GitStudio: funciones de IA deshabilitadas", "$(check) Nothing to push from {0} — up to date": "$(check) Nada para publicar desde {0} — ya está al día", "$(check) Nothing to push — up to date": "$(check) Nada para publicar — ya está al día", @@ -180,6 +181,7 @@ "1 conflicted file": "1 archivo con conflictos", "1 file": "1 archivo", "1 file has conflicts to resolve.": "1 archivo tiene conflictos por resolver.", + "1 file in a changelist is left out.": "Se deja fuera 1 archivo de una lista de cambios.", "1 file selected": "1 archivo seleccionado", "1 file still contains": "1 archivo todavía contiene", "1 incoming commit to pull": "1 commit entrante por incorporar", @@ -420,6 +422,7 @@ "Changed Files": "Archivos cambiados", "Changed files": "Archivos cambiados", "Changed on one side, deleted on the other": "Cambiado en un lado, eliminado en el otro", + "Changelist name": "Nombre de la lista de cambios", "Changes": "Cambios", "Changes from cherry-pick {0}": "Cambios del cherry-pick {0}", "Changes from worktree {0} ({1}), stashed before removing it": "Cambios del worktree {0} ({1}), guardados en el stash antes de eliminarlo", @@ -685,6 +688,7 @@ "Couldn't {0} {1}.": "No se pudo {0} {1}.", "Couldn't {0} {1}: {2}": "No se pudo {0} {1}: {2}", "Couldn't {0}: {1}": "No se pudo {0}: {1}", + "Create": "Crear", "Create Branch": "Crear rama", "Create Branch Here": "Crear rama aquí", "Create Branch Here…": "Crear rama aquí…", @@ -730,6 +734,7 @@ "Date": "Fecha", "DeepSeek-V3 chat & R1 reasoning.": "Chat de DeepSeek-V3 y razonamiento R1.", "Delete": "Eliminar", + "Delete Changelist": "Eliminar lista de cambios", "Delete Remote Branch": "Eliminar rama remota", "Delete Tag": "Eliminar etiqueta", "Delete branch": "Eliminar rama", @@ -833,6 +838,7 @@ "Drop to apply": "Soltar para aplicar", "Drop to copy {0}": "Soltar para copiar {0}", "Drop to move {0}": "Soltar para mover {0}", + "Drop to move {0} to “{1}”": "Soltar para mover {0} a «{1}»", "Drop to pop": "Soltar para recuperar", "Drop to stash {0}": "Soltar para guardar en el stash {0}", "Drop {0}": "Descartar {0}", @@ -862,6 +868,7 @@ "Enable LM Studio's local server (Developer ▸ Start Server), then load a model.": "Habilita el servidor local de LM Studio (Developer ▸ Start Server), y luego carga un modelo.", "Encrypted at rest in GitStudio's own store — not your OS keychain, so it never raises a password prompt. The key stays host-side and is never sent to a webview.": "Cifrado en reposo en el propio almacén de GitStudio — no en el llavero de tu sistema operativo, así que nunca muestra un aviso de contraseña. La clave permanece en el host y nunca se envía a una vista web.", "Enter a commit SHA…": "Introducir el SHA de un commit…", + "Enter a name for the changelist.": "Escribe un nombre para la lista de cambios.", "Errored": "Con error", "Every check on its latest commit": "Cada check en su commit más reciente", "Every conflict is resolved, and your stashed changes are in your files. git keeps the stash entry when applying it stops on conflicts, so it is still in your stash list — drop it once you are happy with the result.": "Todos los conflictos están resueltos, y tus cambios guardados en el stash están en tus archivos. git conserva la entrada del stash cuando al aplicarla se detiene por conflictos, así que sigue en tu lista de stashes — descártala cuando estés conforme con el resultado.", @@ -893,6 +900,7 @@ "File too large to show ({0}) at {1}.": "Archivo demasiado grande para mostrar ({0}) en {1}.", "Files": "Archivos", "Files changed": "Archivos cambiados", + "Files in a changelist are left out of Stage All and Commit all until you stage them yourself.": "Los archivos de una lista de cambios quedan fuera de Preparar todo y Confirmar todo hasta que los prepares tú.", "Files resolved": "Archivos resueltos", "Filter": "Filtro", "Filter branches: {0}": "Filtrar ramas: {0}", @@ -1030,6 +1038,7 @@ "GitStudio: couldn't prepare the push — {0}": "GitStudio: no se pudo preparar el push — {0}", "GitStudio: couldn't prune — {0}": "GitStudio: no se pudo ejecutar prune — {0}", "GitStudio: couldn't reset {0} to {1}{2}": "GitStudio: no se pudo restablecer {0} a {1}{2}", + "GitStudio: couldn't save the changelists — {0}": "GitStudio: no se pudieron guardar las listas de cambios: {0}", "GitStudio: couldn't stage that change — {0}": "GitStudio: no se pudo preparar ese cambio — {0}", "GitStudio: couldn't stage the changes — {0}": "GitStudio: no se pudieron preparar los cambios — {0}", "GitStudio: couldn't stash your changes, so nothing ran — {0}": "GitStudio: no se pudieron guardar tus cambios en el stash, así que no se ejecutó nada — {0}", @@ -1048,6 +1057,8 @@ "GitStudio: no worktree this can be done to.": "GitStudio: no hay worktree sobre el que hacer esto.", "GitStudio: nothing staged, or AI is unavailable.": "GitStudio: nada preparado, o la IA no está disponible.", "GitStudio: nothing stashed — every file was unticked.": "GitStudio: no se guardó nada en el stash — se desmarcaron todos los archivos.", + "GitStudio: nothing to commit. The only changed file is in a changelist — stage it first to commit it.": "GitStudio: no hay nada que confirmar. El único archivo cambiado está en una lista de cambios; prepáralo primero para confirmarlo.", + "GitStudio: nothing to commit. The only changed files are in changelists — stage the ones to commit first.": "GitStudio: no hay nada que confirmar. Los únicos archivos cambiados están en listas de cambios; prepara primero los que quieras confirmar.", "GitStudio: nothing to draft (stage changes first), or AI is unavailable.": "GitStudio: nada que redactar (prepara cambios primero), o la IA no está disponible.", "GitStudio: nothing to stash — the working tree is clean.": "GitStudio: nada que guardar en el stash — el árbol de trabajo está limpio.", "GitStudio: open a file in a Git repository to stage lines.": "GitStudio: abre un archivo en un repositorio Git para preparar líneas.", @@ -1327,10 +1338,14 @@ "Move the selected commits down (Alt+Down)": "Mover hacia abajo los commits seleccionados (Alt+Abajo)", "Move the selected commits up": "Mover hacia arriba los commits seleccionados", "Move the selected commits up (Alt+Up)": "Mover hacia arriba los commits seleccionados (Alt+Arriba)", + "Move to Changelist…": "Mover a lista de cambios…", "Move to Changes": "Mover a Cambios", "Move up": "Mover hacia arriba", "Move up (Alt+Up)": "Mover hacia arriba (Alt+Arriba)", + "Move {0} Files to Changelist": "Mover {0} archivos a lista de cambios", "Move {0} out of “{1}”": "Sacar {0} de “{1}”", + "Move {0} to Changelist": "Mover {0} a lista de cambios", + "Move {0} to Changelist…": "Mover {0} a lista de cambios…", "Move {0} to Changes": "Mover {0} a Cambios", "Move: take {0} out of the stash, back {1}": "Mover: saca {0} del stash y lo devuelve {1}", "Moved {0} to Changes": "Se movió {0} a Cambios", @@ -1349,6 +1364,10 @@ "New Branch from '": "Nueva rama desde '", "New Branch from These Commits": "Nueva rama a partir de estos commits", "New Branch…": "Nueva rama…", + "New Changelist": "Nueva lista de cambios", + "New Changelist for {0}": "Nueva lista de cambios para {0}", + "New Changelist for {0} Files": "Nueva lista de cambios para {0} archivos", + "New Changelist…": "Nueva lista de cambios…", "New Worktree from '": "Nuevo worktree desde '", "New Worktree…": "Nuevo worktree…", "New branch": "Nueva rama", @@ -1791,6 +1810,8 @@ "Removes git's record of the worktree; the folder stays.": "Elimina el registro que git tiene del worktree; la carpeta permanece.", "Removing…": "Eliminando…", "Rename": "Renombrar", + "Rename Changelist “{0}”": "Renombrar la lista de cambios «{0}»", + "Rename Changelist…": "Renombrar lista de cambios…", "Rename branch": "Renombrar rama", "Rename branch {0}": "Renombrar la rama {0}", "Rename it, then check it out.": "Renómbrala y luego cámbiate a ella.", @@ -2054,6 +2075,7 @@ "Stage": "Preparar", "Stage All": "Preparar todo", "Stage All Changes": "Preparar todos los cambios", + "Stage All in This Changelist": "Preparar todo en esta lista de cambios", "Stage Changes with Ticks": "Preparar cambios con marcas", "Stage Folder": "Preparar carpeta", "Stage all": "Preparar todo", @@ -2088,6 +2110,7 @@ "Stash 1 selected file…": "Guardar en el stash 1 archivo seleccionado…", "Stash All Changes": "Guardar todos los cambios en el stash", "Stash Everything Staged": "Guardar todo lo preparado en el stash", + "Stash These Files": "Guardar estos archivos en el stash", "Stash This File": "Guardar este archivo en el stash", "Stash This Folder": "Guardar esta carpeta en el stash", "Stash all changes…": "Guardar todos los cambios en el stash…", @@ -2157,6 +2180,7 @@ "That isn't a stash this app recorded.": "Ese no es un stash que haya registrado esta app.", "That isn't a usable file path.": "Esa no es una ruta de archivo utilizable.", "That isn't a {0} this app made.": "Ese no es un {0} que haya hecho esta app.", + "That name is too long. Keep it under 80 characters.": "Ese nombre es demasiado largo. Usa menos de 80 caracteres.", "That path escapes the repository — nothing was changed.": "Esa ruta se sale del repositorio — no se cambió nada.", "That puts back only what it changed, and only where nothing has moved since.": "Eso solo devuelve lo que cambió, y solo donde nada se ha movido desde entonces.", "That stash is no longer in the list, so nothing was changed.": "Ese stash ya no está en la lista, así que no se cambió nada.", @@ -2202,6 +2226,7 @@ "The conflicted files are back to their last committed versions.": "Los archivos en conflicto vuelven a sus últimas versiones confirmadas.", "The conflicts list: every conflicted file of this {0}, and {1}{2}": "La lista de conflictos: cada archivo en conflicto de este {0}, y {1}{2}", "The current commit": "El commit actual", + "The default changelist": "La lista de cambios predeterminada", "The dropped commit is back": "El commit descartado volvió", "The file goes back to its committed version. {0}": "El archivo vuelve a su versión confirmada. {0}", "The file is deleted. Git has never tracked it, so nothing — not even Undo — can bring it back.": "El archivo se elimina. Git nunca lo ha rastreado, así que nada — ni siquiera Deshacer — puede recuperarlo.", @@ -2276,6 +2301,7 @@ "Their changes return to the Staged group, ready to re-commit.": "Sus cambios vuelven al grupo Preparados, listos para volver a confirmar.", "Theirs": "Suyos", "There are unresolved conflicts — resolve them or cancel first.": "Hay conflictos sin resolver — resuélvelos o cancela primero.", + "There is already a group called “{0}”. Choose another name.": "Ya hay un grupo llamado «{0}». Elige otro nombre.", "There is no '{0}' to reset to — it is not on {1} any more.": "No hay '{0}' al que restablecer — ya no está en {1}.", "There is no '{0}' to reset to, and {1} couldn't be reached to fetch it.": "No hay '{0}' al que restablecer, y no se pudo contactar con {1} para obtenerlo.", "There is no Apply to undo here any more.": "Ya no hay ningún Aplicar que deshacer aquí.", @@ -3058,6 +3084,7 @@ "{0} files ({1}{2}) are": "{0} archivos ({1}{2}) están", "{0} files are left unmerged in it, which git can't stash.": "Quedan {0} archivos sin fusionar en él, que git no puede guardar en el stash.", "{0} files have conflicts to resolve.": "{0} archivos tienen conflictos por resolver.", + "{0} files in changelists are left out.": "Se dejan fuera {0} archivos de listas de cambios.", "{0} files selected": "{0} archivos seleccionados", "{0} files still contain": "{0} archivos todavía contienen", "{0} files still have": "{0} archivos todavía tienen", @@ -3227,6 +3254,7 @@ "{0} {1}, {2} to decide": "{0} {1}, {2} por decidir", "{0} {1}.": "{0} {1}.", "{0} · {1} can be merged automatically": "{0} · {1} se puede fusionar automáticamente", + "{0} — a changelist: its files stay out of Stage All and Commit all until you stage them. Click to collapse, Ctrl/Cmd-click to select its files, right-click for its actions.": "{0}: una lista de cambios; sus archivos quedan fuera de Preparar todo y Confirmar todo hasta que los prepares. Clic para contraer, Ctrl/Cmd-clic para seleccionar sus archivos, clic derecho para sus acciones.", "{0} — click to collapse, ": "{0} — clic para contraer, ", "{0} — continue or abort it first.": "{0} — continúalo o abórtalo primero.", "{0} — done.": "{0} — hecho.", @@ -3241,6 +3269,7 @@ "{0}+Enter creates it": "{0}+Enter lo crea", "{0}, and PR #{1}'s last commit couldn't be fetched: {2}": "{0}, y no se pudo obtener el último commit del PR #{1}: {2}", "{0}, but {1} isn't: {2}": "{0}, pero {1} no lo está: {2}", + "{0}, changelist, {1}": "{0}, lista de cambios, {1}", "{0}, plus the commits of {1} already rebased onto it": "{0}, más los commits de {1} ya rebasados sobre ella", "{0}, so it was checked out as {1} at its last commit — a push from there can't reach the pull request. {2}": "{0}, así que se usó como {1} en su último commit — un push desde ahí no puede llegar al pull request. {2}", "{0}, then create a branch to push them.": "{0}, y luego crea una rama para publicarlos.", diff --git a/apps/extension/l10n/bundle.l10n.fr.json b/apps/extension/l10n/bundle.l10n.fr.json index 8f17d9d7..cce4f752 100644 --- a/apps/extension/l10n/bundle.l10n.fr.json +++ b/apps/extension/l10n/bundle.l10n.fr.json @@ -69,6 +69,7 @@ "$(check) Committed": "$(check) Validé", "$(check) Copied {0}": "$(check) {0} copié", "$(check) Created & switched to {0}": "$(check) Créé et basculé vers {0}", + "$(check) Deleted changelist “{0}” — its files are back in Changes": "$(check) Liste de modifications « {0} » supprimée — ses fichiers sont de retour dans Modifications", "$(check) GitStudio: AI features disabled": "$(check) GitStudio : fonctionnalités d'IA désactivées", "$(check) Nothing to push from {0} — up to date": "$(check) Rien à pousser depuis {0} — à jour", "$(check) Nothing to push — up to date": "$(check) Rien à pousser — à jour", @@ -180,6 +181,7 @@ "1 conflicted file": "1 fichier en conflit", "1 file": "1 fichier", "1 file has conflicts to resolve.": "1 fichier a des conflits à résoudre.", + "1 file in a changelist is left out.": "1 fichier d'une liste de modifications est laissé de côté.", "1 file selected": "1 fichier sélectionné", "1 file still contains": "1 fichier contient encore", "1 incoming commit to pull": "1 commit entrant à tirer", @@ -420,6 +422,7 @@ "Changed Files": "Fichiers modifiés", "Changed files": "Fichiers modifiés", "Changed on one side, deleted on the other": "Modifié d'un côté, supprimé de l'autre", + "Changelist name": "Nom de la liste de modifications", "Changes": "Modifications", "Changes from cherry-pick {0}": "Modifications du cherry-pick {0}", "Changes from worktree {0} ({1}), stashed before removing it": "Modifications de l'arborescence de travail {0} ({1}), remisées avant sa suppression", @@ -685,6 +688,7 @@ "Couldn't {0} {1}.": "Impossible de {0} {1}.", "Couldn't {0} {1}: {2}": "Impossible de {0} {1} : {2}", "Couldn't {0}: {1}": "Impossible de {0} : {1}", + "Create": "Créer", "Create Branch": "Créer une branche", "Create Branch Here": "Créer une branche ici", "Create Branch Here…": "Créer une branche ici…", @@ -730,6 +734,7 @@ "Date": "Date", "DeepSeek-V3 chat & R1 reasoning.": "DeepSeek-V3 pour le chat et R1 pour le raisonnement.", "Delete": "Supprimer", + "Delete Changelist": "Supprimer la liste de modifications", "Delete Remote Branch": "Supprimer la branche distante", "Delete Tag": "Supprimer l'étiquette", "Delete branch": "Supprimer la branche", @@ -833,6 +838,7 @@ "Drop to apply": "Déposer pour appliquer", "Drop to copy {0}": "Déposer pour copier {0}", "Drop to move {0}": "Déposer pour déplacer {0}", + "Drop to move {0} to “{1}”": "Déposer pour déplacer {0} vers « {1} »", "Drop to pop": "Déposer pour appliquer et supprimer", "Drop to stash {0}": "Déposer pour remiser {0}", "Drop {0}": "Supprimer {0}", @@ -862,6 +868,7 @@ "Enable LM Studio's local server (Developer ▸ Start Server), then load a model.": "Activez le serveur local de LM Studio (Developer ▸ Start Server), puis chargez un modèle.", "Encrypted at rest in GitStudio's own store — not your OS keychain, so it never raises a password prompt. The key stays host-side and is never sent to a webview.": "Chiffré au repos dans le propre stockage de GitStudio — pas votre porte-clés système, il ne déclenche donc jamais d'invite de mot de passe. La clé reste côté hôte et n'est jamais envoyée à une webview.", "Enter a commit SHA…": "Saisir le SHA d’un commit…", + "Enter a name for the changelist.": "Entrez un nom pour la liste de modifications.", "Errored": "En erreur", "Every check on its latest commit": "Toutes les vérifications sur son dernier commit", "Every conflict is resolved, and your stashed changes are in your files. git keeps the stash entry when applying it stops on conflicts, so it is still in your stash list — drop it once you are happy with the result.": "Tous les conflits sont résolus, et vos modifications remisées sont dans vos fichiers. git conserve l'entrée du stash quand son application s'arrête sur des conflits, elle est donc toujours dans votre liste de stashs — supprimez-la une fois satisfait du résultat.", @@ -893,6 +900,7 @@ "File too large to show ({0}) at {1}.": "Fichier trop volumineux pour être affiché ({0}) à {1}.", "Files": "Fichiers", "Files changed": "Fichiers modifiés", + "Files in a changelist are left out of Stage All and Commit all until you stage them yourself.": "Les fichiers d'une liste de modifications restent hors de Indexer tout et de Valider tout, jusqu'à ce que vous les indexiez vous-même.", "Files resolved": "Fichiers résolus", "Filter": "Filtrer", "Filter branches: {0}": "Filtrer les branches : {0}", @@ -1030,6 +1038,7 @@ "GitStudio: couldn't prepare the push — {0}": "GitStudio : le push n'a pas pu être préparé — {0}", "GitStudio: couldn't prune — {0}": "GitStudio : la purge n'a pas pu être effectuée — {0}", "GitStudio: couldn't reset {0} to {1}{2}": "GitStudio : impossible de réinitialiser {0} à {1}{2}", + "GitStudio: couldn't save the changelists — {0}": "GitStudio : impossible d'enregistrer les listes de modifications — {0}", "GitStudio: couldn't stage that change — {0}": "GitStudio : impossible d'indexer cette modification — {0}", "GitStudio: couldn't stage the changes — {0}": "GitStudio : impossible d'indexer les modifications — {0}", "GitStudio: couldn't stash your changes, so nothing ran — {0}": "GitStudio : impossible de remiser vos modifications, rien n'a donc été exécuté — {0}", @@ -1048,6 +1057,8 @@ "GitStudio: no worktree this can be done to.": "GitStudio : aucune arborescence de travail sur laquelle faire cela.", "GitStudio: nothing staged, or AI is unavailable.": "GitStudio : rien n'est indexé, ou l'IA n'est pas disponible.", "GitStudio: nothing stashed — every file was unticked.": "GitStudio : rien n'a été remisé — tous les fichiers étaient décochés.", + "GitStudio: nothing to commit. The only changed file is in a changelist — stage it first to commit it.": "GitStudio : rien à valider. Le seul fichier modifié est dans une liste de modifications — indexez-le d'abord pour le valider.", + "GitStudio: nothing to commit. The only changed files are in changelists — stage the ones to commit first.": "GitStudio : rien à valider. Les seuls fichiers modifiés sont dans des listes de modifications — indexez d'abord ceux à valider.", "GitStudio: nothing to draft (stage changes first), or AI is unavailable.": "GitStudio : rien à rédiger (indexez d'abord des modifications), ou l'IA n'est pas disponible.", "GitStudio: nothing to stash — the working tree is clean.": "GitStudio : rien à remiser — l'arbre de travail est propre.", "GitStudio: open a file in a Git repository to stage lines.": "GitStudio : ouvrez un fichier dans un dépôt Git pour indexer des lignes.", @@ -1327,10 +1338,14 @@ "Move the selected commits down (Alt+Down)": "Déplacer les commits sélectionnés vers le bas (Alt+Bas)", "Move the selected commits up": "Déplacer les commits sélectionnés vers le haut", "Move the selected commits up (Alt+Up)": "Déplacer les commits sélectionnés vers le haut (Alt+Haut)", + "Move to Changelist…": "Déplacer vers une liste de modifications…", "Move to Changes": "Déplacer vers Modifications", "Move up": "Déplacer vers le haut", "Move up (Alt+Up)": "Déplacer vers le haut (Alt+Haut)", + "Move {0} Files to Changelist": "Déplacer {0} fichiers vers une liste de modifications", "Move {0} out of “{1}”": "Sortir {0} de « {1} »", + "Move {0} to Changelist": "Déplacer {0} vers une liste de modifications", + "Move {0} to Changelist…": "Déplacer {0} vers une liste de modifications…", "Move {0} to Changes": "Déplacer {0} vers Modifications", "Move: take {0} out of the stash, back {1}": "Déplacer : sortir {0} du stash, retour {1}", "Moved {0} to Changes": "{0} déplacé vers Modifications", @@ -1349,6 +1364,10 @@ "New Branch from '": "Nouvelle branche à partir de « ", "New Branch from These Commits": "Nouvelle branche à partir de ces commits", "New Branch…": "Nouvelle branche…", + "New Changelist": "Nouvelle liste de modifications", + "New Changelist for {0}": "Nouvelle liste de modifications pour {0}", + "New Changelist for {0} Files": "Nouvelle liste de modifications pour {0} fichiers", + "New Changelist…": "Nouvelle liste de modifications…", "New Worktree from '": "Nouvelle arborescence de travail à partir de « ", "New Worktree…": "Nouvelle arborescence de travail…", "New branch": "Nouvelle branche", @@ -1791,6 +1810,8 @@ "Removes git's record of the worktree; the folder stays.": "Supprime l'enregistrement de l'arborescence de travail par git ; le dossier reste.", "Removing…": "Suppression en cours…", "Rename": "Renommer", + "Rename Changelist “{0}”": "Renommer la liste de modifications « {0} »", + "Rename Changelist…": "Renommer la liste de modifications…", "Rename branch": "Renommer la branche", "Rename branch {0}": "Renommer la branche {0}", "Rename it, then check it out.": "Renommez-la, puis extrayez-la.", @@ -2054,6 +2075,7 @@ "Stage": "Indexer", "Stage All": "Indexer tout", "Stage All Changes": "Indexer toutes les modifications", + "Stage All in This Changelist": "Indexer tout dans cette liste de modifications", "Stage Changes with Ticks": "Indexer les modifications cochées", "Stage Folder": "Indexer le dossier", "Stage all": "Indexer tout", @@ -2088,6 +2110,7 @@ "Stash 1 selected file…": "Remiser 1 fichier sélectionné…", "Stash All Changes": "Remiser toutes les modifications", "Stash Everything Staged": "Remiser tout ce qui est indexé", + "Stash These Files": "Remiser ces fichiers", "Stash This File": "Remiser ce fichier", "Stash This Folder": "Remiser ce dossier", "Stash all changes…": "Remiser toutes les modifications…", @@ -2157,6 +2180,7 @@ "That isn't a stash this app recorded.": "Ce n'est pas un stash enregistré par cette application.", "That isn't a usable file path.": "Ce n'est pas un chemin de fichier utilisable.", "That isn't a {0} this app made.": "Ce n'est pas un {0} fait par cette application.", + "That name is too long. Keep it under 80 characters.": "Ce nom est trop long. Restez sous 80 caractères.", "That path escapes the repository — nothing was changed.": "Ce chemin sort du dépôt — rien n'a été modifié.", "That puts back only what it changed, and only where nothing has moved since.": "Cela ne remet en place que ce qui a été modifié, et seulement là où rien n'a bougé depuis.", "That stash is no longer in the list, so nothing was changed.": "Ce stash n'est plus dans la liste, donc rien n'a été modifié.", @@ -2202,6 +2226,7 @@ "The conflicted files are back to their last committed versions.": "Les fichiers en conflit sont revenus à leurs dernières versions validées.", "The conflicts list: every conflicted file of this {0}, and {1}{2}": "La liste des conflits : chaque fichier en conflit de ce {0}, et {1}{2}", "The current commit": "Le commit actuel", + "The default changelist": "La liste de modifications par défaut", "The dropped commit is back": "Le commit supprimé est de retour", "The file goes back to its committed version. {0}": "Le fichier revient à sa version validée. {0}", "The file is deleted. Git has never tracked it, so nothing — not even Undo — can bring it back.": "Le fichier est supprimé. Git ne l'a jamais suivi, donc rien — pas même Annuler — ne peut le ramener.", @@ -2276,6 +2301,7 @@ "Their changes return to the Staged group, ready to re-commit.": "Leurs modifications reviennent dans le groupe Indexé, prêtes à être revalidées.", "Theirs": "La leur", "There are unresolved conflicts — resolve them or cancel first.": "Il y a des conflits non résolus — résolvez-les ou annulez d'abord.", + "There is already a group called “{0}”. Choose another name.": "Un groupe nommé « {0} » existe déjà. Choisissez un autre nom.", "There is no '{0}' to reset to — it is not on {1} any more.": "Il n'y a pas de « {0} » auquel réinitialiser — il n'est plus sur {1}.", "There is no '{0}' to reset to, and {1} couldn't be reached to fetch it.": "Il n'y a pas de « {0} » auquel réinitialiser, et {1} n'a pas pu être atteint pour le récupérer.", "There is no Apply to undo here any more.": "Il n'y a plus d'application à annuler ici.", @@ -3058,6 +3084,7 @@ "{0} files ({1}{2}) are": "{0} fichiers ({1}{2}) sont", "{0} files are left unmerged in it, which git can't stash.": "{0} fichiers y restent non fusionnés, que git ne peut pas remiser.", "{0} files have conflicts to resolve.": "{0} fichiers ont des conflits à résoudre.", + "{0} files in changelists are left out.": "{0} fichiers de listes de modifications sont laissés de côté.", "{0} files selected": "{0} fichiers sélectionnés", "{0} files still contain": "{0} fichiers contiennent encore", "{0} files still have": "{0} fichiers ont encore", @@ -3227,6 +3254,7 @@ "{0} {1}, {2} to decide": "{0} {1}, {2} à décider", "{0} {1}.": "{0} {1}.", "{0} · {1} can be merged automatically": "{0} · {1} peuvent être fusionnés automatiquement", + "{0} — a changelist: its files stay out of Stage All and Commit all until you stage them. Click to collapse, Ctrl/Cmd-click to select its files, right-click for its actions.": "{0} — une liste de modifications : ses fichiers restent hors de Indexer tout et de Valider tout jusqu'à ce que vous les indexiez. Cliquez pour réduire, Ctrl/Cmd-clic pour sélectionner ses fichiers, clic droit pour ses actions.", "{0} — click to collapse, ": "{0} — cliquez pour réduire, ", "{0} — continue or abort it first.": "{0} — continuez-le ou abandonnez-le d'abord.", "{0} — done.": "{0} — terminé.", @@ -3241,6 +3269,7 @@ "{0}+Enter creates it": "{0}+Entrée la crée", "{0}, and PR #{1}'s last commit couldn't be fetched: {2}": "{0}, et le dernier commit de la PR #{1} n'a pas pu être récupéré : {2}", "{0}, but {1} isn't: {2}": "{0}, mais {1} ne l'est pas : {2}", + "{0}, changelist, {1}": "{0}, liste de modifications, {1}", "{0}, plus the commits of {1} already rebased onto it": "{0}, plus les commits de {1} déjà rebasés sur elle", "{0}, so it was checked out as {1} at its last commit — a push from there can't reach the pull request. {2}": "{0}, elle a donc été extraite comme {1} à son dernier commit — un push depuis là ne peut pas atteindre la pull request. {2}", "{0}, then create a branch to push them.": "{0}, puis créez une branche pour les pousser.", diff --git a/apps/extension/l10n/bundle.l10n.it.json b/apps/extension/l10n/bundle.l10n.it.json index 533f42ab..0fe6f91c 100644 --- a/apps/extension/l10n/bundle.l10n.it.json +++ b/apps/extension/l10n/bundle.l10n.it.json @@ -69,6 +69,7 @@ "$(check) Committed": "$(check) Commit eseguito", "$(check) Copied {0}": "$(check) Copiato {0}", "$(check) Created & switched to {0}": "$(check) Creato e passato a {0}", + "$(check) Deleted changelist “{0}” — its files are back in Changes": "$(check) Elenco modifiche «{0}» eliminato: i suoi file sono di nuovo in Modifiche", "$(check) GitStudio: AI features disabled": "$(check) GitStudio: funzionalità AI disattivate", "$(check) Nothing to push from {0} — up to date": "$(check) Niente da pushare da {0} — aggiornato", "$(check) Nothing to push — up to date": "$(check) Niente da pushare — aggiornato", @@ -180,6 +181,7 @@ "1 conflicted file": "1 file in conflitto", "1 file": "1 file", "1 file has conflicts to resolve.": "1 file ha conflitti da risolvere.", + "1 file in a changelist is left out.": "1 file in un elenco modifiche viene escluso.", "1 file selected": "1 file selezionato", "1 file still contains": "1 file contiene ancora", "1 incoming commit to pull": "1 commit in arrivo da pull", @@ -420,6 +422,7 @@ "Changed Files": "File modificati", "Changed files": "File modificati", "Changed on one side, deleted on the other": "Modificato su un lato, eliminato sull'altro", + "Changelist name": "Nome dell'elenco modifiche", "Changes": "Modifiche", "Changes from cherry-pick {0}": "Modifiche dal cherry-pick {0}", "Changes from worktree {0} ({1}), stashed before removing it": "Modifiche dal worktree {0} ({1}), messe in stash prima di rimuoverlo", @@ -685,6 +688,7 @@ "Couldn't {0} {1}.": "Non è stato possibile {0} {1}.", "Couldn't {0} {1}: {2}": "Non è stato possibile {0} {1}: {2}", "Couldn't {0}: {1}": "Non è stato possibile {0}: {1}", + "Create": "Crea", "Create Branch": "Crea ramo", "Create Branch Here": "Crea ramo qui", "Create Branch Here…": "Crea ramo qui…", @@ -730,6 +734,7 @@ "Date": "Data", "DeepSeek-V3 chat & R1 reasoning.": "Chat DeepSeek-V3 e ragionamento R1.", "Delete": "Elimina", + "Delete Changelist": "Elimina elenco modifiche", "Delete Remote Branch": "Elimina ramo remoto", "Delete Tag": "Elimina tag", "Delete branch": "Elimina ramo", @@ -833,6 +838,7 @@ "Drop to apply": "Rilascia per applicare", "Drop to copy {0}": "Rilascia per copiare {0}", "Drop to move {0}": "Rilascia per spostare {0}", + "Drop to move {0} to “{1}”": "Rilascia per spostare {0} in «{1}»", "Drop to pop": "Rilascia per il pop", "Drop to stash {0}": "Rilascia per metter in stash {0}", "Drop {0}": "Elimina {0}", @@ -862,6 +868,7 @@ "Enable LM Studio's local server (Developer ▸ Start Server), then load a model.": "Attiva il server locale di LM Studio (Developer ▸ Start Server), poi carica un modello.", "Encrypted at rest in GitStudio's own store — not your OS keychain, so it never raises a password prompt. The key stays host-side and is never sent to a webview.": "Cifrato a riposo nell'archivio proprio di GitStudio — non il keychain del tuo SO, quindi non chiede mai una password. La chiave resta lato host e non viene mai inviata a una webview.", "Enter a commit SHA…": "Inserisci lo SHA di un commit…", + "Enter a name for the changelist.": "Inserisci un nome per l'elenco modifiche.", "Errored": "Errore", "Every check on its latest commit": "Ogni controllo sul suo ultimo commit", "Every conflict is resolved, and your stashed changes are in your files. git keeps the stash entry when applying it stops on conflicts, so it is still in your stash list — drop it once you are happy with the result.": "Ogni conflitto è risolto, e le tue modifiche nello stash sono nei tuoi file. git conserva la voce dello stash quando la sua applicazione si ferma per conflitti, quindi è ancora nel tuo elenco di stash — eliminala quando sei soddisfatto del risultato.", @@ -893,6 +900,7 @@ "File too large to show ({0}) at {1}.": "File troppo grande da mostrare ({0}) in {1}.", "Files": "File", "Files changed": "File modificati", + "Files in a changelist are left out of Stage All and Commit all until you stage them yourself.": "I file in un elenco modifiche restano fuori da Stage tutto e dal commit di tutto finché non esegui tu lo stage.", "Files resolved": "File risolti", "Filter": "Filtro", "Filter branches: {0}": "Filtra rami: {0}", @@ -1030,6 +1038,7 @@ "GitStudio: couldn't prepare the push — {0}": "GitStudio: non è stato possibile preparare il push — {0}", "GitStudio: couldn't prune — {0}": "GitStudio: non è stato possibile eseguire il prune — {0}", "GitStudio: couldn't reset {0} to {1}{2}": "GitStudio: non è stato possibile resettare {0} a {1}{2}", + "GitStudio: couldn't save the changelists — {0}": "GitStudio: impossibile salvare gli elenchi modifiche — {0}", "GitStudio: couldn't stage that change — {0}": "GitStudio: non è stato possibile metter in stage quella modifica — {0}", "GitStudio: couldn't stage the changes — {0}": "GitStudio: non è stato possibile metter in stage le modifiche — {0}", "GitStudio: couldn't stash your changes, so nothing ran — {0}": "GitStudio: non è stato possibile metter in stash le tue modifiche, quindi nulla è stato eseguito — {0}", @@ -1048,6 +1057,8 @@ "GitStudio: no worktree this can be done to.": "GitStudio: nessun worktree su cui farlo.", "GitStudio: nothing staged, or AI is unavailable.": "GitStudio: niente in stage, oppure l'AI non è disponibile.", "GitStudio: nothing stashed — every file was unticked.": "GitStudio: niente messo in stash — ogni file è stato deselezionato.", + "GitStudio: nothing to commit. The only changed file is in a changelist — stage it first to commit it.": "GitStudio: niente di cui eseguire il commit. L'unico file modificato è in un elenco modifiche: eseguine prima lo stage per includerlo nel commit.", + "GitStudio: nothing to commit. The only changed files are in changelists — stage the ones to commit first.": "GitStudio: niente di cui eseguire il commit. Gli unici file modificati sono in elenchi modifiche: esegui prima lo stage di quelli da includere nel commit.", "GitStudio: nothing to draft (stage changes first), or AI is unavailable.": "GitStudio: niente da scrivere in bozza (metti prima in stage le modifiche), oppure l'AI non è disponibile.", "GitStudio: nothing to stash — the working tree is clean.": "GitStudio: niente da metter in stash — la copia di lavoro è pulita.", "GitStudio: open a file in a Git repository to stage lines.": "GitStudio: apri un file in un repository Git per mettere in stage le righe.", @@ -1327,10 +1338,14 @@ "Move the selected commits down (Alt+Down)": "Sposta giù i commit selezionati (Alt+Giù)", "Move the selected commits up": "Sposta su i commit selezionati", "Move the selected commits up (Alt+Up)": "Sposta su i commit selezionati (Alt+Su)", + "Move to Changelist…": "Sposta in elenco modifiche…", "Move to Changes": "Sposta in Modifiche", "Move up": "Sposta su", "Move up (Alt+Up)": "Sposta su (Alt+Su)", + "Move {0} Files to Changelist": "Sposta {0} file in elenco modifiche", "Move {0} out of “{1}”": "Sposta {0} fuori da “{1}”", + "Move {0} to Changelist": "Sposta {0} in elenco modifiche", + "Move {0} to Changelist…": "Sposta {0} in elenco modifiche…", "Move {0} to Changes": "Sposta {0} in Modifiche", "Move: take {0} out of the stash, back {1}": "Sposta: estrai {0} dallo stash, ripristina {1}", "Moved {0} to Changes": "Spostato {0} in Modifiche", @@ -1349,6 +1364,10 @@ "New Branch from '": "Nuovo ramo da '", "New Branch from These Commits": "Nuovo ramo da questi commit", "New Branch…": "Nuovo ramo…", + "New Changelist": "Nuovo elenco modifiche", + "New Changelist for {0}": "Nuovo elenco modifiche per {0}", + "New Changelist for {0} Files": "Nuovo elenco modifiche per {0} file", + "New Changelist…": "Nuovo elenco modifiche…", "New Worktree from '": "Nuovo worktree da '", "New Worktree…": "Nuovo worktree…", "New branch": "Nuovo ramo", @@ -1791,6 +1810,8 @@ "Removes git's record of the worktree; the folder stays.": "Rimuove il riferimento di git al worktree; la cartella resta.", "Removing…": "Rimozione in corso…", "Rename": "Rinomina", + "Rename Changelist “{0}”": "Rinomina l'elenco modifiche «{0}»", + "Rename Changelist…": "Rinomina elenco modifiche…", "Rename branch": "Rinomina ramo", "Rename branch {0}": "Rinomina il ramo {0}", "Rename it, then check it out.": "Rinominalo, poi fanne il checkout.", @@ -2054,6 +2075,7 @@ "Stage": "Stage", "Stage All": "Stage tutto", "Stage All Changes": "Stage di tutte le modifiche", + "Stage All in This Changelist": "Stage di tutto in questo elenco modifiche", "Stage Changes with Ticks": "Stage delle modifiche con i segni di spunta", "Stage Folder": "Stage cartella", "Stage all": "Stage tutto", @@ -2088,6 +2110,7 @@ "Stash 1 selected file…": "Stash di 1 file selezionato…", "Stash All Changes": "Stash di tutte le modifiche", "Stash Everything Staged": "Stash di tutto ciò che è in stage", + "Stash These Files": "Stash di questi file", "Stash This File": "Stash di questo file", "Stash This Folder": "Stash di questa cartella", "Stash all changes…": "Stash di tutte le modifiche…", @@ -2157,6 +2180,7 @@ "That isn't a stash this app recorded.": "Questo non è uno stash registrato da questa app.", "That isn't a usable file path.": "Questo non è un percorso di file utilizzabile.", "That isn't a {0} this app made.": "Questo non è un {0} fatto da questa app.", + "That name is too long. Keep it under 80 characters.": "Il nome è troppo lungo. Resta sotto gli 80 caratteri.", "That path escapes the repository — nothing was changed.": "Quel percorso esce dal repository — non è stato modificato nulla.", "That puts back only what it changed, and only where nothing has moved since.": "Questo ripristina solo ciò che ha modificato, e solo dove nulla si è spostato da allora.", "That stash is no longer in the list, so nothing was changed.": "Quello stash non è più nell'elenco, quindi non è stato modificato nulla.", @@ -2202,6 +2226,7 @@ "The conflicted files are back to their last committed versions.": "I file in conflitto sono tornati alle loro ultime versioni committate.", "The conflicts list: every conflicted file of this {0}, and {1}{2}": "L'elenco dei conflitti: ogni file in conflitto di questo {0}, e {1}{2}", "The current commit": "Il commit corrente", + "The default changelist": "L'elenco modifiche predefinito", "The dropped commit is back": "Il commit eliminato è tornato", "The file goes back to its committed version. {0}": "Il file torna alla sua versione committata. {0}", "The file is deleted. Git has never tracked it, so nothing — not even Undo — can bring it back.": "Il file viene eliminato. Git non lo ha mai tracciato, quindi nulla — nemmeno Undo — può farlo tornare.", @@ -2276,6 +2301,7 @@ "Their changes return to the Staged group, ready to re-commit.": "Le loro modifiche tornano al gruppo In stage, pronte per essere committate di nuovo.", "Theirs": "Loro", "There are unresolved conflicts — resolve them or cancel first.": "Ci sono conflitti non risolti — risolvili o annulla prima.", + "There is already a group called “{0}”. Choose another name.": "Esiste già un gruppo chiamato «{0}». Scegli un altro nome.", "There is no '{0}' to reset to — it is not on {1} any more.": "Non c'è nessun '{0}' a cui fare il reset — non è più su {1}.", "There is no '{0}' to reset to, and {1} couldn't be reached to fetch it.": "Non c'è nessun '{0}' a cui fare il reset, e non è stato possibile contattare {1} per recuperarlo.", "There is no Apply to undo here any more.": "Non c'è più nessuna Apply da annullare qui.", @@ -3058,6 +3084,7 @@ "{0} files ({1}{2}) are": "{0} file ({1}{2}) sono", "{0} files are left unmerged in it, which git can't stash.": "{0} file restano non uniti al suo interno, che git non può metter in stash.", "{0} files have conflicts to resolve.": "{0} file hanno conflitti da risolvere.", + "{0} files in changelists are left out.": "{0} file in elenchi modifiche vengono esclusi.", "{0} files selected": "{0} file selezionati", "{0} files still contain": "{0} file contengono ancora", "{0} files still have": "{0} file hanno ancora", @@ -3227,6 +3254,7 @@ "{0} {1}, {2} to decide": "{0} {1}, {2} da decidere", "{0} {1}.": "{0} {1}.", "{0} · {1} can be merged automatically": "{0} · {1} può essere unito automaticamente", + "{0} — a changelist: its files stay out of Stage All and Commit all until you stage them. Click to collapse, Ctrl/Cmd-click to select its files, right-click for its actions.": "{0} — un elenco modifiche: i suoi file restano fuori da Stage tutto e dal commit di tutto finché non ne esegui lo stage. Clic per comprimere, Ctrl/Cmd-clic per selezionarne i file, clic destro per le sue azioni.", "{0} — click to collapse, ": "{0} — clic per comprimere, ", "{0} — continue or abort it first.": "{0} — continualo o interrompilo prima.", "{0} — done.": "{0} — completato.", @@ -3241,6 +3269,7 @@ "{0}+Enter creates it": "{0}+Invio lo crea", "{0}, and PR #{1}'s last commit couldn't be fetched: {2}": "{0}, e non è stato possibile recuperare con il fetch l'ultimo commit della PR #{1}: {2}", "{0}, but {1} isn't: {2}": "{0}, ma {1} non lo è: {2}", + "{0}, changelist, {1}": "{0}, elenco modifiche, {1}", "{0}, plus the commits of {1} already rebased onto it": "{0}, più i commit di {1} già sottoposti a rebase su di esso", "{0}, so it was checked out as {1} at its last commit — a push from there can't reach the pull request. {2}": "{0}, quindi ne è stato eseguito il checkout come {1} al suo ultimo commit — un push da lì non può raggiungere la pull request. {2}", "{0}, then create a branch to push them.": "{0}, poi crea un ramo per pusharli.", diff --git a/apps/extension/l10n/bundle.l10n.ja.json b/apps/extension/l10n/bundle.l10n.ja.json index 8db399b6..e6e6f344 100644 --- a/apps/extension/l10n/bundle.l10n.ja.json +++ b/apps/extension/l10n/bundle.l10n.ja.json @@ -69,6 +69,7 @@ "$(check) Committed": "$(check) コミットしました", "$(check) Copied {0}": "$(check) {0} をコピーしました", "$(check) Created & switched to {0}": "$(check) {0} を作成して切り替えました", + "$(check) Deleted changelist “{0}” — its files are back in Changes": "$(check) 変更リスト「{0}」を削除しました — ファイルは変更に戻りました", "$(check) GitStudio: AI features disabled": "$(check) GitStudio: AI 機能を無効化しました", "$(check) Nothing to push from {0} — up to date": "$(check) {0} からプッシュするものはありません — 最新です", "$(check) Nothing to push — up to date": "$(check) プッシュするものはありません — 最新です", @@ -180,6 +181,7 @@ "1 conflicted file": "コンフリクトのあるファイル 1 件", "1 file": "1 個のファイル", "1 file has conflicts to resolve.": "1 個のファイルに解決が必要なコンフリクトがあります。", + "1 file in a changelist is left out.": "変更リスト内の 1 ファイルは含まれません。", "1 file selected": "1 個のファイルを選択中", "1 file still contains": "1 個のファイルにはまだ", "1 incoming commit to pull": "プルする着信コミット 1 件", @@ -420,6 +422,7 @@ "Changed Files": "変更されたファイル", "Changed files": "変更されたファイル", "Changed on one side, deleted on the other": "一方で変更、もう一方で削除", + "Changelist name": "変更リスト名", "Changes": "変更", "Changes from cherry-pick {0}": "チェリーピック {0} による変更", "Changes from worktree {0} ({1}), stashed before removing it": "ワークツリー {0}({1})の変更、削除前にスタッシュ", @@ -685,6 +688,7 @@ "Couldn't {0} {1}.": "{0} {1} できませんでした。", "Couldn't {0} {1}: {2}": "{0} {1} できませんでした: {2}", "Couldn't {0}: {1}": "{0} できませんでした: {1}", + "Create": "作成", "Create Branch": "ブランチを作成", "Create Branch Here": "ここにブランチを作成", "Create Branch Here…": "ここにブランチを作成…", @@ -730,6 +734,7 @@ "Date": "日付", "DeepSeek-V3 chat & R1 reasoning.": "DeepSeek-V3 チャットと R1 推論。", "Delete": "削除", + "Delete Changelist": "変更リストを削除", "Delete Remote Branch": "リモートブランチを削除", "Delete Tag": "タグを削除", "Delete branch": "ブランチを削除", @@ -833,6 +838,7 @@ "Drop to apply": "ドロップして適用", "Drop to copy {0}": "ドロップして{0}をコピー", "Drop to move {0}": "ドロップして{0}を移動", + "Drop to move {0} to “{1}”": "ドロップして {0} を「{1}」に移動", "Drop to pop": "ドロップしてポップ", "Drop to stash {0}": "ドロップして{0}をスタッシュ", "Drop {0}": "{0}をドロップ", @@ -862,6 +868,7 @@ "Enable LM Studio's local server (Developer ▸ Start Server), then load a model.": "LM Studio のローカルサーバーを有効にし(Developer ▸ Start Server)、モデルを読み込んでください。", "Encrypted at rest in GitStudio's own store — not your OS keychain, so it never raises a password prompt. The key stays host-side and is never sent to a webview.": "GitStudio 独自のストアに保存時暗号化されます — OS のキーチェーンではないため、パスワードの入力は求められません。キーはホスト側に保持され、Webview には送られません。", "Enter a commit SHA…": "コミット SHA を入力…", + "Enter a name for the changelist.": "変更リストの名前を入力してください。", "Errored": "エラー発生", "Every check on its latest commit": "最新コミットのすべてのチェック", "Every conflict is resolved, and your stashed changes are in your files. git keeps the stash entry when applying it stops on conflicts, so it is still in your stash list — drop it once you are happy with the result.": "すべてのコンフリクトが解決され、スタッシュした変更がファイルに反映されました。git はコンフリクトで適用が停止した場合、スタッシュエントリを残すため、まだスタッシュ一覧に残っています — 結果に問題がなければドロップしてください。", @@ -893,6 +900,7 @@ "File too large to show ({0}) at {1}.": "ファイルが大きすぎて表示できません({0}) — {1}", "Files": "ファイル", "Files changed": "変更されたファイル", + "Files in a changelist are left out of Stage All and Commit all until you stage them yourself.": "変更リスト内のファイルは、自分でステージするまで「すべてステージ」と「すべてコミット」の対象外です。", "Files resolved": "解決済みのファイル", "Filter": "フィルター", "Filter branches: {0}": "ブランチをフィルター: {0}", @@ -1030,6 +1038,7 @@ "GitStudio: couldn't prepare the push — {0}": "GitStudio: プッシュの準備ができませんでした — {0}", "GitStudio: couldn't prune — {0}": "GitStudio: プルーンできませんでした — {0}", "GitStudio: couldn't reset {0} to {1}{2}": "GitStudio: {0} を {1} にリセットできませんでした{2}", + "GitStudio: couldn't save the changelists — {0}": "GitStudio: 変更リストを保存できませんでした — {0}", "GitStudio: couldn't stage that change — {0}": "GitStudio: その変更をステージできませんでした — {0}", "GitStudio: couldn't stage the changes — {0}": "GitStudio: 変更をステージできませんでした — {0}", "GitStudio: couldn't stash your changes, so nothing ran — {0}": "GitStudio: 変更をスタッシュできなかったため、何も実行されませんでした — {0}", @@ -1048,6 +1057,8 @@ "GitStudio: no worktree this can be done to.": "GitStudio: これを実行できるワークツリーがありません。", "GitStudio: nothing staged, or AI is unavailable.": "GitStudio: 何もステージされていないか、AI が利用できません。", "GitStudio: nothing stashed — every file was unticked.": "GitStudio: すべてのファイルのチェックが外されたため、何もスタッシュされませんでした。", + "GitStudio: nothing to commit. The only changed file is in a changelist — stage it first to commit it.": "GitStudio: コミットするものがありません。変更されたファイルは変更リスト内の 1 つだけです — コミットするには先にステージしてください。", + "GitStudio: nothing to commit. The only changed files are in changelists — stage the ones to commit first.": "GitStudio: コミットするものがありません。変更されたファイルはすべて変更リスト内にあります — コミットするものを先にステージしてください。", "GitStudio: nothing to draft (stage changes first), or AI is unavailable.": "GitStudio: 作成する対象がありません(先に変更をステージしてください)、またはAIが利用できません。", "GitStudio: nothing to stash — the working tree is clean.": "GitStudio: 作業ツリーがクリーンなため、スタッシュする対象がありません。", "GitStudio: open a file in a Git repository to stage lines.": "GitStudio: 行をステージするには Git リポジトリ内のファイルを開いてください。", @@ -1327,10 +1338,14 @@ "Move the selected commits down (Alt+Down)": "選択したコミットを下に移動(Alt+Down)", "Move the selected commits up": "選択したコミットを上に移動", "Move the selected commits up (Alt+Up)": "選択したコミットを上に移動(Alt+Up)", + "Move to Changelist…": "変更リストへ移動…", "Move to Changes": "変更に移動", "Move up": "上に移動", "Move up (Alt+Up)": "上に移動(Alt+Up)", + "Move {0} Files to Changelist": "{0} 個のファイルを変更リストへ移動", "Move {0} out of “{1}”": "{0} を「{1}」の外に移動", + "Move {0} to Changelist": "{0} を変更リストへ移動", + "Move {0} to Changelist…": "{0} を変更リストへ移動…", "Move {0} to Changes": "{0} を変更に移動", "Move: take {0} out of the stash, back {1}": "Move: {0} をスタッシュから取り出し、{1} に戻す", "Moved {0} to Changes": "{0} を変更に移動しました", @@ -1349,6 +1364,10 @@ "New Branch from '": "新しいブランチ元 '", "New Branch from These Commits": "これらのコミットから新しいブランチを作成", "New Branch…": "新しいブランチ…", + "New Changelist": "新しい変更リスト", + "New Changelist for {0}": "{0} の新しい変更リスト", + "New Changelist for {0} Files": "{0} 個のファイルの新しい変更リスト", + "New Changelist…": "新しい変更リスト…", "New Worktree from '": "新しいワークツリー元 '", "New Worktree…": "新しいワークツリー…", "New branch": "新しいブランチ", @@ -1791,6 +1810,8 @@ "Removes git's record of the worktree; the folder stays.": "gitのワークツリー記録を削除します。フォルダーは残ります。", "Removing…": "削除中…", "Rename": "名前の変更", + "Rename Changelist “{0}”": "変更リスト「{0}」の名前を変更", + "Rename Changelist…": "変更リストの名前を変更…", "Rename branch": "ブランチの名前を変更", "Rename branch {0}": "ブランチ{0}の名前を変更", "Rename it, then check it out.": "名前を変更してからチェックアウトしてください。", @@ -2054,6 +2075,7 @@ "Stage": "ステージ", "Stage All": "すべてステージ", "Stage All Changes": "すべての変更をステージ", + "Stage All in This Changelist": "この変更リストをすべてステージ", "Stage Changes with Ticks": "チェックした変更をステージ", "Stage Folder": "フォルダーをステージ", "Stage all": "すべてステージ", @@ -2088,6 +2110,7 @@ "Stash 1 selected file…": "選択した1件のファイルをスタッシュ…", "Stash All Changes": "すべての変更をスタッシュ", "Stash Everything Staged": "ステージ済みのすべてをスタッシュ", + "Stash These Files": "これらのファイルをスタッシュ", "Stash This File": "このファイルをスタッシュ", "Stash This Folder": "このフォルダーをスタッシュ", "Stash all changes…": "すべての変更をスタッシュ…", @@ -2157,6 +2180,7 @@ "That isn't a stash this app recorded.": "それはこのアプリが記録したスタッシュではありません。", "That isn't a usable file path.": "それは使用できないファイルパスです。", "That isn't a {0} this app made.": "それはこのアプリが行った{0}ではありません。", + "That name is too long. Keep it under 80 characters.": "名前が長すぎます。80 文字未満にしてください。", "That path escapes the repository — nothing was changed.": "そのパスはリポジトリの外を指しています — 何も変更されませんでした。", "That puts back only what it changed, and only where nothing has moved since.": "それが変更した部分だけを元に戻します。それ以降何も変わっていない箇所に限ります。", "That stash is no longer in the list, so nothing was changed.": "そのスタッシュはもうリストにないため、何も変更されませんでした。", @@ -2202,6 +2226,7 @@ "The conflicted files are back to their last committed versions.": "コンフリクトのあったファイルは最後にコミットされたバージョンに戻りました。", "The conflicts list: every conflicted file of this {0}, and {1}{2}": "コンフリクトのリスト: この{0}のコンフリクトのあるすべてのファイルと{1}{2}", "The current commit": "現在のコミット", + "The default changelist": "既定の変更リスト", "The dropped commit is back": "削除したコミットが戻りました", "The file goes back to its committed version. {0}": "ファイルはコミット済みのバージョンに戻ります。{0}", "The file is deleted. Git has never tracked it, so nothing — not even Undo — can bring it back.": "ファイルが削除されます。gitがこれまで追跡していなかったため、元に戻す機能を含め、復元する手段はありません。", @@ -2276,6 +2301,7 @@ "Their changes return to the Staged group, ready to re-commit.": "相手の変更はステージ済みグループに戻り、再コミットできる状態になります。", "Theirs": "相手側", "There are unresolved conflicts — resolve them or cancel first.": "未解決のコンフリクトがあります — 先に解決するかキャンセルしてください。", + "There is already a group called “{0}”. Choose another name.": "「{0}」という名前のグループは既にあります。別の名前を選んでください。", "There is no '{0}' to reset to — it is not on {1} any more.": "リセット先の「{0}」がありません — もう{1}上にありません。", "There is no '{0}' to reset to, and {1} couldn't be reached to fetch it.": "リセット先の「{0}」がなく、取得のために{1}に接続できませんでした。", "There is no Apply to undo here any more.": "ここで元に戻せる「適用」はもうありません。", @@ -3058,6 +3084,7 @@ "{0} files ({1}{2}) are": "{0} 個のファイル ({1}{2}) は", "{0} files are left unmerged in it, which git can't stash.": "{0} 個のファイルが未マージのままで、gitはこれをスタッシュできません。", "{0} files have conflicts to resolve.": "{0} 個のファイルに解決すべきコンフリクトがあります。", + "{0} files in changelists are left out.": "変更リスト内の {0} 個のファイルは含まれません。", "{0} files selected": "{0} 個のファイルを選択中", "{0} files still contain": "{0} 個のファイルにはまだ含まれています", "{0} files still have": "{0} 個のファイルにはまだあります", @@ -3227,6 +3254,7 @@ "{0} {1}, {2} to decide": "{0} {1}、{2} は未決定", "{0} {1}.": "{0} {1}。", "{0} · {1} can be merged automatically": "{0} · {1} は自動的にマージできます", + "{0} — a changelist: its files stay out of Stage All and Commit all until you stage them. Click to collapse, Ctrl/Cmd-click to select its files, right-click for its actions.": "{0} — 変更リスト: ステージするまで、ファイルは「すべてステージ」と「すべてコミット」の対象外です。クリックで折りたたみ、Ctrl/Cmd+クリックでファイルを選択、右クリックで操作。", "{0} — click to collapse, ": "{0} — クリックして折りたたみ、", "{0} — continue or abort it first.": "{0} — 先に続行または中止してください。", "{0} — done.": "{0} — 完了。", @@ -3241,6 +3269,7 @@ "{0}+Enter creates it": "{0}+Enterで作成", "{0}, and PR #{1}'s last commit couldn't be fetched: {2}": "{0}、PR #{1} の最後のコミットをフェッチできませんでした: {2}", "{0}, but {1} isn't: {2}": "{0}、しかし {1} はそうではありません: {2}", + "{0}, changelist, {1}": "{0}、変更リスト、{1}", "{0}, plus the commits of {1} already rebased onto it": "{0}、および {1} の既にそこへリベースされたコミット", "{0}, so it was checked out as {1} at its last commit — a push from there can't reach the pull request. {2}": "{0} のため、最後のコミットで {1} としてチェックアウトされました — ここからのプッシュはプルリクエストに届きません。{2}", "{0}, then create a branch to push them.": "{0}、その後ブランチを作成してプッシュしてください。", diff --git a/apps/extension/l10n/bundle.l10n.json b/apps/extension/l10n/bundle.l10n.json index 343d998c..d418fe95 100644 --- a/apps/extension/l10n/bundle.l10n.json +++ b/apps/extension/l10n/bundle.l10n.json @@ -69,6 +69,7 @@ "$(check) Committed": "$(check) Committed", "$(check) Copied {0}": "$(check) Copied {0}", "$(check) Created & switched to {0}": "$(check) Created & switched to {0}", + "$(check) Deleted changelist “{0}” — its files are back in Changes": "$(check) Deleted changelist “{0}” — its files are back in Changes", "$(check) GitStudio: AI features disabled": "$(check) GitStudio: AI features disabled", "$(check) Nothing to push from {0} — up to date": "$(check) Nothing to push from {0} — up to date", "$(check) Nothing to push — up to date": "$(check) Nothing to push — up to date", @@ -180,6 +181,7 @@ "1 conflicted file": "1 conflicted file", "1 file": "1 file", "1 file has conflicts to resolve.": "1 file has conflicts to resolve.", + "1 file in a changelist is left out.": "1 file in a changelist is left out.", "1 file selected": "1 file selected", "1 file still contains": "1 file still contains", "1 incoming commit to pull": "1 incoming commit to pull", @@ -420,6 +422,7 @@ "Changed Files": "Changed Files", "Changed files": "Changed files", "Changed on one side, deleted on the other": "Changed on one side, deleted on the other", + "Changelist name": "Changelist name", "Changes": "Changes", "Changes from cherry-pick {0}": "Changes from cherry-pick {0}", "Changes from worktree {0} ({1}), stashed before removing it": "Changes from worktree {0} ({1}), stashed before removing it", @@ -685,6 +688,7 @@ "Couldn't {0} {1}.": "Couldn't {0} {1}.", "Couldn't {0} {1}: {2}": "Couldn't {0} {1}: {2}", "Couldn't {0}: {1}": "Couldn't {0}: {1}", + "Create": "Create", "Create Branch": "Create Branch", "Create Branch Here": "Create Branch Here", "Create Branch Here…": "Create Branch Here…", @@ -730,6 +734,7 @@ "Date": "Date", "DeepSeek-V3 chat & R1 reasoning.": "DeepSeek-V3 chat & R1 reasoning.", "Delete": "Delete", + "Delete Changelist": "Delete Changelist", "Delete Remote Branch": "Delete Remote Branch", "Delete Tag": "Delete Tag", "Delete branch": "Delete branch", @@ -833,6 +838,7 @@ "Drop to apply": "Drop to apply", "Drop to copy {0}": "Drop to copy {0}", "Drop to move {0}": "Drop to move {0}", + "Drop to move {0} to “{1}”": "Drop to move {0} to “{1}”", "Drop to pop": "Drop to pop", "Drop to stash {0}": "Drop to stash {0}", "Drop {0}": "Drop {0}", @@ -862,6 +868,7 @@ "Enable LM Studio's local server (Developer ▸ Start Server), then load a model.": "Enable LM Studio's local server (Developer ▸ Start Server), then load a model.", "Encrypted at rest in GitStudio's own store — not your OS keychain, so it never raises a password prompt. The key stays host-side and is never sent to a webview.": "Encrypted at rest in GitStudio's own store — not your OS keychain, so it never raises a password prompt. The key stays host-side and is never sent to a webview.", "Enter a commit SHA…": "Enter a commit SHA…", + "Enter a name for the changelist.": "Enter a name for the changelist.", "Errored": "Errored", "Every check on its latest commit": "Every check on its latest commit", "Every conflict is resolved, and your stashed changes are in your files. git keeps the stash entry when applying it stops on conflicts, so it is still in your stash list — drop it once you are happy with the result.": "Every conflict is resolved, and your stashed changes are in your files. git keeps the stash entry when applying it stops on conflicts, so it is still in your stash list — drop it once you are happy with the result.", @@ -893,6 +900,7 @@ "File too large to show ({0}) at {1}.": "File too large to show ({0}) at {1}.", "Files": "Files", "Files changed": "Files changed", + "Files in a changelist are left out of Stage All and Commit all until you stage them yourself.": "Files in a changelist are left out of Stage All and Commit all until you stage them yourself.", "Files resolved": "Files resolved", "Filter": "Filter", "Filter branches: {0}": "Filter branches: {0}", @@ -1030,6 +1038,7 @@ "GitStudio: couldn't prepare the push — {0}": "GitStudio: couldn't prepare the push — {0}", "GitStudio: couldn't prune — {0}": "GitStudio: couldn't prune — {0}", "GitStudio: couldn't reset {0} to {1}{2}": "GitStudio: couldn't reset {0} to {1}{2}", + "GitStudio: couldn't save the changelists — {0}": "GitStudio: couldn't save the changelists — {0}", "GitStudio: couldn't stage that change — {0}": "GitStudio: couldn't stage that change — {0}", "GitStudio: couldn't stage the changes — {0}": "GitStudio: couldn't stage the changes — {0}", "GitStudio: couldn't stash your changes, so nothing ran — {0}": "GitStudio: couldn't stash your changes, so nothing ran — {0}", @@ -1048,6 +1057,8 @@ "GitStudio: no worktree this can be done to.": "GitStudio: no worktree this can be done to.", "GitStudio: nothing staged, or AI is unavailable.": "GitStudio: nothing staged, or AI is unavailable.", "GitStudio: nothing stashed — every file was unticked.": "GitStudio: nothing stashed — every file was unticked.", + "GitStudio: nothing to commit. The only changed file is in a changelist — stage it first to commit it.": "GitStudio: nothing to commit. The only changed file is in a changelist — stage it first to commit it.", + "GitStudio: nothing to commit. The only changed files are in changelists — stage the ones to commit first.": "GitStudio: nothing to commit. The only changed files are in changelists — stage the ones to commit first.", "GitStudio: nothing to draft (stage changes first), or AI is unavailable.": "GitStudio: nothing to draft (stage changes first), or AI is unavailable.", "GitStudio: nothing to stash — the working tree is clean.": "GitStudio: nothing to stash — the working tree is clean.", "GitStudio: open a file in a Git repository to stage lines.": "GitStudio: open a file in a Git repository to stage lines.", @@ -1327,10 +1338,14 @@ "Move the selected commits down (Alt+Down)": "Move the selected commits down (Alt+Down)", "Move the selected commits up": "Move the selected commits up", "Move the selected commits up (Alt+Up)": "Move the selected commits up (Alt+Up)", + "Move to Changelist…": "Move to Changelist…", "Move to Changes": "Move to Changes", "Move up": "Move up", "Move up (Alt+Up)": "Move up (Alt+Up)", + "Move {0} Files to Changelist": "Move {0} Files to Changelist", "Move {0} out of “{1}”": "Move {0} out of “{1}”", + "Move {0} to Changelist": "Move {0} to Changelist", + "Move {0} to Changelist…": "Move {0} to Changelist…", "Move {0} to Changes": "Move {0} to Changes", "Move: take {0} out of the stash, back {1}": "Move: take {0} out of the stash, back {1}", "Moved {0} to Changes": "Moved {0} to Changes", @@ -1349,6 +1364,10 @@ "New Branch from '": "New Branch from '", "New Branch from These Commits": "New Branch from These Commits", "New Branch…": "New Branch…", + "New Changelist": "New Changelist", + "New Changelist for {0}": "New Changelist for {0}", + "New Changelist for {0} Files": "New Changelist for {0} Files", + "New Changelist…": "New Changelist…", "New Worktree from '": "New Worktree from '", "New Worktree…": "New Worktree…", "New branch": "New branch", @@ -1791,6 +1810,8 @@ "Removes git's record of the worktree; the folder stays.": "Removes git's record of the worktree; the folder stays.", "Removing…": "Removing…", "Rename": "Rename", + "Rename Changelist “{0}”": "Rename Changelist “{0}”", + "Rename Changelist…": "Rename Changelist…", "Rename branch": "Rename branch", "Rename branch {0}": "Rename branch {0}", "Rename it, then check it out.": "Rename it, then check it out.", @@ -2054,6 +2075,7 @@ "Stage": "Stage", "Stage All": "Stage All", "Stage All Changes": "Stage All Changes", + "Stage All in This Changelist": "Stage All in This Changelist", "Stage Changes with Ticks": "Stage Changes with Ticks", "Stage Folder": "Stage Folder", "Stage all": "Stage all", @@ -2088,6 +2110,7 @@ "Stash 1 selected file…": "Stash 1 selected file…", "Stash All Changes": "Stash All Changes", "Stash Everything Staged": "Stash Everything Staged", + "Stash These Files": "Stash These Files", "Stash This File": "Stash This File", "Stash This Folder": "Stash This Folder", "Stash all changes…": "Stash all changes…", @@ -2157,6 +2180,7 @@ "That isn't a stash this app recorded.": "That isn't a stash this app recorded.", "That isn't a usable file path.": "That isn't a usable file path.", "That isn't a {0} this app made.": "That isn't a {0} this app made.", + "That name is too long. Keep it under 80 characters.": "That name is too long. Keep it under 80 characters.", "That path escapes the repository — nothing was changed.": "That path escapes the repository — nothing was changed.", "That puts back only what it changed, and only where nothing has moved since.": "That puts back only what it changed, and only where nothing has moved since.", "That stash is no longer in the list, so nothing was changed.": "That stash is no longer in the list, so nothing was changed.", @@ -2202,6 +2226,7 @@ "The conflicted files are back to their last committed versions.": "The conflicted files are back to their last committed versions.", "The conflicts list: every conflicted file of this {0}, and {1}{2}": "The conflicts list: every conflicted file of this {0}, and {1}{2}", "The current commit": "The current commit", + "The default changelist": "The default changelist", "The dropped commit is back": "The dropped commit is back", "The file goes back to its committed version. {0}": "The file goes back to its committed version. {0}", "The file is deleted. Git has never tracked it, so nothing — not even Undo — can bring it back.": "The file is deleted. Git has never tracked it, so nothing — not even Undo — can bring it back.", @@ -2276,6 +2301,7 @@ "Their changes return to the Staged group, ready to re-commit.": "Their changes return to the Staged group, ready to re-commit.", "Theirs": "Theirs", "There are unresolved conflicts — resolve them or cancel first.": "There are unresolved conflicts — resolve them or cancel first.", + "There is already a group called “{0}”. Choose another name.": "There is already a group called “{0}”. Choose another name.", "There is no '{0}' to reset to — it is not on {1} any more.": "There is no '{0}' to reset to — it is not on {1} any more.", "There is no '{0}' to reset to, and {1} couldn't be reached to fetch it.": "There is no '{0}' to reset to, and {1} couldn't be reached to fetch it.", "There is no Apply to undo here any more.": "There is no Apply to undo here any more.", @@ -3058,6 +3084,7 @@ "{0} files ({1}{2}) are": "{0} files ({1}{2}) are", "{0} files are left unmerged in it, which git can't stash.": "{0} files are left unmerged in it, which git can't stash.", "{0} files have conflicts to resolve.": "{0} files have conflicts to resolve.", + "{0} files in changelists are left out.": "{0} files in changelists are left out.", "{0} files selected": "{0} files selected", "{0} files still contain": "{0} files still contain", "{0} files still have": "{0} files still have", @@ -3227,6 +3254,7 @@ "{0} {1}, {2} to decide": "{0} {1}, {2} to decide", "{0} {1}.": "{0} {1}.", "{0} · {1} can be merged automatically": "{0} · {1} can be merged automatically", + "{0} — a changelist: its files stay out of Stage All and Commit all until you stage them. Click to collapse, Ctrl/Cmd-click to select its files, right-click for its actions.": "{0} — a changelist: its files stay out of Stage All and Commit all until you stage them. Click to collapse, Ctrl/Cmd-click to select its files, right-click for its actions.", "{0} — click to collapse, ": "{0} — click to collapse, ", "{0} — continue or abort it first.": "{0} — continue or abort it first.", "{0} — done.": "{0} — done.", @@ -3241,6 +3269,7 @@ "{0}+Enter creates it": "{0}+Enter creates it", "{0}, and PR #{1}'s last commit couldn't be fetched: {2}": "{0}, and PR #{1}'s last commit couldn't be fetched: {2}", "{0}, but {1} isn't: {2}": "{0}, but {1} isn't: {2}", + "{0}, changelist, {1}": "{0}, changelist, {1}", "{0}, plus the commits of {1} already rebased onto it": "{0}, plus the commits of {1} already rebased onto it", "{0}, so it was checked out as {1} at its last commit — a push from there can't reach the pull request. {2}": "{0}, so it was checked out as {1} at its last commit — a push from there can't reach the pull request. {2}", "{0}, then create a branch to push them.": "{0}, then create a branch to push them.", diff --git a/apps/extension/l10n/bundle.l10n.ko.json b/apps/extension/l10n/bundle.l10n.ko.json index daba95fe..8421ead4 100644 --- a/apps/extension/l10n/bundle.l10n.ko.json +++ b/apps/extension/l10n/bundle.l10n.ko.json @@ -69,6 +69,7 @@ "$(check) Committed": "$(check) 커밋됨", "$(check) Copied {0}": "$(check) {0} 복사됨", "$(check) Created & switched to {0}": "$(check) {0}을 만들고 전환했습니다", + "$(check) Deleted changelist “{0}” — its files are back in Changes": "$(check) 변경 목록 “{0}”을(를) 삭제했습니다 — 파일은 변경 내용으로 돌아갔습니다", "$(check) GitStudio: AI features disabled": "$(check) GitStudio: AI 기능이 꺼졌습니다", "$(check) Nothing to push from {0} — up to date": "$(check) {0}에서 푸시할 내용 없음 — 최신 상태", "$(check) Nothing to push — up to date": "$(check) 푸시할 내용 없음 — 최신 상태", @@ -180,6 +181,7 @@ "1 conflicted file": "충돌한 파일 1개", "1 file": "파일 1개", "1 file has conflicts to resolve.": "파일 1개에 해결할 충돌이 있습니다.", + "1 file in a changelist is left out.": "변경 목록에 있는 파일 1개는 제외됩니다.", "1 file selected": "파일 1개 선택됨", "1 file still contains": "파일 1개에 아직 포함됨", "1 incoming commit to pull": "풀할 수신 커밋 1개", @@ -420,6 +422,7 @@ "Changed Files": "변경된 파일", "Changed files": "변경된 파일", "Changed on one side, deleted on the other": "한쪽에서 변경, 다른 쪽에서 삭제", + "Changelist name": "변경 목록 이름", "Changes": "변경 내용", "Changes from cherry-pick {0}": "체리픽 {0}의 변경 내용", "Changes from worktree {0} ({1}), stashed before removing it": "작업 폴더 {0}({1})의 변경 내용, 제거 전에 스태시됨", @@ -685,6 +688,7 @@ "Couldn't {0} {1}.": "{0} {1}을 할 수 없었습니다.", "Couldn't {0} {1}: {2}": "{0} {1}을 할 수 없었습니다: {2}", "Couldn't {0}: {1}": "{0}을 할 수 없었습니다: {1}", + "Create": "만들기", "Create Branch": "브랜치 만들기", "Create Branch Here": "여기서 브랜치 만들기", "Create Branch Here…": "여기서 브랜치 만들기…", @@ -730,6 +734,7 @@ "Date": "날짜", "DeepSeek-V3 chat & R1 reasoning.": "DeepSeek-V3 채팅 및 R1 추론.", "Delete": "삭제", + "Delete Changelist": "변경 목록 삭제", "Delete Remote Branch": "원격 브랜치 삭제", "Delete Tag": "태그 삭제", "Delete branch": "브랜치 삭제", @@ -833,6 +838,7 @@ "Drop to apply": "드롭하여 적용", "Drop to copy {0}": "드롭하여 {0} 복사", "Drop to move {0}": "드롭하여 {0} 이동", + "Drop to move {0} to “{1}”": "드롭하여 {0}을(를) “{1}”(으)로 이동", "Drop to pop": "드롭하여 꺼내기", "Drop to stash {0}": "드롭하여 {0} 스태시", "Drop {0}": "{0} 삭제", @@ -862,6 +868,7 @@ "Enable LM Studio's local server (Developer ▸ Start Server), then load a model.": "LM Studio의 로컬 서버를 켠(개발자 ▸ 서버 시작) 후 모델을 로드하세요.", "Encrypted at rest in GitStudio's own store — not your OS keychain, so it never raises a password prompt. The key stays host-side and is never sent to a webview.": "GitStudio 자체 저장소에 암호화되어 저장됩니다 — OS 키체인이 아니므로 비밀번호 입력 창이 뜨지 않습니다. 키는 호스트 쪽에만 있으며 웹뷰로 전송되지 않습니다.", "Enter a commit SHA…": "커밋 SHA 입력…", + "Enter a name for the changelist.": "변경 목록 이름을 입력하세요.", "Errored": "오류 발생", "Every check on its latest commit": "최신 커밋의 모든 검사", "Every conflict is resolved, and your stashed changes are in your files. git keeps the stash entry when applying it stops on conflicts, so it is still in your stash list — drop it once you are happy with the result.": "모든 충돌이 해결되었으며 스태시된 변경 내용이 파일에 반영되었습니다. 적용이 충돌로 중지되면 git이 스태시 항목을 유지하므로 여전히 스태시 목록에 있습니다 — 결과에 만족하면 삭제하세요.", @@ -893,6 +900,7 @@ "File too large to show ({0}) at {1}.": "표시하기에 파일이 너무 큽니다({0}), {1}.", "Files": "파일", "Files changed": "변경된 파일", + "Files in a changelist are left out of Stage All and Commit all until you stage them yourself.": "변경 목록에 있는 파일은 직접 스테이지에 추가할 때까지 모두 스테이지에 추가와 모두 커밋에서 제외됩니다.", "Files resolved": "해결된 파일", "Filter": "필터", "Filter branches: {0}": "브랜치 필터: {0}", @@ -1030,6 +1038,7 @@ "GitStudio: couldn't prepare the push — {0}": "GitStudio: 푸시를 준비할 수 없었습니다 — {0}", "GitStudio: couldn't prune — {0}": "GitStudio: 정리할 수 없었습니다 — {0}", "GitStudio: couldn't reset {0} to {1}{2}": "GitStudio: {0}을 {1}{2}로 리셋할 수 없었습니다", + "GitStudio: couldn't save the changelists — {0}": "GitStudio: 변경 목록을 저장할 수 없습니다 — {0}", "GitStudio: couldn't stage that change — {0}": "GitStudio: 해당 변경 내용을 스테이지에 추가할 수 없었습니다 — {0}", "GitStudio: couldn't stage the changes — {0}": "GitStudio: 변경 내용을 스테이지에 추가할 수 없었습니다 — {0}", "GitStudio: couldn't stash your changes, so nothing ran — {0}": "GitStudio: 변경 내용을 스태시할 수 없어 아무것도 실행되지 않았습니다 — {0}", @@ -1048,6 +1057,8 @@ "GitStudio: no worktree this can be done to.": "GitStudio: 이 작업을 적용할 작업 폴더가 없습니다.", "GitStudio: nothing staged, or AI is unavailable.": "GitStudio: 스테이지에 추가된 내용이 없거나 AI를 사용할 수 없습니다.", "GitStudio: nothing stashed — every file was unticked.": "GitStudio: 스태시된 내용이 없습니다 — 모든 파일의 선택이 해제되었습니다.", + "GitStudio: nothing to commit. The only changed file is in a changelist — stage it first to commit it.": "GitStudio: 커밋할 내용이 없습니다. 변경된 파일은 변경 목록에 있는 하나뿐입니다 — 커밋하려면 먼저 스테이지에 추가하세요.", + "GitStudio: nothing to commit. The only changed files are in changelists — stage the ones to commit first.": "GitStudio: 커밋할 내용이 없습니다. 변경된 파일은 모두 변경 목록에 있습니다 — 커밋할 파일을 먼저 스테이지에 추가하세요.", "GitStudio: nothing to draft (stage changes first), or AI is unavailable.": "GitStudio: 작성할 내용이 없거나(먼저 변경 내용을 스테이지에 추가하세요) AI를 사용할 수 없습니다.", "GitStudio: nothing to stash — the working tree is clean.": "GitStudio: 스태시할 내용이 없습니다 — 작업 트리가 깨끗합니다.", "GitStudio: open a file in a Git repository to stage lines.": "GitStudio: 줄을 스테이지에 추가하려면 Git 리포지토리의 파일을 여세요.", @@ -1327,10 +1338,14 @@ "Move the selected commits down (Alt+Down)": "선택한 커밋을 아래로 이동(Alt+Down)", "Move the selected commits up": "선택한 커밋을 위로 이동", "Move the selected commits up (Alt+Up)": "선택한 커밋을 위로 이동(Alt+Up)", + "Move to Changelist…": "변경 목록으로 이동…", "Move to Changes": "변경 내용으로 이동", "Move up": "위로 이동", "Move up (Alt+Up)": "위로 이동(Alt+Up)", + "Move {0} Files to Changelist": "파일 {0}개를 변경 목록으로 이동", "Move {0} out of “{1}”": "{0}을 “{1}”에서 이동", + "Move {0} to Changelist": "{0}을(를) 변경 목록으로 이동", + "Move {0} to Changelist…": "{0}을(를) 변경 목록으로 이동…", "Move {0} to Changes": "{0}을 변경 내용으로 이동", "Move: take {0} out of the stash, back {1}": "이동: {0}을 스태시에서 꺼내 {1}로 되돌리기", "Moved {0} to Changes": "{0}을 변경 내용으로 이동함", @@ -1349,6 +1364,10 @@ "New Branch from '": "'에서 새 브랜치", "New Branch from These Commits": "이 커밋들로 새 브랜치", "New Branch…": "새 브랜치…", + "New Changelist": "새 변경 목록", + "New Changelist for {0}": "{0}의 새 변경 목록", + "New Changelist for {0} Files": "파일 {0}개의 새 변경 목록", + "New Changelist…": "새 변경 목록…", "New Worktree from '": "'에서 새 작업 폴더", "New Worktree…": "새 작업 폴더…", "New branch": "새 브랜치", @@ -1791,6 +1810,8 @@ "Removes git's record of the worktree; the folder stays.": "작업 폴더에 대한 git의 기록을 제거합니다. 폴더는 그대로 남습니다.", "Removing…": "제거하는 중…", "Rename": "이름 바꾸기", + "Rename Changelist “{0}”": "변경 목록 “{0}” 이름 바꾸기", + "Rename Changelist…": "변경 목록 이름 바꾸기…", "Rename branch": "브랜치 이름 바꾸기", "Rename branch {0}": "브랜치 {0} 이름 바꾸기", "Rename it, then check it out.": "이름을 바꾼 후 체크아웃하세요.", @@ -2054,6 +2075,7 @@ "Stage": "스테이지에 추가", "Stage All": "모두 스테이지에 추가", "Stage All Changes": "모든 변경 내용 스테이지에 추가", + "Stage All in This Changelist": "이 변경 목록 모두 스테이지에 추가", "Stage Changes with Ticks": "체크 표시로 변경 내용 스테이지에 추가", "Stage Folder": "폴더 스테이지에 추가", "Stage all": "모두 스테이지에 추가", @@ -2088,6 +2110,7 @@ "Stash 1 selected file…": "선택한 파일 1개 스태시…", "Stash All Changes": "모든 변경 내용 스태시", "Stash Everything Staged": "스테이징된 모든 내용 스태시", + "Stash These Files": "이 파일들 스태시", "Stash This File": "이 파일 스태시", "Stash This Folder": "이 폴더 스태시", "Stash all changes…": "모든 변경 내용 스태시…", @@ -2157,6 +2180,7 @@ "That isn't a stash this app recorded.": "그것은 이 앱이 기록한 스태시가 아닙니다.", "That isn't a usable file path.": "그것은 사용할 수 있는 파일 경로가 아닙니다.", "That isn't a {0} this app made.": "그것은 이 앱이 만든 {0}이 아닙니다.", + "That name is too long. Keep it under 80 characters.": "이름이 너무 깁니다. 80자 미만으로 입력하세요.", "That path escapes the repository — nothing was changed.": "그 경로는 리포지토리를 벗어납니다 — 아무것도 변경되지 않았습니다.", "That puts back only what it changed, and only where nothing has moved since.": "변경한 내용 중 이후 이동하지 않은 부분만 되돌립니다.", "That stash is no longer in the list, so nothing was changed.": "그 스태시는 더 이상 목록에 없어 아무것도 변경되지 않았습니다.", @@ -2202,6 +2226,7 @@ "The conflicted files are back to their last committed versions.": "충돌한 파일이 마지막 커밋 버전으로 돌아갑니다.", "The conflicts list: every conflicted file of this {0}, and {1}{2}": "충돌 목록: 이 {0}의 충돌한 모든 파일, 그리고 {1}{2}", "The current commit": "현재 커밋", + "The default changelist": "기본 변경 목록", "The dropped commit is back": "삭제한 커밋이 돌아왔습니다", "The file goes back to its committed version. {0}": "파일이 커밋된 버전으로 돌아갑니다. {0}", "The file is deleted. Git has never tracked it, so nothing — not even Undo — can bring it back.": "파일이 삭제되었습니다. git이 추적한 적이 없어 실행 취소로도 되돌릴 수 없습니다.", @@ -2276,6 +2301,7 @@ "Their changes return to the Staged group, ready to re-commit.": "상대의 변경 내용이 스테이징 그룹으로 돌아와 다시 커밋할 준비가 됩니다.", "Theirs": "상대 변경 내용", "There are unresolved conflicts — resolve them or cancel first.": "해결되지 않은 충돌이 있습니다 — 먼저 해결하거나 취소하세요.", + "There is already a group called “{0}”. Choose another name.": "“{0}”(이)라는 그룹이 이미 있습니다. 다른 이름을 선택하세요.", "There is no '{0}' to reset to — it is not on {1} any more.": "되돌릴 '{0}'이 없습니다 — 더 이상 {1}에 없습니다.", "There is no '{0}' to reset to, and {1} couldn't be reached to fetch it.": "되돌릴 '{0}'이 없으며 {1}에 연결하여 가져올 수도 없었습니다.", "There is no Apply to undo here any more.": "여기서 실행 취소할 적용 작업이 더 이상 없습니다.", @@ -3058,6 +3084,7 @@ "{0} files ({1}{2}) are": "{0} 파일({1}{2})은", "{0} files are left unmerged in it, which git can't stash.": "{0} 파일이 병합되지 않은 채 남아 있어 git이 스태시할 수 없습니다.", "{0} files have conflicts to resolve.": "{0} 파일에 해결할 충돌이 있습니다.", + "{0} files in changelists are left out.": "변경 목록에 있는 파일 {0}개는 제외됩니다.", "{0} files selected": "파일 {0}개 선택됨", "{0} files still contain": "{0} 파일에 여전히 포함됨", "{0} files still have": "{0} 파일에 여전히 있음", @@ -3227,6 +3254,7 @@ "{0} {1}, {2} to decide": "{0} {1}, 결정할 {2}", "{0} {1}.": "{0} {1}.", "{0} · {1} can be merged automatically": "{0} · {1}은 자동으로 병합할 수 있습니다", + "{0} — a changelist: its files stay out of Stage All and Commit all until you stage them. Click to collapse, Ctrl/Cmd-click to select its files, right-click for its actions.": "{0} — 변경 목록: 스테이지에 추가할 때까지 파일은 모두 스테이지에 추가와 모두 커밋에서 제외됩니다. 클릭하여 접기, Ctrl/Cmd-클릭하여 파일 선택, 마우스 오른쪽 버튼을 클릭하여 작업 보기.", "{0} — click to collapse, ": "{0} — 클릭하여 접기, ", "{0} — continue or abort it first.": "{0} — 먼저 계속하거나 중단하세요.", "{0} — done.": "{0} — 완료.", @@ -3241,6 +3269,7 @@ "{0}+Enter creates it": "{0}+Enter로 만들기", "{0}, and PR #{1}'s last commit couldn't be fetched: {2}": "{0}, PR #{1}의 마지막 커밋을 가져올 수 없었습니다: {2}", "{0}, but {1} isn't: {2}": "{0}은 있지만 {1}은 없습니다: {2}", + "{0}, changelist, {1}": "{0}, 변경 목록, {1}", "{0}, plus the commits of {1} already rebased onto it": "{0}, 그리고 이미 그 위에 리베이스된 {1}의 커밋", "{0}, so it was checked out as {1} at its last commit — a push from there can't reach the pull request. {2}": "{0}이라 마지막 커밋에서 {1}로 체크아웃되었습니다 — 거기서 푸시해도 풀 리퀘스트에 반영되지 않습니다. {2}", "{0}, then create a branch to push them.": "{0}, 그런 다음 브랜치를 만들어 푸시하세요.", diff --git a/apps/extension/l10n/bundle.l10n.pl.json b/apps/extension/l10n/bundle.l10n.pl.json index 4b161915..33a4bdd7 100644 --- a/apps/extension/l10n/bundle.l10n.pl.json +++ b/apps/extension/l10n/bundle.l10n.pl.json @@ -69,6 +69,7 @@ "$(check) Committed": "$(check) Zatwierdzono", "$(check) Copied {0}": "$(check) Skopiowano {0}", "$(check) Created & switched to {0}": "$(check) Utworzono i przełączono na {0}", + "$(check) Deleted changelist “{0}” — its files are back in Changes": "$(check) Usunięto listę zmian „{0}” — jej pliki wróciły do Zmian", "$(check) GitStudio: AI features disabled": "$(check) GitStudio: funkcje AI wyłączone", "$(check) Nothing to push from {0} — up to date": "$(check) Nic do wypchnięcia z {0} — aktualne", "$(check) Nothing to push — up to date": "$(check) Nic do wypchnięcia — aktualne", @@ -180,6 +181,7 @@ "1 conflicted file": "1 plik z konfliktem", "1 file": "1 plik", "1 file has conflicts to resolve.": "1 plik ma konflikty do rozwiązania.", + "1 file in a changelist is left out.": "1 plik z listy zmian zostaje pominięty.", "1 file selected": "1 plik wybrany", "1 file still contains": "1 plik wciąż zawiera", "1 incoming commit to pull": "1 przychodzący commit do pull", @@ -420,6 +422,7 @@ "Changed Files": "Zmienione pliki", "Changed files": "Zmienione pliki", "Changed on one side, deleted on the other": "Zmieniony po jednej stronie, usunięty po drugiej", + "Changelist name": "Nazwa listy zmian", "Changes": "Zmiany", "Changes from cherry-pick {0}": "Zmiany z cherry-pick {0}", "Changes from worktree {0} ({1}), stashed before removing it": "Zmiany z worktree {0} ({1}), zapisane w schowku przed jego usunięciem", @@ -685,6 +688,7 @@ "Couldn't {0} {1}.": "Nie udało się {0} {1}.", "Couldn't {0} {1}: {2}": "Nie udało się {0} {1}: {2}", "Couldn't {0}: {1}": "Nie udało się {0}: {1}", + "Create": "Utwórz", "Create Branch": "Utwórz branch", "Create Branch Here": "Utwórz branch tutaj", "Create Branch Here…": "Utwórz branch tutaj…", @@ -730,6 +734,7 @@ "Date": "Data", "DeepSeek-V3 chat & R1 reasoning.": "DeepSeek-V3 do czatu i R1 do rozumowania.", "Delete": "Usuń", + "Delete Changelist": "Usuń listę zmian", "Delete Remote Branch": "Usuń zdalny branch", "Delete Tag": "Usuń tag", "Delete branch": "Usuń branch", @@ -833,6 +838,7 @@ "Drop to apply": "Upuść, aby zastosować", "Drop to copy {0}": "Upuść, aby skopiować {0}", "Drop to move {0}": "Upuść, aby przenieść {0}", + "Drop to move {0} to “{1}”": "Upuść, aby przenieść {0} do „{1}”", "Drop to pop": "Upuść, aby pop", "Drop to stash {0}": "Upuść, aby zapisać {0} w schowku", "Drop {0}": "Odrzuć {0}", @@ -862,6 +868,7 @@ "Enable LM Studio's local server (Developer ▸ Start Server), then load a model.": "Włącz lokalny serwer LM Studio (Developer ▸ Start Server), a potem wczytaj model.", "Encrypted at rest in GitStudio's own store — not your OS keychain, so it never raises a password prompt. The key stays host-side and is never sent to a webview.": "Szyfrowane w spoczynku we własnym magazynie GitStudio — nie w pęku kluczy systemu, więc nigdy nie pojawia się monit o hasło. Klucz pozostaje po stronie hosta i nigdy nie jest wysyłany do webview.", "Enter a commit SHA…": "Wpisz SHA commita…", + "Enter a name for the changelist.": "Wpisz nazwę listy zmian.", "Errored": "Błąd", "Every check on its latest commit": "Każda kontrola na jego najnowszym commicie", "Every conflict is resolved, and your stashed changes are in your files. git keeps the stash entry when applying it stops on conflicts, so it is still in your stash list — drop it once you are happy with the result.": "Każdy konflikt jest rozwiązany, a Twoje zmiany ze schowka są w Twoich plikach. git zachowuje wpis schowka, gdy jego stosowanie zatrzymuje się na konfliktach, więc wciąż jest na Twojej liście schowków — odrzuć go, gdy wynik Ci odpowiada.", @@ -893,6 +900,7 @@ "File too large to show ({0}) at {1}.": "Plik za duży do wyświetlenia ({0}) w {1}.", "Files": "Pliki", "Files changed": "Zmienione pliki", + "Files in a changelist are left out of Stage All and Commit all until you stage them yourself.": "Pliki z listy zmian są pomijane przez Przygotuj wszystko i Zatwierdź wszystkie, dopóki sam ich nie przygotujesz.", "Files resolved": "Rozwiązane pliki", "Filter": "Filtr", "Filter branches: {0}": "Filtruj branche: {0}", @@ -1030,6 +1038,7 @@ "GitStudio: couldn't prepare the push — {0}": "GitStudio: nie udało się przygotować push — {0}", "GitStudio: couldn't prune — {0}": "GitStudio: nie udało się wyczyścić — {0}", "GitStudio: couldn't reset {0} to {1}{2}": "GitStudio: nie udało się zresetować {0} do {1}{2}", + "GitStudio: couldn't save the changelists — {0}": "GitStudio: nie udało się zapisać list zmian — {0}", "GitStudio: couldn't stage that change — {0}": "GitStudio: nie udało się przygotować tej zmiany — {0}", "GitStudio: couldn't stage the changes — {0}": "GitStudio: nie udało się przygotować zmian — {0}", "GitStudio: couldn't stash your changes, so nothing ran — {0}": "GitStudio: nie udało się zapisać Twoich zmian w schowku, więc nic nie zostało wykonane — {0}", @@ -1048,6 +1057,8 @@ "GitStudio: no worktree this can be done to.": "GitStudio: nie ma worktree, na którym można to wykonać.", "GitStudio: nothing staged, or AI is unavailable.": "GitStudio: nic nie jest przygotowane albo AI jest niedostępne.", "GitStudio: nothing stashed — every file was unticked.": "GitStudio: nic nie zapisano w schowku — każdy plik był odznaczony.", + "GitStudio: nothing to commit. The only changed file is in a changelist — stage it first to commit it.": "GitStudio: nie ma czego zatwierdzić. Jedyny zmieniony plik jest na liście zmian — najpierw go przygotuj, aby go zatwierdzić.", + "GitStudio: nothing to commit. The only changed files are in changelists — stage the ones to commit first.": "GitStudio: nie ma czego zatwierdzić. Jedyne zmienione pliki są na listach zmian — najpierw przygotuj te, które chcesz zatwierdzić.", "GitStudio: nothing to draft (stage changes first), or AI is unavailable.": "GitStudio: nic do zaszkicowania (najpierw przygotuj zmiany) albo AI jest niedostępne.", "GitStudio: nothing to stash — the working tree is clean.": "GitStudio: nic do zapisania w schowku — drzewo robocze jest czyste.", "GitStudio: open a file in a Git repository to stage lines.": "GitStudio: otwórz plik w repozytorium Git, aby przygotować linie.", @@ -1327,10 +1338,14 @@ "Move the selected commits down (Alt+Down)": "Przenieś wybrane commity niżej (Alt+Dół)", "Move the selected commits up": "Przenieś wybrane commity wyżej", "Move the selected commits up (Alt+Up)": "Przenieś wybrane commity wyżej (Alt+Góra)", + "Move to Changelist…": "Przenieś do listy zmian…", "Move to Changes": "Przenieś do Zmian", "Move up": "Przenieś wyżej", "Move up (Alt+Up)": "Przenieś wyżej (Alt+Góra)", + "Move {0} Files to Changelist": "Przenieś pliki ({0}) do listy zmian", "Move {0} out of “{1}”": "Przenieś {0} z „{1}”", + "Move {0} to Changelist": "Przenieś {0} do listy zmian", + "Move {0} to Changelist…": "Przenieś {0} do listy zmian…", "Move {0} to Changes": "Przenieś {0} do Zmian", "Move: take {0} out of the stash, back {1}": "Przenieś: wyjmij {0} ze schowka, przywróć {1}", "Moved {0} to Changes": "Przeniesiono {0} do Zmian", @@ -1349,6 +1364,10 @@ "New Branch from '": "Nowy branch z '", "New Branch from These Commits": "Nowy branch z tych commitów", "New Branch…": "Nowy branch…", + "New Changelist": "Nowa lista zmian", + "New Changelist for {0}": "Nowa lista zmian dla {0}", + "New Changelist for {0} Files": "Nowa lista zmian dla plików ({0})", + "New Changelist…": "Nowa lista zmian…", "New Worktree from '": "Nowy worktree z '", "New Worktree…": "Nowy worktree…", "New branch": "Nowy branch", @@ -1791,6 +1810,8 @@ "Removes git's record of the worktree; the folder stays.": "Usuwa zapis worktree w gicie; folder zostaje.", "Removing…": "Usuwanie…", "Rename": "Zmień nazwę", + "Rename Changelist “{0}”": "Zmień nazwę listy zmian „{0}”", + "Rename Changelist…": "Zmień nazwę listy zmian…", "Rename branch": "Zmień nazwę brancha", "Rename branch {0}": "Zmień nazwę brancha {0}", "Rename it, then check it out.": "Zmień jego nazwę, a potem przełącz się na niego.", @@ -2054,6 +2075,7 @@ "Stage": "Przygotuj", "Stage All": "Przygotuj wszystko", "Stage All Changes": "Przygotuj wszystkie zmiany", + "Stage All in This Changelist": "Przygotuj wszystko z tej listy zmian", "Stage Changes with Ticks": "Przygotuj zmiany ptaszkami", "Stage Folder": "Przygotuj folder", "Stage all": "Przygotuj wszystko", @@ -2088,6 +2110,7 @@ "Stash 1 selected file…": "Zapisz w schowku 1 wybrany plik…", "Stash All Changes": "Zapisz w schowku wszystkie zmiany", "Stash Everything Staged": "Zapisz w schowku wszystko przygotowane", + "Stash These Files": "Zapisz te pliki w schowku", "Stash This File": "Zapisz ten plik w schowku", "Stash This Folder": "Zapisz ten folder w schowku", "Stash all changes…": "Zapisz w schowku wszystkie zmiany…", @@ -2157,6 +2180,7 @@ "That isn't a stash this app recorded.": "To nie jest schowek zapisany przez tę aplikację.", "That isn't a usable file path.": "To nie jest użyteczna ścieżka pliku.", "That isn't a {0} this app made.": "To nie jest {0} wykonane przez tę aplikację.", + "That name is too long. Keep it under 80 characters.": "Ta nazwa jest za długa. Użyj mniej niż 80 znaków.", "That path escapes the repository — nothing was changed.": "Ta ścieżka wychodzi poza repozytorium — nic nie zostało zmienione.", "That puts back only what it changed, and only where nothing has moved since.": "To przywraca tylko to, co zmieniło, i tylko tam, gdzie nic się od tego czasu nie przesunęło.", "That stash is no longer in the list, so nothing was changed.": "Tego schowka nie ma już na liście, więc nic nie zostało zmienione.", @@ -2202,6 +2226,7 @@ "The conflicted files are back to their last committed versions.": "Pliki z konfliktem wróciły do swoich ostatnich zatwierdzonych wersji.", "The conflicts list: every conflicted file of this {0}, and {1}{2}": "Lista konfliktów: każdy plik z konfliktem tego {0} i {1}{2}", "The current commit": "Aktualny commit", + "The default changelist": "Domyślna lista zmian", "The dropped commit is back": "Odrzucony commit jest przywrócony", "The file goes back to its committed version. {0}": "Plik wraca do swojej zatwierdzonej wersji. {0}", "The file is deleted. Git has never tracked it, so nothing — not even Undo — can bring it back.": "Plik jest usunięty. Git nigdy go nie śledził, więc nic — nawet Undo — nie może go przywrócić.", @@ -2276,6 +2301,7 @@ "Their changes return to the Staged group, ready to re-commit.": "Ich zmiany wracają do grupy Staged, gotowe do ponownego zatwierdzenia.", "Theirs": "Ich", "There are unresolved conflicts — resolve them or cancel first.": "Są nierozwiązane konflikty — najpierw je rozwiąż albo anuluj.", + "There is already a group called “{0}”. Choose another name.": "Grupa o nazwie „{0}” już istnieje. Wybierz inną nazwę.", "There is no '{0}' to reset to — it is not on {1} any more.": "Nie ma '{0}', do którego można zresetować — już nie jest na {1}.", "There is no '{0}' to reset to, and {1} couldn't be reached to fetch it.": "Nie ma '{0}', do którego można zresetować, a nie udało się połączyć z {1}, aby go pobrać.", "There is no Apply to undo here any more.": "Nie ma już tu Apply do wycofania.", @@ -3058,6 +3084,7 @@ "{0} files ({1}{2}) are": "pliki ({0}) ({1}{2}) są", "{0} files are left unmerged in it, which git can't stash.": "pliki ({0}) są w nim pozostawione niescalone, których git nie może zapisać w schowku.", "{0} files have conflicts to resolve.": "pliki ({0}) mają konflikty do rozwiązania.", + "{0} files in changelists are left out.": "Pliki z list zmian pomijane: {0}.", "{0} files selected": "wybrane pliki: {0}", "{0} files still contain": "pliki ({0}) wciąż zawierają", "{0} files still have": "pliki ({0}) wciąż mają", @@ -3227,6 +3254,7 @@ "{0} {1}, {2} to decide": "{0} {1}, {2} do decyzji", "{0} {1}.": "{0} {1}.", "{0} · {1} can be merged automatically": "{0} · {1} można scalić automatycznie", + "{0} — a changelist: its files stay out of Stage All and Commit all until you stage them. Click to collapse, Ctrl/Cmd-click to select its files, right-click for its actions.": "{0} — lista zmian: jej pliki są pomijane przez Przygotuj wszystko i Zatwierdź wszystkie, dopóki ich nie przygotujesz. Kliknij, aby zwinąć, Ctrl/Cmd-klik, aby zaznaczyć jej pliki, prawy przycisk, aby zobaczyć jej akcje.", "{0} — click to collapse, ": "{0} — kliknij, aby zwinąć, ", "{0} — continue or abort it first.": "{0} — najpierw kontynuuj albo przerwij.", "{0} — done.": "{0} — zakończone.", @@ -3241,6 +3269,7 @@ "{0}+Enter creates it": "{0}+Enter tworzy to", "{0}, and PR #{1}'s last commit couldn't be fetched: {2}": "{0}, a ostatniego commita PR #{1} nie udało się pobrać: {2}", "{0}, but {1} isn't: {2}": "{0}, ale {1} nie jest: {2}", + "{0}, changelist, {1}": "{0}, lista zmian, {1}", "{0}, plus the commits of {1} already rebased onto it": "{0}, plus commity {1} już zrebase'owane na niego", "{0}, so it was checked out as {1} at its last commit — a push from there can't reach the pull request. {2}": "{0}, więc został aktywowany jako {1} na jego ostatnim commicie — push z tego miejsca nie może trafić do pull requesta. {2}", "{0}, then create a branch to push them.": "{0}, a potem utwórz branch, aby je wypchnąć.", diff --git a/apps/extension/l10n/bundle.l10n.pt-br.json b/apps/extension/l10n/bundle.l10n.pt-br.json index ccbd9072..542cd12c 100644 --- a/apps/extension/l10n/bundle.l10n.pt-br.json +++ b/apps/extension/l10n/bundle.l10n.pt-br.json @@ -69,6 +69,7 @@ "$(check) Committed": "$(check) Commit feito", "$(check) Copied {0}": "$(check) {0} copiado", "$(check) Created & switched to {0}": "$(check) Criado e trocado para {0}", + "$(check) Deleted changelist “{0}” — its files are back in Changes": "$(check) Lista de alterações “{0}” excluída — seus arquivos voltaram para Alterações", "$(check) GitStudio: AI features disabled": "$(check) GitStudio: recursos de IA desativados", "$(check) Nothing to push from {0} — up to date": "$(check) Nada para enviar de {0} — atualizado", "$(check) Nothing to push — up to date": "$(check) Nada para enviar — atualizado", @@ -180,6 +181,7 @@ "1 conflicted file": "1 arquivo com conflito", "1 file": "1 arquivo", "1 file has conflicts to resolve.": "1 arquivo tem conflitos a resolver.", + "1 file in a changelist is left out.": "1 arquivo em uma lista de alterações fica de fora.", "1 file selected": "1 arquivo selecionado", "1 file still contains": "1 arquivo ainda contém", "1 incoming commit to pull": "1 commit recebido para fazer pull", @@ -420,6 +422,7 @@ "Changed Files": "Arquivos Alterados", "Changed files": "Arquivos alterados", "Changed on one side, deleted on the other": "Alterado em um lado, excluído no outro", + "Changelist name": "Nome da lista de alterações", "Changes": "Alterações", "Changes from cherry-pick {0}": "Alterações do cherry-pick {0}", "Changes from worktree {0} ({1}), stashed before removing it": "Alterações do worktree {0} ({1}), guardadas no stash antes de removê-lo", @@ -685,6 +688,7 @@ "Couldn't {0} {1}.": "Não foi possível {0} {1}.", "Couldn't {0} {1}: {2}": "Não foi possível {0} {1}: {2}", "Couldn't {0}: {1}": "Não foi possível {0}: {1}", + "Create": "Criar", "Create Branch": "Criar Branch", "Create Branch Here": "Criar Branch Aqui", "Create Branch Here…": "Criar Branch Aqui…", @@ -730,6 +734,7 @@ "Date": "Data", "DeepSeek-V3 chat & R1 reasoning.": "Chat DeepSeek-V3 e raciocínio R1.", "Delete": "Excluir", + "Delete Changelist": "Excluir Lista de Alterações", "Delete Remote Branch": "Excluir Branch Remoto", "Delete Tag": "Excluir Tag", "Delete branch": "Excluir branch", @@ -833,6 +838,7 @@ "Drop to apply": "Solte para aplicar", "Drop to copy {0}": "Solte para copiar {0}", "Drop to move {0}": "Solte para mover {0}", + "Drop to move {0} to “{1}”": "Solte para mover {0} para “{1}”", "Drop to pop": "Solte para fazer pop", "Drop to stash {0}": "Solte para guardar {0} no stash", "Drop {0}": "Descartar {0}", @@ -862,6 +868,7 @@ "Enable LM Studio's local server (Developer ▸ Start Server), then load a model.": "Ative o servidor local do LM Studio (Developer ▸ Start Server) e depois carregue um modelo.", "Encrypted at rest in GitStudio's own store — not your OS keychain, so it never raises a password prompt. The key stays host-side and is never sent to a webview.": "Criptografado em repouso no próprio armazenamento do GitStudio — não no keychain do seu sistema, então nunca gera um pedido de senha. A chave fica no host e nunca é enviada a uma webview.", "Enter a commit SHA…": "Inserir o SHA de um commit…", + "Enter a name for the changelist.": "Digite um nome para a lista de alterações.", "Errored": "Com erro", "Every check on its latest commit": "Todas as verificações no seu commit mais recente", "Every conflict is resolved, and your stashed changes are in your files. git keeps the stash entry when applying it stops on conflicts, so it is still in your stash list — drop it once you are happy with the result.": "Todos os conflitos estão resolvidos, e suas alterações guardadas estão em seus arquivos. O git mantém a entrada do stash quando aplicá-lo para em conflitos, então ele ainda está na sua lista de stashes — descarte-o quando estiver satisfeito com o resultado.", @@ -893,6 +900,7 @@ "File too large to show ({0}) at {1}.": "Arquivo grande demais para mostrar ({0}) em {1}.", "Files": "Arquivos", "Files changed": "Arquivos alterados", + "Files in a changelist are left out of Stage All and Commit all until you stage them yourself.": "Arquivos em uma lista de alterações ficam fora de Colocar Tudo em Stage e de Commitar todos até você colocá-los em stage.", "Files resolved": "Arquivos resolvidos", "Filter": "Filtro", "Filter branches: {0}": "Filtrar branches: {0}", @@ -1030,6 +1038,7 @@ "GitStudio: couldn't prepare the push — {0}": "GitStudio: não foi possível preparar o push — {0}", "GitStudio: couldn't prune — {0}": "GitStudio: não foi possível limpar — {0}", "GitStudio: couldn't reset {0} to {1}{2}": "GitStudio: não foi possível redefinir {0} para {1}{2}", + "GitStudio: couldn't save the changelists — {0}": "GitStudio: não foi possível salvar as listas de alterações — {0}", "GitStudio: couldn't stage that change — {0}": "GitStudio: não foi possível colocar essa alteração em stage — {0}", "GitStudio: couldn't stage the changes — {0}": "GitStudio: não foi possível colocar as alterações em stage — {0}", "GitStudio: couldn't stash your changes, so nothing ran — {0}": "GitStudio: não foi possível guardar suas alterações no stash, então nada foi executado — {0}", @@ -1048,6 +1057,8 @@ "GitStudio: no worktree this can be done to.": "GitStudio: não há worktree ao qual isso possa ser feito.", "GitStudio: nothing staged, or AI is unavailable.": "GitStudio: nada em stage, ou a IA está indisponível.", "GitStudio: nothing stashed — every file was unticked.": "GitStudio: nada foi guardado no stash — todos os arquivos foram desmarcados.", + "GitStudio: nothing to commit. The only changed file is in a changelist — stage it first to commit it.": "GitStudio: nada para commitar. O único arquivo alterado está em uma lista de alterações — coloque-o em stage primeiro para commitá-lo.", + "GitStudio: nothing to commit. The only changed files are in changelists — stage the ones to commit first.": "GitStudio: nada para commitar. Os únicos arquivos alterados estão em listas de alterações — coloque em stage primeiro os que quer commitar.", "GitStudio: nothing to draft (stage changes first), or AI is unavailable.": "GitStudio: nada para redigir (coloque alterações em stage primeiro), ou a IA está indisponível.", "GitStudio: nothing to stash — the working tree is clean.": "GitStudio: nada para guardar no stash — a árvore de trabalho está limpa.", "GitStudio: open a file in a Git repository to stage lines.": "GitStudio: abra um arquivo em um repositório Git para colocar linhas em stage.", @@ -1327,10 +1338,14 @@ "Move the selected commits down (Alt+Down)": "Mover os commits selecionados para baixo (Alt+Down)", "Move the selected commits up": "Mover os commits selecionados para cima", "Move the selected commits up (Alt+Up)": "Mover os commits selecionados para cima (Alt+Up)", + "Move to Changelist…": "Mover para Lista de Alterações…", "Move to Changes": "Mover para Changes", "Move up": "Mover para cima", "Move up (Alt+Up)": "Mover para cima (Alt+Up)", + "Move {0} Files to Changelist": "Mover {0} Arquivos para Lista de Alterações", "Move {0} out of “{1}”": "Mover {0} para fora de “{1}”", + "Move {0} to Changelist": "Mover {0} para Lista de Alterações", + "Move {0} to Changelist…": "Mover {0} para Lista de Alterações…", "Move {0} to Changes": "Mover {0} para Changes", "Move: take {0} out of the stash, back {1}": "Mover: tira {0} do stash, de volta {1}", "Moved {0} to Changes": "{0} movido para Changes", @@ -1349,6 +1364,10 @@ "New Branch from '": "Novo Branch a partir de '", "New Branch from These Commits": "Novo Branch a partir Destes Commits", "New Branch…": "Novo Branch…", + "New Changelist": "Nova Lista de Alterações", + "New Changelist for {0}": "Nova Lista de Alterações para {0}", + "New Changelist for {0} Files": "Nova Lista de Alterações para {0} Arquivos", + "New Changelist…": "Nova Lista de Alterações…", "New Worktree from '": "Novo Worktree a partir de '", "New Worktree…": "Novo Worktree…", "New branch": "Novo branch", @@ -1791,6 +1810,8 @@ "Removes git's record of the worktree; the folder stays.": "Remove o registro que o git tem do worktree; a pasta permanece.", "Removing…": "Removendo…", "Rename": "Renomear", + "Rename Changelist “{0}”": "Renomear Lista de Alterações “{0}”", + "Rename Changelist…": "Renomear Lista de Alterações…", "Rename branch": "Renomear branch", "Rename branch {0}": "Renomear branch {0}", "Rename it, then check it out.": "Renomeie-o, depois faça checkout dele.", @@ -2054,6 +2075,7 @@ "Stage": "Stage", "Stage All": "Colocar Tudo em Stage", "Stage All Changes": "Colocar Todas as Alterações em Stage", + "Stage All in This Changelist": "Colocar Tudo desta Lista em Stage", "Stage Changes with Ticks": "Colocar Alterações em Stage com Marcações", "Stage Folder": "Colocar Pasta em Stage", "Stage all": "Colocar tudo em stage", @@ -2088,6 +2110,7 @@ "Stash 1 selected file…": "Guardar 1 arquivo selecionado no Stash…", "Stash All Changes": "Guardar Todas as Alterações no Stash", "Stash Everything Staged": "Guardar Tudo em Stage no Stash", + "Stash These Files": "Guardar Estes Arquivos no Stash", "Stash This File": "Guardar Este Arquivo no Stash", "Stash This Folder": "Guardar Esta Pasta no Stash", "Stash all changes…": "Guardar todas as alterações no stash…", @@ -2157,6 +2180,7 @@ "That isn't a stash this app recorded.": "Esse não é um stash que este app registrou.", "That isn't a usable file path.": "Esse não é um caminho de arquivo utilizável.", "That isn't a {0} this app made.": "Esse não é um {0} que este app fez.", + "That name is too long. Keep it under 80 characters.": "Esse nome é longo demais. Use menos de 80 caracteres.", "That path escapes the repository — nothing was changed.": "Esse caminho escapa do repositório — nada foi alterado.", "That puts back only what it changed, and only where nothing has moved since.": "Isso devolve apenas o que foi alterado, e apenas onde nada se moveu desde então.", "That stash is no longer in the list, so nothing was changed.": "Aquele stash não está mais na lista, então nada foi alterado.", @@ -2202,6 +2226,7 @@ "The conflicted files are back to their last committed versions.": "Os arquivos em conflito voltaram para suas últimas versões commitadas.", "The conflicts list: every conflicted file of this {0}, and {1}{2}": "A lista de conflitos: todo arquivo em conflito deste {0}, e {1}{2}", "The current commit": "O commit atual", + "The default changelist": "A lista de alterações padrão", "The dropped commit is back": "O commit descartado voltou", "The file goes back to its committed version. {0}": "O arquivo volta para sua versão commitada. {0}", "The file is deleted. Git has never tracked it, so nothing — not even Undo — can bring it back.": "O arquivo é excluído. O git nunca o rastreou, então nada — nem mesmo Desfazer — pode trazê-lo de volta.", @@ -2276,6 +2301,7 @@ "Their changes return to the Staged group, ready to re-commit.": "As alterações deles voltam para o grupo Staged, prontas para um novo commit.", "Theirs": "Deles", "There are unresolved conflicts — resolve them or cancel first.": "Há conflitos não resolvidos — resolva-os ou cancele antes.", + "There is already a group called “{0}”. Choose another name.": "Já existe um grupo chamado “{0}”. Escolha outro nome.", "There is no '{0}' to reset to — it is not on {1} any more.": "Não há '{0}' para redefinir — ele não está mais em {1}.", "There is no '{0}' to reset to, and {1} couldn't be reached to fetch it.": "Não há '{0}' para redefinir, e não foi possível alcançar {1} para buscá-lo.", "There is no Apply to undo here any more.": "Não há mais nenhum Apply para desfazer aqui.", @@ -3058,6 +3084,7 @@ "{0} files ({1}{2}) are": "{0} arquivos ({1}{2}) estão", "{0} files are left unmerged in it, which git can't stash.": "{0} arquivos ficaram sem mesclar nele, que o git não pode guardar no stash.", "{0} files have conflicts to resolve.": "{0} arquivos têm conflitos a resolver.", + "{0} files in changelists are left out.": "{0} arquivos em listas de alterações ficam de fora.", "{0} files selected": "{0} arquivos selecionados", "{0} files still contain": "{0} arquivos ainda contêm", "{0} files still have": "{0} arquivos ainda têm", @@ -3227,6 +3254,7 @@ "{0} {1}, {2} to decide": "{0} {1}, {2} a decidir", "{0} {1}.": "{0} {1}.", "{0} · {1} can be merged automatically": "{0} · {1} pode(m) ser mesclado(s) automaticamente", + "{0} — a changelist: its files stay out of Stage All and Commit all until you stage them. Click to collapse, Ctrl/Cmd-click to select its files, right-click for its actions.": "{0} — uma lista de alterações: seus arquivos ficam fora de Colocar Tudo em Stage e de Commitar todos até você colocá-los em stage. Clique para recolher, Ctrl/Cmd-clique para selecionar seus arquivos, clique com o botão direito para suas ações.", "{0} — click to collapse, ": "{0} — clique para recolher, ", "{0} — continue or abort it first.": "{0} — continue-o ou aborte-o primeiro.", "{0} — done.": "{0} — concluído.", @@ -3241,6 +3269,7 @@ "{0}+Enter creates it": "{0}+Enter o cria", "{0}, and PR #{1}'s last commit couldn't be fetched: {2}": "{0}, e o último commit da PR #{1} não pôde ser buscado: {2}", "{0}, but {1} isn't: {2}": "{0}, mas {1} não é: {2}", + "{0}, changelist, {1}": "{0}, lista de alterações, {1}", "{0}, plus the commits of {1} already rebased onto it": "{0}, mais os commits de {1} já rebaseados sobre ele", "{0}, so it was checked out as {1} at its last commit — a push from there can't reach the pull request. {2}": "{0}, então teve checkout feito como {1} no último commit dele — um push a partir de lá não pode alcançar a pull request. {2}", "{0}, then create a branch to push them.": "{0}, depois crie um branch para enviá-los por push.", diff --git a/apps/extension/l10n/bundle.l10n.ru.json b/apps/extension/l10n/bundle.l10n.ru.json index c17f75ad..660f28ee 100644 --- a/apps/extension/l10n/bundle.l10n.ru.json +++ b/apps/extension/l10n/bundle.l10n.ru.json @@ -69,6 +69,7 @@ "$(check) Committed": "$(check) Закоммичено", "$(check) Copied {0}": "$(check) Скопировано: {0}", "$(check) Created & switched to {0}": "$(check) Создано и переключено на {0}", + "$(check) Deleted changelist “{0}” — its files are back in Changes": "$(check) Список изменений «{0}» удалён — его файлы снова в Изменениях", "$(check) GitStudio: AI features disabled": "$(check) GitStudio: функции AI отключены", "$(check) Nothing to push from {0} — up to date": "$(check) Нечего отправлять из {0} — всё актуально", "$(check) Nothing to push — up to date": "$(check) Нечего отправлять — всё актуально", @@ -180,6 +181,7 @@ "1 conflicted file": "1 файл с конфликтом", "1 file": "1 файл", "1 file has conflicts to resolve.": "В 1 файле есть конфликты для разрешения.", + "1 file in a changelist is left out.": "1 файл в списке изменений не включается.", "1 file selected": "Выбран 1 файл", "1 file still contains": "1 файл всё ещё содержит", "1 incoming commit to pull": "1 входящий коммит для получения", @@ -420,6 +422,7 @@ "Changed Files": "Изменённые файлы", "Changed files": "Изменённые файлы", "Changed on one side, deleted on the other": "Изменено на одной стороне, удалено на другой", + "Changelist name": "Имя списка изменений", "Changes": "Изменения", "Changes from cherry-pick {0}": "Изменения из cherry-pick {0}", "Changes from worktree {0} ({1}), stashed before removing it": "Изменения из рабочего каталога {0} ({1}), спрятанные перед его удалением", @@ -685,6 +688,7 @@ "Couldn't {0} {1}.": "Не удалось {0} {1}.", "Couldn't {0} {1}: {2}": "Не удалось {0} {1}: {2}", "Couldn't {0}: {1}": "Не удалось {0}: {1}", + "Create": "Создать", "Create Branch": "Создать ветку", "Create Branch Here": "Создать ветку здесь", "Create Branch Here…": "Создать ветку здесь…", @@ -730,6 +734,7 @@ "Date": "Дата", "DeepSeek-V3 chat & R1 reasoning.": "DeepSeek-V3 для чата и R1 для рассуждений.", "Delete": "Удалить", + "Delete Changelist": "Удалить список изменений", "Delete Remote Branch": "Удалить удалённую ветку", "Delete Tag": "Удалить тег", "Delete branch": "Удалить ветку", @@ -833,6 +838,7 @@ "Drop to apply": "Отпустите, чтобы применить", "Drop to copy {0}": "Отпустите, чтобы скопировать {0}", "Drop to move {0}": "Отпустите, чтобы переместить {0}", + "Drop to move {0} to “{1}”": "Отпустите, чтобы переместить {0} в «{1}»", "Drop to pop": "Отпустите, чтобы извлечь", "Drop to stash {0}": "Отпустите, чтобы спрятать {0}", "Drop {0}": "Отбросить {0}", @@ -862,6 +868,7 @@ "Enable LM Studio's local server (Developer ▸ Start Server), then load a model.": "Включите локальный сервер LM Studio (Developer ▸ Start Server), затем загрузите модель.", "Encrypted at rest in GitStudio's own store — not your OS keychain, so it never raises a password prompt. The key stays host-side and is never sent to a webview.": "Зашифровано в собственном хранилище GitStudio — не в брелоке ключей ОС, поэтому запрос пароля никогда не появляется. Ключ остаётся на стороне хоста и никогда не отправляется в webview.", "Enter a commit SHA…": "Ввести SHA коммита…", + "Enter a name for the changelist.": "Введите имя списка изменений.", "Errored": "Ошибка", "Every check on its latest commit": "Каждая проверка на его последнем коммите", "Every conflict is resolved, and your stashed changes are in your files. git keeps the stash entry when applying it stops on conflicts, so it is still in your stash list — drop it once you are happy with the result.": "Все конфликты разрешены, и ваши спрятанные изменения теперь в файлах. git сохраняет запись тайника, когда его применение останавливается на конфликтах, поэтому он всё ещё в списке тайников — отбросьте его, когда будете довольны результатом.", @@ -893,6 +900,7 @@ "File too large to show ({0}) at {1}.": "Файл слишком большой для показа ({0}) в {1}.", "Files": "Файлы", "Files changed": "Изменённые файлы", + "Files in a changelist are left out of Stage All and Commit all until you stage them yourself.": "Файлы в списке изменений не затрагиваются командами «Добавить всё в индекс» и «Закоммитить все», пока вы сами не добавите их в индекс.", "Files resolved": "Файлы разрешены", "Filter": "Фильтр", "Filter branches: {0}": "Фильтр веток: {0}", @@ -1030,6 +1038,7 @@ "GitStudio: couldn't prepare the push — {0}": "GitStudio: не удалось подготовить отправку — {0}", "GitStudio: couldn't prune — {0}": "GitStudio: не удалось выполнить очистку — {0}", "GitStudio: couldn't reset {0} to {1}{2}": "GitStudio: не удалось сбросить {0} на {1}{2}", + "GitStudio: couldn't save the changelists — {0}": "GitStudio: не удалось сохранить списки изменений — {0}", "GitStudio: couldn't stage that change — {0}": "GitStudio: не удалось добавить это изменение в индекс — {0}", "GitStudio: couldn't stage the changes — {0}": "GitStudio: не удалось добавить изменения в индекс — {0}", "GitStudio: couldn't stash your changes, so nothing ran — {0}": "GitStudio: не удалось спрятать ваши изменения, поэтому ничего не выполнено — {0}", @@ -1048,6 +1057,8 @@ "GitStudio: no worktree this can be done to.": "GitStudio: нет рабочего каталога, к которому это можно применить.", "GitStudio: nothing staged, or AI is unavailable.": "GitStudio: ничего не в индексе, либо AI недоступен.", "GitStudio: nothing stashed — every file was unticked.": "GitStudio: ничего не спрятано — все файлы были сняты с отметки.", + "GitStudio: nothing to commit. The only changed file is in a changelist — stage it first to commit it.": "GitStudio: нечего коммитить. Единственный изменённый файл находится в списке изменений — сначала добавьте его в индекс, чтобы закоммитить.", + "GitStudio: nothing to commit. The only changed files are in changelists — stage the ones to commit first.": "GitStudio: нечего коммитить. Все изменённые файлы находятся в списках изменений — сначала добавьте в индекс те, что нужно закоммитить.", "GitStudio: nothing to draft (stage changes first), or AI is unavailable.": "GitStudio: нечего составлять (сначала добавьте изменения в индекс), либо AI недоступен.", "GitStudio: nothing to stash — the working tree is clean.": "GitStudio: нечего прятать — рабочее дерево чистое.", "GitStudio: open a file in a Git repository to stage lines.": "GitStudio: откройте файл в Git-репозитории, чтобы добавлять строки в индекс.", @@ -1327,10 +1338,14 @@ "Move the selected commits down (Alt+Down)": "Переместить выбранные коммиты вниз (Alt+Down)", "Move the selected commits up": "Переместить выбранные коммиты вверх", "Move the selected commits up (Alt+Up)": "Переместить выбранные коммиты вверх (Alt+Up)", + "Move to Changelist…": "Переместить в список изменений…", "Move to Changes": "Переместить в «Изменения»", "Move up": "Переместить вверх", "Move up (Alt+Up)": "Переместить вверх (Alt+Up)", + "Move {0} Files to Changelist": "Переместить файлы ({0}) в список изменений", "Move {0} out of “{1}”": "Переместить {0} из «{1}»", + "Move {0} to Changelist": "Переместить {0} в список изменений", + "Move {0} to Changelist…": "Переместить {0} в список изменений…", "Move {0} to Changes": "Переместить {0} в «Изменения»", "Move: take {0} out of the stash, back {1}": "Переместить: взять {0} из тайника обратно {1}", "Moved {0} to Changes": "{0} перемещено в «Изменения»", @@ -1349,6 +1364,10 @@ "New Branch from '": "Новая ветка из '", "New Branch from These Commits": "Новая ветка из этих коммитов", "New Branch…": "Новая ветка…", + "New Changelist": "Новый список изменений", + "New Changelist for {0}": "Новый список изменений для {0}", + "New Changelist for {0} Files": "Новый список изменений для файлов ({0})", + "New Changelist…": "Новый список изменений…", "New Worktree from '": "Новый рабочий каталог из '", "New Worktree…": "Новый рабочий каталог…", "New branch": "Новая ветка", @@ -1791,6 +1810,8 @@ "Removes git's record of the worktree; the folder stays.": "Удаляет запись git о рабочем каталоге; папка остаётся.", "Removing…": "Удаление…", "Rename": "Переименовать", + "Rename Changelist “{0}”": "Переименовать список изменений «{0}»", + "Rename Changelist…": "Переименовать список изменений…", "Rename branch": "Переименовать ветку", "Rename branch {0}": "Переименовать ветку {0}", "Rename it, then check it out.": "Переименуйте её, затем переключитесь на неё.", @@ -2054,6 +2075,7 @@ "Stage": "Добавить в индекс", "Stage All": "Добавить всё в индекс", "Stage All Changes": "Добавить все изменения в индекс", + "Stage All in This Changelist": "Добавить в индекс всё из этого списка", "Stage Changes with Ticks": "Добавлять изменения в индекс отметками", "Stage Folder": "Добавить папку в индекс", "Stage all": "Добавить всё в индекс", @@ -2088,6 +2110,7 @@ "Stash 1 selected file…": "Спрятать 1 выбранный файл…", "Stash All Changes": "Спрятать все изменения", "Stash Everything Staged": "Спрятать всё, что в индексе", + "Stash These Files": "Спрятать эти файлы", "Stash This File": "Спрятать этот файл", "Stash This Folder": "Спрятать эту папку", "Stash all changes…": "Спрятать все изменения…", @@ -2157,6 +2180,7 @@ "That isn't a stash this app recorded.": "Это не тайник, записанный этим приложением.", "That isn't a usable file path.": "Это не подходящий путь к файлу.", "That isn't a {0} this app made.": "Это не {0}, сделанное этим приложением.", + "That name is too long. Keep it under 80 characters.": "Слишком длинное имя. Используйте не более 80 символов.", "That path escapes the repository — nothing was changed.": "Этот путь выходит за пределы репозитория — ничего не изменено.", "That puts back only what it changed, and only where nothing has moved since.": "Это вернёт только то, что было изменено, и только там, где с тех пор ничего не сдвинулось.", "That stash is no longer in the list, so nothing was changed.": "Этого тайника больше нет в списке, поэтому ничего не изменено.", @@ -2202,6 +2226,7 @@ "The conflicted files are back to their last committed versions.": "Конфликтующие файлы возвращены к последним закоммиченным версиям.", "The conflicts list: every conflicted file of this {0}, and {1}{2}": "Список конфликтов: каждый конфликтующий файл этого {0}, и {1}{2}", "The current commit": "Текущий коммит", + "The default changelist": "Список изменений по умолчанию", "The dropped commit is back": "Отброшенный коммит возвращён", "The file goes back to its committed version. {0}": "Файл возвращается к закоммиченной версии. {0}", "The file is deleted. Git has never tracked it, so nothing — not even Undo — can bring it back.": "Файл удалён. Git никогда его не отслеживал, поэтому ничто — даже Отмена — не вернёт его.", @@ -2276,6 +2301,7 @@ "Their changes return to the Staged group, ready to re-commit.": "Их изменения возвращаются в группу «В индексе», готовые к повторному коммиту.", "Theirs": "Их", "There are unresolved conflicts — resolve them or cancel first.": "Есть неразрешённые конфликты — сначала разрешите их или отмените.", + "There is already a group called “{0}”. Choose another name.": "Группа «{0}» уже существует. Выберите другое имя.", "There is no '{0}' to reset to — it is not on {1} any more.": "Нет '{0}', на который можно сбросить — его больше нет на {1}.", "There is no '{0}' to reset to, and {1} couldn't be reached to fetch it.": "Нет '{0}', на который можно сбросить, а связаться с {1}, чтобы его получить, не удалось.", "There is no Apply to undo here any more.": "Здесь больше нет «Применить» для отмены.", @@ -3058,6 +3084,7 @@ "{0} files ({1}{2}) are": "{0} файлов ({1}{2})", "{0} files are left unmerged in it, which git can't stash.": "В нём остались {0} неслитых файлов, которые git не может спрятать.", "{0} files have conflicts to resolve.": "В {0} файлах есть конфликты для разрешения.", + "{0} files in changelists are left out.": "Файлы в списках изменений не включаются: {0}.", "{0} files selected": "Выбрано {0} файлов", "{0} files still contain": "{0} файлов всё ещё содержат", "{0} files still have": "{0} файлов всё ещё имеют", @@ -3227,6 +3254,7 @@ "{0} {1}, {2} to decide": "{0} {1}, {2} ещё решить", "{0} {1}.": "{0} {1}.", "{0} · {1} can be merged automatically": "{0} · {1} можно слить автоматически", + "{0} — a changelist: its files stay out of Stage All and Commit all until you stage them. Click to collapse, Ctrl/Cmd-click to select its files, right-click for its actions.": "{0} — список изменений: его файлы не затрагиваются командами «Добавить всё в индекс» и «Закоммитить все», пока вы не добавите их в индекс. Нажмите, чтобы свернуть, Ctrl/Cmd+щелчок — выбрать его файлы, правый щелчок — его действия.", "{0} — click to collapse, ": "{0} — нажмите, чтобы свернуть, ", "{0} — continue or abort it first.": "{0} — сначала продолжите или прервите.", "{0} — done.": "{0} — готово.", @@ -3241,6 +3269,7 @@ "{0}+Enter creates it": "{0}+Enter создаёт его", "{0}, and PR #{1}'s last commit couldn't be fetched: {2}": "{0}, и последний коммит PR #{1} не удалось получить: {2}", "{0}, but {1} isn't: {2}": "{0}, но {1} — нет: {2}", + "{0}, changelist, {1}": "{0}, список изменений, {1}", "{0}, plus the commits of {1} already rebased onto it": "{0}, плюс коммиты {1}, уже перебазированные на неё", "{0}, so it was checked out as {1} at its last commit — a push from there can't reach the pull request. {2}": "{0}, поэтому она была извлечена как {1} на последнем коммите — отправка оттуда не достигнет pull request. {2}", "{0}, then create a branch to push them.": "{0}, затем создайте ветку, чтобы отправить их.", diff --git a/apps/extension/l10n/bundle.l10n.tr.json b/apps/extension/l10n/bundle.l10n.tr.json index b9543085..f1886283 100644 --- a/apps/extension/l10n/bundle.l10n.tr.json +++ b/apps/extension/l10n/bundle.l10n.tr.json @@ -69,6 +69,7 @@ "$(check) Committed": "$(check) İşlendi", "$(check) Copied {0}": "$(check) {0} kopyalandı", "$(check) Created & switched to {0}": "$(check) Oluşturuldu ve {0}'a geçildi", + "$(check) Deleted changelist “{0}” — its files are back in Changes": "$(check) “{0}” değişiklik listesi silindi — dosyaları yeniden Değişiklikler'de", "$(check) GitStudio: AI features disabled": "$(check) GitStudio: Yapay zeka özellikleri devre dışı", "$(check) Nothing to push from {0} — up to date": "$(check) {0}'dan gönderilecek bir şey yok — güncel", "$(check) Nothing to push — up to date": "$(check) Gönderilecek bir şey yok — güncel", @@ -180,6 +181,7 @@ "1 conflicted file": "1 çakışan dosya", "1 file": "1 dosya", "1 file has conflicts to resolve.": "1 dosyada çözülecek çakışma var.", + "1 file in a changelist is left out.": "Bir değişiklik listesindeki 1 dosya dışarıda bırakıldı.", "1 file selected": "1 dosya seçildi", "1 file still contains": "1 dosya hâlâ içeriyor", "1 incoming commit to pull": "çekilecek 1 gelen işleme", @@ -420,6 +422,7 @@ "Changed Files": "Değiştirilen Dosyalar", "Changed files": "Değiştirilen dosyalar", "Changed on one side, deleted on the other": "Bir tarafta değişti, diğerinde silindi", + "Changelist name": "Değişiklik listesi adı", "Changes": "Değişiklikler", "Changes from cherry-pick {0}": "{0} seç-al'ından değişiklikler", "Changes from worktree {0} ({1}), stashed before removing it": "{0} ({1}) çalışma alanından, kaldırılmadan önce zulalanan değişiklikler", @@ -685,6 +688,7 @@ "Couldn't {0} {1}.": "{0} {1} yapılamadı.", "Couldn't {0} {1}: {2}": "{0} {1} yapılamadı: {2}", "Couldn't {0}: {1}": "{0} yapılamadı: {1}", + "Create": "Oluştur", "Create Branch": "Dal Oluştur", "Create Branch Here": "Buradan Dal Oluştur", "Create Branch Here…": "Buradan Dal Oluştur…", @@ -730,6 +734,7 @@ "Date": "Tarih", "DeepSeek-V3 chat & R1 reasoning.": "DeepSeek-V3 sohbet ve R1 akıl yürütme.", "Delete": "Sil", + "Delete Changelist": "Değişiklik Listesini Sil", "Delete Remote Branch": "Uzak Dalı Sil", "Delete Tag": "Etiketi Sil", "Delete branch": "Dalı sil", @@ -833,6 +838,7 @@ "Drop to apply": "Uygulamak için sürükleyip bırakın", "Drop to copy {0}": "{0}'ı kopyalamak için sürükleyip bırakın", "Drop to move {0}": "{0}'ı taşımak için sürükleyip bırakın", + "Drop to move {0} to “{1}”": "{0} öğesini “{1}” listesine taşımak için bırakın", "Drop to pop": "Çıkarmak için sürükleyip bırakın", "Drop to stash {0}": "{0}'ı zulalamak için sürükleyip bırakın", "Drop {0}": "{0}'ı Düşür", @@ -862,6 +868,7 @@ "Enable LM Studio's local server (Developer ▸ Start Server), then load a model.": "LM Studio'nun yerel sunucusunu etkinleştirin (Developer ▸ Start Server), sonra bir model yükleyin.", "Encrypted at rest in GitStudio's own store — not your OS keychain, so it never raises a password prompt. The key stays host-side and is never sent to a webview.": "GitStudio'nun kendi deposunda bekleme sırasında şifrelenir — işletim sisteminizin anahtarlığında değil, bu nedenle hiçbir zaman bir parola istemi çıkarmaz. Anahtar host tarafında kalır ve bir web görünümüne asla gönderilmez.", "Enter a commit SHA…": "Bir işleme SHA'sı girin…", + "Enter a name for the changelist.": "Değişiklik listesi için bir ad girin.", "Errored": "Hata oluştu", "Every check on its latest commit": "En son işlemesindeki her denetim", "Every conflict is resolved, and your stashed changes are in your files. git keeps the stash entry when applying it stops on conflicts, so it is still in your stash list — drop it once you are happy with the result.": "Her çakışma çözüldü ve zulalanmış değişiklikleriniz dosyalarınızda. git, uygularken çakışmalara durduğunda zula kaydını tutar, bu nedenle hâlâ zula listenizde — sonuçtan memnun olunca düşürün.", @@ -893,6 +900,7 @@ "File too large to show ({0}) at {1}.": "{1} konumunda dosya göstermek için çok büyük ({0}).", "Files": "Dosyalar", "Files changed": "Değiştirilen dosyalar", + "Files in a changelist are left out of Stage All and Commit all until you stage them yourself.": "Bir değişiklik listesindeki dosyalar, siz kendiniz hazırlayana kadar Tümünü Hazırla ve tümünü işle dışında kalır.", "Files resolved": "Çözülen dosyalar", "Filter": "Filtrele", "Filter branches: {0}": "Dalları filtrele: {0}", @@ -1030,6 +1038,7 @@ "GitStudio: couldn't prepare the push — {0}": "GitStudio: gönderme hazırlanamadı — {0}", "GitStudio: couldn't prune — {0}": "GitStudio: budama yapılamadı — {0}", "GitStudio: couldn't reset {0} to {1}{2}": "GitStudio: {0}, {1}{2} olarak sıfırlanamadı", + "GitStudio: couldn't save the changelists — {0}": "GitStudio: değişiklik listeleri kaydedilemedi — {0}", "GitStudio: couldn't stage that change — {0}": "GitStudio: bu değişiklik hazırlanamadı — {0}", "GitStudio: couldn't stage the changes — {0}": "GitStudio: değişiklikler hazırlanamadı — {0}", "GitStudio: couldn't stash your changes, so nothing ran — {0}": "GitStudio: değişiklikleriniz zulalanamadı, bu nedenle hiçbir şey çalıştırılmadı — {0}", @@ -1048,6 +1057,8 @@ "GitStudio: no worktree this can be done to.": "GitStudio: bunun yapılabileceği bir çalışma alanı yok.", "GitStudio: nothing staged, or AI is unavailable.": "GitStudio: hiçbir şey hazırlanmadı veya yapay zeka kullanılamıyor.", "GitStudio: nothing stashed — every file was unticked.": "GitStudio: hiçbir şey zulalanmadı — her dosyanın işareti kaldırıldı.", + "GitStudio: nothing to commit. The only changed file is in a changelist — stage it first to commit it.": "GitStudio: işlenecek bir şey yok. Değişen tek dosya bir değişiklik listesinde — işlemek için önce hazırlayın.", + "GitStudio: nothing to commit. The only changed files are in changelists — stage the ones to commit first.": "GitStudio: işlenecek bir şey yok. Değişen dosyaların hepsi değişiklik listelerinde — önce işlemek istediklerinizi hazırlayın.", "GitStudio: nothing to draft (stage changes first), or AI is unavailable.": "GitStudio: taslak oluşturulacak bir şey yok (önce değişiklikleri hazırlayın) veya yapay zeka kullanılamıyor.", "GitStudio: nothing to stash — the working tree is clean.": "GitStudio: zulalanacak bir şey yok — çalışma ağacı temiz.", "GitStudio: open a file in a Git repository to stage lines.": "GitStudio: satırları hazırlamak için bir Git deposunda bir dosya açın.", @@ -1327,10 +1338,14 @@ "Move the selected commits down (Alt+Down)": "Seçili işlemeleri aşağı taşı (Alt+Aşağı)", "Move the selected commits up": "Seçili işlemeleri yukarı taşı", "Move the selected commits up (Alt+Up)": "Seçili işlemeleri yukarı taşı (Alt+Yukarı)", + "Move to Changelist…": "Değişiklik Listesine Taşı…", "Move to Changes": "Değişiklikler'e Taşı", "Move up": "Yukarı taşı", "Move up (Alt+Up)": "Yukarı taşı (Alt+Yukarı)", + "Move {0} Files to Changelist": "{0} Dosyayı Değişiklik Listesine Taşı", "Move {0} out of “{1}”": "{0}'ı “{1}”'in dışına taşı", + "Move {0} to Changelist": "{0} öğesini Değişiklik Listesine Taşı", + "Move {0} to Changelist…": "{0} öğesini Değişiklik Listesine Taşı…", "Move {0} to Changes": "{0}'ı Değişiklikler'e Taşı", "Move: take {0} out of the stash, back {1}": "Taşı: {0}'ı zuladan çıkar, {1} geri", "Moved {0} to Changes": "{0}, Değişiklikler'e taşındı", @@ -1349,6 +1364,10 @@ "New Branch from '": "'den Yeni Dal '", "New Branch from These Commits": "Bu İşlemelerden Yeni Dal", "New Branch…": "Yeni Dal…", + "New Changelist": "Yeni Değişiklik Listesi", + "New Changelist for {0}": "{0} için Yeni Değişiklik Listesi", + "New Changelist for {0} Files": "{0} Dosya için Yeni Değişiklik Listesi", + "New Changelist…": "Yeni Değişiklik Listesi…", "New Worktree from '": "'den Yeni Çalışma Alanı '", "New Worktree…": "Yeni Çalışma Alanı…", "New branch": "Yeni dal", @@ -1791,6 +1810,8 @@ "Removes git's record of the worktree; the folder stays.": "Git'in çalışma alanı kaydını kaldırır; klasör kalır.", "Removing…": "Kaldırılıyor…", "Rename": "Yeniden Adlandır", + "Rename Changelist “{0}”": "“{0}” Değişiklik Listesini Yeniden Adlandır", + "Rename Changelist…": "Değişiklik Listesini Yeniden Adlandır…", "Rename branch": "Dalı yeniden adlandır", "Rename branch {0}": "{0} dalını yeniden adlandır", "Rename it, then check it out.": "Yeniden adlandırıp sonra geçişe alın.", @@ -2054,6 +2075,7 @@ "Stage": "Hazırla", "Stage All": "Tümünü Hazırla", "Stage All Changes": "Tüm Değişiklikleri Hazırla", + "Stage All in This Changelist": "Bu Listedeki Tümünü Hazırla", "Stage Changes with Ticks": "İşaretli Değişiklikleri Hazırla", "Stage Folder": "Klasörü Hazırla", "Stage all": "Tümünü hazırla", @@ -2088,6 +2110,7 @@ "Stash 1 selected file…": "Seçili 1 dosyayı zulala…", "Stash All Changes": "Tüm Değişiklikleri Zulala", "Stash Everything Staged": "Hazırlanmış Her Şeyi Zulala", + "Stash These Files": "Bu Dosyaları Zulala", "Stash This File": "Bu Dosyayı Zulala", "Stash This Folder": "Bu Klasörü Zulala", "Stash all changes…": "Tüm değişiklikleri zulala…", @@ -2157,6 +2180,7 @@ "That isn't a stash this app recorded.": "Bu, bu uygulamanın kaydettiği bir zula değil.", "That isn't a usable file path.": "Bu kullanılabilir bir dosya yolu değil.", "That isn't a {0} this app made.": "Bu, bu uygulamanın yaptığı bir {0} değil.", + "That name is too long. Keep it under 80 characters.": "Bu ad çok uzun. 80 karakterin altında tutun.", "That path escapes the repository — nothing was changed.": "O yol deponun dışına çıkıyor — hiçbir şey değişmedi.", "That puts back only what it changed, and only where nothing has moved since.": "Bu yalnızca onun değiştirdiğini geri koyar ve yalnızca o zamandan sonra hiçbir şey taşınmadıysa.", "That stash is no longer in the list, so nothing was changed.": "O zula artık listede değil, bu nedenle hiçbir şey değişmedi.", @@ -2202,6 +2226,7 @@ "The conflicted files are back to their last committed versions.": "Çakışan dosyalar son işlenmiş sürümlerine geri döndü.", "The conflicts list: every conflicted file of this {0}, and {1}{2}": "Çakışma listesi: bu {0}'ın her çakışan dosyası ve {1}{2}", "The current commit": "Geçerli işleme", + "The default changelist": "Varsayılan değişiklik listesi", "The dropped commit is back": "Düşürülen işleme geri geldi", "The file goes back to its committed version. {0}": "Dosya işlenmiş sürümüne geri döner. {0}", "The file is deleted. Git has never tracked it, so nothing — not even Undo — can bring it back.": "Dosya silindi. Git onu hiçbir zaman izlemedi, bu nedenle hiçbir şey — Geri Al dahi — onu geri getiremez.", @@ -2276,6 +2301,7 @@ "Their changes return to the Staged group, ready to re-commit.": "Değişiklikleri, yeniden işlemeye hazır olarak Hazırlanmış grubuna geri döner.", "Theirs": "Onlarınki", "There are unresolved conflicts — resolve them or cancel first.": "Çözülmemiş çakışmalar var — önce çözün veya iptal edin.", + "There is already a group called “{0}”. Choose another name.": "“{0}” adında bir grup zaten var. Başka bir ad seçin.", "There is no '{0}' to reset to — it is not on {1} any more.": "Sıfırlanacak bir '{0}' yok — artık {1}'de değil.", "There is no '{0}' to reset to, and {1} couldn't be reached to fetch it.": "Sıfırlanacak bir '{0}' yok ve onu getirmek için {1}'e erişilemedi.", "There is no Apply to undo here any more.": "Burada geri alınacak bir Uygula artık yok.", @@ -3058,6 +3084,7 @@ "{0} files ({1}{2}) are": "{0} dosya ({1}{2})", "{0} files are left unmerged in it, which git can't stash.": "İçinde {0} dosya birleştirilmemiş kalıyor, bunu git zulalayamaz.", "{0} files have conflicts to resolve.": "{0} dosyada çözülecek çakışma var.", + "{0} files in changelists are left out.": "Değişiklik listelerindeki {0} dosya dışarıda bırakıldı.", "{0} files selected": "{0} dosya seçildi", "{0} files still contain": "{0} dosya hâlâ içeriyor", "{0} files still have": "{0} dosyada hâlâ var", @@ -3227,6 +3254,7 @@ "{0} {1}, {2} to decide": "{0} {1}, kararlaştırılacak {2}", "{0} {1}.": "{0} {1}.", "{0} · {1} can be merged automatically": "{0} · {1} otomatik olarak birleştirilebilir", + "{0} — a changelist: its files stay out of Stage All and Commit all until you stage them. Click to collapse, Ctrl/Cmd-click to select its files, right-click for its actions.": "{0} — bir değişiklik listesi: dosyaları, siz hazırlayana kadar Tümünü Hazırla ve tümünü işle dışında kalır. Daraltmak için tıklayın, dosyalarını seçmek için Ctrl/Cmd-tıklayın, eylemleri için sağ tıklayın.", "{0} — click to collapse, ": "{0} — daraltmak için tıklayın, ", "{0} — continue or abort it first.": "{0} — önce sürdürün veya iptal edin.", "{0} — done.": "{0} — tamamlandı.", @@ -3241,6 +3269,7 @@ "{0}+Enter creates it": "{0}+Enter oluşturur", "{0}, and PR #{1}'s last commit couldn't be fetched: {2}": "{0} ve PR #{1}'in son işlemesi getirilemedi: {2}", "{0}, but {1} isn't: {2}": "{0}, ancak {1} değil: {2}", + "{0}, changelist, {1}": "{0}, değişiklik listesi, {1}", "{0}, plus the commits of {1} already rebased onto it": "{0}, artı {1}'in zaten onun üzerine yeniden temellendirilmiş işlemeleri", "{0}, so it was checked out as {1} at its last commit — a push from there can't reach the pull request. {2}": "{0}, bu nedenle son işlemesinde {1} olarak geçişe alındı — oradan bir gönderme çekme isteğine ulaşamaz. {2}", "{0}, then create a branch to push them.": "{0}, sonra onları göndermek için bir dal oluşturun.", diff --git a/apps/extension/l10n/bundle.l10n.zh-cn.json b/apps/extension/l10n/bundle.l10n.zh-cn.json index a5cbd3b1..c52217a8 100644 --- a/apps/extension/l10n/bundle.l10n.zh-cn.json +++ b/apps/extension/l10n/bundle.l10n.zh-cn.json @@ -69,6 +69,7 @@ "$(check) Committed": "$(check) 已提交", "$(check) Copied {0}": "$(check) 已复制 {0}", "$(check) Created & switched to {0}": "$(check) 已创建并切换到 {0}", + "$(check) Deleted changelist “{0}” — its files are back in Changes": "$(check) 已删除更改列表“{0}” — 其中的文件已回到“更改”", "$(check) GitStudio: AI features disabled": "$(check) GitStudio:AI 功能已禁用", "$(check) Nothing to push from {0} — up to date": "$(check) {0} 没有需要推送的内容 — 已是最新", "$(check) Nothing to push — up to date": "$(check) 没有需要推送的内容 — 已是最新", @@ -180,6 +181,7 @@ "1 conflicted file": "1 个有冲突的文件", "1 file": "1 个文件", "1 file has conflicts to resolve.": "1 个文件有冲突需要解决。", + "1 file in a changelist is left out.": "更改列表中的 1 个文件未包含在内。", "1 file selected": "已选择 1 个文件", "1 file still contains": "1 个文件仍包含", "1 incoming commit to pull": "1 个待拉取的提交", @@ -420,6 +422,7 @@ "Changed Files": "已更改的文件", "Changed files": "已更改的文件", "Changed on one side, deleted on the other": "一侧修改,另一侧删除", + "Changelist name": "更改列表名称", "Changes": "更改", "Changes from cherry-pick {0}": "来自拣选 {0} 的更改", "Changes from worktree {0} ({1}), stashed before removing it": "来自工作树 {0}({1})的更改,在移除前已贮藏", @@ -685,6 +688,7 @@ "Couldn't {0} {1}.": "无法{0} {1}。", "Couldn't {0} {1}: {2}": "无法{0} {1}:{2}", "Couldn't {0}: {1}": "无法{0}:{1}", + "Create": "创建", "Create Branch": "创建分支", "Create Branch Here": "在此创建分支", "Create Branch Here…": "在此创建分支…", @@ -730,6 +734,7 @@ "Date": "日期", "DeepSeek-V3 chat & R1 reasoning.": "DeepSeek-V3 对话与 R1 推理。", "Delete": "删除", + "Delete Changelist": "删除更改列表", "Delete Remote Branch": "删除远程分支", "Delete Tag": "删除标签", "Delete branch": "删除分支", @@ -833,6 +838,7 @@ "Drop to apply": "拖放以应用", "Drop to copy {0}": "拖到此处以复制 {0}", "Drop to move {0}": "拖到此处以移动 {0}", + "Drop to move {0} to “{1}”": "拖到此处将 {0} 移到“{1}”", "Drop to pop": "拖放以弹出", "Drop to stash {0}": "拖到此处贮藏 {0}", "Drop {0}": "丢弃 {0}", @@ -862,6 +868,7 @@ "Enable LM Studio's local server (Developer ▸ Start Server), then load a model.": "请启用 LM Studio 的本地服务器(Developer ▸ Start Server),然后加载模型。", "Encrypted at rest in GitStudio's own store — not your OS keychain, so it never raises a password prompt. The key stays host-side and is never sent to a webview.": "静态加密存储在 GitStudio 自己的存储中 — 不是你的操作系统钥匙串,因此绝不会弹出密码提示。密钥保留在宿主侧,绝不会发送到 webview。", "Enter a commit SHA…": "输入提交 SHA…", + "Enter a name for the changelist.": "请输入更改列表的名称。", "Errored": "出错", "Every check on its latest commit": "每项检查都在其最新提交上", "Every conflict is resolved, and your stashed changes are in your files. git keeps the stash entry when applying it stops on conflicts, so it is still in your stash list — drop it once you are happy with the result.": "每个冲突都已解决,你贮藏的更改已在文件中。在应用时遇到冲突而停下,git 会保留贮藏条目,所以它仍在贮藏列表中 — 满意后即可丢弃它。", @@ -893,6 +900,7 @@ "File too large to show ({0}) at {1}.": "文件过大,无法显示({0})于 {1}。", "Files": "文件", "Files changed": "已更改的文件", + "Files in a changelist are left out of Stage All and Commit all until you stage them yourself.": "更改列表中的文件不参与“全部暂存”和“全部提交”,除非你自己暂存它们。", "Files resolved": "已解决的文件", "Filter": "筛选", "Filter branches: {0}": "筛选分支:{0}", @@ -1030,6 +1038,7 @@ "GitStudio: couldn't prepare the push — {0}": "GitStudio: 无法准备推送 — {0}", "GitStudio: couldn't prune — {0}": "GitStudio: 无法清理 — {0}", "GitStudio: couldn't reset {0} to {1}{2}": "GitStudio: 无法将 {0} 重置为 {1}{2}", + "GitStudio: couldn't save the changelists — {0}": "GitStudio: 无法保存更改列表 — {0}", "GitStudio: couldn't stage that change — {0}": "GitStudio: 无法暂存该更改 — {0}", "GitStudio: couldn't stage the changes — {0}": "GitStudio: 无法暂存这些更改 — {0}", "GitStudio: couldn't stash your changes, so nothing ran — {0}": "GitStudio: 无法贮藏你的更改,因此未执行任何操作 — {0}", @@ -1048,6 +1057,8 @@ "GitStudio: no worktree this can be done to.": "GitStudio: 没有可执行此操作的工作树。", "GitStudio: nothing staged, or AI is unavailable.": "GitStudio: 没有已暂存的内容,或 AI 不可用。", "GitStudio: nothing stashed — every file was unticked.": "GitStudio: 没有贮藏任何内容 — 所有文件都未勾选。", + "GitStudio: nothing to commit. The only changed file is in a changelist — stage it first to commit it.": "GitStudio: 没有可提交的内容。唯一已更改的文件在更改列表中 — 请先暂存它再提交。", + "GitStudio: nothing to commit. The only changed files are in changelists — stage the ones to commit first.": "GitStudio: 没有可提交的内容。已更改的文件都在更改列表中 — 请先暂存要提交的文件。", "GitStudio: nothing to draft (stage changes first), or AI is unavailable.": "GitStudio: 没有可起草的内容(请先暂存更改),或 AI 不可用。", "GitStudio: nothing to stash — the working tree is clean.": "GitStudio: 没有可贮藏的内容 — 工作树是干净的。", "GitStudio: open a file in a Git repository to stage lines.": "GitStudio: 请打开 Git 仓库中的文件以暂存行。", @@ -1327,10 +1338,14 @@ "Move the selected commits down (Alt+Down)": "下移选中的提交(Alt+Down)", "Move the selected commits up": "上移选中的提交", "Move the selected commits up (Alt+Up)": "上移选中的提交(Alt+Up)", + "Move to Changelist…": "移到更改列表…", "Move to Changes": "移到更改", "Move up": "上移", "Move up (Alt+Up)": "上移(Alt+Up)", + "Move {0} Files to Changelist": "将 {0} 个文件移到更改列表", "Move {0} out of “{1}”": "将 {0} 移出“{1}”", + "Move {0} to Changelist": "将 {0} 移到更改列表", + "Move {0} to Changelist…": "将 {0} 移到更改列表…", "Move {0} to Changes": "将 {0} 移动到“更改”", "Move: take {0} out of the stash, back {1}": "移动:将 {0} 从贮藏中取出,放回 {1}", "Moved {0} to Changes": "已将 {0} 移到更改", @@ -1349,6 +1364,10 @@ "New Branch from '": "新建分支,起点为 '", "New Branch from These Commits": "从这些提交新建分支", "New Branch…": "新建分支…", + "New Changelist": "新建更改列表", + "New Changelist for {0}": "为 {0} 新建更改列表", + "New Changelist for {0} Files": "为 {0} 个文件新建更改列表", + "New Changelist…": "新建更改列表…", "New Worktree from '": "新建工作树,起点为 '", "New Worktree…": "新建工作树…", "New branch": "新建分支", @@ -1791,6 +1810,8 @@ "Removes git's record of the worktree; the folder stays.": "删除 git 对该工作树的记录;文件夹会保留。", "Removing…": "正在移除…", "Rename": "重命名", + "Rename Changelist “{0}”": "重命名更改列表“{0}”", + "Rename Changelist…": "重命名更改列表…", "Rename branch": "重命名分支", "Rename branch {0}": "重命名分支 {0}", "Rename it, then check it out.": "请重命名,然后检出。", @@ -2054,6 +2075,7 @@ "Stage": "暂存", "Stage All": "全部暂存", "Stage All Changes": "暂存所有更改", + "Stage All in This Changelist": "全部暂存此更改列表", "Stage Changes with Ticks": "用勾选标记暂存更改", "Stage Folder": "暂存文件夹", "Stage all": "全部暂存", @@ -2088,6 +2110,7 @@ "Stash 1 selected file…": "贮藏 1 个所选文件…", "Stash All Changes": "贮藏所有更改", "Stash Everything Staged": "贮藏所有已暂存内容", + "Stash These Files": "贮藏这些文件", "Stash This File": "贮藏此文件", "Stash This Folder": "贮藏此文件夹", "Stash all changes…": "贮藏所有更改…", @@ -2157,6 +2180,7 @@ "That isn't a stash this app recorded.": "这不是本应用记录的贮藏。", "That isn't a usable file path.": "这不是可用的文件路径。", "That isn't a {0} this app made.": "这不是本应用执行的{0}。", + "That name is too long. Keep it under 80 characters.": "名称太长。请少于 80 个字符。", "That path escapes the repository — nothing was changed.": "该路径超出了仓库范围 — 未做任何更改。", "That puts back only what it changed, and only where nothing has moved since.": "这样只会恢复它改动过的部分,而且仅限于之后没有变动的位置。", "That stash is no longer in the list, so nothing was changed.": "该贮藏已不在列表中,因此未做任何更改。", @@ -2202,6 +2226,7 @@ "The conflicted files are back to their last committed versions.": "冲突文件已恢复为它们最后一次提交的版本。", "The conflicts list: every conflicted file of this {0}, and {1}{2}": "冲突列表:此 {0} 的每个冲突文件,以及 {1}{2}", "The current commit": "当前提交", + "The default changelist": "默认更改列表", "The dropped commit is back": "被丢弃的提交已恢复", "The file goes back to its committed version. {0}": "该文件会恢复为其已提交的版本。{0}", "The file is deleted. Git has never tracked it, so nothing — not even Undo — can bring it back.": "该文件将被删除。Git 从未跟踪过它,所以任何东西 — 甚至撤销 — 都无法把它找回来。", @@ -2276,6 +2301,7 @@ "Their changes return to the Staged group, ready to re-commit.": "他们的更改会回到“已暂存”分组,可以重新提交。", "Theirs": "对方的", "There are unresolved conflicts — resolve them or cancel first.": "还有未解决的冲突 — 请先解决它们或取消。", + "There is already a group called “{0}”. Choose another name.": "已有名为“{0}”的分组。请换一个名称。", "There is no '{0}' to reset to — it is not on {1} any more.": "没有可重置到的 '{0}' — 它已不在 {1} 上。", "There is no '{0}' to reset to, and {1} couldn't be reached to fetch it.": "没有可重置到的 '{0}',且无法访问 {1} 来获取它。", "There is no Apply to undo here any more.": "这里已经没有可撤销的应用了。", @@ -3058,6 +3084,7 @@ "{0} files ({1}{2}) are": "{0} 个文件({1}{2})是", "{0} files are left unmerged in it, which git can't stash.": "其中有 {0} 个文件未合并,git 无法贮藏。", "{0} files have conflicts to resolve.": "{0} 个文件有冲突需要解决。", + "{0} files in changelists are left out.": "更改列表中的 {0} 个文件未包含在内。", "{0} files selected": "已选择 {0} 个文件", "{0} files still contain": "{0} 个文件仍包含", "{0} files still have": "{0} 个文件仍有", @@ -3227,6 +3254,7 @@ "{0} {1}, {2} to decide": "{0} {1},{2} 待决定", "{0} {1}.": "{0} {1}。", "{0} · {1} can be merged automatically": "{0} · {1} 可以自动合并", + "{0} — a changelist: its files stay out of Stage All and Commit all until you stage them. Click to collapse, Ctrl/Cmd-click to select its files, right-click for its actions.": "{0} — 更改列表:在你暂存之前,其中的文件不参与“全部暂存”和“全部提交”。点击折叠,Ctrl/Cmd-点击选择其中的文件,右键查看操作。", "{0} — click to collapse, ": "{0} — 点击折叠,", "{0} — continue or abort it first.": "{0} — 请先继续或中止它。", "{0} — done.": "{0} — 已完成。", @@ -3241,6 +3269,7 @@ "{0}+Enter creates it": "{0}+Enter 创建它", "{0}, and PR #{1}'s last commit couldn't be fetched: {2}": "{0},并且无法获取 PR #{1} 的最后一个提交:{2}", "{0}, but {1} isn't: {2}": "{0},但 {1} 不是:{2}", + "{0}, changelist, {1}": "{0},更改列表,{1}", "{0}, plus the commits of {1} already rebased onto it": "{0},再加上已变基到其上的 {1} 的提交", "{0}, so it was checked out as {1} at its last commit — a push from there can't reach the pull request. {2}": "{0},因此以 {1} 在其最后一个提交处检出 — 从那里推送无法到达该拉取请求。{2}", "{0}, then create a branch to push them.": "{0},然后创建一个分支来推送它们。", diff --git a/apps/extension/l10n/bundle.l10n.zh-tw.json b/apps/extension/l10n/bundle.l10n.zh-tw.json index e3dd1ab2..4c77bca6 100644 --- a/apps/extension/l10n/bundle.l10n.zh-tw.json +++ b/apps/extension/l10n/bundle.l10n.zh-tw.json @@ -69,6 +69,7 @@ "$(check) Committed": "$(check) 已提交", "$(check) Copied {0}": "$(check) 已複製 {0}", "$(check) Created & switched to {0}": "$(check) 已建立並切換到 {0}", + "$(check) Deleted changelist “{0}” — its files are back in Changes": "$(check) 已刪除更改清單「{0}」 — 其中的檔案已回到「更改」", "$(check) GitStudio: AI features disabled": "$(check) GitStudio:AI 功能已停用", "$(check) Nothing to push from {0} — up to date": "$(check) {0} 沒有需要推送的內容 — 已是最新", "$(check) Nothing to push — up to date": "$(check) 沒有需要推送的內容 — 已是最新", @@ -180,6 +181,7 @@ "1 conflicted file": "1 個有衝突的檔案", "1 file": "1 個檔案", "1 file has conflicts to resolve.": "1 個檔案有衝突需要解決。", + "1 file in a changelist is left out.": "更改清單中的 1 個檔案未包含在內。", "1 file selected": "已選擇 1 個檔案", "1 file still contains": "1 個檔案仍包含", "1 incoming commit to pull": "1 個待拉取的提交", @@ -420,6 +422,7 @@ "Changed Files": "已更改的檔案", "Changed files": "已更改的檔案", "Changed on one side, deleted on the other": "一側修改,另一側刪除", + "Changelist name": "更改清單名稱", "Changes": "更改", "Changes from cherry-pick {0}": "來自揀選 {0} 的更改", "Changes from worktree {0} ({1}), stashed before removing it": "來自工作樹 {0}({1})的更改,在移除前已儲藏", @@ -685,6 +688,7 @@ "Couldn't {0} {1}.": "無法{0} {1}。", "Couldn't {0} {1}: {2}": "無法{0} {1}:{2}", "Couldn't {0}: {1}": "無法{0}:{1}", + "Create": "建立", "Create Branch": "建立分支", "Create Branch Here": "在此建立分支", "Create Branch Here…": "在此建立分支…", @@ -730,6 +734,7 @@ "Date": "日期", "DeepSeek-V3 chat & R1 reasoning.": "DeepSeek-V3 對話與 R1 推理。", "Delete": "刪除", + "Delete Changelist": "刪除更改清單", "Delete Remote Branch": "刪除遠端分支", "Delete Tag": "刪除標籤", "Delete branch": "刪除分支", @@ -833,6 +838,7 @@ "Drop to apply": "拖放以應用", "Drop to copy {0}": "拖到此處以複製 {0}", "Drop to move {0}": "拖到此處以移動 {0}", + "Drop to move {0} to “{1}”": "拖到此處將 {0} 移到「{1}」", "Drop to pop": "拖放以彈出", "Drop to stash {0}": "拖到此處儲藏 {0}", "Drop {0}": "丟棄 {0}", @@ -862,6 +868,7 @@ "Enable LM Studio's local server (Developer ▸ Start Server), then load a model.": "請啟用 LM Studio 的本地伺服器(Developer ▸ Start Server),然後載入模型。", "Encrypted at rest in GitStudio's own store — not your OS keychain, so it never raises a password prompt. The key stays host-side and is never sent to a webview.": "靜態加密儲存在 GitStudio 自己的儲存中 — 不是你的作業系統鑰匙串,因此絕不會彈出密碼提示。金鑰保留在宿主側,絕不會發送到 webview。", "Enter a commit SHA…": "輸入提交 SHA…", + "Enter a name for the changelist.": "請輸入更改清單的名稱。", "Errored": "出錯", "Every check on its latest commit": "每項檢查都在其最新提交上", "Every conflict is resolved, and your stashed changes are in your files. git keeps the stash entry when applying it stops on conflicts, so it is still in your stash list — drop it once you are happy with the result.": "每個衝突都已解決,你儲藏的更改已在檔案中。在應用時遇到衝突而停下,git 會保留儲藏條目,所以它仍在儲藏列表中 — 滿意後即可丟棄它。", @@ -893,6 +900,7 @@ "File too large to show ({0}) at {1}.": "檔案過大,無法顯示({0})於 {1}。", "Files": "檔案", "Files changed": "已更改的檔案", + "Files in a changelist are left out of Stage All and Commit all until you stage them yourself.": "更改清單中的檔案不參與「全部暫存」和「全部提交」,除非你自己暫存它們。", "Files resolved": "已解決的檔案", "Filter": "篩選", "Filter branches: {0}": "篩選分支:{0}", @@ -1030,6 +1038,7 @@ "GitStudio: couldn't prepare the push — {0}": "GitStudio: 無法準備推送 — {0}", "GitStudio: couldn't prune — {0}": "GitStudio: 無法清理 — {0}", "GitStudio: couldn't reset {0} to {1}{2}": "GitStudio: 無法將 {0} 重置為 {1}{2}", + "GitStudio: couldn't save the changelists — {0}": "GitStudio: 無法儲存更改清單 — {0}", "GitStudio: couldn't stage that change — {0}": "GitStudio: 無法暫存該更改 — {0}", "GitStudio: couldn't stage the changes — {0}": "GitStudio: 無法暫存這些更改 — {0}", "GitStudio: couldn't stash your changes, so nothing ran — {0}": "GitStudio: 無法儲藏你的更改,因此未執行任何操作 — {0}", @@ -1048,6 +1057,8 @@ "GitStudio: no worktree this can be done to.": "GitStudio: 沒有可執行此操作的工作樹。", "GitStudio: nothing staged, or AI is unavailable.": "GitStudio: 沒有已暫存的內容,或 AI 不可用。", "GitStudio: nothing stashed — every file was unticked.": "GitStudio: 沒有儲藏任何內容 — 所有檔案都未勾選。", + "GitStudio: nothing to commit. The only changed file is in a changelist — stage it first to commit it.": "GitStudio: 沒有可提交的內容。唯一已更改的檔案在更改清單中 — 請先暫存它再提交。", + "GitStudio: nothing to commit. The only changed files are in changelists — stage the ones to commit first.": "GitStudio: 沒有可提交的內容。已更改的檔案都在更改清單中 — 請先暫存要提交的檔案。", "GitStudio: nothing to draft (stage changes first), or AI is unavailable.": "GitStudio: 沒有可起草的內容(請先暫存更改),或 AI 不可用。", "GitStudio: nothing to stash — the working tree is clean.": "GitStudio: 沒有可儲藏的內容 — 工作樹是乾淨的。", "GitStudio: open a file in a Git repository to stage lines.": "GitStudio: 請開啟 Git 儲存庫中的檔案以暫存行。", @@ -1327,10 +1338,14 @@ "Move the selected commits down (Alt+Down)": "下移選中的提交(Alt+Down)", "Move the selected commits up": "上移選中的提交", "Move the selected commits up (Alt+Up)": "上移選中的提交(Alt+Up)", + "Move to Changelist…": "移到更改清單…", "Move to Changes": "移到更改", "Move up": "上移", "Move up (Alt+Up)": "上移(Alt+Up)", + "Move {0} Files to Changelist": "將 {0} 個檔案移到更改清單", "Move {0} out of “{1}”": "將 {0} 移出“{1}”", + "Move {0} to Changelist": "將 {0} 移到更改清單", + "Move {0} to Changelist…": "將 {0} 移到更改清單…", "Move {0} to Changes": "將 {0} 移動到“更改”", "Move: take {0} out of the stash, back {1}": "移動:將 {0} 從儲藏中取出,放回 {1}", "Moved {0} to Changes": "已將 {0} 移到更改", @@ -1349,6 +1364,10 @@ "New Branch from '": "新建分支,起點為 '", "New Branch from These Commits": "從這些提交新建分支", "New Branch…": "新建分支…", + "New Changelist": "新增更改清單", + "New Changelist for {0}": "為 {0} 新增更改清單", + "New Changelist for {0} Files": "為 {0} 個檔案新增更改清單", + "New Changelist…": "新增更改清單…", "New Worktree from '": "新建工作樹,起點為 '", "New Worktree…": "新建工作樹…", "New branch": "新建分支", @@ -1791,6 +1810,8 @@ "Removes git's record of the worktree; the folder stays.": "刪除 git 對該工作樹的記錄;資料夾會保留。", "Removing…": "正在移除…", "Rename": "重新命名", + "Rename Changelist “{0}”": "重新命名更改清單「{0}」", + "Rename Changelist…": "重新命名更改清單…", "Rename branch": "重新命名分支", "Rename branch {0}": "重新命名分支 {0}", "Rename it, then check it out.": "請重新命名,然後簽出。", @@ -2054,6 +2075,7 @@ "Stage": "暫存", "Stage All": "全部暫存", "Stage All Changes": "暫存所有更改", + "Stage All in This Changelist": "全部暫存此更改清單", "Stage Changes with Ticks": "用勾選標記暫存更改", "Stage Folder": "暫存資料夾", "Stage all": "全部暫存", @@ -2088,6 +2110,7 @@ "Stash 1 selected file…": "儲藏 1 個所選檔案…", "Stash All Changes": "儲藏所有更改", "Stash Everything Staged": "儲藏所有已暫存內容", + "Stash These Files": "儲藏這些檔案", "Stash This File": "儲藏此檔案", "Stash This Folder": "儲藏此資料夾", "Stash all changes…": "儲藏所有更改…", @@ -2157,6 +2180,7 @@ "That isn't a stash this app recorded.": "這不是本應用記錄的儲藏。", "That isn't a usable file path.": "這不是可用的檔案路徑。", "That isn't a {0} this app made.": "這不是本應用執行的{0}。", + "That name is too long. Keep it under 80 characters.": "名稱太長。請少於 80 個字元。", "That path escapes the repository — nothing was changed.": "該路徑超出了儲存庫範圍 — 未做任何更改。", "That puts back only what it changed, and only where nothing has moved since.": "這樣只會恢復它改動過的部分,而且僅限於之後沒有變動的位置。", "That stash is no longer in the list, so nothing was changed.": "該儲藏已不在列表中,因此未做任何更改。", @@ -2202,6 +2226,7 @@ "The conflicted files are back to their last committed versions.": "衝突檔案已恢復為它們最後一次提交的版本。", "The conflicts list: every conflicted file of this {0}, and {1}{2}": "衝突列表:此 {0} 的每個衝突檔案,以及 {1}{2}", "The current commit": "當前提交", + "The default changelist": "預設更改清單", "The dropped commit is back": "被丟棄的提交已恢復", "The file goes back to its committed version. {0}": "該檔案會恢復為其已提交的版本。{0}", "The file is deleted. Git has never tracked it, so nothing — not even Undo — can bring it back.": "該檔案將被刪除。Git 從未追蹤過它,所以任何東西 — 甚至撤銷 — 都無法把它找回來。", @@ -2276,6 +2301,7 @@ "Their changes return to the Staged group, ready to re-commit.": "他們的更改會回到“已暫存”分組,可以重新提交。", "Theirs": "對方的", "There are unresolved conflicts — resolve them or cancel first.": "還有未解決的衝突 — 請先解決它們或取消。", + "There is already a group called “{0}”. Choose another name.": "已有名為「{0}」的群組。請換一個名稱。", "There is no '{0}' to reset to — it is not on {1} any more.": "沒有可重置到的 '{0}' — 它已不在 {1} 上。", "There is no '{0}' to reset to, and {1} couldn't be reached to fetch it.": "沒有可重置到的 '{0}',且無法存取 {1} 來獲取它。", "There is no Apply to undo here any more.": "這裡已經沒有可撤銷的應用了。", @@ -3058,6 +3084,7 @@ "{0} files ({1}{2}) are": "{0} 個檔案({1}{2})是", "{0} files are left unmerged in it, which git can't stash.": "其中有 {0} 個檔案未合併,git 無法儲藏。", "{0} files have conflicts to resolve.": "{0} 個檔案有衝突需要解決。", + "{0} files in changelists are left out.": "更改清單中的 {0} 個檔案未包含在內。", "{0} files selected": "已選擇 {0} 個檔案", "{0} files still contain": "{0} 個檔案仍包含", "{0} files still have": "{0} 個檔案仍有", @@ -3227,6 +3254,7 @@ "{0} {1}, {2} to decide": "{0} {1},{2} 待決定", "{0} {1}.": "{0} {1}。", "{0} · {1} can be merged automatically": "{0} · {1} 可以自動合併", + "{0} — a changelist: its files stay out of Stage All and Commit all until you stage them. Click to collapse, Ctrl/Cmd-click to select its files, right-click for its actions.": "{0} — 更改清單:在你暫存之前,其中的檔案不參與「全部暫存」和「全部提交」。點選摺疊,Ctrl/Cmd-點選選擇其中的檔案,按右鍵查看操作。", "{0} — click to collapse, ": "{0} — 點選摺疊,", "{0} — continue or abort it first.": "{0} — 請先繼續或中止它。", "{0} — done.": "{0} — 已完成。", @@ -3241,6 +3269,7 @@ "{0}+Enter creates it": "{0}+Enter 建立它", "{0}, and PR #{1}'s last commit couldn't be fetched: {2}": "{0},並且無法獲取 PR #{1} 的最後一個提交:{2}", "{0}, but {1} isn't: {2}": "{0},但 {1} 不是:{2}", + "{0}, changelist, {1}": "{0},更改清單,{1}", "{0}, plus the commits of {1} already rebased onto it": "{0},再加上已變基到其上的 {1} 的提交", "{0}, so it was checked out as {1} at its last commit — a push from there can't reach the pull request. {2}": "{0},因此以 {1} 在其最後一個提交處簽出 — 從那裡推送無法到達該拉取請求。{2}", "{0}, then create a branch to push them.": "{0},然後建立一個分支來推送它們。", diff --git a/apps/extension/src/changes/commitView.ts b/apps/extension/src/changes/commitView.ts index cb9abe7e..4385bb0d 100644 --- a/apps/extension/src/changes/commitView.ts +++ b/apps/extension/src/changes/commitView.ts @@ -38,6 +38,7 @@ import type { Change } from "../git/git"; import { getNonce } from "../webview/html"; import { promptConfirm, + promptInput, promptPick, type DialogHost, type DialogResult, @@ -82,6 +83,18 @@ import { type StashOutcome, } from "../views/stashesView"; import { l10nWebviewScript } from "@gitstudio/l10n/index"; +import { + addChangelist, + changelistNameProblem, + deleteChangelist, + emptyChangelists, + forgetPaths, + isParked, + moveToChangelist, + parkedAmong, + renameChangelist, + type ChangelistState, +} from "@gitstudio/git-service/Changelists"; import { openDiff } from "../merge/diffPlaces"; // The unified Commit window: ONE WebviewView ("Commit", viewId gitstudio.commit) @@ -170,6 +183,17 @@ interface StatePayload { * are none (no group). */ stashes?: StashRow[]; + /** + * The repository's named changelists (#122), in the order they were made. + * The default changelist is implicit (Unstaged / Changes) and not listed. + */ + changelists: { id: string; name: string }[]; + /** + * Which changelist each changed file is parked in — only the changed files + * that are in one. A parked file is left out of Stage All, Commit all and + * Discard All, and is staged only by hand. + */ + parked: Record; } interface FromWebview { @@ -221,6 +245,10 @@ interface FromWebview { | "stashOpenFile" | "stashOpenAll" | "stashReadFiles" + | "moveToChangelist" + | "newChangelist" + | "renameChangelist" + | "deleteChangelist" | "dialogResult"; /** * A full sha: the stash (stashAct, stashFiles, stashOpenFile, stashOpenAll, @@ -273,6 +301,11 @@ interface FromWebview { parent?: string; /** openPushCommitFile: git's letter for what the commit did to the file. */ status?: string; + /** + * A changelist id (moveToChangelist / renameChangelist / deleteChangelist). + * For moveToChangelist, "" is the default changelist and absent means "ask". + */ + list?: string; } /** @@ -976,6 +1009,18 @@ export class CommitViewProvider } break; } + case "moveToChangelist": + await this.doMoveToChangelist(msg.paths ?? [], msg.list); + return; + case "newChangelist": + await this.doNewChangelist(msg.paths ?? []); + return; + case "renameChangelist": + await this.doRenameChangelist(msg.list ?? ""); + return; + case "deleteChangelist": + await this.doDeleteChangelist(msg.list ?? ""); + return; case "setStagingModel": { // Persisted as a real setting, so the choice survives a reload and stays // editable from Settings — the toggle is a shortcut to it, not a @@ -1012,6 +1057,227 @@ export class CommitViewProvider } } + // ── Changelists (#122) ───────────────────────────────────────────────────── + // + // Named groups a working-tree file can be parked in, so the "everything" + // actions leave it alone. GitStudio's own bookkeeping, kept in the git-dir + // (git-service/Changelists): nothing here touches the index or a file. + + /** The active repository's changelists; none when they cannot be read. */ + private async changelistsOf(entry: RepoEntry): Promise { + try { + return (await entry.ctx.changelists?.read()) ?? emptyChangelists(); + } catch { + return emptyChangelists(); + } + } + + /** + * Change the active repository's changelists, then repaint. Resolves with + * what was kept, or undefined when it could not be written (said). + */ + private async changeChangelists( + entry: RepoEntry, + change: (state: ChangelistState) => ChangelistState, + ): Promise { + try { + const kept = await entry.ctx.changelists.update(change); + await this.pushState(); + return kept; + } catch (err) { + void vscode.window.showErrorMessage( + l10n.t("GitStudio: couldn't save the changelists — {0}", err instanceof Error ? err.message : String(err)), + ); + await this.pushState(); + return undefined; + } + } + + /** + * Ask for a changelist name until it is one that can be used, or the user + * backs out. `current` is the list being renamed. + */ + private async askChangelistName( + state: ChangelistState, + spec: { title: string; confirmLabel: string; value?: string; current?: string }, + ): Promise { + let value = spec.value ?? ""; + let hint: string | undefined = l10n.t("Files in a changelist are left out of Stage All and Commit all until you stage them yourself."); + for (;;) { + const name = await promptInput({ + title: spec.title, + hint, + placeholder: l10n.t("Changelist name"), + value, + confirmLabel: spec.confirmLabel, + validate: "nonEmpty", + }); + if (name === undefined) { + return undefined; + } + const problem = changelistNameProblem(state, name, spec.current); + if (!problem) { + return name; + } + value = name; + hint = problem === "taken" + ? l10n.t("There is already a group called “{0}”. Choose another name.", name.trim()) + : problem === "tooLong" + ? l10n.t("That name is too long. Keep it under 80 characters.") + : l10n.t("Enter a name for the changelist."); + } + } + + /** + * Move files to a changelist. With `list` given ("" = the default one) it + * moves straight there — a drop names its target; without it the user + * picks one, or makes a new one. + */ + private async doMoveToChangelist(paths: string[], list: string | undefined): Promise { + const entry = this.repos.getActive(); + const wanted = [...new Set(paths.filter((p) => p))]; + if (!entry || wanted.length === 0) { + return; + } + // A conflicted file is never parked: it is not a staging question. + const conflicted = new Set((await this.resolveState(entry)).merge.map((e) => e.path)); + const movable = wanted.filter((p) => !conflicted.has(p)); + if (movable.length === 0) { + return; + } + const state = await this.changelistsOf(entry); + let target = list; + if (target === undefined) { + const from = new Set(movable.map((p) => state.files[p] ?? "")); + const only = from.size === 1 ? [...from][0] : undefined; + const choices = [ + ...state.lists + .filter((l) => l.id !== only) + .map((l) => ({ id: l.id, label: l.name, icon: "list-unordered" })), + ...(only === "" ? [] : [{ id: "", label: l10n.t("Changes"), icon: "inbox", description: l10n.t("The default changelist") }]), + { id: "+new", label: l10n.t("New Changelist…"), icon: "new-folder" }, + ]; + const n = movable.length; + target = await promptPick({ + title: n === 1 ? l10n.t("Move {0} to Changelist", movable[0]) : l10n.t("Move {0} Files to Changelist", n), + choices, + }); + if (target === undefined) { + return; + } + if (target === "+new") { + await this.doNewChangelist(movable); + return; + } + } + await this.changeChangelists(entry, (s) => moveToChangelist(s, movable, target || undefined)); + } + + /** Make a changelist — and put `paths` in it, when there are any. */ + private async doNewChangelist(paths: string[]): Promise { + const entry = this.repos.getActive(); + if (!entry) { + return; + } + const state = await this.changelistsOf(entry); + const n = paths.length; + const name = await this.askChangelistName(state, { + title: n === 0 + ? l10n.t("New Changelist") + : n === 1 + ? l10n.t("New Changelist for {0}", paths[0]) + : l10n.t("New Changelist for {0} Files", n), + confirmLabel: l10n.t("Create"), + }); + if (name === undefined) { + return; + } + await this.changeChangelists(entry, (s) => { + // Checked again against what is on disk now: another window may have + // made one with this name meanwhile. + if (changelistNameProblem(s, name)) { + return s; + } + const made = addChangelist(s, name); + return moveToChangelist(made.state, paths, made.id); + }); + } + + private async doRenameChangelist(id: string): Promise { + const entry = this.repos.getActive(); + if (!entry) { + return; + } + const state = await this.changelistsOf(entry); + const list = state.lists.find((l) => l.id === id); + if (!list) { + return; + } + const name = await this.askChangelistName(state, { + title: l10n.t("Rename Changelist “{0}”", list.name), + confirmLabel: l10n.t("Rename"), + value: list.name, + current: id, + }); + if (name === undefined) { + return; + } + await this.changeChangelists(entry, (s) => + changelistNameProblem(s, name, id) ? s : renameChangelist(s, id, name), + ); + } + + /** Delete a changelist. Its files go back to Changes; no file is touched, so nothing is asked. */ + private async doDeleteChangelist(id: string): Promise { + const entry = this.repos.getActive(); + if (!entry) { + return; + } + const state = await this.changelistsOf(entry); + const list = state.lists.find((l) => l.id === id); + if (!list) { + return; + } + const kept = await this.changeChangelists(entry, (s) => deleteChangelist(s, id).state); + if (kept) { + void vscode.window.setStatusBarMessage( + l10n.t("$(check) Deleted changelist “{0}” — its files are back in Changes", list.name), + 4000, + ); + } + } + + /** + * Forget the parked files that are clean now — committed, discarded, or + * reverted outside GitStudio. Asked of git itself (not vscode.git's cached + * lists, which can read empty while it re-scans: pruning on that would + * empty every changelist), and only right after GitStudio's own commit and + * discard, which are the moments a parked file is expected to go clean. + */ + private async pruneChangelists(entry: RepoEntry): Promise { + const state = await this.changelistsOf(entry); + const parked = Object.keys(state.files); + if (parked.length === 0) { + return; + } + let changed: Set; + try { + const st = await entry.ctx.status.read(); + changed = new Set([...st.merge, ...st.staged, ...st.unstaged].map((e) => e.path)); + } catch { + return; // git could not say: keep everything + } + const clean = parked.filter((p) => !changed.has(p)); + if (clean.length === 0) { + return; + } + try { + await entry.ctx.changelists.update((s) => forgetPaths(s, clean)); + } catch { + // A stale entry is harmless: it shows again only if the file changes. + } + } + // ── The Stashes group ────────────────────────────────────────────────────── /** @@ -1270,6 +1536,8 @@ export class CommitViewProvider async (e) => { const checkedOut = tracked.length > 0 ? await e.ctx.staging.discardFiles(tracked) : undefined; const cleaned = untracked.length > 0 ? await e.ctx.staging.cleanFiles(untracked) : undefined; + // A parked file discarded clean leaves its changelist. + await this.pruneChangelists(e); return [checkedOut, cleaned].find(isRefusal); }, { verb: "discard", paths: files.map((f) => f.path) }, @@ -1472,8 +1740,20 @@ export class CommitViewProvider ); return "cancelled"; } - const candidates = unstaged; + // A file parked in a changelist is never part of "everything" (#122): + // it is committed only once the user stages it. + const lists = await this.changelistsOf(entry); + const candidates = unstaged.filter((e) => !isParked(lists, e.path)); + const parked = unstaged.length - candidates.length; if (candidates.length === 0) { + if (parked > 0) { + void vscode.window.showInformationMessage( + parked === 1 + ? l10n.t("GitStudio: nothing to commit. The only changed file is in a changelist — stage it first to commit it.") + : l10n.t("GitStudio: nothing to commit. The only changed files are in changelists — stage the ones to commit first."), + ); + return "cancelled"; + } return "ok"; // nothing anywhere; the commit will explain itself } const n = candidates.length; @@ -1483,7 +1763,12 @@ export class CommitViewProvider : l10n.t("Commit all {0} changed files?", n), message: l10n.t("Nothing is staged, so everything currently changed will be included — new files too. ") + - l10n.t("Stage individually first if you only want some of it."), + l10n.t("Stage individually first if you only want some of it.") + + (parked === 0 + ? "" + : parked === 1 + ? " " + l10n.t("1 file in a changelist is left out.") + : " " + l10n.t("{0} files in changelists are left out.", parked)), confirmLabel: l10n.t("Commit all {0}", n), }); if (!ok) { @@ -1605,7 +1890,10 @@ export class CommitViewProvider return; } const { merge, unstaged } = await this.resolveState(active); - await this.stageHoldingConflicts([...merge, ...unstaged].map((e) => e.path)); + const lists = await this.changelistsOf(active); + await this.stageHoldingConflicts( + [...merge, ...unstaged.filter((e) => !isParked(lists, e.path))].map((e) => e.path), + ); } /** @@ -1619,7 +1907,12 @@ export class CommitViewProvider return; } const { merge, unstaged } = await this.resolveState(active); - await this.stageHoldingConflicts((group === "merge" ? merge : unstaged).map((e) => e.path)); + // Unstaged's Stage All is the default changelist's: a parked file stays + // where it is (#122). + const lists = await this.changelistsOf(active); + await this.stageHoldingConflicts( + (group === "merge" ? merge : unstaged.filter((e) => !isParked(lists, e.path))).map((e) => e.path), + ); } private async doBulkUnstage(): Promise { @@ -1637,7 +1930,10 @@ export class CommitViewProvider if (!active) { return; } - const { unstaged } = await this.resolveState(active); + // Unstaged's Discard All is the default changelist's: a parked file — + // a local config, say — is never thrown away with the rest (#122). + const lists = await this.changelistsOf(active); + const unstaged = (await this.resolveState(active)).unstaged.filter((e) => !isParked(lists, e.path)); const rels = unstaged.map((e) => e.path); if (rels.length === 0) { return; @@ -1803,6 +2099,8 @@ export class CommitViewProvider void vscode.window.setStatusBarMessage(l10n.t("$(check) Committed"), 3000); markWalkthrough("committed"); + // A parked file committed whole is clean now: it leaves its changelist. + await this.pruneChangelists(entry); // Clear the box and refresh the views. The commit spinner clears on // commitDone; for a Commit & Push the modal then opens for the push step. @@ -2859,10 +3157,13 @@ export class CommitViewProvider let ahead: number | undefined; let behind: number | undefined; let detached: boolean | undefined; + let lists = emptyChangelists(); if (active) { try { - ({ merge, staged, unstaged, branch, detached, upstream, ahead, behind } = - await this.resolveState(active)); + // The changelists come with the first post: a parked file shown in + // Unstaged for a moment, then jumping to its changelist, is a flicker. + [{ merge, staged, unstaged, branch, detached, upstream, ahead, behind }, lists] = + await Promise.all([this.resolveState(active), this.changelistsOf(active)]); hasRepo = true; } catch { hasRepo = false; @@ -2948,6 +3249,8 @@ export class CommitViewProvider layout, busy: this.busy, stashes: firstStashes, + changelists: lists.lists.map((l) => ({ id: l.id, name: l.name })), + parked: parkedAmong(lists, [...staged, ...unstaged].map((e) => e.path)), }; void this.view.webview.postMessage(base); this.updateBadge(staged, unstaged, behind); @@ -4308,7 +4611,7 @@ export class CommitViewProvider /* The group is the lit place; its header only speaks — one ring, and its tint made solid, held in sight at the top while the group is: let go over a stash far down a long list, the words are still there. */ - .group--stashes.is-drop-over > .group-header.is-drop-over { + .group.is-drop-over > .group-header.is-drop-over { position: sticky; top: 0; z-index: 3; background: var(--drop-over-solid); outline: none; } @@ -4353,6 +4656,9 @@ export class CommitViewProvider shownItem in the script). Hide a treeitem another way, and teach shownItem the same rule. */ .group.empty { display: none; } + /* A changelist (or Unstaged) with nothing in it is still somewhere a + dragged file can go (#122): drawn while the drag is on. */ + .group.empty.is-drop-ready, .group.empty.is-drop-over { display: block; } /* Checkbox model (gitstudio.changes.stagingModel = "checkboxes"). The tick is the only staging affordance in this mode, so it gets a real hit area rather than the browser default. */ @@ -5789,6 +6095,20 @@ export class CommitViewProvider clearSelection(); } }); } + // Park them in a changelist (#122): the unstaged rows (in the checkbox + // model, every file that is not conflicted). + const movable = []; + for (const en of entries) { + const ok = en.kind === "unstaged" || (stagingModel === "checkboxes" && en.kind !== "merge"); + if (ok && movable.indexOf(en.path) === -1) movable.push(en.path); + } + if (movable.length > 0) { + items.push({ icon: "list-unordered", label: l10nT("Move {0} to Changelist…", countFilesCap(movable.length)), + fn: () => { + vscode.postMessage({ type: "moveToChangelist", paths: movable }); + clearSelection(); + } }); + } const discardable = entries.filter((en) => en.kind === "unstaged"); if (discardable.length > 0) { items.push({ sep: true }); @@ -5876,15 +6196,43 @@ export class CommitViewProvider return paths.filter((p) => !conflicted.has(p)); } - /** The places the drag in hand can go, by name. */ + /** + * The places the drag in hand can go, by name. Working-tree files also go + * to a changelist ("cl:") or back to the default one ("cl:") (#122) — + * every one but the one they are all in already. + */ function dropKeys() { if (!drag) return []; - if (drag.kind === "tree") return drag.paths.length ? ["stashes"] : []; + if (drag.kind === "tree") { + if (!drag.paths.length) return []; + const from = new Set(drag.paths.map((p) => parked[p] || "")); + const lists = [""].concat(changelists.map((c) => c.id)) + .filter((id) => !(from.size === 1 && from.has(id))) + .map((id) => "cl:" + id); + return ["stashes"].concat(lists); + } return ["tree", "empty"]; } + /** The changelist a "cl:" place is, by name ("Changes" for the default one). */ + function listName(key) { + const id = key.slice(3); + const cl = id ? changelists.find((c) => c.id === id) : null; + return cl ? cl.name : l10nT("Changes"); + } /** Where a place shows its words. */ function dropEl(key) { if (key === "stashes") return stashesEl.hidden ? null : stashesEl.querySelector(".group--stashes > .group-header"); + if (key.indexOf("cl:") === 0) { + const id = key.slice(3); + if (!id) { + return groupsEl.querySelector(stagingModel === "checkboxes" + ? ":scope > .group--all > .group-header" + : ":scope > .group--unstaged > .group-header"); + } + const g = Array.prototype.find.call(groupsEl.querySelectorAll(":scope > .group--changelist"), + (n) => n.dataset.list === id); + return g ? g.firstChild : null; + } if (key === "empty") return emptyEl.classList.contains("visible") ? emptyEl : null; // The working tree: every group it shows, as one place. return groupsEl.querySelector(":scope > .group:not(.empty)") ? groupsEl : null; @@ -5892,7 +6240,7 @@ export class CommitViewProvider /** A place, whole: what takes the drop and is lit — the Stashes group with its rows. */ function dropArea(key) { const t = dropEl(key); - return t && key === "stashes" ? t.parentElement : t; + return t && (key === "stashes" || key.indexOf("cl:") === 0) ? t.parentElement : t; } /** The place a node is in, when the drag in hand can go there. */ function dropKeyAt(node) { @@ -5906,6 +6254,9 @@ export class CommitViewProvider /** What a drop does, in words: [the verb, how Alt/Option picks the other]. */ function dropWords() { if (drag.kind === "tree") { + if (dropKey && dropKey.indexOf("cl:") === 0) { + return [l10nT("Drop to move {0} to “{1}”", countWords(drag.paths.length), listName(dropKey)), ""]; + } return [l10nT("Drop to stash {0}", countWords(drag.paths.length)), ""]; } if (drag.kind === "stash") { @@ -6025,9 +6376,21 @@ export class CommitViewProvider if (wasTree && shownStashes().length === 0) renderStashes(); } /** The drag landed on key: do what the menus do. */ - function dropOn(d, alt) { + function dropOn(d, alt, key) { if (d.kind === "tree") { if (!d.paths.length) return; + if (key && key.indexOf("cl:") === 0) { + // Moved at once; the host writes it and its next state agrees. + const id = key.slice(3); + for (const p of d.paths) { + if (id) parked[p] = id; + else delete parked[p]; + } + vscode.postMessage({ type: "moveToChangelist", paths: d.paths, list: id }); + if (d.selection) clearSelection(); + render(); + return; + } vscode.postMessage({ type: "stashPaths", paths: d.paths }); if (d.selection) clearSelection(); return; @@ -6079,7 +6442,7 @@ export class CommitViewProvider const d = drag; const key = dropKeyAt(ev.target); endDrag(); - if (key) dropOn(d, ev.altKey); + if (key) dropOn(d, ev.altKey, key); }); // Its source's end: dropped (above), cancelled with Escape, or let go // outside the view. @@ -6156,6 +6519,15 @@ export class CommitViewProvider // up — the row never snaps back mid-flight, even across rapid clicks. let authState = { merge: [], staged: [], unstaged: [] }; let lastState = { merge: [], staged: [], unstaged: [] }; + // Changelists (#122): the host's named lists ({ id, name }, in the order + // they were made) and which changed file is parked in which. A parked + // file leaves Unstaged (the checkbox model's Changes list) for its + // changelist's group, and is out of every "everything" action — Stage + // All, Check all, Commit all, Discard All — until it is staged by hand. + let changelists = []; + let parked = Object.create(null); + /** The files of list that are in no changelist: the default one's. */ + function outsideLists(list) { return list.filter((e) => !parked[e.path]); } let branchData = { local: [], remote: [], recent: [], tags: [] }; // True until the host has listed this repository's branches: a state push // carries none on its first post for a repository (see pushState). @@ -6250,7 +6622,11 @@ export class CommitViewProvider // Stage/unstage every file currently shown in a group, optimistically. // Sets all pending ops first, then repaints once (not per file). function queueGroup(kind, action) { - const list = (lastState[kind] || []).slice(); + // Unstaged's Stage All is the default changelist's: a parked file + // stays put, as the host leaves it (#122). + const list = kind === "unstaged" && action === "stage" + ? outsideLists(lastState.unstaged || []) + : (lastState[kind] || []).slice(); if (!list.length) return; const at = Date.now(); for (const e of list) pending.set(e.path, { action, at }); @@ -6362,8 +6738,10 @@ export class CommitViewProvider // Conflicted files are not part of "all": the host never sweeps them in // (staging one marks it resolved, markers and all), so counting them // offered "Commit all 1" for a commit that could not include it. + // Nor are parked files (#122): "Commit all" leaves them out, so the + // count it offers is the one the host will stage. const totalChanges = - (lastState ? lastState.staged.length + lastState.unstaged.length : 0); + (lastState ? lastState.staged.length + outsideLists(lastState.unstaged).length : 0); const canCommit = hasStaged || totalChanges > 0; // Commit button label + state. if (!committing) { @@ -9350,6 +9728,8 @@ export class CommitViewProvider s += "|" + k + ":"; for (const e of list) s += e.path + e.status + ","; } + // Which file is in which changelist, and what each is called. + s += "|lists:" + JSON.stringify(changelists) + "|parked:" + JSON.stringify(parked); return s; } // The firehose pushes state on EVERY git poke (fetches, unrelated ref @@ -9478,7 +9858,8 @@ export class CommitViewProvider // conflict resolved for it — the Merge Changes header's Stage All does, // past the marker check. Lit over conflicted files alone, a click // staged nothing and said nothing. - stageAllTopBtn.disabled = data.unstaged.length === 0; + // Nor does a parked file count (#122): Stage All leaves it where it is. + stageAllTopBtn.disabled = outsideLists(data.unstaged).length === 0; stashChangesBtn.disabled = total === 0; // "Changed Files" counts files: a partly staged file is one file, in // both groups. It said 4 over a checkbox list of 3. @@ -9493,13 +9874,20 @@ export class CommitViewProvider const groups = []; if (stagingModel === "checkboxes") { - groups.push(renderChecklist(data)); + groups.push.apply(groups, renderChecklist(data, total)); } else { for (const def of GROUP_DEFS) { - const list = data[def.kind]; + const list = def.kind === "unstaged" ? outsideLists(data.unstaged) : data[def.kind]; if (def.kind === "merge" && list.length === 0) continue; groups.push(renderGroup(def, list)); } + // Each changelist after Unstaged: the unstaged side of its files. + // Their staged side stays in Staged, which is always exactly what + // the commit will hold. + for (const cl of changelists) { + const files = data.unstaged.filter((e) => parked[e.path] === cl.id); + groups.push(renderListGroup(changelistDef(cl), files, total, null)); + } } patchChildren(groupsEl, groups); // What this render did not ask for is gone: its rows are not kept. @@ -9517,7 +9905,7 @@ export class CommitViewProvider // selection to drift out of sync with the repository, nothing new to persist, // and every other surface (the badge, the commit count, an external git add // in a terminal) keeps agreeing with what you see. - function renderChecklist(data) { + function renderChecklist(data, total) { // ONE ROW PER FILE, merged by path. // // A partly staged file is in BOTH data.staged and data.unstaged — that is @@ -9570,27 +9958,33 @@ export class CommitViewProvider }); }); all.sort(function (a, b) { return a.entry.path.localeCompare(b.entry.path); }); + // A parked file is in its changelist's group, ticked or not — so the + // tick still means "in the index" and there is still one row per file — + // and out of this list, whose master tick never takes it (#122). A + // conflicted file stays here: it is not a staging question. + const inList = function (f) { return f.kind !== "merge" && parked[f.entry.path] ? parked[f.entry.path] : ""; }; + const main = all.filter(function (f) { return !inList(f); }); // The group and its header are built once and kept: what changes from // render to render (the master tick, the count, the rows it acts on) // is painted onto them below, and read by its handlers from __live. const group = keep("grp|ck", "", buildChecklistShell); const header = group.firstChild; - const checkedCount = all.filter(function (f) { return f.staged; }).length; - header.__live = { all: all, checkedCount: checkedCount }; - const wantClass = "group group--all" + (all.length === 0 ? " empty" : ""); + const checkedCount = main.filter(function (f) { return f.staged; }).length; + header.__live = { all: main, checkedCount: checkedCount }; + const wantClass = "group group--all" + (main.length === 0 ? " empty" : ""); if (group.className !== wantClass) group.className = wantClass; const master = header.querySelector(".ck-master"); - master.checked = checkedCount > 0 && checkedCount === all.length; + master.checked = checkedCount > 0 && checkedCount === main.length; // A partly staged file is some of the changes included, too: the header // said "none" over a staged part. master.indeterminate = !master.checked && - all.some(function (f) { return f.state !== "unstaged"; }); + main.some(function (f) { return f.state !== "unstaged"; }); const masterTip = master.checked ? l10nT("Uncheck all") : l10nT("Check all"); if (master.dataset.tip !== masterTip) master.dataset.tip = masterTip; setAttr(header, "aria-checked", master.indeterminate ? "mixed" : master.checked ? "true" : "false"); - setAttr(header, "aria-label", l10nT("Changes, {0}", countWords(all.length))); - header.querySelector(".gcount").textContent = String(all.length); + setAttr(header, "aria-label", l10nT("Changes, {0}", countWords(main.length))); + header.querySelector(".gcount").textContent = String(main.length); const stagedByPath = new Map(); const kindByPath = new Map(); @@ -9636,17 +10030,23 @@ export class CommitViewProvider // visible and inert whenever the checkbox model was on. const nodes = []; if (layout === "tree") { - renderTreeInto(nodes, GROUP_DEFS[2], all.map(function (f) { return f.entry; }), { + renderTreeInto(nodes, GROUP_DEFS[2], main.map(function (f) { return f.entry; }), { defFor: defForEntry, tick: tickFor, }); } else { - for (const f of all) { + for (const f of main) { renderFileRow(nodes, defForEntry(f.entry), f.entry, 1, tickFor(f.entry)); } } patchChildren(group.lastChild, nodes); - return group; + const groups = [group]; + for (const cl of changelists) { + const entries = all.filter(function (f) { return inList(f) === cl.id; }) + .map(function (f) { return f.entry; }); + groups.push(renderListGroup(changelistDef(cl), entries, total, { defFor: defForEntry, tick: tickFor })); + } + return groups; } /** The checkbox model's group and header, built once (see renderChecklist). */ @@ -9671,8 +10071,15 @@ export class CommitViewProvider // Aim at the state the user is asking for, not at a toggle of each row: // from indeterminate, one click should mean "include everything". if (live.checkedCount === live.all.length && live.all.length > 0) { - queueGroup("staged", "unstage"); - vscode.postMessage({ type: "unstageAll" }); + if (changelists.length === 0) { + queueGroup("staged", "unstage"); + vscode.postMessage({ type: "unstageAll" }); + } else { + // This list's files only: a parked file ticked by hand stays ticked. + const paths = live.all.map(function (f) { return f.entry.path; }); + queueFiles(paths, "unstage"); + vscode.postMessage({ type: "unstagePaths", paths: paths }); + } } else { queueGroup("unstaged", "stage"); vscode.postMessage({ type: "stageAllForCommit" }); @@ -9748,6 +10155,9 @@ export class CommitViewProvider fn: function () { vscode.postMessage({ type: "stashStaged" }); } }); items.push({ icon: "git-stash", label: l10nT("Stash All Changes"), fn: function () { vscode.postMessage({ type: "stash" }); } }); + items.push({ sep: true }); + items.push({ icon: "new-folder", label: l10nT("New Changelist…"), + fn: function () { vscode.postMessage({ type: "newChangelist", paths: [] }); } }); // The header's own button, for the keyboard (it is out of the tab order). items.push({ sep: true }); items.push({ icon: "discard", label: l10nT("Discard All"), danger: true, fn: discardAllNow }); @@ -10089,6 +10499,11 @@ export class CommitViewProvider ? { icon: "git-stash", label: l10nT("Stash Everything Staged"), fn: () => vscode.postMessage({ type: "stashStaged" }) } : { icon: "git-stash", label: l10nT("Stash All Changes"), fn: () => vscode.postMessage({ type: "stash" }) }); } + if (def.kind === "unstaged") { + items.push({ sep: true }); + items.push({ icon: "new-folder", label: l10nT("New Changelist…"), + fn: () => vscode.postMessage({ type: "newChangelist", paths: [] }) }); + } openActionMenu(def.label, items, header, null); }; header.addEventListener("contextmenu", header.__menu); @@ -10115,6 +10530,146 @@ export class CommitViewProvider return group; } + // ── Changelists (#122) ───────────────────────────────────────────── + // A changelist's group holds the files parked in it: out of Unstaged (the + // checkbox model's Changes list) and out of every "everything" action, + // staged only by hand. Its rows are Unstaged's rows — the same keys, + // buttons and menus, as a file is in one place at a time — so a row's + + // still stages it. def.group keeps its folders and its collapse apart + // from Unstaged's, where the same folder can be too. + function changelistDef(cl) { + return { kind: "unstaged", group: "cl-" + cl.id, list: cl, label: cl.name, staged: false }; + } + + /** + * One changelist's group, in either model. opts is the checkbox model's + * (each row's own def and tick, as renderTreeInto takes them); null in + * the split model. + */ + function renderListGroup(def, entries, total, opts) { + const collapseKey = "group:" + def.group; + const isCollapsed = collapsed[collapseKey] === true; + const group = keep("grp|" + def.group, "", function () { return buildChangelistShell(def); }); + // Shown when empty, so it can be dropped onto, renamed and deleted — + // but not over a clean tree, which says only that it is clean. + const wantClass = "group group--changelist" + (total === 0 ? " empty" : "") + + (isCollapsed ? " collapsed" : ""); + if (group.className !== wantClass) group.className = wantClass; + setAttr(group, "data-list", def.list.id); + const header = group.firstChild; + header.__def = def; + header.__list = entries; + header.__keys = entries.map(function (e) { return rowKey((opts ? opts.defFor(e) : def).kind, e.path); }); + const glabel = header.querySelector(".glabel"); + if (glabel.textContent !== def.label) glabel.textContent = def.label; + const tip = l10nT("{0} — a changelist: its files stay out of Stage All and Commit all until you stage them. Click to collapse, Ctrl/Cmd-click to select its files, right-click for its actions.", def.label); + if (header.dataset.tip !== tip) header.dataset.tip = tip; + setAttr(header, "aria-expanded", isCollapsed ? "false" : "true"); + setAttr(header, "aria-label", l10nT("{0}, changelist, {1}", def.label, countWords(entries.length))); + const gcount = header.querySelector(".gcount"); + if (gcount.textContent !== String(entries.length)) gcount.textContent = String(entries.length); + const stageBtn = header.querySelector(".group-actions .icon-btn"); + if (stageBtn) stageBtn.disabled = entries.length === 0; + + const nodes = []; + if (layout === "tree") { + renderTreeInto(nodes, def, entries, opts || undefined); + } else { + for (const e of entries) { + renderFileRow(nodes, opts ? opts.defFor(e) : def, e, 1, opts ? opts.tick(e) : null); + } + } + patchChildren(group.lastChild, nodes); + return group; + } + + /** A changelist's group and header, built once per changelist (see renderListGroup). */ + function buildChangelistShell(def) { + const collapseKey = "group:" + def.group; + const group = el("div", "group group--changelist"); + group.setAttribute("role", "none"); + const header = el("div", "group-header"); + header.tabIndex = -1; + header.setAttribute("role", "treeitem"); + header.setAttribute("aria-level", "1"); + header.dataset.tkey = "g:" + def.group; + header.__def = def; + const twisty = el("span", "twisty", ICON_CHEVRON); + const gdot = el("span", "gdot"); + const glabel = el("span", "glabel"); + glabel.textContent = def.label; + const gcount = el("span", "gcount"); + const paths = () => (header.__list || []).map((e) => e.path); + const selectAll = () => { + const keys = header.__keys || []; + selectedRows.forEach((k) => { if (selScope(k) !== "tree") selectedRows.delete(k); }); + const allOn = keys.length > 0 && keys.every((k) => selectedRows.has(k)); + for (let i = 0; i < keys.length; i++) { + if (allOn) selectedRows.delete(keys[i]); + else selectedRows.add(keys[i]); + } + selectionAnchor = keys.length > 0 ? keys[keys.length - 1] : null; + paintSelection(); + }; + // Staging a changelist's files is always by hand — this button is the + // hand: "Stage All" here means this changelist's files, nothing else. + const stageAll = () => { + const p = paths(); + if (p.length === 0) return; + queueFiles(p, "stage"); + vscode.postMessage({ type: "stagePaths", paths: p }); + }; + const actions = el("span", "group-actions"); + actions.appendChild(rowBtn(ICON_STAGE, l10nT("Stage All in This Changelist"), (ev) => { ev.stopPropagation(); stageAll(); })); + header.addEventListener("click", (ev) => { + if (!(ev.ctrlKey || ev.metaKey)) return; + ev.preventDefault(); + ev.stopPropagation(); + selectAll(); + }); + header.__menu = (ev) => { + if (ev) ev.preventDefault(); + const live = header.__def; + const n = (header.__list || []).length; + const items = []; + if (n > 0) { + items.push({ icon: "add", label: l10nT("Stage All in This Changelist"), fn: stageAll }); + items.push({ sep: true }); + } + items.push({ icon: "edit", label: l10nT("Rename Changelist…"), + fn: () => vscode.postMessage({ type: "renameChangelist", list: live.list.id }) }); + items.push({ icon: "trash", label: l10nT("Delete Changelist"), + fn: () => vscode.postMessage({ type: "deleteChangelist", list: live.list.id }) }); + if (n > 0) { + items.push({ sep: true }); + items.push({ icon: "check-all", label: l10nT("Select All (") + n + ")", fn: () => { + selectedRows.clear(); + selectAll(); + } }); + items.push({ icon: "git-stash", label: l10nT("Stash These Files"), + fn: () => vscode.postMessage({ type: "stashPaths", paths: paths() }) }); + } + openActionMenu(live.label, items, header, null); + }; + header.addEventListener("contextmenu", header.__menu); + header.append(twisty, gdot, glabel, actions, gcount); + const setOpen = (open) => { + collapsed[collapseKey] = !open; + render(); + }; + header.addEventListener("click", (ev) => { + if (ev.ctrlKey || ev.metaKey) return; + setOpen(collapsed[collapseKey] === true); + }); + header.__expand = setOpen; + header.__activate = () => setOpen(collapsed[collapseKey] === true); + group.appendChild(header); + const body = el("div", "group-body"); + body.setAttribute("role", "group"); + group.appendChild(body); + return group; + } + /** * The opts argument lets the checkbox model reuse this tree. * @@ -10141,12 +10696,15 @@ export class CommitViewProvider // Folders first (alphabetical), then files. const dirs = [...node.dirs.values()].sort((a, b) => a.name.localeCompare(b.name)); + // A changelist's folders are its own: the same folder can be in + // Unstaged and in a changelist at once (def.group tells them apart). + const gk = def.group || def.kind; for (const dir of dirs) { - const key = "folder:" + def.kind + ":" + dir.path; + const key = "folder:" + gk + ":" + dir.path; folderKeyAccumulator.push(key); const isCollapsed = collapsed[key] === true; const row = keep( - "fold|" + stagingModel + "|" + def.kind + "|" + dir.path, + "fold|" + stagingModel + "|" + gk + "|" + dir.path, dir.name + "|" + depth, function () { return buildFolderRow(def, dir.name, dir.path, key, depth); }, ); @@ -10174,7 +10732,7 @@ export class CommitViewProvider // It opens and closes like a group header: a treeitem one level in. row.setAttribute("role", "treeitem"); row.setAttribute("aria-level", String(depth + 1)); - row.dataset.tkey = "d:" + stagingModel + ":" + def.kind + ":" + path; + row.dataset.tkey = "d:" + stagingModel + ":" + (def.group || def.kind) + ":" + path; row.appendChild(el("span", "twisty", ICON_CHEVRON)); row.appendChild(el("span", "file-icon folder-icon", ICON_FOLDER)); const nameEl = el("span", "name"); @@ -10221,6 +10779,10 @@ export class CommitViewProvider items.push({ icon: "git-stash", label: l10nT("Stash This Folder"), fn: () => vscode.postMessage({ type: "stashPaths", paths: row.__paths }) }); } + if (def.kind === "unstaged") { + items.push({ icon: "list-unordered", label: l10nT("Move to Changelist…"), + fn: () => vscode.postMessage({ type: "moveToChangelist", paths: row.__paths }) }); + } openActionMenu(name, items, row, "folder"); }; row.addEventListener("contextmenu", row.__menu); @@ -10381,6 +10943,14 @@ export class CommitViewProvider fn: () => vscode.postMessage({ type: "discard", path: e.path }) }); } } + // Park it in a changelist (#122) — or move it on, or back. Not a + // conflicted file, and in the split model only its unstaged row: a + // changelist holds the work still to stage. + if (!conflict && (def.kind === "unstaged" || (stagingModel === "checkboxes" && def.kind !== "merge"))) { + items.push({ sep: true }); + items.push({ icon: "list-unordered", label: l10nT("Move to Changelist…"), + fn: () => vscode.postMessage({ type: "moveToChangelist", paths: [e.path] }) }); + } items.push({ sep: true }); items.push({ icon: "git-stash", label: l10nT("Stash This File"), fn: () => vscode.postMessage({ type: "stashPaths", paths: [e.path] }) }); @@ -11374,6 +11944,8 @@ export class CommitViewProvider reconcilePending(authState); lastState = applyPending(authState); stagedCount = lastState.staged.length; + changelists = Array.isArray(msg.changelists) ? msg.changelists : []; + parked = Object.assign(Object.create(null), msg.parked || {}); // From the MESSAGE, not from lastState: applyPending() rebuilds lastState // out of the three file lists, so anything else on the payload is dropped. stagingModel = msg.stagingModel || "split"; diff --git a/apps/extension/test/changesChangelists.test.ts b/apps/extension/test/changesChangelists.test.ts new file mode 100644 index 00000000..27124bd1 --- /dev/null +++ b/apps/extension/test/changesChangelists.test.ts @@ -0,0 +1,249 @@ +// Changelists in the Changes view (#122), host side, against a real repository. +// +// A file parked in a changelist — a local config that is always modified and +// never meant to be committed — is left out of every action that takes +// "everything": Stage All, the checkbox model's Check all, Commit all (with +// nothing staged) and Discard All. It is staged and committed only by hand, +// and a parked file committed or discarded clean leaves its changelist. +// Changelists are kept in the git-dir, never in the working tree. + +import { test, after } from "node:test"; +import assert from "node:assert/strict"; +import { readFileSync, writeFileSync, existsSync } from "node:fs"; +import { join } from "node:path"; +import { answerWith, asked, changesHost, scratchRepo, vscode } from "./changesHost"; + +const cleanups: (() => void)[] = []; +after(() => cleanups.forEach((f) => f())); + +/** a.txt, b.txt and config.json committed, then all three edited, plus an untracked new.txt. */ +function edited(): ReturnType { + const repo = scratchRepo("changelists"); + cleanups.push(repo.done); + const w = (n: string, t: string) => writeFileSync(join(repo.dir, n), t); + w("a.txt", "a\n"); + w("b.txt", "b\n"); + w("config.json", '{"debug":false}\n'); + repo.git("add", "."); + repo.git("commit", "-qm", "base"); + w("a.txt", "a, edited\n"); + w("b.txt", "b, edited\n"); + w("config.json", '{"debug":true}\n'); + w("new.txt", "new\n"); + return repo; +} + +type Host = ReturnType; + +function host(repo: ReturnType): Host { + const h = changesHost(repo.dir); + cleanups.push(h.dispose); + return h; +} + +/** The last state the host posted. */ +async function lastState(h: Host): Promise> { + await h.idle(); + const states = h.posted.filter((m) => m.type === "state"); + assert.ok(states.length > 0, "the host posted its state"); + return states[states.length - 1]; +} + +/** Park `paths` in a new changelist called `name`, the way the page asks for it. */ +async function park(h: Host, name: string, paths: string[]): Promise { + answerWith((spec) => (spec.kind === "input" ? name : undefined)); + await h.send({ type: "newChangelist", paths }); + const st = await lastState(h); + const list = (st.changelists as { id: string; name: string }[]).find((l) => l.name === name); + assert.ok(list, `the changelist "${name}" is in the state`); + return list.id; +} + +const stagedNames = (repo: ReturnType): string[] => + repo.git("diff", "--cached", "--name-only").split("\n").filter(Boolean).sort(); + +test("New Changelist… parks the files; the state says so; the file is in .git, not the tree", async () => { + const repo = edited(); + const h = host(repo); + asked.length = 0; + const id = await park(h, "nocommit", ["config.json"]); + assert.equal(asked.length, 1); + assert.equal(asked[0].kind, "input"); + const st = await lastState(h); + assert.deepEqual(st.parked, { "config.json": id }); + assert.deepEqual(st.changelists, [{ id, name: "nocommit" }]); + assert.ok(existsSync(join(repo.dir, ".git", "gitstudio-changelists.json"))); + assert.ok( + !repo.git("status", "--porcelain", "--untracked-files=all").includes("changelists"), + "nothing new in the working tree", + ); +}); + +test("Stage All and Check all leave a parked file where it is", async () => { + const repo = edited(); + const h = host(repo); + await park(h, "nocommit", ["config.json", "new.txt"]); + await h.send({ type: "stageAll" }); + assert.deepEqual(stagedNames(repo), ["a.txt", "b.txt"]); + repo.git("reset", "-q"); + await h.send({ type: "stageAllForCommit" }); + assert.deepEqual(stagedNames(repo), ["a.txt", "b.txt"]); +}); + +test("Commit all leaves a parked file out, and its confirm says so", async () => { + const repo = edited(); + const h = host(repo); + const id = await park(h, "nocommit", ["config.json"]); + asked.length = 0; + answerWith(() => "ok"); + await h.send({ type: "commit", message: "work" }); + const confirm = asked.find((a) => a.kind === "confirm"); + assert.ok(confirm && confirm.kind === "confirm"); + assert.equal(confirm.title, "Commit all 3 changed files?"); + assert.match(confirm.message, /1 file in a changelist is left out\.$/); + assert.deepEqual( + repo.git("show", "--name-only", "--format=", "HEAD").split("\n").filter(Boolean).sort(), + ["a.txt", "b.txt", "new.txt"], + ); + assert.match(repo.git("status", "--porcelain"), /^ M config\.json$/m, "config.json is still modified, unstaged"); + assert.deepEqual((await lastState(h)).parked, { "config.json": id }, "and still parked"); +}); + +test("with only parked files changed and nothing staged, Commit commits nothing and says why", async () => { + const repo = scratchRepo("changelists-only"); + cleanups.push(repo.done); + writeFileSync(join(repo.dir, "config.json"), "1\n"); + repo.git("add", "."); + repo.git("commit", "-qm", "base"); + writeFileSync(join(repo.dir, "config.json"), "2\n"); + const h = host(repo); + await park(h, "nocommit", ["config.json"]); + asked.length = 0; + vscode.__said.length = 0; + answerWith(() => "ok"); + const head = repo.git("rev-parse", "HEAD"); + await h.send({ type: "commit", message: "nope" }); + assert.equal(repo.git("rev-parse", "HEAD"), head, "no commit"); + assert.deepEqual(asked.filter((a) => a.kind === "confirm"), [], "nothing to confirm"); + assert.deepEqual(vscode.__said.filter((s) => s.kind === "info").map((s) => s.message), [ + "GitStudio: nothing to commit. The only changed file is in a changelist — stage it first to commit it.", + ]); + assert.deepEqual(h.posted.filter((m) => m.type === "commitDone").map((m) => m.ok), [false]); +}); + +test("Discard All never throws a parked file's changes away", async () => { + const repo = edited(); + const h = host(repo); + await park(h, "nocommit", ["config.json"]); + asked.length = 0; + answerWith(() => "ok"); + await h.send({ type: "discardAll", group: "unstaged" }); + const confirm = asked.find((a) => a.kind === "confirm"); + assert.ok(confirm && confirm.kind === "confirm"); + assert.equal(confirm.title, "Discard all 3 working-tree changes?"); + assert.equal(readFileSync(join(repo.dir, "config.json"), "utf8"), '{"debug":true}\n', "kept"); + assert.equal(readFileSync(join(repo.dir, "a.txt"), "utf8"), "a\n", "the rest is discarded"); +}); + +test("a parked file staged by hand commits, and then leaves its changelist", async () => { + const repo = edited(); + const h = host(repo); + const id = await park(h, "nocommit", ["config.json", "b.txt"]); + await h.send({ type: "stagePaths", paths: ["config.json"] }); + assert.deepEqual(stagedNames(repo), ["config.json"], "staged by hand: it stages"); + answerWith(() => "ok"); + await h.send({ type: "commit", message: "config, on purpose" }); + assert.deepEqual(repo.git("show", "--name-only", "--format=", "HEAD").split("\n").filter(Boolean), ["config.json"]); + const st = await lastState(h); + assert.deepEqual(st.parked, { "b.txt": id }, "config.json is clean and forgotten; b.txt stays"); + const onDisk = JSON.parse(readFileSync(join(repo.dir, ".git", "gitstudio-changelists.json"), "utf8")); + assert.deepEqual(onDisk.files, { "b.txt": id }); +}); + +test("a parked file discarded by hand leaves its changelist", async () => { + const repo = edited(); + const h = host(repo); + await park(h, "nocommit", ["config.json"]); + answerWith(() => "ok"); + await h.send({ type: "discardPaths", paths: ["config.json"] }); + assert.deepEqual((await lastState(h)).parked, {}); + const onDisk = JSON.parse(readFileSync(join(repo.dir, ".git", "gitstudio-changelists.json"), "utf8")); + assert.deepEqual(onDisk.files, {}); +}); + +test("Move to Changelist… asks where, offers the default list back, and a drop moves without asking", async () => { + const repo = edited(); + const h = host(repo); + const one = await park(h, "one", ["config.json"]); + const two = await park(h, "two", []); + asked.length = 0; + answerWith((spec) => (spec.kind === "pick" ? two : undefined)); + await h.send({ type: "moveToChangelist", paths: ["config.json"] }); + const pick = asked[0]; + assert.ok(pick && pick.kind === "pick"); + assert.equal(pick.title, "Move config.json to Changelist"); + assert.deepEqual(pick.choices.map((c) => c.label), ["two", "Changes", "New Changelist…"], "not the one it is in"); + assert.deepEqual((await lastState(h)).parked, { "config.json": two }); + asked.length = 0; + await h.send({ type: "moveToChangelist", paths: ["config.json", "a.txt"], list: one }); + assert.equal(asked.length, 0, "a drop names its target"); + assert.deepEqual((await lastState(h)).parked, { "config.json": one, "a.txt": one }); + await h.send({ type: "moveToChangelist", paths: ["a.txt"], list: "" }); + assert.deepEqual((await lastState(h)).parked, { "config.json": one }); +}); + +test("a conflicted file is never parked", async () => { + const repo = edited(); + repo.git("commit", "-qam", "edits"); + repo.git("checkout", "-q", "-b", "topic", "HEAD~1"); + writeFileSync(join(repo.dir, "a.txt"), "a, theirs\n"); + repo.git("commit", "-qam", "topic"); + repo.git("checkout", "-q", "main"); + try { + repo.git("merge", "-q", "--no-edit", "refs/heads/topic"); + } catch { + // stops on a.txt, as intended + } + const h = host(repo); + const id = await park(h, "nocommit", []); + await h.send({ type: "moveToChangelist", paths: ["a.txt"], list: id }); + assert.deepEqual((await lastState(h)).parked, {}); +}); + +test("a name already used is asked again, with the reason; Rename and Delete keep the files", async () => { + const repo = edited(); + const h = host(repo); + const id = await park(h, "nocommit", ["config.json"]); + asked.length = 0; + const answers = ["NoCommit", "Unstaged", "local"]; + answerWith((spec) => (spec.kind === "input" ? answers.shift() : undefined)); + await h.send({ type: "newChangelist", paths: [] }); + assert.equal(asked.length, 3); + assert.equal(asked[1].hint, "There is already a group called “NoCommit”. Choose another name."); + assert.equal(asked[2].hint, "There is already a group called “Unstaged”. Choose another name."); + assert.deepEqual(((await lastState(h)).changelists as { name: string }[]).map((l) => l.name), ["nocommit", "local"]); + + answerWith((spec) => (spec.kind === "input" ? "machine-local" : undefined)); + await h.send({ type: "renameChangelist", list: id }); + let st = await lastState(h); + assert.deepEqual((st.changelists as { name: string }[]).map((l) => l.name), ["machine-local", "local"]); + assert.deepEqual(st.parked, { "config.json": id }, "renamed, its files stay"); + + vscode.__said.length = 0; + await h.send({ type: "deleteChangelist", list: id }); + st = await lastState(h); + assert.deepEqual((st.changelists as { name: string }[]).map((l) => l.name), ["local"]); + assert.deepEqual(st.parked, {}, "its files are back in Changes"); + assert.equal(readFileSync(join(repo.dir, "config.json"), "utf8"), '{"debug":true}\n', "and untouched"); +}); + +test("a changelists file someone broke reads as none, and the view still paints", async () => { + const repo = edited(); + writeFileSync(join(repo.dir, ".git", "gitstudio-changelists.json"), "{ not json"); + const h = host(repo); + await h.send({ type: "ready" }); + const st = await lastState(h); + assert.deepEqual(st.changelists, []); + assert.deepEqual(st.parked, {}); + assert.equal((st.unstaged as unknown[]).length, 4); +}); diff --git a/apps/extension/test/changesChangelistsPage.test.ts b/apps/extension/test/changesChangelistsPage.test.ts new file mode 100644 index 00000000..7f0c670e --- /dev/null +++ b/apps/extension/test/changesChangelistsPage.test.ts @@ -0,0 +1,288 @@ +// Changelists in the Changes view (#122), in the real page commitView.ts +// serves (windowless Chrome; real mouse events through the DevTools +// protocol, synthetic drags as changesStashDrag.test.ts makes them). +// +// A parked file sits in its changelist's group — out of Unstaged in the split +// model, out of the Changes list in the checkbox model — and every +// "everything" control leaves it alone: Stage All (moved at the click, and +// disabled when only parked files are left), Check all, and the Commit +// button's "Commit all N". It is moved by its row's menu, a selection's menu, +// or a drag onto a changelist; a changelist's own header stages, renames and +// deletes it. + +import { test, after } from "node:test"; +import assert from "node:assert/strict"; +import { ChangesPage, stateMessage } from "./changesPage"; + +const chrome = ChangesPage.chrome(); +const skip = chrome ? false : "no windowless Chrome on this machine (set GS_CHROME)"; + +const opened: ChangesPage[] = []; +after(async () => { + for (const p of opened) await p.close(); +}); + +const NOCOMMIT = { id: "lnc1", name: "nocommit" }; +const EMPTY = { id: "lem2", name: "later" }; + +function state(over: Record = {}): Record { + return { + ...stateMessage({ local: [{ name: "main", current: true }] }), + staged: [], + unstaged: [ + { path: "src/a.ts", status: "M" }, + { path: "src/b.ts", status: "M" }, + { path: "src/config.local.json", status: "M" }, + { path: "debug.log", status: "U" }, + ], + changelists: [NOCOMMIT, EMPTY], + parked: { "src/config.local.json": NOCOMMIT.id, "debug.log": NOCOMMIT.id }, + ...over, + }; +} + +async function open(over: Record = {}): Promise { + const p = await ChangesPage.open("dark", { width: 420, height: 760 }); + opened.push(p); + await p.send(state(over)); + await p.eval("window.__posted.length = 0"); + return p; +} + +/** The groups on screen, each with the files it shows. */ +function groups(p: ChangesPage): Promise<{ label: string; count: string; files: string[] }[]> { + return p.eval(`Array.prototype.filter.call(document.querySelectorAll("#groups > .group"), function (g) { + return getComputedStyle(g).display !== "none"; + }).map(function (g) { + return { + label: g.querySelector(".glabel").textContent, + count: g.querySelector(".gcount").textContent, + files: Array.prototype.map.call(g.querySelectorAll(".row.is-file"), function (r) { return r.dataset.path; }), + }; + })`); +} + +const listHeader = (id: string) => + `Array.prototype.find.call(document.querySelectorAll("#groups > .group--changelist"), function (g) { return g.dataset.list === ${JSON.stringify(id)}; }).firstChild`; +const fileRow = (path: string) => `document.querySelector('#groups .row.is-file[data-path="${path}"]')`; + +async function centre(p: ChangesPage, expr: string): Promise<{ x: number; y: number }> { + return p.eval(`(function () { + var n = ${expr}; + if (!n) throw new Error("not on the page: " + ${JSON.stringify(expr)}); + var t = n.querySelector(".name, .glabel") || n; + var b = t.getBoundingClientRect(); + return { x: Math.round(b.left + Math.min(b.width / 2, 30)), y: Math.round(b.top + b.height / 2) }; + })()`); +} + +async function mouse(p: ChangesPage, at: { x: number; y: number }, button: "left" | "right", modifiers = 0): Promise { + const base = { x: at.x, y: at.y, button, clickCount: 1, modifiers }; + await p.page.send("Input.dispatchMouseEvent", { type: "mousePressed", ...base }); + await p.page.send("Input.dispatchMouseEvent", { type: "mouseReleased", ...base }); +} + +/** The labels of the open action menu. */ +function menuLabels(p: ChangesPage): Promise { + return p.eval(`Array.prototype.map.call(document.querySelectorAll(".action-menu .bm-subaction"), function (b) { return b.textContent.trim(); })`); +} + +async function clickMenuItem(p: ChangesPage, label: string): Promise { + const at = await p.eval<{ x: number; y: number }>(`(function () { + var it = Array.prototype.find.call(document.querySelectorAll(".action-menu .bm-subaction"), function (b) { return b.textContent.trim() === ${JSON.stringify(label)}; }); + if (!it) throw new Error("no menu item " + ${JSON.stringify(label)}); + var b = it.getBoundingClientRect(); + return { x: Math.round(b.left + b.width / 2), y: Math.round(b.top + b.height / 2) }; + })()`); + await p.click(at.x, at.y); +} + +const sent = async (p: ChangesPage, types: RegExp) => (await p.posted()).filter((m) => types.test(String(m.type))); + +test("split model: a parked file is in its changelist, not in Unstaged; an empty changelist still shows", { skip }, async () => { + const p = await open(); + assert.deepEqual(await groups(p), [ + { label: "Unstaged", count: "2", files: ["src/a.ts", "src/b.ts"] }, + { label: "nocommit", count: "2", files: ["src/config.local.json", "debug.log"] }, + { label: "later", count: "0", files: [] }, + ]); + const name = await p.accessibleName(listHeader(NOCOMMIT.id)); + assert.equal(name, "nocommit, changelist, 2 files"); +}); + +test("over a clean tree there is only “Working tree clean”, no empty changelist", { skip }, async () => { + const p = await open({ unstaged: [], parked: {} }); + assert.deepEqual(await groups(p), []); +}); + +test("Stage All leaves the parked files where they are, at the click and at the host", { skip }, async () => { + const p = await open(); + await p.eval(`document.getElementById("stage-all-top").click()`); + assert.deepEqual(await sent(p, /^stage/), [{ type: "stageAll" }]); + const g = await groups(p); + assert.deepEqual(g.find((x) => x.label === "Staged")?.files, ["src/a.ts", "src/b.ts"]); + assert.deepEqual(g.find((x) => x.label === "nocommit")?.files, ["src/config.local.json", "debug.log"], "not moved"); +}); + +test("with only parked files left, Stage All is off and Commit offers nothing", { skip }, async () => { + const p = await open({ + unstaged: [{ path: "src/config.local.json", status: "M" }], + parked: { "src/config.local.json": NOCOMMIT.id }, + }); + assert.equal(await p.eval(`document.getElementById("stage-all-top").disabled`), true); + assert.equal(await p.eval(`document.getElementById("commit").disabled`), true, "nothing to commit all of"); +}); + +test("the Commit button's “Commit all N” counts what the host will stage — not the parked files", { skip }, async () => { + const p = await open(); + assert.equal(await p.eval(`document.getElementById("commit-label").textContent`), "Commit all 2"); +}); + +test("a row's menu moves it to a changelist; a selection's menu moves them all", { skip }, async () => { + const p = await open(); + await mouse(p, await centre(p, fileRow("src/a.ts")), "right"); + assert.ok((await menuLabels(p)).includes("Move to Changelist…")); + await clickMenuItem(p, "Move to Changelist…"); + assert.deepEqual(await sent(p, /Changelist/), [{ type: "moveToChangelist", paths: ["src/a.ts"] }]); + + await p.eval("window.__posted.length = 0"); + for (const f of ["src/a.ts", "src/b.ts"]) await mouse(p, await centre(p, fileRow(f)), "left", 4); + await mouse(p, await centre(p, fileRow("src/b.ts")), "right"); + await clickMenuItem(p, "Move 2 Files to Changelist…"); + assert.deepEqual(await sent(p, /Changelist/), [{ type: "moveToChangelist", paths: ["src/a.ts", "src/b.ts"] }]); +}); + +test("a changelist's header: its Stage All stages its files only; Rename and Delete are in its menu", { skip }, async () => { + const staging = await open(); + await staging.eval(`${listHeader(NOCOMMIT.id)}.querySelector(".group-actions .icon-btn").click()`); + assert.deepEqual(await sent(staging, /^stage/), [{ type: "stagePaths", paths: ["src/config.local.json", "debug.log"] }]); + assert.deepEqual((await groups(staging)).find((g) => g.label === "Staged")?.files, ["src/config.local.json", "debug.log"], + "staged at the click"); + const p = await open(); + await mouse(p, await centre(p, listHeader(NOCOMMIT.id)), "right"); + assert.deepEqual(await menuLabels(p), [ + "Stage All in This Changelist", "Rename Changelist…", "Delete Changelist", "Select All (2)", "Stash These Files", + ]); + await clickMenuItem(p, "Rename Changelist…"); + await mouse(p, await centre(p, listHeader(NOCOMMIT.id)), "right"); + await clickMenuItem(p, "Delete Changelist"); + assert.deepEqual(await sent(p, /Changelist/), [ + { type: "renameChangelist", list: NOCOMMIT.id }, + { type: "deleteChangelist", list: NOCOMMIT.id }, + ]); + await mouse(p, await centre(p, listHeader(EMPTY.id)), "right"); + assert.deepEqual(await menuLabels(p), ["Rename Changelist…", "Delete Changelist"], "an empty one has nothing to stage or select"); +}); + +test("Unstaged's menu makes a new changelist", { skip }, async () => { + const p = await open(); + await mouse(p, await centre(p, `document.querySelector("#groups .group--unstaged > .group-header")`), "right"); + await clickMenuItem(p, "New Changelist…"); + assert.deepEqual(await sent(p, /Changelist/), [{ type: "newChangelist", paths: [] }]); +}); + +test("checkbox model: Check all takes the Changes list only, a parked file keeps its own tick", { skip }, async () => { + const p = await open({ + stagingModel: "checkboxes", + staged: [{ path: "debug.log", status: "A" }], + unstaged: [ + { path: "src/a.ts", status: "M" }, + { path: "src/b.ts", status: "M" }, + { path: "src/config.local.json", status: "M" }, + ], + }); + assert.deepEqual(await groups(p), [ + { label: "Changes", count: "2", files: ["src/a.ts", "src/b.ts"] }, + { label: "nocommit", count: "2", files: ["debug.log", "src/config.local.json"] }, + { label: "later", count: "0", files: [] }, + ], "a ticked parked file stays in its changelist, ticked"); + const ticks = await p.eval>(`(function () { + var out = {}; + document.querySelectorAll("#groups .row.is-file").forEach(function (r) { out[r.dataset.path] = r.querySelector(".ck").checked; }); + return out; + })()`); + assert.deepEqual(ticks, { "src/a.ts": false, "src/b.ts": false, "debug.log": true, "src/config.local.json": false }); + assert.equal(await p.eval(`document.querySelector(".group--all .ck-master").indeterminate`), false, + "the Changes list's master tick does not count the parked file that is ticked"); + await p.eval(`document.querySelector(".group--all .ck-master").click()`); + assert.deepEqual(await sent(p, /^(stage|unstage)/), [{ type: "stageAllForCommit" }]); + const after1 = await p.eval>(`(function () { + var out = {}; + document.querySelectorAll("#groups .row.is-file").forEach(function (r) { out[r.dataset.path] = r.querySelector(".ck").checked; }); + return out; + })()`); + assert.equal(after1["src/config.local.json"], false, "not ticked at the click"); + assert.equal(after1["src/a.ts"], true); +}); + +test("tree layout: the same folder in Unstaged and in a changelist is two folders", { skip }, async () => { + const p = await open({ layout: "tree" }); + const folders = await p.eval(`Array.prototype.map.call(document.querySelectorAll("#groups .row:not(.is-file)"), function (r) { return r.dataset.tkey; })`); + assert.deepEqual(folders, ["d:split:unstaged:src", "d:split:cl-lnc1:src"]); + // Folding one leaves the other open. + await mouse(p, await centre(p, `document.querySelector('[data-tkey="d:split:cl-lnc1:src"]')`), "left"); + assert.deepEqual((await groups(p)).map((g) => g.files), [["src/a.ts", "src/b.ts"], ["debug.log"], []]); +}); + +// ── Drag and drop ──────────────────────────────────────────────────────────── + +const DND = String.raw` +window.__dnd = { + dt: null, src: null, + fire: function (t, type) { + var r = t.getBoundingClientRect(); + var e = new DragEvent(type, { bubbles: true, cancelable: true, clientX: r.left + 10, clientY: r.top + Math.min(10, r.height / 2) }); + Object.defineProperty(e, "dataTransfer", { value: this.dt }); + t.dispatchEvent(e); + return e; + }, + start: function (src) { + var data = {}; + this.dt = { dropEffect: "none", effectAllowed: "uninitialized", types: [], + setData: function (k, v) { data[k] = v; }, getData: function (k) { return data[k] || ""; }, setDragImage: function () {} }; + this.src = src; + this.fire(src, "dragstart"); + }, + over: function (t) { + this.fire(t, "dragenter"); + var e = this.fire(t, "dragover"); + var lit = Array.prototype.filter.call(document.querySelectorAll(".is-drop-over"), function (n) { return !n.parentElement.closest(".is-drop-over"); }); + var hint = lit.length === 1 ? lit[0].querySelector(".drop-hint .drop-verb") : null; + return { allowed: e.defaultPrevented, words: hint ? hint.textContent : "", shown: getComputedStyle(t.closest(".group") || t).display !== "none" }; + }, + drop: function (t) { this.fire(t, "drop"); if (this.src) this.fire(this.src, "dragend"); this.src = null; }, +}; +`; + +test("a file dragged onto a changelist moves there at once; onto Unstaged, back; never onto its own", { skip }, async () => { + const p = await open(); + await p.eval(DND); + await p.eval(`window.__dnd.start(${fileRow("src/a.ts")})`); + const own = await p.eval<{ allowed: boolean }>(`window.__dnd.over(document.querySelector("#groups .group--unstaged > .group-header"))`); + assert.equal(own.allowed, false, "not onto Unstaged, where it is"); + const o = await p.eval<{ allowed: boolean; words: string; shown: boolean }>(`window.__dnd.over(${listHeader(EMPTY.id)})`); + assert.deepEqual(o, { allowed: true, words: "Drop to move 1 file to “later”", shown: true }, "an empty changelist takes it"); + await p.eval(`window.__dnd.drop(${listHeader(EMPTY.id)})`); + assert.deepEqual(await sent(p, /Changelist/), [{ type: "moveToChangelist", paths: ["src/a.ts"], list: EMPTY.id }]); + assert.deepEqual((await groups(p)).find((g) => g.label === "later")?.files, ["src/a.ts"], "moved at the drop"); + + // And back: Unstaged is a place for it now, even with nothing left in it. + await p.eval("window.__posted.length = 0"); + await p.send(state({ + unstaged: [{ path: "src/config.local.json", status: "M" }], + parked: { "src/config.local.json": NOCOMMIT.id }, + })); + await p.eval(`window.__dnd.start(${fileRow("src/config.local.json")})`); + const back = await p.eval<{ allowed: boolean; words: string; shown: boolean }>( + `window.__dnd.over(document.querySelector("#groups .group--unstaged > .group-header"))`, + ); + assert.deepEqual(back, { allowed: true, words: "Drop to move 1 file to “Changes”", shown: true }); + await p.eval(`window.__dnd.drop(document.querySelector("#groups .group--unstaged > .group-header"))`); + assert.deepEqual(await sent(p, /Changelist/), [{ type: "moveToChangelist", paths: ["src/config.local.json"], list: "" }]); +}); + +test("without changelists the view is as it was: no group, no menu item to drop onto", { skip }, async () => { + const p = await open({ changelists: [], parked: {} }); + assert.deepEqual((await groups(p)).map((g) => g.label), ["Unstaged"]); + assert.equal(await p.eval(`document.getElementById("commit-label").textContent`), "Commit all 4"); +}); diff --git a/l10n/cs.json b/l10n/cs.json index 8f0f3ff4..68c05341 100644 --- a/l10n/cs.json +++ b/l10n/cs.json @@ -100,6 +100,7 @@ "$(check) Committed": "$(check) Commit vytvořen", "$(check) Copied {0}": "$(check) Zkopírováno {0}", "$(check) Created & switched to {0}": "$(check) Vytvořeno a přepnuto na {0}", + "$(check) Deleted changelist “{0}” — its files are back in Changes": "$(check) Seznam změn „{0}“ odstraněn — jeho soubory jsou zpět ve Změnách", "$(check) GitStudio: AI features disabled": "$(check) GitStudio: Funkce AI vypnuty", "$(check) Nothing to push from {0} — up to date": "$(check) Nic k odeslání z {0} — vše aktuální", "$(check) Nothing to push — up to date": "$(check) Nic k odeslání — vše aktuální", @@ -243,6 +244,7 @@ "1 file": "1 soubor", "1 file changed": "1 soubor změněn", "1 file has conflicts to resolve.": "1 soubor obsahuje konflikty k vyřešení.", + "1 file in a changelist is left out.": "1 soubor v seznamu změn zůstává stranou.", "1 file selected": "1 vybraný soubor", "1 file still conflicted": "1 soubor stále v konfliktu", "1 file still contains": "1 soubor stále obsahuje", @@ -687,6 +689,7 @@ "Changed Files": "Změněné soubory", "Changed files": "Změněné soubory", "Changed on one side, deleted on the other": "Změněno na jedné straně, odstraněno na druhé", + "Changelist name": "Název seznamu změn", "Changes": "Změny", "Changes ({0})": "Změny ({0})", "Changes committed.": "Změny commitnuty.", @@ -1423,6 +1426,7 @@ "Delete '{0}'? Commits that are only on this branch stop being reachable by name. You can undo this straight afterwards.": "Smazat '{0}'? Commity, které jsou jen na této větvi, přestanou být dosažitelné podle názvu. Hned po smazání to můžete vrátit zpět.", "Delete 1": "Smazat 1", "Delete 1 finished branch?": "Smazat 1 dokončenou větev?", + "Delete Changelist": "Odstranit seznam změn", "Delete Remote Branch": "Odstranit vzdálenou větev", "Delete Tag": "Odstranit značku", "Delete asset": "Smazat přílohu", @@ -1624,6 +1628,7 @@ "Drop to apply": "Pustit k použití", "Drop to copy {0}": "Pustit ke kopírování {0}", "Drop to move {0}": "Pustit k přesunu {0}", + "Drop to move {0} to “{1}”": "Pustit k přesunu {0} do „{1}“", "Drop to pop": "Pustit k vyjmutí ze stash", "Drop to stash": "Přesunout do stash", "Drop to stash 1 file": "Přesunout 1 soubor do stash", @@ -1686,6 +1691,7 @@ "Enter a key first.": "Nejprve zadejte klíč.", "Enter a line number, or a range like 12-18.": "Zadejte číslo řádku, nebo rozsah jako 12-18.", "Enter a name and an email to save.": "Pro uložení zadejte jméno a e-mail.", + "Enter a name for the changelist.": "Zadejte název seznamu změn.", "Enter this code at ": "Zadejte tento kód na ", "Enter to send · Shift+Enter for a new line": "Enter pro odeslání · Shift+Enter pro nový řádek", "Error on line {0}": "Chyba na řádku {0}", @@ -1767,6 +1773,7 @@ "Filename including extension…": "Název souboru včetně přípony…", "Files": "Soubory", "Files changed": "Změněné soubory", + "Files in a changelist are left out of Stage All and Commit all until you stage them yourself.": "Soubory v seznamu změn zůstávají mimo Připravit vše a Commitnout vše, dokud je sami nepřipravíte.", "Files in this gist": "Soubory v tomto gistu", "Files resolved": "Vyřešené soubory", "Filter": "Filtr", @@ -2041,6 +2048,7 @@ "GitStudio: couldn't prepare the push — {0}": "GitStudio: nepodařilo se připravit push — {0}", "GitStudio: couldn't prune — {0}": "GitStudio: nepodařilo se vyčistit (prune) — {0}", "GitStudio: couldn't reset {0} to {1}{2}": "GitStudio: nepodařilo se resetovat {0} na {1}{2}", + "GitStudio: couldn't save the changelists — {0}": "GitStudio: seznamy změn se nepodařilo uložit — {0}", "GitStudio: couldn't stage that change — {0}": "GitStudio: nepodařilo se přidat tuto změnu do stage — {0}", "GitStudio: couldn't stage the changes — {0}": "GitStudio: nepodařilo se přidat změny do stage — {0}", "GitStudio: couldn't stash your changes, so nothing ran — {0}": "GitStudio: nepodařilo se uložit vaše změny do stash, takže se nic neprovedlo — {0}", @@ -2059,6 +2067,8 @@ "GitStudio: no worktree this can be done to.": "GitStudio: není žádný pracovní strom, na kterém by to šlo provést.", "GitStudio: nothing staged, or AI is unavailable.": "GitStudio: nic ve stage, nebo AI není dostupná.", "GitStudio: nothing stashed — every file was unticked.": "GitStudio: nic nebylo uloženo do stash — u všech souborů bylo zrušeno zaškrtnutí.", + "GitStudio: nothing to commit. The only changed file is in a changelist — stage it first to commit it.": "GitStudio: není co commitnout. Jediný změněný soubor je v seznamu změn — nejprve ho připravte, abyste ho mohli commitnout.", + "GitStudio: nothing to commit. The only changed files are in changelists — stage the ones to commit first.": "GitStudio: není co commitnout. Jediné změněné soubory jsou v seznamech změn — nejprve připravte ty, které chcete commitnout.", "GitStudio: nothing to draft (stage changes first), or AI is unavailable.": "GitStudio: nic k návrhu (nejdřív přidejte změny do stage), nebo AI není dostupná.", "GitStudio: nothing to stash — the working tree is clean.": "GitStudio: nic k uložení do stash — pracovní strom je čistý.", "GitStudio: open a file in a Git repository to stage lines.": "GitStudio: otevřete soubor v repozitáři gitu, abyste mohli přidávat řádky do stage.", @@ -2548,12 +2558,16 @@ "Move this branch to {0} ({1} reset).\n\nThe commits are undone; their changes stay staged.": "Přesunout tuto větev na {0} ({1} reset).\n\nCommity jsou vráceny zpět; jejich změny zůstanou připravené.", "Move through the output": "Procházet výstupem", "Move to": "Přesunout do", + "Move to Changelist…": "Přesunout do seznamu změn…", "Move to Changes": "Přesunout do Změn", "Move to Trash": "Přesunout do koše", "Move to Trash…": "Přesunout do koše…", "Move up": "Přesunout nahoru", "Move up (Alt+Up)": "Přesunout nahoru (Alt+Up)", + "Move {0} Files to Changelist": "Přesunout {0} souborů do seznamu změn", "Move {0} out of “{1}”": "Přesunout {0} z „{1}“", + "Move {0} to Changelist": "Přesunout {0} do seznamu změn", + "Move {0} to Changelist…": "Přesunout {0} do seznamu změn…", "Move {0} to Changes": "Přesunout {0} do Změn", "Move {0} to the Trash?": "Přesunout {0} do koše?", "Move {0} with the rewrite": "Přesunout {0} s přepisem", @@ -2587,6 +2601,10 @@ "New Branch from '": "Nová větev z '", "New Branch from These Commits": "Nová větev z těchto commitů", "New Branch…": "Nová větev…", + "New Changelist": "Nový seznam změn", + "New Changelist for {0}": "Nový seznam změn pro {0}", + "New Changelist for {0} Files": "Nový seznam změn pro {0} souborů", + "New Changelist…": "Nový seznam změn…", "New PR": "Nový PR", "New Worktree from '": "Nový pracovní strom z '", "New Worktree…": "Nový pracovní strom…", @@ -3492,6 +3510,8 @@ "Removes it from this list only": "Odstraní to jen z tohoto seznamu", "Removing…": "Odebírání…", "Rename": "Přejmenovat", + "Rename Changelist “{0}”": "Přejmenovat seznam změn „{0}“", + "Rename Changelist…": "Přejmenovat seznam změn…", "Rename branch": "Přejmenovat větev", "Rename branch {0}": "Přejmenovat větev {0}", "Rename it, then check it out.": "Přejmenujte ji a pak na ni přepněte.", @@ -3990,6 +4010,7 @@ "Stage (or unstage) the lines selected in the diff": "Zařadit (nebo vyřadit) řádky vybrané v diffu", "Stage All": "Připravit vše", "Stage All Changes": "Připravit všechny změny", + "Stage All in This Changelist": "Připravit vše v tomto seznamu změn", "Stage Changes with Ticks": "Připravit změny podle zaškrtnutí", "Stage Folder": "Připravit složku", "Stage all": "Připravit vše", @@ -4054,6 +4075,7 @@ "Stash 1 selected file…": "Uložit do stash 1 vybraný soubor…", "Stash All Changes": "Uložit všechny změny do stash", "Stash Everything Staged": "Uložit do stash vše připravené", + "Stash These Files": "Uložit tyto soubory do stash", "Stash This File": "Uložit tento soubor do stash", "Stash This Folder": "Uložit tuto složku do stash", "Stash all changes": "Uložit všechny změny do stash", @@ -4208,6 +4230,7 @@ "That isn't a usable folder name.": "To není použitelný název složky.", "That isn't a way to reconcile a pull.": "To není způsob, jak sloučit pull.", "That isn't a {0} this app made.": "To není {0}, který provedla tato aplikace.", + "That name is too long. Keep it under 80 characters.": "Název je příliš dlouhý. Použijte méně než 80 znaků.", "That path escapes the repository — nothing was changed.": "Tato cesta vede mimo repozitář — nic se nezměnilo.", "That path is outside the repository.": "Tato cesta je mimo repozitář.", "That puts back only what it changed, and only where nothing has moved since.": "To vrátí zpět jen to, co to změnilo, a jen tam, kde se od té doby nic nepřesunulo.", @@ -4290,6 +4313,7 @@ "The controls on this bar act on {0}": "Ovládací prvky na této liště působí na {0}", "The current commit": "Aktuální commit", "The dark window and the Dock icon, together. Graphite matches the icon macOS shows while GitStudio is closed. With Neon the Dock icon turns neon while GitStudio runs; macOS still shows the Graphite icon while it is closed.": "Tmavé okno a ikona v Docku společně. Grafit odpovídá ikoně, kterou macOS zobrazuje, když je GitStudio zavřené. S Neonem se ikona v Docku při běhu GitStudia přepne na neonovou; macOS stále zobrazuje ikonu Grafit, když je zavřené.", + "The default changelist": "Výchozí seznam změn", "The download failed.": "Stažení se nezdařilo.", "The dropped commit is back": "Zahozený commit je zpět", "The file goes back to its committed version. {0}": "Soubor se vrátí do své commitnuté verze. {0}", @@ -4401,6 +4425,7 @@ "Theme: System": "Téma: Systém", "There are no files to go to yet.": "Zatím nejsou žádné soubory, na které přejít.", "There are unresolved conflicts — resolve them or cancel first.": "Jsou tu nevyřešené konflikty — nejprve je vyřešte, nebo akci zrušte.", + "There is already a group called “{0}”. Choose another name.": "Skupina s názvem „{0}“ už existuje. Zvolte jiný název.", "There is no '{0}' to reset to — it is not on {1} any more.": "Není tu žádné „{0}“, na které by bylo možné resetovat — už není na {1}.", "There is no '{0}' to reset to, and {1} couldn't be reached to fetch it.": "Není tu žádné „{0}“, na které by bylo možné resetovat, a {1} nebylo dostupné pro jeho stažení.", "There is no Apply to undo here any more.": "Tady už není žádné Použít, které by bylo možné vrátit zpět.", @@ -5704,6 +5729,7 @@ "{0} files have changed since their changes were discarded ({1}), and bringing them back would overwrite that. Nothing was changed.": "{0} souborů se od zahození jejich změn ({1}) změnilo, a jejich vrácení by to přepsalo. Nic se nezměnilo.", "{0} files have conflicts to resolve.": "{0} souborů má konflikty k vyřešení.", "{0} files have conflicts — open Changes to resolve": "Soubory s konflikty: {0} — otevřete Změny pro vyřešení", + "{0} files in changelists are left out.": "Souborů v seznamech změn, které zůstávají stranou: {0}.", "{0} files selected": "{0} vybraných souborů", "{0} files still conflicted": "Soubory stále v konfliktu: {0}", "{0} files still contain": "{0} souborů stále obsahuje", @@ -5988,6 +6014,7 @@ "{0} · {1} · {2} files changed": "{0} · {1} · změněno souborů: {2}", "{0} — Ctrl/Cmd-click to select every file in this section": "{0} — Ctrl/Cmd-klik pro výběr všech souborů v této sekci", "{0} — Ctrl/Cmd-click to select every file, right-click to select just the checked or unchecked ones": "{0} — Ctrl/Cmd-klik pro výběr všech souborů, klik pravým tlačítkem pro výběr jen zaškrtnutých nebo nezaškrtnutých", + "{0} — a changelist: its files stay out of Stage All and Commit all until you stage them. Click to collapse, Ctrl/Cmd-click to select its files, right-click for its actions.": "{0} — seznam změn: jeho soubory zůstávají mimo Připravit vše a Commitnout vše, dokud je nepřipravíte. Klikněte pro sbalení, Ctrl/Cmd-klik pro výběr jeho souborů, pravé tlačítko pro jeho akce.", "{0} — click to collapse, ": "{0} — klikněte pro sbalení, ", "{0} — continue or abort it first.": "{0} — nejdřív to dokončete nebo zrušte.", "{0} — done.": "{0} — hotovo.", @@ -6018,6 +6045,7 @@ "{0}, and more": "{0} a další", "{0}, and {1} more": "{0} a {1} další", "{0}, but {1} isn't: {2}": "{0}, ale {1} není: {2}", + "{0}, changelist, {1}": "{0}, seznam změn, {1}", "{0}, plus the commits of {1} already rebased onto it": "{0}, plus commity {1} už přerebasované na to", "{0}, so it was checked out as {1} at its last commit — a push from there can't reach the pull request. {2}": "{0}, takže to bylo checkoutnuté jako {1} na jeho posledním commitu — push odtamtud se nemůže dostat k pull requestu. {2}", "{0}, then create a branch to push them.": "{0}, pak vytvořte větev, abyste je mohli odeslat.", diff --git a/l10n/de.json b/l10n/de.json index 53aa4bdf..99930cf4 100644 --- a/l10n/de.json +++ b/l10n/de.json @@ -100,6 +100,7 @@ "$(check) Committed": "$(check) Committet", "$(check) Copied {0}": "$(check) {0} kopiert", "$(check) Created & switched to {0}": "$(check) Erstellt und zu {0} gewechselt", + "$(check) Deleted changelist “{0}” — its files are back in Changes": "$(check) Änderungsliste „{0}“ gelöscht – ihre Dateien sind wieder in Changes", "$(check) GitStudio: AI features disabled": "$(check) GitStudio: KI-Funktionen deaktiviert", "$(check) Nothing to push from {0} — up to date": "$(check) Nichts zu pushen von {0} — aktuell", "$(check) Nothing to push — up to date": "$(check) Nichts zu pushen — aktuell", @@ -243,6 +244,7 @@ "1 file": "1 Datei", "1 file changed": "1 Datei geändert", "1 file has conflicts to resolve.": "1 Datei hat zu lösende Konflikte.", + "1 file in a changelist is left out.": "1 Datei in einer Änderungsliste bleibt außen vor.", "1 file selected": "1 Datei ausgewählt", "1 file still conflicted": "1 Datei noch im Konflikt", "1 file still contains": "1 Datei enthält noch", @@ -687,6 +689,7 @@ "Changed Files": "Geänderte Dateien", "Changed files": "Geänderte Dateien", "Changed on one side, deleted on the other": "Auf einer Seite geändert, auf der anderen gelöscht", + "Changelist name": "Name der Änderungsliste", "Changes": "Changes", "Changes ({0})": "Changes ({0})", "Changes committed.": "Änderungen committet.", @@ -1423,6 +1426,7 @@ "Delete '{0}'? Commits that are only on this branch stop being reachable by name. You can undo this straight afterwards.": "'{0}' löschen? Commits, die nur auf diesem Branch liegen, sind dann nicht mehr über einen Namen erreichbar. Dies kann direkt danach rückgängig gemacht werden.", "Delete 1": "1 löschen", "Delete 1 finished branch?": "1 abgeschlossenen Branch löschen?", + "Delete Changelist": "Änderungsliste löschen", "Delete Remote Branch": "Remote-Branch löschen", "Delete Tag": "Tag löschen", "Delete asset": "Asset löschen", @@ -1624,6 +1628,7 @@ "Drop to apply": "Zum Anwenden ablegen", "Drop to copy {0}": "Zum Kopieren von {0} ablegen", "Drop to move {0}": "Zum Verschieben von {0} ablegen", + "Drop to move {0} to “{1}”": "Zum Verschieben von {0} nach „{1}“ ablegen", "Drop to pop": "Zum Pop ablegen", "Drop to stash": "Zum Stashen ablegen", "Drop to stash 1 file": "1 Datei zum Stashen ablegen", @@ -1686,6 +1691,7 @@ "Enter a key first.": "Zuerst einen Schlüssel eingeben.", "Enter a line number, or a range like 12-18.": "Eine Zeilennummer eingeben, oder einen Bereich wie 12-18.", "Enter a name and an email to save.": "Einen Namen und eine E-Mail-Adresse eingeben, um zu speichern.", + "Enter a name for the changelist.": "Geben Sie einen Namen für die Änderungsliste ein.", "Enter this code at ": "Diesen Code eingeben bei ", "Enter to send · Shift+Enter for a new line": "Enter zum Senden · Shift+Enter für eine neue Zeile", "Error on line {0}": "Fehler in Zeile {0}", @@ -1767,6 +1773,7 @@ "Filename including extension…": "Dateiname inklusive Erweiterung…", "Files": "Dateien", "Files changed": "Geänderte Dateien", + "Files in a changelist are left out of Stage All and Commit all until you stage them yourself.": "Dateien in einer Änderungsliste bleiben bei „Alle bereitstellen“ und „Alle committen“ außen vor, bis Sie sie selbst bereitstellen.", "Files in this gist": "Dateien in diesem Gist", "Files resolved": "Dateien gelöst", "Filter": "Filter", @@ -2041,6 +2048,7 @@ "GitStudio: couldn't prepare the push — {0}": "GitStudio: Der Push konnte nicht vorbereitet werden — {0}", "GitStudio: couldn't prune — {0}": "GitStudio: Bereinigen fehlgeschlagen — {0}", "GitStudio: couldn't reset {0} to {1}{2}": "GitStudio: {0} konnte nicht auf {1} zurückgesetzt werden{2}", + "GitStudio: couldn't save the changelists — {0}": "GitStudio: Die Änderungslisten konnten nicht gespeichert werden – {0}", "GitStudio: couldn't stage that change — {0}": "GitStudio: Diese Änderung konnte nicht bereitgestellt werden — {0}", "GitStudio: couldn't stage the changes — {0}": "GitStudio: Die Änderungen konnten nicht bereitgestellt werden — {0}", "GitStudio: couldn't stash your changes, so nothing ran — {0}": "GitStudio: Ihre Änderungen konnten nicht gestasht werden, daher wurde nichts ausgeführt — {0}", @@ -2059,6 +2067,8 @@ "GitStudio: no worktree this can be done to.": "GitStudio: Kein Worktree, auf den das angewendet werden kann.", "GitStudio: nothing staged, or AI is unavailable.": "GitStudio: Nichts bereitgestellt, oder KI ist nicht verfügbar.", "GitStudio: nothing stashed — every file was unticked.": "GitStudio: Nichts gestasht — alle Dateien waren abgewählt.", + "GitStudio: nothing to commit. The only changed file is in a changelist — stage it first to commit it.": "GitStudio: Nichts zu committen. Die einzige geänderte Datei ist in einer Änderungsliste – stellen Sie sie zuerst bereit, um sie zu committen.", + "GitStudio: nothing to commit. The only changed files are in changelists — stage the ones to commit first.": "GitStudio: Nichts zu committen. Die einzigen geänderten Dateien sind in Änderungslisten – stellen Sie zuerst die bereit, die committet werden sollen.", "GitStudio: nothing to draft (stage changes first), or AI is unavailable.": "GitStudio: Nichts zu entwerfen (zuerst Änderungen bereitstellen), oder KI ist nicht verfügbar.", "GitStudio: nothing to stash — the working tree is clean.": "GitStudio: Nichts zu stashen — das Arbeitsverzeichnis ist unverändert.", "GitStudio: open a file in a Git repository to stage lines.": "GitStudio: Eine Datei in einem Git-Repository öffnen, um Zeilen bereitzustellen.", @@ -2548,12 +2558,16 @@ "Move this branch to {0} ({1} reset).\n\nThe commits are undone; their changes stay staged.": "Diesen Branch zu {0} verschieben ({1}-Reset).\n\nDie Commits werden rückgängig gemacht; ihre Änderungen bleiben bereitgestellt.", "Move through the output": "Durch die Ausgabe bewegen", "Move to": "Verschieben nach", + "Move to Changelist…": "In Änderungsliste verschieben…", "Move to Changes": "Zu „Changes“ verschieben", "Move to Trash": "In den Papierkorb verschieben", "Move to Trash…": "In den Papierkorb verschieben…", "Move up": "Nach oben verschieben", "Move up (Alt+Up)": "Nach oben verschieben (Alt+Oben)", + "Move {0} Files to Changelist": "{0} Dateien in Änderungsliste verschieben", "Move {0} out of “{1}”": "{0} aus „{1}“ herausnehmen", + "Move {0} to Changelist": "{0} in Änderungsliste verschieben", + "Move {0} to Changelist…": "{0} in Änderungsliste verschieben…", "Move {0} to Changes": "{0} zu „Changes“ verschieben", "Move {0} to the Trash?": "{0} in den Papierkorb verschieben?", "Move {0} with the rewrite": "{0} mit der Neuschreibung verschieben", @@ -2587,6 +2601,10 @@ "New Branch from '": "Neuer Branch von '", "New Branch from These Commits": "Neuer Branch aus diesen Commits", "New Branch…": "Neuer Branch…", + "New Changelist": "Neue Änderungsliste", + "New Changelist for {0}": "Neue Änderungsliste für {0}", + "New Changelist for {0} Files": "Neue Änderungsliste für {0} Dateien", + "New Changelist…": "Neue Änderungsliste…", "New PR": "Neuer PR", "New Worktree from '": "Neuer Worktree von '", "New Worktree…": "Neuer Worktree…", @@ -3492,6 +3510,8 @@ "Removes it from this list only": "Entfernt es nur aus dieser Liste", "Removing…": "Wird entfernt…", "Rename": "Umbenennen", + "Rename Changelist “{0}”": "Änderungsliste „{0}“ umbenennen", + "Rename Changelist…": "Änderungsliste umbenennen…", "Rename branch": "Branch umbenennen", "Rename branch {0}": "Branch {0} umbenennen", "Rename it, then check it out.": "Umbenennen, dann auschecken.", @@ -3990,6 +4010,7 @@ "Stage (or unstage) the lines selected in the diff": "Die im Diff ausgewählten Zeilen bereitstellen (oder zurücknehmen)", "Stage All": "Alle bereitstellen", "Stage All Changes": "Alle Änderungen bereitstellen", + "Stage All in This Changelist": "Alle in dieser Änderungsliste bereitstellen", "Stage Changes with Ticks": "Änderungen mit Haken bereitstellen", "Stage Folder": "Ordner bereitstellen", "Stage all": "Alle bereitstellen", @@ -4054,6 +4075,7 @@ "Stash 1 selected file…": "1 ausgewählte Datei stashen…", "Stash All Changes": "Alle Änderungen stashen", "Stash Everything Staged": "Alles Bereitgestellte stashen", + "Stash These Files": "Diese Dateien stashen", "Stash This File": "Diese Datei stashen", "Stash This Folder": "Diesen Ordner stashen", "Stash all changes": "Alle Änderungen stashen", @@ -4208,6 +4230,7 @@ "That isn't a usable folder name.": "Das ist kein verwendbarer Ordnername.", "That isn't a way to reconcile a pull.": "Das ist keine Möglichkeit, einen Pull abzugleichen.", "That isn't a {0} this app made.": "Das ist kein {0}, das diese App vorgenommen hat.", + "That name is too long. Keep it under 80 characters.": "Der Name ist zu lang. Bleiben Sie unter 80 Zeichen.", "That path escapes the repository — nothing was changed.": "Dieser Pfad verlässt das Repository — nichts wurde geändert.", "That path is outside the repository.": "Dieser Pfad liegt außerhalb des Repositorys.", "That puts back only what it changed, and only where nothing has moved since.": "Das stellt nur wieder her, was geändert wurde, und nur dort, wo sich seitdem nichts verschoben hat.", @@ -4290,6 +4313,7 @@ "The controls on this bar act on {0}": "Die Steuerelemente in dieser Leiste wirken auf {0}", "The current commit": "Der aktuelle Commit", "The dark window and the Dock icon, together. Graphite matches the icon macOS shows while GitStudio is closed. With Neon the Dock icon turns neon while GitStudio runs; macOS still shows the Graphite icon while it is closed.": "Das dunkle Fenster und das Dock-Symbol zusammen. Graphite passt zu dem Symbol, das macOS zeigt, während GitStudio geschlossen ist. Mit Neon wird das Dock-Symbol neonfarben, während GitStudio läuft; macOS zeigt weiterhin das Graphite-Symbol, während es geschlossen ist.", + "The default changelist": "Die Standard-Änderungsliste", "The download failed.": "Der Download ist fehlgeschlagen.", "The dropped commit is back": "Der verworfene Commit ist zurück", "The file goes back to its committed version. {0}": "Die Datei geht zurück auf ihre committete Version. {0}", @@ -4401,6 +4425,7 @@ "Theme: System": "Theme: System", "There are no files to go to yet.": "Es gibt noch keine Dateien, zu denen gesprungen werden kann.", "There are unresolved conflicts — resolve them or cancel first.": "Es gibt ungelöste Konflikte — sie zuerst auflösen oder abbrechen.", + "There is already a group called “{0}”. Choose another name.": "Es gibt bereits eine Gruppe namens „{0}“. Wählen Sie einen anderen Namen.", "There is no '{0}' to reset to — it is not on {1} any more.": "Es gibt kein „{0}“, auf das zurückgesetzt werden kann — es ist nicht mehr auf {1}.", "There is no '{0}' to reset to, and {1} couldn't be reached to fetch it.": "Es gibt kein „{0}“, auf das zurückgesetzt werden kann, und {1} konnte nicht erreicht werden, um es abzurufen.", "There is no Apply to undo here any more.": "Es gibt hier kein Apply mehr, das rückgängig gemacht werden könnte.", @@ -5704,6 +5729,7 @@ "{0} files have changed since their changes were discarded ({1}), and bringing them back would overwrite that. Nothing was changed.": "{0} Dateien haben sich geändert, seit ihre Änderungen verworfen wurden ({1}), und ein Zurückholen würde das überschreiben. Es wurde nichts geändert.", "{0} files have conflicts to resolve.": "{0} Dateien haben zu lösende Konflikte.", "{0} files have conflicts — open Changes to resolve": "{0} Dateien haben Konflikte — Changes öffnen, um sie aufzulösen", + "{0} files in changelists are left out.": "{0} Dateien in Änderungslisten bleiben außen vor.", "{0} files selected": "{0} Dateien ausgewählt", "{0} files still conflicted": "{0} Dateien noch im Konflikt", "{0} files still contain": "{0} Dateien enthalten noch", @@ -5988,6 +6014,7 @@ "{0} · {1} · {2} files changed": "{0} · {1} · {2} Dateien geändert", "{0} — Ctrl/Cmd-click to select every file in this section": "{0} — Strg/Cmd-Klick, um jede Datei in diesem Abschnitt auszuwählen", "{0} — Ctrl/Cmd-click to select every file, right-click to select just the checked or unchecked ones": "{0} — Strg/Cmd-Klick, um jede Datei auszuwählen, Rechtsklick, um nur die markierten oder unmarkierten auszuwählen", + "{0} — a changelist: its files stay out of Stage All and Commit all until you stage them. Click to collapse, Ctrl/Cmd-click to select its files, right-click for its actions.": "{0} – eine Änderungsliste: ihre Dateien bleiben bei „Alle bereitstellen“ und „Alle committen“ außen vor, bis Sie sie bereitstellen. Klicken zum Einklappen, Strg/Cmd-Klick zum Auswählen ihrer Dateien, Rechtsklick für ihre Aktionen.", "{0} — click to collapse, ": "{0} — klicken, um einzuklappen, ", "{0} — continue or abort it first.": "{0} — zuerst fortsetzen oder abbrechen.", "{0} — done.": "{0} — erledigt.", @@ -6018,6 +6045,7 @@ "{0}, and more": "{0}, und mehr", "{0}, and {1} more": "{0}, und {1} weitere", "{0}, but {1} isn't: {2}": "{0}, aber {1} nicht: {2}", + "{0}, changelist, {1}": "{0}, Änderungsliste, {1}", "{0}, plus the commits of {1} already rebased onto it": "{0}, plus die Commits von {1}, die bereits darauf rebasiert wurden", "{0}, so it was checked out as {1} at its last commit — a push from there can't reach the pull request. {2}": "{0}, daher wurde es als {1} bei seinem letzten Commit ausgecheckt — ein Push von dort kann den Pull Request nicht erreichen. {2}", "{0}, then create a branch to push them.": "{0}, dann einen Branch erstellen, um sie zu pushen.", diff --git a/l10n/es.json b/l10n/es.json index ccd328ab..52be5067 100644 --- a/l10n/es.json +++ b/l10n/es.json @@ -100,6 +100,7 @@ "$(check) Committed": "$(check) Confirmado", "$(check) Copied {0}": "$(check) {0} copiado", "$(check) Created & switched to {0}": "$(check) Creada y cambiada a {0}", + "$(check) Deleted changelist “{0}” — its files are back in Changes": "$(check) Lista de cambios «{0}» eliminada: sus archivos vuelven a Cambios", "$(check) GitStudio: AI features disabled": "$(check) GitStudio: funciones de IA deshabilitadas", "$(check) Nothing to push from {0} — up to date": "$(check) Nada para publicar desde {0} — ya está al día", "$(check) Nothing to push — up to date": "$(check) Nada para publicar — ya está al día", @@ -243,6 +244,7 @@ "1 file": "1 archivo", "1 file changed": "1 archivo modificado", "1 file has conflicts to resolve.": "1 archivo tiene conflictos por resolver.", + "1 file in a changelist is left out.": "Se deja fuera 1 archivo de una lista de cambios.", "1 file selected": "1 archivo seleccionado", "1 file still conflicted": "1 archivo aún en conflicto", "1 file still contains": "1 archivo todavía contiene", @@ -687,6 +689,7 @@ "Changed Files": "Archivos cambiados", "Changed files": "Archivos cambiados", "Changed on one side, deleted on the other": "Cambiado en un lado, eliminado en el otro", + "Changelist name": "Nombre de la lista de cambios", "Changes": "Cambios", "Changes ({0})": "Cambios ({0})", "Changes committed.": "Cambios confirmados.", @@ -1423,6 +1426,7 @@ "Delete '{0}'? Commits that are only on this branch stop being reachable by name. You can undo this straight afterwards.": "¿Eliminar '{0}'? Los commits que solo están en esta rama dejan de ser accesibles por nombre. Puedes deshacer esto justo después.", "Delete 1": "Eliminar 1", "Delete 1 finished branch?": "¿Eliminar 1 rama terminada?", + "Delete Changelist": "Eliminar lista de cambios", "Delete Remote Branch": "Eliminar rama remota", "Delete Tag": "Eliminar etiqueta", "Delete asset": "Eliminar recurso", @@ -1624,6 +1628,7 @@ "Drop to apply": "Soltar para aplicar", "Drop to copy {0}": "Soltar para copiar {0}", "Drop to move {0}": "Soltar para mover {0}", + "Drop to move {0} to “{1}”": "Soltar para mover {0} a «{1}»", "Drop to pop": "Soltar para recuperar", "Drop to stash": "Soltar en stash", "Drop to stash 1 file": "Soltar en stash 1 archivo", @@ -1686,6 +1691,7 @@ "Enter a key first.": "Introduce una clave primero.", "Enter a line number, or a range like 12-18.": "Introduce un número de línea, o un rango como 12-18.", "Enter a name and an email to save.": "Introduce un nombre y un correo electrónico para guardar.", + "Enter a name for the changelist.": "Escribe un nombre para la lista de cambios.", "Enter this code at ": "Introduce este código en ", "Enter to send · Shift+Enter for a new line": "Enter para enviar · Shift+Enter para una línea nueva", "Error on line {0}": "Error en la línea {0}", @@ -1767,6 +1773,7 @@ "Filename including extension…": "Nombre del archivo con extensión…", "Files": "Archivos", "Files changed": "Archivos cambiados", + "Files in a changelist are left out of Stage All and Commit all until you stage them yourself.": "Los archivos de una lista de cambios quedan fuera de Preparar todo y Confirmar todo hasta que los prepares tú.", "Files in this gist": "Archivos de este gist", "Files resolved": "Archivos resueltos", "Filter": "Filtro", @@ -2041,6 +2048,7 @@ "GitStudio: couldn't prepare the push — {0}": "GitStudio: no se pudo preparar el push — {0}", "GitStudio: couldn't prune — {0}": "GitStudio: no se pudo ejecutar prune — {0}", "GitStudio: couldn't reset {0} to {1}{2}": "GitStudio: no se pudo restablecer {0} a {1}{2}", + "GitStudio: couldn't save the changelists — {0}": "GitStudio: no se pudieron guardar las listas de cambios: {0}", "GitStudio: couldn't stage that change — {0}": "GitStudio: no se pudo preparar ese cambio — {0}", "GitStudio: couldn't stage the changes — {0}": "GitStudio: no se pudieron preparar los cambios — {0}", "GitStudio: couldn't stash your changes, so nothing ran — {0}": "GitStudio: no se pudieron guardar tus cambios en el stash, así que no se ejecutó nada — {0}", @@ -2059,6 +2067,8 @@ "GitStudio: no worktree this can be done to.": "GitStudio: no hay worktree sobre el que hacer esto.", "GitStudio: nothing staged, or AI is unavailable.": "GitStudio: nada preparado, o la IA no está disponible.", "GitStudio: nothing stashed — every file was unticked.": "GitStudio: no se guardó nada en el stash — se desmarcaron todos los archivos.", + "GitStudio: nothing to commit. The only changed file is in a changelist — stage it first to commit it.": "GitStudio: no hay nada que confirmar. El único archivo cambiado está en una lista de cambios; prepáralo primero para confirmarlo.", + "GitStudio: nothing to commit. The only changed files are in changelists — stage the ones to commit first.": "GitStudio: no hay nada que confirmar. Los únicos archivos cambiados están en listas de cambios; prepara primero los que quieras confirmar.", "GitStudio: nothing to draft (stage changes first), or AI is unavailable.": "GitStudio: nada que redactar (prepara cambios primero), o la IA no está disponible.", "GitStudio: nothing to stash — the working tree is clean.": "GitStudio: nada que guardar en el stash — el árbol de trabajo está limpio.", "GitStudio: open a file in a Git repository to stage lines.": "GitStudio: abre un archivo en un repositorio Git para preparar líneas.", @@ -2548,12 +2558,16 @@ "Move this branch to {0} ({1} reset).\n\nThe commits are undone; their changes stay staged.": "Mover esta rama a {0} (restablecimiento {1}).\n\nLos commits se deshacen; sus cambios permanecen preparados.", "Move through the output": "Moverse por la salida", "Move to": "Mover a", + "Move to Changelist…": "Mover a lista de cambios…", "Move to Changes": "Mover a Cambios", "Move to Trash": "Mover a la Papelera", "Move to Trash…": "Mover a la Papelera…", "Move up": "Mover hacia arriba", "Move up (Alt+Up)": "Mover hacia arriba (Alt+Arriba)", + "Move {0} Files to Changelist": "Mover {0} archivos a lista de cambios", "Move {0} out of “{1}”": "Sacar {0} de “{1}”", + "Move {0} to Changelist": "Mover {0} a lista de cambios", + "Move {0} to Changelist…": "Mover {0} a lista de cambios…", "Move {0} to Changes": "Mover {0} a Cambios", "Move {0} to the Trash?": "¿Mover {0} a la Papelera?", "Move {0} with the rewrite": "Mover {0} con la reescritura", @@ -2587,6 +2601,10 @@ "New Branch from '": "Nueva rama desde '", "New Branch from These Commits": "Nueva rama a partir de estos commits", "New Branch…": "Nueva rama…", + "New Changelist": "Nueva lista de cambios", + "New Changelist for {0}": "Nueva lista de cambios para {0}", + "New Changelist for {0} Files": "Nueva lista de cambios para {0} archivos", + "New Changelist…": "Nueva lista de cambios…", "New PR": "Nuevo PR", "New Worktree from '": "Nuevo worktree desde '", "New Worktree…": "Nuevo worktree…", @@ -3492,6 +3510,8 @@ "Removes it from this list only": "Lo elimina solo de esta lista", "Removing…": "Eliminando…", "Rename": "Renombrar", + "Rename Changelist “{0}”": "Renombrar la lista de cambios «{0}»", + "Rename Changelist…": "Renombrar lista de cambios…", "Rename branch": "Renombrar rama", "Rename branch {0}": "Renombrar la rama {0}", "Rename it, then check it out.": "Renómbrala y luego cámbiate a ella.", @@ -3990,6 +4010,7 @@ "Stage (or unstage) the lines selected in the diff": "Preparar (o dejar de preparar) las líneas seleccionadas en el diff", "Stage All": "Preparar todo", "Stage All Changes": "Preparar todos los cambios", + "Stage All in This Changelist": "Preparar todo en esta lista de cambios", "Stage Changes with Ticks": "Preparar cambios con marcas", "Stage Folder": "Preparar carpeta", "Stage all": "Preparar todo", @@ -4054,6 +4075,7 @@ "Stash 1 selected file…": "Guardar en el stash 1 archivo seleccionado…", "Stash All Changes": "Guardar todos los cambios en el stash", "Stash Everything Staged": "Guardar todo lo preparado en el stash", + "Stash These Files": "Guardar estos archivos en el stash", "Stash This File": "Guardar este archivo en el stash", "Stash This Folder": "Guardar esta carpeta en el stash", "Stash all changes": "Guardar todos los cambios en stash", @@ -4208,6 +4230,7 @@ "That isn't a usable folder name.": "Ese no es un nombre de carpeta usable.", "That isn't a way to reconcile a pull.": "Esa no es una forma de reconciliar una incorporación.", "That isn't a {0} this app made.": "Ese no es un {0} que haya hecho esta app.", + "That name is too long. Keep it under 80 characters.": "Ese nombre es demasiado largo. Usa menos de 80 caracteres.", "That path escapes the repository — nothing was changed.": "Esa ruta se sale del repositorio — no se cambió nada.", "That path is outside the repository.": "Esa ruta está fuera del repositorio.", "That puts back only what it changed, and only where nothing has moved since.": "Eso solo devuelve lo que cambió, y solo donde nada se ha movido desde entonces.", @@ -4290,6 +4313,7 @@ "The controls on this bar act on {0}": "Los controles de esta barra actúan sobre {0}", "The current commit": "El commit actual", "The dark window and the Dock icon, together. Graphite matches the icon macOS shows while GitStudio is closed. With Neon the Dock icon turns neon while GitStudio runs; macOS still shows the Graphite icon while it is closed.": "La ventana oscura y el icono del Dock, juntos. Graphite coincide con el icono que muestra macOS mientras GitStudio está cerrado. Con Neon, el icono del Dock se vuelve neón mientras GitStudio se ejecuta; macOS sigue mostrando el icono Graphite mientras está cerrado.", + "The default changelist": "La lista de cambios predeterminada", "The download failed.": "Falló la descarga.", "The dropped commit is back": "El commit descartado volvió", "The file goes back to its committed version. {0}": "El archivo vuelve a su versión confirmada. {0}", @@ -4401,6 +4425,7 @@ "Theme: System": "Tema: Sistema", "There are no files to go to yet.": "Todavía no hay archivos a los que ir.", "There are unresolved conflicts — resolve them or cancel first.": "Hay conflictos sin resolver — resuélvelos o cancela primero.", + "There is already a group called “{0}”. Choose another name.": "Ya hay un grupo llamado «{0}». Elige otro nombre.", "There is no '{0}' to reset to — it is not on {1} any more.": "No hay '{0}' al que restablecer — ya no está en {1}.", "There is no '{0}' to reset to, and {1} couldn't be reached to fetch it.": "No hay '{0}' al que restablecer, y no se pudo contactar con {1} para obtenerlo.", "There is no Apply to undo here any more.": "Ya no hay ningún Aplicar que deshacer aquí.", @@ -5704,6 +5729,7 @@ "{0} files have changed since their changes were discarded ({1}), and bringing them back would overwrite that. Nothing was changed.": "{0} archivos han cambiado desde que se descartaron sus cambios ({1}), y recuperarlos sobrescribiría eso. No se cambió nada.", "{0} files have conflicts to resolve.": "{0} archivos tienen conflictos por resolver.", "{0} files have conflicts — open Changes to resolve": "{0} archivos tienen conflictos — abre Cambios para resolver", + "{0} files in changelists are left out.": "Se dejan fuera {0} archivos de listas de cambios.", "{0} files selected": "{0} archivos seleccionados", "{0} files still conflicted": "{0} archivos aún en conflicto", "{0} files still contain": "{0} archivos todavía contienen", @@ -5988,6 +6014,7 @@ "{0} · {1} · {2} files changed": "{0} · {1} · {2} archivos modificados", "{0} — Ctrl/Cmd-click to select every file in this section": "{0} — Ctrl/Cmd-clic para seleccionar todos los archivos de esta sección", "{0} — Ctrl/Cmd-click to select every file, right-click to select just the checked or unchecked ones": "{0} — Ctrl/Cmd-clic para seleccionar todos los archivos, clic derecho para seleccionar solo los marcados o sin marcar", + "{0} — a changelist: its files stay out of Stage All and Commit all until you stage them. Click to collapse, Ctrl/Cmd-click to select its files, right-click for its actions.": "{0}: una lista de cambios; sus archivos quedan fuera de Preparar todo y Confirmar todo hasta que los prepares. Clic para contraer, Ctrl/Cmd-clic para seleccionar sus archivos, clic derecho para sus acciones.", "{0} — click to collapse, ": "{0} — clic para contraer, ", "{0} — continue or abort it first.": "{0} — continúalo o abórtalo primero.", "{0} — done.": "{0} — hecho.", @@ -6018,6 +6045,7 @@ "{0}, and more": "{0}, y más", "{0}, and {1} more": "{0}, y {1} más", "{0}, but {1} isn't: {2}": "{0}, pero {1} no lo está: {2}", + "{0}, changelist, {1}": "{0}, lista de cambios, {1}", "{0}, plus the commits of {1} already rebased onto it": "{0}, más los commits de {1} ya rebasados sobre ella", "{0}, so it was checked out as {1} at its last commit — a push from there can't reach the pull request. {2}": "{0}, así que se usó como {1} en su último commit — un push desde ahí no puede llegar al pull request. {2}", "{0}, then create a branch to push them.": "{0}, y luego crea una rama para publicarlos.", diff --git a/l10n/fr.json b/l10n/fr.json index 4990f742..ba4ea808 100644 --- a/l10n/fr.json +++ b/l10n/fr.json @@ -100,6 +100,7 @@ "$(check) Committed": "$(check) Validé", "$(check) Copied {0}": "$(check) {0} copié", "$(check) Created & switched to {0}": "$(check) Créé et basculé vers {0}", + "$(check) Deleted changelist “{0}” — its files are back in Changes": "$(check) Liste de modifications « {0} » supprimée — ses fichiers sont de retour dans Modifications", "$(check) GitStudio: AI features disabled": "$(check) GitStudio : fonctionnalités d'IA désactivées", "$(check) Nothing to push from {0} — up to date": "$(check) Rien à pousser depuis {0} — à jour", "$(check) Nothing to push — up to date": "$(check) Rien à pousser — à jour", @@ -243,6 +244,7 @@ "1 file": "1 fichier", "1 file changed": "1 fichier modifié", "1 file has conflicts to resolve.": "1 fichier a des conflits à résoudre.", + "1 file in a changelist is left out.": "1 fichier d'une liste de modifications est laissé de côté.", "1 file selected": "1 fichier sélectionné", "1 file still conflicted": "1 fichier encore en conflit", "1 file still contains": "1 fichier contient encore", @@ -687,6 +689,7 @@ "Changed Files": "Fichiers modifiés", "Changed files": "Fichiers modifiés", "Changed on one side, deleted on the other": "Modifié d'un côté, supprimé de l'autre", + "Changelist name": "Nom de la liste de modifications", "Changes": "Modifications", "Changes ({0})": "Modifications ({0})", "Changes committed.": "Modifications validées.", @@ -1423,6 +1426,7 @@ "Delete '{0}'? Commits that are only on this branch stop being reachable by name. You can undo this straight afterwards.": "Supprimer « {0} » ? Les commits qui sont uniquement sur cette branche ne sont plus accessibles par nom. Vous pouvez annuler ceci juste après.", "Delete 1": "Supprimer 1", "Delete 1 finished branch?": "Supprimer 1 branche terminée ?", + "Delete Changelist": "Supprimer la liste de modifications", "Delete Remote Branch": "Supprimer la branche distante", "Delete Tag": "Supprimer l'étiquette", "Delete asset": "Supprimer la ressource", @@ -1624,6 +1628,7 @@ "Drop to apply": "Déposer pour appliquer", "Drop to copy {0}": "Déposer pour copier {0}", "Drop to move {0}": "Déposer pour déplacer {0}", + "Drop to move {0} to “{1}”": "Déposer pour déplacer {0} vers « {1} »", "Drop to pop": "Déposer pour appliquer et supprimer", "Drop to stash": "Déposer pour remiser", "Drop to stash 1 file": "Déposer pour remiser 1 fichier", @@ -1686,6 +1691,7 @@ "Enter a key first.": "Entrez d'abord une clé.", "Enter a line number, or a range like 12-18.": "Entrez un numéro de ligne, ou un intervalle comme 12-18.", "Enter a name and an email to save.": "Entrez un nom et un e-mail pour enregistrer.", + "Enter a name for the changelist.": "Entrez un nom pour la liste de modifications.", "Enter this code at ": "Entrez ce code sur ", "Enter to send · Shift+Enter for a new line": "Entrée pour envoyer · Maj+Entrée pour une nouvelle ligne", "Error on line {0}": "Erreur à la ligne {0}", @@ -1767,6 +1773,7 @@ "Filename including extension…": "Nom de fichier avec son extension…", "Files": "Fichiers", "Files changed": "Fichiers modifiés", + "Files in a changelist are left out of Stage All and Commit all until you stage them yourself.": "Les fichiers d'une liste de modifications restent hors de Indexer tout et de Valider tout, jusqu'à ce que vous les indexiez vous-même.", "Files in this gist": "Fichiers de ce gist", "Files resolved": "Fichiers résolus", "Filter": "Filtrer", @@ -2041,6 +2048,7 @@ "GitStudio: couldn't prepare the push — {0}": "GitStudio : le push n'a pas pu être préparé — {0}", "GitStudio: couldn't prune — {0}": "GitStudio : la purge n'a pas pu être effectuée — {0}", "GitStudio: couldn't reset {0} to {1}{2}": "GitStudio : impossible de réinitialiser {0} à {1}{2}", + "GitStudio: couldn't save the changelists — {0}": "GitStudio : impossible d'enregistrer les listes de modifications — {0}", "GitStudio: couldn't stage that change — {0}": "GitStudio : impossible d'indexer cette modification — {0}", "GitStudio: couldn't stage the changes — {0}": "GitStudio : impossible d'indexer les modifications — {0}", "GitStudio: couldn't stash your changes, so nothing ran — {0}": "GitStudio : impossible de remiser vos modifications, rien n'a donc été exécuté — {0}", @@ -2059,6 +2067,8 @@ "GitStudio: no worktree this can be done to.": "GitStudio : aucune arborescence de travail sur laquelle faire cela.", "GitStudio: nothing staged, or AI is unavailable.": "GitStudio : rien n'est indexé, ou l'IA n'est pas disponible.", "GitStudio: nothing stashed — every file was unticked.": "GitStudio : rien n'a été remisé — tous les fichiers étaient décochés.", + "GitStudio: nothing to commit. The only changed file is in a changelist — stage it first to commit it.": "GitStudio : rien à valider. Le seul fichier modifié est dans une liste de modifications — indexez-le d'abord pour le valider.", + "GitStudio: nothing to commit. The only changed files are in changelists — stage the ones to commit first.": "GitStudio : rien à valider. Les seuls fichiers modifiés sont dans des listes de modifications — indexez d'abord ceux à valider.", "GitStudio: nothing to draft (stage changes first), or AI is unavailable.": "GitStudio : rien à rédiger (indexez d'abord des modifications), ou l'IA n'est pas disponible.", "GitStudio: nothing to stash — the working tree is clean.": "GitStudio : rien à remiser — l'arbre de travail est propre.", "GitStudio: open a file in a Git repository to stage lines.": "GitStudio : ouvrez un fichier dans un dépôt Git pour indexer des lignes.", @@ -2548,12 +2558,16 @@ "Move this branch to {0} ({1} reset).\n\nThe commits are undone; their changes stay staged.": "Déplacer cette branche sur {0} ({1} réinitialisation).\n\nLes commits sont annulés ; leurs modifications restent indexées.", "Move through the output": "Se déplacer dans la sortie", "Move to": "Déplacer vers", + "Move to Changelist…": "Déplacer vers une liste de modifications…", "Move to Changes": "Déplacer vers Modifications", "Move to Trash": "Mettre à la corbeille", "Move to Trash…": "Mettre à la corbeille…", "Move up": "Déplacer vers le haut", "Move up (Alt+Up)": "Déplacer vers le haut (Alt+Haut)", + "Move {0} Files to Changelist": "Déplacer {0} fichiers vers une liste de modifications", "Move {0} out of “{1}”": "Sortir {0} de « {1} »", + "Move {0} to Changelist": "Déplacer {0} vers une liste de modifications", + "Move {0} to Changelist…": "Déplacer {0} vers une liste de modifications…", "Move {0} to Changes": "Déplacer {0} vers Modifications", "Move {0} to the Trash?": "Mettre {0} à la corbeille ?", "Move {0} with the rewrite": "Déplacer {0} avec la réécriture", @@ -2587,6 +2601,10 @@ "New Branch from '": "Nouvelle branche à partir de « ", "New Branch from These Commits": "Nouvelle branche à partir de ces commits", "New Branch…": "Nouvelle branche…", + "New Changelist": "Nouvelle liste de modifications", + "New Changelist for {0}": "Nouvelle liste de modifications pour {0}", + "New Changelist for {0} Files": "Nouvelle liste de modifications pour {0} fichiers", + "New Changelist…": "Nouvelle liste de modifications…", "New PR": "Nouvelle PR", "New Worktree from '": "Nouvelle arborescence de travail à partir de « ", "New Worktree…": "Nouvelle arborescence de travail…", @@ -3492,6 +3510,8 @@ "Removes it from this list only": "Le retire de cette liste uniquement", "Removing…": "Suppression en cours…", "Rename": "Renommer", + "Rename Changelist “{0}”": "Renommer la liste de modifications « {0} »", + "Rename Changelist…": "Renommer la liste de modifications…", "Rename branch": "Renommer la branche", "Rename branch {0}": "Renommer la branche {0}", "Rename it, then check it out.": "Renommez-la, puis extrayez-la.", @@ -3990,6 +4010,7 @@ "Stage (or unstage) the lines selected in the diff": "Indexer (ou désindexer) les lignes sélectionnées dans le diff", "Stage All": "Indexer tout", "Stage All Changes": "Indexer toutes les modifications", + "Stage All in This Changelist": "Indexer tout dans cette liste de modifications", "Stage Changes with Ticks": "Indexer les modifications cochées", "Stage Folder": "Indexer le dossier", "Stage all": "Indexer tout", @@ -4054,6 +4075,7 @@ "Stash 1 selected file…": "Remiser 1 fichier sélectionné…", "Stash All Changes": "Remiser toutes les modifications", "Stash Everything Staged": "Remiser tout ce qui est indexé", + "Stash These Files": "Remiser ces fichiers", "Stash This File": "Remiser ce fichier", "Stash This Folder": "Remiser ce dossier", "Stash all changes": "Stasher toutes les modifications", @@ -4208,6 +4230,7 @@ "That isn't a usable folder name.": "Ce n'est pas un nom de dossier utilisable.", "That isn't a way to reconcile a pull.": "Ce n'est pas une façon de réconcilier un tirage (pull).", "That isn't a {0} this app made.": "Ce n'est pas un {0} fait par cette application.", + "That name is too long. Keep it under 80 characters.": "Ce nom est trop long. Restez sous 80 caractères.", "That path escapes the repository — nothing was changed.": "Ce chemin sort du dépôt — rien n'a été modifié.", "That path is outside the repository.": "Ce chemin est hors du dépôt.", "That puts back only what it changed, and only where nothing has moved since.": "Cela ne remet en place que ce qui a été modifié, et seulement là où rien n'a bougé depuis.", @@ -4290,6 +4313,7 @@ "The controls on this bar act on {0}": "Les contrôles de cette barre agissent sur {0}", "The current commit": "Le commit actuel", "The dark window and the Dock icon, together. Graphite matches the icon macOS shows while GitStudio is closed. With Neon the Dock icon turns neon while GitStudio runs; macOS still shows the Graphite icon while it is closed.": "La fenêtre sombre et l'icône du Dock, ensemble. Graphite correspond à l'icône que macOS affiche quand GitStudio est fermé. Avec Néon, l'icône du Dock devient néon pendant que GitStudio fonctionne ; macOS affiche toujours l'icône Graphite quand c'est fermé.", + "The default changelist": "La liste de modifications par défaut", "The download failed.": "Le téléchargement a échoué.", "The dropped commit is back": "Le commit supprimé est de retour", "The file goes back to its committed version. {0}": "Le fichier revient à sa version validée. {0}", @@ -4401,6 +4425,7 @@ "Theme: System": "Thème : système", "There are no files to go to yet.": "Il n'y a pas encore de fichiers à parcourir.", "There are unresolved conflicts — resolve them or cancel first.": "Il y a des conflits non résolus — résolvez-les ou annulez d'abord.", + "There is already a group called “{0}”. Choose another name.": "Un groupe nommé « {0} » existe déjà. Choisissez un autre nom.", "There is no '{0}' to reset to — it is not on {1} any more.": "Il n'y a pas de « {0} » auquel réinitialiser — il n'est plus sur {1}.", "There is no '{0}' to reset to, and {1} couldn't be reached to fetch it.": "Il n'y a pas de « {0} » auquel réinitialiser, et {1} n'a pas pu être atteint pour le récupérer.", "There is no Apply to undo here any more.": "Il n'y a plus d'application à annuler ici.", @@ -5704,6 +5729,7 @@ "{0} files have changed since their changes were discarded ({1}), and bringing them back would overwrite that. Nothing was changed.": "{0} fichiers ont changé depuis que leurs modifications ont été ignorées ({1}), et les remettre en place écraserait ça. Rien n'a été changé.", "{0} files have conflicts to resolve.": "{0} fichiers ont des conflits à résoudre.", "{0} files have conflicts — open Changes to resolve": "{0} fichiers ont des conflits — ouvrez Modifications pour résoudre", + "{0} files in changelists are left out.": "{0} fichiers de listes de modifications sont laissés de côté.", "{0} files selected": "{0} fichiers sélectionnés", "{0} files still conflicted": "{0} fichiers encore en conflit", "{0} files still contain": "{0} fichiers contiennent encore", @@ -5988,6 +6014,7 @@ "{0} · {1} · {2} files changed": "{0} · {1} · {2} fichiers modifiés", "{0} — Ctrl/Cmd-click to select every file in this section": "{0} — Ctrl/Cmd-clic pour sélectionner tous les fichiers de cette section", "{0} — Ctrl/Cmd-click to select every file, right-click to select just the checked or unchecked ones": "{0} — Ctrl/Cmd-clic pour sélectionner tous les fichiers, clic droit pour sélectionner seulement les cochés ou les non cochés", + "{0} — a changelist: its files stay out of Stage All and Commit all until you stage them. Click to collapse, Ctrl/Cmd-click to select its files, right-click for its actions.": "{0} — une liste de modifications : ses fichiers restent hors de Indexer tout et de Valider tout jusqu'à ce que vous les indexiez. Cliquez pour réduire, Ctrl/Cmd-clic pour sélectionner ses fichiers, clic droit pour ses actions.", "{0} — click to collapse, ": "{0} — cliquez pour réduire, ", "{0} — continue or abort it first.": "{0} — continuez-le ou abandonnez-le d'abord.", "{0} — done.": "{0} — terminé.", @@ -6018,6 +6045,7 @@ "{0}, and more": "{0}, et plus", "{0}, and {1} more": "{0}, et {1} de plus", "{0}, but {1} isn't: {2}": "{0}, mais {1} ne l'est pas : {2}", + "{0}, changelist, {1}": "{0}, liste de modifications, {1}", "{0}, plus the commits of {1} already rebased onto it": "{0}, plus les commits de {1} déjà rebasés sur elle", "{0}, so it was checked out as {1} at its last commit — a push from there can't reach the pull request. {2}": "{0}, elle a donc été extraite comme {1} à son dernier commit — un push depuis là ne peut pas atteindre la pull request. {2}", "{0}, then create a branch to push them.": "{0}, puis créez une branche pour les pousser.", diff --git a/l10n/it.json b/l10n/it.json index b5cf5b26..2e16be64 100644 --- a/l10n/it.json +++ b/l10n/it.json @@ -100,6 +100,7 @@ "$(check) Committed": "$(check) Commit eseguito", "$(check) Copied {0}": "$(check) Copiato {0}", "$(check) Created & switched to {0}": "$(check) Creato e passato a {0}", + "$(check) Deleted changelist “{0}” — its files are back in Changes": "$(check) Elenco modifiche «{0}» eliminato: i suoi file sono di nuovo in Modifiche", "$(check) GitStudio: AI features disabled": "$(check) GitStudio: funzionalità AI disattivate", "$(check) Nothing to push from {0} — up to date": "$(check) Niente da pushare da {0} — aggiornato", "$(check) Nothing to push — up to date": "$(check) Niente da pushare — aggiornato", @@ -243,6 +244,7 @@ "1 file": "1 file", "1 file changed": "1 file modificato", "1 file has conflicts to resolve.": "1 file ha conflitti da risolvere.", + "1 file in a changelist is left out.": "1 file in un elenco modifiche viene escluso.", "1 file selected": "1 file selezionato", "1 file still conflicted": "1 file ancora in conflitto", "1 file still contains": "1 file contiene ancora", @@ -687,6 +689,7 @@ "Changed Files": "File modificati", "Changed files": "File modificati", "Changed on one side, deleted on the other": "Modificato su un lato, eliminato sull'altro", + "Changelist name": "Nome dell'elenco modifiche", "Changes": "Modifiche", "Changes ({0})": "Modifiche ({0})", "Changes committed.": "Modifiche salvate nel commit.", @@ -1423,6 +1426,7 @@ "Delete '{0}'? Commits that are only on this branch stop being reachable by name. You can undo this straight afterwards.": "Eliminare '{0}'? I commit presenti solo su questo ramo non saranno più raggiungibili per nome. Puoi annullare subito dopo.", "Delete 1": "Elimina 1", "Delete 1 finished branch?": "Eliminare 1 ramo concluso?", + "Delete Changelist": "Elimina elenco modifiche", "Delete Remote Branch": "Elimina ramo remoto", "Delete Tag": "Elimina tag", "Delete asset": "Elimina risorsa", @@ -1624,6 +1628,7 @@ "Drop to apply": "Rilascia per applicare", "Drop to copy {0}": "Rilascia per copiare {0}", "Drop to move {0}": "Rilascia per spostare {0}", + "Drop to move {0} to “{1}”": "Rilascia per spostare {0} in «{1}»", "Drop to pop": "Rilascia per il pop", "Drop to stash": "Rilascia per lo stash", "Drop to stash 1 file": "Rilascia per lo stash di 1 file", @@ -1686,6 +1691,7 @@ "Enter a key first.": "Inserisci prima una chiave.", "Enter a line number, or a range like 12-18.": "Inserisci un numero di riga, o un intervallo come 12-18.", "Enter a name and an email to save.": "Inserisci un nome e un'email per salvare.", + "Enter a name for the changelist.": "Inserisci un nome per l'elenco modifiche.", "Enter this code at ": "Inserisci questo codice su ", "Enter to send · Shift+Enter for a new line": "Invio per inviare · Shift+Invio per una nuova riga", "Error on line {0}": "Errore alla riga {0}", @@ -1767,6 +1773,7 @@ "Filename including extension…": "Nome file con estensione…", "Files": "File", "Files changed": "File modificati", + "Files in a changelist are left out of Stage All and Commit all until you stage them yourself.": "I file in un elenco modifiche restano fuori da Stage tutto e dal commit di tutto finché non esegui tu lo stage.", "Files in this gist": "File in questo gist", "Files resolved": "File risolti", "Filter": "Filtro", @@ -2041,6 +2048,7 @@ "GitStudio: couldn't prepare the push — {0}": "GitStudio: non è stato possibile preparare il push — {0}", "GitStudio: couldn't prune — {0}": "GitStudio: non è stato possibile eseguire il prune — {0}", "GitStudio: couldn't reset {0} to {1}{2}": "GitStudio: non è stato possibile resettare {0} a {1}{2}", + "GitStudio: couldn't save the changelists — {0}": "GitStudio: impossibile salvare gli elenchi modifiche — {0}", "GitStudio: couldn't stage that change — {0}": "GitStudio: non è stato possibile metter in stage quella modifica — {0}", "GitStudio: couldn't stage the changes — {0}": "GitStudio: non è stato possibile metter in stage le modifiche — {0}", "GitStudio: couldn't stash your changes, so nothing ran — {0}": "GitStudio: non è stato possibile metter in stash le tue modifiche, quindi nulla è stato eseguito — {0}", @@ -2059,6 +2067,8 @@ "GitStudio: no worktree this can be done to.": "GitStudio: nessun worktree su cui farlo.", "GitStudio: nothing staged, or AI is unavailable.": "GitStudio: niente in stage, oppure l'AI non è disponibile.", "GitStudio: nothing stashed — every file was unticked.": "GitStudio: niente messo in stash — ogni file è stato deselezionato.", + "GitStudio: nothing to commit. The only changed file is in a changelist — stage it first to commit it.": "GitStudio: niente di cui eseguire il commit. L'unico file modificato è in un elenco modifiche: eseguine prima lo stage per includerlo nel commit.", + "GitStudio: nothing to commit. The only changed files are in changelists — stage the ones to commit first.": "GitStudio: niente di cui eseguire il commit. Gli unici file modificati sono in elenchi modifiche: esegui prima lo stage di quelli da includere nel commit.", "GitStudio: nothing to draft (stage changes first), or AI is unavailable.": "GitStudio: niente da scrivere in bozza (metti prima in stage le modifiche), oppure l'AI non è disponibile.", "GitStudio: nothing to stash — the working tree is clean.": "GitStudio: niente da metter in stash — la copia di lavoro è pulita.", "GitStudio: open a file in a Git repository to stage lines.": "GitStudio: apri un file in un repository Git per mettere in stage le righe.", @@ -2548,12 +2558,16 @@ "Move this branch to {0} ({1} reset).\n\nThe commits are undone; their changes stay staged.": "Sposta questo ramo a {0} (reset {1}).\n\nI commit vengono annullati; le loro modifiche restano in stage.", "Move through the output": "Spostati nell'output", "Move to": "Sposta in", + "Move to Changelist…": "Sposta in elenco modifiche…", "Move to Changes": "Sposta in Modifiche", "Move to Trash": "Sposta nel Cestino", "Move to Trash…": "Sposta nel Cestino…", "Move up": "Sposta su", "Move up (Alt+Up)": "Sposta su (Alt+Su)", + "Move {0} Files to Changelist": "Sposta {0} file in elenco modifiche", "Move {0} out of “{1}”": "Sposta {0} fuori da “{1}”", + "Move {0} to Changelist": "Sposta {0} in elenco modifiche", + "Move {0} to Changelist…": "Sposta {0} in elenco modifiche…", "Move {0} to Changes": "Sposta {0} in Modifiche", "Move {0} to the Trash?": "Spostare {0} nel Cestino?", "Move {0} with the rewrite": "Sposta {0} con la riscrittura", @@ -2587,6 +2601,10 @@ "New Branch from '": "Nuovo ramo da '", "New Branch from These Commits": "Nuovo ramo da questi commit", "New Branch…": "Nuovo ramo…", + "New Changelist": "Nuovo elenco modifiche", + "New Changelist for {0}": "Nuovo elenco modifiche per {0}", + "New Changelist for {0} Files": "Nuovo elenco modifiche per {0} file", + "New Changelist…": "Nuovo elenco modifiche…", "New PR": "Nuova PR", "New Worktree from '": "Nuovo worktree da '", "New Worktree…": "Nuovo worktree…", @@ -3492,6 +3510,8 @@ "Removes it from this list only": "Lo rimuove solo da questo elenco", "Removing…": "Rimozione in corso…", "Rename": "Rinomina", + "Rename Changelist “{0}”": "Rinomina l'elenco modifiche «{0}»", + "Rename Changelist…": "Rinomina elenco modifiche…", "Rename branch": "Rinomina ramo", "Rename branch {0}": "Rinomina il ramo {0}", "Rename it, then check it out.": "Rinominalo, poi fanne il checkout.", @@ -3990,6 +4010,7 @@ "Stage (or unstage) the lines selected in the diff": "Metti in stage (o togli dallo stage) le righe selezionate nel diff", "Stage All": "Stage tutto", "Stage All Changes": "Stage di tutte le modifiche", + "Stage All in This Changelist": "Stage di tutto in questo elenco modifiche", "Stage Changes with Ticks": "Stage delle modifiche con i segni di spunta", "Stage Folder": "Stage cartella", "Stage all": "Stage tutto", @@ -4054,6 +4075,7 @@ "Stash 1 selected file…": "Stash di 1 file selezionato…", "Stash All Changes": "Stash di tutte le modifiche", "Stash Everything Staged": "Stash di tutto ciò che è in stage", + "Stash These Files": "Stash di questi file", "Stash This File": "Stash di questo file", "Stash This Folder": "Stash di questa cartella", "Stash all changes": "Metti nello stash tutte le modifiche", @@ -4208,6 +4230,7 @@ "That isn't a usable folder name.": "Non è un nome di cartella utilizzabile.", "That isn't a way to reconcile a pull.": "Non è un modo per conciliare un pull.", "That isn't a {0} this app made.": "Questo non è un {0} fatto da questa app.", + "That name is too long. Keep it under 80 characters.": "Il nome è troppo lungo. Resta sotto gli 80 caratteri.", "That path escapes the repository — nothing was changed.": "Quel percorso esce dal repository — non è stato modificato nulla.", "That path is outside the repository.": "Quel percorso è fuori dal repository.", "That puts back only what it changed, and only where nothing has moved since.": "Questo ripristina solo ciò che ha modificato, e solo dove nulla si è spostato da allora.", @@ -4290,6 +4313,7 @@ "The controls on this bar act on {0}": "I controlli su questa barra agiscono su {0}", "The current commit": "Il commit corrente", "The dark window and the Dock icon, together. Graphite matches the icon macOS shows while GitStudio is closed. With Neon the Dock icon turns neon while GitStudio runs; macOS still shows the Graphite icon while it is closed.": "La finestra scura e l'icona nel Dock, insieme. Graphite corrisponde all'icona che macOS mostra mentre GitStudio è chiuso. Con Neon l'icona nel Dock diventa neon mentre GitStudio è in esecuzione; macOS continua a mostrare l'icona Graphite mentre è chiuso.", + "The default changelist": "L'elenco modifiche predefinito", "The download failed.": "Il download non è riuscito.", "The dropped commit is back": "Il commit eliminato è tornato", "The file goes back to its committed version. {0}": "Il file torna alla sua versione committata. {0}", @@ -4401,6 +4425,7 @@ "Theme: System": "Tema: Sistema", "There are no files to go to yet.": "Non ci sono ancora file a cui andare.", "There are unresolved conflicts — resolve them or cancel first.": "Ci sono conflitti non risolti — risolvili o annulla prima.", + "There is already a group called “{0}”. Choose another name.": "Esiste già un gruppo chiamato «{0}». Scegli un altro nome.", "There is no '{0}' to reset to — it is not on {1} any more.": "Non c'è nessun '{0}' a cui fare il reset — non è più su {1}.", "There is no '{0}' to reset to, and {1} couldn't be reached to fetch it.": "Non c'è nessun '{0}' a cui fare il reset, e non è stato possibile contattare {1} per recuperarlo.", "There is no Apply to undo here any more.": "Non c'è più nessuna Apply da annullare qui.", @@ -5704,6 +5729,7 @@ "{0} files have changed since their changes were discarded ({1}), and bringing them back would overwrite that. Nothing was changed.": "{0} file sono cambiati dopo che le loro modifiche sono state scartate ({1}), e ripristinarle sovrascriverebbe quel cambiamento. Nessuna modifica è stata effettuata.", "{0} files have conflicts to resolve.": "{0} file hanno conflitti da risolvere.", "{0} files have conflicts — open Changes to resolve": "{0} file hanno conflitti — apri Modifiche per risolvere", + "{0} files in changelists are left out.": "{0} file in elenchi modifiche vengono esclusi.", "{0} files selected": "{0} file selezionati", "{0} files still conflicted": "{0} file ancora in conflitto", "{0} files still contain": "{0} file contengono ancora", @@ -5988,6 +6014,7 @@ "{0} · {1} · {2} files changed": "{0} · {1} · {2} file modificati", "{0} — Ctrl/Cmd-click to select every file in this section": "{0} — Ctrl/Cmd-clic per selezionare ogni file in questa sezione", "{0} — Ctrl/Cmd-click to select every file, right-click to select just the checked or unchecked ones": "{0} — Ctrl/Cmd-clic per selezionare ogni file, clic destro per selezionare solo quelli spuntati o non spuntati", + "{0} — a changelist: its files stay out of Stage All and Commit all until you stage them. Click to collapse, Ctrl/Cmd-click to select its files, right-click for its actions.": "{0} — un elenco modifiche: i suoi file restano fuori da Stage tutto e dal commit di tutto finché non ne esegui lo stage. Clic per comprimere, Ctrl/Cmd-clic per selezionarne i file, clic destro per le sue azioni.", "{0} — click to collapse, ": "{0} — clic per comprimere, ", "{0} — continue or abort it first.": "{0} — continualo o interrompilo prima.", "{0} — done.": "{0} — completato.", @@ -6018,6 +6045,7 @@ "{0}, and more": "{0}, e altri", "{0}, and {1} more": "{0}, e altri {1}", "{0}, but {1} isn't: {2}": "{0}, ma {1} non lo è: {2}", + "{0}, changelist, {1}": "{0}, elenco modifiche, {1}", "{0}, plus the commits of {1} already rebased onto it": "{0}, più i commit di {1} già sottoposti a rebase su di esso", "{0}, so it was checked out as {1} at its last commit — a push from there can't reach the pull request. {2}": "{0}, quindi ne è stato eseguito il checkout come {1} al suo ultimo commit — un push da lì non può raggiungere la pull request. {2}", "{0}, then create a branch to push them.": "{0}, poi crea un ramo per pusharli.", diff --git a/l10n/ja.json b/l10n/ja.json index 2123cb11..8e02ad3b 100644 --- a/l10n/ja.json +++ b/l10n/ja.json @@ -100,6 +100,7 @@ "$(check) Committed": "$(check) コミットしました", "$(check) Copied {0}": "$(check) {0} をコピーしました", "$(check) Created & switched to {0}": "$(check) {0} を作成して切り替えました", + "$(check) Deleted changelist “{0}” — its files are back in Changes": "$(check) 変更リスト「{0}」を削除しました — ファイルは変更に戻りました", "$(check) GitStudio: AI features disabled": "$(check) GitStudio: AI 機能を無効化しました", "$(check) Nothing to push from {0} — up to date": "$(check) {0} からプッシュするものはありません — 最新です", "$(check) Nothing to push — up to date": "$(check) プッシュするものはありません — 最新です", @@ -243,6 +244,7 @@ "1 file": "1 個のファイル", "1 file changed": "1 個のファイルが変更されました", "1 file has conflicts to resolve.": "1 個のファイルに解決が必要なコンフリクトがあります。", + "1 file in a changelist is left out.": "変更リスト内の 1 ファイルは含まれません。", "1 file selected": "1 個のファイルを選択中", "1 file still conflicted": "1 個のファイルがまだコンフリクトしています", "1 file still contains": "1 個のファイルにはまだ", @@ -687,6 +689,7 @@ "Changed Files": "変更されたファイル", "Changed files": "変更されたファイル", "Changed on one side, deleted on the other": "一方で変更、もう一方で削除", + "Changelist name": "変更リスト名", "Changes": "変更", "Changes ({0})": "変更({0})", "Changes committed.": "変更をコミットしました。", @@ -1423,6 +1426,7 @@ "Delete '{0}'? Commits that are only on this branch stop being reachable by name. You can undo this straight afterwards.": "「{0}」を削除しますか? このブランチにのみ存在するコミットは、名前で参照できなくなります。この操作は直後であれば元に戻せます。", "Delete 1": "1 件削除", "Delete 1 finished branch?": "完了した 1 件のブランチを削除しますか?", + "Delete Changelist": "変更リストを削除", "Delete Remote Branch": "リモートブランチを削除", "Delete Tag": "タグを削除", "Delete asset": "アセットを削除", @@ -1624,6 +1628,7 @@ "Drop to apply": "ドロップして適用", "Drop to copy {0}": "ドロップして{0}をコピー", "Drop to move {0}": "ドロップして{0}を移動", + "Drop to move {0} to “{1}”": "ドロップして {0} を「{1}」に移動", "Drop to pop": "ドロップしてポップ", "Drop to stash": "ドロップしてスタッシュ", "Drop to stash 1 file": "ドロップして 1 個のファイルをスタッシュ", @@ -1686,6 +1691,7 @@ "Enter a key first.": "まずキーを入力してください。", "Enter a line number, or a range like 12-18.": "行番号、または 12-18 のような範囲を入力してください。", "Enter a name and an email to save.": "保存するには名前とメールアドレスを入力してください。", + "Enter a name for the changelist.": "変更リストの名前を入力してください。", "Enter this code at ": "次の場所でこのコードを入力: ", "Enter to send · Shift+Enter for a new line": "Enter で送信 · Shift+Enter で改行", "Error on line {0}": "{0} 行目でエラー", @@ -1767,6 +1773,7 @@ "Filename including extension…": "拡張子を含むファイル名…", "Files": "ファイル", "Files changed": "変更されたファイル", + "Files in a changelist are left out of Stage All and Commit all until you stage them yourself.": "変更リスト内のファイルは、自分でステージするまで「すべてステージ」と「すべてコミット」の対象外です。", "Files in this gist": "この Gist のファイル", "Files resolved": "解決済みのファイル", "Filter": "フィルター", @@ -2041,6 +2048,7 @@ "GitStudio: couldn't prepare the push — {0}": "GitStudio: プッシュの準備ができませんでした — {0}", "GitStudio: couldn't prune — {0}": "GitStudio: プルーンできませんでした — {0}", "GitStudio: couldn't reset {0} to {1}{2}": "GitStudio: {0} を {1} にリセットできませんでした{2}", + "GitStudio: couldn't save the changelists — {0}": "GitStudio: 変更リストを保存できませんでした — {0}", "GitStudio: couldn't stage that change — {0}": "GitStudio: その変更をステージできませんでした — {0}", "GitStudio: couldn't stage the changes — {0}": "GitStudio: 変更をステージできませんでした — {0}", "GitStudio: couldn't stash your changes, so nothing ran — {0}": "GitStudio: 変更をスタッシュできなかったため、何も実行されませんでした — {0}", @@ -2059,6 +2067,8 @@ "GitStudio: no worktree this can be done to.": "GitStudio: これを実行できるワークツリーがありません。", "GitStudio: nothing staged, or AI is unavailable.": "GitStudio: 何もステージされていないか、AI が利用できません。", "GitStudio: nothing stashed — every file was unticked.": "GitStudio: すべてのファイルのチェックが外されたため、何もスタッシュされませんでした。", + "GitStudio: nothing to commit. The only changed file is in a changelist — stage it first to commit it.": "GitStudio: コミットするものがありません。変更されたファイルは変更リスト内の 1 つだけです — コミットするには先にステージしてください。", + "GitStudio: nothing to commit. The only changed files are in changelists — stage the ones to commit first.": "GitStudio: コミットするものがありません。変更されたファイルはすべて変更リスト内にあります — コミットするものを先にステージしてください。", "GitStudio: nothing to draft (stage changes first), or AI is unavailable.": "GitStudio: 作成する対象がありません(先に変更をステージしてください)、またはAIが利用できません。", "GitStudio: nothing to stash — the working tree is clean.": "GitStudio: 作業ツリーがクリーンなため、スタッシュする対象がありません。", "GitStudio: open a file in a Git repository to stage lines.": "GitStudio: 行をステージするには Git リポジトリ内のファイルを開いてください。", @@ -2548,12 +2558,16 @@ "Move this branch to {0} ({1} reset).\n\nThe commits are undone; their changes stay staged.": "このブランチを {0}({1} リセット)に移動します。\n\nコミットは取り消されますが、その変更はステージされたままになります。", "Move through the output": "出力内を移動", "Move to": "移動先", + "Move to Changelist…": "変更リストへ移動…", "Move to Changes": "変更に移動", "Move to Trash": "ゴミ箱に移動", "Move to Trash…": "ゴミ箱に移動…", "Move up": "上に移動", "Move up (Alt+Up)": "上に移動(Alt+Up)", + "Move {0} Files to Changelist": "{0} 個のファイルを変更リストへ移動", "Move {0} out of “{1}”": "{0} を「{1}」の外に移動", + "Move {0} to Changelist": "{0} を変更リストへ移動", + "Move {0} to Changelist…": "{0} を変更リストへ移動…", "Move {0} to Changes": "{0} を変更に移動", "Move {0} to the Trash?": "{0} をゴミ箱に移動しますか?", "Move {0} with the rewrite": "{0} を書き換えとともに移動", @@ -2587,6 +2601,10 @@ "New Branch from '": "新しいブランチ元 '", "New Branch from These Commits": "これらのコミットから新しいブランチを作成", "New Branch…": "新しいブランチ…", + "New Changelist": "新しい変更リスト", + "New Changelist for {0}": "{0} の新しい変更リスト", + "New Changelist for {0} Files": "{0} 個のファイルの新しい変更リスト", + "New Changelist…": "新しい変更リスト…", "New PR": "新しい PR", "New Worktree from '": "新しいワークツリー元 '", "New Worktree…": "新しいワークツリー…", @@ -3492,6 +3510,8 @@ "Removes it from this list only": "この一覧からのみ削除します", "Removing…": "削除中…", "Rename": "名前の変更", + "Rename Changelist “{0}”": "変更リスト「{0}」の名前を変更", + "Rename Changelist…": "変更リストの名前を変更…", "Rename branch": "ブランチの名前を変更", "Rename branch {0}": "ブランチ{0}の名前を変更", "Rename it, then check it out.": "名前を変更してからチェックアウトしてください。", @@ -3990,6 +4010,7 @@ "Stage (or unstage) the lines selected in the diff": "差分で選択した行をステージ(またはステージ解除)", "Stage All": "すべてステージ", "Stage All Changes": "すべての変更をステージ", + "Stage All in This Changelist": "この変更リストをすべてステージ", "Stage Changes with Ticks": "チェックした変更をステージ", "Stage Folder": "フォルダーをステージ", "Stage all": "すべてステージ", @@ -4054,6 +4075,7 @@ "Stash 1 selected file…": "選択した1件のファイルをスタッシュ…", "Stash All Changes": "すべての変更をスタッシュ", "Stash Everything Staged": "ステージ済みのすべてをスタッシュ", + "Stash These Files": "これらのファイルをスタッシュ", "Stash This File": "このファイルをスタッシュ", "Stash This Folder": "このフォルダーをスタッシュ", "Stash all changes": "すべての変更をスタッシュ", @@ -4208,6 +4230,7 @@ "That isn't a usable folder name.": "それは使用できるフォルダー名ではありません。", "That isn't a way to reconcile a pull.": "それはプルを調整する方法ではありません。", "That isn't a {0} this app made.": "それはこのアプリが行った{0}ではありません。", + "That name is too long. Keep it under 80 characters.": "名前が長すぎます。80 文字未満にしてください。", "That path escapes the repository — nothing was changed.": "そのパスはリポジトリの外を指しています — 何も変更されませんでした。", "That path is outside the repository.": "そのパスはリポジトリの外部にあります。", "That puts back only what it changed, and only where nothing has moved since.": "それが変更した部分だけを元に戻します。それ以降何も変わっていない箇所に限ります。", @@ -4290,6 +4313,7 @@ "The controls on this bar act on {0}": "このバーのコントロールは {0} に対して作用します", "The current commit": "現在のコミット", "The dark window and the Dock icon, together. Graphite matches the icon macOS shows while GitStudio is closed. With Neon the Dock icon turns neon while GitStudio runs; macOS still shows the Graphite icon while it is closed.": "ダークウィンドウと Dock アイコンをまとめて設定します。Graphite は GitStudio が閉じているときに macOS が表示するアイコンと一致します。Neon では、GitStudio の実行中に Dock アイコンがネオン色になります。閉じている間は macOS が Graphite アイコンを表示します。", + "The default changelist": "既定の変更リスト", "The download failed.": "ダウンロードに失敗しました。", "The dropped commit is back": "削除したコミットが戻りました", "The file goes back to its committed version. {0}": "ファイルはコミット済みのバージョンに戻ります。{0}", @@ -4401,6 +4425,7 @@ "Theme: System": "テーマ: システム", "There are no files to go to yet.": "まだ移動できるファイルがありません。", "There are unresolved conflicts — resolve them or cancel first.": "未解決のコンフリクトがあります — 先に解決するかキャンセルしてください。", + "There is already a group called “{0}”. Choose another name.": "「{0}」という名前のグループは既にあります。別の名前を選んでください。", "There is no '{0}' to reset to — it is not on {1} any more.": "リセット先の「{0}」がありません — もう{1}上にありません。", "There is no '{0}' to reset to, and {1} couldn't be reached to fetch it.": "リセット先の「{0}」がなく、取得のために{1}に接続できませんでした。", "There is no Apply to undo here any more.": "ここで元に戻せる「適用」はもうありません。", @@ -5704,6 +5729,7 @@ "{0} files have changed since their changes were discarded ({1}), and bringing them back would overwrite that. Nothing was changed.": "変更が破棄された後に {0} 個のファイルが変更されました({1})。元に戻すとその内容が上書きされます。何も変更されませんでした。", "{0} files have conflicts to resolve.": "{0} 個のファイルに解決すべきコンフリクトがあります。", "{0} files have conflicts — open Changes to resolve": "{0} 個のファイルにコンフリクトがあります — 変更を開いて解決してください", + "{0} files in changelists are left out.": "変更リスト内の {0} 個のファイルは含まれません。", "{0} files selected": "{0} 個のファイルを選択中", "{0} files still conflicted": "{0} 個のファイルがまだコンフリクトしています", "{0} files still contain": "{0} 個のファイルにはまだ含まれています", @@ -5988,6 +6014,7 @@ "{0} · {1} · {2} files changed": "{0} · {1} · {2} 個のファイルが変更されました", "{0} — Ctrl/Cmd-click to select every file in this section": "{0} — Ctrl/Cmd クリックでこのセクションのすべてのファイルを選択", "{0} — Ctrl/Cmd-click to select every file, right-click to select just the checked or unchecked ones": "{0} — Ctrl/Cmd クリックですべてのファイルを選択、右クリックでチェック済み/未チェックのみを選択", + "{0} — a changelist: its files stay out of Stage All and Commit all until you stage them. Click to collapse, Ctrl/Cmd-click to select its files, right-click for its actions.": "{0} — 変更リスト: ステージするまで、ファイルは「すべてステージ」と「すべてコミット」の対象外です。クリックで折りたたみ、Ctrl/Cmd+クリックでファイルを選択、右クリックで操作。", "{0} — click to collapse, ": "{0} — クリックして折りたたみ、", "{0} — continue or abort it first.": "{0} — 先に続行または中止してください。", "{0} — done.": "{0} — 完了。", @@ -6018,6 +6045,7 @@ "{0}, and more": "{0}、他にも", "{0}, and {1} more": "{0}、他 {1} 件", "{0}, but {1} isn't: {2}": "{0}、しかし {1} はそうではありません: {2}", + "{0}, changelist, {1}": "{0}、変更リスト、{1}", "{0}, plus the commits of {1} already rebased onto it": "{0}、および {1} の既にそこへリベースされたコミット", "{0}, so it was checked out as {1} at its last commit — a push from there can't reach the pull request. {2}": "{0} のため、最後のコミットで {1} としてチェックアウトされました — ここからのプッシュはプルリクエストに届きません。{2}", "{0}, then create a branch to push them.": "{0}、その後ブランチを作成してプッシュしてください。", diff --git a/l10n/ko.json b/l10n/ko.json index f3b3974b..62024956 100644 --- a/l10n/ko.json +++ b/l10n/ko.json @@ -100,6 +100,7 @@ "$(check) Committed": "$(check) 커밋됨", "$(check) Copied {0}": "$(check) {0} 복사됨", "$(check) Created & switched to {0}": "$(check) {0}을 만들고 전환했습니다", + "$(check) Deleted changelist “{0}” — its files are back in Changes": "$(check) 변경 목록 “{0}”을(를) 삭제했습니다 — 파일은 변경 내용으로 돌아갔습니다", "$(check) GitStudio: AI features disabled": "$(check) GitStudio: AI 기능이 꺼졌습니다", "$(check) Nothing to push from {0} — up to date": "$(check) {0}에서 푸시할 내용 없음 — 최신 상태", "$(check) Nothing to push — up to date": "$(check) 푸시할 내용 없음 — 최신 상태", @@ -243,6 +244,7 @@ "1 file": "파일 1개", "1 file changed": "파일 1개 변경됨", "1 file has conflicts to resolve.": "파일 1개에 해결할 충돌이 있습니다.", + "1 file in a changelist is left out.": "변경 목록에 있는 파일 1개는 제외됩니다.", "1 file selected": "파일 1개 선택됨", "1 file still conflicted": "충돌 중인 파일 1개", "1 file still contains": "파일 1개에 아직 포함됨", @@ -687,6 +689,7 @@ "Changed Files": "변경된 파일", "Changed files": "변경된 파일", "Changed on one side, deleted on the other": "한쪽에서 변경, 다른 쪽에서 삭제", + "Changelist name": "변경 목록 이름", "Changes": "변경 내용", "Changes ({0})": "변경 사항 ({0})", "Changes committed.": "변경 사항을 커밋했습니다.", @@ -1423,6 +1426,7 @@ "Delete '{0}'? Commits that are only on this branch stop being reachable by name. You can undo this straight afterwards.": "'{0}'을(를) 삭제할까요? 이 브랜치에만 있는 커밋은 이름으로 접근할 수 없게 됩니다. 이후 바로 실행 취소할 수 있습니다.", "Delete 1": "1개 삭제", "Delete 1 finished branch?": "완료된 브랜치 1개를 삭제할까요?", + "Delete Changelist": "변경 목록 삭제", "Delete Remote Branch": "원격 브랜치 삭제", "Delete Tag": "태그 삭제", "Delete asset": "애셋 삭제", @@ -1624,6 +1628,7 @@ "Drop to apply": "드롭하여 적용", "Drop to copy {0}": "드롭하여 {0} 복사", "Drop to move {0}": "드롭하여 {0} 이동", + "Drop to move {0} to “{1}”": "드롭하여 {0}을(를) “{1}”(으)로 이동", "Drop to pop": "드롭하여 꺼내기", "Drop to stash": "스태시로 끌어놓기", "Drop to stash 1 file": "파일 1개를 스태시로 끌어놓기", @@ -1686,6 +1691,7 @@ "Enter a key first.": "먼저 키를 입력하세요.", "Enter a line number, or a range like 12-18.": "줄 번호 또는 12-18과 같은 범위를 입력하세요.", "Enter a name and an email to save.": "저장하려면 이름과 이메일을 입력하세요.", + "Enter a name for the changelist.": "변경 목록 이름을 입력하세요.", "Enter this code at ": "다음에서 이 코드를 입력하세요: ", "Enter to send · Shift+Enter for a new line": "Enter로 보내기 · Shift+Enter로 줄바꿈", "Error on line {0}": "{0}번째 줄에 오류", @@ -1767,6 +1773,7 @@ "Filename including extension…": "확장자를 포함한 파일 이름…", "Files": "파일", "Files changed": "변경된 파일", + "Files in a changelist are left out of Stage All and Commit all until you stage them yourself.": "변경 목록에 있는 파일은 직접 스테이지에 추가할 때까지 모두 스테이지에 추가와 모두 커밋에서 제외됩니다.", "Files in this gist": "이 gist의 파일", "Files resolved": "해결된 파일", "Filter": "필터", @@ -2041,6 +2048,7 @@ "GitStudio: couldn't prepare the push — {0}": "GitStudio: 푸시를 준비할 수 없었습니다 — {0}", "GitStudio: couldn't prune — {0}": "GitStudio: 정리할 수 없었습니다 — {0}", "GitStudio: couldn't reset {0} to {1}{2}": "GitStudio: {0}을 {1}{2}로 리셋할 수 없었습니다", + "GitStudio: couldn't save the changelists — {0}": "GitStudio: 변경 목록을 저장할 수 없습니다 — {0}", "GitStudio: couldn't stage that change — {0}": "GitStudio: 해당 변경 내용을 스테이지에 추가할 수 없었습니다 — {0}", "GitStudio: couldn't stage the changes — {0}": "GitStudio: 변경 내용을 스테이지에 추가할 수 없었습니다 — {0}", "GitStudio: couldn't stash your changes, so nothing ran — {0}": "GitStudio: 변경 내용을 스태시할 수 없어 아무것도 실행되지 않았습니다 — {0}", @@ -2059,6 +2067,8 @@ "GitStudio: no worktree this can be done to.": "GitStudio: 이 작업을 적용할 작업 폴더가 없습니다.", "GitStudio: nothing staged, or AI is unavailable.": "GitStudio: 스테이지에 추가된 내용이 없거나 AI를 사용할 수 없습니다.", "GitStudio: nothing stashed — every file was unticked.": "GitStudio: 스태시된 내용이 없습니다 — 모든 파일의 선택이 해제되었습니다.", + "GitStudio: nothing to commit. The only changed file is in a changelist — stage it first to commit it.": "GitStudio: 커밋할 내용이 없습니다. 변경된 파일은 변경 목록에 있는 하나뿐입니다 — 커밋하려면 먼저 스테이지에 추가하세요.", + "GitStudio: nothing to commit. The only changed files are in changelists — stage the ones to commit first.": "GitStudio: 커밋할 내용이 없습니다. 변경된 파일은 모두 변경 목록에 있습니다 — 커밋할 파일을 먼저 스테이지에 추가하세요.", "GitStudio: nothing to draft (stage changes first), or AI is unavailable.": "GitStudio: 작성할 내용이 없거나(먼저 변경 내용을 스테이지에 추가하세요) AI를 사용할 수 없습니다.", "GitStudio: nothing to stash — the working tree is clean.": "GitStudio: 스태시할 내용이 없습니다 — 작업 트리가 깨끗합니다.", "GitStudio: open a file in a Git repository to stage lines.": "GitStudio: 줄을 스테이지에 추가하려면 Git 리포지토리의 파일을 여세요.", @@ -2548,12 +2558,16 @@ "Move this branch to {0} ({1} reset).\n\nThe commits are undone; their changes stay staged.": "이 브랜치를 {0}으로 이동합니다 ({1} 리셋).\n\n커밋이 취소되며, 변경 내용은 스테이징된 상태로 남습니다.", "Move through the output": "출력 내에서 이동", "Move to": "이동", + "Move to Changelist…": "변경 목록으로 이동…", "Move to Changes": "변경 내용으로 이동", "Move to Trash": "휴지통으로 이동", "Move to Trash…": "휴지통으로 이동…", "Move up": "위로 이동", "Move up (Alt+Up)": "위로 이동(Alt+Up)", + "Move {0} Files to Changelist": "파일 {0}개를 변경 목록으로 이동", "Move {0} out of “{1}”": "{0}을 “{1}”에서 이동", + "Move {0} to Changelist": "{0}을(를) 변경 목록으로 이동", + "Move {0} to Changelist…": "{0}을(를) 변경 목록으로 이동…", "Move {0} to Changes": "{0}을 변경 내용으로 이동", "Move {0} to the Trash?": "{0}을(를) 휴지통으로 이동할까요?", "Move {0} with the rewrite": "{0}을(를) 재작성과 함께 이동", @@ -2587,6 +2601,10 @@ "New Branch from '": "'에서 새 브랜치", "New Branch from These Commits": "이 커밋들로 새 브랜치", "New Branch…": "새 브랜치…", + "New Changelist": "새 변경 목록", + "New Changelist for {0}": "{0}의 새 변경 목록", + "New Changelist for {0} Files": "파일 {0}개의 새 변경 목록", + "New Changelist…": "새 변경 목록…", "New PR": "새 PR", "New Worktree from '": "'에서 새 작업 폴더", "New Worktree…": "새 작업 폴더…", @@ -3492,6 +3510,8 @@ "Removes it from this list only": "이 목록에서만 제거합니다", "Removing…": "제거하는 중…", "Rename": "이름 바꾸기", + "Rename Changelist “{0}”": "변경 목록 “{0}” 이름 바꾸기", + "Rename Changelist…": "변경 목록 이름 바꾸기…", "Rename branch": "브랜치 이름 바꾸기", "Rename branch {0}": "브랜치 {0} 이름 바꾸기", "Rename it, then check it out.": "이름을 바꾼 후 체크아웃하세요.", @@ -3990,6 +4010,7 @@ "Stage (or unstage) the lines selected in the diff": "차이에서 선택한 줄을 스테이지에 추가(또는 해제)", "Stage All": "모두 스테이지에 추가", "Stage All Changes": "모든 변경 내용 스테이지에 추가", + "Stage All in This Changelist": "이 변경 목록 모두 스테이지에 추가", "Stage Changes with Ticks": "체크 표시로 변경 내용 스테이지에 추가", "Stage Folder": "폴더 스테이지에 추가", "Stage all": "모두 스테이지에 추가", @@ -4054,6 +4075,7 @@ "Stash 1 selected file…": "선택한 파일 1개 스태시…", "Stash All Changes": "모든 변경 내용 스태시", "Stash Everything Staged": "스테이징된 모든 내용 스태시", + "Stash These Files": "이 파일들 스태시", "Stash This File": "이 파일 스태시", "Stash This Folder": "이 폴더 스태시", "Stash all changes": "모든 변경 내용 스태시", @@ -4208,6 +4230,7 @@ "That isn't a usable folder name.": "사용할 수 없는 폴더 이름입니다.", "That isn't a way to reconcile a pull.": "풀을 조정하는 방법이 아닙니다.", "That isn't a {0} this app made.": "그것은 이 앱이 만든 {0}이 아닙니다.", + "That name is too long. Keep it under 80 characters.": "이름이 너무 깁니다. 80자 미만으로 입력하세요.", "That path escapes the repository — nothing was changed.": "그 경로는 리포지토리를 벗어납니다 — 아무것도 변경되지 않았습니다.", "That path is outside the repository.": "해당 경로는 리포지토리 밖에 있습니다.", "That puts back only what it changed, and only where nothing has moved since.": "변경한 내용 중 이후 이동하지 않은 부분만 되돌립니다.", @@ -4290,6 +4313,7 @@ "The controls on this bar act on {0}": "이 바의 컨트롤은 {0}에 작용합니다", "The current commit": "현재 커밋", "The dark window and the Dock icon, together. Graphite matches the icon macOS shows while GitStudio is closed. With Neon the Dock icon turns neon while GitStudio runs; macOS still shows the Graphite icon while it is closed.": "다크 창과 Dock 아이콘을 함께 지정합니다. Graphite는 GitStudio가 종료된 동안 macOS가 표시하는 아이콘과 일치합니다. Neon을 사용하면 GitStudio가 실행되는 동안 Dock 아이콘이 네온으로 바뀌며, 종료된 동안에는 macOS가 여전히 Graphite 아이콘을 표시합니다.", + "The default changelist": "기본 변경 목록", "The download failed.": "다운로드에 실패했습니다.", "The dropped commit is back": "삭제한 커밋이 돌아왔습니다", "The file goes back to its committed version. {0}": "파일이 커밋된 버전으로 돌아갑니다. {0}", @@ -4401,6 +4425,7 @@ "Theme: System": "테마: 시스템", "There are no files to go to yet.": "아직 이동할 파일이 없습니다.", "There are unresolved conflicts — resolve them or cancel first.": "해결되지 않은 충돌이 있습니다 — 먼저 해결하거나 취소하세요.", + "There is already a group called “{0}”. Choose another name.": "“{0}”(이)라는 그룹이 이미 있습니다. 다른 이름을 선택하세요.", "There is no '{0}' to reset to — it is not on {1} any more.": "되돌릴 '{0}'이 없습니다 — 더 이상 {1}에 없습니다.", "There is no '{0}' to reset to, and {1} couldn't be reached to fetch it.": "되돌릴 '{0}'이 없으며 {1}에 연결하여 가져올 수도 없었습니다.", "There is no Apply to undo here any more.": "여기서 실행 취소할 적용 작업이 더 이상 없습니다.", @@ -5704,6 +5729,7 @@ "{0} files have changed since their changes were discarded ({1}), and bringing them back would overwrite that. Nothing was changed.": "변경 내용을 버린 이후 파일 {0}개가 변경되었습니다({1}). 되돌리면 그 내용을 덮어쓰게 되어 아무것도 변경하지 않았습니다.", "{0} files have conflicts to resolve.": "{0} 파일에 해결할 충돌이 있습니다.", "{0} files have conflicts — open Changes to resolve": "파일 {0}개에 충돌이 있습니다 — 변경 사항을 열어 해결하세요", + "{0} files in changelists are left out.": "변경 목록에 있는 파일 {0}개는 제외됩니다.", "{0} files selected": "파일 {0}개 선택됨", "{0} files still conflicted": "충돌 중인 파일 {0}개", "{0} files still contain": "{0} 파일에 여전히 포함됨", @@ -5988,6 +6014,7 @@ "{0} · {1} · {2} files changed": "{0} · {1} · 파일 {2}개 변경됨", "{0} — Ctrl/Cmd-click to select every file in this section": "{0} — Ctrl/Cmd 클릭으로 이 섹션의 모든 파일 선택", "{0} — Ctrl/Cmd-click to select every file, right-click to select just the checked or unchecked ones": "{0} — Ctrl/Cmd 클릭으로 모든 파일 선택, 우클릭으로 선택된 것 또는 선택되지 않은 것만 선택", + "{0} — a changelist: its files stay out of Stage All and Commit all until you stage them. Click to collapse, Ctrl/Cmd-click to select its files, right-click for its actions.": "{0} — 변경 목록: 스테이지에 추가할 때까지 파일은 모두 스테이지에 추가와 모두 커밋에서 제외됩니다. 클릭하여 접기, Ctrl/Cmd-클릭하여 파일 선택, 마우스 오른쪽 버튼을 클릭하여 작업 보기.", "{0} — click to collapse, ": "{0} — 클릭하여 접기, ", "{0} — continue or abort it first.": "{0} — 먼저 계속하거나 중단하세요.", "{0} — done.": "{0} — 완료.", @@ -6018,6 +6045,7 @@ "{0}, and more": "{0} 외 더 있음", "{0}, and {1} more": "{0}, 그리고 {1}개 더", "{0}, but {1} isn't: {2}": "{0}은 있지만 {1}은 없습니다: {2}", + "{0}, changelist, {1}": "{0}, 변경 목록, {1}", "{0}, plus the commits of {1} already rebased onto it": "{0}, 그리고 이미 그 위에 리베이스된 {1}의 커밋", "{0}, so it was checked out as {1} at its last commit — a push from there can't reach the pull request. {2}": "{0}이라 마지막 커밋에서 {1}로 체크아웃되었습니다 — 거기서 푸시해도 풀 리퀘스트에 반영되지 않습니다. {2}", "{0}, then create a branch to push them.": "{0}, 그런 다음 브랜치를 만들어 푸시하세요.", diff --git a/l10n/pl.json b/l10n/pl.json index 58778f19..4a73414d 100644 --- a/l10n/pl.json +++ b/l10n/pl.json @@ -100,6 +100,7 @@ "$(check) Committed": "$(check) Zatwierdzono", "$(check) Copied {0}": "$(check) Skopiowano {0}", "$(check) Created & switched to {0}": "$(check) Utworzono i przełączono na {0}", + "$(check) Deleted changelist “{0}” — its files are back in Changes": "$(check) Usunięto listę zmian „{0}” — jej pliki wróciły do Zmian", "$(check) GitStudio: AI features disabled": "$(check) GitStudio: funkcje AI wyłączone", "$(check) Nothing to push from {0} — up to date": "$(check) Nic do wypchnięcia z {0} — aktualne", "$(check) Nothing to push — up to date": "$(check) Nic do wypchnięcia — aktualne", @@ -243,6 +244,7 @@ "1 file": "1 plik", "1 file changed": "1 plik zmieniony", "1 file has conflicts to resolve.": "1 plik ma konflikty do rozwiązania.", + "1 file in a changelist is left out.": "1 plik z listy zmian zostaje pominięty.", "1 file selected": "1 plik wybrany", "1 file still conflicted": "1 plik wciąż ma konflikt", "1 file still contains": "1 plik wciąż zawiera", @@ -687,6 +689,7 @@ "Changed Files": "Zmienione pliki", "Changed files": "Zmienione pliki", "Changed on one side, deleted on the other": "Zmieniony po jednej stronie, usunięty po drugiej", + "Changelist name": "Nazwa listy zmian", "Changes": "Zmiany", "Changes ({0})": "Changes ({0})", "Changes committed.": "Zmiany zacommitowane.", @@ -1423,6 +1426,7 @@ "Delete '{0}'? Commits that are only on this branch stop being reachable by name. You can undo this straight afterwards.": "Usunąć '{0}'? Commity, które są tylko na tym branchu, przestają być dostępne po nazwie. Możesz to zaraz potem wycofać.", "Delete 1": "Usuń 1", "Delete 1 finished branch?": "Usunąć 1 zakończony branch?", + "Delete Changelist": "Usuń listę zmian", "Delete Remote Branch": "Usuń zdalny branch", "Delete Tag": "Usuń tag", "Delete asset": "Usuń zasób", @@ -1624,6 +1628,7 @@ "Drop to apply": "Upuść, aby zastosować", "Drop to copy {0}": "Upuść, aby skopiować {0}", "Drop to move {0}": "Upuść, aby przenieść {0}", + "Drop to move {0} to “{1}”": "Upuść, aby przenieść {0} do „{1}”", "Drop to pop": "Upuść, aby pop", "Drop to stash": "Upuść, aby zapisać do schowka", "Drop to stash 1 file": "Upuść, aby zapisać do schowka 1 plik", @@ -1686,6 +1691,7 @@ "Enter a key first.": "Najpierw podaj klucz.", "Enter a line number, or a range like 12-18.": "Podaj numer linii albo zakres, np. 12-18.", "Enter a name and an email to save.": "Podaj imię i e-mail, aby zapisać.", + "Enter a name for the changelist.": "Wpisz nazwę listy zmian.", "Enter this code at ": "Wpisz ten kod na ", "Enter to send · Shift+Enter for a new line": "Enter, aby wysłać · Shift+Enter dla nowej linii", "Error on line {0}": "Błąd w linii {0}", @@ -1767,6 +1773,7 @@ "Filename including extension…": "Nazwa pliku z rozszerzeniem…", "Files": "Pliki", "Files changed": "Zmienione pliki", + "Files in a changelist are left out of Stage All and Commit all until you stage them yourself.": "Pliki z listy zmian są pomijane przez Przygotuj wszystko i Zatwierdź wszystkie, dopóki sam ich nie przygotujesz.", "Files in this gist": "Pliki w tym giście", "Files resolved": "Rozwiązane pliki", "Filter": "Filtr", @@ -2041,6 +2048,7 @@ "GitStudio: couldn't prepare the push — {0}": "GitStudio: nie udało się przygotować push — {0}", "GitStudio: couldn't prune — {0}": "GitStudio: nie udało się wyczyścić — {0}", "GitStudio: couldn't reset {0} to {1}{2}": "GitStudio: nie udało się zresetować {0} do {1}{2}", + "GitStudio: couldn't save the changelists — {0}": "GitStudio: nie udało się zapisać list zmian — {0}", "GitStudio: couldn't stage that change — {0}": "GitStudio: nie udało się przygotować tej zmiany — {0}", "GitStudio: couldn't stage the changes — {0}": "GitStudio: nie udało się przygotować zmian — {0}", "GitStudio: couldn't stash your changes, so nothing ran — {0}": "GitStudio: nie udało się zapisać Twoich zmian w schowku, więc nic nie zostało wykonane — {0}", @@ -2059,6 +2067,8 @@ "GitStudio: no worktree this can be done to.": "GitStudio: nie ma worktree, na którym można to wykonać.", "GitStudio: nothing staged, or AI is unavailable.": "GitStudio: nic nie jest przygotowane albo AI jest niedostępne.", "GitStudio: nothing stashed — every file was unticked.": "GitStudio: nic nie zapisano w schowku — każdy plik był odznaczony.", + "GitStudio: nothing to commit. The only changed file is in a changelist — stage it first to commit it.": "GitStudio: nie ma czego zatwierdzić. Jedyny zmieniony plik jest na liście zmian — najpierw go przygotuj, aby go zatwierdzić.", + "GitStudio: nothing to commit. The only changed files are in changelists — stage the ones to commit first.": "GitStudio: nie ma czego zatwierdzić. Jedyne zmienione pliki są na listach zmian — najpierw przygotuj te, które chcesz zatwierdzić.", "GitStudio: nothing to draft (stage changes first), or AI is unavailable.": "GitStudio: nic do zaszkicowania (najpierw przygotuj zmiany) albo AI jest niedostępne.", "GitStudio: nothing to stash — the working tree is clean.": "GitStudio: nic do zapisania w schowku — drzewo robocze jest czyste.", "GitStudio: open a file in a Git repository to stage lines.": "GitStudio: otwórz plik w repozytorium Git, aby przygotować linie.", @@ -2548,12 +2558,16 @@ "Move this branch to {0} ({1} reset).\n\nThe commits are undone; their changes stay staged.": "Przenieś ten branch do {0} (reset {1}).\n\nCommity są wycofane; ich zmiany zostają przygotowane.", "Move through the output": "Przechodź przez output", "Move to": "Przenieś do", + "Move to Changelist…": "Przenieś do listy zmian…", "Move to Changes": "Przenieś do Zmian", "Move to Trash": "Przenieś do Kosza", "Move to Trash…": "Przenieś do Kosza…", "Move up": "Przenieś wyżej", "Move up (Alt+Up)": "Przenieś wyżej (Alt+Góra)", + "Move {0} Files to Changelist": "Przenieś pliki ({0}) do listy zmian", "Move {0} out of “{1}”": "Przenieś {0} z „{1}”", + "Move {0} to Changelist": "Przenieś {0} do listy zmian", + "Move {0} to Changelist…": "Przenieś {0} do listy zmian…", "Move {0} to Changes": "Przenieś {0} do Zmian", "Move {0} to the Trash?": "Przenieść {0} do Kosza?", "Move {0} with the rewrite": "Przenieś {0} razem z przepisaniem", @@ -2587,6 +2601,10 @@ "New Branch from '": "Nowy branch z '", "New Branch from These Commits": "Nowy branch z tych commitów", "New Branch…": "Nowy branch…", + "New Changelist": "Nowa lista zmian", + "New Changelist for {0}": "Nowa lista zmian dla {0}", + "New Changelist for {0} Files": "Nowa lista zmian dla plików ({0})", + "New Changelist…": "Nowa lista zmian…", "New PR": "Nowy PR", "New Worktree from '": "Nowy worktree z '", "New Worktree…": "Nowy worktree…", @@ -3492,6 +3510,8 @@ "Removes it from this list only": "Usuwa to tylko z tej listy", "Removing…": "Usuwanie…", "Rename": "Zmień nazwę", + "Rename Changelist “{0}”": "Zmień nazwę listy zmian „{0}”", + "Rename Changelist…": "Zmień nazwę listy zmian…", "Rename branch": "Zmień nazwę brancha", "Rename branch {0}": "Zmień nazwę brancha {0}", "Rename it, then check it out.": "Zmień jego nazwę, a potem przełącz się na niego.", @@ -3990,6 +4010,7 @@ "Stage (or unstage) the lines selected in the diff": "Przygotuj (albo cofnij przygotowanie) linie wybrane w diffie", "Stage All": "Przygotuj wszystko", "Stage All Changes": "Przygotuj wszystkie zmiany", + "Stage All in This Changelist": "Przygotuj wszystko z tej listy zmian", "Stage Changes with Ticks": "Przygotuj zmiany ptaszkami", "Stage Folder": "Przygotuj folder", "Stage all": "Przygotuj wszystko", @@ -4054,6 +4075,7 @@ "Stash 1 selected file…": "Zapisz w schowku 1 wybrany plik…", "Stash All Changes": "Zapisz w schowku wszystkie zmiany", "Stash Everything Staged": "Zapisz w schowku wszystko przygotowane", + "Stash These Files": "Zapisz te pliki w schowku", "Stash This File": "Zapisz ten plik w schowku", "Stash This Folder": "Zapisz ten folder w schowku", "Stash all changes": "Zapisz do schowka wszystkie zmiany", @@ -4208,6 +4230,7 @@ "That isn't a usable folder name.": "To nie jest użyteczna nazwa folderu.", "That isn't a way to reconcile a pull.": "To nie jest sposób na uzgodnienie pulla.", "That isn't a {0} this app made.": "To nie jest {0} wykonane przez tę aplikację.", + "That name is too long. Keep it under 80 characters.": "Ta nazwa jest za długa. Użyj mniej niż 80 znaków.", "That path escapes the repository — nothing was changed.": "Ta ścieżka wychodzi poza repozytorium — nic nie zostało zmienione.", "That path is outside the repository.": "Ta ścieżka jest poza repozytorium.", "That puts back only what it changed, and only where nothing has moved since.": "To przywraca tylko to, co zmieniło, i tylko tam, gdzie nic się od tego czasu nie przesunęło.", @@ -4290,6 +4313,7 @@ "The controls on this bar act on {0}": "Kontrolki na tym pasku działają na {0}", "The current commit": "Aktualny commit", "The dark window and the Dock icon, together. Graphite matches the icon macOS shows while GitStudio is closed. With Neon the Dock icon turns neon while GitStudio runs; macOS still shows the Graphite icon while it is closed.": "Ciemne okno i ikona Docka razem. Graphite odpowiada ikonie, którą pokazuje macOS, gdy GitStudio jest zamknięte. Z Neon ikona Docka zmienia się na neonową, gdy GitStudio działa; macOS wciąż pokazuje ikonę Graphite, gdy jest zamknięte.", + "The default changelist": "Domyślna lista zmian", "The download failed.": "Pobieranie nie powiodło się.", "The dropped commit is back": "Odrzucony commit jest przywrócony", "The file goes back to its committed version. {0}": "Plik wraca do swojej zatwierdzonej wersji. {0}", @@ -4401,6 +4425,7 @@ "Theme: System": "Motyw: systemowy", "There are no files to go to yet.": "Jeszcze nie ma plików, do których można przejść.", "There are unresolved conflicts — resolve them or cancel first.": "Są nierozwiązane konflikty — najpierw je rozwiąż albo anuluj.", + "There is already a group called “{0}”. Choose another name.": "Grupa o nazwie „{0}” już istnieje. Wybierz inną nazwę.", "There is no '{0}' to reset to — it is not on {1} any more.": "Nie ma '{0}', do którego można zresetować — już nie jest na {1}.", "There is no '{0}' to reset to, and {1} couldn't be reached to fetch it.": "Nie ma '{0}', do którego można zresetować, a nie udało się połączyć z {1}, aby go pobrać.", "There is no Apply to undo here any more.": "Nie ma już tu Apply do wycofania.", @@ -5704,6 +5729,7 @@ "{0} files have changed since their changes were discarded ({1}), and bringing them back would overwrite that. Nothing was changed.": "{0} plików zmieniło się od czasu odrzucenia ich zmian ({1}), a przywrócenie ich by to nadpisało. Nic nie zmieniono.", "{0} files have conflicts to resolve.": "pliki ({0}) mają konflikty do rozwiązania.", "{0} files have conflicts — open Changes to resolve": "{0} plików ma konflikty — otwórz Changes, aby rozwiązać", + "{0} files in changelists are left out.": "Pliki z list zmian pomijane: {0}.", "{0} files selected": "wybrane pliki: {0}", "{0} files still conflicted": "{0} plików wciąż ma konflikt", "{0} files still contain": "pliki ({0}) wciąż zawierają", @@ -5988,6 +6014,7 @@ "{0} · {1} · {2} files changed": "{0} · {1} · {2} zmienionych plików", "{0} — Ctrl/Cmd-click to select every file in this section": "{0} — Ctrl/Cmd-klik, aby wybrać każdy plik w tej sekcji", "{0} — Ctrl/Cmd-click to select every file, right-click to select just the checked or unchecked ones": "{0} — Ctrl/Cmd-klik, aby wybrać każdy plik, kliknięcie prawym, aby wybrać tylko zaznaczone albo niezaznaczone", + "{0} — a changelist: its files stay out of Stage All and Commit all until you stage them. Click to collapse, Ctrl/Cmd-click to select its files, right-click for its actions.": "{0} — lista zmian: jej pliki są pomijane przez Przygotuj wszystko i Zatwierdź wszystkie, dopóki ich nie przygotujesz. Kliknij, aby zwinąć, Ctrl/Cmd-klik, aby zaznaczyć jej pliki, prawy przycisk, aby zobaczyć jej akcje.", "{0} — click to collapse, ": "{0} — kliknij, aby zwinąć, ", "{0} — continue or abort it first.": "{0} — najpierw kontynuuj albo przerwij.", "{0} — done.": "{0} — zakończone.", @@ -6018,6 +6045,7 @@ "{0}, and more": "{0} i więcej", "{0}, and {1} more": "{0} i {1} więcej", "{0}, but {1} isn't: {2}": "{0}, ale {1} nie jest: {2}", + "{0}, changelist, {1}": "{0}, lista zmian, {1}", "{0}, plus the commits of {1} already rebased onto it": "{0}, plus commity {1} już zrebase'owane na niego", "{0}, so it was checked out as {1} at its last commit — a push from there can't reach the pull request. {2}": "{0}, więc został aktywowany jako {1} na jego ostatnim commicie — push z tego miejsca nie może trafić do pull requesta. {2}", "{0}, then create a branch to push them.": "{0}, a potem utwórz branch, aby je wypchnąć.", diff --git a/l10n/pt-br.json b/l10n/pt-br.json index 76fb631f..7694b557 100644 --- a/l10n/pt-br.json +++ b/l10n/pt-br.json @@ -100,6 +100,7 @@ "$(check) Committed": "$(check) Commit feito", "$(check) Copied {0}": "$(check) {0} copiado", "$(check) Created & switched to {0}": "$(check) Criado e trocado para {0}", + "$(check) Deleted changelist “{0}” — its files are back in Changes": "$(check) Lista de alterações “{0}” excluída — seus arquivos voltaram para Alterações", "$(check) GitStudio: AI features disabled": "$(check) GitStudio: recursos de IA desativados", "$(check) Nothing to push from {0} — up to date": "$(check) Nada para enviar de {0} — atualizado", "$(check) Nothing to push — up to date": "$(check) Nada para enviar — atualizado", @@ -243,6 +244,7 @@ "1 file": "1 arquivo", "1 file changed": "1 arquivo alterado", "1 file has conflicts to resolve.": "1 arquivo tem conflitos a resolver.", + "1 file in a changelist is left out.": "1 arquivo em uma lista de alterações fica de fora.", "1 file selected": "1 arquivo selecionado", "1 file still conflicted": "1 arquivo ainda em conflito", "1 file still contains": "1 arquivo ainda contém", @@ -687,6 +689,7 @@ "Changed Files": "Arquivos Alterados", "Changed files": "Arquivos alterados", "Changed on one side, deleted on the other": "Alterado em um lado, excluído no outro", + "Changelist name": "Nome da lista de alterações", "Changes": "Alterações", "Changes ({0})": "Alterações ({0})", "Changes committed.": "Alterações commitadas.", @@ -1423,6 +1426,7 @@ "Delete '{0}'? Commits that are only on this branch stop being reachable by name. You can undo this straight afterwards.": "Excluir '{0}'? Commits que existem apenas neste branch deixam de ser alcançáveis pelo nome. Você pode desfazer isso imediatamente depois.", "Delete 1": "Excluir 1", "Delete 1 finished branch?": "Excluir 1 branch concluído?", + "Delete Changelist": "Excluir Lista de Alterações", "Delete Remote Branch": "Excluir Branch Remoto", "Delete Tag": "Excluir Tag", "Delete asset": "Excluir ativo", @@ -1624,6 +1628,7 @@ "Drop to apply": "Solte para aplicar", "Drop to copy {0}": "Solte para copiar {0}", "Drop to move {0}": "Solte para mover {0}", + "Drop to move {0} to “{1}”": "Solte para mover {0} para “{1}”", "Drop to pop": "Solte para fazer pop", "Drop to stash": "Soltar para guardar no stash", "Drop to stash 1 file": "Soltar para guardar 1 arquivo no stash", @@ -1686,6 +1691,7 @@ "Enter a key first.": "Insira uma chave primeiro.", "Enter a line number, or a range like 12-18.": "Insira um número de linha, ou um intervalo como 12-18.", "Enter a name and an email to save.": "Insira um nome e um e-mail para salvar.", + "Enter a name for the changelist.": "Digite um nome para a lista de alterações.", "Enter this code at ": "Insira este código em ", "Enter to send · Shift+Enter for a new line": "Enter para enviar · Shift+Enter para uma nova linha", "Error on line {0}": "Erro na linha {0}", @@ -1767,6 +1773,7 @@ "Filename including extension…": "Nome do arquivo incluindo a extensão…", "Files": "Arquivos", "Files changed": "Arquivos alterados", + "Files in a changelist are left out of Stage All and Commit all until you stage them yourself.": "Arquivos em uma lista de alterações ficam fora de Colocar Tudo em Stage e de Commitar todos até você colocá-los em stage.", "Files in this gist": "Arquivos neste gist", "Files resolved": "Arquivos resolvidos", "Filter": "Filtro", @@ -2041,6 +2048,7 @@ "GitStudio: couldn't prepare the push — {0}": "GitStudio: não foi possível preparar o push — {0}", "GitStudio: couldn't prune — {0}": "GitStudio: não foi possível limpar — {0}", "GitStudio: couldn't reset {0} to {1}{2}": "GitStudio: não foi possível redefinir {0} para {1}{2}", + "GitStudio: couldn't save the changelists — {0}": "GitStudio: não foi possível salvar as listas de alterações — {0}", "GitStudio: couldn't stage that change — {0}": "GitStudio: não foi possível colocar essa alteração em stage — {0}", "GitStudio: couldn't stage the changes — {0}": "GitStudio: não foi possível colocar as alterações em stage — {0}", "GitStudio: couldn't stash your changes, so nothing ran — {0}": "GitStudio: não foi possível guardar suas alterações no stash, então nada foi executado — {0}", @@ -2059,6 +2067,8 @@ "GitStudio: no worktree this can be done to.": "GitStudio: não há worktree ao qual isso possa ser feito.", "GitStudio: nothing staged, or AI is unavailable.": "GitStudio: nada em stage, ou a IA está indisponível.", "GitStudio: nothing stashed — every file was unticked.": "GitStudio: nada foi guardado no stash — todos os arquivos foram desmarcados.", + "GitStudio: nothing to commit. The only changed file is in a changelist — stage it first to commit it.": "GitStudio: nada para commitar. O único arquivo alterado está em uma lista de alterações — coloque-o em stage primeiro para commitá-lo.", + "GitStudio: nothing to commit. The only changed files are in changelists — stage the ones to commit first.": "GitStudio: nada para commitar. Os únicos arquivos alterados estão em listas de alterações — coloque em stage primeiro os que quer commitar.", "GitStudio: nothing to draft (stage changes first), or AI is unavailable.": "GitStudio: nada para redigir (coloque alterações em stage primeiro), ou a IA está indisponível.", "GitStudio: nothing to stash — the working tree is clean.": "GitStudio: nada para guardar no stash — a árvore de trabalho está limpa.", "GitStudio: open a file in a Git repository to stage lines.": "GitStudio: abra um arquivo em um repositório Git para colocar linhas em stage.", @@ -2548,12 +2558,16 @@ "Move this branch to {0} ({1} reset).\n\nThe commits are undone; their changes stay staged.": "Mover este branch para {0} (reset {1}).\n\nOs commits são desfeitos; suas alterações permanecem em stage.", "Move through the output": "Mover pela saída", "Move to": "Mover para", + "Move to Changelist…": "Mover para Lista de Alterações…", "Move to Changes": "Mover para Changes", "Move to Trash": "Mover para a Lixeira", "Move to Trash…": "Mover para a Lixeira…", "Move up": "Mover para cima", "Move up (Alt+Up)": "Mover para cima (Alt+Up)", + "Move {0} Files to Changelist": "Mover {0} Arquivos para Lista de Alterações", "Move {0} out of “{1}”": "Mover {0} para fora de “{1}”", + "Move {0} to Changelist": "Mover {0} para Lista de Alterações", + "Move {0} to Changelist…": "Mover {0} para Lista de Alterações…", "Move {0} to Changes": "Mover {0} para Changes", "Move {0} to the Trash?": "Mover {0} para a Lixeira?", "Move {0} with the rewrite": "Mover {0} com a reescrita", @@ -2587,6 +2601,10 @@ "New Branch from '": "Novo Branch a partir de '", "New Branch from These Commits": "Novo Branch a partir Destes Commits", "New Branch…": "Novo Branch…", + "New Changelist": "Nova Lista de Alterações", + "New Changelist for {0}": "Nova Lista de Alterações para {0}", + "New Changelist for {0} Files": "Nova Lista de Alterações para {0} Arquivos", + "New Changelist…": "Nova Lista de Alterações…", "New PR": "Nova PR", "New Worktree from '": "Novo Worktree a partir de '", "New Worktree…": "Novo Worktree…", @@ -3492,6 +3510,8 @@ "Removes it from this list only": "Remove apenas desta lista", "Removing…": "Removendo…", "Rename": "Renomear", + "Rename Changelist “{0}”": "Renomear Lista de Alterações “{0}”", + "Rename Changelist…": "Renomear Lista de Alterações…", "Rename branch": "Renomear branch", "Rename branch {0}": "Renomear branch {0}", "Rename it, then check it out.": "Renomeie-o, depois faça checkout dele.", @@ -3990,6 +4010,7 @@ "Stage (or unstage) the lines selected in the diff": "Colocar em stage (ou remover do stage) as linhas selecionadas no diff", "Stage All": "Colocar Tudo em Stage", "Stage All Changes": "Colocar Todas as Alterações em Stage", + "Stage All in This Changelist": "Colocar Tudo desta Lista em Stage", "Stage Changes with Ticks": "Colocar Alterações em Stage com Marcações", "Stage Folder": "Colocar Pasta em Stage", "Stage all": "Colocar tudo em stage", @@ -4054,6 +4075,7 @@ "Stash 1 selected file…": "Guardar 1 arquivo selecionado no Stash…", "Stash All Changes": "Guardar Todas as Alterações no Stash", "Stash Everything Staged": "Guardar Tudo em Stage no Stash", + "Stash These Files": "Guardar Estes Arquivos no Stash", "Stash This File": "Guardar Este Arquivo no Stash", "Stash This Folder": "Guardar Esta Pasta no Stash", "Stash all changes": "Guardar todas as alterações no stash", @@ -4208,6 +4230,7 @@ "That isn't a usable folder name.": "Esse não é um nome de pasta utilizável.", "That isn't a way to reconcile a pull.": "Essa não é uma forma de reconciliar um pull.", "That isn't a {0} this app made.": "Esse não é um {0} que este app fez.", + "That name is too long. Keep it under 80 characters.": "Esse nome é longo demais. Use menos de 80 caracteres.", "That path escapes the repository — nothing was changed.": "Esse caminho escapa do repositório — nada foi alterado.", "That path is outside the repository.": "Esse caminho está fora do repositório.", "That puts back only what it changed, and only where nothing has moved since.": "Isso devolve apenas o que foi alterado, e apenas onde nada se moveu desde então.", @@ -4290,6 +4313,7 @@ "The controls on this bar act on {0}": "Os controles nesta barra agem sobre {0}", "The current commit": "O commit atual", "The dark window and the Dock icon, together. Graphite matches the icon macOS shows while GitStudio is closed. With Neon the Dock icon turns neon while GitStudio runs; macOS still shows the Graphite icon while it is closed.": "A janela escura e o ícone do Dock, juntos. Graphite combina com o ícone que o macOS mostra enquanto o GitStudio está fechado. Com Neon o ícone do Dock fica neon enquanto o GitStudio está em execução; o macOS continua mostrando o ícone Graphite enquanto está fechado.", + "The default changelist": "A lista de alterações padrão", "The download failed.": "O download falhou.", "The dropped commit is back": "O commit descartado voltou", "The file goes back to its committed version. {0}": "O arquivo volta para sua versão commitada. {0}", @@ -4401,6 +4425,7 @@ "Theme: System": "Tema: Sistema", "There are no files to go to yet.": "Ainda não há arquivos para ir.", "There are unresolved conflicts — resolve them or cancel first.": "Há conflitos não resolvidos — resolva-os ou cancele antes.", + "There is already a group called “{0}”. Choose another name.": "Já existe um grupo chamado “{0}”. Escolha outro nome.", "There is no '{0}' to reset to — it is not on {1} any more.": "Não há '{0}' para redefinir — ele não está mais em {1}.", "There is no '{0}' to reset to, and {1} couldn't be reached to fetch it.": "Não há '{0}' para redefinir, e não foi possível alcançar {1} para buscá-lo.", "There is no Apply to undo here any more.": "Não há mais nenhum Apply para desfazer aqui.", @@ -5704,6 +5729,7 @@ "{0} files have changed since their changes were discarded ({1}), and bringing them back would overwrite that. Nothing was changed.": "{0} arquivos mudaram desde que suas alterações foram descartadas ({1}), e trazê-las de volta sobrescreveria isso. Nada foi alterado.", "{0} files have conflicts to resolve.": "{0} arquivos têm conflitos a resolver.", "{0} files have conflicts — open Changes to resolve": "{0} arquivos têm conflitos — abra Alterações para resolver", + "{0} files in changelists are left out.": "{0} arquivos em listas de alterações ficam de fora.", "{0} files selected": "{0} arquivos selecionados", "{0} files still conflicted": "{0} arquivos ainda em conflito", "{0} files still contain": "{0} arquivos ainda contêm", @@ -5988,6 +6014,7 @@ "{0} · {1} · {2} files changed": "{0} · {1} · {2} arquivos alterados", "{0} — Ctrl/Cmd-click to select every file in this section": "{0} — Ctrl/Cmd-clique para selecionar todo arquivo nesta seção", "{0} — Ctrl/Cmd-click to select every file, right-click to select just the checked or unchecked ones": "{0} — Ctrl/Cmd-clique para selecionar todo arquivo, clique com o botão direito para selecionar apenas os marcados ou desmarcados", + "{0} — a changelist: its files stay out of Stage All and Commit all until you stage them. Click to collapse, Ctrl/Cmd-click to select its files, right-click for its actions.": "{0} — uma lista de alterações: seus arquivos ficam fora de Colocar Tudo em Stage e de Commitar todos até você colocá-los em stage. Clique para recolher, Ctrl/Cmd-clique para selecionar seus arquivos, clique com o botão direito para suas ações.", "{0} — click to collapse, ": "{0} — clique para recolher, ", "{0} — continue or abort it first.": "{0} — continue-o ou aborte-o primeiro.", "{0} — done.": "{0} — concluído.", @@ -6018,6 +6045,7 @@ "{0}, and more": "{0}, e mais", "{0}, and {1} more": "{0}, e mais {1}", "{0}, but {1} isn't: {2}": "{0}, mas {1} não é: {2}", + "{0}, changelist, {1}": "{0}, lista de alterações, {1}", "{0}, plus the commits of {1} already rebased onto it": "{0}, mais os commits de {1} já rebaseados sobre ele", "{0}, so it was checked out as {1} at its last commit — a push from there can't reach the pull request. {2}": "{0}, então teve checkout feito como {1} no último commit dele — um push a partir de lá não pode alcançar a pull request. {2}", "{0}, then create a branch to push them.": "{0}, depois crie um branch para enviá-los por push.", diff --git a/l10n/ru.json b/l10n/ru.json index 81cc23b9..aaf986f6 100644 --- a/l10n/ru.json +++ b/l10n/ru.json @@ -100,6 +100,7 @@ "$(check) Committed": "$(check) Закоммичено", "$(check) Copied {0}": "$(check) Скопировано: {0}", "$(check) Created & switched to {0}": "$(check) Создано и переключено на {0}", + "$(check) Deleted changelist “{0}” — its files are back in Changes": "$(check) Список изменений «{0}» удалён — его файлы снова в Изменениях", "$(check) GitStudio: AI features disabled": "$(check) GitStudio: функции AI отключены", "$(check) Nothing to push from {0} — up to date": "$(check) Нечего отправлять из {0} — всё актуально", "$(check) Nothing to push — up to date": "$(check) Нечего отправлять — всё актуально", @@ -243,6 +244,7 @@ "1 file": "1 файл", "1 file changed": "1 файл изменён", "1 file has conflicts to resolve.": "В 1 файле есть конфликты для разрешения.", + "1 file in a changelist is left out.": "1 файл в списке изменений не включается.", "1 file selected": "Выбран 1 файл", "1 file still conflicted": "1 файл ещё конфликтует", "1 file still contains": "1 файл всё ещё содержит", @@ -687,6 +689,7 @@ "Changed Files": "Изменённые файлы", "Changed files": "Изменённые файлы", "Changed on one side, deleted on the other": "Изменено на одной стороне, удалено на другой", + "Changelist name": "Имя списка изменений", "Changes": "Изменения", "Changes ({0})": "Изменения ({0})", "Changes committed.": "Изменения закоммичены.", @@ -1423,6 +1426,7 @@ "Delete '{0}'? Commits that are only on this branch stop being reachable by name. You can undo this straight afterwards.": "Удалить «{0}»? Коммиты, которые есть только в этой ветке, станут недоступны по имени. Это можно сразу же отменить.", "Delete 1": "Удалить: 1", "Delete 1 finished branch?": "Удалить 1 завершённую ветку?", + "Delete Changelist": "Удалить список изменений", "Delete Remote Branch": "Удалить удалённую ветку", "Delete Tag": "Удалить тег", "Delete asset": "Удалить ресурс", @@ -1624,6 +1628,7 @@ "Drop to apply": "Отпустите, чтобы применить", "Drop to copy {0}": "Отпустите, чтобы скопировать {0}", "Drop to move {0}": "Отпустите, чтобы переместить {0}", + "Drop to move {0} to “{1}”": "Отпустите, чтобы переместить {0} в «{1}»", "Drop to pop": "Отпустите, чтобы извлечь", "Drop to stash": "Отправить в тайник", "Drop to stash 1 file": "Отправить в тайник 1 файл", @@ -1686,6 +1691,7 @@ "Enter a key first.": "Сначала введите ключ.", "Enter a line number, or a range like 12-18.": "Введите номер строки или диапазон, например 12-18.", "Enter a name and an email to save.": "Введите имя и email, чтобы сохранить.", + "Enter a name for the changelist.": "Введите имя списка изменений.", "Enter this code at ": "Введите этот код на ", "Enter to send · Shift+Enter for a new line": "Enter — отправить · Shift+Enter — новая строка", "Error on line {0}": "Ошибка в строке {0}", @@ -1767,6 +1773,7 @@ "Filename including extension…": "Имя файла с расширением…", "Files": "Файлы", "Files changed": "Изменённые файлы", + "Files in a changelist are left out of Stage All and Commit all until you stage them yourself.": "Файлы в списке изменений не затрагиваются командами «Добавить всё в индекс» и «Закоммитить все», пока вы сами не добавите их в индекс.", "Files in this gist": "Файлы в этом gist", "Files resolved": "Файлы разрешены", "Filter": "Фильтр", @@ -2041,6 +2048,7 @@ "GitStudio: couldn't prepare the push — {0}": "GitStudio: не удалось подготовить отправку — {0}", "GitStudio: couldn't prune — {0}": "GitStudio: не удалось выполнить очистку — {0}", "GitStudio: couldn't reset {0} to {1}{2}": "GitStudio: не удалось сбросить {0} на {1}{2}", + "GitStudio: couldn't save the changelists — {0}": "GitStudio: не удалось сохранить списки изменений — {0}", "GitStudio: couldn't stage that change — {0}": "GitStudio: не удалось добавить это изменение в индекс — {0}", "GitStudio: couldn't stage the changes — {0}": "GitStudio: не удалось добавить изменения в индекс — {0}", "GitStudio: couldn't stash your changes, so nothing ran — {0}": "GitStudio: не удалось спрятать ваши изменения, поэтому ничего не выполнено — {0}", @@ -2059,6 +2067,8 @@ "GitStudio: no worktree this can be done to.": "GitStudio: нет рабочего каталога, к которому это можно применить.", "GitStudio: nothing staged, or AI is unavailable.": "GitStudio: ничего не в индексе, либо AI недоступен.", "GitStudio: nothing stashed — every file was unticked.": "GitStudio: ничего не спрятано — все файлы были сняты с отметки.", + "GitStudio: nothing to commit. The only changed file is in a changelist — stage it first to commit it.": "GitStudio: нечего коммитить. Единственный изменённый файл находится в списке изменений — сначала добавьте его в индекс, чтобы закоммитить.", + "GitStudio: nothing to commit. The only changed files are in changelists — stage the ones to commit first.": "GitStudio: нечего коммитить. Все изменённые файлы находятся в списках изменений — сначала добавьте в индекс те, что нужно закоммитить.", "GitStudio: nothing to draft (stage changes first), or AI is unavailable.": "GitStudio: нечего составлять (сначала добавьте изменения в индекс), либо AI недоступен.", "GitStudio: nothing to stash — the working tree is clean.": "GitStudio: нечего прятать — рабочее дерево чистое.", "GitStudio: open a file in a Git repository to stage lines.": "GitStudio: откройте файл в Git-репозитории, чтобы добавлять строки в индекс.", @@ -2548,12 +2558,16 @@ "Move this branch to {0} ({1} reset).\n\nThe commits are undone; their changes stay staged.": "Переместить эту ветку на {0} (сброс {1}).\n\nКоммиты отменяются; их изменения остаются в индексе.", "Move through the output": "Перемещение по выводу", "Move to": "Переместить в", + "Move to Changelist…": "Переместить в список изменений…", "Move to Changes": "Переместить в «Изменения»", "Move to Trash": "Переместить в корзину", "Move to Trash…": "Переместить в корзину…", "Move up": "Переместить вверх", "Move up (Alt+Up)": "Переместить вверх (Alt+Up)", + "Move {0} Files to Changelist": "Переместить файлы ({0}) в список изменений", "Move {0} out of “{1}”": "Переместить {0} из «{1}»", + "Move {0} to Changelist": "Переместить {0} в список изменений", + "Move {0} to Changelist…": "Переместить {0} в список изменений…", "Move {0} to Changes": "Переместить {0} в «Изменения»", "Move {0} to the Trash?": "Переместить {0} в корзину?", "Move {0} with the rewrite": "Переместить {0} вместе с переписыванием", @@ -2587,6 +2601,10 @@ "New Branch from '": "Новая ветка из '", "New Branch from These Commits": "Новая ветка из этих коммитов", "New Branch…": "Новая ветка…", + "New Changelist": "Новый список изменений", + "New Changelist for {0}": "Новый список изменений для {0}", + "New Changelist for {0} Files": "Новый список изменений для файлов ({0})", + "New Changelist…": "Новый список изменений…", "New PR": "Новый PR", "New Worktree from '": "Новый рабочий каталог из '", "New Worktree…": "Новый рабочий каталог…", @@ -3492,6 +3510,8 @@ "Removes it from this list only": "Убирает только из этого списка", "Removing…": "Удаление…", "Rename": "Переименовать", + "Rename Changelist “{0}”": "Переименовать список изменений «{0}»", + "Rename Changelist…": "Переименовать список изменений…", "Rename branch": "Переименовать ветку", "Rename branch {0}": "Переименовать ветку {0}", "Rename it, then check it out.": "Переименуйте её, затем переключитесь на неё.", @@ -3990,6 +4010,7 @@ "Stage (or unstage) the lines selected in the diff": "Проиндексировать (или снять с индекса) строки, выбранные в различиях", "Stage All": "Добавить всё в индекс", "Stage All Changes": "Добавить все изменения в индекс", + "Stage All in This Changelist": "Добавить в индекс всё из этого списка", "Stage Changes with Ticks": "Добавлять изменения в индекс отметками", "Stage Folder": "Добавить папку в индекс", "Stage all": "Добавить всё в индекс", @@ -4054,6 +4075,7 @@ "Stash 1 selected file…": "Спрятать 1 выбранный файл…", "Stash All Changes": "Спрятать все изменения", "Stash Everything Staged": "Спрятать всё, что в индексе", + "Stash These Files": "Спрятать эти файлы", "Stash This File": "Спрятать этот файл", "Stash This Folder": "Спрятать эту папку", "Stash all changes": "Сохранить все изменения в тайник", @@ -4208,6 +4230,7 @@ "That isn't a usable folder name.": "Это не подходящее имя папки.", "That isn't a way to reconcile a pull.": "Это не способ разрешить стяжку.", "That isn't a {0} this app made.": "Это не {0}, сделанное этим приложением.", + "That name is too long. Keep it under 80 characters.": "Слишком длинное имя. Используйте не более 80 символов.", "That path escapes the repository — nothing was changed.": "Этот путь выходит за пределы репозитория — ничего не изменено.", "That path is outside the repository.": "Этот путь находится вне репозитория.", "That puts back only what it changed, and only where nothing has moved since.": "Это вернёт только то, что было изменено, и только там, где с тех пор ничего не сдвинулось.", @@ -4290,6 +4313,7 @@ "The controls on this bar act on {0}": "Элементы управления на этой панели действуют на {0}", "The current commit": "Текущий коммит", "The dark window and the Dock icon, together. Graphite matches the icon macOS shows while GitStudio is closed. With Neon the Dock icon turns neon while GitStudio runs; macOS still shows the Graphite icon while it is closed.": "Тёмное окно и значок в доке вместе. «Графит» совпадает со значком, который показывает macOS, когда GitStudio закрыт. С «Нео» значок в доке становится неоновым, пока GitStudio работает; macOS всё равно показывает значок «Графит», когда он закрыт.", + "The default changelist": "Список изменений по умолчанию", "The download failed.": "Загрузка не удалась.", "The dropped commit is back": "Отброшенный коммит возвращён", "The file goes back to its committed version. {0}": "Файл возвращается к закоммиченной версии. {0}", @@ -4401,6 +4425,7 @@ "Theme: System": "Тема: системная", "There are no files to go to yet.": "Пока нет файлов, к которым можно перейти.", "There are unresolved conflicts — resolve them or cancel first.": "Есть неразрешённые конфликты — сначала разрешите их или отмените.", + "There is already a group called “{0}”. Choose another name.": "Группа «{0}» уже существует. Выберите другое имя.", "There is no '{0}' to reset to — it is not on {1} any more.": "Нет '{0}', на который можно сбросить — его больше нет на {1}.", "There is no '{0}' to reset to, and {1} couldn't be reached to fetch it.": "Нет '{0}', на который можно сбросить, а связаться с {1}, чтобы его получить, не удалось.", "There is no Apply to undo here any more.": "Здесь больше нет «Применить» для отмены.", @@ -5704,6 +5729,7 @@ "{0} files have changed since their changes were discarded ({1}), and bringing them back would overwrite that. Nothing was changed.": "{0} файлов изменились с тех пор, как их изменения были отклонены ({1}), и возврат перезаписал бы это. Ничего не изменено.", "{0} files have conflicts to resolve.": "В {0} файлах есть конфликты для разрешения.", "{0} files have conflicts — open Changes to resolve": "{0} файлов конфликтуют — откройте «Изменения», чтобы разрешить", + "{0} files in changelists are left out.": "Файлы в списках изменений не включаются: {0}.", "{0} files selected": "Выбрано {0} файлов", "{0} files still conflicted": "{0} файлов ещё конфликтуют", "{0} files still contain": "{0} файлов всё ещё содержат", @@ -5988,6 +6014,7 @@ "{0} · {1} · {2} files changed": "{0} · {1} · {2} файлов изменено", "{0} — Ctrl/Cmd-click to select every file in this section": "{0} — Ctrl/Cmd-клик, чтобы выбрать все файлы в этом разделе", "{0} — Ctrl/Cmd-click to select every file, right-click to select just the checked or unchecked ones": "{0} — Ctrl/Cmd-клик, чтобы выбрать все файлы, правый клик — только отмеченные или только неотмеченные", + "{0} — a changelist: its files stay out of Stage All and Commit all until you stage them. Click to collapse, Ctrl/Cmd-click to select its files, right-click for its actions.": "{0} — список изменений: его файлы не затрагиваются командами «Добавить всё в индекс» и «Закоммитить все», пока вы не добавите их в индекс. Нажмите, чтобы свернуть, Ctrl/Cmd+щелчок — выбрать его файлы, правый щелчок — его действия.", "{0} — click to collapse, ": "{0} — нажмите, чтобы свернуть, ", "{0} — continue or abort it first.": "{0} — сначала продолжите или прервите.", "{0} — done.": "{0} — готово.", @@ -6018,6 +6045,7 @@ "{0}, and more": "{0}, и ещё", "{0}, and {1} more": "{0}, и ещё {1}", "{0}, but {1} isn't: {2}": "{0}, но {1} — нет: {2}", + "{0}, changelist, {1}": "{0}, список изменений, {1}", "{0}, plus the commits of {1} already rebased onto it": "{0}, плюс коммиты {1}, уже перебазированные на неё", "{0}, so it was checked out as {1} at its last commit — a push from there can't reach the pull request. {2}": "{0}, поэтому она была извлечена как {1} на последнем коммите — отправка оттуда не достигнет pull request. {2}", "{0}, then create a branch to push them.": "{0}, затем создайте ветку, чтобы отправить их.", diff --git a/l10n/tr.json b/l10n/tr.json index af72d5ab..7ecf2ea3 100644 --- a/l10n/tr.json +++ b/l10n/tr.json @@ -100,6 +100,7 @@ "$(check) Committed": "$(check) İşlendi", "$(check) Copied {0}": "$(check) {0} kopyalandı", "$(check) Created & switched to {0}": "$(check) Oluşturuldu ve {0}'a geçildi", + "$(check) Deleted changelist “{0}” — its files are back in Changes": "$(check) “{0}” değişiklik listesi silindi — dosyaları yeniden Değişiklikler'de", "$(check) GitStudio: AI features disabled": "$(check) GitStudio: Yapay zeka özellikleri devre dışı", "$(check) Nothing to push from {0} — up to date": "$(check) {0}'dan gönderilecek bir şey yok — güncel", "$(check) Nothing to push — up to date": "$(check) Gönderilecek bir şey yok — güncel", @@ -243,6 +244,7 @@ "1 file": "1 dosya", "1 file changed": "1 dosya değişti", "1 file has conflicts to resolve.": "1 dosyada çözülecek çakışma var.", + "1 file in a changelist is left out.": "Bir değişiklik listesindeki 1 dosya dışarıda bırakıldı.", "1 file selected": "1 dosya seçildi", "1 file still conflicted": "1 dosyada hâlâ çakışma var", "1 file still contains": "1 dosya hâlâ içeriyor", @@ -687,6 +689,7 @@ "Changed Files": "Değiştirilen Dosyalar", "Changed files": "Değiştirilen dosyalar", "Changed on one side, deleted on the other": "Bir tarafta değişti, diğerinde silindi", + "Changelist name": "Değişiklik listesi adı", "Changes": "Değişiklikler", "Changes ({0})": "Değişiklikler ({0})", "Changes committed.": "Değişiklikler işlendi.", @@ -1423,6 +1426,7 @@ "Delete '{0}'? Commits that are only on this branch stop being reachable by name. You can undo this straight afterwards.": "'{0}' silinsin mi? Yalnızca bu dalda olan işlemeler artık ada göre erişilebilir olmaktan çıkar. Bunu hemen ardından geri alabilirsiniz.", "Delete 1": "1'ini sil", "Delete 1 finished branch?": "Bitmiş 1 dal silinsin mi?", + "Delete Changelist": "Değişiklik Listesini Sil", "Delete Remote Branch": "Uzak Dalı Sil", "Delete Tag": "Etiketi Sil", "Delete asset": "Varlığı sil", @@ -1624,6 +1628,7 @@ "Drop to apply": "Uygulamak için sürükleyip bırakın", "Drop to copy {0}": "{0}'ı kopyalamak için sürükleyip bırakın", "Drop to move {0}": "{0}'ı taşımak için sürükleyip bırakın", + "Drop to move {0} to “{1}”": "{0} öğesini “{1}” listesine taşımak için bırakın", "Drop to pop": "Çıkarmak için sürükleyip bırakın", "Drop to stash": "Zulaya bırak", "Drop to stash 1 file": "Zulaya 1 dosya bırak", @@ -1686,6 +1691,7 @@ "Enter a key first.": "Önce bir anahtar girin.", "Enter a line number, or a range like 12-18.": "Bir satır numarası veya 12-18 gibi bir aralık girin.", "Enter a name and an email to save.": "Kaydetmek için bir ad ve bir e-posta girin.", + "Enter a name for the changelist.": "Değişiklik listesi için bir ad girin.", "Enter this code at ": "Bu kodu şurada girin: ", "Enter to send · Shift+Enter for a new line": "Göndermek için Enter · Yeni satır için Shift+Enter", "Error on line {0}": "{0} satırında hata", @@ -1767,6 +1773,7 @@ "Filename including extension…": "Uzantı dahil dosya adı…", "Files": "Dosyalar", "Files changed": "Değiştirilen dosyalar", + "Files in a changelist are left out of Stage All and Commit all until you stage them yourself.": "Bir değişiklik listesindeki dosyalar, siz kendiniz hazırlayana kadar Tümünü Hazırla ve tümünü işle dışında kalır.", "Files in this gist": "Bu gist'teki dosyalar", "Files resolved": "Çözülen dosyalar", "Filter": "Filtrele", @@ -2041,6 +2048,7 @@ "GitStudio: couldn't prepare the push — {0}": "GitStudio: gönderme hazırlanamadı — {0}", "GitStudio: couldn't prune — {0}": "GitStudio: budama yapılamadı — {0}", "GitStudio: couldn't reset {0} to {1}{2}": "GitStudio: {0}, {1}{2} olarak sıfırlanamadı", + "GitStudio: couldn't save the changelists — {0}": "GitStudio: değişiklik listeleri kaydedilemedi — {0}", "GitStudio: couldn't stage that change — {0}": "GitStudio: bu değişiklik hazırlanamadı — {0}", "GitStudio: couldn't stage the changes — {0}": "GitStudio: değişiklikler hazırlanamadı — {0}", "GitStudio: couldn't stash your changes, so nothing ran — {0}": "GitStudio: değişiklikleriniz zulalanamadı, bu nedenle hiçbir şey çalıştırılmadı — {0}", @@ -2059,6 +2067,8 @@ "GitStudio: no worktree this can be done to.": "GitStudio: bunun yapılabileceği bir çalışma alanı yok.", "GitStudio: nothing staged, or AI is unavailable.": "GitStudio: hiçbir şey hazırlanmadı veya yapay zeka kullanılamıyor.", "GitStudio: nothing stashed — every file was unticked.": "GitStudio: hiçbir şey zulalanmadı — her dosyanın işareti kaldırıldı.", + "GitStudio: nothing to commit. The only changed file is in a changelist — stage it first to commit it.": "GitStudio: işlenecek bir şey yok. Değişen tek dosya bir değişiklik listesinde — işlemek için önce hazırlayın.", + "GitStudio: nothing to commit. The only changed files are in changelists — stage the ones to commit first.": "GitStudio: işlenecek bir şey yok. Değişen dosyaların hepsi değişiklik listelerinde — önce işlemek istediklerinizi hazırlayın.", "GitStudio: nothing to draft (stage changes first), or AI is unavailable.": "GitStudio: taslak oluşturulacak bir şey yok (önce değişiklikleri hazırlayın) veya yapay zeka kullanılamıyor.", "GitStudio: nothing to stash — the working tree is clean.": "GitStudio: zulalanacak bir şey yok — çalışma ağacı temiz.", "GitStudio: open a file in a Git repository to stage lines.": "GitStudio: satırları hazırlamak için bir Git deposunda bir dosya açın.", @@ -2548,12 +2558,16 @@ "Move this branch to {0} ({1} reset).\n\nThe commits are undone; their changes stay staged.": "Bu dalı {0}'a taşı ({1} sıfırlama).\n\nİşlemeler geri alınır; değişiklikleri hazırlanmış olarak kalır.", "Move through the output": "Çıkışta hareket et", "Move to": "Şuraya taşı", + "Move to Changelist…": "Değişiklik Listesine Taşı…", "Move to Changes": "Değişiklikler'e Taşı", "Move to Trash": "Çöp Kutusu'na Taşı", "Move to Trash…": "Çöp Kutusu'na Taşı…", "Move up": "Yukarı taşı", "Move up (Alt+Up)": "Yukarı taşı (Alt+Yukarı)", + "Move {0} Files to Changelist": "{0} Dosyayı Değişiklik Listesine Taşı", "Move {0} out of “{1}”": "{0}'ı “{1}”'in dışına taşı", + "Move {0} to Changelist": "{0} öğesini Değişiklik Listesine Taşı", + "Move {0} to Changelist…": "{0} öğesini Değişiklik Listesine Taşı…", "Move {0} to Changes": "{0}'ı Değişiklikler'e Taşı", "Move {0} to the Trash?": "{0}, Çöp Kutusu'na taşınsın mı?", "Move {0} with the rewrite": "{0}'ı yeniden yazmayla birlikte taşı", @@ -2587,6 +2601,10 @@ "New Branch from '": "'den Yeni Dal '", "New Branch from These Commits": "Bu İşlemelerden Yeni Dal", "New Branch…": "Yeni Dal…", + "New Changelist": "Yeni Değişiklik Listesi", + "New Changelist for {0}": "{0} için Yeni Değişiklik Listesi", + "New Changelist for {0} Files": "{0} Dosya için Yeni Değişiklik Listesi", + "New Changelist…": "Yeni Değişiklik Listesi…", "New PR": "Yeni çekme isteği", "New Worktree from '": "'den Yeni Çalışma Alanı '", "New Worktree…": "Yeni Çalışma Alanı…", @@ -3492,6 +3510,8 @@ "Removes it from this list only": "Bunu yalnızca bu listeden kaldırır", "Removing…": "Kaldırılıyor…", "Rename": "Yeniden Adlandır", + "Rename Changelist “{0}”": "“{0}” Değişiklik Listesini Yeniden Adlandır", + "Rename Changelist…": "Değişiklik Listesini Yeniden Adlandır…", "Rename branch": "Dalı yeniden adlandır", "Rename branch {0}": "{0} dalını yeniden adlandır", "Rename it, then check it out.": "Yeniden adlandırıp sonra geçişe alın.", @@ -3990,6 +4010,7 @@ "Stage (or unstage) the lines selected in the diff": "Farkta seçili satırları hazırla (veya hazırlıktan çıkar)", "Stage All": "Tümünü Hazırla", "Stage All Changes": "Tüm Değişiklikleri Hazırla", + "Stage All in This Changelist": "Bu Listedeki Tümünü Hazırla", "Stage Changes with Ticks": "İşaretli Değişiklikleri Hazırla", "Stage Folder": "Klasörü Hazırla", "Stage all": "Tümünü hazırla", @@ -4054,6 +4075,7 @@ "Stash 1 selected file…": "Seçili 1 dosyayı zulala…", "Stash All Changes": "Tüm Değişiklikleri Zulala", "Stash Everything Staged": "Hazırlanmış Her Şeyi Zulala", + "Stash These Files": "Bu Dosyaları Zulala", "Stash This File": "Bu Dosyayı Zulala", "Stash This Folder": "Bu Klasörü Zulala", "Stash all changes": "Tüm değişiklikleri zulala", @@ -4208,6 +4230,7 @@ "That isn't a usable folder name.": "Bu kullanılabilir bir klasör adı değil.", "That isn't a way to reconcile a pull.": "Bu bir çekmeyi uzlaştırma yolu değil.", "That isn't a {0} this app made.": "Bu, bu uygulamanın yaptığı bir {0} değil.", + "That name is too long. Keep it under 80 characters.": "Bu ad çok uzun. 80 karakterin altında tutun.", "That path escapes the repository — nothing was changed.": "O yol deponun dışına çıkıyor — hiçbir şey değişmedi.", "That path is outside the repository.": "O yol deponun dışında.", "That puts back only what it changed, and only where nothing has moved since.": "Bu yalnızca onun değiştirdiğini geri koyar ve yalnızca o zamandan sonra hiçbir şey taşınmadıysa.", @@ -4290,6 +4313,7 @@ "The controls on this bar act on {0}": "Bu çubuktaki denetimler {0} üzerinde etki eder", "The current commit": "Geçerli işleme", "The dark window and the Dock icon, together. Graphite matches the icon macOS shows while GitStudio is closed. With Neon the Dock icon turns neon while GitStudio runs; macOS still shows the Graphite icon while it is closed.": "Karanlık pencere ve Dock simgesi, birlikte. Graphite, GitStudio kapalıyken macOS'un gösterdiği simgeyle eşleşir. Neon ile, GitStudio çalışırken Dock simgesi neon olur; macOS kapalıyken hâlâ Graphite simgesini gösterir.", + "The default changelist": "Varsayılan değişiklik listesi", "The download failed.": "İndirme başarısız oldu.", "The dropped commit is back": "Düşürülen işleme geri geldi", "The file goes back to its committed version. {0}": "Dosya işlenmiş sürümüne geri döner. {0}", @@ -4401,6 +4425,7 @@ "Theme: System": "Tema: Sistem", "There are no files to go to yet.": "Henüz gidilecek dosya yok.", "There are unresolved conflicts — resolve them or cancel first.": "Çözülmemiş çakışmalar var — önce çözün veya iptal edin.", + "There is already a group called “{0}”. Choose another name.": "“{0}” adında bir grup zaten var. Başka bir ad seçin.", "There is no '{0}' to reset to — it is not on {1} any more.": "Sıfırlanacak bir '{0}' yok — artık {1}'de değil.", "There is no '{0}' to reset to, and {1} couldn't be reached to fetch it.": "Sıfırlanacak bir '{0}' yok ve onu getirmek için {1}'e erişilemedi.", "There is no Apply to undo here any more.": "Burada geri alınacak bir Uygula artık yok.", @@ -5704,6 +5729,7 @@ "{0} files have changed since their changes were discarded ({1}), and bringing them back would overwrite that. Nothing was changed.": "{0} dosya, atılan değişikliklerinden ({1}) sonra değişti ve onları geri getirmek bunun üzerine yazardı. Hiçbir şey değiştirilmedi.", "{0} files have conflicts to resolve.": "{0} dosyada çözülecek çakışma var.", "{0} files have conflicts — open Changes to resolve": "{0} dosyada çakışma var — çözmek için Değişiklikler'i açın", + "{0} files in changelists are left out.": "Değişiklik listelerindeki {0} dosya dışarıda bırakıldı.", "{0} files selected": "{0} dosya seçildi", "{0} files still conflicted": "{0} dosyada hâlâ çakışma var", "{0} files still contain": "{0} dosya hâlâ içeriyor", @@ -5988,6 +6014,7 @@ "{0} · {1} · {2} files changed": "{0} · {1} · {2} dosya değişti", "{0} — Ctrl/Cmd-click to select every file in this section": "{0} — bu bölümdeki her dosyayı seçmek için Ctrl/Cmd ile tıklayın", "{0} — Ctrl/Cmd-click to select every file, right-click to select just the checked or unchecked ones": "{0} — her dosyayı seçmek için Ctrl/Cmd ile tıklayın, yalnızca işaretli veya işaretsiz olanları seçmek için sağ tıklayın", + "{0} — a changelist: its files stay out of Stage All and Commit all until you stage them. Click to collapse, Ctrl/Cmd-click to select its files, right-click for its actions.": "{0} — bir değişiklik listesi: dosyaları, siz hazırlayana kadar Tümünü Hazırla ve tümünü işle dışında kalır. Daraltmak için tıklayın, dosyalarını seçmek için Ctrl/Cmd-tıklayın, eylemleri için sağ tıklayın.", "{0} — click to collapse, ": "{0} — daraltmak için tıklayın, ", "{0} — continue or abort it first.": "{0} — önce sürdürün veya iptal edin.", "{0} — done.": "{0} — tamamlandı.", @@ -6018,6 +6045,7 @@ "{0}, and more": "{0}, ve daha fazlası", "{0}, and {1} more": "{0}, ve {1} tane daha", "{0}, but {1} isn't: {2}": "{0}, ancak {1} değil: {2}", + "{0}, changelist, {1}": "{0}, değişiklik listesi, {1}", "{0}, plus the commits of {1} already rebased onto it": "{0}, artı {1}'in zaten onun üzerine yeniden temellendirilmiş işlemeleri", "{0}, so it was checked out as {1} at its last commit — a push from there can't reach the pull request. {2}": "{0}, bu nedenle son işlemesinde {1} olarak geçişe alındı — oradan bir gönderme çekme isteğine ulaşamaz. {2}", "{0}, then create a branch to push them.": "{0}, sonra onları göndermek için bir dal oluşturun.", diff --git a/l10n/zh-cn.json b/l10n/zh-cn.json index b825aad1..3841efce 100644 --- a/l10n/zh-cn.json +++ b/l10n/zh-cn.json @@ -100,6 +100,7 @@ "$(check) Committed": "$(check) 已提交", "$(check) Copied {0}": "$(check) 已复制 {0}", "$(check) Created & switched to {0}": "$(check) 已创建并切换到 {0}", + "$(check) Deleted changelist “{0}” — its files are back in Changes": "$(check) 已删除更改列表“{0}” — 其中的文件已回到“更改”", "$(check) GitStudio: AI features disabled": "$(check) GitStudio:AI 功能已禁用", "$(check) Nothing to push from {0} — up to date": "$(check) {0} 没有需要推送的内容 — 已是最新", "$(check) Nothing to push — up to date": "$(check) 没有需要推送的内容 — 已是最新", @@ -243,6 +244,7 @@ "1 file": "1 个文件", "1 file changed": "1 个文件已更改", "1 file has conflicts to resolve.": "1 个文件有冲突需要解决。", + "1 file in a changelist is left out.": "更改列表中的 1 个文件未包含在内。", "1 file selected": "已选择 1 个文件", "1 file still conflicted": "1 个文件仍有冲突", "1 file still contains": "1 个文件仍包含", @@ -687,6 +689,7 @@ "Changed Files": "已更改的文件", "Changed files": "已更改的文件", "Changed on one side, deleted on the other": "一侧修改,另一侧删除", + "Changelist name": "更改列表名称", "Changes": "更改", "Changes ({0})": "更改({0})", "Changes committed.": "更改已提交。", @@ -1423,6 +1426,7 @@ "Delete '{0}'? Commits that are only on this branch stop being reachable by name. You can undo this straight afterwards.": "要删除“{0}”吗?仅存在于此分支上的提交将无法再通过名称访问。你可以在此之后立即撤销此操作。", "Delete 1": "删除 1 个", "Delete 1 finished branch?": "要删除 1 个已完成的分支吗?", + "Delete Changelist": "删除更改列表", "Delete Remote Branch": "删除远程分支", "Delete Tag": "删除标签", "Delete asset": "删除资产", @@ -1624,6 +1628,7 @@ "Drop to apply": "拖放以应用", "Drop to copy {0}": "拖到此处以复制 {0}", "Drop to move {0}": "拖到此处以移动 {0}", + "Drop to move {0} to “{1}”": "拖到此处将 {0} 移到“{1}”", "Drop to pop": "拖放以弹出", "Drop to stash": "拖放以贮藏", "Drop to stash 1 file": "拖放以贮藏 1 个文件", @@ -1686,6 +1691,7 @@ "Enter a key first.": "请先输入密钥。", "Enter a line number, or a range like 12-18.": "请输入行号,或类似 12-18 的范围。", "Enter a name and an email to save.": "请输入姓名和电子邮件以保存。", + "Enter a name for the changelist.": "请输入更改列表的名称。", "Enter this code at ": "在以下位置输入此代码: ", "Enter to send · Shift+Enter for a new line": "按 Enter 发送 · 按 Shift+Enter 换行", "Error on line {0}": "第 {0} 行出错", @@ -1767,6 +1773,7 @@ "Filename including extension…": "文件名(包含扩展名)…", "Files": "文件", "Files changed": "已更改的文件", + "Files in a changelist are left out of Stage All and Commit all until you stage them yourself.": "更改列表中的文件不参与“全部暂存”和“全部提交”,除非你自己暂存它们。", "Files in this gist": "此 gist 中的文件", "Files resolved": "已解决的文件", "Filter": "筛选", @@ -2041,6 +2048,7 @@ "GitStudio: couldn't prepare the push — {0}": "GitStudio: 无法准备推送 — {0}", "GitStudio: couldn't prune — {0}": "GitStudio: 无法清理 — {0}", "GitStudio: couldn't reset {0} to {1}{2}": "GitStudio: 无法将 {0} 重置为 {1}{2}", + "GitStudio: couldn't save the changelists — {0}": "GitStudio: 无法保存更改列表 — {0}", "GitStudio: couldn't stage that change — {0}": "GitStudio: 无法暂存该更改 — {0}", "GitStudio: couldn't stage the changes — {0}": "GitStudio: 无法暂存这些更改 — {0}", "GitStudio: couldn't stash your changes, so nothing ran — {0}": "GitStudio: 无法贮藏你的更改,因此未执行任何操作 — {0}", @@ -2059,6 +2067,8 @@ "GitStudio: no worktree this can be done to.": "GitStudio: 没有可执行此操作的工作树。", "GitStudio: nothing staged, or AI is unavailable.": "GitStudio: 没有已暂存的内容,或 AI 不可用。", "GitStudio: nothing stashed — every file was unticked.": "GitStudio: 没有贮藏任何内容 — 所有文件都未勾选。", + "GitStudio: nothing to commit. The only changed file is in a changelist — stage it first to commit it.": "GitStudio: 没有可提交的内容。唯一已更改的文件在更改列表中 — 请先暂存它再提交。", + "GitStudio: nothing to commit. The only changed files are in changelists — stage the ones to commit first.": "GitStudio: 没有可提交的内容。已更改的文件都在更改列表中 — 请先暂存要提交的文件。", "GitStudio: nothing to draft (stage changes first), or AI is unavailable.": "GitStudio: 没有可起草的内容(请先暂存更改),或 AI 不可用。", "GitStudio: nothing to stash — the working tree is clean.": "GitStudio: 没有可贮藏的内容 — 工作树是干净的。", "GitStudio: open a file in a Git repository to stage lines.": "GitStudio: 请打开 Git 仓库中的文件以暂存行。", @@ -2548,12 +2558,16 @@ "Move this branch to {0} ({1} reset).\n\nThe commits are undone; their changes stay staged.": "将此分支移动到 {0}({1} 重置)。\n\n这些提交将被撤销;它们的更改会保留在暂存区中。", "Move through the output": "在输出中移动", "Move to": "移动到", + "Move to Changelist…": "移到更改列表…", "Move to Changes": "移到更改", "Move to Trash": "移到回收站", "Move to Trash…": "移到回收站…", "Move up": "上移", "Move up (Alt+Up)": "上移(Alt+Up)", + "Move {0} Files to Changelist": "将 {0} 个文件移到更改列表", "Move {0} out of “{1}”": "将 {0} 移出“{1}”", + "Move {0} to Changelist": "将 {0} 移到更改列表", + "Move {0} to Changelist…": "将 {0} 移到更改列表…", "Move {0} to Changes": "将 {0} 移动到“更改”", "Move {0} to the Trash?": "要将 {0} 移到回收站吗?", "Move {0} with the rewrite": "随重写一起移动 {0}", @@ -2587,6 +2601,10 @@ "New Branch from '": "新建分支,起点为 '", "New Branch from These Commits": "从这些提交新建分支", "New Branch…": "新建分支…", + "New Changelist": "新建更改列表", + "New Changelist for {0}": "为 {0} 新建更改列表", + "New Changelist for {0} Files": "为 {0} 个文件新建更改列表", + "New Changelist…": "新建更改列表…", "New PR": "新建 PR", "New Worktree from '": "新建工作树,起点为 '", "New Worktree…": "新建工作树…", @@ -3492,6 +3510,8 @@ "Removes it from this list only": "仅将其从此列表中移除", "Removing…": "正在移除…", "Rename": "重命名", + "Rename Changelist “{0}”": "重命名更改列表“{0}”", + "Rename Changelist…": "重命名更改列表…", "Rename branch": "重命名分支", "Rename branch {0}": "重命名分支 {0}", "Rename it, then check it out.": "请重命名,然后检出。", @@ -3990,6 +4010,7 @@ "Stage (or unstage) the lines selected in the diff": "暂存(或取消暂存)差异中所选的行", "Stage All": "全部暂存", "Stage All Changes": "暂存所有更改", + "Stage All in This Changelist": "全部暂存此更改列表", "Stage Changes with Ticks": "用勾选标记暂存更改", "Stage Folder": "暂存文件夹", "Stage all": "全部暂存", @@ -4054,6 +4075,7 @@ "Stash 1 selected file…": "贮藏 1 个所选文件…", "Stash All Changes": "贮藏所有更改", "Stash Everything Staged": "贮藏所有已暂存内容", + "Stash These Files": "贮藏这些文件", "Stash This File": "贮藏此文件", "Stash This Folder": "贮藏此文件夹", "Stash all changes": "贮藏所有更改", @@ -4208,6 +4230,7 @@ "That isn't a usable folder name.": "这不是一个可用的文件夹名称。", "That isn't a way to reconcile a pull.": "这不是一种调和拉取的方式。", "That isn't a {0} this app made.": "这不是本应用执行的{0}。", + "That name is too long. Keep it under 80 characters.": "名称太长。请少于 80 个字符。", "That path escapes the repository — nothing was changed.": "该路径超出了仓库范围 — 未做任何更改。", "That path is outside the repository.": "该路径位于仓库之外。", "That puts back only what it changed, and only where nothing has moved since.": "这样只会恢复它改动过的部分,而且仅限于之后没有变动的位置。", @@ -4290,6 +4313,7 @@ "The controls on this bar act on {0}": "此栏上的控件作用于 {0}", "The current commit": "当前提交", "The dark window and the Dock icon, together. Graphite matches the icon macOS shows while GitStudio is closed. With Neon the Dock icon turns neon while GitStudio runs; macOS still shows the Graphite icon while it is closed.": "深色窗口和程序坞图标一起变化。Graphite 与 GitStudio 关闭时 macOS 显示的图标一致。使用 Neon 时,GitStudio 运行期间程序坞图标会变为霓虹色;关闭时 macOS 仍显示 Graphite 图标。", + "The default changelist": "默认更改列表", "The download failed.": "下载失败。", "The dropped commit is back": "被丢弃的提交已恢复", "The file goes back to its committed version. {0}": "该文件会恢复为其已提交的版本。{0}", @@ -4401,6 +4425,7 @@ "Theme: System": "主题:系统", "There are no files to go to yet.": "目前还没有可以转到的文件。", "There are unresolved conflicts — resolve them or cancel first.": "还有未解决的冲突 — 请先解决它们或取消。", + "There is already a group called “{0}”. Choose another name.": "已有名为“{0}”的分组。请换一个名称。", "There is no '{0}' to reset to — it is not on {1} any more.": "没有可重置到的 '{0}' — 它已不在 {1} 上。", "There is no '{0}' to reset to, and {1} couldn't be reached to fetch it.": "没有可重置到的 '{0}',且无法访问 {1} 来获取它。", "There is no Apply to undo here any more.": "这里已经没有可撤销的应用了。", @@ -5704,6 +5729,7 @@ "{0} files have changed since their changes were discarded ({1}), and bringing them back would overwrite that. Nothing was changed.": "自更改被丢弃以来,{0} 个文件已发生更改({1}),恢复它们会覆盖这些更改。未做任何更改。", "{0} files have conflicts to resolve.": "{0} 个文件有冲突需要解决。", "{0} files have conflicts — open Changes to resolve": "{0} 个文件有冲突 — 打开“更改”以解决", + "{0} files in changelists are left out.": "更改列表中的 {0} 个文件未包含在内。", "{0} files selected": "已选择 {0} 个文件", "{0} files still conflicted": "{0} 个文件仍有冲突", "{0} files still contain": "{0} 个文件仍包含", @@ -5988,6 +6014,7 @@ "{0} · {1} · {2} files changed": "{0} · {1} · {2} 个文件已更改", "{0} — Ctrl/Cmd-click to select every file in this section": "{0} — Ctrl/Cmd 点击以选中此部分的所有文件", "{0} — Ctrl/Cmd-click to select every file, right-click to select just the checked or unchecked ones": "{0} — Ctrl/Cmd 点击以选中所有文件,右键点击仅选中已勾选或未勾选的文件", + "{0} — a changelist: its files stay out of Stage All and Commit all until you stage them. Click to collapse, Ctrl/Cmd-click to select its files, right-click for its actions.": "{0} — 更改列表:在你暂存之前,其中的文件不参与“全部暂存”和“全部提交”。点击折叠,Ctrl/Cmd-点击选择其中的文件,右键查看操作。", "{0} — click to collapse, ": "{0} — 点击折叠,", "{0} — continue or abort it first.": "{0} — 请先继续或中止它。", "{0} — done.": "{0} — 已完成。", @@ -6018,6 +6045,7 @@ "{0}, and more": "{0},以及更多", "{0}, and {1} more": "{0},以及另外 {1} 个", "{0}, but {1} isn't: {2}": "{0},但 {1} 不是:{2}", + "{0}, changelist, {1}": "{0},更改列表,{1}", "{0}, plus the commits of {1} already rebased onto it": "{0},再加上已变基到其上的 {1} 的提交", "{0}, so it was checked out as {1} at its last commit — a push from there can't reach the pull request. {2}": "{0},因此以 {1} 在其最后一个提交处检出 — 从那里推送无法到达该拉取请求。{2}", "{0}, then create a branch to push them.": "{0},然后创建一个分支来推送它们。", diff --git a/l10n/zh-tw.json b/l10n/zh-tw.json index d013e50c..6789a886 100644 --- a/l10n/zh-tw.json +++ b/l10n/zh-tw.json @@ -100,6 +100,7 @@ "$(check) Committed": "$(check) 已提交", "$(check) Copied {0}": "$(check) 已複製 {0}", "$(check) Created & switched to {0}": "$(check) 已建立並切換到 {0}", + "$(check) Deleted changelist “{0}” — its files are back in Changes": "$(check) 已刪除更改清單「{0}」 — 其中的檔案已回到「更改」", "$(check) GitStudio: AI features disabled": "$(check) GitStudio:AI 功能已停用", "$(check) Nothing to push from {0} — up to date": "$(check) {0} 沒有需要推送的內容 — 已是最新", "$(check) Nothing to push — up to date": "$(check) 沒有需要推送的內容 — 已是最新", @@ -243,6 +244,7 @@ "1 file": "1 個檔案", "1 file changed": "1 個檔案已更改", "1 file has conflicts to resolve.": "1 個檔案有衝突需要解決。", + "1 file in a changelist is left out.": "更改清單中的 1 個檔案未包含在內。", "1 file selected": "已選擇 1 個檔案", "1 file still conflicted": "1 個檔案仍有衝突", "1 file still contains": "1 個檔案仍包含", @@ -687,6 +689,7 @@ "Changed Files": "已更改的檔案", "Changed files": "已更改的檔案", "Changed on one side, deleted on the other": "一側修改,另一側刪除", + "Changelist name": "更改清單名稱", "Changes": "更改", "Changes ({0})": "更改({0})", "Changes committed.": "更改已提交。", @@ -1423,6 +1426,7 @@ "Delete '{0}'? Commits that are only on this branch stop being reachable by name. You can undo this straight afterwards.": "要刪除“{0}”嗎?僅存在於此分支上的提交將無法再透過名稱存取。你可以在此之後立即撤銷此操作。", "Delete 1": "刪除 1 個", "Delete 1 finished branch?": "要刪除 1 個已完成的分支嗎?", + "Delete Changelist": "刪除更改清單", "Delete Remote Branch": "刪除遠端分支", "Delete Tag": "刪除標籤", "Delete asset": "刪除資產", @@ -1624,6 +1628,7 @@ "Drop to apply": "拖放以應用", "Drop to copy {0}": "拖到此處以複製 {0}", "Drop to move {0}": "拖到此處以移動 {0}", + "Drop to move {0} to “{1}”": "拖到此處將 {0} 移到「{1}」", "Drop to pop": "拖放以彈出", "Drop to stash": "拖放以儲藏", "Drop to stash 1 file": "拖放以儲藏 1 個檔案", @@ -1686,6 +1691,7 @@ "Enter a key first.": "請先輸入金鑰。", "Enter a line number, or a range like 12-18.": "請輸入行號,或類似 12-18 的範圍。", "Enter a name and an email to save.": "請輸入姓名和電子郵件以儲存。", + "Enter a name for the changelist.": "請輸入更改清單的名稱。", "Enter this code at ": "在以下位置輸入此程式碼: ", "Enter to send · Shift+Enter for a new line": "按 Enter 傳送 · 按 Shift+Enter 換行", "Error on line {0}": "第 {0} 行出錯", @@ -1767,6 +1773,7 @@ "Filename including extension…": "檔名(包含副檔名)…", "Files": "檔案", "Files changed": "已更改的檔案", + "Files in a changelist are left out of Stage All and Commit all until you stage them yourself.": "更改清單中的檔案不參與「全部暫存」和「全部提交」,除非你自己暫存它們。", "Files in this gist": "此 gist 中的檔案", "Files resolved": "已解決的檔案", "Filter": "篩選", @@ -2041,6 +2048,7 @@ "GitStudio: couldn't prepare the push — {0}": "GitStudio: 無法準備推送 — {0}", "GitStudio: couldn't prune — {0}": "GitStudio: 無法清理 — {0}", "GitStudio: couldn't reset {0} to {1}{2}": "GitStudio: 無法將 {0} 重置為 {1}{2}", + "GitStudio: couldn't save the changelists — {0}": "GitStudio: 無法儲存更改清單 — {0}", "GitStudio: couldn't stage that change — {0}": "GitStudio: 無法暫存該更改 — {0}", "GitStudio: couldn't stage the changes — {0}": "GitStudio: 無法暫存這些更改 — {0}", "GitStudio: couldn't stash your changes, so nothing ran — {0}": "GitStudio: 無法儲藏你的更改,因此未執行任何操作 — {0}", @@ -2059,6 +2067,8 @@ "GitStudio: no worktree this can be done to.": "GitStudio: 沒有可執行此操作的工作樹。", "GitStudio: nothing staged, or AI is unavailable.": "GitStudio: 沒有已暫存的內容,或 AI 不可用。", "GitStudio: nothing stashed — every file was unticked.": "GitStudio: 沒有儲藏任何內容 — 所有檔案都未勾選。", + "GitStudio: nothing to commit. The only changed file is in a changelist — stage it first to commit it.": "GitStudio: 沒有可提交的內容。唯一已更改的檔案在更改清單中 — 請先暫存它再提交。", + "GitStudio: nothing to commit. The only changed files are in changelists — stage the ones to commit first.": "GitStudio: 沒有可提交的內容。已更改的檔案都在更改清單中 — 請先暫存要提交的檔案。", "GitStudio: nothing to draft (stage changes first), or AI is unavailable.": "GitStudio: 沒有可起草的內容(請先暫存更改),或 AI 不可用。", "GitStudio: nothing to stash — the working tree is clean.": "GitStudio: 沒有可儲藏的內容 — 工作樹是乾淨的。", "GitStudio: open a file in a Git repository to stage lines.": "GitStudio: 請開啟 Git 儲存庫中的檔案以暫存行。", @@ -2548,12 +2558,16 @@ "Move this branch to {0} ({1} reset).\n\nThe commits are undone; their changes stay staged.": "將此分支移動到 {0}({1} 重置)。\n\n這些提交將被撤銷;它們的更改會保留在暫存區中。", "Move through the output": "在輸出中移動", "Move to": "移動到", + "Move to Changelist…": "移到更改清單…", "Move to Changes": "移到更改", "Move to Trash": "移到回收站", "Move to Trash…": "移到回收站…", "Move up": "上移", "Move up (Alt+Up)": "上移(Alt+Up)", + "Move {0} Files to Changelist": "將 {0} 個檔案移到更改清單", "Move {0} out of “{1}”": "將 {0} 移出“{1}”", + "Move {0} to Changelist": "將 {0} 移到更改清單", + "Move {0} to Changelist…": "將 {0} 移到更改清單…", "Move {0} to Changes": "將 {0} 移動到“更改”", "Move {0} to the Trash?": "要將 {0} 移到回收站嗎?", "Move {0} with the rewrite": "隨重寫一起移動 {0}", @@ -2587,6 +2601,10 @@ "New Branch from '": "新建分支,起點為 '", "New Branch from These Commits": "從這些提交新建分支", "New Branch…": "新建分支…", + "New Changelist": "新增更改清單", + "New Changelist for {0}": "為 {0} 新增更改清單", + "New Changelist for {0} Files": "為 {0} 個檔案新增更改清單", + "New Changelist…": "新增更改清單…", "New PR": "新建 PR", "New Worktree from '": "新建工作樹,起點為 '", "New Worktree…": "新建工作樹…", @@ -3492,6 +3510,8 @@ "Removes it from this list only": "僅將其從此列表中移除", "Removing…": "正在移除…", "Rename": "重新命名", + "Rename Changelist “{0}”": "重新命名更改清單「{0}」", + "Rename Changelist…": "重新命名更改清單…", "Rename branch": "重新命名分支", "Rename branch {0}": "重新命名分支 {0}", "Rename it, then check it out.": "請重新命名,然後簽出。", @@ -3990,6 +4010,7 @@ "Stage (or unstage) the lines selected in the diff": "暫存(或取消暫存)差異中所選的行", "Stage All": "全部暫存", "Stage All Changes": "暫存所有更改", + "Stage All in This Changelist": "全部暫存此更改清單", "Stage Changes with Ticks": "用勾選標記暫存更改", "Stage Folder": "暫存資料夾", "Stage all": "全部暫存", @@ -4054,6 +4075,7 @@ "Stash 1 selected file…": "儲藏 1 個所選檔案…", "Stash All Changes": "儲藏所有更改", "Stash Everything Staged": "儲藏所有已暫存內容", + "Stash These Files": "儲藏這些檔案", "Stash This File": "儲藏此檔案", "Stash This Folder": "儲藏此資料夾", "Stash all changes": "儲藏所有更改", @@ -4208,6 +4230,7 @@ "That isn't a usable folder name.": "這不是一個可用的資料夾名稱。", "That isn't a way to reconcile a pull.": "這不是一種調和拉取的方式。", "That isn't a {0} this app made.": "這不是本應用執行的{0}。", + "That name is too long. Keep it under 80 characters.": "名稱太長。請少於 80 個字元。", "That path escapes the repository — nothing was changed.": "該路徑超出了儲存庫範圍 — 未做任何更改。", "That path is outside the repository.": "該路徑位於儲存庫之外。", "That puts back only what it changed, and only where nothing has moved since.": "這樣只會恢復它改動過的部分,而且僅限於之後沒有變動的位置。", @@ -4290,6 +4313,7 @@ "The controls on this bar act on {0}": "此欄上的控制元件作用於 {0}", "The current commit": "當前提交", "The dark window and the Dock icon, together. Graphite matches the icon macOS shows while GitStudio is closed. With Neon the Dock icon turns neon while GitStudio runs; macOS still shows the Graphite icon while it is closed.": "深色視窗和程式塢圖示一起變化。Graphite 與 GitStudio 關閉時 macOS 顯示的圖示一致。使用 Neon 時,GitStudio 執行期間程式塢圖示會變為霓虹色;關閉時 macOS 仍顯示 Graphite 圖示。", + "The default changelist": "預設更改清單", "The download failed.": "下載失敗。", "The dropped commit is back": "被丟棄的提交已恢復", "The file goes back to its committed version. {0}": "該檔案會恢復為其已提交的版本。{0}", @@ -4401,6 +4425,7 @@ "Theme: System": "主題:系統", "There are no files to go to yet.": "目前還沒有可以轉到的檔案。", "There are unresolved conflicts — resolve them or cancel first.": "還有未解決的衝突 — 請先解決它們或取消。", + "There is already a group called “{0}”. Choose another name.": "已有名為「{0}」的群組。請換一個名稱。", "There is no '{0}' to reset to — it is not on {1} any more.": "沒有可重置到的 '{0}' — 它已不在 {1} 上。", "There is no '{0}' to reset to, and {1} couldn't be reached to fetch it.": "沒有可重置到的 '{0}',且無法存取 {1} 來獲取它。", "There is no Apply to undo here any more.": "這裡已經沒有可撤銷的應用了。", @@ -5704,6 +5729,7 @@ "{0} files have changed since their changes were discarded ({1}), and bringing them back would overwrite that. Nothing was changed.": "自更改被丟棄以來,{0} 個檔案已發生更改({1}),恢復它們會覆蓋這些更改。未做任何更改。", "{0} files have conflicts to resolve.": "{0} 個檔案有衝突需要解決。", "{0} files have conflicts — open Changes to resolve": "{0} 個檔案有衝突 — 開啟“更改”以解決", + "{0} files in changelists are left out.": "更改清單中的 {0} 個檔案未包含在內。", "{0} files selected": "已選擇 {0} 個檔案", "{0} files still conflicted": "{0} 個檔案仍有衝突", "{0} files still contain": "{0} 個檔案仍包含", @@ -5988,6 +6014,7 @@ "{0} · {1} · {2} files changed": "{0} · {1} · {2} 個檔案已更改", "{0} — Ctrl/Cmd-click to select every file in this section": "{0} — Ctrl/Cmd 點選以選中此部分的所有檔案", "{0} — Ctrl/Cmd-click to select every file, right-click to select just the checked or unchecked ones": "{0} — Ctrl/Cmd 點選以選中所有檔案,右鍵點選僅選中已勾選或未勾選的檔案", + "{0} — a changelist: its files stay out of Stage All and Commit all until you stage them. Click to collapse, Ctrl/Cmd-click to select its files, right-click for its actions.": "{0} — 更改清單:在你暫存之前,其中的檔案不參與「全部暫存」和「全部提交」。點選摺疊,Ctrl/Cmd-點選選擇其中的檔案,按右鍵查看操作。", "{0} — click to collapse, ": "{0} — 點選摺疊,", "{0} — continue or abort it first.": "{0} — 請先繼續或中止它。", "{0} — done.": "{0} — 已完成。", @@ -6018,6 +6045,7 @@ "{0}, and more": "{0},以及更多", "{0}, and {1} more": "{0},以及另外 {1} 個", "{0}, but {1} isn't: {2}": "{0},但 {1} 不是:{2}", + "{0}, changelist, {1}": "{0},更改清單,{1}", "{0}, plus the commits of {1} already rebased onto it": "{0},再加上已變基到其上的 {1} 的提交", "{0}, so it was checked out as {1} at its last commit — a push from there can't reach the pull request. {2}": "{0},因此以 {1} 在其最後一個提交處簽出 — 從那裡推送無法到達該拉取請求。{2}", "{0}, then create a branch to push them.": "{0},然後建立一個分支來推送它們。", diff --git a/packages/git-service/src/Changelists.ts b/packages/git-service/src/Changelists.ts new file mode 100644 index 00000000..220f08a6 --- /dev/null +++ b/packages/git-service/src/Changelists.ts @@ -0,0 +1,264 @@ +import { mkdir, readFile, rename, rm, writeFile } from "node:fs/promises"; +import { dirname, join } from "node:path"; +import type { GitProcess } from "./GitProcess"; + +/** + * Changelists (issue #122): named groups a working-tree file can be parked + * in, IntelliJ-style, so the "everything" actions (Stage All, Commit all, + * Discard All) leave it alone — a local config file that is always modified + * and never meant to be committed. + * + * They are GitStudio's own bookkeeping: git never sees them, and nothing + * about the index or a commit changes unless the user stages a parked file by + * hand. The default changelist is implicit — every file not assigned to a + * named one — so a repository with no changelists behaves exactly as before. + * + * Kept in `/gitstudio-changelists.json` (`rev-parse + * --absolute-git-dir`): never in the tracked tree; per repository and per + * worktree (a linked worktree has its own git-dir and its own working tree); + * the same for every editor and app on the machine that opens the folder. + */ + +/** One named changelist. `id` is stable across renames ([A-Za-z0-9_-]). */ +export interface Changelist { + id: string; + name: string; +} + +/** Every named changelist, and which one each parked path is in. */ +export interface ChangelistState { + lists: Changelist[]; + /** Repo-relative path (forward slashes) → changelist id. */ + files: Record; +} + +/** The file's name inside the git-dir. */ +export const CHANGELISTS_FILE = "gitstudio-changelists.json"; + +const ID = /^[A-Za-z0-9_-]{1,40}$/; + +export function emptyChangelists(): ChangelistState { + return { lists: [], files: {} }; +} + +/** + * Read the file's text. Never throws: anything unreadable, foreign or from a + * newer version reads as no changelists, and a path pointing at a list that + * is not there is dropped — so a hand-edited or half-written file can never + * break the Changes view. + */ +export function parseChangelists(text: string | undefined): ChangelistState { + if (!text) return emptyChangelists(); + let raw: unknown; + try { + raw = JSON.parse(text); + } catch { + return emptyChangelists(); + } + if (!raw || typeof raw !== "object") return emptyChangelists(); + const r = raw as { version?: unknown; lists?: unknown; files?: unknown }; + if (r.version !== 1 || !Array.isArray(r.lists)) return emptyChangelists(); + const lists: Changelist[] = []; + const ids = new Set(); + const names = new Set(); + for (const l of r.lists) { + if (!l || typeof l !== "object") continue; + const { id, name } = l as { id?: unknown; name?: unknown }; + if (typeof id !== "string" || !ID.test(id) || ids.has(id)) continue; + if (typeof name !== "string") continue; + const clean = cleanName(name); + if (!clean || names.has(clean.toLowerCase())) continue; + ids.add(id); + names.add(clean.toLowerCase()); + lists.push({ id, name: clean }); + } + const files: Record = {}; + if (r.files && typeof r.files === "object") { + for (const [path, id] of Object.entries(r.files as Record)) { + if (typeof id === "string" && ids.has(id) && path) files[path] = id; + } + } + return { lists, files }; +} + +export function serializeChangelists(state: ChangelistState): string { + // Paths sorted, so the file diffs sensibly if anyone ever looks at it. + const files: Record = {}; + for (const path of Object.keys(state.files).sort()) files[path] = state.files[path]; + return JSON.stringify({ version: 1, lists: state.lists, files }, null, 2) + "\n"; +} + +/** A name as it is kept: trimmed, inner whitespace runs as one space. */ +export function cleanName(name: string): string { + return name.replace(/\s+/g, " ").trim(); +} + +/** + * What is wrong with `name` for a changelist, or undefined when it can be + * used. `exceptId` is the list being renamed (its own name is not "taken"). + * "Changes" is the default changelist's name, so it is taken too. + */ +export function changelistNameProblem( + state: ChangelistState, + name: string, + exceptId?: string, +): "empty" | "taken" | "tooLong" | undefined { + const clean = cleanName(name); + if (!clean) return "empty"; + if (clean.length > 80) return "tooLong"; + const lower = clean.toLowerCase(); + if (RESERVED.has(lower)) return "taken"; + if (state.lists.some((l) => l.id !== exceptId && l.name.toLowerCase() === lower)) return "taken"; + return undefined; +} + +/** + * The names the Changes view's own groups already have — the default + * changelist is "Changes" (Unstaged in the split model) — so a changelist + * can never be mistaken for one of them. + */ +const RESERVED = new Set(["changes", "staged", "unstaged", "merge conflicts", "stashes"]); + +function newId(state: ChangelistState): string { + for (;;) { + const id = "l" + Date.now().toString(36) + Math.floor(Math.random() * 36 ** 4).toString(36); + if (!state.lists.some((l) => l.id === id)) return id; + } +} + +/** A new, empty changelist. The name must already have passed changelistNameProblem. */ +export function addChangelist(state: ChangelistState, name: string): { state: ChangelistState; id: string } { + const id = newId(state); + return { state: { lists: [...state.lists, { id, name: cleanName(name) }], files: { ...state.files } }, id }; +} + +export function renameChangelist(state: ChangelistState, id: string, name: string): ChangelistState { + return { + lists: state.lists.map((l) => (l.id === id ? { id, name: cleanName(name) } : l)), + files: { ...state.files }, + }; +} + +/** Delete a changelist. Its files go back to the default one; no file is touched. */ +export function deleteChangelist( + state: ChangelistState, + id: string, +): { state: ChangelistState; freed: string[] } { + const files: Record = {}; + const freed: string[] = []; + for (const [path, list] of Object.entries(state.files)) { + if (list === id) freed.push(path); + else files[path] = list; + } + return { state: { lists: state.lists.filter((l) => l.id !== id), files }, freed }; +} + +/** + * Put `paths` in changelist `id`, or back in the default one (`undefined`). + * An id that is not a list is the default one: a move can never invent a list. + */ +export function moveToChangelist( + state: ChangelistState, + paths: readonly string[], + id: string | undefined, +): ChangelistState { + const target = id && state.lists.some((l) => l.id === id) ? id : undefined; + const files = { ...state.files }; + for (const path of paths) { + if (!path) continue; + if (target) files[path] = target; + else delete files[path]; + } + return { lists: state.lists, files }; +} + +/** Forget `paths` (they are clean now): they no longer belong to any changelist. */ +export function forgetPaths(state: ChangelistState, paths: Iterable): ChangelistState { + return moveToChangelist(state, [...paths], undefined); +} + +/** The changelist each of `paths` is parked in, for the ones that are. */ +export function parkedAmong(state: ChangelistState, paths: Iterable): Record { + const out: Record = {}; + for (const path of paths) { + const id = state.files[path]; + if (id) out[path] = id; + } + return out; +} + +/** Is `path` in a named changelist (not the default one)? */ +export function isParked(state: ChangelistState, path: string): boolean { + return !!state.files[path]; +} + +/** + * The changelists of one repository (one working tree), on disk. + * + * Every update is a read-modify-write of the whole file, run one at a time, + * so two quick moves never lose one another. A read never throws. + */ +export class ChangelistStore { + private gitDir: Promise | undefined; + private queue: Promise = Promise.resolve(); + + constructor(private readonly process: GitProcess) {} + + /** Where the file is, or undefined when git cannot say (not a repository). */ + async path(): Promise { + if (!this.gitDir) { + this.gitDir = this.process + .run(["rev-parse", "--absolute-git-dir"]) + .then((r) => (r.code === 0 && r.stdout.trim() ? r.stdout.trim() : undefined)) + .catch(() => undefined); + // A failed answer is not kept: the next read asks again. + void this.gitDir.then((dir) => { + if (!dir) this.gitDir = undefined; + }); + } + const dir = await this.gitDir; + return dir ? join(dir, CHANGELISTS_FILE) : undefined; + } + + async read(): Promise { + const file = await this.path(); + if (!file) return emptyChangelists(); + try { + return parseChangelists(await readFile(file, "utf8")); + } catch { + return emptyChangelists(); + } + } + + /** + * Change the changelists: `change` gets what is on disk now and returns + * what to keep. Resolves with what was kept. Rejects when the file cannot be + * written (the caller says so). + */ + update(change: (state: ChangelistState) => ChangelistState): Promise { + const run = this.queue.then(async () => { + const file = await this.path(); + if (!file) throw new Error("not a git repository"); + const before = await this.read(); + const after = change(before); + const text = serializeChangelists(after); + if (text !== serializeChangelists(before)) { + await mkdir(dirname(file), { recursive: true }); + // Written whole, then renamed over: a reader never sees half a file. + const tmp = `${file}.${process.pid}.tmp`; + await writeFile(tmp, text, "utf8"); + try { + await rename(tmp, file); + } catch { + // Windows refuses to rename over a file another process has open; + // then it is written in place. + await writeFile(file, text, "utf8"); + await rm(tmp, { force: true }); + } + } + return after; + }); + this.queue = run.catch(() => undefined); + return run; + } +} diff --git a/packages/git-service/src/GitContext.ts b/packages/git-service/src/GitContext.ts index 25856f4b..3becb962 100644 --- a/packages/git-service/src/GitContext.ts +++ b/packages/git-service/src/GitContext.ts @@ -16,6 +16,7 @@ import { SyncOps } from "./SyncOps"; import { TagOps } from "./TagOps"; import { OperationProvider } from "./OperationProvider"; import { ConflictOps } from "./ConflictOps"; +import { ChangelistStore } from "./Changelists"; export interface GitContextOptions { /** Absolute path to the repo root. */ @@ -55,6 +56,8 @@ export class GitContext { readonly operation: OperationProvider; /** Whole-file conflict actions + the dashboard snapshot, in role terms. */ readonly conflictOps: ConflictOps; + /** The Changes view's changelists (#122), kept in the git-dir. */ + readonly changelists: ChangelistStore; /** How this context was made — for `at`, which makes another like it. */ private readonly opts: GitContextOptions; @@ -100,6 +103,7 @@ export class GitContext { gitPath: opts.gitPath, onRun: opts.onRun, }); + this.changelists = new ChangelistStore(this.process); this.conflictOps = new ConflictOps( this.process, opts.root, diff --git a/packages/git-service/test/changelists.test.ts b/packages/git-service/test/changelists.test.ts new file mode 100644 index 00000000..556e825d --- /dev/null +++ b/packages/git-service/test/changelists.test.ts @@ -0,0 +1,147 @@ +// Changelists (#122): the model, and where it is kept. +// +// They are GitStudio's own bookkeeping in the git-dir — never in the tracked +// tree, per worktree — and a file anyone (or a crash) left half-written must +// read as "no changelists", never break the Changes view. + +import { test, after } from "node:test"; +import assert from "node:assert/strict"; +import { execFileSync } from "node:child_process"; +import { mkdtempSync, readFileSync, rmSync, writeFileSync, existsSync } from "node:fs"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { + addChangelist, + changelistNameProblem, + deleteChangelist, + emptyChangelists, + forgetPaths, + moveToChangelist, + parkedAmong, + parseChangelists, + renameChangelist, + serializeChangelists, + CHANGELISTS_FILE, +} from "../src/Changelists"; +import { GitContext } from "../src/GitContext"; + +const cleanups: (() => void)[] = []; +after(() => cleanups.forEach((f) => f())); + +function repo(): { dir: string; git: (...a: string[]) => string } { + const dir = mkdtempSync(join(tmpdir(), "gs-changelists-")); + cleanups.push(() => rmSync(dir, { recursive: true, force: true, maxRetries: 20, retryDelay: 250 })); + const git = (...a: string[]) => execFileSync("git", a, { cwd: dir, encoding: "utf8" }); + git("init", "-q", "-b", "main"); + git("config", "user.email", "t@example.com"); + git("config", "user.name", "t"); + git("config", "commit.gpgsign", "false"); + writeFileSync(join(dir, "a.txt"), "a\n"); + git("add", "."); + git("commit", "-qm", "base"); + return { dir, git }; +} + +test("make, move, rename and delete: a delete hands its files back to the default list", () => { + let s = emptyChangelists(); + const made = addChangelist(s, " no commit "); + s = made.state; + assert.deepEqual(s.lists, [{ id: made.id, name: "no commit" }], "the name is kept tidy"); + assert.match(made.id, /^[A-Za-z0-9_-]+$/, "ids are safe in a page key"); + s = moveToChangelist(s, ["config.local.json", "debug.ts"], made.id); + assert.deepEqual(parkedAmong(s, ["config.local.json", "src/a.ts"]), { "config.local.json": made.id }); + s = renameChangelist(s, made.id, "local only"); + assert.equal(s.lists[0].name, "local only"); + assert.equal(s.files["debug.ts"], made.id, "a rename keeps the files"); + s = moveToChangelist(s, ["debug.ts"], undefined); + assert.equal(s.files["debug.ts"], undefined, "moved back to the default list"); + const gone = deleteChangelist(s, made.id); + assert.deepEqual(gone.freed, ["config.local.json"]); + assert.deepEqual(gone.state, emptyChangelists()); +}); + +test("a move to a list that is not there is a move to the default list", () => { + const s = moveToChangelist({ lists: [], files: { "a.txt": "gone" } }, ["a.txt", "b.txt"], "nope"); + assert.deepEqual(s.files, {}); +}); + +test("names: empty, the view's own group names and a duplicate (any case) are refused", () => { + const s = addChangelist(emptyChangelists(), "nocommit").state; + assert.equal(changelistNameProblem(s, " "), "empty"); + for (const taken of ["Changes", "staged", "UNSTAGED", "NoCommit"]) { + assert.equal(changelistNameProblem(s, taken), "taken", taken); + } + assert.equal(changelistNameProblem(s, "nocommit", s.lists[0].id), undefined, "its own name is not taken"); + assert.equal(changelistNameProblem(s, "x".repeat(81)), "tooLong"); + assert.equal(changelistNameProblem(s, "local config"), undefined); +}); + +test("a broken, foreign or newer file reads as no changelists; a stray path is dropped", () => { + for (const text of ["", "{", "null", "[]", '{"version":2,"lists":[],"files":{}}', '{"version":1}']) { + assert.deepEqual(parseChangelists(text), emptyChangelists(), JSON.stringify(text)); + } + const s = parseChangelists(JSON.stringify({ + version: 1, + lists: [{ id: "a", name: "one" }, { id: "a", name: "dup id" }, { id: "b c", name: "bad id" }, { id: "d", name: "ONE" }, { id: "e", name: 3 }], + files: { "x.txt": "a", "y.txt": "zzz", "z.txt": 4 }, + })); + assert.deepEqual(s, { lists: [{ id: "a", name: "one" }], files: { "x.txt": "a" } }); + assert.deepEqual(parseChangelists(serializeChangelists(s)), s, "what is written reads back"); +}); + +test("forgetPaths drops only the paths it is given", () => { + const made = addChangelist(emptyChangelists(), "l"); + const s = moveToChangelist(made.state, ["a", "b"], made.id); + assert.deepEqual(forgetPaths(s, ["a"]).files, { b: made.id }); +}); + +test("the store keeps them in the git-dir, never in the working tree", async () => { + const { dir, git } = repo(); + const ctx = new GitContext({ root: dir }); + cleanups.push(() => ctx.dispose()); + assert.deepEqual(await ctx.changelists.read(), emptyChangelists(), "none yet"); + const kept = await ctx.changelists.update((s) => { + const made = addChangelist(s, "nocommit"); + return moveToChangelist(made.state, ["a.txt"], made.id); + }); + const file = join(dir, ".git", CHANGELISTS_FILE); + assert.ok(existsSync(file), "written in .git"); + assert.deepEqual(parseChangelists(readFileSync(file, "utf8")), kept); + assert.equal(git("status", "--porcelain"), "", "the working tree is untouched"); + assert.deepEqual(await new GitContext({ root: dir }).changelists.read(), kept, "another reader sees the same"); +}); + +test("updates run one after another: two quick moves both land", async () => { + const { dir } = repo(); + const ctx = new GitContext({ root: dir }); + cleanups.push(() => ctx.dispose()); + const id = (await ctx.changelists.update((s) => addChangelist(s, "l").state)).lists[0].id; + await Promise.all([ + ctx.changelists.update((s) => moveToChangelist(s, ["one"], id)), + ctx.changelists.update((s) => moveToChangelist(s, ["two"], id)), + ]); + assert.deepEqual(Object.keys((await ctx.changelists.read()).files).sort(), ["one", "two"]); +}); + +test("a linked worktree has its own changelists", async () => { + const { dir, git } = repo(); + const wt = mkdtempSync(join(tmpdir(), "gs-changelists-wt-")); + rmSync(wt, { recursive: true, force: true }); + git("worktree", "add", "-q", wt, "-b", "side"); + cleanups.push(() => rmSync(wt, { recursive: true, force: true, maxRetries: 20, retryDelay: 250 })); + const main = new GitContext({ root: dir }); + const side = new GitContext({ root: wt }); + cleanups.push(() => main.dispose(), () => side.dispose()); + await main.changelists.update((s) => addChangelist(s, "main only").state); + assert.notEqual(await main.changelists.path(), await side.changelists.path()); + assert.deepEqual(await side.changelists.read(), emptyChangelists()); +}); + +test("outside a repository there is nothing to read, and an update says why", async () => { + const dir = mkdtempSync(join(tmpdir(), "gs-changelists-norepo-")); + cleanups.push(() => rmSync(dir, { recursive: true, force: true })); + const ctx = new GitContext({ root: dir }); + cleanups.push(() => ctx.dispose()); + assert.deepEqual(await ctx.changelists.read(), emptyChangelists()); + await assert.rejects(ctx.changelists.update((s) => s), /not a git repository/); +}); From 4499c68ae50933aaf88a5271deff2bca3504ba4b Mon Sep 17 00:00:00 2001 From: Anton Arnaudov Date: Sat, 17 Oct 2026 22:33:57 +0300 Subject: [PATCH 2/3] style(changes): a changelist's name is shown as typed (#122) Co-Authored-By: Claude Opus 5.5 --- apps/extension/src/changes/commitView.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/extension/src/changes/commitView.ts b/apps/extension/src/changes/commitView.ts index 4385bb0d..e0264248 100644 --- a/apps/extension/src/changes/commitView.ts +++ b/apps/extension/src/changes/commitView.ts @@ -4819,6 +4819,8 @@ export class CommitViewProvider text-overflow: ellipsis; } .group--staged .glabel { color: var(--gs-fg); } + /* A changelist's name is the user's own: shown as typed, not shouted. */ + .group--changelist .glabel { text-transform: none; letter-spacing: normal; } .group-header .gcount { font-family: var(--gs-font-mono); font-variant-numeric: tabular-nums; From c551a666f294841a16205afbb9f7fbc319ecdbac Mon Sep 17 00:00:00 2001 From: Anton Arnaudov Date: Sun, 18 Oct 2026 18:53:07 +0300 Subject: [PATCH 3/3] test(changes): changelist page checks splice paths through jsLiteral CodeQL flagged a path written into page code unescaped (js/bad-code-sanitization). Co-Authored-By: Claude Opus 5.5 --- apps/extension/test/changesChangelistsPage.test.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apps/extension/test/changesChangelistsPage.test.ts b/apps/extension/test/changesChangelistsPage.test.ts index 7f0c670e..3db4814e 100644 --- a/apps/extension/test/changesChangelistsPage.test.ts +++ b/apps/extension/test/changesChangelistsPage.test.ts @@ -13,6 +13,7 @@ import { test, after } from "node:test"; import assert from "node:assert/strict"; import { ChangesPage, stateMessage } from "./changesPage"; +import { jsLiteral } from "../../../scripts/test/js-literal.mjs"; const chrome = ChangesPage.chrome(); const skip = chrome ? false : "no windowless Chrome on this machine (set GS_CHROME)"; @@ -63,8 +64,9 @@ function groups(p: ChangesPage): Promise<{ label: string; count: string; files: } const listHeader = (id: string) => - `Array.prototype.find.call(document.querySelectorAll("#groups > .group--changelist"), function (g) { return g.dataset.list === ${JSON.stringify(id)}; }).firstChild`; -const fileRow = (path: string) => `document.querySelector('#groups .row.is-file[data-path="${path}"]')`; + `Array.prototype.find.call(document.querySelectorAll("#groups > .group--changelist"), function (g) { return g.dataset.list === ${jsLiteral(id)}; }).firstChild`; +const fileRow = (path: string) => + `Array.prototype.find.call(document.querySelectorAll("#groups .row.is-file"), function (r) { return r.dataset.path === ${jsLiteral(path)}; })`; async function centre(p: ChangesPage, expr: string): Promise<{ x: number; y: number }> { return p.eval(`(function () {