mirror of
https://github.com/kyantech/Palmr.git
synced 2025-10-23 06:11:58 +00:00
Compare commits
7 Commits
v3.0.0-bet
...
v3.0.0-bet
Author | SHA1 | Date | |
---|---|---|---|
|
828fbd4cfd | ||
|
ea68e771a8 | ||
|
229f9a3ca0 | ||
|
dd10c17a3a | ||
|
ab071916b8 | ||
|
1ab0504288 | ||
|
652f1f47d2 |
56
.github/pull_request_template.md
vendored
Normal file
56
.github/pull_request_template.md
vendored
Normal 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!
|
@@ -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",
|
||||
|
@@ -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"),
|
||||
|
@@ -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();
|
||||
|
@@ -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": "الملفات المستلمة"
|
||||
}
|
||||
}
|
@@ -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"
|
||||
}
|
||||
}
|
@@ -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",
|
||||
|
@@ -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"
|
||||
}
|
||||
}
|
@@ -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"
|
||||
}
|
||||
}
|
@@ -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": "प्राप्त फ़ाइलें"
|
||||
}
|
||||
}
|
@@ -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"
|
||||
}
|
||||
}
|
@@ -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": "受信したファイル"
|
||||
}
|
||||
}
|
@@ -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": "받은 파일"
|
||||
}
|
||||
}
|
@@ -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"
|
||||
}
|
||||
}
|
@@ -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"
|
||||
}
|
||||
}
|
@@ -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"
|
||||
}
|
||||
}
|
@@ -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": "Полученные файлы"
|
||||
}
|
||||
}
|
@@ -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"
|
||||
}
|
||||
}
|
@@ -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": "已接收文件"
|
||||
}
|
||||
}
|
@@ -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"));
|
||||
}
|
||||
};
|
||||
|
||||
|
@@ -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>
|
||||
);
|
||||
|
@@ -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">
|
||||
|
@@ -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">
|
||||
|
@@ -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,
|
||||
};
|
||||
}
|
||||
|
@@ -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>
|
||||
|
||||
|
@@ -24,4 +24,5 @@ export interface PasswordModalProps {
|
||||
export interface ShareDetailsProps {
|
||||
share: GetShareByAlias200Share;
|
||||
onDownload: (objectName: string, fileName: string) => Promise<void>;
|
||||
onBulkDownload?: () => Promise<void>;
|
||||
}
|
||||
|
@@ -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}
|
||||
|
@@ -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 (
|
||||
|
@@ -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);
|
||||
|
@@ -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"),
|
||||
|
@@ -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") {
|
||||
|
@@ -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);
|
||||
}
|
||||
|
@@ -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>
|
||||
|
@@ -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) {
|
||||
|
@@ -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"),
|
||||
});
|
||||
});
|
||||
}
|
||||
|
@@ -90,6 +90,8 @@ export interface TestSmtpConnectionBody {
|
||||
smtpPort: string;
|
||||
smtpUser: string;
|
||||
smtpPass: string;
|
||||
smtpSecure: string;
|
||||
smtpNoAuth: string;
|
||||
};
|
||||
}
|
||||
|
||||
|
@@ -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)}`;
|
||||
}
|
||||
|
@@ -23,7 +23,7 @@ docker buildx build \
|
||||
--no-cache \
|
||||
-t kyantech/palmr:latest \
|
||||
-t kyantech/palmr:$TAG \
|
||||
--load \
|
||||
--push \
|
||||
.
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
|
Reference in New Issue
Block a user