Merge remote-tracking branch 'origin/main'

This commit is contained in:
itpkcn@gmail.com
2026-03-21 10:51:22 +08:00
19 changed files with 448 additions and 75 deletions

View File

@@ -1,7 +1,7 @@
{ {
"name": "codeg", "name": "codeg",
"private": true, "private": true,
"version": "0.2.4", "version": "0.2.5",
"scripts": { "scripts": {
"dev": "next dev --turbopack", "dev": "next dev --turbopack",
"build": "next build", "build": "next build",

2
src-tauri/Cargo.lock generated
View File

@@ -792,7 +792,7 @@ checksum = "c3e64b0cc0439b12df2fa678eae89a1c56a529fd067a9115f7827f1fffd22b32"
[[package]] [[package]]
name = "codeg" name = "codeg"
version = "0.2.4" version = "0.2.5"
dependencies = [ dependencies = [
"agent-client-protocol-schema", "agent-client-protocol-schema",
"base64 0.22.1", "base64 0.22.1",

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "codeg" name = "codeg"
version = "0.2.4" version = "0.2.5"
description = "Agent Code Generation App" description = "Agent Code Generation App"
authors = ["feitao"] authors = ["feitao"]
edition = "2021" edition = "2021"

View File

@@ -3,7 +3,7 @@ use std::fs::{File, OpenOptions};
use std::hash::{Hash, Hasher}; use std::hash::{Hash, Hasher};
use std::io::Write; use std::io::Write;
use std::path::{Component, Path, PathBuf}; use std::path::{Component, Path, PathBuf};
use std::process::{Command, Stdio}; use std::process::Stdio;
use std::sync::{mpsc, LazyLock, Mutex}; use std::sync::{mpsc, LazyLock, Mutex};
use std::time::{Duration, Instant, UNIX_EPOCH}; use std::time::{Duration, Instant, UNIX_EPOCH};
@@ -1075,7 +1075,7 @@ pub async fn git_stash_show(
pub async fn git_status(path: String) -> Result<Vec<GitStatusEntry>, AppCommandError> { pub async fn git_status(path: String) -> Result<Vec<GitStatusEntry>, AppCommandError> {
let output = crate::process::tokio_command("git") let output = crate::process::tokio_command("git")
.args(["-c", "core.quotePath=false"]) .args(["-c", "core.quotePath=false"])
.args(["status", "--porcelain=v1", "-uall"]) .args(["status", "--porcelain=v1", "-unormal"])
.current_dir(&path) .current_dir(&path)
.output() .output()
.await .await
@@ -1883,7 +1883,7 @@ fn git_check_ignored_paths(
return Ok(HashSet::new()); return Ok(HashSet::new());
} }
let mut child = Command::new("git") let mut child = crate::process::std_command("git")
.args(["check-ignore", "--stdin", "-z"]) .args(["check-ignore", "--stdin", "-z"])
.current_dir(repo_path) .current_dir(repo_path)
.stdin(Stdio::piped()) .stdin(Stdio::piped())

View File

@@ -1,4 +1,5 @@
use std::ffi::{OsStr, OsString}; use std::ffi::{OsStr, OsString};
use std::process::Command;
#[cfg(windows)] #[cfg(windows)]
use std::path::Path; use std::path::Path;
@@ -6,6 +7,25 @@ use std::path::Path;
#[cfg(windows)] #[cfg(windows)]
const CREATE_NO_WINDOW: u32 = 0x0800_0000; const CREATE_NO_WINDOW: u32 = 0x0800_0000;
pub fn configure_std_command(command: &mut Command) -> &mut Command {
#[cfg(windows)]
{
use std::os::windows::process::CommandExt;
command.creation_flags(CREATE_NO_WINDOW);
}
command
}
pub fn std_command<S>(program: S) -> Command
where
S: AsRef<OsStr>,
{
let mut command = Command::new(normalized_program(program));
configure_std_command(&mut command);
command
}
pub fn configure_tokio_command( pub fn configure_tokio_command(
command: &mut tokio::process::Command, command: &mut tokio::process::Command,
) -> &mut tokio::process::Command { ) -> &mut tokio::process::Command {

View File

@@ -1,7 +1,7 @@
{ {
"$schema": "https://schema.tauri.app/config/2", "$schema": "https://schema.tauri.app/config/2",
"productName": "codeg", "productName": "codeg",
"version": "0.2.4", "version": "0.2.5",
"identifier": "app.codeg", "identifier": "app.codeg",
"build": { "build": {
"beforeDevCommand": "pnpm dev", "beforeDevCommand": "pnpm dev",

View File

@@ -1563,6 +1563,11 @@ export function FileWorkspacePanel() {
</div> </div>
)} )}
<div className="flex-1 min-h-0"> <div className="flex-1 min-h-0">
{activeFileTab.loading ? (
<div className="h-full flex items-center justify-center text-xs text-muted-foreground">
{t("loadingEditor")}
</div>
) : (
<MonacoEditor <MonacoEditor
beforeMount={defineMonacoThemes} beforeMount={defineMonacoThemes}
onMount={handleEditorMount} onMount={handleEditorMount}
@@ -1595,6 +1600,7 @@ export function FileWorkspacePanel() {
}, },
}} }}
/> />
)}
</div> </div>
</div> </div>
</div> </div>

View File

@@ -409,8 +409,10 @@ interface RenderNodeProps {
gitEnabled: boolean gitEnabled: boolean
gitStatusByPath: ReadonlyMap<string, string> gitStatusByPath: ReadonlyMap<string, string>
gitChangedDirPaths: ReadonlySet<string> gitChangedDirPaths: ReadonlySet<string>
untrackedDirPaths: ReadonlySet<string>
gitignoreIgnoredPaths: ReadonlySet<string> gitignoreIgnoredPaths: ReadonlySet<string>
ancestorGitignoreIgnored: boolean ancestorGitignoreIgnored: boolean
ancestorUntracked: boolean
onOpenFilePreview: (path: string) => void onOpenFilePreview: (path: string) => void
onOpenFileDiff: (path: string) => void onOpenFileDiff: (path: string) => void
onOpenDirDiff: (path: string) => void onOpenDirDiff: (path: string) => void
@@ -433,8 +435,10 @@ function RenderNode({
gitEnabled, gitEnabled,
gitStatusByPath, gitStatusByPath,
gitChangedDirPaths, gitChangedDirPaths,
untrackedDirPaths,
gitignoreIgnoredPaths, gitignoreIgnoredPaths,
ancestorGitignoreIgnored, ancestorGitignoreIgnored,
ancestorUntracked,
onOpenFilePreview, onOpenFilePreview,
onOpenFileDiff, onOpenFileDiff,
onOpenDirDiff, onOpenDirDiff,
@@ -465,7 +469,8 @@ function RenderNode({
})() })()
if (node.kind === "file") { if (node.kind === "file") {
const gitStatusCode = gitStatusByPath.get(node.path) const gitStatusCode =
gitStatusByPath.get(node.path) ?? (ancestorUntracked ? "??" : undefined)
const absolutePath = joinFsPath(workspacePath, node.path) const absolutePath = joinFsPath(workspacePath, node.path)
const dirPath = parentDir(absolutePath) const dirPath = parentDir(absolutePath)
const isGitMenuDisabled = !gitEnabled || isGitignoreIgnored const isGitMenuDisabled = !gitEnabled || isGitignoreIgnored
@@ -599,7 +604,11 @@ function RenderNode({
} }
const absolutePath = joinFsPath(workspacePath, node.path) const absolutePath = joinFsPath(workspacePath, node.path)
const dirHasChanges = !isGitignoreIgnored && gitChangedDirPaths.has(node.path) const isThisDirUntracked =
ancestorUntracked || untrackedDirPaths.has(node.path)
const dirHasChanges =
!isGitignoreIgnored &&
(gitChangedDirPaths.has(node.path) || isThisDirUntracked)
const isGitMenuDisabled = !gitEnabled || isGitignoreIgnored const isGitMenuDisabled = !gitEnabled || isGitignoreIgnored
const shouldRenderChildren = expandedPaths.has(node.path) const shouldRenderChildren = expandedPaths.has(node.path)
@@ -638,8 +647,10 @@ function RenderNode({
gitEnabled={gitEnabled} gitEnabled={gitEnabled}
gitStatusByPath={gitStatusByPath} gitStatusByPath={gitStatusByPath}
gitChangedDirPaths={gitChangedDirPaths} gitChangedDirPaths={gitChangedDirPaths}
untrackedDirPaths={untrackedDirPaths}
gitignoreIgnoredPaths={gitignoreIgnoredPaths} gitignoreIgnoredPaths={gitignoreIgnoredPaths}
ancestorGitignoreIgnored={isGitignoreIgnored} ancestorGitignoreIgnored={isGitignoreIgnored}
ancestorUntracked={isThisDirUntracked}
onOpenFilePreview={onOpenFilePreview} onOpenFilePreview={onOpenFilePreview}
onOpenFileDiff={onOpenFileDiff} onOpenFileDiff={onOpenFileDiff}
onOpenDirDiff={onOpenDirDiff} onOpenDirDiff={onOpenDirDiff}
@@ -908,7 +919,10 @@ export function FileTreeTab() {
(entries: { file: string; status: string }[]) => { (entries: { file: string; status: string }[]) => {
const nextStatusByPath = new Map<string, string>() const nextStatusByPath = new Map<string, string>()
for (const entry of entries) { for (const entry of entries) {
const normalizedPath = normalizeGitStatusPath(entry.file) const raw = normalizeGitStatusPath(entry.file)
if (!raw) continue
// Strip trailing slash (directory entries from -unormal)
const normalizedPath = raw.replace(/\/+$/, "")
if (!normalizedPath) continue if (!normalizedPath) continue
nextStatusByPath.set(normalizedPath, entry.status) nextStatusByPath.set(normalizedPath, entry.status)
} }
@@ -1182,6 +1196,20 @@ export function FileTreeTab() {
return dirs return dirs
}, [gitStatusByPath]) }, [gitStatusByPath])
// Directories that are entirely untracked (from git status -unormal)
const untrackedDirPaths = useMemo(() => {
const dirs = new Set<string>()
for (const [path, status] of gitStatusByPath.entries()) {
if (status.trim() === "??") {
// Check if this path is a directory in the file tree
if (dirChildrenByPath.has(path)) {
dirs.add(path)
}
}
}
return dirs
}, [gitStatusByPath, dirChildrenByPath])
const handleTreeSelect = useCallback( const handleTreeSelect = useCallback(
(path: string) => { (path: string) => {
if (!filePathSet.has(path)) return if (!filePathSet.has(path)) return
@@ -2163,8 +2191,10 @@ export function FileTreeTab() {
gitEnabled={gitEnabled} gitEnabled={gitEnabled}
gitStatusByPath={gitStatusByPath} gitStatusByPath={gitStatusByPath}
gitChangedDirPaths={gitChangedDirPaths} gitChangedDirPaths={gitChangedDirPaths}
untrackedDirPaths={untrackedDirPaths}
gitignoreIgnoredPaths={gitignoreIgnoredPaths} gitignoreIgnoredPaths={gitignoreIgnoredPaths}
ancestorGitignoreIgnored={false} ancestorGitignoreIgnored={false}
ancestorUntracked={false}
onOpenFilePreview={(path) => { onOpenFilePreview={(path) => {
void openFilePreview(path) void openFilePreview(path)
}} }}

View File

@@ -38,6 +38,7 @@ import { useAuxPanelContext } from "@/contexts/aux-panel-context"
import { useFolderContext } from "@/contexts/folder-context" import { useFolderContext } from "@/contexts/folder-context"
import { useWorkspaceContext } from "@/contexts/workspace-context" import { useWorkspaceContext } from "@/contexts/workspace-context"
import { import {
deleteFileTreeEntry,
gitDiff, gitDiff,
gitAddFiles, gitAddFiles,
gitRollbackFile, gitRollbackFile,
@@ -80,7 +81,11 @@ interface GitActionTarget {
name: string name: string
} }
type DirectoryGitAction = "add" | "rollback" type DirectoryGitAction =
| "add"
| "rollback"
| "delete-tracked"
| "delete-untracked"
interface DirectoryGitCandidateEntry { interface DirectoryGitCandidateEntry {
path: string path: string
@@ -142,7 +147,7 @@ function normalizePathSegments(path: string): string[] {
} }
function normalizeGitStatusPath(path: string): string { function normalizeGitStatusPath(path: string): string {
const normalized = path.trim() const normalized = path.trim().replace(/\/+$/, "")
const renameSeparator = " -> " const renameSeparator = " -> "
const renameIndex = normalized.lastIndexOf(renameSeparator) const renameIndex = normalized.lastIndexOf(renameSeparator)
if (renameIndex < 0) return normalized if (renameIndex < 0) return normalized
@@ -188,6 +193,10 @@ function scopeGitStatusEntriesForDirectory(
) )
} }
function isDeleteAction(action: DirectoryGitAction): boolean {
return action === "delete-tracked" || action === "delete-untracked"
}
function filterDirectoryGitCandidates( function filterDirectoryGitCandidates(
entries: DirectoryGitCandidateEntry[], entries: DirectoryGitCandidateEntry[],
action: DirectoryGitAction action: DirectoryGitAction
@@ -196,6 +205,20 @@ function filterDirectoryGitCandidates(
return entries.filter((entry) => entry.status.trim().length > 0) return entries.filter((entry) => entry.status.trim().length > 0)
} }
if (action === "delete-tracked") {
return entries.filter((entry) => {
const fileState = classifyGitFileState(entry.status)
return fileState !== null && fileState !== "untracked"
})
}
if (action === "delete-untracked") {
return entries.filter((entry) => {
const fileState = classifyGitFileState(entry.status)
return fileState === "untracked"
})
}
return entries.filter((entry) => { return entries.filter((entry) => {
const fileState = classifyGitFileState(entry.status) const fileState = classifyGitFileState(entry.status)
return fileState !== "untracked" return fileState !== "untracked"
@@ -446,6 +469,8 @@ export function GitChangesTab() {
null null
) )
const [rollingBack, setRollingBack] = useState(false) const [rollingBack, setRollingBack] = useState(false)
const [deleteTarget, setDeleteTarget] = useState<GitActionTarget | null>(null)
const [deleting, setDeleting] = useState(false)
const [directoryGitActionType, setDirectoryGitActionType] = const [directoryGitActionType, setDirectoryGitActionType] =
useState<DirectoryGitAction | null>(null) useState<DirectoryGitAction | null>(null)
const [directoryGitActionTarget, setDirectoryGitActionTarget] = const [directoryGitActionTarget, setDirectoryGitActionTarget] =
@@ -726,6 +751,8 @@ export function GitChangesTab() {
toast.info( toast.info(
action === "add" action === "add"
? t("toasts.noAddableFilesInDir") ? t("toasts.noAddableFilesInDir")
: isDeleteAction(action)
? t("toasts.noDeletableFilesInDir")
: t("toasts.noRollbackFilesInDir") : t("toasts.noRollbackFilesInDir")
) )
return return
@@ -793,6 +820,37 @@ export function GitChangesTab() {
} }
}, [fetchChanges, folder?.path, rollbackTarget, t]) }, [fetchChanges, folder?.path, rollbackTarget, t])
const handleRequestDelete = useCallback(
(target: GitActionTarget, scope: "tracked" | "untracked") => {
if (target.kind === "dir") {
void openDirectoryGitActionDialog(
scope === "tracked" ? "delete-tracked" : "delete-untracked",
target
)
return
}
setDeleteTarget(target)
},
[openDirectoryGitActionDialog]
)
const handleDeleteConfirm = useCallback(async () => {
if (!folder?.path || !deleteTarget) return
setDeleting(true)
try {
await deleteFileTreeEntry(folder.path, deleteTarget.path)
toast.success(t("toasts.deleted", { name: deleteTarget.name }))
setDeleteTarget(null)
await fetchChanges({ inline: true })
} catch (error) {
const message = error instanceof Error ? error.message : String(error)
toast.error(t("toasts.deleteFailed"), { description: message })
} finally {
setDeleting(false)
}
}, [deleteTarget, fetchChanges, folder?.path, t])
const directoryGitAllFilePaths = useMemo( const directoryGitAllFilePaths = useMemo(
() => directoryGitCandidates.map((entry) => entry.path), () => directoryGitCandidates.map((entry) => entry.path),
[directoryGitCandidates] [directoryGitCandidates]
@@ -848,6 +906,15 @@ export function GitChangesTab() {
count: selectedPaths.length, count: selectedPaths.length,
}) })
) )
} else if (isDeleteAction(directoryGitActionType)) {
for (const filePath of selectedPaths) {
await deleteFileTreeEntry(folder.path, filePath)
}
toast.success(
t("toasts.deletedFiles", {
count: selectedPaths.length,
})
)
} else { } else {
for (const filePath of selectedPaths) { for (const filePath of selectedPaths) {
await gitRollbackFile(folder.path, filePath) await gitRollbackFile(folder.path, filePath)
@@ -867,6 +934,8 @@ export function GitChangesTab() {
toast.error( toast.error(
directoryGitActionType === "add" directoryGitActionType === "add"
? t("toasts.addToVcsFailed") ? t("toasts.addToVcsFailed")
: isDeleteAction(directoryGitActionType)
? t("toasts.deleteFailed")
: t("toasts.rollbackFailed"), : t("toasts.rollbackFailed"),
{ {
description: message, description: message,
@@ -941,6 +1010,14 @@ export function GitChangesTab() {
> >
{t("actions.addToVcs")} {t("actions.addToVcs")}
</ContextMenuItem> </ContextMenuItem>
<ContextMenuItem
onSelect={() => {
handleRequestDelete(target, "tracked")
}}
variant="destructive"
>
{t("actions.delete")}
</ContextMenuItem>
</ContextMenuContent> </ContextMenuContent>
</ContextMenu> </ContextMenu>
) )
@@ -1021,6 +1098,14 @@ export function GitChangesTab() {
> >
{t("actions.addToVcs")} {t("actions.addToVcs")}
</ContextMenuItem> </ContextMenuItem>
<ContextMenuItem
onSelect={() => {
handleRequestDelete(target, "tracked")
}}
variant="destructive"
>
{t("actions.delete")}
</ContextMenuItem>
</ContextMenuContent> </ContextMenuContent>
</ContextMenu> </ContextMenu>
) )
@@ -1028,6 +1113,7 @@ export function GitChangesTab() {
[ [
handleOpenCommitWindow, handleOpenCommitWindow,
handleAddToVcs, handleAddToVcs,
handleRequestDelete,
handleRequestRollback, handleRequestRollback,
openFilePreview, openFilePreview,
openWorkingTreeDiff, openWorkingTreeDiff,
@@ -1088,6 +1174,14 @@ export function GitChangesTab() {
> >
{t("actions.addToVcs")} {t("actions.addToVcs")}
</ContextMenuItem> </ContextMenuItem>
<ContextMenuItem
onSelect={() => {
handleRequestDelete(target, "untracked")
}}
variant="destructive"
>
{t("actions.delete")}
</ContextMenuItem>
</ContextMenuContent> </ContextMenuContent>
</ContextMenu> </ContextMenu>
) )
@@ -1158,6 +1252,14 @@ export function GitChangesTab() {
> >
{t("actions.addToVcs")} {t("actions.addToVcs")}
</ContextMenuItem> </ContextMenuItem>
<ContextMenuItem
onSelect={() => {
handleRequestDelete(target, "untracked")
}}
variant="destructive"
>
{t("actions.delete")}
</ContextMenuItem>
</ContextMenuContent> </ContextMenuContent>
</ContextMenu> </ContextMenu>
) )
@@ -1165,6 +1267,7 @@ export function GitChangesTab() {
[ [
handleOpenCommitWindow, handleOpenCommitWindow,
handleAddToVcs, handleAddToVcs,
handleRequestDelete,
handleRequestRollback, handleRequestRollback,
openFilePreview, openFilePreview,
openWorkingTreeDiff, openWorkingTreeDiff,
@@ -1290,6 +1393,21 @@ export function GitChangesTab() {
> >
{t("actions.addToVcs")} {t("actions.addToVcs")}
</ContextMenuItem> </ContextMenuItem>
<ContextMenuItem
onSelect={() => {
handleRequestDelete(
{
kind: "dir",
path: "",
name: folderName,
},
"tracked"
)
}}
variant="destructive"
>
{t("actions.delete")}
</ContextMenuItem>
</ContextMenuContent> </ContextMenuContent>
</ContextMenu> </ContextMenu>
</FileTree> </FileTree>
@@ -1383,6 +1501,21 @@ export function GitChangesTab() {
> >
{t("actions.addToVcs")} {t("actions.addToVcs")}
</ContextMenuItem> </ContextMenuItem>
<ContextMenuItem
onSelect={() => {
handleRequestDelete(
{
kind: "dir",
path: "",
name: folderName,
},
"untracked"
)
}}
variant="destructive"
>
{t("actions.delete")}
</ContextMenuItem>
</ContextMenuContent> </ContextMenuContent>
</ContextMenu> </ContextMenu>
</FileTree> </FileTree>
@@ -1404,6 +1537,9 @@ export function GitChangesTab() {
<DialogTitle> <DialogTitle>
{directoryGitActionType === "add" {directoryGitActionType === "add"
? t("actions.addToVcs") ? t("actions.addToVcs")
: directoryGitActionType &&
isDeleteAction(directoryGitActionType)
? t("actions.delete")
: t("actions.rollback")} : t("actions.rollback")}
</DialogTitle> </DialogTitle>
<DialogDescription> <DialogDescription>
@@ -1412,6 +1548,11 @@ export function GitChangesTab() {
? t("directoryDialog.descriptionAdd", { ? t("directoryDialog.descriptionAdd", {
path: directoryGitActionTarget.path, path: directoryGitActionTarget.path,
}) })
: directoryGitActionType &&
isDeleteAction(directoryGitActionType)
? t("directoryDialog.descriptionDelete", {
path: directoryGitActionTarget.path,
})
: t("directoryDialog.descriptionRollback", { : t("directoryDialog.descriptionRollback", {
path: directoryGitActionTarget.path, path: directoryGitActionTarget.path,
}) })
@@ -1474,9 +1615,11 @@ export function GitChangesTab() {
<span className="flex-1 truncate" title={entry.path}> <span className="flex-1 truncate" title={entry.path}>
{entry.path} {entry.path}
</span> </span>
{entry.status !== UNTRACKED_STATUS && (
<span className="shrink-0 text-muted-foreground"> <span className="shrink-0 text-muted-foreground">
{entry.status} {entry.status}
</span> </span>
)}
</button> </button>
) )
})} })}
@@ -1499,7 +1642,9 @@ export function GitChangesTab() {
<Button <Button
type="button" type="button"
variant={ variant={
directoryGitActionType === "rollback" directoryGitActionType === "rollback" ||
(directoryGitActionType &&
isDeleteAction(directoryGitActionType))
? "destructive" ? "destructive"
: "default" : "default"
} }
@@ -1514,6 +1659,9 @@ export function GitChangesTab() {
> >
{directoryGitActionType === "add" {directoryGitActionType === "add"
? t("actions.addToVcs") ? t("actions.addToVcs")
: directoryGitActionType &&
isDeleteAction(directoryGitActionType)
? t("actions.delete")
: t("actions.rollback")} : t("actions.rollback")}
</Button> </Button>
</DialogFooter> </DialogFooter>
@@ -1559,6 +1707,45 @@ export function GitChangesTab() {
</AlertDialogFooter> </AlertDialogFooter>
</AlertDialogContent> </AlertDialogContent>
</AlertDialog> </AlertDialog>
<AlertDialog
open={Boolean(deleteTarget)}
onOpenChange={(open) => {
if (open) return
setDeleteTarget(null)
}}
>
<AlertDialogContent>
<AlertDialogHeader>
<AlertDialogTitle>{t("deleteConfirm.title")}</AlertDialogTitle>
<AlertDialogDescription>
{deleteTarget
? t("deleteConfirm.descriptionWithTarget", {
kind:
deleteTarget.kind === "dir"
? t("deleteConfirm.kindDirectory")
: t("deleteConfirm.kindFile"),
name: deleteTarget.name,
})
: t("deleteConfirm.descriptionFallback")}
</AlertDialogDescription>
</AlertDialogHeader>
<AlertDialogFooter>
<AlertDialogCancel disabled={deleting}>
{tCommon("cancel")}
</AlertDialogCancel>
<AlertDialogAction
variant="destructive"
disabled={deleting}
onClick={() => {
void handleDeleteConfirm()
}}
>
{t("actions.delete")}
</AlertDialogAction>
</AlertDialogFooter>
</AlertDialogContent>
</AlertDialog>
</> </>
) )
} }

View File

@@ -1001,7 +1001,8 @@
"actions": { "actions": {
"commitCode": "التزام الكود", "commitCode": "التزام الكود",
"rollback": "تراجع", "rollback": "تراجع",
"addToVcs": "إضافة إلى VCS" "addToVcs": "إضافة إلى VCS",
"delete": "حذف"
}, },
"toasts": { "toasts": {
"noAddableFilesInDir": "لا توجد ملفات متغيرة في هذا الدليل يمكن إضافتها إلى VCS", "noAddableFilesInDir": "لا توجد ملفات متغيرة في هذا الدليل يمكن إضافتها إلى VCS",
@@ -1012,11 +1013,16 @@
"rolledBack": "تم التراجع عن {name}", "rolledBack": "تم التراجع عن {name}",
"rollbackFailed": "فشل التراجع", "rollbackFailed": "فشل التراجع",
"addedFilesToVcs": "تمت إضافة {count, plural, one {# ملف} other {# ملفات}} إلى VCS", "addedFilesToVcs": "تمت إضافة {count, plural, one {# ملف} other {# ملفات}} إلى VCS",
"rolledBackFiles": "تم التراجع عن {count, plural, one {# ملف} other {# ملفات}}" "rolledBackFiles": "تم التراجع عن {count, plural, one {# ملف} other {# ملفات}}",
"deleted": "تم حذف {name}",
"deleteFailed": "فشل الحذف",
"deletedFiles": "تم حذف {count} ملفات",
"noDeletableFilesInDir": "لا توجد ملفات معدّلة في هذا الدليل يمكن حذفها"
}, },
"directoryDialog": { "directoryDialog": {
"descriptionAdd": "اختر ملفات داخل الدليل {path} لإضافتها إلى VCS.", "descriptionAdd": "اختر ملفات داخل الدليل {path} لإضافتها إلى VCS.",
"descriptionRollback": "اختر ملفات داخل الدليل {path} للتراجع عنها.", "descriptionRollback": "اختر ملفات داخل الدليل {path} للتراجع عنها.",
"descriptionDelete": "اختر ملفات داخل الدليل {path} لحذفها. لا يمكن التراجع عن هذا الإجراء.",
"descriptionFallback": "اختر ملفات للمتابعة.", "descriptionFallback": "اختر ملفات للمتابعة.",
"selectionCount": "تم تحديد {selected} / {total} ملف", "selectionCount": "تم تحديد {selected} / {total} ملف",
"selectAll": "تحديد الكل", "selectAll": "تحديد الكل",
@@ -1030,6 +1036,13 @@
"descriptionFallback": "التراجع عن التغييرات المحلية؟", "descriptionFallback": "التراجع عن التغييرات المحلية؟",
"kindDirectory": "الدليل", "kindDirectory": "الدليل",
"kindFile": "الملف" "kindFile": "الملف"
},
"deleteConfirm": {
"title": "تأكيد الحذف",
"descriptionWithTarget": "حذف {kind} \"{name}\"؟ لا يمكن التراجع عن هذا الإجراء.",
"descriptionFallback": "لا يمكن التراجع عن هذا الإجراء.",
"kindDirectory": "الدليل",
"kindFile": "الملف"
} }
}, },
"tabContext": { "tabContext": {

View File

@@ -1001,7 +1001,8 @@
"actions": { "actions": {
"commitCode": "Code committen", "commitCode": "Code committen",
"rollback": "Zurücksetzen", "rollback": "Zurücksetzen",
"addToVcs": "Zu VCS hinzufügen" "addToVcs": "Zu VCS hinzufügen",
"delete": "Löschen"
}, },
"toasts": { "toasts": {
"noAddableFilesInDir": "Keine geänderten Dateien in diesem Verzeichnis können zu VCS hinzugefügt werden", "noAddableFilesInDir": "Keine geänderten Dateien in diesem Verzeichnis können zu VCS hinzugefügt werden",
@@ -1012,11 +1013,16 @@
"rolledBack": "{name} zurückgesetzt", "rolledBack": "{name} zurückgesetzt",
"rollbackFailed": "Rollback fehlgeschlagen", "rollbackFailed": "Rollback fehlgeschlagen",
"addedFilesToVcs": "{count, plural, one {# Datei} other {# Dateien}} zu VCS hinzugefügt", "addedFilesToVcs": "{count, plural, one {# Datei} other {# Dateien}} zu VCS hinzugefügt",
"rolledBackFiles": "{count, plural, one {# Datei zurückgesetzt} other {# Dateien zurückgesetzt}}" "rolledBackFiles": "{count, plural, one {# Datei zurückgesetzt} other {# Dateien zurückgesetzt}}",
"deleted": "{name} gelöscht",
"deleteFailed": "Löschen fehlgeschlagen",
"deletedFiles": "{count} Dateien gelöscht",
"noDeletableFilesInDir": "In diesem Verzeichnis gibt es keine löschbaren geänderten Dateien"
}, },
"directoryDialog": { "directoryDialog": {
"descriptionAdd": "Dateien unter Verzeichnis {path} auswählen, um sie zu VCS hinzuzufügen.", "descriptionAdd": "Dateien unter Verzeichnis {path} auswählen, um sie zu VCS hinzuzufügen.",
"descriptionRollback": "Dateien unter Verzeichnis {path} auswählen, um sie zurückzusetzen.", "descriptionRollback": "Dateien unter Verzeichnis {path} auswählen, um sie zurückzusetzen.",
"descriptionDelete": "Dateien unter Verzeichnis {path} auswählen, um sie zu löschen. Diese Aktion kann nicht rückgängig gemacht werden.",
"descriptionFallback": "Dateien auswählen, um fortzufahren.", "descriptionFallback": "Dateien auswählen, um fortzufahren.",
"selectionCount": "{selected} / {total} Dateien ausgewählt", "selectionCount": "{selected} / {total} Dateien ausgewählt",
"selectAll": "Alle auswählen", "selectAll": "Alle auswählen",
@@ -1030,6 +1036,13 @@
"descriptionFallback": "Lokale Änderungen zurücksetzen?", "descriptionFallback": "Lokale Änderungen zurücksetzen?",
"kindDirectory": "Verzeichnis", "kindDirectory": "Verzeichnis",
"kindFile": "Datei" "kindFile": "Datei"
},
"deleteConfirm": {
"title": "Löschen bestätigen",
"descriptionWithTarget": "{kind} \"{name}\" löschen? Diese Aktion kann nicht rückgängig gemacht werden.",
"descriptionFallback": "Diese Aktion kann nicht rückgängig gemacht werden.",
"kindDirectory": "Verzeichnis",
"kindFile": "Datei"
} }
}, },
"tabContext": { "tabContext": {

View File

@@ -1001,7 +1001,8 @@
"actions": { "actions": {
"commitCode": "Commit code", "commitCode": "Commit code",
"rollback": "Rollback", "rollback": "Rollback",
"addToVcs": "Add to VCS" "addToVcs": "Add to VCS",
"delete": "Delete"
}, },
"toasts": { "toasts": {
"noAddableFilesInDir": "No changed files in this directory can be added to VCS", "noAddableFilesInDir": "No changed files in this directory can be added to VCS",
@@ -1012,11 +1013,16 @@
"rolledBack": "Rolled back {name}", "rolledBack": "Rolled back {name}",
"rollbackFailed": "Rollback failed", "rollbackFailed": "Rollback failed",
"addedFilesToVcs": "Added {count, plural, one {# file} other {# files}} to VCS", "addedFilesToVcs": "Added {count, plural, one {# file} other {# files}} to VCS",
"rolledBackFiles": "Rolled back {count, plural, one {# file} other {# files}}" "rolledBackFiles": "Rolled back {count, plural, one {# file} other {# files}}",
"deleted": "Deleted {name}",
"deleteFailed": "Delete failed",
"deletedFiles": "Deleted {count, plural, one {# file} other {# files}}",
"noDeletableFilesInDir": "No changed files in this directory can be deleted"
}, },
"directoryDialog": { "directoryDialog": {
"descriptionAdd": "Select files under directory {path} to add to VCS.", "descriptionAdd": "Select files under directory {path} to add to VCS.",
"descriptionRollback": "Select files under directory {path} to roll back.", "descriptionRollback": "Select files under directory {path} to roll back.",
"descriptionDelete": "Select files under directory {path} to delete. This action cannot be undone.",
"descriptionFallback": "Select files to proceed.", "descriptionFallback": "Select files to proceed.",
"selectionCount": "Selected {selected} / {total} files", "selectionCount": "Selected {selected} / {total} files",
"selectAll": "Select all", "selectAll": "Select all",
@@ -1030,6 +1036,13 @@
"descriptionFallback": "Roll back local changes?", "descriptionFallback": "Roll back local changes?",
"kindDirectory": "directory", "kindDirectory": "directory",
"kindFile": "file" "kindFile": "file"
},
"deleteConfirm": {
"title": "Confirm deletion",
"descriptionWithTarget": "Delete {kind} \"{name}\"? This action cannot be undone.",
"descriptionFallback": "This action cannot be undone.",
"kindDirectory": "directory",
"kindFile": "file"
} }
}, },
"tabContext": { "tabContext": {

View File

@@ -1001,7 +1001,8 @@
"actions": { "actions": {
"commitCode": "Hacer commit del código", "commitCode": "Hacer commit del código",
"rollback": "Revertir", "rollback": "Revertir",
"addToVcs": "Añadir a VCS" "addToVcs": "Añadir a VCS",
"delete": "Eliminar"
}, },
"toasts": { "toasts": {
"noAddableFilesInDir": "No hay archivos cambiados en este directorio para añadir a VCS", "noAddableFilesInDir": "No hay archivos cambiados en este directorio para añadir a VCS",
@@ -1012,11 +1013,16 @@
"rolledBack": "Se revirtió {name}", "rolledBack": "Se revirtió {name}",
"rollbackFailed": "Error al revertir", "rollbackFailed": "Error al revertir",
"addedFilesToVcs": "Se añadieron {count, plural, one {# archivo} other {# archivos}} a VCS", "addedFilesToVcs": "Se añadieron {count, plural, one {# archivo} other {# archivos}} a VCS",
"rolledBackFiles": "Se revirtieron {count, plural, one {# archivo} other {# archivos}}" "rolledBackFiles": "Se revirtieron {count, plural, one {# archivo} other {# archivos}}",
"deleted": "Se eliminó {name}",
"deleteFailed": "Error al eliminar",
"deletedFiles": "Se eliminaron {count} archivos",
"noDeletableFilesInDir": "No hay archivos modificados en este directorio que se puedan eliminar"
}, },
"directoryDialog": { "directoryDialog": {
"descriptionAdd": "Selecciona archivos bajo el directorio {path} para añadir a VCS.", "descriptionAdd": "Selecciona archivos bajo el directorio {path} para añadir a VCS.",
"descriptionRollback": "Selecciona archivos bajo el directorio {path} para revertir.", "descriptionRollback": "Selecciona archivos bajo el directorio {path} para revertir.",
"descriptionDelete": "Selecciona archivos bajo el directorio {path} para eliminar. Esta acción no se puede deshacer.",
"descriptionFallback": "Selecciona archivos para continuar.", "descriptionFallback": "Selecciona archivos para continuar.",
"selectionCount": "Seleccionados {selected} / {total} archivos", "selectionCount": "Seleccionados {selected} / {total} archivos",
"selectAll": "Seleccionar todo", "selectAll": "Seleccionar todo",
@@ -1030,6 +1036,13 @@
"descriptionFallback": "¿Revertir cambios locales?", "descriptionFallback": "¿Revertir cambios locales?",
"kindDirectory": "directorio", "kindDirectory": "directorio",
"kindFile": "archivo" "kindFile": "archivo"
},
"deleteConfirm": {
"title": "Confirmar eliminación",
"descriptionWithTarget": "¿Eliminar {kind} \"{name}\"? Esta acción no se puede deshacer.",
"descriptionFallback": "Esta acción no se puede deshacer.",
"kindDirectory": "directorio",
"kindFile": "archivo"
} }
}, },
"tabContext": { "tabContext": {

View File

@@ -1001,7 +1001,8 @@
"actions": { "actions": {
"commitCode": "Commit du code", "commitCode": "Commit du code",
"rollback": "Annuler", "rollback": "Annuler",
"addToVcs": "Ajouter à VCS" "addToVcs": "Ajouter à VCS",
"delete": "Supprimer"
}, },
"toasts": { "toasts": {
"noAddableFilesInDir": "Aucun fichier modifié de ce répertoire ne peut être ajouté à VCS", "noAddableFilesInDir": "Aucun fichier modifié de ce répertoire ne peut être ajouté à VCS",
@@ -1012,11 +1013,16 @@
"rolledBack": "{name} restauré", "rolledBack": "{name} restauré",
"rollbackFailed": "Échec du rollback", "rollbackFailed": "Échec du rollback",
"addedFilesToVcs": "{count, plural, one {# fichier} other {# fichiers}} ajouté(s) à VCS", "addedFilesToVcs": "{count, plural, one {# fichier} other {# fichiers}} ajouté(s) à VCS",
"rolledBackFiles": "{count, plural, one {# fichier restauré} other {# fichiers restaurés}}" "rolledBackFiles": "{count, plural, one {# fichier restauré} other {# fichiers restaurés}}",
"deleted": "{name} supprimé",
"deleteFailed": "Échec de la suppression",
"deletedFiles": "{count} fichiers supprimés",
"noDeletableFilesInDir": "Aucun fichier modifié dans ce répertoire ne peut être supprimé"
}, },
"directoryDialog": { "directoryDialog": {
"descriptionAdd": "Sélectionnez les fichiers du répertoire {path} à ajouter à VCS.", "descriptionAdd": "Sélectionnez les fichiers du répertoire {path} à ajouter à VCS.",
"descriptionRollback": "Sélectionnez les fichiers du répertoire {path} à rollback.", "descriptionRollback": "Sélectionnez les fichiers du répertoire {path} à rollback.",
"descriptionDelete": "Sélectionnez les fichiers du répertoire {path} à supprimer. Cette action est irréversible.",
"descriptionFallback": "Sélectionnez les fichiers pour continuer.", "descriptionFallback": "Sélectionnez les fichiers pour continuer.",
"selectionCount": "{selected} / {total} fichiers sélectionnés", "selectionCount": "{selected} / {total} fichiers sélectionnés",
"selectAll": "Tout sélectionner", "selectAll": "Tout sélectionner",
@@ -1030,6 +1036,13 @@
"descriptionFallback": "Rollback des changements locaux ?", "descriptionFallback": "Rollback des changements locaux ?",
"kindDirectory": "répertoire", "kindDirectory": "répertoire",
"kindFile": "fichier" "kindFile": "fichier"
},
"deleteConfirm": {
"title": "Confirmer la suppression",
"descriptionWithTarget": "Supprimer {kind} \"{name}\" ? Cette action est irréversible.",
"descriptionFallback": "Cette action est irréversible.",
"kindDirectory": "répertoire",
"kindFile": "fichier"
} }
}, },
"tabContext": { "tabContext": {

View File

@@ -1001,7 +1001,8 @@
"actions": { "actions": {
"commitCode": "コードをコミット", "commitCode": "コードをコミット",
"rollback": "ロールバック", "rollback": "ロールバック",
"addToVcs": "VCS に追加" "addToVcs": "VCS に追加",
"delete": "削除"
}, },
"toasts": { "toasts": {
"noAddableFilesInDir": "このディレクトリには VCS に追加できる変更ファイルがありません", "noAddableFilesInDir": "このディレクトリには VCS に追加できる変更ファイルがありません",
@@ -1012,11 +1013,16 @@
"rolledBack": "{name} をロールバックしました", "rolledBack": "{name} をロールバックしました",
"rollbackFailed": "ロールバックに失敗しました", "rollbackFailed": "ロールバックに失敗しました",
"addedFilesToVcs": "{count, plural, one {# 個のファイルを VCS に追加} other {# 個のファイルを VCS に追加}}", "addedFilesToVcs": "{count, plural, one {# 個のファイルを VCS に追加} other {# 個のファイルを VCS に追加}}",
"rolledBackFiles": "{count, plural, one {# 個のファイルをロールバック} other {# 個のファイルをロールバック}}" "rolledBackFiles": "{count, plural, one {# 個のファイルをロールバック} other {# 個のファイルをロールバック}}",
"deleted": "{name} を削除しました",
"deleteFailed": "削除に失敗しました",
"deletedFiles": "{count} 個のファイルを削除しました",
"noDeletableFilesInDir": "このディレクトリには削除可能な変更ファイルがありません"
}, },
"directoryDialog": { "directoryDialog": {
"descriptionAdd": "ディレクトリ {path} 配下で VCS に追加するファイルを選択してください。", "descriptionAdd": "ディレクトリ {path} 配下で VCS に追加するファイルを選択してください。",
"descriptionRollback": "ディレクトリ {path} 配下でロールバックするファイルを選択してください。", "descriptionRollback": "ディレクトリ {path} 配下でロールバックするファイルを選択してください。",
"descriptionDelete": "ディレクトリ {path} 配下で削除するファイルを選択してください。この操作は元に戻せません。",
"descriptionFallback": "続行するファイルを選択してください。", "descriptionFallback": "続行するファイルを選択してください。",
"selectionCount": "{selected} / {total} を選択", "selectionCount": "{selected} / {total} を選択",
"selectAll": "すべて選択", "selectAll": "すべて選択",
@@ -1030,6 +1036,13 @@
"descriptionFallback": "ローカル変更をロールバックしますか?", "descriptionFallback": "ローカル変更をロールバックしますか?",
"kindDirectory": "ディレクトリ", "kindDirectory": "ディレクトリ",
"kindFile": "ファイル" "kindFile": "ファイル"
},
"deleteConfirm": {
"title": "削除の確認",
"descriptionWithTarget": "{kind}「{name}」を削除しますか?この操作は元に戻せません。",
"descriptionFallback": "この操作は元に戻せません。",
"kindDirectory": "ディレクトリ",
"kindFile": "ファイル"
} }
}, },
"tabContext": { "tabContext": {

View File

@@ -1001,7 +1001,8 @@
"actions": { "actions": {
"commitCode": "코드 커밋", "commitCode": "코드 커밋",
"rollback": "롤백", "rollback": "롤백",
"addToVcs": "VCS에 추가" "addToVcs": "VCS에 추가",
"delete": "삭제"
}, },
"toasts": { "toasts": {
"noAddableFilesInDir": "이 디렉터리에는 VCS에 추가할 수 있는 변경 파일이 없습니다", "noAddableFilesInDir": "이 디렉터리에는 VCS에 추가할 수 있는 변경 파일이 없습니다",
@@ -1012,11 +1013,16 @@
"rolledBack": "{name}을(를) 롤백했습니다", "rolledBack": "{name}을(를) 롤백했습니다",
"rollbackFailed": "롤백에 실패했습니다", "rollbackFailed": "롤백에 실패했습니다",
"addedFilesToVcs": "{count, plural, one {#개 파일을 VCS에 추가} other {#개 파일을 VCS에 추가}}", "addedFilesToVcs": "{count, plural, one {#개 파일을 VCS에 추가} other {#개 파일을 VCS에 추가}}",
"rolledBackFiles": "{count, plural, one {#개 파일 롤백} other {#개 파일 롤백}}" "rolledBackFiles": "{count, plural, one {#개 파일 롤백} other {#개 파일 롤백}}",
"deleted": "{name}이(가) 삭제되었습니다",
"deleteFailed": "삭제에 실패했습니다",
"deletedFiles": "{count}개 파일을 삭제했습니다",
"noDeletableFilesInDir": "이 디렉터리에서 삭제할 수 있는 변경된 파일이 없습니다"
}, },
"directoryDialog": { "directoryDialog": {
"descriptionAdd": "디렉터리 {path} 아래에서 VCS에 추가할 파일을 선택하세요.", "descriptionAdd": "디렉터리 {path} 아래에서 VCS에 추가할 파일을 선택하세요.",
"descriptionRollback": "디렉터리 {path} 아래에서 롤백할 파일을 선택하세요.", "descriptionRollback": "디렉터리 {path} 아래에서 롤백할 파일을 선택하세요.",
"descriptionDelete": "디렉터리 {path} 아래에서 삭제할 파일을 선택하세요. 이 작업은 되돌릴 수 없습니다.",
"descriptionFallback": "계속 진행할 파일을 선택하세요.", "descriptionFallback": "계속 진행할 파일을 선택하세요.",
"selectionCount": "{selected} / {total} 선택됨", "selectionCount": "{selected} / {total} 선택됨",
"selectAll": "모두 선택", "selectAll": "모두 선택",
@@ -1030,6 +1036,13 @@
"descriptionFallback": "로컬 변경 사항을 롤백할까요?", "descriptionFallback": "로컬 변경 사항을 롤백할까요?",
"kindDirectory": "디렉터리", "kindDirectory": "디렉터리",
"kindFile": "파일" "kindFile": "파일"
},
"deleteConfirm": {
"title": "삭제 확인",
"descriptionWithTarget": "{kind} \"{name}\"을(를) 삭제할까요? 이 작업은 되돌릴 수 없습니다.",
"descriptionFallback": "이 작업은 되돌릴 수 없습니다.",
"kindDirectory": "디렉터리",
"kindFile": "파일"
} }
}, },
"tabContext": { "tabContext": {

View File

@@ -1001,7 +1001,8 @@
"actions": { "actions": {
"commitCode": "Commit do código", "commitCode": "Commit do código",
"rollback": "Reverter", "rollback": "Reverter",
"addToVcs": "Adicionar ao VCS" "addToVcs": "Adicionar ao VCS",
"delete": "Excluir"
}, },
"toasts": { "toasts": {
"noAddableFilesInDir": "Nenhum arquivo alterado neste diretório pode ser adicionado ao VCS", "noAddableFilesInDir": "Nenhum arquivo alterado neste diretório pode ser adicionado ao VCS",
@@ -1012,11 +1013,16 @@
"rolledBack": "{name} revertido", "rolledBack": "{name} revertido",
"rollbackFailed": "Falha no rollback", "rollbackFailed": "Falha no rollback",
"addedFilesToVcs": "{count, plural, one {# arquivo} other {# arquivos}} adicionados ao VCS", "addedFilesToVcs": "{count, plural, one {# arquivo} other {# arquivos}} adicionados ao VCS",
"rolledBackFiles": "{count, plural, one {# arquivo revertido} other {# arquivos revertidos}}" "rolledBackFiles": "{count, plural, one {# arquivo revertido} other {# arquivos revertidos}}",
"deleted": "{name} excluído",
"deleteFailed": "Falha ao excluir",
"deletedFiles": "{count} arquivos excluídos",
"noDeletableFilesInDir": "Nenhum arquivo alterado neste diretório pode ser excluído"
}, },
"directoryDialog": { "directoryDialog": {
"descriptionAdd": "Selecione arquivos sob o diretório {path} para adicionar ao VCS.", "descriptionAdd": "Selecione arquivos sob o diretório {path} para adicionar ao VCS.",
"descriptionRollback": "Selecione arquivos sob o diretório {path} para reverter.", "descriptionRollback": "Selecione arquivos sob o diretório {path} para reverter.",
"descriptionDelete": "Selecione arquivos no diretório {path} para excluir. Esta ação não pode ser desfeita.",
"descriptionFallback": "Selecione arquivos para prosseguir.", "descriptionFallback": "Selecione arquivos para prosseguir.",
"selectionCount": "Selecionados {selected} / {total} arquivos", "selectionCount": "Selecionados {selected} / {total} arquivos",
"selectAll": "Selecionar todos", "selectAll": "Selecionar todos",
@@ -1030,6 +1036,13 @@
"descriptionFallback": "Reverter alterações locais?", "descriptionFallback": "Reverter alterações locais?",
"kindDirectory": "diretório", "kindDirectory": "diretório",
"kindFile": "arquivo" "kindFile": "arquivo"
},
"deleteConfirm": {
"title": "Confirmar exclusão",
"descriptionWithTarget": "Excluir {kind} \"{name}\"? Esta ação não pode ser desfeita.",
"descriptionFallback": "Esta ação não pode ser desfeita.",
"kindDirectory": "diretório",
"kindFile": "arquivo"
} }
}, },
"tabContext": { "tabContext": {

View File

@@ -1001,7 +1001,8 @@
"actions": { "actions": {
"commitCode": "提交代码", "commitCode": "提交代码",
"rollback": "回滚", "rollback": "回滚",
"addToVcs": "添加到 VCS" "addToVcs": "添加到 VCS",
"delete": "删除"
}, },
"toasts": { "toasts": {
"noAddableFilesInDir": "该目录下没有可添加到 VCS 的变更文件", "noAddableFilesInDir": "该目录下没有可添加到 VCS 的变更文件",
@@ -1012,11 +1013,16 @@
"rolledBack": "已回滚 {name}", "rolledBack": "已回滚 {name}",
"rollbackFailed": "回滚失败", "rollbackFailed": "回滚失败",
"addedFilesToVcs": "已添加 {count} 个文件到 VCS", "addedFilesToVcs": "已添加 {count} 个文件到 VCS",
"rolledBackFiles": "已回滚 {count} 个文件" "rolledBackFiles": "已回滚 {count} 个文件",
"deleted": "已删除 {name}",
"deleteFailed": "删除失败",
"deletedFiles": "已删除 {count} 个文件",
"noDeletableFilesInDir": "该目录下没有可删除的变更文件"
}, },
"directoryDialog": { "directoryDialog": {
"descriptionAdd": "选择目录 {path} 下要添加到 VCS 的文件。", "descriptionAdd": "选择目录 {path} 下要添加到 VCS 的文件。",
"descriptionRollback": "选择目录 {path} 下要回滚的文件。", "descriptionRollback": "选择目录 {path} 下要回滚的文件。",
"descriptionDelete": "选择目录 {path} 下要删除的文件。此操作不可撤销。",
"descriptionFallback": "选择要操作的文件。", "descriptionFallback": "选择要操作的文件。",
"selectionCount": "已选择 {selected} / {total} 个文件", "selectionCount": "已选择 {selected} / {total} 个文件",
"selectAll": "全选", "selectAll": "全选",
@@ -1030,6 +1036,13 @@
"descriptionFallback": "确定回滚本地修改吗?", "descriptionFallback": "确定回滚本地修改吗?",
"kindDirectory": "目录", "kindDirectory": "目录",
"kindFile": "文件" "kindFile": "文件"
},
"deleteConfirm": {
"title": "确认删除",
"descriptionWithTarget": "确定删除{kind}「{name}」吗?此操作不可撤销。",
"descriptionFallback": "确定删除吗?此操作不可撤销。",
"kindDirectory": "目录",
"kindFile": "文件"
} }
}, },
"tabContext": { "tabContext": {

View File

@@ -1001,7 +1001,8 @@
"actions": { "actions": {
"commitCode": "提交程式碼", "commitCode": "提交程式碼",
"rollback": "回滾", "rollback": "回滾",
"addToVcs": "加入到 VCS" "addToVcs": "加入到 VCS",
"delete": "刪除"
}, },
"toasts": { "toasts": {
"noAddableFilesInDir": "該目錄下沒有可加入到 VCS 的變更檔案", "noAddableFilesInDir": "該目錄下沒有可加入到 VCS 的變更檔案",
@@ -1012,11 +1013,16 @@
"rolledBack": "已回滾 {name}", "rolledBack": "已回滾 {name}",
"rollbackFailed": "回滾失敗", "rollbackFailed": "回滾失敗",
"addedFilesToVcs": "已加入 {count} 個檔案到 VCS", "addedFilesToVcs": "已加入 {count} 個檔案到 VCS",
"rolledBackFiles": "已回滾 {count} 個檔案" "rolledBackFiles": "已回滾 {count} 個檔案",
"deleted": "已刪除 {name}",
"deleteFailed": "刪除失敗",
"deletedFiles": "已刪除 {count} 個檔案",
"noDeletableFilesInDir": "此目錄下沒有可刪除的變更檔案"
}, },
"directoryDialog": { "directoryDialog": {
"descriptionAdd": "選擇目錄 {path} 下要加入到 VCS 的檔案。", "descriptionAdd": "選擇目錄 {path} 下要加入到 VCS 的檔案。",
"descriptionRollback": "選擇目錄 {path} 下要回滾的檔案。", "descriptionRollback": "選擇目錄 {path} 下要回滾的檔案。",
"descriptionDelete": "選擇目錄 {path} 下要刪除的檔案。此操作不可撤銷。",
"descriptionFallback": "選擇要操作的檔案。", "descriptionFallback": "選擇要操作的檔案。",
"selectionCount": "已選擇 {selected} / {total} 個檔案", "selectionCount": "已選擇 {selected} / {total} 個檔案",
"selectAll": "全選", "selectAll": "全選",
@@ -1030,6 +1036,13 @@
"descriptionFallback": "確定回滾本地修改嗎?", "descriptionFallback": "確定回滾本地修改嗎?",
"kindDirectory": "目錄", "kindDirectory": "目錄",
"kindFile": "檔案" "kindFile": "檔案"
},
"deleteConfirm": {
"title": "確認刪除",
"descriptionWithTarget": "確定刪除{kind}「{name}」嗎?此操作無法撤銷。",
"descriptionFallback": "此操作無法撤銷。",
"kindDirectory": "目錄",
"kindFile": "檔案"
} }
}, },
"tabContext": { "tabContext": {