feat(title-bar): add folder-actions menu and branch dropdown with git operations

This commit is contained in:
xintaofei
2026-04-22 00:23:27 +08:00
parent 08fb508736
commit f3bdf94723
19 changed files with 1511 additions and 46 deletions

View File

@@ -1021,7 +1021,8 @@
"fetchInfo": "جلب المعلومات",
"pushCode": "دفع الكود",
"stashChanges": "تخزين التغييرات في stash",
"stashPop": "استرجاع stash"
"stashPop": "استرجاع stash",
"deleteBranch": "حذف الفرع {branchName}"
},
"confirm": {
"mergeTitle": "دمج الفرع",
@@ -1029,7 +1030,11 @@
"mergeDescription": "دمج {branchName} في الفرع الحالي {currentBranch}؟",
"rebaseDescription": "إجراء rebase للفرع الحالي {currentBranch} على {branchName}؟",
"deleteRemoteTitle": "حذف الفرع البعيد",
"deleteRemoteDescription": "هل تريد حذف الفرع البعيد {branchName}؟ سيؤدي ذلك إلى إزالته من المستودع البعيد ولا يمكن التراجع عن هذا الإجراء."
"deleteRemoteDescription": "هل تريد حذف الفرع البعيد {branchName}؟ سيؤدي ذلك إلى إزالته من المستودع البعيد ولا يمكن التراجع عن هذا الإجراء.",
"deleteTitle": "حذف الفرع",
"deleteDescription": "حذف الفرع {branchName}؟ لا يمكن التراجع عن هذا الإجراء.",
"forceDeleteTitle": "حذف الفرع بالقوة",
"forceDeleteDescription": "الفرع {branchName} لم يتم دمجه بالكامل. هل أنت متأكد من أنك تريد حذفه بالقوة؟ لا يمكن التراجع عن هذا الإجراء."
},
"current": "الحالي",
"switchToBranch": "التبديل إلى هذا الفرع",
@@ -1100,7 +1105,8 @@
"dropSuccess": "تم حذف التخبئة",
"confirmApply": "تطبيق التخبئة {ref} على دليل العمل؟",
"cancel": "إلغاء"
}
},
"deleteBranch": "حذف الفرع"
},
"commitDialog": {
"toasts": {
@@ -1781,6 +1787,20 @@
"openStashFailed": "Failed to open stash window",
"openMergeFailed": "Failed to open merge window"
}
},
"cloneDialog": {
"title": "استنساخ مستودع",
"repositoryUrl": "رابط المستودع",
"repositoryUrlPlaceholder": "https://github.com/user/repo.git",
"directory": "المجلد",
"directoryPlaceholder": "اختر مجلد الهدف...",
"browseDirectory": "تصفح المجلد",
"cancel": "إلغاء",
"clone": "استنساخ",
"clonePath": "مسار الاستنساخ: {path}"
},
"toasts": {
"cloneFailed": "فشل استنساخ المستودع"
}
},
"ProjectBoot": {

View File

@@ -1021,7 +1021,8 @@
"fetchInfo": "Informationen fetchen",
"pushCode": "Code pushen",
"stashChanges": "Änderungen stashen",
"stashPop": "Stash anwenden"
"stashPop": "Stash anwenden",
"deleteBranch": "Branch {branchName} löschen"
},
"confirm": {
"mergeTitle": "Branch mergen",
@@ -1029,7 +1030,11 @@
"mergeDescription": "{branchName} in den aktuellen Branch {currentBranch} mergen?",
"rebaseDescription": "Aktuellen Branch {currentBranch} auf {branchName} rebasen?",
"deleteRemoteTitle": "Remote-Branch löschen",
"deleteRemoteDescription": "Remote-Branch {branchName} löschen? Dies entfernt ihn aus dem Remote-Repository und kann nicht rückgängig gemacht werden."
"deleteRemoteDescription": "Remote-Branch {branchName} löschen? Dies entfernt ihn aus dem Remote-Repository und kann nicht rückgängig gemacht werden.",
"deleteTitle": "Branch löschen",
"deleteDescription": "Branch {branchName} löschen? Diese Aktion kann nicht rückgängig gemacht werden.",
"forceDeleteTitle": "Branch erzwungen löschen",
"forceDeleteDescription": "Der Branch {branchName} ist nicht vollständig gemergt. Möchten Sie ihn wirklich erzwungen löschen? Diese Aktion kann nicht rückgängig gemacht werden."
},
"current": "Aktuell",
"switchToBranch": "Zu diesem Branch wechseln",
@@ -1100,7 +1105,8 @@
"dropSuccess": "Stash gelöscht",
"confirmApply": "Stash {ref} auf das Arbeitsverzeichnis anwenden?",
"cancel": "Abbrechen"
}
},
"deleteBranch": "Branch löschen"
},
"commitDialog": {
"toasts": {
@@ -1781,6 +1787,20 @@
"openStashFailed": "Failed to open stash window",
"openMergeFailed": "Failed to open merge window"
}
},
"cloneDialog": {
"title": "Repository klonen",
"repositoryUrl": "Repository-URL",
"repositoryUrlPlaceholder": "https://github.com/user/repo.git",
"directory": "Verzeichnis",
"directoryPlaceholder": "Zielverzeichnis auswählen...",
"browseDirectory": "Verzeichnis durchsuchen",
"cancel": "Abbrechen",
"clone": "Klonen",
"clonePath": "Klonpfad: {path}"
},
"toasts": {
"cloneFailed": "Repository konnte nicht geklont werden"
}
},
"ProjectBoot": {

View File

@@ -1021,7 +1021,8 @@
"fetchInfo": "Fetch info",
"pushCode": "Push code",
"stashChanges": "Stash changes",
"stashPop": "Pop stash"
"stashPop": "Pop stash",
"deleteBranch": "Delete branch {branchName}"
},
"confirm": {
"mergeTitle": "Merge branch",
@@ -1029,7 +1030,11 @@
"mergeDescription": "Merge {branchName} into current branch {currentBranch}?",
"rebaseDescription": "Rebase current branch {currentBranch} onto {branchName}?",
"deleteRemoteTitle": "Delete Remote Branch",
"deleteRemoteDescription": "Delete remote branch {branchName}? This will remove it from the remote repository and cannot be undone."
"deleteRemoteDescription": "Delete remote branch {branchName}? This will remove it from the remote repository and cannot be undone.",
"deleteTitle": "Delete branch",
"deleteDescription": "Delete branch {branchName}? This action cannot be undone.",
"forceDeleteTitle": "Force Delete Branch",
"forceDeleteDescription": "Branch {branchName} is not fully merged. Are you sure you want to force delete it? This action cannot be undone."
},
"current": "Current",
"switchToBranch": "Switch to this branch",
@@ -1100,7 +1105,8 @@
"dropSuccess": "Stash dropped",
"confirmApply": "Apply stash {ref} to working directory?",
"cancel": "Cancel"
}
},
"deleteBranch": "Delete branch"
},
"commitDialog": {
"toasts": {
@@ -1781,6 +1787,20 @@
"openStashFailed": "Failed to open stash window",
"openMergeFailed": "Failed to open merge window"
}
},
"cloneDialog": {
"title": "Clone Repository",
"repositoryUrl": "Repository URL",
"repositoryUrlPlaceholder": "https://github.com/user/repo.git",
"directory": "Directory",
"directoryPlaceholder": "Select target directory...",
"browseDirectory": "Browse directory",
"cancel": "Cancel",
"clone": "Clone",
"clonePath": "Clone path: {path}"
},
"toasts": {
"cloneFailed": "Failed to clone repository"
}
},
"ProjectBoot": {

View File

@@ -1021,7 +1021,8 @@
"fetchInfo": "Obtener información",
"pushCode": "Enviar código",
"stashChanges": "Guardar cambios en stash",
"stashPop": "Aplicar stash"
"stashPop": "Aplicar stash",
"deleteBranch": "Eliminar rama {branchName}"
},
"confirm": {
"mergeTitle": "Fusionar rama",
@@ -1029,7 +1030,11 @@
"mergeDescription": "¿Fusionar {branchName} en la rama actual {currentBranch}?",
"rebaseDescription": "¿Hacer rebase de la rama actual {currentBranch} sobre {branchName}?",
"deleteRemoteTitle": "Eliminar rama remota",
"deleteRemoteDescription": "¿Eliminar la rama remota {branchName}? Esto la eliminará del repositorio remoto y no se puede deshacer."
"deleteRemoteDescription": "¿Eliminar la rama remota {branchName}? Esto la eliminará del repositorio remoto y no se puede deshacer.",
"deleteTitle": "Eliminar rama",
"deleteDescription": "¿Eliminar la rama {branchName}? Esta acción no se puede deshacer.",
"forceDeleteTitle": "Forzar eliminación de rama",
"forceDeleteDescription": "La rama {branchName} no está completamente fusionada. ¿Estás seguro de que quieres forzar su eliminación? Esta acción no se puede deshacer."
},
"current": "Actual",
"switchToBranch": "Cambiar a esta rama",
@@ -1100,7 +1105,8 @@
"dropSuccess": "Stash eliminado",
"confirmApply": "¿Aplicar stash {ref} al directorio de trabajo?",
"cancel": "Cancelar"
}
},
"deleteBranch": "Eliminar rama"
},
"commitDialog": {
"toasts": {
@@ -1781,6 +1787,20 @@
"openStashFailed": "Failed to open stash window",
"openMergeFailed": "Failed to open merge window"
}
},
"cloneDialog": {
"title": "Clonar repositorio",
"repositoryUrl": "URL del repositorio",
"repositoryUrlPlaceholder": "https://github.com/user/repo.git",
"directory": "Directorio",
"directoryPlaceholder": "Selecciona el directorio de destino...",
"browseDirectory": "Explorar directorio",
"cancel": "Cancelar",
"clone": "Clonar",
"clonePath": "Ruta de clonación: {path}"
},
"toasts": {
"cloneFailed": "No se pudo clonar el repositorio"
}
},
"ProjectBoot": {

View File

@@ -1021,7 +1021,8 @@
"fetchInfo": "Récupérer les infos",
"pushCode": "Push du code",
"stashChanges": "Stash des changements",
"stashPop": "Appliquer le stash"
"stashPop": "Appliquer le stash",
"deleteBranch": "Supprimer la branche {branchName}"
},
"confirm": {
"mergeTitle": "Fusionner la branche",
@@ -1029,7 +1030,11 @@
"mergeDescription": "Fusionner {branchName} dans la branche actuelle {currentBranch} ?",
"rebaseDescription": "Rebaser la branche actuelle {currentBranch} sur {branchName} ?",
"deleteRemoteTitle": "Supprimer la branche distante",
"deleteRemoteDescription": "Supprimer la branche distante {branchName} ? Cette action la supprimera du dépôt distant et ne pourra pas être annulée."
"deleteRemoteDescription": "Supprimer la branche distante {branchName} ? Cette action la supprimera du dépôt distant et ne pourra pas être annulée.",
"deleteTitle": "Supprimer la branche",
"deleteDescription": "Supprimer la branche {branchName} ? Cette action est irréversible.",
"forceDeleteTitle": "Forcer la suppression de la branche",
"forceDeleteDescription": "La branche {branchName} n'est pas entièrement fusionnée. Êtes-vous sûr de vouloir la supprimer de force ? Cette action est irréversible."
},
"current": "Actuelle",
"switchToBranch": "Basculer vers cette branche",
@@ -1100,7 +1105,8 @@
"dropSuccess": "Remise supprimée",
"confirmApply": "Appliquer la remise {ref} au répertoire de travail ?",
"cancel": "Annuler"
}
},
"deleteBranch": "Supprimer la branche"
},
"commitDialog": {
"toasts": {
@@ -1781,6 +1787,20 @@
"openStashFailed": "Failed to open stash window",
"openMergeFailed": "Failed to open merge window"
}
},
"cloneDialog": {
"title": "Cloner un dépôt",
"repositoryUrl": "URL du dépôt",
"repositoryUrlPlaceholder": "https://github.com/user/repo.git",
"directory": "Répertoire",
"directoryPlaceholder": "Sélectionnez le répertoire cible...",
"browseDirectory": "Parcourir le répertoire",
"cancel": "Annuler",
"clone": "Cloner",
"clonePath": "Chemin de clonage : {path}"
},
"toasts": {
"cloneFailed": "Échec du clonage du dépôt"
}
},
"ProjectBoot": {

View File

@@ -1021,7 +1021,8 @@
"fetchInfo": "情報をフェッチ",
"pushCode": "コードをプッシュ",
"stashChanges": "変更を stash",
"stashPop": "stash を pop"
"stashPop": "stash を pop",
"deleteBranch": "ブランチ {branchName} を削除"
},
"confirm": {
"mergeTitle": "ブランチをマージ",
@@ -1029,7 +1030,11 @@
"mergeDescription": "{branchName} を現在のブランチ {currentBranch} にマージしますか?",
"rebaseDescription": "現在のブランチ {currentBranch} を {branchName} にリベースしますか?",
"deleteRemoteTitle": "リモートブランチの削除",
"deleteRemoteDescription": "リモートブランチ {branchName} を削除しますか?この操作はリモートリポジトリからブランチを削除し、元に戻せません。"
"deleteRemoteDescription": "リモートブランチ {branchName} を削除しますか?この操作はリモートリポジトリからブランチを削除し、元に戻せません。",
"deleteTitle": "ブランチを削除",
"deleteDescription": "ブランチ {branchName} を削除しますか?この操作は元に戻せません。",
"forceDeleteTitle": "ブランチを強制削除",
"forceDeleteDescription": "ブランチ {branchName} はまだ完全にマージされていません。強制削除してもよろしいですか?この操作は元に戻せません。"
},
"current": "現在",
"switchToBranch": "このブランチに切り替え",
@@ -1100,7 +1105,8 @@
"dropSuccess": "スタッシュを削除しました",
"confirmApply": "スタッシュ {ref} を作業ディレクトリに適用しますか?",
"cancel": "キャンセル"
}
},
"deleteBranch": "ブランチを削除"
},
"commitDialog": {
"toasts": {
@@ -1781,6 +1787,20 @@
"openStashFailed": "Failed to open stash window",
"openMergeFailed": "Failed to open merge window"
}
},
"cloneDialog": {
"title": "リポジトリをクローン",
"repositoryUrl": "リポジトリ URL",
"repositoryUrlPlaceholder": "https://github.com/user/repo.git",
"directory": "ディレクトリ",
"directoryPlaceholder": "保存先ディレクトリを選択...",
"browseDirectory": "ディレクトリを参照",
"cancel": "キャンセル",
"clone": "クローン",
"clonePath": "クローンパス: {path}"
},
"toasts": {
"cloneFailed": "リポジトリのクローンに失敗しました"
}
},
"ProjectBoot": {

View File

@@ -1021,7 +1021,8 @@
"fetchInfo": "정보 fetch",
"pushCode": "코드 push",
"stashChanges": "변경 사항 stash",
"stashPop": "stash pop"
"stashPop": "stash pop",
"deleteBranch": "브랜치 {branchName} 삭제"
},
"confirm": {
"mergeTitle": "브랜치 병합",
@@ -1029,7 +1030,11 @@
"mergeDescription": "{branchName}을(를) 현재 브랜치 {currentBranch}에 병합할까요?",
"rebaseDescription": "현재 브랜치 {currentBranch}를 {branchName} 위로 리베이스할까요?",
"deleteRemoteTitle": "원격 브랜치 삭제",
"deleteRemoteDescription": "원격 브랜치 {branchName}을(를) 삭제하시겠습니까? 이 작업은 원격 저장소에서 브랜치를 제거하며 되돌릴 수 없습니다."
"deleteRemoteDescription": "원격 브랜치 {branchName}을(를) 삭제하시겠습니까? 이 작업은 원격 저장소에서 브랜치를 제거하며 되돌릴 수 없습니다.",
"deleteTitle": "브랜치 삭제",
"deleteDescription": "브랜치 {branchName}을(를) 삭제할까요? 이 작업은 되돌릴 수 없습니다.",
"forceDeleteTitle": "브랜치 강제 삭제",
"forceDeleteDescription": "브랜치 {branchName}가 완전히 병합되지 않았습니다. 강제 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다."
},
"current": "현재",
"switchToBranch": "이 브랜치로 전환",
@@ -1100,7 +1105,8 @@
"dropSuccess": "스태시가 삭제되었습니다",
"confirmApply": "스태시 {ref}을(를) 작업 디렉토리에 적용하시겠습니까?",
"cancel": "취소"
}
},
"deleteBranch": "브랜치 삭제"
},
"commitDialog": {
"toasts": {
@@ -1781,6 +1787,20 @@
"openStashFailed": "Failed to open stash window",
"openMergeFailed": "Failed to open merge window"
}
},
"cloneDialog": {
"title": "저장소 클론",
"repositoryUrl": "저장소 URL",
"repositoryUrlPlaceholder": "https://github.com/user/repo.git",
"directory": "디렉터리",
"directoryPlaceholder": "대상 디렉터리 선택...",
"browseDirectory": "디렉터리 찾아보기",
"cancel": "취소",
"clone": "클론",
"clonePath": "클론 경로: {path}"
},
"toasts": {
"cloneFailed": "저장소 클론에 실패했습니다"
}
},
"ProjectBoot": {

View File

@@ -1021,7 +1021,8 @@
"fetchInfo": "Buscar informações",
"pushCode": "Enviar código",
"stashChanges": "Fazer stash das alterações",
"stashPop": "Aplicar stash"
"stashPop": "Aplicar stash",
"deleteBranch": "Excluir branch {branchName}"
},
"confirm": {
"mergeTitle": "Mesclar branch",
@@ -1029,7 +1030,11 @@
"mergeDescription": "Mesclar {branchName} na branch atual {currentBranch}?",
"rebaseDescription": "Fazer rebase da branch atual {currentBranch} sobre {branchName}?",
"deleteRemoteTitle": "Excluir branch remoto",
"deleteRemoteDescription": "Excluir o branch remoto {branchName}? Isso o removerá do repositório remoto e não poderá ser desfeito."
"deleteRemoteDescription": "Excluir o branch remoto {branchName}? Isso o removerá do repositório remoto e não poderá ser desfeito.",
"deleteTitle": "Excluir branch",
"deleteDescription": "Excluir a branch {branchName}? Esta ação não pode ser desfeita.",
"forceDeleteTitle": "Forçar exclusão do branch",
"forceDeleteDescription": "O branch {branchName} não está totalmente mesclado. Tem certeza de que deseja forçar a exclusão? Esta ação não pode ser desfeita."
},
"current": "Atual",
"switchToBranch": "Mudar para esta branch",
@@ -1100,7 +1105,8 @@
"dropSuccess": "Stash eliminado",
"confirmApply": "Aplicar stash {ref} ao diretório de trabalho?",
"cancel": "Cancelar"
}
},
"deleteBranch": "Excluir branch"
},
"commitDialog": {
"toasts": {
@@ -1781,6 +1787,20 @@
"openStashFailed": "Failed to open stash window",
"openMergeFailed": "Failed to open merge window"
}
},
"cloneDialog": {
"title": "Clonar repositório",
"repositoryUrl": "URL do repositório",
"repositoryUrlPlaceholder": "https://github.com/user/repo.git",
"directory": "Diretório",
"directoryPlaceholder": "Selecione o diretório de destino...",
"browseDirectory": "Procurar diretório",
"cancel": "Cancelar",
"clone": "Clonar",
"clonePath": "Caminho de clonagem: {path}"
},
"toasts": {
"cloneFailed": "Falha ao clonar o repositório"
}
},
"ProjectBoot": {

View File

@@ -1021,7 +1021,8 @@
"fetchInfo": "获取信息",
"pushCode": "推送代码",
"stashChanges": "贮藏更改",
"stashPop": "取消贮藏"
"stashPop": "取消贮藏",
"deleteBranch": "删除分支 {branchName}"
},
"confirm": {
"mergeTitle": "合并分支",
@@ -1029,7 +1030,11 @@
"mergeDescription": "确定将 {branchName} 合并到当前分支 {currentBranch} 吗?",
"rebaseDescription": "确定将当前分支 {currentBranch} 变基到 {branchName} 吗?",
"deleteRemoteTitle": "删除远程分支",
"deleteRemoteDescription": "确定删除远程分支 {branchName} 吗?此操作将从远程仓库中移除该分支,且不可恢复。"
"deleteRemoteDescription": "确定删除远程分支 {branchName} 吗?此操作将从远程仓库中移除该分支,且不可恢复。",
"deleteTitle": "删除分支",
"deleteDescription": "确定删除分支 {branchName} 吗?此操作不可恢复。",
"forceDeleteTitle": "强制删除分支",
"forceDeleteDescription": "分支 {branchName} 尚未完全合并,确定要强制删除吗?此操作不可恢复。"
},
"current": "当前",
"switchToBranch": "切换到此分支",
@@ -1100,7 +1105,8 @@
"dropSuccess": "贮藏已删除",
"confirmApply": "将贮藏 {ref} 应用到工作目录?",
"cancel": "取消"
}
},
"deleteBranch": "删除分支"
},
"commitDialog": {
"toasts": {
@@ -1781,6 +1787,20 @@
"openStashFailed": "打开贮藏窗口失败",
"openMergeFailed": "打开合并窗口失败"
}
},
"cloneDialog": {
"title": "克隆仓库",
"repositoryUrl": "仓库地址",
"repositoryUrlPlaceholder": "https://github.com/user/repo.git",
"directory": "目录",
"directoryPlaceholder": "选择目标目录...",
"browseDirectory": "浏览目录",
"cancel": "取消",
"clone": "克隆",
"clonePath": "克隆路径: {path}"
},
"toasts": {
"cloneFailed": "克隆仓库失败"
}
},
"ProjectBoot": {

View File

@@ -1021,7 +1021,8 @@
"fetchInfo": "獲取資訊",
"pushCode": "推送程式碼",
"stashChanges": "暫存變更",
"stashPop": "取消暫存"
"stashPop": "取消暫存",
"deleteBranch": "刪除分支 {branchName}"
},
"confirm": {
"mergeTitle": "合併分支",
@@ -1029,7 +1030,11 @@
"mergeDescription": "確定將 {branchName} 合併到目前分支 {currentBranch} 嗎?",
"rebaseDescription": "確定將目前分支 {currentBranch} 變基到 {branchName} 嗎?",
"deleteRemoteTitle": "刪除遠端分支",
"deleteRemoteDescription": "確定刪除遠端分支 {branchName} 嗎?此操作將從遠端倉庫中移除該分支,且不可恢復。"
"deleteRemoteDescription": "確定刪除遠端分支 {branchName} 嗎?此操作將從遠端倉庫中移除該分支,且不可恢復。",
"deleteTitle": "刪除分支",
"deleteDescription": "確定刪除分支 {branchName} 嗎?此操作無法復原。",
"forceDeleteTitle": "強制刪除分支",
"forceDeleteDescription": "分支 {branchName} 尚未完全合併,確定要強制刪除嗎?此操作不可恢復。"
},
"current": "目前",
"switchToBranch": "切換到此分支",
@@ -1100,7 +1105,8 @@
"dropSuccess": "貯藏已刪除",
"confirmApply": "將貯藏 {ref} 套用到工作目錄?",
"cancel": "取消"
}
},
"deleteBranch": "刪除分支"
},
"commitDialog": {
"toasts": {
@@ -1781,6 +1787,20 @@
"openStashFailed": "Failed to open stash window",
"openMergeFailed": "Failed to open merge window"
}
},
"cloneDialog": {
"title": "複製倉庫",
"repositoryUrl": "倉庫地址",
"repositoryUrlPlaceholder": "https://github.com/user/repo.git",
"directory": "目錄",
"directoryPlaceholder": "選擇目標目錄...",
"browseDirectory": "瀏覽目錄",
"cancel": "取消",
"clone": "複製",
"clonePath": "克隆路徑: {path}"
},
"toasts": {
"cloneFailed": "複製倉庫失敗"
}
},
"ProjectBoot": {