feat(status): localize selection count and stage/unstage buttons
Replace hard-coded "X selected" and "Stage/Unstage X" labels in the status panel with i18n lookups. Adds three message keys with English and German texts: - status.selectionCount - status.stageCount - status.unstageCount StatusPanel.svelte now uses t(...) with the count for the selection badge and the stage/unstage action buttons. CHANGELOG.md was also updated (Unreleased and recent release entries).
This commit is contained in:
+174
@@ -4,6 +4,180 @@ All notable user-facing changes to Gitty are documented in this file.
|
|||||||
|
|
||||||
The project uses calendar-style versions in the form `YYYY.M.PATCH`.
|
The project uses calendar-style versions in the form `YYYY.M.PATCH`.
|
||||||
|
|
||||||
|
## [Unreleased]
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Ctrl/Cmd + 1 to 4 switch between Dashboard, Repositories, Pull Requests,
|
||||||
|
and Issues & Boards.
|
||||||
|
- Ctrl/Cmd + A selects every file in the focused status lane; Esc clears the
|
||||||
|
selection again.
|
||||||
|
- Issues can be assigned to people, and labels are managed directly from the
|
||||||
|
Issue Center.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- The description field of the Create Issue dialog uses the full comment
|
||||||
|
editor instead of a plain text area.
|
||||||
|
- The help center no longer carries a "What's new" section. Release notes are
|
||||||
|
maintained in this file.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Long file paths no longer displace the header controls of the file history
|
||||||
|
dialog.
|
||||||
|
|
||||||
|
## [2026.9.8] - 2026-09-18
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Submodule management: submodules are listed, initialized, updated, and
|
||||||
|
cloned recursively, including authentication and checkout of a specific
|
||||||
|
submodule revision.
|
||||||
|
- Worktrees and tags are available as collapsible panels in the left sidebar,
|
||||||
|
and a section menu toggles which panels are shown.
|
||||||
|
- Individual lines can be restored from a historical commit instead of
|
||||||
|
restoring the whole file.
|
||||||
|
- The branch panel supports filtering, remembers its view state, and groups
|
||||||
|
branches with their own accent color.
|
||||||
|
- Pull request merges offer a merge-method selection with provider-specific
|
||||||
|
payloads and can delete the source branch automatically.
|
||||||
|
- The Review Center filters by repository, and select menus show repository
|
||||||
|
details next to each option.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- File history marks the entry that is identical to the working tree.
|
||||||
|
- Confirmation dialogs are centralized, translated, and can carry inputs,
|
||||||
|
checkboxes, and multi-selection actions.
|
||||||
|
- Left sidebar panels share one sizing and resize implementation, and global
|
||||||
|
scrollbar styles were consolidated.
|
||||||
|
- Status colors, overlay tints, and theme tokens for ink and accent moved to
|
||||||
|
CSS variables.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- The repository selector in the tab bar shows a pointer cursor.
|
||||||
|
|
||||||
|
## [2026.9.7] - 2026-09-11
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Pull request drafts can be generated with AI; all AI settings live on one
|
||||||
|
page.
|
||||||
|
- The commit history resolves visible parents, which keeps the graph correct
|
||||||
|
when commits are filtered.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Dialogs share unified header chrome.
|
||||||
|
- Provider icons were restyled and share one implementation.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Switching to the Management view no longer opens a repository on its own.
|
||||||
|
|
||||||
|
## [2026.9.6] - 2026-09-11
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Workspaces group repositories into sessions that can be saved, switched,
|
||||||
|
and managed; their UI filters persist.
|
||||||
|
- Repository tabs can be reordered by drag and drop.
|
||||||
|
- Issues can be created from the app, including Azure DevOps work items with
|
||||||
|
state management.
|
||||||
|
- Gitea repositories are grouped in the Clone dialog like the other
|
||||||
|
providers.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Undoing the last commit uses a soft reset, so the changes stay staged.
|
||||||
|
- Behind segments in the commit graph use the lane color supplied by the
|
||||||
|
graph.
|
||||||
|
|
||||||
|
## [2026.9.5] - 2026-09-09
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- All main views share one page-header layout.
|
||||||
|
- The integration board view was refined, and assignees are displayed more
|
||||||
|
compactly.
|
||||||
|
|
||||||
|
## [2026.9.4] - 2026-09-08
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Boards and issues from multiple providers, including moving cards between
|
||||||
|
columns.
|
||||||
|
- Pull requests can be created from the app; the dialog loads the repository
|
||||||
|
branches and suggests the current local branch.
|
||||||
|
- Repository tabs became a workspace navigation bar.
|
||||||
|
- Pull request status is loaded separately and surfaced as badges.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- The Review Center table and toolbar adapt to narrow windows.
|
||||||
|
|
||||||
|
## [2026.9.3] - 2026-09-08
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- The dashboard offers a list and a card view, and remembers the choice.
|
||||||
|
- A notice shows the progress of a running merge.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- The line patch dialog was redesigned.
|
||||||
|
- Sync colors are defined once as CSS variables.
|
||||||
|
|
||||||
|
## [2026.9.2] - 2026-09-07
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Guided Git bisect with a dedicated dialog for the commit range.
|
||||||
|
- The Review Center loads pull requests from the configured integrations,
|
||||||
|
with a detail panel, actions, and search.
|
||||||
|
- Conflicts from a pull request merge can be resolved locally; the merge
|
||||||
|
continues automatically and the provider is polled after the push.
|
||||||
|
- The dashboard shows pull request badges and links into the Review Center.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Repository management moved into its own dashboard component.
|
||||||
|
- Credentials use the Linux keyring.
|
||||||
|
|
||||||
|
## [2026.9.1] - 2026-09-01
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- A dialog for initializing a repository.
|
||||||
|
- A Merge Branch dialog with a confirmation step.
|
||||||
|
- Advanced clone options: shallow, sparse, blobless, and custom flags.
|
||||||
|
|
||||||
|
## [2026.8.10] - 2026-08-31
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- The Clone dialog was redesigned and groups Azure DevOps repositories by
|
||||||
|
project.
|
||||||
|
- Tab and dialog close buttons were visually refined.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- The Clone dialog no longer breaks its layout or scrolling on small windows.
|
||||||
|
- The loading overlay accounts for the repository tab bar.
|
||||||
|
|
||||||
|
## [2026.8.9] - 2026-08-30
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Pulling histories without a common ancestor is possible as an explicit
|
||||||
|
opt-in.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- The AI commit flow was simplified; local models are no longer supported.
|
||||||
|
|
||||||
## [2026.8.8] - 2026-08-29
|
## [2026.8.8] - 2026-08-29
|
||||||
|
|
||||||
### Added
|
### Added
|
||||||
|
|||||||
@@ -503,9 +503,9 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="status-lane-actions">
|
<div class="status-lane-actions">
|
||||||
{#if selectedUnstagedCount > 1}
|
{#if selectedUnstagedCount > 1}
|
||||||
<span class="status-selection-count">{selectedUnstagedCount} selected</span>
|
<span class="status-selection-count">{t("status.selectionCount", { count: selectedUnstagedCount })}</span>
|
||||||
<button class="btn-sm" type="button" onclick={() => onStage(changedFiles.filter((file) => selectedStatusPaths.has(fileKey(file)) && file.unstaged !== null))} disabled={isBusy} title={t("status.stageSelected", { count: selectedUnstagedCount })}>
|
<button class="btn-sm" type="button" onclick={() => onStage(changedFiles.filter((file) => selectedStatusPaths.has(fileKey(file)) && file.unstaged !== null))} disabled={isBusy} title={t("status.stageSelected", { count: selectedUnstagedCount })}>
|
||||||
<ArrowRight size={13} aria-hidden="true" /> Stage {selectedUnstagedCount}
|
<ArrowRight size={13} aria-hidden="true" /> {t("status.stageCount", { count: selectedUnstagedCount })}
|
||||||
</button>
|
</button>
|
||||||
{/if}
|
{/if}
|
||||||
<button class="btn-sm" type="button" onclick={onStageAll} disabled={isBusy || !hasUnstaged} title={t("status.stageAllHint")}>
|
<button class="btn-sm" type="button" onclick={onStageAll} disabled={isBusy || !hasUnstaged} title={t("status.stageAllHint")}>
|
||||||
@@ -560,9 +560,9 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="status-lane-actions">
|
<div class="status-lane-actions">
|
||||||
{#if selectedStagedCount > 1}
|
{#if selectedStagedCount > 1}
|
||||||
<span class="status-selection-count">{selectedStagedCount} selected</span>
|
<span class="status-selection-count">{t("status.selectionCount", { count: selectedStagedCount })}</span>
|
||||||
<button class="btn-sm" type="button" onclick={() => onUnstage(changedFiles.filter((file) => selectedStatusPaths.has(fileKey(file)) && file.staged !== null))} disabled={isBusy} title={t("status.unstageSelected", { count: selectedStagedCount })}>
|
<button class="btn-sm" type="button" onclick={() => onUnstage(changedFiles.filter((file) => selectedStatusPaths.has(fileKey(file)) && file.staged !== null))} disabled={isBusy} title={t("status.unstageSelected", { count: selectedStagedCount })}>
|
||||||
<ArrowLeft size={13} aria-hidden="true" /> Unstage {selectedStagedCount}
|
<ArrowLeft size={13} aria-hidden="true" /> {t("status.unstageCount", { count: selectedStagedCount })}
|
||||||
</button>
|
</button>
|
||||||
{/if}
|
{/if}
|
||||||
<button class="btn-sm" type="button" onclick={onUnstageAll} disabled={isBusy || !hasStaged} title={t("status.unstageAllHint")}>
|
<button class="btn-sm" type="button" onclick={onUnstageAll} disabled={isBusy || !hasStaged} title={t("status.unstageAllHint")}>
|
||||||
|
|||||||
@@ -216,6 +216,9 @@ export const messages = {
|
|||||||
"status.discardUnstagedSelected": { en: "Discard unstaged changes in {count} selected files", de: "Ungestagte Änderungen in {count} ausgewählten Dateien verwerfen" },
|
"status.discardUnstagedSelected": { en: "Discard unstaged changes in {count} selected files", de: "Ungestagte Änderungen in {count} ausgewählten Dateien verwerfen" },
|
||||||
"status.discardStagedSelected": { en: "Discard staged changes in {count} selected files", de: "Gestagte Änderungen in {count} ausgewählten Dateien verwerfen" },
|
"status.discardStagedSelected": { en: "Discard staged changes in {count} selected files", de: "Gestagte Änderungen in {count} ausgewählten Dateien verwerfen" },
|
||||||
"status.discard": { en: "Discard", de: "Verwerfen" },
|
"status.discard": { en: "Discard", de: "Verwerfen" },
|
||||||
|
"status.selectionCount": { en: "{count} selected", de: "{count} ausgewählt" },
|
||||||
|
"status.stageCount": { en: "Stage {count}", de: "{count} stagen" },
|
||||||
|
"status.unstageCount": { en: "Unstage {count}", de: "{count} entstagen" },
|
||||||
"status.selectInExplorer": { en: "Select {path} in Explorer", de: "{path} im Explorer auswählen" },
|
"status.selectInExplorer": { en: "Select {path} in Explorer", de: "{path} im Explorer auswählen" },
|
||||||
"status.stageFile": { en: "Stage file", de: "Datei stagen" },
|
"status.stageFile": { en: "Stage file", de: "Datei stagen" },
|
||||||
"status.unstageFile": { en: "Unstage file", de: "Datei entstagen" },
|
"status.unstageFile": { en: "Unstage file", de: "Datei entstagen" },
|
||||||
|
|||||||
Reference in New Issue
Block a user