Merge remote-tracking branch 'origin/main'
This commit is contained in:
@@ -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
2
src-tauri/Cargo.lock
generated
@@ -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",
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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())
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -1563,38 +1563,44 @@ export function FileWorkspacePanel() {
|
|||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
<div className="flex-1 min-h-0">
|
<div className="flex-1 min-h-0">
|
||||||
<MonacoEditor
|
{activeFileTab.loading ? (
|
||||||
beforeMount={defineMonacoThemes}
|
<div className="h-full flex items-center justify-center text-xs text-muted-foreground">
|
||||||
onMount={handleEditorMount}
|
{t("loadingEditor")}
|
||||||
path={buildMonacoModelPath(activeFileTab.path, activeFileTab.id)}
|
</div>
|
||||||
value={renderedContent}
|
) : (
|
||||||
onChange={(value) => {
|
<MonacoEditor
|
||||||
if (!isFileTab) return
|
beforeMount={defineMonacoThemes}
|
||||||
updateActiveFileContent(value ?? "")
|
onMount={handleEditorMount}
|
||||||
}}
|
path={buildMonacoModelPath(activeFileTab.path, activeFileTab.id)}
|
||||||
language={activeFileTab.language}
|
value={renderedContent}
|
||||||
theme={editorTheme}
|
onChange={(value) => {
|
||||||
loading={
|
if (!isFileTab) return
|
||||||
<div className="h-full flex items-center justify-center text-xs text-muted-foreground">
|
updateActiveFileContent(value ?? "")
|
||||||
{t("loadingEditor")}
|
}}
|
||||||
</div>
|
language={activeFileTab.language}
|
||||||
}
|
theme={editorTheme}
|
||||||
options={{
|
loading={
|
||||||
readOnly: !canEdit,
|
<div className="h-full flex items-center justify-center text-xs text-muted-foreground">
|
||||||
minimap: { enabled: false },
|
{t("loadingEditor")}
|
||||||
automaticLayout: true,
|
</div>
|
||||||
fontSize: 13,
|
}
|
||||||
lineNumbersMinChars,
|
options={{
|
||||||
lineDecorationsWidth: 10,
|
readOnly: !canEdit,
|
||||||
wordWrap: "off",
|
minimap: { enabled: false },
|
||||||
scrollBeyondLastLine: false,
|
automaticLayout: true,
|
||||||
scrollBeyondLastColumn: 8,
|
fontSize: 13,
|
||||||
renderLineHighlight: "line",
|
lineNumbersMinChars,
|
||||||
scrollbar: {
|
lineDecorationsWidth: 10,
|
||||||
horizontal: "auto",
|
wordWrap: "off",
|
||||||
},
|
scrollBeyondLastLine: false,
|
||||||
}}
|
scrollBeyondLastColumn: 8,
|
||||||
/>
|
renderLineHighlight: "line",
|
||||||
|
scrollbar: {
|
||||||
|
horizontal: "auto",
|
||||||
|
},
|
||||||
|
}}
|
||||||
|
/>
|
||||||
|
)}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -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)
|
||||||
}}
|
}}
|
||||||
|
|||||||
@@ -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,7 +751,9 @@ export function GitChangesTab() {
|
|||||||
toast.info(
|
toast.info(
|
||||||
action === "add"
|
action === "add"
|
||||||
? t("toasts.noAddableFilesInDir")
|
? t("toasts.noAddableFilesInDir")
|
||||||
: t("toasts.noRollbackFilesInDir")
|
: isDeleteAction(action)
|
||||||
|
? t("toasts.noDeletableFilesInDir")
|
||||||
|
: 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,7 +934,9 @@ export function GitChangesTab() {
|
|||||||
toast.error(
|
toast.error(
|
||||||
directoryGitActionType === "add"
|
directoryGitActionType === "add"
|
||||||
? t("toasts.addToVcsFailed")
|
? t("toasts.addToVcsFailed")
|
||||||
: t("toasts.rollbackFailed"),
|
: isDeleteAction(directoryGitActionType)
|
||||||
|
? t("toasts.deleteFailed")
|
||||||
|
: 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,7 +1537,10 @@ export function GitChangesTab() {
|
|||||||
<DialogTitle>
|
<DialogTitle>
|
||||||
{directoryGitActionType === "add"
|
{directoryGitActionType === "add"
|
||||||
? t("actions.addToVcs")
|
? t("actions.addToVcs")
|
||||||
: t("actions.rollback")}
|
: directoryGitActionType &&
|
||||||
|
isDeleteAction(directoryGitActionType)
|
||||||
|
? t("actions.delete")
|
||||||
|
: t("actions.rollback")}
|
||||||
</DialogTitle>
|
</DialogTitle>
|
||||||
<DialogDescription>
|
<DialogDescription>
|
||||||
{directoryGitActionTarget
|
{directoryGitActionTarget
|
||||||
@@ -1412,9 +1548,14 @@ export function GitChangesTab() {
|
|||||||
? t("directoryDialog.descriptionAdd", {
|
? t("directoryDialog.descriptionAdd", {
|
||||||
path: directoryGitActionTarget.path,
|
path: directoryGitActionTarget.path,
|
||||||
})
|
})
|
||||||
: t("directoryDialog.descriptionRollback", {
|
: directoryGitActionType &&
|
||||||
path: directoryGitActionTarget.path,
|
isDeleteAction(directoryGitActionType)
|
||||||
})
|
? t("directoryDialog.descriptionDelete", {
|
||||||
|
path: directoryGitActionTarget.path,
|
||||||
|
})
|
||||||
|
: t("directoryDialog.descriptionRollback", {
|
||||||
|
path: directoryGitActionTarget.path,
|
||||||
|
})
|
||||||
: t("directoryDialog.descriptionFallback")}
|
: t("directoryDialog.descriptionFallback")}
|
||||||
</DialogDescription>
|
</DialogDescription>
|
||||||
</DialogHeader>
|
</DialogHeader>
|
||||||
@@ -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>
|
||||||
<span className="shrink-0 text-muted-foreground">
|
{entry.status !== UNTRACKED_STATUS && (
|
||||||
{entry.status}
|
<span className="shrink-0 text-muted-foreground">
|
||||||
</span>
|
{entry.status}
|
||||||
|
</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,7 +1659,10 @@ export function GitChangesTab() {
|
|||||||
>
|
>
|
||||||
{directoryGitActionType === "add"
|
{directoryGitActionType === "add"
|
||||||
? t("actions.addToVcs")
|
? t("actions.addToVcs")
|
||||||
: t("actions.rollback")}
|
: directoryGitActionType &&
|
||||||
|
isDeleteAction(directoryGitActionType)
|
||||||
|
? t("actions.delete")
|
||||||
|
: t("actions.rollback")}
|
||||||
</Button>
|
</Button>
|
||||||
</DialogFooter>
|
</DialogFooter>
|
||||||
</div>
|
</div>
|
||||||
@@ -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>
|
||||||
</>
|
</>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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": {
|
||||||
|
|||||||
@@ -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": {
|
||||||
|
|||||||
@@ -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": {
|
||||||
|
|||||||
@@ -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": {
|
||||||
|
|||||||
@@ -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": {
|
||||||
|
|||||||
@@ -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": {
|
||||||
|
|||||||
@@ -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": {
|
||||||
|
|||||||
@@ -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": {
|
||||||
|
|||||||
@@ -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": {
|
||||||
|
|||||||
@@ -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": {
|
||||||
|
|||||||
Reference in New Issue
Block a user