Compare commits

...

7 Commits

Author SHA1 Message Date
Daniel Luiz Alves
828fbd4cfd v3.0.0-beta.12 (#109) 2025-06-25 08:42:28 -03:00
Daniel Luiz Alves
ea68e771a8 feat: enhance file management features and localization (#108) 2025-06-24 14:05:16 -03:00
Daniel Luiz Alves
229f9a3ca0 feat: enhance file management features and localization
- Added bulk download functionality for files in the PublicSharePage, allowing users to download multiple files as a ZIP.
- Introduced new success and error messages for file deletion and password protection updates, improving user feedback.
- Updated translation files to include new keys for bulk download, file deletion, and password protection messages, enhancing localization support.
- Improved UI components to accommodate new features and ensure a seamless user experience.
2025-06-24 13:58:57 -03:00
Daniel Luiz Alves
dd10c17a3a feat: enhance SMTP configuration options in settings (#107) 2025-06-24 11:19:22 -03:00
Daniel Luiz Alves
ab071916b8 feat: enhance SMTP configuration options in settings
- Added new fields for smtpSecure and smtpNoAuth in the email settings, allowing users to specify the connection security method and disable authentication for internal servers.
- Updated the EmailService to handle the new configuration options, improving flexibility in SMTP setup.
- Enhanced the UI components to include the new fields, ensuring proper user interaction and validation.
- Updated translation files to include descriptions and titles for the new SMTP settings, improving localization support.
2025-06-24 11:15:44 -03:00
Daniel Luiz Alves
1ab0504288 chore: add pull request template for improved contribution guidelines
- Introduced a new pull request template to standardize submissions and enhance clarity for contributors.
- The template includes sections for description, related issues, motivation, AI usage, testing, and a checklist to ensure quality and completeness.
- Aims to streamline the review process and improve collaboration within the project.
2025-06-24 01:02:41 -03:00
Daniel Luiz Alves
652f1f47d2 feat: implement file name truncation in modals for better display
- Added a utility function to intelligently truncate file names while preserving extensions.
- Updated ReceivedFilesModal and DeleteConfirmationModal to use the new truncation function, improving the display of long file names.
- Enhanced UI components to ensure proper layout and readability of file names in both modals.
2025-06-24 00:33:54 -03:00
38 changed files with 940 additions and 184 deletions

56
.github/pull_request_template.md vendored Normal file
View File

@@ -0,0 +1,56 @@
## **🎯 Please make sure you are opening this Pull Request against the `next` branch!**
## 📝 Description
Please provide a clear and concise description of the changes introduced by this pull request.
## 🔗 Related Issue(s)
If this PR fixes or relates to an issue, please link it here (e.g., `Closes #123`).
## 💡 Motivation and Context
Why is this change required? What problem does it solve?
## 🤖 Use of Artificial Intelligence (AI)
The use of AI tools is absolutely welcome and not an issue. For transparency and continuous improvement, please answer the following:
- Did you use any AI tools (such as GitHub Copilot, ChatGPT, etc.) to help develop this PR?
- [ ] No, this PR was developed without the assistance of AI tools.
- [ ] Yes, AI tools assisted in the development of this PR (please specify which ones and how they were used):
- Tool(s) used:
- Brief description of how AI contributed:
- Was this PR generated entirely by an AI tool (i.e., with minimal human intervention)?
- [ ] No
- [ ] Yes (please provide details):
## 🧪 How Has This Been Tested?
Please describe the tests that you ran to verify your changes. Include details about your test environment, and the test cases you ran.
## 📸 Screenshots (if appropriate)
Add any relevant screenshots to help explain your changes.
## 🔄 Types of Changes
Check the relevant option(s) below:
- [ ] 🐛 Bug fix (non-breaking change which fixes an issue)
- [ ] ✨ New feature (non-breaking change which adds functionality)
- [ ] ⚠️ Breaking change (fix or feature that would cause existing functionality to change)
- [ ] 📚 Documentation update
## ✅ Checklist
- [ ] My code follows the code style of this project
- [ ] I have performed a self-review of my code
- [ ] I have commented my code, particularly in hard-to-understand areas
- [ ] I have added tests that prove my fix is effective or that my feature works
- [ ] I have added necessary documentation (if appropriate)
- [ ] I have rebased and/or merged on top of the latest `next` branch
---
🙏 Thank you for your contribution!

View File

@@ -117,6 +117,18 @@ const defaultConfigs = [
type: "string",
group: "email",
},
{
key: "smtpSecure",
value: "auto",
type: "string",
group: "email",
},
{
key: "smtpNoAuth",
value: "false",
type: "boolean",
group: "email",
},
{
key: "passwordResetTokenExpiration",
value: "3600",

View File

@@ -148,6 +148,11 @@ export async function appRoutes(app: FastifyInstance) {
.describe("SMTP server port (typically 587 for TLS, 25 for non-secure)"),
smtpUser: z.string().describe("Username for SMTP authentication (e.g., email address)"),
smtpPass: z.string().describe("Password for SMTP authentication (for Gmail, use App Password)"),
smtpSecure: z
.string()
.optional()
.describe("Connection security method ('auto', 'ssl', 'tls', or 'none')"),
smtpNoAuth: z.string().optional().describe("Disable SMTP authentication ('true' or 'false')"),
})
.optional()
.describe("SMTP configuration to test. If not provided, uses currently saved configuration"),

View File

@@ -7,6 +7,8 @@ interface SmtpConfig {
smtpPort: string;
smtpUser: string;
smtpPass: string;
smtpSecure?: string;
smtpNoAuth?: string;
}
export class EmailService {
@@ -18,15 +20,46 @@ export class EmailService {
return null;
}
return nodemailer.createTransport({
const port = Number(await this.configService.getValue("smtpPort"));
const smtpSecure = (await this.configService.getValue("smtpSecure")) || "auto";
const smtpNoAuth = await this.configService.getValue("smtpNoAuth");
let secure = false;
let requireTLS = false;
if (smtpSecure === "ssl") {
secure = true;
} else if (smtpSecure === "tls") {
requireTLS = true;
} else if (smtpSecure === "none") {
secure = false;
requireTLS = false;
} else if (smtpSecure === "auto") {
if (port === 465) {
secure = true;
} else if (port === 587 || port === 25) {
requireTLS = true;
}
}
const transportConfig: any = {
host: await this.configService.getValue("smtpHost"),
port: Number(await this.configService.getValue("smtpPort")),
secure: false,
auth: {
port: port,
secure: secure,
requireTLS: requireTLS,
tls: {
rejectUnauthorized: false,
},
};
if (smtpNoAuth !== "true") {
transportConfig.auth = {
user: await this.configService.getValue("smtpUser"),
pass: await this.configService.getValue("smtpPass"),
},
});
};
}
return nodemailer.createTransport(transportConfig);
}
async testConnection(config?: SmtpConfig) {
@@ -43,6 +76,8 @@ export class EmailService {
smtpPort: await this.configService.getValue("smtpPort"),
smtpUser: await this.configService.getValue("smtpUser"),
smtpPass: await this.configService.getValue("smtpPass"),
smtpSecure: (await this.configService.getValue("smtpSecure")) || "auto",
smtpNoAuth: await this.configService.getValue("smtpNoAuth"),
};
}
@@ -50,15 +85,46 @@ export class EmailService {
throw new Error("SMTP is not enabled");
}
const transporter = nodemailer.createTransport({
const port = Number(smtpConfig.smtpPort);
const smtpSecure = smtpConfig.smtpSecure || "auto";
const smtpNoAuth = smtpConfig.smtpNoAuth;
let secure = false;
let requireTLS = false;
if (smtpSecure === "ssl") {
secure = true;
} else if (smtpSecure === "tls") {
requireTLS = true;
} else if (smtpSecure === "none") {
secure = false;
requireTLS = false;
} else if (smtpSecure === "auto") {
if (port === 465) {
secure = true;
} else if (port === 587 || port === 25) {
requireTLS = true;
}
}
const transportConfig: any = {
host: smtpConfig.smtpHost,
port: Number(smtpConfig.smtpPort),
secure: false,
auth: {
port: port,
secure: secure,
requireTLS: requireTLS,
tls: {
rejectUnauthorized: false,
},
};
if (smtpNoAuth !== "true") {
transportConfig.auth = {
user: smtpConfig.smtpUser,
pass: smtpConfig.smtpPass,
},
});
};
}
const transporter = nodemailer.createTransport(transportConfig);
try {
await transporter.verify();

View File

@@ -532,6 +532,20 @@
"testSmtp": {
"title": "اختبار اتصال SMTP",
"description": "اختبار ما إذا كان تكوين SMTP صالحًا"
},
"smtpNoAuth": {
"title": "بدون مصادقة",
"description": "قم بتمكين هذا للخوادم الداخلية التي لا تتطلب اسم مستخدم/كلمة مرور (يخفي حقول المصادقة)"
},
"smtpSecure": {
"title": "أمان الاتصال",
"description": "طريقة أمان اتصال SMTP - تلقائي (موصى به)، SSL، STARTTLS، أو بدون (غير آمن)",
"options": {
"auto": "تلقائي (موصى به)",
"ssl": "SSL (منفذ 465)",
"tls": "STARTTLS (منفذ 587)",
"none": "بدون (غير آمن)"
}
}
},
"buttons": {
@@ -548,7 +562,10 @@
"updateSuccess": "تم تحديث إعدادات {group} بنجاح",
"smtpTestFailed": "فشل اتصال SMTP: {error}",
"smtpTestGenericError": "فشل اختبار اتصال SMTP. يرجى التحقق من إعداداتك والمحاولة مرة أخرى.",
"smtpTestSuccess": "تم اتصال SMTP بنجاح! تكوين البريد الإلكتروني الخاص بك يعمل بشكل صحيح."
"smtpTestSuccess": "تم اتصال SMTP بنجاح! تكوين البريد الإلكتروني الخاص بك يعمل بشكل صحيح.",
"smtpMissingAuth": "يرجى ملء اسم المستخدم وكلمة المرور الخاصة بـ SMTP، أو تمكين خيار 'بدون مصادقة'.",
"smtpMissingHostPort": "يرجى ملء مضيف ومنفذ SMTP قبل الاختبار.",
"smtpNotEnabled": "SMTP غير مفعل. يرجى تفعيل SMTP أولاً."
},
"title": "الإعدادات",
"breadcrumb": "الإعدادات",
@@ -556,7 +573,8 @@
"tooltips": {
"oidcScope": "أدخل نطاقاً واضغط Enter للإضافة",
"oidcAdminEmailDomains": "أدخل نطاقاً واضغط Enter للإضافة",
"testSmtp": "يختبر اتصال SMTP بالقيم المدخلة حاليًا في النموذج. لجعل التغييرات دائمة، تذكر حفظ إعداداتك بعد الاختبار."
"testSmtp": "يختبر اتصال SMTP بالقيم المدخلة حاليًا في النموذج. لجعل التغييرات دائمة، تذكر حفظ إعداداتك بعد الاختبار.",
"defaultPlaceholder": "أدخل واضغط Enter"
},
"redirectUri": {
"placeholder": "https://mysite.com",
@@ -589,7 +607,8 @@
"title": "لم يتم العثور على المشاركة",
"description": "قد يكون تم حذف هذه المشاركة أو انتهت صلاحيتها."
},
"pageTitle": "المشاركة"
"pageTitle": "المشاركة",
"downloadAll": "تحميل الكل"
},
"shareActions": {
"deleteTitle": "حذف المشاركة",
@@ -1215,7 +1234,9 @@
"bulkDeleteProgress": "جارٍ حذف {count, plural, =1 {ملف واحد} =2 {ملفين} other {# ملفات}}...",
"bulkDeleteSuccess": "{count, plural, =1 {تم حذف ملف واحد بنجاح} =2 {تم حذف ملفين بنجاح} other {تم حذف # ملفات بنجاح}}",
"selectAll": "تحديد الكل",
"selectFile": "تحديد الملف {fileName}"
"selectFile": "تحديد الملف {fileName}",
"deleteError": "خطأ في حذف الملف",
"deleteSuccess": "تم حذف الملف بنجاح"
}
},
"form": {
@@ -1298,14 +1319,17 @@
"deleteSuccess": "تم حذف رابط الاستلام بنجاح!",
"aliasCreated": "تم إنشاء الاسم المستعار بنجاح!",
"activateSuccess": "تم تفعيل رابط الاستلام بنجاح!",
"deactivateSuccess": "تم تعطيل رابط الاستلام بنجاح!"
"deactivateSuccess": "تم تعطيل رابط الاستلام بنجاح!",
"passwordProtectionDisabled": "تم إزالة حماية كلمة المرور بنجاح!",
"passwordProtectionEnabled": "تم تمكين حماية كلمة المرور بنجاح!"
},
"errors": {
"loadFailed": "فشل في تحميل روابط الاستلام",
"createFailed": "فشل في إنشاء رابط الاستلام. حاول مرة أخرى.",
"updateFailed": "فشل في تحديث رابط الاستلام. حاول مرة أخرى.",
"deleteFailed": "فشل في حذف رابط الاستلام. حاول مرة أخرى.",
"aliasCreateFailed": "فشل في إنشاء الاسم المستعار. حاول مرة أخرى."
"aliasCreateFailed": "فشل في إنشاء الاسم المستعار. حاول مرة أخرى.",
"passwordUpdateFailed": "فشل في تحديث حماية كلمة المرور"
},
"delete": {
"title": "حذف رابط الاستلام",
@@ -1405,7 +1429,9 @@
"components": {
"fileRow": {
"addDescription": "إضافة وصف...",
"anonymous": "مجهول"
"anonymous": "مجهول",
"deleteError": "خطأ في حذف الملف",
"deleteSuccess": "تم حذف الملف بنجاح"
},
"fileActions": {
"edit": "تحرير",
@@ -1421,6 +1447,7 @@
"saveChanges": "حفظ التغييرات",
"cancelEdit": "إلغاء التحرير"
}
}
},
"defaultLinkName": "الملفات المستلمة"
}
}

View File

@@ -532,6 +532,20 @@
"testSmtp": {
"title": "SMTP-Verbindung testen",
"description": "Testen Sie, ob die SMTP-Konfiguration gültig ist"
},
"smtpNoAuth": {
"title": "Keine Authentifizierung",
"description": "Aktivieren Sie dies für interne Server, die keinen Benutzernamen/Passwort benötigen (blendet Authentifizierungsfelder aus)"
},
"smtpSecure": {
"title": "Verbindungssicherheit",
"description": "SMTP-Verbindungssicherheitsmethode - Auto (empfohlen), SSL, STARTTLS oder Keine (unsicher)",
"options": {
"auto": "Auto (Empfohlen)",
"ssl": "SSL (Port 465)",
"tls": "STARTTLS (Port 587)",
"none": "Keine (Unsicher)"
}
}
},
"buttons": {
@@ -548,7 +562,10 @@
"updateSuccess": "{group}-Einstellungen erfolgreich aktualisiert",
"smtpTestFailed": "SMTP-Verbindung fehlgeschlagen: {error}",
"smtpTestGenericError": "SMTP-Verbindungstest fehlgeschlagen. Bitte überprüfen Sie Ihre Einstellungen und versuchen Sie es erneut.",
"smtpTestSuccess": "SMTP-Verbindung erfolgreich! Ihre E-Mail-Konfiguration funktioniert korrekt."
"smtpTestSuccess": "SMTP-Verbindung erfolgreich! Ihre E-Mail-Konfiguration funktioniert korrekt.",
"smtpMissingAuth": "Bitte geben Sie SMTP-Benutzername und Passwort ein oder aktivieren Sie die Option 'Keine Authentifizierung'.",
"smtpMissingHostPort": "Bitte geben Sie SMTP-Host und Port vor dem Test ein.",
"smtpNotEnabled": "SMTP ist nicht aktiviert. Bitte aktivieren Sie zuerst SMTP."
},
"title": "Einstellungen",
"breadcrumb": "Einstellungen",
@@ -556,7 +573,8 @@
"tooltips": {
"oidcScope": "Geben Sie einen Scope ein und drücken Sie Enter zum Hinzufügen",
"oidcAdminEmailDomains": "Geben Sie eine Domain ein und drücken Sie Enter zum Hinzufügen",
"testSmtp": "Testet die SMTP-Verbindung mit den aktuell im Formular eingegebenen Werten. Um die Änderungen dauerhaft zu machen, denken Sie daran, Ihre Einstellungen nach dem Test zu speichern."
"testSmtp": "Testet die SMTP-Verbindung mit den aktuell im Formular eingegebenen Werten. Um die Änderungen dauerhaft zu machen, denken Sie daran, Ihre Einstellungen nach dem Test zu speichern.",
"defaultPlaceholder": "Eingeben und Enter drücken"
},
"redirectUri": {
"placeholder": "https://meineseite.com",
@@ -589,7 +607,8 @@
"title": "Freigabe nicht gefunden",
"description": "Diese Freigabe wurde möglicherweise gelöscht oder ist abgelaufen."
},
"pageTitle": "Freigabe"
"pageTitle": "Freigabe",
"downloadAll": "Alle herunterladen"
},
"shareActions": {
"deleteTitle": "Freigabe Löschen",
@@ -1215,7 +1234,9 @@
"bulkDeleteProgress": "{count, plural, =1 {1 Datei wird} other {# Dateien werden}} gelöscht...",
"bulkDeleteSuccess": "{count, plural, =1 {1 Datei wurde erfolgreich gelöscht} other {# Dateien wurden erfolgreich gelöscht}}",
"selectAll": "Alle auswählen",
"selectFile": "Datei {fileName} auswählen"
"selectFile": "Datei {fileName} auswählen",
"deleteError": "Fehler beim Löschen der Datei",
"deleteSuccess": "Datei erfolgreich gelöscht"
}
},
"form": {
@@ -1298,14 +1319,17 @@
"deleteSuccess": "Empfangslink erfolgreich gelöscht!",
"aliasCreated": "Alias erfolgreich erstellt!",
"activateSuccess": "Empfangslink erfolgreich aktiviert!",
"deactivateSuccess": "Empfangslink erfolgreich deaktiviert!"
"deactivateSuccess": "Empfangslink erfolgreich deaktiviert!",
"passwordProtectionDisabled": "Passwortschutz erfolgreich entfernt!",
"passwordProtectionEnabled": "Passwortschutz erfolgreich aktiviert!"
},
"errors": {
"loadFailed": "Fehler beim Laden der Empfangslinks",
"createFailed": "Fehler beim Erstellen des Empfangslinks. Bitte versuchen Sie es erneut.",
"updateFailed": "Fehler beim Aktualisieren des Empfangslinks. Bitte versuchen Sie es erneut.",
"deleteFailed": "Fehler beim Löschen des Empfangslinks. Bitte versuchen Sie es erneut.",
"aliasCreateFailed": "Fehler beim Erstellen des Alias. Bitte versuchen Sie es erneut."
"aliasCreateFailed": "Fehler beim Erstellen des Alias. Bitte versuchen Sie es erneut.",
"passwordUpdateFailed": "Fehler beim Aktualisieren des Passwortschutzes"
},
"delete": {
"title": "Empfangslink löschen",
@@ -1421,6 +1445,7 @@
"saveChanges": "Änderungen speichern",
"cancelEdit": "Bearbeitung abbrechen"
}
}
},
"defaultLinkName": "Empfangene Dateien"
}
}

View File

@@ -465,6 +465,20 @@
"title": "Sender Email",
"description": "Sender email address"
},
"smtpSecure": {
"title": "Connection Security",
"description": "SMTP connection security method - Auto (recommended), SSL, STARTTLS, or None (insecure)",
"options": {
"auto": "Auto (Recommended)",
"ssl": "SSL (Port 465)",
"tls": "STARTTLS (Port 587)",
"none": "None (Insecure)"
}
},
"smtpNoAuth": {
"title": "No Authentication",
"description": "Enable this for internal servers that don't require username/password (hides auth fields)"
},
"testSmtp": {
"title": "Test SMTP Connection",
"description": "Test if the SMTP configuration is valid"
@@ -548,7 +562,10 @@
"updateSuccess": "{group} settings updated successfully",
"smtpTestSuccess": "SMTP connection successful! Your email configuration is working correctly.",
"smtpTestFailed": "SMTP connection failed: {error}",
"smtpTestGenericError": "Failed to test SMTP connection. Please check your settings and try again."
"smtpTestGenericError": "Failed to test SMTP connection. Please check your settings and try again.",
"smtpNotEnabled": "SMTP is not enabled. Please enable SMTP first.",
"smtpMissingHostPort": "Please fill in SMTP Host and Port before testing.",
"smtpMissingAuth": "Please fill in SMTP Username and Password, or enable 'No Authentication' option."
},
"title": "Settings",
"breadcrumb": "Settings",
@@ -556,7 +573,8 @@
"tooltips": {
"oidcScope": "Enter a scope and press Enter to add",
"oidcAdminEmailDomains": "Enter a domain and press Enter to add",
"testSmtp": "Tests the SMTP connection with the values currently entered in the form. To make changes permanent, remember to save your settings after testing."
"testSmtp": "Tests the SMTP connection with the values currently entered in the form. To make changes permanent, remember to save your settings after testing.",
"defaultPlaceholder": "Enter and press Enter"
},
"redirectUri": {
"placeholder": "https://mysite.com",
@@ -585,6 +603,7 @@
"created": "Created: {date}",
"expires": "Expires: {date}"
},
"downloadAll": "Download All",
"notFound": {
"title": "Share Not Found",
"description": "This share may have been deleted or expired."
@@ -1200,6 +1219,8 @@
"previewNotAvailable": "Preview not available",
"copySuccess": "File copied to your files successfully",
"copyError": "Error copying file to your files",
"deleteSuccess": "File deleted successfully",
"deleteError": "Error deleting file",
"bulkCopySuccess": "{count, plural, =1 {1 file copied to your files successfully} other {# files copied to your files successfully}}",
"bulkDeleteSuccess": "{count, plural, =1 {1 file deleted successfully} other {# files deleted successfully}}",
"bulkCopyProgress": "Copying {count, plural, =1 {1 file} other {# files}} to your files...",
@@ -1298,14 +1319,18 @@
"deleteSuccess": "Receive link deleted successfully!",
"aliasCreated": "Alias created successfully!",
"activateSuccess": "Receive link activated successfully!",
"deactivateSuccess": "Receive link deactivated successfully!"
"deactivateSuccess": "Receive link deactivated successfully!",
"passwordProtectionEnabled": "Password protection enabled successfully!",
"passwordProtectionDisabled": "Password protection removed successfully!"
},
"defaultLinkName": "Received Files",
"errors": {
"loadFailed": "Failed to load receive links",
"createFailed": "Failed to create receive link. Please try again.",
"updateFailed": "Failed to update receive link. Please try again.",
"deleteFailed": "Failed to delete receive link. Please try again.",
"aliasCreateFailed": "Failed to create alias. Please try again."
"aliasCreateFailed": "Failed to create alias. Please try again.",
"passwordUpdateFailed": "Failed to update password protection"
},
"delete": {
"title": "Delete receive link",

View File

@@ -532,6 +532,20 @@
"testSmtp": {
"title": "Probar Conexión SMTP",
"description": "Probar si la configuración SMTP es válida"
},
"smtpNoAuth": {
"title": "Sin Autenticación",
"description": "Habilitar para servidores internos que no requieren usuario/contraseña (oculta los campos de autenticación)"
},
"smtpSecure": {
"title": "Seguridad de Conexión",
"description": "Método de seguridad de conexión SMTP - Auto (recomendado), SSL, STARTTLS o Ninguno (inseguro)",
"options": {
"auto": "Auto (Recomendado)",
"ssl": "SSL (Puerto 465)",
"tls": "STARTTLS (Puerto 587)",
"none": "Ninguno (Inseguro)"
}
}
},
"buttons": {
@@ -548,7 +562,10 @@
"updateSuccess": "Configuración de {group} actualizada exitosamente",
"smtpTestSuccess": "¡Conexión SMTP exitosa! Tu configuración de correo funciona correctamente.",
"smtpTestFailed": "Falló la conexión SMTP: {error}",
"smtpTestGenericError": "Error al probar la conexión SMTP. Por favor revisa tu configuración e inténtalo de nuevo."
"smtpTestGenericError": "Error al probar la conexión SMTP. Por favor revisa tu configuración e inténtalo de nuevo.",
"smtpMissingAuth": "Por favor ingresa el Usuario y Contraseña SMTP, o habilita la opción 'Sin Autenticación'.",
"smtpMissingHostPort": "Por favor ingresa el Host y Puerto SMTP antes de probar.",
"smtpNotEnabled": "SMTP no está habilitado. Por favor habilita SMTP primero."
},
"title": "Configuración",
"breadcrumb": "Configuración",
@@ -556,7 +573,8 @@
"tooltips": {
"oidcScope": "Ingrese un ámbito y presione Enter para agregar",
"oidcAdminEmailDomains": "Ingrese un dominio y presione Enter para agregar",
"testSmtp": "Prueba la conexión SMTP con los valores actualmente ingresados en el formulario. Para hacer los cambios permanentes, recuerda guardar la configuración después de probar."
"testSmtp": "Prueba la conexión SMTP con los valores actualmente ingresados en el formulario. Para hacer los cambios permanentes, recuerda guardar la configuración después de probar.",
"defaultPlaceholder": "Ingrese y presione Enter"
},
"redirectUri": {
"placeholder": "https://misitio.com",
@@ -589,7 +607,8 @@
"title": "Compartición no encontrada",
"description": "Esta compartición puede haber sido eliminada o haber expirado."
},
"pageTitle": "Compartición"
"pageTitle": "Compartición",
"downloadAll": "Descargar Todo"
},
"shareActions": {
"deleteTitle": "Eliminar Compartir",
@@ -1215,7 +1234,9 @@
"bulkDeleteProgress": "Eliminando {count, plural, =1 {1 archivo} other {# archivos}}...",
"bulkDeleteSuccess": "{count, plural, =1 {1 archivo eliminado correctamente} other {# archivos eliminados correctamente}}",
"selectAll": "Seleccionar todo",
"selectFile": "Seleccionar archivo {fileName}"
"selectFile": "Seleccionar archivo {fileName}",
"deleteError": "Error al eliminar el archivo",
"deleteSuccess": "Archivo eliminado correctamente"
}
},
"form": {
@@ -1298,14 +1319,17 @@
"deleteSuccess": "¡Enlace de recepción eliminado con éxito!",
"aliasCreated": "¡Alias creado con éxito!",
"activateSuccess": "¡Enlace de recepción activado con éxito!",
"deactivateSuccess": "¡Enlace de recepción desactivado con éxito!"
"deactivateSuccess": "¡Enlace de recepción desactivado con éxito!",
"passwordProtectionDisabled": "¡Protección por contraseña eliminada con éxito!",
"passwordProtectionEnabled": "¡Protección por contraseña habilitada con éxito!"
},
"errors": {
"loadFailed": "Error al cargar enlaces de recepción",
"createFailed": "Error al crear enlace de recepción. Inténtalo de nuevo.",
"updateFailed": "Error al actualizar enlace de recepción. Inténtalo de nuevo.",
"deleteFailed": "Error al eliminar enlace de recepción. Inténtalo de nuevo.",
"aliasCreateFailed": "Error al crear alias. Inténtalo de nuevo."
"aliasCreateFailed": "Error al crear alias. Inténtalo de nuevo.",
"passwordUpdateFailed": "Error al actualizar la protección por contraseña"
},
"delete": {
"title": "Eliminar enlace de recepción",
@@ -1421,6 +1445,7 @@
"saveChanges": "Guardar cambios",
"cancelEdit": "Cancelar edición"
}
}
},
"defaultLinkName": "Archivos recibidos"
}
}

View File

@@ -535,6 +535,20 @@
"testSmtp": {
"title": "[TO_TRANSLATE] Test SMTP Connection",
"description": "[TO_TRANSLATE] Test if the SMTP configuration is valid"
},
"smtpNoAuth": {
"title": "Pas d'Authentification",
"description": "Activez cette option pour les serveurs internes qui ne nécessitent pas de nom d'utilisateur/mot de passe (masque les champs d'authentification)"
},
"smtpSecure": {
"title": "Sécurité de la Connexion",
"description": "Méthode de sécurité de connexion SMTP - Auto (recommandé), SSL, STARTTLS, ou Aucune (non sécurisé)",
"options": {
"auto": "Auto (Recommandé)",
"ssl": "SSL (Port 465)",
"tls": "STARTTLS (Port 587)",
"none": "Aucune (Non sécurisé)"
}
}
},
"buttons": {
@@ -551,12 +565,16 @@
"updateSuccess": "Paramètres {group} mis à jour avec succès",
"smtpTestFailed": "La connexion SMTP a échoué : {error}",
"smtpTestGenericError": "Échec du test de connexion SMTP. Veuillez vérifier vos paramètres et réessayer.",
"smtpTestSuccess": "Connexion SMTP réussie ! Votre configuration email fonctionne correctement."
"smtpTestSuccess": "Connexion SMTP réussie ! Votre configuration email fonctionne correctement.",
"smtpMissingAuth": "Veuillez remplir le nom d'utilisateur et le mot de passe SMTP, ou activer l'option 'Pas d'Authentification'.",
"smtpMissingHostPort": "Veuillez remplir l'hôte et le port SMTP avant de tester.",
"smtpNotEnabled": "SMTP n'est pas activé. Veuillez d'abord activer SMTP."
},
"tooltips": {
"oidcScope": "Entrez une portée et appuyez sur Entrée pour l'ajouter",
"oidcAdminEmailDomains": "Entrez un domaine et appuyez sur Entrée pour l'ajouter",
"testSmtp": "Teste la connexion SMTP avec les valeurs actuellement saisies dans le formulaire. Pour rendre les modifications permanentes, n'oubliez pas d'enregistrer vos paramètres après le test."
"testSmtp": "Teste la connexion SMTP avec les valeurs actuellement saisies dans le formulaire. Pour rendre les modifications permanentes, n'oubliez pas d'enregistrer vos paramètres après le test.",
"defaultPlaceholder": "Entrez et appuyez sur Entrée"
},
"redirectUri": {
"placeholder": "https://monsite.com",
@@ -589,7 +607,8 @@
"title": "Partage Non Trouvé",
"description": "Ce partage a peut-être été supprimé ou a expiré."
},
"pageTitle": "Partage"
"pageTitle": "Partage",
"downloadAll": "Tout Télécharger"
},
"shareActions": {
"deleteTitle": "Supprimer le Partage",
@@ -1215,7 +1234,9 @@
"bulkDeleteProgress": "Suppression de {count, plural, =1 {1 fichier} other {# fichiers}}...",
"bulkDeleteSuccess": "{count, plural, =1 {1 fichier supprimé avec succès} other {# fichiers supprimés avec succès}}",
"selectAll": "Tout sélectionner",
"selectFile": "Sélectionner le fichier {fileName}"
"selectFile": "Sélectionner le fichier {fileName}",
"deleteError": "Erreur lors de la suppression du fichier",
"deleteSuccess": "Fichier supprimé avec succès"
}
},
"form": {
@@ -1298,14 +1319,17 @@
"deleteSuccess": "Lien de réception supprimé avec succès !",
"aliasCreated": "Alias créé avec succès !",
"activateSuccess": "Lien de réception activé avec succès !",
"deactivateSuccess": "Lien de réception désactivé avec succès !"
"deactivateSuccess": "Lien de réception désactivé avec succès !",
"passwordProtectionDisabled": "Protection par mot de passe supprimée avec succès !",
"passwordProtectionEnabled": "Protection par mot de passe activée avec succès !"
},
"errors": {
"loadFailed": "Échec du chargement des liens de réception",
"createFailed": "Échec de la création du lien de réception. Veuillez réessayer.",
"updateFailed": "Échec de la mise à jour du lien de réception. Veuillez réessayer.",
"deleteFailed": "Échec de la suppression du lien de réception. Veuillez réessayer.",
"aliasCreateFailed": "Échec de la création de l'alias. Veuillez réessayer."
"aliasCreateFailed": "Échec de la création de l'alias. Veuillez réessayer.",
"passwordUpdateFailed": "Échec de la mise à jour de la protection par mot de passe"
},
"delete": {
"title": "Supprimer le lien de réception",
@@ -1421,6 +1445,7 @@
"saveChanges": "Enregistrer les modifications",
"cancelEdit": "Annuler la modification"
}
}
},
"defaultLinkName": "Fichiers reçus"
}
}

View File

@@ -532,6 +532,20 @@
"testSmtp": {
"title": "SMTP कनेक्शन का परीक्षण करें",
"description": "जांचें कि SMTP कॉन्फ़िगरेशन मान्य है"
},
"smtpNoAuth": {
"title": "कोई प्रमाणीकरण नहीं",
"description": "आंतरिक सर्वर के लिए सक्षम करें जिन्हें उपयोगकर्ता नाम/पासवर्ड की आवश्यकता नहीं होती है (प्रमाणीकरण फ़ील्ड छिपाता है)"
},
"smtpSecure": {
"title": "कनेक्शन सुरक्षा",
"description": "SMTP कनेक्शन सुरक्षा विधि - स्वचालित (अनुशंसित), SSL, STARTTLS, या कोई नहीं (असुरक्षित)",
"options": {
"auto": "स्वचालित (अनुशंसित)",
"ssl": "SSL (पोर्ट 465)",
"tls": "STARTTLS (पोर्ट 587)",
"none": "कोई नहीं (असुरक्षित)"
}
}
},
"buttons": {
@@ -548,7 +562,10 @@
"updateSuccess": "{group} सेटिंग्स सफलतापूर्वक अपडेट हुईं",
"smtpTestFailed": "SMTP कनेक्शन विफल: {error}",
"smtpTestGenericError": "SMTP कनेक्शन का परीक्षण करने में विफल। कृपया अपनी सेटिंग्स जांचें और पुनः प्रयास करें।",
"smtpTestSuccess": "SMTP कनेक्शन सफल! आपका ईमेल कॉन्फ़िगरेशन सही ढंग से काम कर रहा है।"
"smtpTestSuccess": "SMTP कनेक्शन सफल! आपका ईमेल कॉन्फ़िगरेशन सही ढंग से काम कर रहा है।",
"smtpMissingAuth": "कृपया SMTP उपयोगकर्ता नाम और पासवर्ड भरें, या 'कोई प्रमाणीकरण नहीं' विकल्प सक्षम करें।",
"smtpMissingHostPort": "परीक्षण से पहले कृपया SMTP होस्ट और पोर्ट भरें।",
"smtpNotEnabled": "SMTP सक्षम नहीं है। कृपया पहले SMTP सक्षम करें।"
},
"title": "सेटिंग्स",
"breadcrumb": "सेटिंग्स",
@@ -556,7 +573,8 @@
"tooltips": {
"oidcScope": "स्कोप जोड़ने के लिए एक स्कोप दर्ज करें और Enter दबाएं",
"oidcAdminEmailDomains": "डोमेन जोड़ने के लिए एक डोमेन दर्ज करें और Enter दबाएं",
"testSmtp": "फॉर्म में वर्तमान में दर्ज मानों के साथ SMTP कनेक्शन का परीक्षण करता है। परिवर्तनों को स्थायी बनाने के लिए, परीक्षण के बाद अपनी सेटिंग्स को सहेजना याद रखें।"
"testSmtp": "फॉर्म में वर्तमान में दर्ज मानों के साथ SMTP कनेक्शन का परीक्षण करता है। परिवर्तनों को स्थायी बनाने के लिए, परीक्षण के बाद अपनी सेटिंग्स को सहेजना याद रखें।",
"defaultPlaceholder": "दर्ज करें और Enter दबाएं"
},
"redirectUri": {
"placeholder": "https://mysite.com",
@@ -589,7 +607,8 @@
"title": "साझाकरण नहीं मिला",
"description": "यह साझाकरण हटा दिया गया हो सकता है या समाप्त हो चुका है।"
},
"pageTitle": "साझाकरण"
"pageTitle": "साझाकरण",
"downloadAll": "सभी डाउनलोड करें"
},
"shareActions": {
"deleteTitle": "साझाकरण हटाएं",
@@ -1215,7 +1234,9 @@
"bulkDeleteProgress": "{count, plural, =1 {1 फ़ाइल} other {# फ़ाइलें}} हटाई जा रही हैं...",
"bulkDeleteSuccess": "{count, plural, =1 {1 फ़ाइल सफलतापूर्वक हटाई गई} other {# फ़ाइलें सफलतापूर्वक हटाई गईं}}",
"selectAll": "सभी चुनें",
"selectFile": "फ़ाइल {fileName} चुनें"
"selectFile": "फ़ाइल {fileName} चुनें",
"deleteError": "फ़ाइल हटाने में त्रुटि",
"deleteSuccess": "फ़ाइल सफलतापूर्वक हटा दी गई"
}
},
"form": {
@@ -1298,14 +1319,17 @@
"deleteSuccess": "प्राप्ति लिंक सफलतापूर्वक हटाया गया!",
"aliasCreated": "उपनाम सफलतापूर्वक बनाया गया!",
"activateSuccess": "प्राप्ति लिंक सफलतापूर्वक सक्रिय किया गया!",
"deactivateSuccess": "प्राप्ति लिंक सफलतापूर्वक निष्क्रिय किया गया!"
"deactivateSuccess": "प्राप्ति लिंक सफलतापूर्वक निष्क्रिय किया गया!",
"passwordProtectionDisabled": "पासवर्ड सुरक्षा सफलतापूर्वक हटा दी गई!",
"passwordProtectionEnabled": "पासवर्ड सुरक्षा सफलतापूर्वक सक्षम की गई!"
},
"errors": {
"loadFailed": "प्राप्ति लिंक लोड करने में विफल",
"createFailed": "प्राप्ति लिंक बनाने में विफल। कृपया पुनः प्रयास करें।",
"updateFailed": "प्राप्ति लिंक अपडेट करने में विफल। कृपया पुनः प्रयास करें।",
"deleteFailed": "प्राप्ति लिंक हटाने में विफल। कृपया पुनः प्रयास करें।",
"aliasCreateFailed": "उपनाम बनाने में विफल। कृपया पुनः प्रयास करें।"
"aliasCreateFailed": "उपनाम बनाने में विफल। कृपया पुनः प्रयास करें।",
"passwordUpdateFailed": "पासवर्ड सुरक्षा अपडेट करने में विफल"
},
"delete": {
"title": "प्राप्ति लिंक हटाएं",
@@ -1421,6 +1445,7 @@
"saveChanges": "परिवर्तन सहेजें",
"cancelEdit": "संपादन रद्द करें"
}
}
},
"defaultLinkName": "प्राप्त फ़ाइलें"
}
}

View File

@@ -532,6 +532,20 @@
"testSmtp": {
"title": "Test Connessione SMTP",
"description": "Verifica se la configurazione SMTP è valida"
},
"smtpNoAuth": {
"title": "Nessuna Autenticazione",
"description": "Abilita questa opzione per i server interni che non richiedono nome utente/password (nasconde i campi di autenticazione)"
},
"smtpSecure": {
"title": "Sicurezza Connessione",
"description": "Metodo di sicurezza della connessione SMTP - Auto (raccomandato), SSL, STARTTLS o Nessuno (non sicuro)",
"options": {
"auto": "Auto (Raccomandato)",
"ssl": "SSL (Porta 465)",
"tls": "STARTTLS (Porta 587)",
"none": "Nessuno (Non sicuro)"
}
}
},
"buttons": {
@@ -548,7 +562,10 @@
"updateSuccess": "Impostazioni {group} aggiornate con successo",
"smtpTestFailed": "Connessione SMTP fallita: {error}",
"smtpTestGenericError": "Impossibile testare la connessione SMTP. Controlla le impostazioni e riprova.",
"smtpTestSuccess": "Connessione SMTP riuscita! La configurazione email funziona correttamente."
"smtpTestSuccess": "Connessione SMTP riuscita! La configurazione email funziona correttamente.",
"smtpMissingAuth": "Inserisci Nome utente e Password SMTP, oppure abilita l'opzione 'Nessuna Autenticazione'.",
"smtpMissingHostPort": "Inserisci Host e Porta SMTP prima di effettuare il test.",
"smtpNotEnabled": "SMTP non è abilitato. Abilitalo prima di procedere."
},
"title": "Impostazioni",
"breadcrumb": "Impostazioni",
@@ -556,7 +573,8 @@
"tooltips": {
"oidcScope": "Inserisci uno scope e premi Invio per aggiungerlo",
"oidcAdminEmailDomains": "Inserisci un dominio e premi Invio per aggiungerlo",
"testSmtp": "Verifica la connessione SMTP con i valori attualmente inseriti nel modulo. Per rendere permanenti le modifiche, ricordati di salvare le impostazioni dopo il test."
"testSmtp": "Verifica la connessione SMTP con i valori attualmente inseriti nel modulo. Per rendere permanenti le modifiche, ricordati di salvare le impostazioni dopo il test.",
"defaultPlaceholder": "Inserisci e premi Invio"
},
"redirectUri": {
"placeholder": "https://miosito.com",
@@ -589,7 +607,8 @@
"title": "Condivisione Non Trovata",
"description": "Questa condivisione potrebbe essere stata eliminata o è scaduta."
},
"pageTitle": "Condivisione"
"pageTitle": "Condivisione",
"downloadAll": "Scarica Tutto"
},
"shareActions": {
"deleteTitle": "Elimina Condivisione",
@@ -1215,7 +1234,9 @@
"bulkDeleteProgress": "Eliminazione di {count, plural, =1 {1 file} other {# file}} in corso...",
"bulkDeleteSuccess": "{count, plural, =1 {1 file eliminato con successo} other {# file eliminati con successo}}",
"selectAll": "Seleziona tutto",
"selectFile": "Seleziona file {fileName}"
"selectFile": "Seleziona file {fileName}",
"deleteError": "Errore durante l'eliminazione del file",
"deleteSuccess": "File eliminato con successo"
}
},
"form": {
@@ -1298,14 +1319,17 @@
"deleteSuccess": "Link di ricezione eliminato con successo!",
"aliasCreated": "Alias creato con successo!",
"activateSuccess": "Link di ricezione attivato con successo!",
"deactivateSuccess": "Link di ricezione disattivato con successo!"
"deactivateSuccess": "Link di ricezione disattivato con successo!",
"passwordProtectionDisabled": "Protezione con password rimossa con successo!",
"passwordProtectionEnabled": "Protezione con password abilitata con successo!"
},
"errors": {
"loadFailed": "Impossibile caricare i link di ricezione",
"createFailed": "Impossibile creare il link di ricezione. Riprova.",
"updateFailed": "Impossibile aggiornare il link di ricezione. Riprova.",
"deleteFailed": "Impossibile eliminare il link di ricezione. Riprova.",
"aliasCreateFailed": "Impossibile creare l'alias. Riprova."
"aliasCreateFailed": "Impossibile creare l'alias. Riprova.",
"passwordUpdateFailed": "Impossibile aggiornare la protezione con password"
},
"delete": {
"title": "Elimina link di ricezione",
@@ -1421,6 +1445,7 @@
"saveChanges": "Salva modifiche",
"cancelEdit": "Annulla modifica"
}
}
},
"defaultLinkName": "File ricevuti"
}
}

View File

@@ -532,6 +532,20 @@
"testSmtp": {
"title": "SMTP接続テスト",
"description": "SMTP設定が有効かどうかをテストします"
},
"smtpNoAuth": {
"title": "認証なし",
"description": "ユーザー名/パスワードを必要としない内部サーバー用(認証フィールドを非表示)"
},
"smtpSecure": {
"title": "接続セキュリティ",
"description": "SMTP接続セキュリティ方式 - 自動推奨、SSL、STARTTLS、または なし(安全でない)",
"options": {
"auto": "自動(推奨)",
"ssl": "SSLポート465",
"tls": "STARTTLSポート587",
"none": "なし(安全でない)"
}
}
},
"buttons": {
@@ -548,7 +562,10 @@
"updateSuccess": "{group}の設定が正常に更新されました",
"smtpTestFailed": "SMTP接続に失敗しました: {error}",
"smtpTestGenericError": "SMTP接続のテストに失敗しました。設定を確認して再度お試しください。",
"smtpTestSuccess": "SMTP接続に成功しましたメール設定は正常に動作しています。"
"smtpTestSuccess": "SMTP接続に成功しましたメール設定は正常に動作しています。",
"smtpMissingAuth": "SMTPユーザー名とパスワードを入力するか、「認証なし」オプションを有効にしてください。",
"smtpMissingHostPort": "テストの前にSMTPホストとポートを入力してください。",
"smtpNotEnabled": "SMTPが有効になっていません。最初にSMTPを有効にしてください。"
},
"title": "設定",
"breadcrumb": "設定",
@@ -556,7 +573,8 @@
"tooltips": {
"oidcScope": "スコープを入力してEnterキーを押して追加",
"oidcAdminEmailDomains": "ドメインを入力してEnterキーを押して追加",
"testSmtp": "フォームに現在入力されている値でSMTP接続をテストします。変更を永続化するには、テスト後に設定を保存することを忘れないでください。"
"testSmtp": "フォームに現在入力されている値でSMTP接続をテストします。変更を永続化するには、テスト後に設定を保存することを忘れないでください。",
"defaultPlaceholder": "入力してEnterキーを押してください"
},
"redirectUri": {
"placeholder": "https://mysite.com",
@@ -589,7 +607,8 @@
"title": "共有が見つかりません",
"description": "この共有は削除されたか、期限が切れている可能性があります。"
},
"pageTitle": "共有"
"pageTitle": "共有",
"downloadAll": "すべてダウンロード"
},
"shareActions": {
"deleteTitle": "共有を削除",
@@ -1215,7 +1234,9 @@
"bulkDeleteProgress": "{count, plural, =1 {1ファイル} other {#ファイル}}を削除中...",
"bulkDeleteSuccess": "{count, plural, =1 {1ファイル} other {#ファイル}}を正常に削除しました",
"selectAll": "すべて選択",
"selectFile": "ファイル{fileName}を選択"
"selectFile": "ファイル{fileName}を選択",
"deleteError": "ファイルの削除に失敗しました",
"deleteSuccess": "ファイルを正常に削除しました"
}
},
"form": {
@@ -1298,14 +1319,17 @@
"deleteSuccess": "受信リンクを削除しました!",
"aliasCreated": "エイリアスを作成しました!",
"activateSuccess": "受信リンクを有効化しました!",
"deactivateSuccess": "受信リンクを無効化しました!"
"deactivateSuccess": "受信リンクを無効化しました!",
"passwordProtectionDisabled": "パスワード保護を正常に解除しました!",
"passwordProtectionEnabled": "パスワード保護を正常に有効化しました!"
},
"errors": {
"loadFailed": "受信リンクの読み込みに失敗しました",
"createFailed": "受信リンクの作成に失敗しました。もう一度お試しください。",
"updateFailed": "受信リンクの更新に失敗しました。もう一度お試しください。",
"deleteFailed": "受信リンクの削除に失敗しました。もう一度お試しください。",
"aliasCreateFailed": "エイリアスの作成に失敗しました。もう一度お試しください。"
"aliasCreateFailed": "エイリアスの作成に失敗しました。もう一度お試しください。",
"passwordUpdateFailed": "パスワード保護の更新に失敗しました"
},
"delete": {
"title": "受信リンクを削除",
@@ -1421,6 +1445,7 @@
"saveChanges": "変更を保存",
"cancelEdit": "編集をキャンセル"
}
}
},
"defaultLinkName": "受信したファイル"
}
}

View File

@@ -532,6 +532,20 @@
"testSmtp": {
"title": "SMTP 연결 테스트",
"description": "SMTP 구성이 유효한지 테스트합니다"
},
"smtpNoAuth": {
"title": "인증 없음",
"description": "사용자 이름/비밀번호가 필요하지 않은 내부 서버의 경우 활성화하세요 (인증 필드 숨김)"
},
"smtpSecure": {
"title": "연결 보안",
"description": "SMTP 연결 보안 방식 - 자동 (권장), SSL, STARTTLS 또는 없음 (비보안)",
"options": {
"auto": "자동 (권장)",
"ssl": "SSL (포트 465)",
"tls": "STARTTLS (포트 587)",
"none": "없음 (비보안)"
}
}
},
"buttons": {
@@ -548,7 +562,10 @@
"updateSuccess": "{group} 설정이 성공적으로 업데이트되었습니다",
"smtpTestFailed": "SMTP 연결 실패: {error}",
"smtpTestGenericError": "SMTP 연결 테스트에 실패했습니다. 설정을 확인하고 다시 시도해주세요.",
"smtpTestSuccess": "SMTP 연결 성공! 이메일 구성이 올바르게 작동합니다."
"smtpTestSuccess": "SMTP 연결 성공! 이메일 구성이 올바르게 작동합니다.",
"smtpMissingAuth": "SMTP 사용자 이름과 비밀번호를 입력하거나 '인증 없음' 옵션을 활성화하세요.",
"smtpMissingHostPort": "테스트하기 전에 SMTP 호스트와 포트를 입력하세요.",
"smtpNotEnabled": "SMTP가 활성화되지 않았습니다. 먼저 SMTP를 활성화하세요."
},
"title": "설정",
"breadcrumb": "설정",
@@ -556,7 +573,8 @@
"tooltips": {
"oidcScope": "스코프를 입력하고 Enter 키를 눌러 추가",
"oidcAdminEmailDomains": "도메인을 입력하고 Enter 키를 눌러 추가",
"testSmtp": "현재 입력된 값으로 SMTP 연결을 테스트합니다. 변경 사항을 영구적으로 적용하려면 테스트 후 설정을 저장하는 것을 잊지 마세요."
"testSmtp": "현재 입력된 값으로 SMTP 연결을 테스트합니다. 변경 사항을 영구적으로 적용하려면 테스트 후 설정을 저장하는 것을 잊지 마세요.",
"defaultPlaceholder": "입력하고 Enter 키를 누르세요"
},
"redirectUri": {
"placeholder": "https://mysite.com",
@@ -589,7 +607,8 @@
"title": "공유를 찾을 수 없습니다",
"description": "이 공유는 삭제되었거나 만료되었을 수 있습니다."
},
"pageTitle": "공유"
"pageTitle": "공유",
"downloadAll": "모두 다운로드"
},
"shareActions": {
"deleteTitle": "공유 삭제",
@@ -1215,7 +1234,9 @@
"bulkDeleteProgress": "{count, plural, =1 {1개의 파일} other {#개의 파일}} 삭제 중...",
"bulkDeleteSuccess": "{count, plural, =1 {1개의 파일이} other {#개의 파일이}} 성공적으로 삭제됨",
"selectAll": "모두 선택",
"selectFile": "{fileName} 파일 선택"
"selectFile": "{fileName} 파일 선택",
"deleteError": "파일 삭제 오류",
"deleteSuccess": "파일이 성공적으로 삭제됨"
}
},
"form": {
@@ -1298,14 +1319,17 @@
"deleteSuccess": "수신 링크가 성공적으로 삭제되었습니다!",
"aliasCreated": "별칭이 성공적으로 생성되었습니다!",
"activateSuccess": "수신 링크가 성공적으로 활성화되었습니다!",
"deactivateSuccess": "수신 링크가 성공적으로 비활성화되었습니다!"
"deactivateSuccess": "수신 링크가 성공적으로 비활성화되었습니다!",
"passwordProtectionDisabled": "비밀번호 보호가 성공적으로 제거되었습니다!",
"passwordProtectionEnabled": "비밀번호 보호가 성공적으로 활성화되었습니다!"
},
"errors": {
"loadFailed": "수신 링크 로드 실패",
"createFailed": "수신 링크 생성 실패. 다시 시도하세요.",
"updateFailed": "수신 링크 업데이트 실패. 다시 시도하세요.",
"deleteFailed": "수신 링크 삭제 실패. 다시 시도하세요.",
"aliasCreateFailed": "별칭 생성 실패. 다시 시도하세요."
"aliasCreateFailed": "별칭 생성 실패. 다시 시도하세요.",
"passwordUpdateFailed": "비밀번호 보호 업데이트 실패"
},
"delete": {
"title": "수신 링크 삭제",
@@ -1421,6 +1445,7 @@
"saveChanges": "변경사항 저장",
"cancelEdit": "편집 취소"
}
}
},
"defaultLinkName": "받은 파일"
}
}

View File

@@ -532,6 +532,20 @@
"testSmtp": {
"title": "Test SMTP Verbinding",
"description": "Test of de SMTP configuratie geldig is"
},
"smtpNoAuth": {
"title": "Geen Authenticatie",
"description": "Schakel dit in voor interne servers die geen gebruikersnaam/wachtwoord vereisen (verbergt authenticatievelden)"
},
"smtpSecure": {
"title": "Verbindingsbeveiliging",
"description": "SMTP verbindingsbeveiligingsmethode - Auto (aanbevolen), SSL, STARTTLS, of Geen (onveilig)",
"options": {
"auto": "Auto (Aanbevolen)",
"ssl": "SSL (Poort 465)",
"tls": "STARTTLS (Poort 587)",
"none": "Geen (Onveilig)"
}
}
},
"buttons": {
@@ -548,7 +562,10 @@
"updateSuccess": "{group} instellingen succesvol bijgewerkt",
"smtpTestFailed": "SMTP verbinding mislukt: {error}",
"smtpTestGenericError": "SMTP verbinding testen mislukt. Controleer uw instellingen en probeer het opnieuw.",
"smtpTestSuccess": "SMTP verbinding succesvol! Uw e-mailconfiguratie werkt correct."
"smtpTestSuccess": "SMTP verbinding succesvol! Uw e-mailconfiguratie werkt correct.",
"smtpMissingAuth": "Vul de SMTP gebruikersnaam en wachtwoord in, of schakel de optie 'Geen Authenticatie' in.",
"smtpMissingHostPort": "Vul de SMTP Host en Poort in voordat u test.",
"smtpNotEnabled": "SMTP is niet ingeschakeld. Schakel eerst SMTP in."
},
"title": "Instellingen",
"breadcrumb": "Instellingen",
@@ -556,7 +573,8 @@
"tooltips": {
"oidcScope": "Voer een scope in en druk op Enter om toe te voegen",
"oidcAdminEmailDomains": "Voer een domein in en druk op Enter om toe te voegen",
"testSmtp": "Test de SMTP verbinding met de waarden die momenteel in het formulier zijn ingevoerd. Om wijzigingen permanent te maken, vergeet niet om uw instellingen op te slaan na het testen."
"testSmtp": "Test de SMTP verbinding met de waarden die momenteel in het formulier zijn ingevoerd. Om wijzigingen permanent te maken, vergeet niet om uw instellingen op te slaan na het testen.",
"defaultPlaceholder": "Voer in en druk op Enter"
},
"redirectUri": {
"placeholder": "https://mijnsite.com",
@@ -589,7 +607,8 @@
"title": "Delen Niet Gevonden",
"description": "Dit delen is mogelijk verwijderd of verlopen."
},
"pageTitle": "Delen"
"pageTitle": "Delen",
"downloadAll": "Alles Downloaden"
},
"shareActions": {
"deleteTitle": "Delen Verwijderen",
@@ -1215,7 +1234,9 @@
"bulkDeleteProgress": "{count, plural, =1 {1 bestand} other {# bestanden}} verwijderen...",
"bulkDeleteSuccess": "{count, plural, =1 {1 bestand succesvol verwijderd} other {# bestanden succesvol verwijderd}}",
"selectAll": "Alles selecteren",
"selectFile": "Selecteer bestand {fileName}"
"selectFile": "Selecteer bestand {fileName}",
"deleteError": "Fout bij verwijderen bestand",
"deleteSuccess": "Bestand succesvol verwijderd"
}
},
"form": {
@@ -1298,14 +1319,17 @@
"deleteSuccess": "Ontvangstlink succesvol verwijderd!",
"aliasCreated": "Alias succesvol aangemaakt!",
"activateSuccess": "Ontvangstlink succesvol geactiveerd!",
"deactivateSuccess": "Ontvangstlink succesvol gedeactiveerd!"
"deactivateSuccess": "Ontvangstlink succesvol gedeactiveerd!",
"passwordProtectionDisabled": "Wachtwoordbeveiliging succesvol verwijderd!",
"passwordProtectionEnabled": "Wachtwoordbeveiliging succesvol ingeschakeld!"
},
"errors": {
"loadFailed": "Fout bij laden ontvangstlinks",
"createFailed": "Fout bij aanmaken ontvangstlink. Probeer het opnieuw.",
"updateFailed": "Fout bij bijwerken ontvangstlink. Probeer het opnieuw.",
"deleteFailed": "Fout bij verwijderen ontvangstlink. Probeer het opnieuw.",
"aliasCreateFailed": "Fout bij aanmaken alias. Probeer het opnieuw."
"aliasCreateFailed": "Fout bij aanmaken alias. Probeer het opnieuw.",
"passwordUpdateFailed": "Fout bij bijwerken wachtwoordbeveiliging"
},
"delete": {
"title": "Ontvangstlink verwijderen",
@@ -1421,6 +1445,7 @@
"saveChanges": "Wijzigingen opslaan",
"cancelEdit": "Bewerken annuleren"
}
}
},
"defaultLinkName": "Ontvangen bestanden"
}
}

View File

@@ -532,6 +532,20 @@
"testSmtp": {
"title": "Test połączenia SMTP",
"description": "Sprawdź, czy konfiguracja SMTP jest prawidłowa"
},
"smtpNoAuth": {
"title": "Bez uwierzytelniania",
"description": "Włącz tę opcję dla serwerów wewnętrznych, które nie wymagają nazwy użytkownika/hasła (ukrywa pola uwierzytelniania)"
},
"smtpSecure": {
"title": "Bezpieczeństwo połączenia",
"description": "Metoda zabezpieczenia połączenia SMTP - Auto (zalecane), SSL, STARTTLS lub Brak (niezabezpieczone)",
"options": {
"auto": "Auto (Zalecane)",
"ssl": "SSL (Port 465)",
"tls": "STARTTLS (Port 587)",
"none": "Brak (Niezabezpieczone)"
}
}
},
"buttons": {
@@ -548,7 +562,10 @@
"updateSuccess": "Ustawienia {group} zaktualizowane pomyślnie",
"smtpTestFailed": "Połączenie SMTP nie powiodło się: {error}",
"smtpTestGenericError": "Nie udało się przetestować połączenia SMTP. Sprawdź ustawienia i spróbuj ponownie.",
"smtpTestSuccess": "Połączenie SMTP udane! Twoja konfiguracja poczty e-mail działa poprawnie."
"smtpTestSuccess": "Połączenie SMTP udane! Twoja konfiguracja poczty e-mail działa poprawnie.",
"smtpMissingAuth": "Proszę wypełnić nazwę użytkownika i hasło SMTP lub włączyć opcję 'Bez uwierzytelniania'.",
"smtpMissingHostPort": "Proszę wypełnić host i port SMTP przed testowaniem.",
"smtpNotEnabled": "SMTP nie jest włączone. Proszę najpierw włączyć SMTP."
},
"title": "Ustawienia",
"breadcrumb": "Ustawienia",
@@ -556,7 +573,8 @@
"tooltips": {
"oidcScope": "Wprowadź zakres i naciśnij Enter, aby dodać",
"oidcAdminEmailDomains": "Wprowadź domenę i naciśnij Enter, aby dodać",
"testSmtp": "Testuje połączenie SMTP z obecnie wprowadzonymi wartościami w formularzu. Aby wprowadzić trwałe zmiany, pamiętaj o zapisaniu ustawień po testowaniu."
"testSmtp": "Testuje połączenie SMTP z obecnie wprowadzonymi wartościami w formularzu. Aby wprowadzić trwałe zmiany, pamiętaj o zapisaniu ustawień po testowaniu.",
"defaultPlaceholder": "Wprowadź i naciśnij Enter"
},
"redirectUri": {
"placeholder": "https://mysite.com",
@@ -589,7 +607,8 @@
"title": "Udostępnienie nie znaleziono",
"description": "To udostępnienie mogło zostać usunięte lub wygasło."
},
"pageTitle": "Udostępnij"
"pageTitle": "Udostępnij",
"downloadAll": "[TO_TRANSLATE] Download All"
},
"shareActions": {
"deleteTitle": "Usuń udostępnienie",
@@ -1215,7 +1234,9 @@
"bulkDeleteProgress": "Usuwanie {count, plural, =1 {1 pliku} other {# plików}}...",
"bulkDeleteSuccess": "{count, plural, =1 {1 plik usunięty pomyślnie} other {# plików usuniętych pomyślnie}}",
"selectAll": "Zaznacz wszystko",
"selectFile": "Wybierz plik {fileName}"
"selectFile": "Wybierz plik {fileName}",
"deleteError": "Błąd usuwania pliku",
"deleteSuccess": "Plik usunięty pomyślnie"
}
},
"form": {
@@ -1298,14 +1319,17 @@
"deleteSuccess": "Link do odbierania usunięty pomyślnie!",
"aliasCreated": "Alias utworzony pomyślnie!",
"activateSuccess": "Link do odbierania aktywowany pomyślnie!",
"deactivateSuccess": "Link do odbierania dezaktywowany pomyślnie!"
"deactivateSuccess": "Link do odbierania dezaktywowany pomyślnie!",
"passwordProtectionDisabled": "Ochrona hasłem została pomyślnie usunięta!",
"passwordProtectionEnabled": "Ochrona hasłem została pomyślnie włączona!"
},
"errors": {
"loadFailed": "Nie udało się załadować linków do odbierania",
"createFailed": "Nie udało się utworzyć linku do odbierania. Spróbuj ponownie.",
"updateFailed": "Nie udało się zaktualizować linku do odbierania. Spróbuj ponownie.",
"deleteFailed": "Nie udało się usunąć linku do odbierania. Spróbuj ponownie.",
"aliasCreateFailed": "Nie udało się utworzyć aliasu. Spróbuj ponownie."
"aliasCreateFailed": "Nie udało się utworzyć aliasu. Spróbuj ponownie.",
"passwordUpdateFailed": "Nie udało się zaktualizować ochrony hasłem"
},
"delete": {
"title": "Usuń link do odbierania",
@@ -1421,6 +1445,7 @@
"saveChanges": "Zapisz zmiany",
"cancelEdit": "Anuluj edycję"
}
}
},
"defaultLinkName": "Otrzymane pliki"
}
}

View File

@@ -444,7 +444,8 @@
"tooltips": {
"oidcScope": "Digite um escopo e pressione Enter para adicionar",
"oidcAdminEmailDomains": "Digite um domínio e pressione Enter para adicionar",
"testSmtp": "Testa a conexão SMTP com os valores atualmente inseridos no formulário. Para tornar as alterações permanentes, lembre-se de salvar suas configurações após o teste."
"testSmtp": "Testa a conexão SMTP com os valores atualmente inseridos no formulário. Para tornar as alterações permanentes, lembre-se de salvar suas configurações após o teste.",
"defaultPlaceholder": "Digite e pressione Enter"
},
"redirectUri": {
"placeholder": "https://meusite.com",
@@ -563,6 +564,20 @@
"testSmtp": {
"title": "Testar Conexão SMTP",
"description": "Testa se a configuração SMTP é válida"
},
"smtpNoAuth": {
"title": "Sem Autenticação",
"description": "Ative isso para servidores internos que não exigem nome de usuário/senha (oculta campos de autenticação)"
},
"smtpSecure": {
"title": "Segurança da Conexão",
"description": "Método de segurança da conexão SMTP - Auto (recomendado), SSL, STARTTLS ou Nenhum (inseguro)",
"options": {
"auto": "Auto (Recomendado)",
"ssl": "SSL (Porta 465)",
"tls": "STARTTLS (Porta 587)",
"none": "Nenhum (Inseguro)"
}
}
},
"buttons": {
@@ -579,7 +594,10 @@
"updateSuccess": "Configurações de {group} atualizadas com sucesso",
"smtpTestFailed": "Falha na conexão SMTP: {error}",
"smtpTestGenericError": "Falha ao testar conexão SMTP. Por favor, verifique suas configurações e tente novamente.",
"smtpTestSuccess": "Conexão SMTP bem-sucedida! Sua configuração de e-mail está funcionando corretamente."
"smtpTestSuccess": "Conexão SMTP bem-sucedida! Sua configuração de e-mail está funcionando corretamente.",
"smtpMissingAuth": "Por favor, preencha o Nome de Usuário e Senha SMTP, ou ative a opção 'Sem Autenticação'.",
"smtpMissingHostPort": "Por favor, preencha o Host e Porta SMTP antes de testar.",
"smtpNotEnabled": "SMTP não está habilitado. Por favor, habilite o SMTP primeiro."
},
"title": "Configurações",
"breadcrumb": "Configurações",
@@ -611,7 +629,8 @@
"title": "Compartilhamento não Encontrado",
"description": "Este compartilhamento pode ter sido excluído ou expirado."
},
"pageTitle": "Compartilhamento"
"pageTitle": "Compartilhamento",
"downloadAll": "Baixar todos"
},
"shareActions": {
"deleteTitle": "Excluir Compartilhamento",
@@ -1215,7 +1234,9 @@
"bulkDeleteProgress": "Excluindo {count, plural, =1 {1 arquivo} other {# arquivos}}...",
"bulkDeleteSuccess": "{count, plural, =1 {1 arquivo excluído com sucesso} other {# arquivos excluídos com sucesso}}",
"selectAll": "Selecionar todos",
"selectFile": "Selecionar arquivo {fileName}"
"selectFile": "Selecionar arquivo {fileName}",
"deleteError": "Erro ao excluir arquivo",
"deleteSuccess": "Arquivo excluído com sucesso"
}
},
"form": {
@@ -1298,14 +1319,17 @@
"deleteSuccess": "Link de recebimento excluído com sucesso!",
"aliasCreated": "Alias criado com sucesso!",
"activateSuccess": "Link de recebimento ativado com sucesso!",
"deactivateSuccess": "Link de recebimento desativado com sucesso!"
"deactivateSuccess": "Link de recebimento desativado com sucesso!",
"passwordProtectionDisabled": "Proteção por senha removida com sucesso!",
"passwordProtectionEnabled": "Proteção por senha ativada com sucesso!"
},
"errors": {
"loadFailed": "Falha ao carregar links de recebimento",
"createFailed": "Falha ao criar link de recebimento. Tente novamente.",
"updateFailed": "Falha ao atualizar link de recebimento. Tente novamente.",
"deleteFailed": "Falha ao excluir link de recebimento. Tente novamente.",
"aliasCreateFailed": "Falha ao criar alias. Tente novamente."
"aliasCreateFailed": "Falha ao criar alias. Tente novamente.",
"passwordUpdateFailed": "Falha ao atualizar a proteção por senha"
},
"delete": {
"title": "Excluir link de recebimento",
@@ -1421,6 +1445,7 @@
"saveChanges": "Salvar alterações",
"cancelEdit": "Cancelar edição"
}
}
},
"defaultLinkName": "Arquivos recebidos"
}
}

View File

@@ -532,6 +532,20 @@
"testSmtp": {
"title": "Проверить SMTP-соединение",
"description": "Проверить правильность настройки SMTP"
},
"smtpNoAuth": {
"title": "Без аутентификации",
"description": "Включите для внутренних серверов, не требующих имя пользователя/пароль (скрывает поля аутентификации)"
},
"smtpSecure": {
"title": "Безопасность соединения",
"description": "Метод безопасности SMTP-соединения - Авто (рекомендуется), SSL, STARTTLS или Нет (небезопасно)",
"options": {
"auto": "Авто (Рекомендуется)",
"ssl": "SSL (Порт 465)",
"tls": "STARTTLS (Порт 587)",
"none": "Нет (Небезопасно)"
}
}
},
"buttons": {
@@ -548,7 +562,10 @@
"updateSuccess": "Настройки {group} успешно обновлены",
"smtpTestFailed": "Ошибка SMTP-соединения: {error}",
"smtpTestGenericError": "Не удалось проверить SMTP-соединение. Пожалуйста, проверьте настройки и попробуйте снова.",
"smtpTestSuccess": "SMTP-соединение успешно установлено! Ваша конфигурация электронной почты работает корректно."
"smtpTestSuccess": "SMTP-соединение успешно установлено! Ваша конфигурация электронной почты работает корректно.",
"smtpMissingAuth": "Пожалуйста, заполните имя пользователя и пароль SMTP или включите опцию 'Без аутентификации'.",
"smtpMissingHostPort": "Пожалуйста, заполните хост и порт SMTP перед тестированием.",
"smtpNotEnabled": "SMTP не включен. Пожалуйста, сначала включите SMTP."
},
"title": "Настройки",
"breadcrumb": "Настройки",
@@ -556,7 +573,8 @@
"tooltips": {
"oidcScope": "Digite um escopo e pressione Enter para adicionar",
"oidcAdminEmailDomains": "Digite um domínio e pressione Enter para adicionar",
"testSmtp": "Проверяет SMTP-соединение с текущими значениями в форме. Чтобы сохранить изменения, не забудьте сохранить настройки после тестирования."
"testSmtp": "Проверяет SMTP-соединение с текущими значениями в форме. Чтобы сохранить изменения, не забудьте сохранить настройки после тестирования.",
"defaultPlaceholder": "Введите и нажмите Enter"
},
"redirectUri": {
"placeholder": "https://meusite.com",
@@ -589,7 +607,8 @@
"title": "Общий доступ не найден",
"description": "Этот общий доступ может быть удален или истек."
},
"pageTitle": "Общий доступ"
"pageTitle": "Общий доступ",
"downloadAll": "Скачать все"
},
"shareActions": {
"deleteTitle": "Удалить Общий Доступ",
@@ -1215,7 +1234,9 @@
"bulkDeleteProgress": "Удаление {count, plural, =1 {1 файла} other {# файлов}}...",
"bulkDeleteSuccess": "{count, plural, =1 {1 файл успешно удален} other {# файлов успешно удалено}}",
"selectAll": "Выбрать все",
"selectFile": "Выбрать файл {fileName}"
"selectFile": "Выбрать файл {fileName}",
"deleteError": "Ошибка при удалении файла",
"deleteSuccess": "Файл успешно удален"
}
},
"form": {
@@ -1298,14 +1319,17 @@
"deleteSuccess": "Ссылка для получения успешно удалена!",
"aliasCreated": "Псевдоним успешно создан!",
"activateSuccess": "Ссылка для получения успешно активирована!",
"deactivateSuccess": "Ссылка для получения успешно деактивирована!"
"deactivateSuccess": "Ссылка для получения успешно деактивирована!",
"passwordProtectionDisabled": "Защита паролем успешно отключена!",
"passwordProtectionEnabled": "Защита паролем успешно включена!"
},
"errors": {
"loadFailed": "Не удалось загрузить ссылки для получения",
"createFailed": "Не удалось создать ссылку для получения. Попробуйте снова.",
"updateFailed": "Не удалось обновить ссылку для получения. Попробуйте снова.",
"deleteFailed": "Не удалось удалить ссылку для получения. Попробуйте снова.",
"aliasCreateFailed": "Не удалось создать псевдоним. Попробуйте снова."
"aliasCreateFailed": "Не удалось создать псевдоним. Попробуйте снова.",
"passwordUpdateFailed": "Не удалось обновить защиту паролем"
},
"delete": {
"title": "Удалить ссылку для получения",
@@ -1421,6 +1445,7 @@
"saveChanges": "Сохранить изменения",
"cancelEdit": "Отменить редактирование"
}
}
},
"defaultLinkName": "Полученные файлы"
}
}

View File

@@ -532,6 +532,20 @@
"testSmtp": {
"title": "SMTP Bağlantısını Test Et",
"description": "SMTP yapılandırmasının geçerli olup olmadığını test et"
},
"smtpNoAuth": {
"title": "Kimlik Doğrulama Yok",
"description": "Kullanıcı adı/şifre gerektirmeyen dahili sunucular için bunu etkinleştirin (kimlik doğrulama alanlarını gizler)"
},
"smtpSecure": {
"title": "Bağlantı Güvenliği",
"description": "SMTP bağlantı güvenlik yöntemi - Otomatik (önerilen), SSL, STARTTLS veya Hiçbiri (güvensiz)",
"options": {
"auto": "Otomatik (Önerilen)",
"ssl": "SSL (Port 465)",
"tls": "STARTTLS (Port 587)",
"none": "Hiçbiri (Güvensiz)"
}
}
},
"buttons": {
@@ -548,7 +562,10 @@
"updateSuccess": "{group} ayarları başarıyla güncellendi",
"smtpTestFailed": "SMTP bağlantısı başarısız: {error}",
"smtpTestGenericError": "SMTP bağlantısı test edilemedi. Lütfen ayarlarınızı kontrol edin ve tekrar deneyin.",
"smtpTestSuccess": "SMTP bağlantısı başarılı! E-posta yapılandırmanız doğru çalışıyor."
"smtpTestSuccess": "SMTP bağlantısı başarılı! E-posta yapılandırmanız doğru çalışıyor.",
"smtpMissingAuth": "Lütfen SMTP Kullanıcı Adı ve Şifresini doldurun veya 'Kimlik Doğrulama Yok' seçeneğini etkinleştirin.",
"smtpMissingHostPort": "Lütfen test etmeden önce SMTP Ana Bilgisayar ve Bağlantı Noktasını doldurun.",
"smtpNotEnabled": "SMTP etkin değil. Lütfen önce SMTP'yi etkinleştirin."
},
"title": "Ayarlar",
"breadcrumb": "Ayarlar",
@@ -556,7 +573,8 @@
"tooltips": {
"oidcScope": "Bir kapsam girin ve eklemek için Enter'a basın",
"oidcAdminEmailDomains": "Bir alan girin ve eklemek için Enter'a basın",
"testSmtp": "Formda şu anda girilen değerlerle SMTP bağlantısını test eder. Değişiklikleri kalıcı yapmak için test ettikten sonra ayarlarınızı kaydetmeyi unutmayın."
"testSmtp": "Formda şu anda girilen değerlerle SMTP bağlantısını test eder. Değişiklikleri kalıcı yapmak için test ettikten sonra ayarlarınızı kaydetmeyi unutmayın.",
"defaultPlaceholder": "Girin ve Enter'a basın"
},
"redirectUri": {
"placeholder": "https://sitem.com",
@@ -589,7 +607,8 @@
"title": "Paylaşım Bulunamadı",
"description": "Bu paylaşım silinmiş veya süresi dolmuş olabilir."
},
"pageTitle": "Paylaşım"
"pageTitle": "Paylaşım",
"downloadAll": "Tümünü İndir"
},
"shareActions": {
"deleteTitle": "Paylaşımı Sil",
@@ -1215,7 +1234,9 @@
"bulkDeleteProgress": "{count, plural, =1 {1 dosya} other {# dosya}} siliniyor...",
"bulkDeleteSuccess": "{count, plural, =1 {1 dosya başarıyla silindi} other {# dosya başarıyla silindi}}",
"selectAll": "Tümünü seç",
"selectFile": "{fileName} dosyasını seç"
"selectFile": "{fileName} dosyasını seç",
"deleteError": "Dosya silinirken hata oluştu",
"deleteSuccess": "Dosya başarıyla silindi"
}
},
"form": {
@@ -1298,14 +1319,17 @@
"deleteSuccess": "Alma bağlantısı başarıyla silindi!",
"aliasCreated": "Takma ad başarıyla oluşturuldu!",
"activateSuccess": "Alma bağlantısı başarıyla etkinleştirildi!",
"deactivateSuccess": "Alma bağlantısı başarıyla devre dışı bırakıldı!"
"deactivateSuccess": "Alma bağlantısı başarıyla devre dışı bırakıldı!",
"passwordProtectionDisabled": "Şifre koruması başarıyla kaldırıldı!",
"passwordProtectionEnabled": "Şifre koruması başarıyla etkinleştirildi!"
},
"errors": {
"loadFailed": "Alma bağlantıları yüklenemedi",
"createFailed": "Alma bağlantısı oluşturulamadı. Lütfen tekrar deneyin.",
"updateFailed": "Alma bağlantısı güncellenemedi. Lütfen tekrar deneyin.",
"deleteFailed": "Alma bağlantısı silinemedi. Lütfen tekrar deneyin.",
"aliasCreateFailed": "Takma ad oluşturulamadı. Lütfen tekrar deneyin."
"aliasCreateFailed": "Takma ad oluşturulamadı. Lütfen tekrar deneyin.",
"passwordUpdateFailed": "Şifre koruması güncellenemedi"
},
"delete": {
"title": "Alma bağlantısını sil",
@@ -1421,6 +1445,7 @@
"saveChanges": "Değişiklikleri kaydet",
"cancelEdit": "Düzenlemeyi iptal et"
}
}
},
"defaultLinkName": "Alınan Dosyalar"
}
}

View File

@@ -532,6 +532,20 @@
"testSmtp": {
"title": "测试SMTP连接",
"description": "测试SMTP配置是否有效"
},
"smtpNoAuth": {
"title": "无需认证",
"description": "为不需要用户名/密码的内部服务器启用此选项(隐藏认证字段)"
},
"smtpSecure": {
"title": "连接安全性",
"description": "SMTP连接安全方法 - 自动推荐、SSL、STARTTLS或无不安全",
"options": {
"auto": "自动(推荐)",
"ssl": "SSL端口465",
"tls": "STARTTLS端口587",
"none": "无(不安全)"
}
}
},
"buttons": {
@@ -548,7 +562,10 @@
"updateSuccess": "{group}设置更新成功",
"smtpTestFailed": "SMTP连接失败{error}",
"smtpTestGenericError": "SMTP连接测试失败。请检查您的设置并重试。",
"smtpTestSuccess": "SMTP连接成功您的电子邮件配置工作正常。"
"smtpTestSuccess": "SMTP连接成功您的电子邮件配置工作正常。",
"smtpMissingAuth": "请填写SMTP用户名和密码或启用“无需认证”选项。",
"smtpMissingHostPort": "测试前请填写SMTP主机和端口。",
"smtpNotEnabled": "SMTP未启用。请先启用SMTP。"
},
"title": "设置",
"breadcrumb": "设置",
@@ -556,7 +573,8 @@
"tooltips": {
"oidcScope": "Digite um escopo e pressione Enter para adicionar",
"oidcAdminEmailDomains": "Digite um domínio e pressione Enter para adicionar",
"testSmtp": "使用当前在表单中输入的值测试SMTP连接。要使更改永久生效请记得在测试后保存您的设置。"
"testSmtp": "使用当前在表单中输入的值测试SMTP连接。要使更改永久生效请记得在测试后保存您的设置。",
"defaultPlaceholder": "输入并按回车键"
},
"redirectUri": {
"placeholder": "https://meusite.com",
@@ -589,7 +607,8 @@
"title": "未找到共享",
"description": "该共享可能已被删除或已过期。"
},
"pageTitle": "共享"
"pageTitle": "共享",
"downloadAll": "下载所有"
},
"shareActions": {
"deleteTitle": "删除共享",
@@ -1215,7 +1234,9 @@
"bulkDeleteProgress": "正在删除{count, plural, =1 {1个文件} other {#个文件}}...",
"bulkDeleteSuccess": "{count, plural, =1 {1个文件已成功删除} other {#个文件已成功删除}}",
"selectAll": "全选",
"selectFile": "选择文件 {fileName}"
"selectFile": "选择文件 {fileName}",
"deleteError": "删除文件时出错",
"deleteSuccess": "文件已成功删除"
}
},
"form": {
@@ -1298,14 +1319,17 @@
"deleteSuccess": "接收链接删除成功!",
"aliasCreated": "别名创建成功!",
"activateSuccess": "接收链接启用成功!",
"deactivateSuccess": "接收链接停用成功!"
"deactivateSuccess": "接收链接停用成功!",
"passwordProtectionDisabled": "密码保护已成功移除!",
"passwordProtectionEnabled": "密码保护已成功启用!"
},
"errors": {
"loadFailed": "加载接收链接失败",
"createFailed": "创建接收链接失败。请重试。",
"updateFailed": "更新接收链接失败。请重试。",
"deleteFailed": "删除接收链接失败。请重试。",
"aliasCreateFailed": "创建别名失败。请重试。"
"aliasCreateFailed": "创建别名失败。请重试。",
"passwordUpdateFailed": "更新密码保护失败"
},
"delete": {
"title": "删除接收链接",
@@ -1421,6 +1445,7 @@
"saveChanges": "保存更改",
"cancelEdit": "取消编辑"
}
}
},
"defaultLinkName": "已接收文件"
}
}

View File

@@ -73,14 +73,16 @@ export function EditPasswordModal({
});
toast.success(
data.hasPassword ? "Proteção por senha ativada com sucesso!" : "Proteção por senha removida com sucesso!"
data.hasPassword
? t("reverseShares.messages.passwordProtectionEnabled")
: t("reverseShares.messages.passwordProtectionDisabled")
);
onClose();
form.reset();
} catch (error) {
console.error("Failed to update password:", error);
toast.error("Erro ao atualizar proteção por senha");
toast.error(t("reverseShares.errors.passwordUpdateFailed"));
}
};

View File

@@ -47,6 +47,7 @@ import {
} from "@/http/endpoints/reverse-shares";
import type { ReverseShareFile } from "@/http/endpoints/reverse-shares/types";
import { getFileIcon } from "@/utils/file-icons";
import { truncateFileName } from "@/utils/file-utils";
import { ReverseShare } from "../hooks/use-reverse-shares";
import { ReverseShareFilePreviewModal } from "./reverse-share-file-preview-modal";
@@ -542,10 +543,10 @@ export function ReceivedFilesModal({
await onRefresh();
}
toast.success("Arquivo excluído com sucesso");
toast.success(t("reverseShares.modals.receivedFiles.deleteSuccess"));
} catch (error) {
console.error("Error deleting file:", error);
toast.error("Erro ao excluir arquivo");
toast.error(t("reverseShares.modals.receivedFiles.deleteError"));
}
};
@@ -639,7 +640,7 @@ export function ReceivedFilesModal({
await Promise.all(downloadPromises);
const zipBlob = await zip.generateAsync({ type: "blob" });
const zipName = `${reverseShare.name || "received_files"}_files.zip`;
const zipName = `${reverseShare.name || t("reverseShares.defaultLinkName")}_files.zip`;
const url = URL.createObjectURL(zipBlob);
const a = document.createElement("a");
@@ -912,11 +913,12 @@ export function ReceivedFilesModal({
<div className="space-y-1">
{filesToDeleteBulk.map((file) => {
const { icon: FileIcon, color } = getFileIcon(file.name);
const displayName = truncateFileName(file.name);
return (
<div key={file.id} className="flex items-center gap-2 p-2 bg-muted/20 rounded text-sm">
<div key={file.id} className="flex items-center gap-2 p-2 bg-muted/20 rounded text-sm min-w-0">
<FileIcon className={`h-4 w-4 ${color} flex-shrink-0`} />
<span className="truncate" title={file.name}>
{file.name}
<span className="flex-1 break-all" title={file.name}>
{displayName}
</span>
</div>
);

View File

@@ -1,22 +1,33 @@
import { IconShare } from "@tabler/icons-react";
import { IconDownload, IconShare } from "@tabler/icons-react";
import { format } from "date-fns";
import { useTranslations } from "next-intl";
import { Button } from "@/components/ui/button";
import { Card, CardContent } from "@/components/ui/card";
import { ShareDetailsProps } from "../types";
import { ShareFilesTable } from "./files-table";
export function ShareDetails({ share, onDownload }: ShareDetailsProps) {
export function ShareDetails({ share, onDownload, onBulkDownload }: ShareDetailsProps) {
const t = useTranslations();
const hasMultipleFiles = share.files && share.files.length > 1;
return (
<Card>
<CardContent>
<div className="flex flex-col gap-6">
<div className="flex flex-col gap-2">
<div className="flex items-center gap-2">
<IconShare className="w-6 h-6 text-muted-foreground" />
<h1 className="text-2xl font-semibold">{share.name || t("share.details.untitled")}</h1>
<div className="flex items-center justify-between">
<div className="flex items-center gap-2">
<IconShare className="w-6 h-6 text-muted-foreground" />
<h1 className="text-2xl font-semibold">{share.name || t("share.details.untitled")}</h1>
</div>
{hasMultipleFiles && (
<Button onClick={onBulkDownload} className="flex items-center gap-2">
<IconDownload className="w-4 h-4" />
{t("share.downloadAll")}
</Button>
)}
</div>
{share.description && <p className="text-muted-foreground">{share.description}</p>}
<div className="flex gap-4 text-sm text-muted-foreground">

View File

@@ -1,5 +1,6 @@
import Image from "next/image";
import Link from "next/link";
import { useTranslations } from "next-intl";
import { LanguageSwitcher } from "@/components/general/language-switcher";
import { ModeToggle } from "@/components/general/mode-toggle";
@@ -7,12 +8,13 @@ import { useAppInfo } from "@/contexts/app-info-context";
export function ShareHeader() {
const { appName, appLogo } = useAppInfo();
const t = useTranslations();
return (
<header className="w-full px-6 border-b border-default-200/50 bg-background/70 backdrop-blur-sm">
<div className="mx-auto max-w-5xl sm:p-0 h-16 flex items-center justify-between">
<Link className="flex items-center gap-2" href="/">
{appLogo && <img alt="App Logo" className="h-8 w-8 object-contain rounded" src={appLogo} />}
{appLogo && <img alt={t("logo.labels.appLogo")} className="h-8 w-8 object-contain rounded" src={appLogo} />}
<p className="font-bold text-2xl text-foreground">{appName}</p>
</Link>
<div className="flex items-center gap-2">

View File

@@ -69,6 +69,62 @@ export function usePublicShare() {
}
};
const handleBulkDownload = async () => {
if (!share || !share.files || share.files.length === 0) {
toast.error(t("shareManager.noFilesToDownload"));
return;
}
try {
toast.promise(
(async () => {
const JSZip = (await import("jszip")).default;
const zip = new JSZip();
const downloadPromises = share.files.map(async (file) => {
try {
const encodedObjectName = encodeURIComponent(file.objectName);
const downloadResponse = await getDownloadUrl(encodedObjectName);
const downloadUrl = downloadResponse.data.url;
const response = await fetch(downloadUrl);
if (!response.ok) {
throw new Error(`Failed to download ${file.name}`);
}
const blob = await response.blob();
zip.file(file.name, blob);
} catch (error) {
console.error(`Error downloading file ${file.name}:`, error);
throw error;
}
});
await Promise.all(downloadPromises);
const zipBlob = await zip.generateAsync({ type: "blob" });
const zipName = `${share.name || t("shareManager.defaultShareName")}.zip`;
const url = URL.createObjectURL(zipBlob);
const a = document.createElement("a");
a.href = url;
a.download = zipName;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url);
})(),
{
loading: t("shareManager.creatingZip"),
success: t("shareManager.zipDownloadSuccess"),
error: t("shareManager.zipDownloadError"),
}
);
} catch (error) {
console.error("Error creating ZIP:", error);
}
};
const downloadFile = async (url: string, fileName: string) => {
const fileResponse = await fetch(url);
const blob = await fileResponse.blob();
@@ -97,5 +153,6 @@ export function usePublicShare() {
setPassword,
handlePasswordSubmit,
handleDownload,
handleBulkDownload,
};
}

View File

@@ -18,6 +18,7 @@ export default function PublicSharePage() {
setPassword,
handlePasswordSubmit,
handleDownload,
handleBulkDownload,
} = usePublicShare();
if (isLoading) {
@@ -31,7 +32,7 @@ export default function PublicSharePage() {
<main className="flex-1 container mx-auto px-6 py-8">
<div className="max-w-5xl mx-auto space-y-6">
{!isPasswordModalOpen && !share && <ShareNotFound />}
{share && <ShareDetails share={share} onDownload={handleDownload} />}
{share && <ShareDetails share={share} onDownload={handleDownload} onBulkDownload={handleBulkDownload} />}
</div>
</main>

View File

@@ -24,4 +24,5 @@ export interface PasswordModalProps {
export interface ShareDetailsProps {
share: GetShareByAlias200Share;
onDownload: (objectName: string, fileName: string) => Promise<void>;
onBulkDownload?: () => Promise<void>;
}

View File

@@ -51,42 +51,71 @@ export function SettingsGroup({ group, configs, form, isCollapsed, onToggleColla
<div className="flex flex-col gap-4">
{configs
.filter((config) => !isFieldHidden(config.key))
.map((config) => (
<div key={config.key} className="space-y-2 mb-3">
<SettingsInput
config={config}
error={form.formState.errors.configs?.[config.key]}
register={form.register}
setValue={form.setValue}
smtpEnabled={form.watch("configs.smtpEnabled")}
oidcEnabled={form.watch("configs.oidcEnabled")}
watch={form.watch}
/>
<p className="text-xs text-muted-foreground ml-1">
{t(`settings.fields.${config.key}.description`, {
defaultValue:
FIELD_DESCRIPTIONS[config.key as keyof typeof FIELD_DESCRIPTIONS] ||
config.description ||
t("settings.fields.noDescription"),
})}
</p>
</div>
))}
.map((config) => {
const smtpEnabled = form.watch("configs.smtpEnabled");
const smtpNoAuth = form.watch("configs.smtpNoAuth");
const isSmtpAuthField = config.key === "smtpUser" || config.key === "smtpPass";
const smtpFields = [
"smtpHost",
"smtpPort",
"smtpUser",
"smtpPass",
"smtpSecure",
"smtpNoAuth",
"smtpFromName",
"smtpFromEmail",
];
if (smtpEnabled !== "true" && smtpFields.includes(config.key)) {
return null;
}
if (isSmtpAuthField && smtpNoAuth === "true") {
return null;
}
return (
<div key={config.key} className="space-y-2 mb-3">
<SettingsInput
config={config}
error={form.formState.errors.configs?.[config.key]}
register={form.register}
setValue={form.setValue}
smtpEnabled={form.watch("configs.smtpEnabled")}
oidcEnabled={form.watch("configs.oidcEnabled")}
watch={form.watch}
/>
<p className="text-xs text-muted-foreground ml-1">
{t(`settings.fields.${config.key}.description`, {
defaultValue:
FIELD_DESCRIPTIONS[config.key as keyof typeof FIELD_DESCRIPTIONS] ||
config.description ||
t("settings.fields.noDescription"),
})}
</p>
</div>
);
})}
</div>
<div className="flex justify-between items-center mt-4">
{isEmailGroup && (
<SmtpTestButton
smtpEnabled={form.watch("configs.smtpEnabled") || "false"}
getFormValues={() => ({
smtpEnabled: form.getValues("configs.smtpEnabled") || "false",
smtpHost: form.getValues("configs.smtpHost") || "",
smtpPort: form.getValues("configs.smtpPort") || "",
smtpUser: form.getValues("configs.smtpUser") || "",
smtpPass: form.getValues("configs.smtpPass") || "",
})}
/>
)}
<div className={`flex ${isEmailGroup ? "ml-auto" : ""}`}>
<div className="flex">
{isEmailGroup && form.watch("configs.smtpEnabled") === "true" && (
<SmtpTestButton
smtpEnabled={form.watch("configs.smtpEnabled") || "false"}
getFormValues={() => ({
smtpEnabled: form.getValues("configs.smtpEnabled") || "false",
smtpHost: form.getValues("configs.smtpHost") || "",
smtpPort: form.getValues("configs.smtpPort") || "",
smtpUser: form.getValues("configs.smtpUser") || "",
smtpPass: form.getValues("configs.smtpPass") || "",
smtpSecure: form.getValues("configs.smtpSecure") || "auto",
smtpNoAuth: form.getValues("configs.smtpNoAuth") || "false",
})}
/>
)}
</div>
<div className="flex">
<Button
variant="default"
disabled={form.formState.isSubmitting}

View File

@@ -2,8 +2,10 @@ import { IconInfoCircle } from "@tabler/icons-react";
import { useTranslations } from "next-intl";
import { UseFormRegister, UseFormSetValue, UseFormWatch } from "react-hook-form";
import { Checkbox } from "@/components/ui/checkbox";
import { Input } from "@/components/ui/input";
import { PasswordInput } from "@/components/ui/password-input";
import { Switch } from "@/components/ui/switch";
import { TagsInput } from "@/components/ui/tags-input";
import { createFieldTitles } from "../constants";
import { Config } from "../types";
@@ -129,7 +131,7 @@ export function SettingsInput({
? "openid profile email"
: config.key === "oidcAdminEmailDomains"
? "admin.com company.org"
: "Digite e pressione Enter"
: t("settings.tooltips.defaultPlaceholder", { defaultValue: "Enter and press Enter" })
}
/>
{error && <p className="text-danger text-xs mt-1">{error.message}</p>}
@@ -137,6 +139,73 @@ export function SettingsInput({
);
}
if (config.key === "smtpEnabled") {
const currentValue = watch(`configs.${config.key}`) === "true";
return (
<div className="space-y-2">
<div className="flex items-center space-x-3">
<Switch
id={`configs.${config.key}`}
checked={currentValue}
onCheckedChange={(checked) => {
setValue(`configs.${config.key}`, checked ? "true" : "false", { shouldDirty: true });
}}
disabled={isDisabled}
/>
<label htmlFor={`configs.${config.key}`} className="text-sm font-semibold cursor-pointer">
{friendlyLabel}
</label>
</div>
{config.description && <p className="text-xs text-muted-foreground ml-11">{config.description}</p>}
{error && <p className="text-danger text-xs mt-1 ml-11">{error.message}</p>}
</div>
);
}
if (config.key === "smtpSecure") {
return (
<div className="space-y-2">
<label className="block text-sm font-semibold">{friendlyLabel}</label>
<select
{...register(`configs.${config.key}`)}
className="w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm"
disabled={isDisabled}
>
<option value="auto">{t("settings.fields.smtpSecure.options.auto")}</option>
<option value="ssl">{t("settings.fields.smtpSecure.options.ssl")}</option>
<option value="tls">{t("settings.fields.smtpSecure.options.tls")}</option>
<option value="none">{t("settings.fields.smtpSecure.options.none")}</option>
</select>
{error && <p className="text-danger text-xs mt-1">{error.message}</p>}
</div>
);
}
if (config.key === "smtpNoAuth") {
const currentValue = watch(`configs.${config.key}`) === "true";
return (
<div className="space-y-2">
<div className="flex items-center space-x-3">
<Checkbox
id={`configs.${config.key}`}
checked={currentValue}
onCheckedChange={(checked) => {
setValue(`configs.${config.key}`, checked ? "true" : "false", { shouldDirty: true });
}}
disabled={isDisabled}
/>
<label htmlFor={`configs.${config.key}`} className="text-sm font-semibold cursor-pointer">
{friendlyLabel}
</label>
</div>
{config.description && <p className="text-xs text-muted-foreground ml-7">{config.description}</p>}
{error && <p className="text-danger text-xs mt-1 ml-7">{error.message}</p>}
</div>
);
}
switch (config.type) {
case "boolean":
return (

View File

@@ -16,6 +16,8 @@ interface SmtpTestButtonProps {
smtpPort: string;
smtpUser: string;
smtpPass: string;
smtpSecure: string;
smtpNoAuth: string;
};
}
@@ -27,13 +29,17 @@ export function SmtpTestButton({ smtpEnabled, getFormValues }: SmtpTestButtonPro
const formValues = getFormValues();
if (formValues.smtpEnabled !== "true") {
toast.error("SMTP is not enabled. Please enable SMTP first.");
toast.error(t("settings.messages.smtpNotEnabled"));
return;
}
// Check if required fields are filled
if (!formValues.smtpHost || !formValues.smtpPort || !formValues.smtpUser || !formValues.smtpPass) {
toast.error("Please fill in all SMTP configuration fields before testing.");
if (!formValues.smtpHost || !formValues.smtpPort) {
toast.error(t("settings.messages.smtpMissingHostPort"));
return;
}
if (formValues.smtpNoAuth !== "true" && (!formValues.smtpUser || !formValues.smtpPass)) {
toast.error(t("settings.messages.smtpMissingAuth"));
return;
}
@@ -46,6 +52,8 @@ export function SmtpTestButton({ smtpEnabled, getFormValues }: SmtpTestButtonPro
smtpPort: formValues.smtpPort,
smtpUser: formValues.smtpUser,
smtpPass: formValues.smtpPass,
smtpSecure: formValues.smtpSecure,
smtpNoAuth: formValues.smtpNoAuth,
},
});
@@ -55,7 +63,7 @@ export function SmtpTestButton({ smtpEnabled, getFormValues }: SmtpTestButtonPro
toast.error(t("settings.messages.smtpTestGenericError"));
}
} catch (error: any) {
const errorMessage = error?.response?.data?.error || error?.message || "Unknown error";
const errorMessage = error?.response?.data?.error || error?.message || t("common.unexpectedError");
toast.error(t("settings.messages.smtpTestFailed", { error: errorMessage }));
} finally {
setIsLoading(false);

View File

@@ -46,6 +46,8 @@ export const createFieldDescriptions = (t: ReturnType<typeof createTranslator>)
smtpPass: t("settings.fields.smtpPass.description"),
smtpFromName: t("settings.fields.smtpFromName.description"),
smtpFromEmail: t("settings.fields.smtpFromEmail.description"),
smtpSecure: t("settings.fields.smtpSecure.description"),
smtpNoAuth: t("settings.fields.smtpNoAuth.description"),
// OIDC settings (nomes corretos do seed)
oidcEnabled: t("settings.fields.oidcEnabled.description"),
@@ -85,6 +87,8 @@ export const createFieldTitles = (t: ReturnType<typeof createTranslator>) => ({
smtpPass: t("settings.fields.smtpPass.title"),
smtpFromName: t("settings.fields.smtpFromName.title"),
smtpFromEmail: t("settings.fields.smtpFromEmail.title"),
smtpSecure: t("settings.fields.smtpSecure.title"),
smtpNoAuth: t("settings.fields.smtpNoAuth.title"),
// OIDC settings
oidcEnabled: t("settings.fields.oidcEnabled.title"),

View File

@@ -77,8 +77,26 @@ export function useSettings() {
}
if (group === "email") {
if (a.key === "smtpEnabled") return -1;
if (b.key === "smtpEnabled") return 1;
const smtpOrder = [
"smtpEnabled",
"smtpHost",
"smtpPort",
"smtpSecure",
"smtpNoAuth",
"smtpUser",
"smtpPass",
"smtpFromName",
"smtpFromEmail",
];
const aIndex = smtpOrder.indexOf(a.key);
const bIndex = smtpOrder.indexOf(b.key);
if (aIndex !== -1 && bIndex !== -1) {
return aIndex - bIndex;
}
if (aIndex !== -1) return -1;
if (bIndex !== -1) return 1;
}
if (group === "oidc") {

View File

@@ -42,7 +42,7 @@ export function FileSelector({ shareId, selectedFiles, onSave, onEditFile }: Fil
setShareFiles(allFiles.filter((file) => selectedFiles.includes(file.id)));
setAvailableFiles(allFiles.filter((file) => !selectedFiles.includes(file.id)));
} catch (error) {
toast.error("Failed to load files");
toast.error(t("files.loadError"));
}
};
@@ -79,7 +79,7 @@ export function FileSelector({ shareId, selectedFiles, onSave, onEditFile }: Fil
await onSave(shareFiles.map((f) => f.id));
} catch (error) {
toast.error("Failed to update files");
toast.error(t("shareManager.filesUpdateError"));
} finally {
setIsLoading(false);
}

View File

@@ -6,6 +6,8 @@ import { useTranslations } from "next-intl";
import { Button } from "@/components/ui/button";
import { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from "@/components/ui/dialog";
import { ScrollArea } from "@/components/ui/scroll-area";
import { getFileIcon } from "@/utils/file-icons";
import { truncateFileName } from "@/utils/file-utils";
interface DeleteConfirmationModalProps {
isOpen: boolean;
@@ -54,11 +56,18 @@ export function DeleteConfirmationModal({
</p>
<ScrollArea className="h-32 w-full rounded-md border p-2">
<div className="space-y-1">
{files.map((fileName, index) => (
<div key={index} className="text-sm text-muted-foreground truncate">
{fileName}
</div>
))}
{files.map((fileName, index) => {
const { icon: FileIcon, color } = getFileIcon(fileName);
const displayName = truncateFileName(fileName);
return (
<div key={index} className="flex items-center gap-2 p-2 bg-muted/20 rounded text-sm min-w-0">
<FileIcon className={`h-4 w-4 ${color} flex-shrink-0`} />
<span className="flex-1 break-all" title={fileName}>
{displayName}
</span>
</div>
);
})}
</div>
</ScrollArea>
</div>

View File

@@ -195,9 +195,9 @@ export function useFileManager(onRefresh: () => Promise<void>, clearSelection?:
}
})(),
{
loading: "Criando arquivo ZIP...",
success: "Arquivo ZIP baixado com sucesso!",
error: "Erro ao criar arquivo ZIP",
loading: t("shareManager.creatingZip"),
success: t("shareManager.zipDownloadSuccess"),
error: t("shareManager.zipDownloadError"),
}
);
} catch (error) {

View File

@@ -255,7 +255,7 @@ export function useShareManager(onSuccess: () => void) {
share.files.forEach((file) => {
allFiles.push({
...file,
shareName: share.name || "Unnamed Share",
shareName: share.name || t("shareManager.defaultShareName"),
});
});
}

View File

@@ -90,6 +90,8 @@ export interface TestSmtpConnectionBody {
smtpPort: string;
smtpUser: string;
smtpPass: string;
smtpSecure: string;
smtpNoAuth: string;
};
}

View File

@@ -6,3 +6,28 @@ export function generateSafeFileName(originalName: string): string {
return `${safeId}.${extension}`;
}
/**
* Intelligently truncates a filename while preserving the extension when possible
* @param fileName - Filename to truncate
* @param maxLength - Maximum length of the name (default: 40)
* @returns Truncated filename
*/
export function truncateFileName(fileName: string, maxLength: number = 40): string {
if (fileName.length <= maxLength) return fileName;
const lastDotIndex = fileName.lastIndexOf(".");
if (lastDotIndex > 0 && lastDotIndex > fileName.length - 10) {
const name = fileName.substring(0, lastDotIndex);
const extension = fileName.substring(lastDotIndex);
const availableLength = maxLength - extension.length - 3;
if (availableLength > 0) {
return `${name.substring(0, availableLength)}...${extension}`;
}
}
const halfLength = Math.floor((maxLength - 3) / 2);
return `${fileName.substring(0, halfLength)}...${fileName.substring(fileName.length - halfLength)}`;
}

View File

@@ -23,7 +23,7 @@ docker buildx build \
--no-cache \
-t kyantech/palmr:latest \
-t kyantech/palmr:$TAG \
--load \
--push \
.
if [ $? -eq 0 ]; then