diff --git a/frontend/src/FileManager/Actions/UploadFile/UploadFile.action.jsx b/frontend/src/FileManager/Actions/UploadFile/UploadFile.action.jsx index 465b2560..c96832a6 100644 --- a/frontend/src/FileManager/Actions/UploadFile/UploadFile.action.jsx +++ b/frontend/src/FileManager/Actions/UploadFile/UploadFile.action.jsx @@ -1,8 +1,10 @@ import { useRef, useState } from "react"; +import PropTypes from "prop-types"; import Button from "../../../components/Button/Button"; import { AiOutlineCloudUpload } from "react-icons/ai"; import UploadItem from "./UploadItem"; import Loader from "../../../components/Loader/Loader"; +import OverwriteConfirmDialog from "../../../components/OverwriteConfirmDialog/OverwriteConfirmDialog"; import { useFileNavigation } from "../../../contexts/FileNavigationContext"; import { getFileExtension } from "../../../utils/getFileExtension"; import { getDataSize } from "../../../utils/getDataSize"; @@ -20,6 +22,9 @@ const UploadFileAction = ({ const [files, setFiles] = useState([]); const [isDragging, setIsDragging] = useState(false); const [isUploading, setIsUploading] = useState({}); + const [showOverwriteDialog, setShowOverwriteDialog] = useState(false); + const [pendingFile, setPendingFile] = useState(null); + const [pendingFilesCallback, setPendingFilesCallback] = useState(null); const { currentFolder, currentPathFiles } = useFileNavigation(); const { onError } = useFiles(); const fileInputRef = useRef(null); @@ -41,31 +46,93 @@ const UploadFileAction = ({ const fileExists = currentPathFiles.some( (item) => item.name.toLowerCase() === file.name.toLowerCase() && !item.isDirectory ); - if (fileExists) return t("fileAlreadyExist"); + if (fileExists) { + const allowOverwrite = fileUploadConfig?.allowOverwrite || false; + if (!allowOverwrite) return t("fileAlreadyExist"); + // If allowOverwrite is true, return special marker to trigger dialog + return "CONFIRM_OVERWRITE"; + } const sizeError = maxFileSize && file.size > maxFileSize; if (sizeError) return `${t("maxUploadSize")} ${getDataSize(maxFileSize, 0)}.`; }; - const setSelectedFiles = (selectedFiles) => { - selectedFiles = selectedFiles.filter( - (item) => - !files.some((fileData) => fileData.file.name.toLowerCase() === item.name.toLowerCase()) - ); + const handleOverwriteConfirm = (selectedFiles) => { + const newFiles = selectedFiles.map((file) => { + const appendData = onFileUploading(file, currentFolder); + return { + file: file, + appendData: appendData, + }; + }); + setFiles((prev) => [...prev, ...newFiles]); + setShowOverwriteDialog(false); + setPendingFile(null); + }; - if (selectedFiles.length > 0) { + const handleOverwriteCancel = () => { + const selectedFiles = pendingFilesCallback; + if (selectedFiles) { const newFiles = selectedFiles.map((file) => { const appendData = onFileUploading(file, currentFolder); - const error = checkFileError(file); - error && onError({ type: "upload", message: error }, file); + onError({ type: "upload", message: t("uploadCanceled") }, file); return { file: file, appendData: appendData, - ...(error && { error: error }), + error: t("uploadCanceled"), }; }); setFiles((prev) => [...prev, ...newFiles]); } + setShowOverwriteDialog(false); + setPendingFile(null); + setPendingFilesCallback(null); + }; + + const setSelectedFiles = (selectedFiles) => { + selectedFiles = selectedFiles.filter( + (item) => + !files.some((fileData) => fileData.file.name.toLowerCase() === item.name.toLowerCase()) + ); + + if (selectedFiles.length > 0) { + const filesNeedingConfirmation = []; + const filesWithoutErrors = []; + + selectedFiles.forEach((file) => { + const error = checkFileError(file); + if (error === "CONFIRM_OVERWRITE") { + filesNeedingConfirmation.push(file); + } else if (!error) { + filesWithoutErrors.push(file); + } else { + // File has other errors, add with error state + const appendData = onFileUploading(file, currentFolder); + onError({ type: "upload", message: error }, file); + filesWithoutErrors.push({ file, appendData, error }); + } + }); + + // Add files without errors immediately + if (filesWithoutErrors.length > 0) { + const newFiles = filesWithoutErrors.map((fileData) => { + const appendData = onFileUploading(fileData.file || fileData, currentFolder); + return { + file: fileData.file || fileData, + appendData: appendData, + ...(fileData.error && { error: fileData.error }), + }; + }); + setFiles((prev) => [...prev, ...newFiles]); + } + + // Show confirmation dialog if there are files needing confirmation + if (filesNeedingConfirmation.length > 0) { + setPendingFile(filesNeedingConfirmation[0]); + setPendingFilesCallback(filesNeedingConfirmation); + setShowOverwriteDialog(true); + } + } }; // Todo: Also validate allowed file extensions on drop @@ -102,6 +169,14 @@ const UploadFileAction = ({ return (
0 ? "file-selcted" : ""}`}> + + handleOverwriteConfirm(pendingFilesCallback) + } + onCancel={handleOverwriteCancel} + />
{ + const t = useTranslation(); + + if (!show) return null; + + return ( +
+
+
+

{t("replaceExistingFile")}

+
+
+

{t("confirmOverwrite")}

+ {fileName &&

{fileName}

} +
+
+ + +
+
+
+ ); +}; + +OverwriteConfirmDialog.propTypes = { + show: PropTypes.bool.isRequired, + fileName: PropTypes.string, + onConfirm: PropTypes.func.isRequired, + onCancel: PropTypes.func.isRequired, +}; + +export default OverwriteConfirmDialog; diff --git a/frontend/src/components/OverwriteConfirmDialog/OverwriteConfirmDialog.scss b/frontend/src/components/OverwriteConfirmDialog/OverwriteConfirmDialog.scss new file mode 100644 index 00000000..3c7a710e --- /dev/null +++ b/frontend/src/components/OverwriteConfirmDialog/OverwriteConfirmDialog.scss @@ -0,0 +1,61 @@ +@import "../../styles/variables"; + +.overwrite-confirm-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.5); + display: flex; + align-items: center; + justify-content: center; + z-index: 1000; +} + +.overwrite-confirm-dialog { + border-radius: 4px; + min-width: 350px; + max-width: 500px; + overflow: hidden; +} + +.dialog-header { + padding: 16px 20px; + border-bottom: 1px solid $border-color; + + h2 { + margin: 0; + font-size: 18px; + font-weight: 600; + } +} + +.dialog-content { + padding: 20px; + + p { + margin: 0 0 12px 0; + font-size: $fm-font-size; + line-height: 1.5; + word-break: break-word; + + &:last-child { + margin-bottom: 0; + } + + &.filename { + font-weight: 600; + padding: 8px; + border-radius: 3px; + } + } +} + +.dialog-actions { + padding: 16px 20px; + border-top: 1px solid $border-color; + display: flex; + gap: 8px; + justify-content: flex-end; +} diff --git a/frontend/src/locales/ar-SA.json b/frontend/src/locales/ar-SA.json index faa5cf14..f486968f 100644 --- a/frontend/src/locales/ar-SA.json +++ b/frontend/src/locales/ar-SA.json @@ -47,6 +47,9 @@ "deleteItemsConfirm": "هل أنت متأكد أنك تريد حذف هذه العناصر {{count}}؟", "percentDone": "{{percent}}% تم", "canceled": "تم الإلغاء", + "replaceExistingFile": "استبدال الملف الموجود", + "confirmOverwrite": "يوجد ملف بهذا الاسم بالفعل. هل تريد استبداله؟", + "uploadCanceled": "تم إلغاء الرفع.", "invalidFileName": "لا يمكن أن يحتوي اسم الملف على أي من الحروف التالية: \\ / : * ? \" < > |", "folderExists": "هذا الموقع يحتوي بالفعل على مجلد باسم \"{{renameFile}}\".", "collapseNavigationPane": "طي لوحة التنقل", diff --git a/frontend/src/locales/da-DK.json b/frontend/src/locales/da-DK.json index c715c887..7f8b93be 100644 --- a/frontend/src/locales/da-DK.json +++ b/frontend/src/locales/da-DK.json @@ -47,6 +47,9 @@ "deleteItemsConfirm": "Er du sikker på, at du vil slette disse {{count}} elementer?", "percentDone": "{{percent}}% færdig", "canceled": "Annulleret", + "replaceExistingFile": "Erstat eksisterende fil", + "confirmOverwrite": "En fil med dette navn eksisterer allerede. Vil du erstatte det?", + "uploadCanceled": "Upload annulleret.", "invalidFileName": "Et filnavn må ikke indeholde følgende tegn: \\ / : * ? \" < > |", "folderExists": "Denne destination indeholder allerede en mappe med navnet \"{{renameFile}}\".", "collapseNavigationPane": "Skjul navigationsrude", diff --git a/frontend/src/locales/de-DE.json b/frontend/src/locales/de-DE.json index e5e03ae2..f526acc3 100644 --- a/frontend/src/locales/de-DE.json +++ b/frontend/src/locales/de-DE.json @@ -47,7 +47,9 @@ "deleteItemsConfirm": "Möchten Sie diese {{count}} Elemente wirklich löschen?", "percentDone": "{{percent}}% erledigt", "canceled": "Abgebrochen", - "invalidFileName": "Ein Dateiname darf keines der folgenden Zeichen enthalten: \\ / : * ? \" < > |", + "replaceExistingFile": "Vorhandene Datei ersetzen", + "confirmOverwrite": "Eine Datei mit diesem Namen existiert bereits. Möchten Sie sie ersetzen?", + "uploadCanceled": "Upload abgebrochen.", "invalidFileName": "Ein Dateiname darf keines der folgenden Zeichen enthalten: \\ / : * ? \" < > |", "folderExists": "In diesem Zielordner gibt es bereits einen Ordner namens \"{{renameFile}}\".", "collapseNavigationPane": "Navigationsbereich einklappen", "expandNavigationPane": "Navigationsbereich erweitern" diff --git a/frontend/src/locales/en-US.json b/frontend/src/locales/en-US.json index 177ce61a..435fa29f 100644 --- a/frontend/src/locales/en-US.json +++ b/frontend/src/locales/en-US.json @@ -47,6 +47,9 @@ "deleteItemsConfirm": "Are you sure you want to delete these {{count}} items?", "percentDone": "{{percent}}% done", "canceled": "Canceled", + "replaceExistingFile": "Replace Existing File", + "confirmOverwrite": "A file with this name already exists. Do you want to replace it?", + "uploadCanceled": "Upload canceled.", "invalidFileName": "A file name can't contain any of the following characters: \\ / : * ? \" < > |", "folderExists": "This destination already contains a folder named \"{{renameFile}}\".", "collapseNavigationPane": "Collapse Navigation Pane", diff --git a/frontend/src/locales/es-ES.json b/frontend/src/locales/es-ES.json index 0f395738..dc0a7c02 100644 --- a/frontend/src/locales/es-ES.json +++ b/frontend/src/locales/es-ES.json @@ -47,6 +47,9 @@ "deleteItemsConfirm": "¿Está seguro de que desea eliminar estos {{count}} elementos?", "percentDone": "{{percent}}% completado", "canceled": "Cancelado", + "replaceExistingFile": "Reemplazar archivo existente", + "confirmOverwrite": "Un archivo con este nombre ya existe. ¿Desea reemplazarlo?", + "uploadCanceled": "Subida cancelada.", "invalidFileName": "Un nombre de archivo no puede contener ninguno de los siguientes caracteres: \\ / : * ? \" < > |", "folderExists": "Ya existe una carpeta llamada \"{{renameFile}}\" en este destino.", "collapseNavigationPane": "Contraer panel de navegación", diff --git a/frontend/src/locales/fa-IR.json b/frontend/src/locales/fa-IR.json index 98cc3b20..93256b75 100644 --- a/frontend/src/locales/fa-IR.json +++ b/frontend/src/locales/fa-IR.json @@ -47,6 +47,9 @@ "deleteItemsConfirm": "آیا مطمئن هستید که می‌خواهید این {{count}} مورد را حذف کنید؟", "percentDone": "{{percent}}% انجام شد", "canceled": "لغو شد", + "replaceExistingFile": "جایگزینی فایل موجود", + "confirmOverwrite": "فایلی با این نام از قبل وجود دارد. آیا می‌خواهید آن را جایگزین کنید؟", + "uploadCanceled": "بارگذاری لغو شد.", "invalidFileName": "نام فایل نمی‌تواند شامل هیچ یک از کاراکترهای زیر باشد: \\ / : * ? \" < > |", "folderExists": "این مقصد از قبل شامل پوشه‌ای به نام \"{{renameFile}}\" است.", "collapseNavigationPane": "بستن پنل ناوبری", diff --git a/frontend/src/locales/fi-FI.json b/frontend/src/locales/fi-FI.json index c7af8f96..7cf55a96 100644 --- a/frontend/src/locales/fi-FI.json +++ b/frontend/src/locales/fi-FI.json @@ -47,6 +47,9 @@ "deleteItemsConfirm": "Haluatko varmasti poistaa nämä {{count}} kohdetta?", "percentDone": "{{percent}}% valmis", "canceled": "Peruutettu", + "replaceExistingFile": "Korvaa olemassa oleva tiedosto", + "confirmOverwrite": "Tiedosto tällä nimellä on jo olemassa. Haluatko korvata sen?", + "uploadCanceled": "Lataus peruutettu.", "invalidFileName": "Tiedostonimessä ei voi olla seuraavia merkkejä: \\ / : * ? \" < > |", "folderExists": "Kohteessa on jo kansio nimeltä \"{{renameFile}}\".", "collapseNavigationPane": "Pienennä navigointipaneeli", diff --git a/frontend/src/locales/fr-FR.json b/frontend/src/locales/fr-FR.json index 43b03bc8..ff42cfe7 100644 --- a/frontend/src/locales/fr-FR.json +++ b/frontend/src/locales/fr-FR.json @@ -47,6 +47,9 @@ "deleteItemsConfirm": "Êtes-vous sûr de vouloir supprimer ces {{count}} éléments ?", "percentDone": "{{percent}}% terminé", "canceled": "Annulé", + "replaceExistingFile": "Remplacer le fichier existant", + "confirmOverwrite": "Un fichier portant ce nom existe déjà. Voulez-vous le remplacer ?", + "uploadCanceled": "Téléversement annulé.", "invalidFileName": "Un nom de fichier ne peut pas contenir les caractères suivants : \\ / : * ? \" < > |", "folderExists": "Cette destination contient déjà un dossier nommé \"{{renameFile}}\".", "collapseNavigationPane": "Réduire le panneau de navigation", diff --git a/frontend/src/locales/he-IL.json b/frontend/src/locales/he-IL.json index 92558280..4581a8a9 100644 --- a/frontend/src/locales/he-IL.json +++ b/frontend/src/locales/he-IL.json @@ -47,6 +47,9 @@ "deleteItemsConfirm": "האם אתה בטוח שברצונך למחוק את {{count}} הפריטים האלו?", "percentDone": "{{percent}}% הושלמו", "canceled": "בוטל", + "replaceExistingFile": "החלפת קובץ קיים", + "confirmOverwrite": "קובץ בשם זה כבר קיים. האם ברצונך להחליף אותו?", + "uploadCanceled": "ההעלאה בוטלה.", "invalidFileName": "שם קובץ לא יכול להכיל את התווים הבאים: \\ / : * ? \" < > |", "folderExists": "כבר קיימת תיקייה בשם \"{{renameFile}}\" במיקום זה.", "collapseNavigationPane": "כווץ את לוח הניווט", diff --git a/frontend/src/locales/hi-IN.json b/frontend/src/locales/hi-IN.json index 22fbbb70..5fbd1e46 100644 --- a/frontend/src/locales/hi-IN.json +++ b/frontend/src/locales/hi-IN.json @@ -47,6 +47,9 @@ "deleteItemsConfirm": "क्या आप वाकई इन {{count}} आइटम्स को हटाना चाहते हैं?", "percentDone": "{{percent}}% पूर्ण", "canceled": "रद्द किया गया", + "replaceExistingFile": "मौजूदा फ़ाइल को बदलें", + "confirmOverwrite": "इस नाम की फ़ाइल पहले से मौजूद है। क्या आप इसे बदलना चाहते हैं?", + "uploadCanceled": "अपलोड रद्द किया गया।", "invalidFileName": "फ़ाइल नाम में निम्नलिखित वर्ण नहीं हो सकते: \\ / : * ? \" < > |", "folderExists": "इस स्थान पर \"{{renameFile}}\" नाम का एक फ़ोल्डर पहले से मौजूद है।", "collapseNavigationPane": "नेविगेशन पैन को संकुचित करें", diff --git a/frontend/src/locales/it-IT.json b/frontend/src/locales/it-IT.json index cee4a6b1..3ad83f28 100644 --- a/frontend/src/locales/it-IT.json +++ b/frontend/src/locales/it-IT.json @@ -47,6 +47,9 @@ "deleteItemsConfirm": "Sei sicuro di voler eliminare questi {{count}} elementi?", "percentDone": "{{percent}}% completato", "canceled": "Annullato", + "replaceExistingFile": "Sostituisci file esistente", + "confirmOverwrite": "Un file con questo nome esiste già. Desideri sostituirlo?", + "uploadCanceled": "Caricamento annullato.", "invalidFileName": "Un nome di file non può contenere nessuno dei seguenti caratteri: \\ / : * ? \" < > |", "folderExists": "Questa destinazione contiene già una cartella chiamata \"{{renameFile}}\".", "collapseNavigationPane": "Comprimi pannello di navigazione", diff --git a/frontend/src/locales/ja-JP.json b/frontend/src/locales/ja-JP.json index 96724bd6..4affe3b3 100644 --- a/frontend/src/locales/ja-JP.json +++ b/frontend/src/locales/ja-JP.json @@ -47,6 +47,9 @@ "deleteItemsConfirm": "{{count}} 件のアイテムを削除してもよろしいですか?", "percentDone": "{{percent}}% 完了", "canceled": "キャンセルしました", + "replaceExistingFile": "既存ファイルを置き換える", + "confirmOverwrite": "このファイル名は既に存在します。置き換えますか?", + "uploadCanceled": "アップロードが中止されました。", "invalidFileName": "ファイル名には以下の文字を含めることはできません:\\ / : * ? \" < > |", "folderExists": "この宛先には \"{{renameFile}}\" という名前のフォルダーがすでに存在します。", "collapseNavigationPane": "ナビゲーションペインを折りたたむ", diff --git a/frontend/src/locales/ko-KR.json b/frontend/src/locales/ko-KR.json index d03b8a3f..f42e9324 100644 --- a/frontend/src/locales/ko-KR.json +++ b/frontend/src/locales/ko-KR.json @@ -47,6 +47,9 @@ "deleteItemsConfirm": "{{count}}개의 항목을 삭제하시겠습니까?", "percentDone": "{{percent}}% 완료", "canceled": "취소됨", + "replaceExistingFile": "기존 파일 바꾸기", + "confirmOverwrite": "이 이름의 파일이 이미 있습니다. 바꾸시겠습니까?", + "uploadCanceled": "업로드가 취소되었습니다.", "invalidFileName": "파일 이름에는 다음 문자를 사용할 수 없습니다: \\ / : * ? \" < > |", "folderExists": "해당 위치에 \"{{renameFile}}\" 폴더가 이미 있습니다.", "collapseNavigationPane": "탐색 창 축소", diff --git a/frontend/src/locales/nb-NO.json b/frontend/src/locales/nb-NO.json index 13f6aa70..c30d26ab 100644 --- a/frontend/src/locales/nb-NO.json +++ b/frontend/src/locales/nb-NO.json @@ -47,6 +47,9 @@ "deleteItemsConfirm": "Er du sikker på at du vil slette disse {{count}} elementene?", "percentDone": "{{percent}}% ferdig", "canceled": "Avbrutt", + "replaceExistingFile": "Erstatt eksisterende fil", + "confirmOverwrite": "En fil med dette navnet eksisterer allerede. Vil du erstatte den?", + "uploadCanceled": "Opplasting avbrutt.", "invalidFileName": "Et filnavn kan ikke inneholde noen av følgende tegn: \\ / : * ? \" < > |", "folderExists": "Denne destinasjonen inneholder allerede en mappe med navnet «{{renameFile}}».", "collapseNavigationPane": "Skjul navigasjonsrute", diff --git a/frontend/src/locales/pl-PL.json b/frontend/src/locales/pl-PL.json index 33ed98bb..3e9b5c9a 100644 --- a/frontend/src/locales/pl-PL.json +++ b/frontend/src/locales/pl-PL.json @@ -47,6 +47,9 @@ "deleteItemsConfirm": "Czy na pewno chcesz usunąć te {{count}} elementy?", "percentDone": "{{percent}}% ukończono", "canceled": "Anulowano", + "replaceExistingFile": "Zastąp istniejący plik", + "confirmOverwrite": "Plik o tej nazwie już istnieje. Czy chcesz go zastąpić?", + "uploadCanceled": "Przesyłanie anulowano.", "invalidFileName": "Nazwa pliku nie może zawierać żadnego z następujących znaków: \\ / : * ? \" < > |", "folderExists": "To miejsce docelowe zawiera już folder o nazwie \"{{renameFile}}\".", "collapseNavigationPane": "Zwiń panel nawigacyjny", diff --git a/frontend/src/locales/pt-BR.json b/frontend/src/locales/pt-BR.json index 40bfb53f..c9e18947 100644 --- a/frontend/src/locales/pt-BR.json +++ b/frontend/src/locales/pt-BR.json @@ -47,6 +47,9 @@ "deleteItemsConfirm": "Tem certeza de que deseja excluir esses {{count}} itens?", "percentDone": "{{percent}}% concluído", "canceled": "Cancelado", + "replaceExistingFile": "Substituir arquivo existente", + "confirmOverwrite": "Um arquivo com esse nome já existe. Deseja substituí-lo?", + "uploadCanceled": "Upload cancelado.", "invalidFileName": "Um nome de arquivo não pode conter nenhum dos seguintes caracteres: \\ / : * ? \" < > |", "folderExists": "Já existe uma pasta com o nome \"{{renameFile}}\" neste local.", "collapseNavigationPane": "Recolher painel de navegação", diff --git a/frontend/src/locales/pt-PT.json b/frontend/src/locales/pt-PT.json index e71da0cc..67802537 100644 --- a/frontend/src/locales/pt-PT.json +++ b/frontend/src/locales/pt-PT.json @@ -47,6 +47,9 @@ "deleteItemsConfirm": "Tem a certeza de que deseja eliminar estes {{count}} itens?", "percentDone": "{{percent}}% concluído", "canceled": "Cancelado", + "replaceExistingFile": "Substituir ficheiro existente", + "confirmOverwrite": "Um ficheiro com esse nome já existe. Deseja substituí-lo?", + "uploadCanceled": "Carregamento cancelado.", "invalidFileName": "O nome do ficheiro não pode conter nenhum dos seguintes caracteres: \\ / : * ? \" < > |", "folderExists": "O destino já contém uma pasta chamada \"{{renameFile}}\".", "collapseNavigationPane": "Recolher painel de navegação", diff --git a/frontend/src/locales/ru-RU.json b/frontend/src/locales/ru-RU.json index aa4ad699..edffb4d1 100644 --- a/frontend/src/locales/ru-RU.json +++ b/frontend/src/locales/ru-RU.json @@ -47,6 +47,9 @@ "deleteItemsConfirm": "Вы уверены, что хотите удалить эти {{count}} элементы?", "percentDone": "{{percent}}% завершено", "canceled": "Отменено", + "replaceExistingFile": "Заменить существующий файл", + "confirmOverwrite": "Файл с таким именем уже существует. Хотите его заменить?", + "uploadCanceled": "Загрузка отменена.", "invalidFileName": "Имя файла не может содержать следующие символы: \\ / : * ? \" < > |", "folderExists": "В этом местоположении уже существует папка с именем \"{{renameFile}}\".", "collapseNavigationPane": "Свернуть панель навигации", diff --git a/frontend/src/locales/sv-SE.json b/frontend/src/locales/sv-SE.json index d3bf5dd7..af00df1f 100644 --- a/frontend/src/locales/sv-SE.json +++ b/frontend/src/locales/sv-SE.json @@ -47,6 +47,9 @@ "deleteItemsConfirm": "Vill du verkligen radera dessa {{count}} poster?", "percentDone": "{{percent}}% klar", "canceled": "Avbruten", + "replaceExistingFile": "Ersätt befintlig fil", + "confirmOverwrite": "En fil med detta namn finns redan. Vill du ersätta den?", + "uploadCanceled": "Uppladdning avbruten.", "invalidFileName": "Ett filnamn får inte innehålla något av följande tecken: \\ / : * ? \" < > |", "folderExists": "Den här platsen innehåller redan en mapp med namnet \"{{renameFile}}\".", "collapseNavigationPane": "Dölj navigationsfönster", diff --git a/frontend/src/locales/tr-TR.json b/frontend/src/locales/tr-TR.json index 4e6486c7..c75319fe 100644 --- a/frontend/src/locales/tr-TR.json +++ b/frontend/src/locales/tr-TR.json @@ -48,6 +48,9 @@ "deleteItemsConfirm": "{{count}} öğeyi silmek istediğinizden emin misiniz?", "percentDone": "%{{percent}} tamamlandı", "canceled": "İptal edildi", + "replaceExistingFile": "Mevcut Dosyayı Değiştir", + "confirmOverwrite": "Bu adda bir dosya zaten var. Değiştirmek istermisiniz?", + "uploadCanceled": "Yükleme iptal edildi.", "invalidFileName": "Bir dosya adı aşağıdaki karakterlerden hiçbirini içeremez: \\ / : * ? \" < > |", "folderExists": "Bu konumda \"{{renameFile}}\" adında bir klasör zaten var.", "collapseNavigationPane": "Gezinti Panelini Daralt", diff --git a/frontend/src/locales/uk-UA.json b/frontend/src/locales/uk-UA.json index ba329436..60851034 100644 --- a/frontend/src/locales/uk-UA.json +++ b/frontend/src/locales/uk-UA.json @@ -47,6 +47,9 @@ "deleteItemsConfirm": "Ви впевнені, що хочете видалити ці {{count}} елементи?", "percentDone": "{{percent}}% завершено", "canceled": "Скасовано", + "replaceExistingFile": "Замінити існуючий файл", + "confirmOverwrite": "Файл з такою назвою вже існує. Ви хочете його замінити?", + "uploadCanceled": "Завантаження скасовано.", "invalidFileName": "Ім'я файлу не може містити такі символи: \\ / : * ? \" < > |", "folderExists": "У цьому місці вже існує папка з назвою \"{{renameFile}}\".", "collapseNavigationPane": "Згорнути панель навігації", diff --git a/frontend/src/locales/ur-UR.json b/frontend/src/locales/ur-UR.json index a2d09685..bf2b3d85 100644 --- a/frontend/src/locales/ur-UR.json +++ b/frontend/src/locales/ur-UR.json @@ -47,6 +47,9 @@ "deleteItemsConfirm": "کیا آپ واقعی ان {{count}} آئٹمز کو حذف کرنا چاہتے ہیں؟", "percentDone": "{{percent}}% مکمل ہوا", "canceled": "منسوخ کیا گیا", + "replaceExistingFile": "موجودہ فائل کو بدلیں", + "confirmOverwrite": "اس نام کی فائل پہلے سے موجود ہے۔ کیا آپ اسے بدلنا چاہتے ہیں؟", + "uploadCanceled": "اپ لوڈ منسوخ کیا گیا۔", "invalidFileName": "فائل کا نام درج ذیل میں سے کوئی بھی حرف نہیں رکھ سکتا: \\ / : * ? \" < > |", "folderExists": "اس منزل پر پہلے ہی \"{{renameFile}}\" کے نام کا فولڈر موجود ہے۔", "collapseNavigationPane": "نیویگیشن پین کو بند کریں", diff --git a/frontend/src/locales/vi-VN.json b/frontend/src/locales/vi-VN.json index 34df2b32..6d4ac9e0 100644 --- a/frontend/src/locales/vi-VN.json +++ b/frontend/src/locales/vi-VN.json @@ -47,6 +47,9 @@ "deleteItemsConfirm": "Bạn có chắc muốn xóa {{count}} mục này không?", "percentDone": "Hoàn thành {{percent}}%", "canceled": "Đã hủy", + "replaceExistingFile": "Thay thế tệp hiện có", + "confirmOverwrite": "Một tệp có tên này đã tồn tại. Bạn có muốn thay thế nó không?", + "uploadCanceled": "Tải lên đã bị hủy.", "invalidFileName": "Tên tệp không được chứa các ký tự sau: \\ / : * ? \" < > |", "folderExists": "Đã có thư mục tên \"{{renameFile}}\" tại vị trí này.", "collapseNavigationPane": "Thu gọn ngăn điều hướng", diff --git a/frontend/src/locales/zh-CN.json b/frontend/src/locales/zh-CN.json index 295cdff0..3f4fe288 100644 --- a/frontend/src/locales/zh-CN.json +++ b/frontend/src/locales/zh-CN.json @@ -47,6 +47,9 @@ "deleteItemsConfirm": "您确定要删除这些 {{count}} 项吗?", "percentDone": "{{percent}}% 完成", "canceled": "已取消", + "replaceExistingFile": "替换现有文件", + "confirmOverwrite": "已存在同名文件。您要替换它吗?", + "uploadCanceled": "上传已取消。", "invalidFileName": "文件名不能包含以下字符:\\ / : * ? \" < > |", "folderExists": "目标文件夹中已存在名为 \"{{renameFile}}\" 的文件夹。", "collapseNavigationPane": "折叠导航窗格",