more i18n.js keys added
This commit is contained in:
@@ -3,6 +3,8 @@
|
||||
## Changes 4//13/2025
|
||||
|
||||
- Decreased header height some more and clickable logo.
|
||||
- authModals.js fully updated with i18n.js keys.
|
||||
- main.js added Dark & Light mode i18n.js keys.
|
||||
|
||||
## Changes 4/12/2025
|
||||
|
||||
|
||||
171
js/authModals.js
171
js/authModals.js
@@ -3,7 +3,8 @@ import { sendRequest } from './networkUtils.js';
|
||||
import { t, applyTranslations, setLocale } from './i18n.js';
|
||||
|
||||
const version = "v1.1.2";
|
||||
const adminTitle = `Admin Panel <small style="font-size: 12px; color: gray;">${version}</small>`;
|
||||
// Use t() for the admin panel title. (Make sure t("admin_panel") returns "Admin Panel" in English.)
|
||||
const adminTitle = `${t("admin_panel")} <small style="font-size: 12px; color: gray;">${version}</small>`;
|
||||
|
||||
let lastLoginData = null;
|
||||
export function setLastLoginData(data) {
|
||||
@@ -44,7 +45,7 @@ export function openTOTPLoginModal() {
|
||||
<input type="text" id="recoveryInput"
|
||||
style="font-size:24px; text-align:center; width:100%; padding:10px;"
|
||||
placeholder="Recovery code" />
|
||||
<button type="button" id="submitRecovery" class="btn btn-secondary" style="margin-top:10px;">Submit Recovery Code</button>
|
||||
<button type="button" id="submitRecovery" class="btn btn-secondary" style="margin-top:10px;">${t("submit_recovery_code")}</button>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
@@ -66,12 +67,12 @@ export function openTOTPLoginModal() {
|
||||
// Switch to recovery
|
||||
totpSection.style.display = "none";
|
||||
recoverySection.style.display = "block";
|
||||
toggleLink.textContent = "Use TOTP Code instead";
|
||||
toggleLink.textContent = t("use_totp_code_instead");
|
||||
} else {
|
||||
// Switch back to TOTP
|
||||
recoverySection.style.display = "none";
|
||||
totpSection.style.display = "block";
|
||||
toggleLink.textContent = "Use Recovery Code instead";
|
||||
toggleLink.textContent = t("use_recovery_code_instead");
|
||||
}
|
||||
});
|
||||
|
||||
@@ -79,7 +80,7 @@ export function openTOTPLoginModal() {
|
||||
document.getElementById("submitRecovery").addEventListener("click", () => {
|
||||
const recoveryCode = document.getElementById("recoveryInput").value.trim();
|
||||
if (!recoveryCode) {
|
||||
showToast("Please enter your recovery code.");
|
||||
showToast(t("please_enter_recovery_code"));
|
||||
return;
|
||||
}
|
||||
fetch("totp_recover.php", {
|
||||
@@ -97,11 +98,11 @@ export function openTOTPLoginModal() {
|
||||
// recovery succeeded → finalize login
|
||||
window.location.href = "index.html";
|
||||
} else {
|
||||
showToast(json.message || "Recovery code verification failed");
|
||||
showToast(json.message || t("recovery_code_verification_failed"));
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
showToast("Error verifying recovery code.");
|
||||
showToast(t("error_verifying_recovery_code"));
|
||||
});
|
||||
});
|
||||
|
||||
@@ -125,14 +126,14 @@ export function openTOTPLoginModal() {
|
||||
if (json.status === "ok") {
|
||||
window.location.href = "index.html";
|
||||
} else {
|
||||
showToast(json.message || "TOTP verification failed");
|
||||
showToast(json.message || t("totp_verification_failed"));
|
||||
this.value = "";
|
||||
totpLoginModal.style.display = "flex";
|
||||
totpInput.focus();
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
showToast("TOTP verification failed");
|
||||
showToast(t("totp_verification_failed"));
|
||||
this.value = "";
|
||||
totpLoginModal.style.display = "flex";
|
||||
totpInput.focus();
|
||||
@@ -189,24 +190,24 @@ export function openUserPanel() {
|
||||
userPanelModal.innerHTML = `
|
||||
<div class="modal-content user-panel-content" style="${modalContentStyles}">
|
||||
<span id="closeUserPanel" style="position: absolute; top: 10px; right: 10px; cursor: pointer; font-size: 24px;">×</span>
|
||||
<h3>User Panel (${username})</h3>
|
||||
<button type="button" id="openChangePasswordModalBtn" class="btn btn-primary" style="margin-bottom: 15px;">Change Password</button>
|
||||
<h3>${t("user_panel")} (${username})</h3>
|
||||
<button type="button" id="openChangePasswordModalBtn" class="btn btn-primary" style="margin-bottom: 15px;">${t("change_password")}</button>
|
||||
<fieldset style="margin-bottom: 15px;">
|
||||
<legend>TOTP Settings</legend>
|
||||
<legend>${t("totp_settings")}</legend>
|
||||
<div class="form-group">
|
||||
<label for="userTOTPEnabled">Enable TOTP:</label>
|
||||
<label for="userTOTPEnabled">${t("enable_totp")}:</label>
|
||||
<input type="checkbox" id="userTOTPEnabled" style="vertical-align: middle;" />
|
||||
</div>
|
||||
</fieldset>
|
||||
<fieldset style="margin-bottom: 15px;">
|
||||
<legend>Language</legend>
|
||||
<legend>${t("language")}</legend>
|
||||
<div class="form-group">
|
||||
<label for="languageSelector">Select Language:</label>
|
||||
<label for="languageSelector">${t("select_language")}:</label>
|
||||
<select id="languageSelector">
|
||||
<option value="en">English</option>
|
||||
<option value="es">Español</option>
|
||||
<option value="fr">Français</option>
|
||||
<option value="de">Deutsch</option>
|
||||
<option value="en">${t("english")}</option>
|
||||
<option value="es">${t("spanish")}</option>
|
||||
<option value="fr">${t("french")}</option>
|
||||
<option value="de">${t("german")}</option>
|
||||
</select>
|
||||
</div>
|
||||
</fieldset>
|
||||
@@ -239,12 +240,12 @@ export function openUserPanel() {
|
||||
.then(r => r.json())
|
||||
.then(result => {
|
||||
if (!result.success) {
|
||||
showToast("Error updating TOTP setting: " + result.error);
|
||||
showToast(t("error_updating_totp_setting") + ": " + result.error);
|
||||
} else if (enabled) {
|
||||
openTOTPModal();
|
||||
}
|
||||
})
|
||||
.catch(() => { showToast("Error updating TOTP setting."); });
|
||||
.catch(() => { showToast(t("error_updating_totp_setting")); });
|
||||
});
|
||||
// Language dropdown initialization
|
||||
const languageSelector = document.getElementById("languageSelector");
|
||||
@@ -266,36 +267,6 @@ export function openUserPanel() {
|
||||
userPanelModal.style.display = "flex";
|
||||
}
|
||||
|
||||
function showRecoveryCodeModal(recoveryCode) {
|
||||
const recoveryModal = document.createElement("div");
|
||||
recoveryModal.id = "recoveryModal";
|
||||
recoveryModal.style.cssText = `
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
background-color: rgba(0,0,0,0.3);
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
z-index: 3200;
|
||||
`;
|
||||
recoveryModal.innerHTML = `
|
||||
<div style="background: #fff; color: #000; padding: 20px; max-width: 400px; width: 90%; border-radius: 8px; text-align: center;">
|
||||
<h3>Your Recovery Code</h3>
|
||||
<p>Please save this code securely. It will not be shown again and can only be used once.</p>
|
||||
<code style="display: block; margin: 10px 0; font-size: 20px;">${recoveryCode}</code>
|
||||
<button type="button" id="closeRecoveryModal" class="btn btn-primary">OK</button>
|
||||
</div>
|
||||
`;
|
||||
document.body.appendChild(recoveryModal);
|
||||
|
||||
document.getElementById("closeRecoveryModal").addEventListener("click", () => {
|
||||
recoveryModal.remove();
|
||||
});
|
||||
}
|
||||
|
||||
export function openTOTPModal() {
|
||||
let totpModal = document.getElementById("totpModal");
|
||||
const isDarkMode = document.body.classList.contains("dark-mode");
|
||||
@@ -327,15 +298,15 @@ export function openTOTPModal() {
|
||||
totpModal.innerHTML = `
|
||||
<div class="modal-content" style="${modalContentStyles}">
|
||||
<span id="closeTOTPModal" style="position: absolute; top: 10px; right: 10px; cursor: pointer; font-size: 24px;">×</span>
|
||||
<h3>TOTP Setup</h3>
|
||||
<p>Scan this QR code with your authenticator app:</p>
|
||||
<h3>${t("totp_setup")}</h3>
|
||||
<p>${t("scan_qr_code")}</p>
|
||||
<!-- Create an image placeholder without the CSRF token in the src -->
|
||||
<img id="totpQRCodeImage" src="" alt="TOTP QR Code" style="max-width: 100%; height: auto; display: block; margin: 0 auto;">
|
||||
<br/>
|
||||
<p>Enter the 6-digit code from your app to confirm setup:</p>
|
||||
<p>${t("enter_totp_confirmation")}</p>
|
||||
<input type="text" id="totpConfirmInput" maxlength="6" style="font-size:24px; text-align:center; width:100%; padding:10px;" placeholder="6-digit code" />
|
||||
<br/><br/>
|
||||
<button type="button" id="confirmTOTPBtn" class="btn btn-primary">Confirm</button>
|
||||
<button type="button" id="confirmTOTPBtn" class="btn btn-primary">${t("confirm")}</button>
|
||||
</div>
|
||||
`;
|
||||
document.body.appendChild(totpModal);
|
||||
@@ -348,7 +319,7 @@ export function openTOTPModal() {
|
||||
document.getElementById("confirmTOTPBtn").addEventListener("click", function () {
|
||||
const code = document.getElementById("totpConfirmInput").value.trim();
|
||||
if (code.length !== 6) {
|
||||
showToast("Please enter a valid 6-digit code.");
|
||||
showToast(t("please_enter_valid_code"));
|
||||
return;
|
||||
}
|
||||
fetch("totp_verify.php", {
|
||||
@@ -363,7 +334,7 @@ export function openTOTPModal() {
|
||||
.then(r => r.json())
|
||||
.then(result => {
|
||||
if (result.status === 'ok') {
|
||||
showToast("TOTP successfully enabled.");
|
||||
showToast(t("totp_enabled_successfully"));
|
||||
// After successful TOTP verification, fetch the recovery code
|
||||
fetch("totp_saveCode.php", {
|
||||
method: "POST",
|
||||
@@ -379,16 +350,16 @@ export function openTOTPModal() {
|
||||
// Show the recovery code in a secure modal
|
||||
showRecoveryCodeModal(data.recoveryCode);
|
||||
} else {
|
||||
showToast("Error generating recovery code: " + (data.message || "Unknown error."));
|
||||
showToast(t("error_generating_recovery_code") + ": " + (data.message || t("unknown_error")));
|
||||
}
|
||||
})
|
||||
.catch(() => { showToast("Error generating recovery code."); });
|
||||
.catch(() => { showToast(t("error_generating_recovery_code")); });
|
||||
closeTOTPModal(false);
|
||||
} else {
|
||||
showToast("TOTP verification failed: " + (result.message || "Invalid code."));
|
||||
showToast(t("totp_verification_failed") + ": " + (result.message || t("invalid_code")));
|
||||
}
|
||||
})
|
||||
.catch(() => { showToast("Error verifying TOTP code."); });
|
||||
.catch(() => { showToast(t("error_verifying_totp_code")); });
|
||||
});
|
||||
|
||||
// Focus the input and attach enter key listener
|
||||
@@ -451,7 +422,7 @@ function loadTOTPQRCode() {
|
||||
})
|
||||
.catch(error => {
|
||||
console.error("Error loading TOTP QR code:", error);
|
||||
showToast("Error loading QR code.");
|
||||
showToast(t("error_loading_qr_code"));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -479,10 +450,10 @@ export function closeTOTPModal(disable = true) {
|
||||
.then(r => r.json())
|
||||
.then(result => {
|
||||
if (!result.success) {
|
||||
showToast("Error disabling TOTP setting: " + result.error);
|
||||
showToast(t("error_disabling_totp_setting") + ": " + result.error);
|
||||
}
|
||||
})
|
||||
.catch(() => { showToast("Error disabling TOTP setting."); });
|
||||
.catch(() => { showToast(t("error_disabling_totp_setting")); });
|
||||
}
|
||||
}
|
||||
|
||||
@@ -523,66 +494,63 @@ export function openAdminPanel() {
|
||||
align-items: center;
|
||||
z-index: 3000;
|
||||
`;
|
||||
// Added a version number next to "Admin Panel"
|
||||
adminModal.innerHTML = `
|
||||
<div class="modal-content" style="${modalContentStyles}">
|
||||
<span id="closeAdminPanel" style="position: absolute; top: 10px; right: 10px; cursor: pointer; font-size: 24px;">×</span>
|
||||
<h3>
|
||||
<h3>${adminTitle}</h3>
|
||||
</h3>
|
||||
<h3>${adminTitle}</h3>
|
||||
<form id="adminPanelForm">
|
||||
<fieldset style="margin-bottom: 15px;">
|
||||
<legend>User Management</legend>
|
||||
<legend>${t("user_management")}</legend>
|
||||
<div style="display: flex; gap: 10px;">
|
||||
<button type="button" id="adminOpenAddUser" class="btn btn-success">Add User</button>
|
||||
<button type="button" id="adminOpenRemoveUser" class="btn btn-danger">Remove User</button>
|
||||
<button type="button" id="adminOpenUserPermissions" class="btn btn-secondary">User Permissions</button>
|
||||
<button type="button" id="adminOpenAddUser" class="btn btn-success">${t("add_user")}</button>
|
||||
<button type="button" id="adminOpenRemoveUser" class="btn btn-danger">${t("remove_user")}</button>
|
||||
<button type="button" id="adminOpenUserPermissions" class="btn btn-secondary">${t("user_permissions")}</button>
|
||||
</div>
|
||||
</fieldset>
|
||||
<fieldset style="margin-bottom: 15px;">
|
||||
<legend>OIDC Configuration</legend>
|
||||
<legend>${t("oidc_configuration")}</legend>
|
||||
<div class="form-group">
|
||||
<label for="oidcProviderUrl">OIDC Provider URL:</label>
|
||||
<label for="oidcProviderUrl">${t("oidc_provider_url")}:</label>
|
||||
<input type="text" id="oidcProviderUrl" class="form-control" value="${window.currentOIDCConfig.providerUrl}" />
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="oidcClientId">OIDC Client ID:</label>
|
||||
<label for="oidcClientId">${t("oidc_client_id")}:</label>
|
||||
<input type="text" id="oidcClientId" class="form-control" value="${window.currentOIDCConfig.clientId}" />
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="oidcClientSecret">OIDC Client Secret:</label>
|
||||
<label for="oidcClientSecret">${t("oidc_client_secret")}:</label>
|
||||
<input type="text" id="oidcClientSecret" class="form-control" value="${window.currentOIDCConfig.clientSecret}" />
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label for="oidcRedirectUri">OIDC Redirect URI:</label>
|
||||
<label for="oidcRedirectUri">${t("oidc_redirect_uri")}:</label>
|
||||
<input type="text" id="oidcRedirectUri" class="form-control" value="${window.currentOIDCConfig.redirectUri}" />
|
||||
</div>
|
||||
</fieldset>
|
||||
<fieldset style="margin-bottom: 15px;">
|
||||
<legend>Global TOTP Settings</legend>
|
||||
<legend>${t("global_totp_settings")}</legend>
|
||||
<div class="form-group">
|
||||
<label for="globalOtpauthUrl">Global OTPAuth URL:</label>
|
||||
<label for="globalOtpauthUrl">${t("global_otpauth_url")}:</label>
|
||||
<input type="text" id="globalOtpauthUrl" class="form-control" value="${window.currentOIDCConfig.globalOtpauthUrl || 'otpauth://totp/{label}?secret={secret}&issuer=FileRise'}" />
|
||||
</div>
|
||||
</fieldset>
|
||||
<fieldset style="margin-bottom: 15px;">
|
||||
<legend>Login Options</legend>
|
||||
<legend>${t("login_options")}</legend>
|
||||
<div class="form-group">
|
||||
<input type="checkbox" id="disableFormLogin" />
|
||||
<label for="disableFormLogin">Disable Login Form</label>
|
||||
<label for="disableFormLogin">${t("disable_login_form")}</label>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<input type="checkbox" id="disableBasicAuth" />
|
||||
<label for="disableBasicAuth">Disable Basic HTTP Auth</label>
|
||||
<label for="disableBasicAuth">${t("disable_basic_http_auth")}</label>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<input type="checkbox" id="disableOIDCLogin" />
|
||||
<label for="disableOIDCLogin">Disable OIDC Login</label>
|
||||
<label for="disableOIDCLogin">${t("disable_oidc_login")}</label>
|
||||
</div>
|
||||
</fieldset>
|
||||
<div style="display: flex; justify-content: space-between;">
|
||||
<button type="button" id="cancelAdminSettings" class="btn btn-secondary">Cancel</button>
|
||||
<button type="button" id="saveAdminSettings" class="btn btn-primary">Save Settings</button>
|
||||
<button type="button" id="cancelAdminSettings" class="btn btn-secondary">${t("cancel")}</button>
|
||||
<button type="button" id="saveAdminSettings" class="btn btn-primary">${t("save_settings")}</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
@@ -614,7 +582,7 @@ export function openAdminPanel() {
|
||||
const disableOIDCLoginCheckbox = document.getElementById("disableOIDCLogin");
|
||||
const totalDisabled = [disableFormLoginCheckbox, disableBasicAuthCheckbox, disableOIDCLoginCheckbox].filter(cb => cb.checked).length;
|
||||
if (totalDisabled === 3) {
|
||||
showToast("At least one login method must remain enabled.");
|
||||
showToast(t("at_least_one_login_method"));
|
||||
disableOIDCLoginCheckbox.checked = false;
|
||||
localStorage.setItem("disableOIDCLogin", "false");
|
||||
if (typeof window.updateLoginOptionsUI === "function") {
|
||||
@@ -645,7 +613,7 @@ export function openAdminPanel() {
|
||||
}, { "X-CSRF-Token": window.csrfToken })
|
||||
.then(response => {
|
||||
if (response.success) {
|
||||
showToast("Settings updated successfully.");
|
||||
showToast(t("settings_updated_successfully"));
|
||||
localStorage.setItem("disableFormLogin", disableFormLogin);
|
||||
localStorage.setItem("disableBasicAuth", disableBasicAuth);
|
||||
localStorage.setItem("disableOIDCLogin", disableOIDCLogin);
|
||||
@@ -654,7 +622,7 @@ export function openAdminPanel() {
|
||||
}
|
||||
closeAdminPanel();
|
||||
} else {
|
||||
showToast("Error updating settings: " + (response.error || "Unknown error"));
|
||||
showToast(t("error_updating_settings") + ": " + (response.error || t("unknown_error")));
|
||||
}
|
||||
})
|
||||
.catch(() => { });
|
||||
@@ -665,7 +633,7 @@ export function openAdminPanel() {
|
||||
function enforceLoginOptionConstraint(changedCheckbox) {
|
||||
const totalDisabled = [disableFormLoginCheckbox, disableBasicAuthCheckbox, disableOIDCLoginCheckbox].filter(cb => cb.checked).length;
|
||||
if (changedCheckbox.checked && totalDisabled === 3) {
|
||||
showToast("At least one login method must remain enabled.");
|
||||
showToast(t("at_least_one_login_method"));
|
||||
changedCheckbox.checked = false;
|
||||
}
|
||||
}
|
||||
@@ -726,7 +694,6 @@ export function closeAdminPanel() {
|
||||
}
|
||||
|
||||
// --- New: User Permissions Modal ---
|
||||
|
||||
export function openUserPermissionsModal() {
|
||||
let userPermissionsModal = document.getElementById("userPermissionsModal");
|
||||
const isDarkMode = document.body.classList.contains("dark-mode");
|
||||
@@ -759,13 +726,13 @@ export function openUserPermissionsModal() {
|
||||
userPermissionsModal.innerHTML = `
|
||||
<div class="modal-content" style="${modalContentStyles}">
|
||||
<span id="closeUserPermissionsModal" style="position: absolute; top: 10px; right: 10px; cursor: pointer; font-size: 24px;">×</span>
|
||||
<h3>User Permissions</h3>
|
||||
<h3>${t("user_permissions")}</h3>
|
||||
<div id="userPermissionsList" style="max-height: 300px; overflow-y: auto; margin-bottom: 15px;">
|
||||
<!-- User rows will be loaded here -->
|
||||
</div>
|
||||
<div style="display: flex; justify-content: flex-end; gap: 10px;">
|
||||
<button type="button" id="cancelUserPermissionsBtn" class="btn btn-secondary">Cancel</button>
|
||||
<button type="button" id="saveUserPermissionsBtn" class="btn btn-primary">Save Permissions</button>
|
||||
<button type="button" id="cancelUserPermissionsBtn" class="btn btn-secondary">${t("cancel")}</button>
|
||||
<button type="button" id="saveUserPermissionsBtn" class="btn btn-primary">${t("save_permissions")}</button>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
@@ -796,14 +763,14 @@ export function openUserPermissionsModal() {
|
||||
sendRequest("updateUserPermissions.php", "POST", { permissions: permissionsData }, { "X-CSRF-Token": window.csrfToken })
|
||||
.then(response => {
|
||||
if (response.success) {
|
||||
showToast("User permissions updated successfully.");
|
||||
showToast(t("user_permissions_updated_successfully"));
|
||||
userPermissionsModal.style.display = "none";
|
||||
} else {
|
||||
showToast("Error updating permissions: " + (response.error || "Unknown error"));
|
||||
showToast(t("error_updating_permissions") + ": " + (response.error || t("unknown_error")));
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
showToast("Error updating permissions.");
|
||||
showToast(t("error_updating_permissions"));
|
||||
});
|
||||
});
|
||||
} else {
|
||||
@@ -828,14 +795,14 @@ function loadUserPermissionsList() {
|
||||
.then(usersData => {
|
||||
const users = Array.isArray(usersData) ? usersData : (usersData.users || []);
|
||||
if (users.length === 0) {
|
||||
listContainer.innerHTML = "<p>No users found.</p>";
|
||||
listContainer.innerHTML = "<p>" + t("no_users_found") + "</p>";
|
||||
return;
|
||||
}
|
||||
users.forEach(user => {
|
||||
// Skip admin users.
|
||||
if ((user.role && user.role === "1") || user.username.toLowerCase() === "admin") return;
|
||||
|
||||
// Use stored permissions if available; otherwise fall back to localStorage defaults.
|
||||
// Use stored permissions if available; otherwise fall back to defaults.
|
||||
const defaultPerm = {
|
||||
folderOnly: false,
|
||||
readOnly: false,
|
||||
@@ -859,15 +826,15 @@ function loadUserPermissionsList() {
|
||||
<div style="display: flex; flex-direction: column; gap: 5px;">
|
||||
<label style="display: flex; align-items: center; gap: 5px;">
|
||||
<input type="checkbox" data-permission="folderOnly" ${userPerm.folderOnly ? "checked" : ""} />
|
||||
User Folder Only
|
||||
${t("user_folder_only")}
|
||||
</label>
|
||||
<label style="display: flex; align-items: center; gap: 5px;">
|
||||
<input type="checkbox" data-permission="readOnly" ${userPerm.readOnly ? "checked" : ""} />
|
||||
Read Only
|
||||
${t("read_only")}
|
||||
</label>
|
||||
<label style="display: flex; align-items: center; gap: 5px;">
|
||||
<input type="checkbox" data-permission="disableUpload" ${userPerm.disableUpload ? "checked" : ""} />
|
||||
Disable Upload
|
||||
${t("disable_upload")}
|
||||
</label>
|
||||
</div>
|
||||
<hr style="margin-top: 10px; border: 0; border-bottom: 1px solid #ccc;">
|
||||
@@ -877,6 +844,6 @@ function loadUserPermissionsList() {
|
||||
});
|
||||
})
|
||||
.catch(() => {
|
||||
listContainer.innerHTML = "<p>Error loading users.</p>";
|
||||
listContainer.innerHTML = "<p>" + t("error_loading_users") + "</p>";
|
||||
});
|
||||
}
|
||||
548
js/i18n.js
548
js/i18n.js
@@ -1,6 +1,6 @@
|
||||
/* i18n.js */
|
||||
const translations = {
|
||||
en: { /* English translations */
|
||||
en: {
|
||||
"please_log_in_to_continue": "Please log in to continue.",
|
||||
"no_files_selected": "No files selected.",
|
||||
"confirm_delete_files": "Are you sure you want to delete {count} selected file(s)?",
|
||||
@@ -35,7 +35,6 @@ const translations = {
|
||||
"tag_name": "Tag Name:",
|
||||
"tag_color": "Tag Color:",
|
||||
"save_tag": "Save Tag",
|
||||
"files_in": "Files in",
|
||||
"light_mode": "Light Mode",
|
||||
"dark_mode": "Dark Mode",
|
||||
"upload_instruction": "Drop files/folders here or click 'Choose files'",
|
||||
@@ -138,10 +137,7 @@ const translations = {
|
||||
"error_generating_share_link": "Error Generating Share Link",
|
||||
|
||||
// Folder
|
||||
"create_folder": "Create Folder",
|
||||
"rename_folder": "Rename Folder",
|
||||
"folder_share": "Share Folder",
|
||||
"delete_folder": "Delete Folder",
|
||||
|
||||
// Custom Confirm Modal keys:
|
||||
"yes": "Yes",
|
||||
@@ -163,7 +159,62 @@ const translations = {
|
||||
|
||||
// Dark Mode Toggle
|
||||
"dark_mode_toggle": "Dark Mode",
|
||||
"light_mode_toggle": "Light Mode"
|
||||
"light_mode_toggle": "Light Mode",
|
||||
|
||||
// NEW KEYS ADDED FOR ADMIN, USER PANELS, AND TOTP MODALS:
|
||||
"admin_panel": "Admin Panel",
|
||||
"user_panel": "User Panel",
|
||||
"totp_settings": "TOTP Settings",
|
||||
"enable_totp": "Enable TOTP",
|
||||
"language": "Language",
|
||||
"select_language": "Select Language",
|
||||
"english": "English",
|
||||
"spanish": "Spanish",
|
||||
"french": "French",
|
||||
"german": "German",
|
||||
"use_totp_code_instead": "Use TOTP Code instead",
|
||||
"submit_recovery_code": "Submit Recovery Code",
|
||||
"please_enter_recovery_code": "Please enter your recovery code.",
|
||||
"recovery_code_verification_failed": "Recovery code verification failed",
|
||||
"error_verifying_recovery_code": "Error verifying recovery code",
|
||||
"totp_verification_failed": "TOTP verification failed",
|
||||
"error_verifying_totp_code": "Error verifying TOTP code",
|
||||
"totp_setup": "TOTP Setup",
|
||||
"scan_qr_code": "Scan this QR code with your authenticator app.",
|
||||
"enter_totp_confirmation": "Enter the 6-digit code from your app to confirm setup:",
|
||||
"confirm": "Confirm",
|
||||
"please_enter_valid_code": "Please enter a valid 6-digit code.",
|
||||
"totp_enabled_successfully": "TOTP successfully enabled.",
|
||||
"error_generating_recovery_code": "Error generating recovery code",
|
||||
"error_loading_qr_code": "Error loading QR code.",
|
||||
"error_disabling_totp_setting": "Error disabling TOTP setting",
|
||||
"user_management": "User Management",
|
||||
"add_user": "Add User",
|
||||
"remove_user": "Remove User",
|
||||
"user_permissions": "User Permissions",
|
||||
"oidc_configuration": "OIDC Configuration",
|
||||
"oidc_provider_url": "OIDC Provider URL",
|
||||
"oidc_client_id": "OIDC Client ID",
|
||||
"oidc_client_secret": "OIDC Client Secret",
|
||||
"oidc_redirect_uri": "OIDC Redirect URI",
|
||||
"global_totp_settings": "Global TOTP Settings",
|
||||
"global_otpauth_url": "Global OTPAuth URL",
|
||||
"login_options": "Login Options",
|
||||
"disable_login_form": "Disable Login Form",
|
||||
"disable_basic_http_auth": "Disable Basic HTTP Auth",
|
||||
"disable_oidc_login": "Disable OIDC Login",
|
||||
"save_settings": "Save Settings",
|
||||
"at_least_one_login_method": "At least one login method must remain enabled.",
|
||||
"settings_updated_successfully": "Settings updated successfully.",
|
||||
"error_updating_settings": "Error updating settings",
|
||||
"user_permissions_updated_successfully": "User permissions updated successfully.",
|
||||
"error_updating_permissions": "Error updating permissions",
|
||||
"no_users_found": "No users found.",
|
||||
"user_folder_only": "User Folder Only",
|
||||
"read_only": "Read Only",
|
||||
"disable_upload": "Disable Upload",
|
||||
"error_loading_users": "Error loading users",
|
||||
"save_permissions": "Save Permissions"
|
||||
},
|
||||
es: { /* Spanish translations */
|
||||
"please_log_in_to_continue": "Por favor, inicie sesión para continuar.",
|
||||
@@ -443,12 +494,395 @@ const translations = {
|
||||
// Dark Mode Toggle
|
||||
"dark_mode_toggle": "Mode sombre"
|
||||
},
|
||||
de: {
|
||||
es: { /* Spanish translations */
|
||||
"please_log_in_to_continue": "Por favor, inicie sesión para continuar.",
|
||||
"no_files_selected": "No se seleccionaron archivos.",
|
||||
"confirm_delete_files": "¿Está seguro de que desea eliminar {count} archivo(s) seleccionado(s)?",
|
||||
"element_not_found": "Elemento con id \"{id}\" no encontrado.",
|
||||
"search_placeholder": "Buscar archivos, etiquetas y cargador...",
|
||||
"search_placeholder_advanced": "Búsqueda avanzada: archivos, etiquetas, cargador y contenido...",
|
||||
"basic_search_tooltip": "Búsqueda básica: por nombre de archivo, etiquetas y cargador.",
|
||||
"advanced_search_tooltip": "Búsqueda avanzada: incluye el contenido del archivo, además del nombre, etiquetas y cargador.",
|
||||
"file_name": "Nombre del archivo",
|
||||
"date_modified": "Fecha de modificación",
|
||||
"upload_date": "Fecha de carga",
|
||||
"file_size": "Tamaño del archivo",
|
||||
"uploader": "Cargado por",
|
||||
"enter_totp_code": "Ingrese el código TOTP",
|
||||
"use_recovery_code_instead": "Usar código de recuperación en su lugar",
|
||||
"enter_recovery_code": "Ingrese el código de recuperación",
|
||||
"editing": "Editando",
|
||||
"decrease_font": "A-",
|
||||
"increase_font": "A+",
|
||||
"save": "Guardar",
|
||||
"close": "Cerrar",
|
||||
"no_files_found": "No se encontraron archivos.",
|
||||
"switch_to_table_view": "Cambiar a vista de tabla",
|
||||
"switch_to_gallery_view": "Cambiar a vista de galería",
|
||||
"share_file": "Compartir archivo",
|
||||
"set_expiration": "Establecer vencimiento:",
|
||||
"password_optional": "Contraseña (opcional):",
|
||||
"generate_share_link": "Generar enlace para compartir",
|
||||
"shareable_link": "Enlace para compartir:",
|
||||
"copy_link": "Copiar enlace",
|
||||
"tag_file": "Etiquetar archivo",
|
||||
"tag_name": "Nombre de la etiqueta:",
|
||||
"tag_color": "Color de la etiqueta:",
|
||||
"save_tag": "Guardar etiqueta",
|
||||
"light_mode": "Modo claro",
|
||||
"dark_mode": "Modo oscuro",
|
||||
"upload_instruction": "Suelte archivos/carpetas aquí o haga clic en 'Elegir archivos'",
|
||||
"no_files_selected_default": "No se seleccionaron archivos",
|
||||
"choose_files": "Elegir archivos",
|
||||
"delete_selected": "Eliminar seleccionados",
|
||||
"copy_selected": "Copiar seleccionados",
|
||||
"move_selected": "Mover seleccionados",
|
||||
"tag_selected": "Etiquetar seleccionados",
|
||||
"download_zip": "Descargar Zip",
|
||||
"extract_zip": "Extraer Zip",
|
||||
"preview": "Vista previa",
|
||||
"edit": "Editar",
|
||||
"rename": "Renombrar",
|
||||
"trash_empty": "La papelera está vacía.",
|
||||
"no_trash_selected": "No se seleccionaron elementos para restaurar.",
|
||||
"title": "FileRise",
|
||||
"header_title": "FileRise",
|
||||
"logout": "Cerrar sesión",
|
||||
"change_password": "Cambiar contraseña",
|
||||
"restore_text": "Restaurar o",
|
||||
"delete_text": "Eliminar elementos de la papelera",
|
||||
"restore_selected": "Restaurar seleccionados",
|
||||
"restore_all": "Restaurar todo",
|
||||
"delete_selected_trash": "Eliminar seleccionados",
|
||||
"delete_all": "Eliminar todo",
|
||||
"upload_header": "Cargar archivos/carpetas",
|
||||
"folder_navigation": "Navegación y gestión de carpetas",
|
||||
"create_folder": "Crear carpeta",
|
||||
"create_folder_title": "Crear carpeta",
|
||||
"enter_folder_name": "Ingrese el nombre de la carpeta",
|
||||
"cancel": "Cancelar",
|
||||
"create": "Crear",
|
||||
"rename_folder": "Renombrar carpeta",
|
||||
"rename_folder_title": "Renombrar carpeta",
|
||||
"rename_folder_placeholder": "Ingrese el nuevo nombre de la carpeta",
|
||||
"delete_folder": "Eliminar carpeta",
|
||||
"delete_folder_title": "Eliminar carpeta",
|
||||
"delete_folder_message": "¿Está seguro de que desea eliminar esta carpeta?",
|
||||
"folder_help": "Ayuda de carpetas",
|
||||
"folder_help_item_1": "Haga clic en una carpeta para ver sus archivos.",
|
||||
"folder_help_item_2": "Utilice [-] para colapsar y [+] para expandir las carpetas.",
|
||||
"folder_help_item_3": "Seleccione una carpeta y haga clic en 'Crear carpeta' para agregar una subcarpeta.",
|
||||
"folder_help_item_4": "Para renombrar o eliminar una carpeta, selecciónela y haga clic en el botón correspondiente.",
|
||||
"file_list_title": "Archivos en (Raíz)",
|
||||
"files_in": "Archivos en",
|
||||
"delete_files": "Eliminar archivos",
|
||||
"delete_selected_files_title": "Eliminar archivos seleccionados",
|
||||
"delete_files_message": "¿Está seguro de que desea eliminar los archivos seleccionados?",
|
||||
"copy_files": "Copiar archivos",
|
||||
"copy_files_title": "Copiar archivos seleccionados",
|
||||
"copy_files_message": "Seleccione una carpeta destino para copiar los archivos seleccionados:",
|
||||
"move_files": "Mover archivos",
|
||||
"move_files_title": "Mover archivos seleccionados",
|
||||
"move_files_message": "Seleccione una carpeta destino para mover los archivos seleccionados:",
|
||||
"move": "Mover",
|
||||
"extract_zip_button": "Extraer Zip",
|
||||
"download_zip_title": "Descargar archivos seleccionados en Zip",
|
||||
"download_zip_prompt": "Ingrese un nombre para el archivo Zip:",
|
||||
"zip_placeholder": "archivos.zip",
|
||||
"login": "Iniciar sesión",
|
||||
"remember_me": "Recuérdame",
|
||||
"login_oidc": "Iniciar sesión con OIDC",
|
||||
"basic_http_login": "Usar autenticación HTTP básica",
|
||||
"change_password_title": "Cambiar contraseña",
|
||||
"old_password": "Contraseña antigua",
|
||||
"new_password": "Nueva contraseña",
|
||||
"confirm_new_password": "Confirmar nueva contraseña",
|
||||
"create_new_user_title": "Crear nuevo usuario",
|
||||
"username": "Usuario:",
|
||||
"password": "Contraseña:",
|
||||
"grant_admin": "Otorgar acceso de administrador",
|
||||
"save_user": "Guardar usuario",
|
||||
"remove_user_title": "Eliminar usuario",
|
||||
"select_user_remove": "Seleccione un usuario para eliminar:",
|
||||
"delete_user": "Eliminar usuario",
|
||||
"rename_file_title": "Renombrar archivo",
|
||||
"rename_file_placeholder": "Ingrese el nuevo nombre del archivo",
|
||||
"share_folder": "Compartir carpeta",
|
||||
"allow_uploads": "Permitir cargas",
|
||||
"share_link_generated": "Enlace de compartir generado",
|
||||
"error_generating_share_link": "Error al generar el enlace de compartir",
|
||||
"yes": "Sí",
|
||||
"no": "No",
|
||||
"delete": "Eliminar",
|
||||
"download": "Descargar",
|
||||
"upload": "Cargar",
|
||||
"copy": "Copiar",
|
||||
"extract": "Extraer",
|
||||
"user": "Usuario:",
|
||||
"unknown_error": "Error desconocido",
|
||||
"link_copied": "Enlace copiado al portapapeles",
|
||||
"minutes": "minutos",
|
||||
"hours": "horas",
|
||||
"days": "días",
|
||||
"weeks": "semanas",
|
||||
"months": "meses",
|
||||
"seconds": "segundos",
|
||||
"dark_mode_toggle": "Modo oscuro",
|
||||
"light_mode_toggle": "Modo claro",
|
||||
// Nuevas claves para paneles y TOTP:
|
||||
"admin_panel": "Panel de Administración",
|
||||
"user_panel": "Panel de Usuario",
|
||||
"totp_settings": "Configuración TOTP",
|
||||
"enable_totp": "Habilitar TOTP",
|
||||
"language": "Idioma",
|
||||
"select_language": "Seleccionar idioma",
|
||||
"english": "Inglés",
|
||||
"spanish": "Español",
|
||||
"french": "Francés",
|
||||
"german": "Alemán",
|
||||
"use_totp_code_instead": "Usar código TOTP en su lugar",
|
||||
"submit_recovery_code": "Enviar código de recuperación",
|
||||
"please_enter_recovery_code": "Por favor, ingrese su código de recuperación.",
|
||||
"recovery_code_verification_failed": "La verificación del código de recuperación falló",
|
||||
"error_verifying_recovery_code": "Error al verificar el código de recuperación",
|
||||
"totp_verification_failed": "La verificación TOTP falló",
|
||||
"error_verifying_totp_code": "Error al verificar el código TOTP",
|
||||
"totp_setup": "Configuración TOTP",
|
||||
"scan_qr_code": "Escanee este código QR con su aplicación de autenticación.",
|
||||
"enter_totp_confirmation": "Ingrese el código de 6 dígitos de su aplicación para confirmar la configuración:",
|
||||
"confirm": "Confirmar",
|
||||
"please_enter_valid_code": "Por favor, ingrese un código válido de 6 dígitos.",
|
||||
"totp_enabled_successfully": "TOTP habilitado exitosamente.",
|
||||
"error_generating_recovery_code": "Error al generar el código de recuperación",
|
||||
"error_loading_qr_code": "Error al cargar el código QR.",
|
||||
"error_disabling_totp_setting": "Error al deshabilitar la configuración TOTP",
|
||||
"user_management": "Gestión de Usuarios",
|
||||
"add_user": "Añadir Usuario",
|
||||
"remove_user": "Eliminar Usuario",
|
||||
"user_permissions": "Permisos de Usuario",
|
||||
"oidc_configuration": "Configuración OIDC",
|
||||
"oidc_provider_url": "URL del Proveedor OIDC",
|
||||
"oidc_client_id": "ID del Cliente OIDC",
|
||||
"oidc_client_secret": "Secreto del Cliente OIDC",
|
||||
"oidc_redirect_uri": "URI de Redirección OIDC",
|
||||
"global_totp_settings": "Configuración Global TOTP",
|
||||
"global_otpauth_url": "URL Global OTPAuth",
|
||||
"login_options": "Opciones de Inicio de Sesión",
|
||||
"disable_login_form": "Deshabilitar el formulario de inicio de sesión",
|
||||
"disable_basic_http_auth": "Deshabilitar la autenticación HTTP básica",
|
||||
"disable_oidc_login": "Deshabilitar el inicio de sesión OIDC",
|
||||
"save_settings": "Guardar Configuración",
|
||||
"at_least_one_login_method": "Al menos un método de inicio de sesión debe permanecer habilitado.",
|
||||
"settings_updated_successfully": "La configuración se actualizó con éxito.",
|
||||
"error_updating_settings": "Error al actualizar la configuración",
|
||||
"user_permissions_updated_successfully": "Los permisos de usuario se actualizaron con éxito.",
|
||||
"error_updating_permissions": "Error al actualizar los permisos",
|
||||
"no_users_found": "No se encontraron usuarios.",
|
||||
"user_folder_only": "Solo carpeta de usuario",
|
||||
"read_only": "Solo lectura",
|
||||
"disable_upload": "Deshabilitar carga",
|
||||
"error_loading_users": "Error al cargar los usuarios",
|
||||
"save_permissions": "Guardar Permisos"
|
||||
},
|
||||
fr: { /* French translations */
|
||||
"please_log_in_to_continue": "Veuillez vous connecter pour continuer.",
|
||||
"no_files_selected": "Aucun fichier sélectionné.",
|
||||
"confirm_delete_files": "Êtes-vous sûr de vouloir supprimer {count} fichier(s) sélectionné(s) ?",
|
||||
"element_not_found": "Élément avec l'id \"{id}\" non trouvé.",
|
||||
"search_placeholder": "Rechercher des fichiers, des balises et l'uploader...",
|
||||
"search_placeholder_advanced": "Recherche avancée : fichiers, balises, uploader et contenu...",
|
||||
"basic_search_tooltip": "Recherche basique : par nom de fichier, balises et uploader.",
|
||||
"advanced_search_tooltip": "Recherche avancée : inclut le contenu du fichier, en plus du nom, des balises et de l'uploader.",
|
||||
"file_name": "Nom du fichier",
|
||||
"date_modified": "Date de modification",
|
||||
"upload_date": "Date de téléchargement",
|
||||
"file_size": "Taille du fichier",
|
||||
"uploader": "Téléversé par",
|
||||
"enter_totp_code": "Entrez le code TOTP",
|
||||
"use_recovery_code_instead": "Utiliser le code de récupération à la place",
|
||||
"enter_recovery_code": "Entrez le code de récupération",
|
||||
"editing": "Modification",
|
||||
"decrease_font": "A-",
|
||||
"increase_font": "A+",
|
||||
"save": "Enregistrer",
|
||||
"close": "Fermer",
|
||||
"no_files_found": "Aucun fichier trouvé.",
|
||||
"switch_to_table_view": "Passer à la vue tableau",
|
||||
"switch_to_gallery_view": "Passer à la vue galerie",
|
||||
"share_file": "Partager le fichier",
|
||||
"set_expiration": "Définir l'expiration :",
|
||||
"password_optional": "Mot de passe (facultatif) :",
|
||||
"generate_share_link": "Générer un lien de partage",
|
||||
"shareable_link": "Lien partageable :",
|
||||
"copy_link": "Copier le lien",
|
||||
"tag_file": "Taguer le fichier",
|
||||
"tag_name": "Nom du tag :",
|
||||
"tag_color": "Couleur du tag :",
|
||||
"save_tag": "Enregistrer le tag",
|
||||
"light_mode": "Mode clair",
|
||||
"dark_mode": "Mode sombre",
|
||||
"upload_instruction": "Déposez vos fichiers/dossiers ici ou cliquez sur 'Choisir des fichiers'",
|
||||
"no_files_selected_default": "Aucun fichier sélectionné",
|
||||
"choose_files": "Choisir des fichiers",
|
||||
"delete_selected": "Supprimer la sélection",
|
||||
"copy_selected": "Copier la sélection",
|
||||
"move_selected": "Déplacer la sélection",
|
||||
"tag_selected": "Taguer la sélection",
|
||||
"download_zip": "Télécharger en Zip",
|
||||
"extract_zip": "Extraire le Zip",
|
||||
"preview": "Aperçu",
|
||||
"edit": "Modifier",
|
||||
"rename": "Renommer",
|
||||
"trash_empty": "La corbeille est vide.",
|
||||
"no_trash_selected": "Aucun élément de la corbeille sélectionné pour restauration.",
|
||||
"title": "FileRise",
|
||||
"header_title": "FileRise",
|
||||
"logout": "Se déconnecter",
|
||||
"change_password": "Changer le mot de passe",
|
||||
"restore_text": "Restaurer ou",
|
||||
"delete_text": "Supprimer les éléments de la corbeille",
|
||||
"restore_selected": "Restaurer la sélection",
|
||||
"restore_all": "Restaurer tout",
|
||||
"delete_selected_trash": "Supprimer la sélection",
|
||||
"delete_all": "Supprimer tout",
|
||||
"upload_header": "Téléverser des fichiers/dossiers",
|
||||
"folder_navigation": "Navigation et gestion des dossiers",
|
||||
"create_folder": "Créer un dossier",
|
||||
"create_folder_title": "Créer un dossier",
|
||||
"enter_folder_name": "Entrez le nom du dossier",
|
||||
"cancel": "Annuler",
|
||||
"create": "Créer",
|
||||
"rename_folder": "Renommer le dossier",
|
||||
"rename_folder_title": "Renommer le dossier",
|
||||
"rename_folder_placeholder": "Entrez le nouveau nom du dossier",
|
||||
"delete_folder": "Supprimer le dossier",
|
||||
"delete_folder_title": "Supprimer le dossier",
|
||||
"delete_folder_message": "Êtes-vous sûr de vouloir supprimer ce dossier ?",
|
||||
"folder_help": "Aide des dossiers",
|
||||
"folder_help_item_1": "Cliquez sur un dossier pour voir ses fichiers.",
|
||||
"folder_help_item_2": "Utilisez [-] pour réduire et [+] pour développer les dossiers.",
|
||||
"folder_help_item_3": "Cliquez sur 'Créer un dossier' pour ajouter un sous-dossier.",
|
||||
"folder_help_item_4": "Pour renommer ou supprimer un dossier, sélectionnez-le et cliquez sur le bouton approprié.",
|
||||
"file_list_title": "Fichiers dans (Racine)",
|
||||
"files_in": "Fichiers dans",
|
||||
"delete_files": "Supprimer les fichiers",
|
||||
"delete_selected_files_title": "Supprimer les fichiers sélectionnés",
|
||||
"delete_files_message": "Êtes-vous sûr de vouloir supprimer les fichiers sélectionnés ?",
|
||||
"copy_files": "Copier les fichiers",
|
||||
"copy_files_title": "Copier les fichiers sélectionnés",
|
||||
"copy_files_message": "Sélectionnez un dossier de destination pour copier les fichiers sélectionnés :",
|
||||
"move_files": "Déplacer les fichiers",
|
||||
"move_files_title": "Déplacer les fichiers sélectionnés",
|
||||
"move_files_message": "Sélectionnez un dossier de destination pour déplacer les fichiers sélectionnés :",
|
||||
"move": "Déplacer",
|
||||
"extract_zip_button": "Extraire le Zip",
|
||||
"download_zip_title": "Télécharger les fichiers sélectionnés en Zip",
|
||||
"download_zip_prompt": "Entrez un nom pour le fichier Zip :",
|
||||
"zip_placeholder": "fichiers.zip",
|
||||
"login": "Connexion",
|
||||
"remember_me": "Se souvenir de moi",
|
||||
"login_oidc": "Connexion avec OIDC",
|
||||
"basic_http_login": "Utiliser l'authentification HTTP basique",
|
||||
"change_password_title": "Changer le mot de passe",
|
||||
"old_password": "Ancien mot de passe",
|
||||
"new_password": "Nouveau mot de passe",
|
||||
"confirm_new_password": "Confirmer le nouveau mot de passe",
|
||||
"create_new_user_title": "Créer un nouvel utilisateur",
|
||||
"username": "Nom d'utilisateur :",
|
||||
"password": "Mot de passe :",
|
||||
"grant_admin": "Donner les droits d'administrateur",
|
||||
"save_user": "Enregistrer l'utilisateur",
|
||||
"remove_user_title": "Supprimer l'utilisateur",
|
||||
"select_user_remove": "Sélectionnez un utilisateur à supprimer :",
|
||||
"delete_user": "Supprimer l'utilisateur",
|
||||
"rename_file_title": "Renommer le fichier",
|
||||
"rename_file_placeholder": "Entrez le nouveau nom du fichier",
|
||||
"share_folder": "Partager le dossier",
|
||||
"allow_uploads": "Autoriser le téléchargement",
|
||||
"share_link_generated": "Lien de partage généré",
|
||||
"error_generating_share_link": "Erreur lors de la génération du lien de partage",
|
||||
"yes": "Oui",
|
||||
"no": "Non",
|
||||
"delete": "Supprimer",
|
||||
"download": "Télécharger",
|
||||
"upload": "Téléverser",
|
||||
"copy": "Copier",
|
||||
"extract": "Extraire",
|
||||
"user": "Utilisateur :",
|
||||
"unknown_error": "Erreur inconnue",
|
||||
"link_copied": "Lien copié dans le presse-papiers",
|
||||
"minutes": "minutes",
|
||||
"hours": "heures",
|
||||
"days": "jours",
|
||||
"weeks": "semaines",
|
||||
"months": "mois",
|
||||
"seconds": "secondes",
|
||||
"dark_mode_toggle": "Mode sombre",
|
||||
"light_mode_toggle": "Mode clair",
|
||||
// Nouvelles clés pour les panneaux et TOTP :
|
||||
"admin_panel": "Panneau d'administration",
|
||||
"user_panel": "Panneau utilisateur",
|
||||
"totp_settings": "Paramètres TOTP",
|
||||
"enable_totp": "Activer TOTP",
|
||||
"language": "Langue",
|
||||
"select_language": "Sélectionnez la langue",
|
||||
"english": "Anglais",
|
||||
"spanish": "Espagnol",
|
||||
"french": "Français",
|
||||
"german": "Allemand",
|
||||
"use_totp_code_instead": "Utiliser le code TOTP à la place",
|
||||
"submit_recovery_code": "Soumettre le code de récupération",
|
||||
"please_enter_recovery_code": "Veuillez entrer votre code de récupération.",
|
||||
"recovery_code_verification_failed": "La vérification du code de récupération a échoué",
|
||||
"error_verifying_recovery_code": "Erreur lors de la vérification du code de récupération",
|
||||
"totp_verification_failed": "La vérification TOTP a échoué",
|
||||
"error_verifying_totp_code": "Erreur lors de la vérification du code TOTP",
|
||||
"totp_setup": "Configuration TOTP",
|
||||
"scan_qr_code": "Scannez ce QR code avec votre application d'authentification.",
|
||||
"enter_totp_confirmation": "Entrez le code à 6 chiffres de votre application pour confirmer la configuration :",
|
||||
"confirm": "Confirmer",
|
||||
"please_enter_valid_code": "Veuillez entrer un code valide à 6 chiffres.",
|
||||
"totp_enabled_successfully": "TOTP activé avec succès.",
|
||||
"error_generating_recovery_code": "Erreur lors de la génération du code de récupération",
|
||||
"error_loading_qr_code": "Erreur lors du chargement du QR code.",
|
||||
"error_disabling_totp_setting": "Erreur lors de la désactivation des paramètres TOTP",
|
||||
"user_management": "Gestion des utilisateurs",
|
||||
"add_user": "Ajouter un utilisateur",
|
||||
"remove_user": "Supprimer un utilisateur",
|
||||
"user_permissions": "Permissions des utilisateurs",
|
||||
"oidc_configuration": "Configuration OIDC",
|
||||
"oidc_provider_url": "URL du fournisseur OIDC",
|
||||
"oidc_client_id": "ID du client OIDC",
|
||||
"oidc_client_secret": "Secret du client OIDC",
|
||||
"oidc_redirect_uri": "URI de redirection OIDC",
|
||||
"global_totp_settings": "Paramètres globaux TOTP",
|
||||
"global_otpauth_url": "URL globale OTPAuth",
|
||||
"login_options": "Options de connexion",
|
||||
"disable_login_form": "Désactiver le formulaire de connexion",
|
||||
"disable_basic_http_auth": "Désactiver l'authentification HTTP basique",
|
||||
"disable_oidc_login": "Désactiver la connexion OIDC",
|
||||
"save_settings": "Enregistrer les paramètres",
|
||||
"at_least_one_login_method": "Au moins une méthode de connexion doit rester activée.",
|
||||
"settings_updated_successfully": "Les paramètres ont été mis à jour avec succès.",
|
||||
"error_updating_settings": "Erreur lors de la mise à jour des paramètres",
|
||||
"user_permissions_updated_successfully": "Les permissions des utilisateurs ont été mises à jour avec succès.",
|
||||
"error_updating_permissions": "Erreur lors de la mise à jour des permissions",
|
||||
"no_users_found": "Aucun utilisateur trouvé.",
|
||||
"user_folder_only": "Dossier utilisateur uniquement",
|
||||
"read_only": "Lecture seule",
|
||||
"disable_upload": "Désactiver le téléchargement",
|
||||
"error_loading_users": "Erreur lors du chargement des utilisateurs",
|
||||
"save_permissions": "Enregistrer les permissions"
|
||||
},
|
||||
de: { /* German translations */
|
||||
"please_log_in_to_continue": "Bitte melden Sie sich an, um fortzufahren.",
|
||||
"no_files_selected": "Keine Dateien ausgewählt.",
|
||||
"confirm_delete_files": "Sind Sie sicher, dass Sie {count} ausgewählte Datei(en) löschen möchten?",
|
||||
"element_not_found": "Element mit der ID \"{id}\" wurde nicht gefunden.",
|
||||
"search_placeholder": "Suche nach Dateien oder Tags...",
|
||||
"search_placeholder": "Suche nach Dateien, Tags und Uploader...",
|
||||
"search_placeholder_advanced": "Erweiterte Suche: Dateien, Tags, Uploader und Inhalt...",
|
||||
"basic_search_tooltip": "Einfache Suche: nach Dateiname, Tags und Uploader.",
|
||||
"advanced_search_tooltip": "Erweiterte Suche: Beinhaltet Dateiinhalte zusätzlich zu Dateiname, Tags und Uploader.",
|
||||
"file_name": "Dateiname",
|
||||
"date_modified": "Änderungsdatum",
|
||||
"upload_date": "Hochladedatum",
|
||||
@@ -475,7 +909,6 @@ const translations = {
|
||||
"tag_name": "Tagname:",
|
||||
"tag_color": "Tagfarbe:",
|
||||
"save_tag": "Tag speichern",
|
||||
"files_in": "Dateien in",
|
||||
"light_mode": "Heller Modus",
|
||||
"dark_mode": "Dunkler Modus",
|
||||
"upload_instruction": "Ziehen Sie Dateien/Ordner hierher oder klicken Sie auf 'Dateien auswählen'",
|
||||
@@ -491,9 +924,7 @@ const translations = {
|
||||
"edit": "Bearbeiten",
|
||||
"rename": "Umbenennen",
|
||||
"trash_empty": "Papierkorb ist leer.",
|
||||
"no_trash_selected": "Keine Elemente im Papierkorb für die Wiederherstellung ausgewählt.",
|
||||
|
||||
// Additional keys for HTML translations:
|
||||
"no_trash_selected": "Keine Elemente im Papierkorb zur Wiederherstellung ausgewählt.",
|
||||
"title": "FileRise",
|
||||
"header_title": "FileRise",
|
||||
"logout": "Abmelden",
|
||||
@@ -505,8 +936,6 @@ const translations = {
|
||||
"delete_selected_trash": "Ausgewählte löschen",
|
||||
"delete_all": "Alle löschen",
|
||||
"upload_header": "Dateien/Ordner hochladen",
|
||||
|
||||
// Folder Management keys:
|
||||
"folder_navigation": "Ordnernavigation & Verwaltung",
|
||||
"create_folder": "Ordner erstellen",
|
||||
"create_folder_title": "Ordner erstellen",
|
||||
@@ -521,12 +950,11 @@ const translations = {
|
||||
"delete_folder_message": "Sind Sie sicher, dass Sie diesen Ordner löschen möchten?",
|
||||
"folder_help": "Ordnerhilfe",
|
||||
"folder_help_item_1": "Klicken Sie auf einen Ordner, um dessen Dateien anzuzeigen.",
|
||||
"folder_help_item_2": "Verwenden Sie [-] um zu minimieren und [+] um zu erweitern.",
|
||||
"folder_help_item_3": "Klicken Sie auf \"Ordner erstellen\", um einen Unterordner hinzuzufügen.",
|
||||
"folder_help_item_2": "Verwenden Sie [-] zum Reduzieren und [+] zum Erweitern.",
|
||||
"folder_help_item_3": "Klicken Sie auf 'Ordner erstellen', um einen Unterordner hinzuzufügen.",
|
||||
"folder_help_item_4": "Um einen Ordner umzubenennen oder zu löschen, wählen Sie ihn und klicken Sie auf die entsprechende Schaltfläche.",
|
||||
|
||||
// File List keys:
|
||||
"file_list_title": "Dateien in (Root)",
|
||||
"files_in": "Dateien in",
|
||||
"delete_files": "Dateien löschen",
|
||||
"delete_selected_files_title": "Ausgewählte Dateien löschen",
|
||||
"delete_files_message": "Sind Sie sicher, dass Sie die ausgewählten Dateien löschen möchten?",
|
||||
@@ -541,36 +969,28 @@ const translations = {
|
||||
"download_zip_title": "Ausgewählte Dateien als Zip herunterladen",
|
||||
"download_zip_prompt": "Geben Sie einen Namen für die Zip-Datei ein:",
|
||||
"zip_placeholder": "dateien.zip",
|
||||
|
||||
// Login Form keys:
|
||||
"login": "Anmelden",
|
||||
"remember_me": "Angemeldet bleiben",
|
||||
"login_oidc": "Mit OIDC anmelden",
|
||||
"basic_http_login": "HTTP-Basisauthentifizierung verwenden",
|
||||
|
||||
// Change Password keys:
|
||||
"change_password_title": "Passwort ändern",
|
||||
"old_password": "Altes Passwort",
|
||||
"new_password": "Neues Passwort",
|
||||
"confirm_new_password": "Neues Passwort bestätigen",
|
||||
|
||||
// Add User keys:
|
||||
"create_new_user_title": "Neuen Benutzer erstellen",
|
||||
"username": "Benutzername:",
|
||||
"password": "Passwort:",
|
||||
"grant_admin": "Admin-Rechte vergeben",
|
||||
"save_user": "Benutzer speichern",
|
||||
|
||||
// Remove User keys:
|
||||
"remove_user_title": "Benutzer entfernen",
|
||||
"select_user_remove": "Wählen Sie einen Benutzer zum Entfernen:",
|
||||
"delete_user": "Benutzer löschen",
|
||||
|
||||
// Rename File keys:
|
||||
"rename_file_title": "Datei umbenennen",
|
||||
"rename_file_placeholder": "Neuen Dateinamen eingeben",
|
||||
|
||||
// Custom Confirm Modal keys:
|
||||
"share_folder": "Ordner teilen",
|
||||
"allow_uploads": "Uploads erlauben",
|
||||
"share_link_generated": "Freigabelink generiert",
|
||||
"error_generating_share_link": "Fehler beim Generieren des Freigabelinks",
|
||||
"yes": "Ja",
|
||||
"no": "Nein",
|
||||
"delete": "Löschen",
|
||||
@@ -578,9 +998,71 @@ const translations = {
|
||||
"upload": "Hochladen",
|
||||
"copy": "Kopieren",
|
||||
"extract": "Entpacken",
|
||||
|
||||
// Dark Mode Toggle
|
||||
"dark_mode_toggle": "Dunkler Modus"
|
||||
"user": "Benutzer:",
|
||||
"unknown_error": "Unbekannter Fehler",
|
||||
"link_copied": "Link in die Zwischenablage kopiert",
|
||||
"minutes": "Minuten",
|
||||
"hours": "Stunden",
|
||||
"days": "Tage",
|
||||
"weeks": "Wochen",
|
||||
"months": "Monate",
|
||||
"seconds": "Sekunden",
|
||||
"dark_mode_toggle": "Dunkler Modus",
|
||||
"light_mode_toggle": "Heller Modus",
|
||||
// Neue Schlüssel für Administrations-, Benutzer-Panels und TOTP-Modal:
|
||||
"admin_panel": "Administrationsbereich",
|
||||
"user_panel": "Benutzerbereich",
|
||||
"totp_settings": "TOTP-Einstellungen",
|
||||
"enable_totp": "TOTP aktivieren",
|
||||
"language": "Sprache",
|
||||
"select_language": "Sprache auswählen",
|
||||
"english": "Englisch",
|
||||
"spanish": "Spanisch",
|
||||
"french": "Französisch",
|
||||
"german": "Deutsch",
|
||||
"use_totp_code_instead": "Stattdessen TOTP-Code verwenden",
|
||||
"submit_recovery_code": "Wiederherstellungscode absenden",
|
||||
"please_enter_recovery_code": "Bitte geben Sie Ihren Wiederherstellungscode ein.",
|
||||
"recovery_code_verification_failed": "Die Überprüfung des Wiederherstellungscodes ist fehlgeschlagen",
|
||||
"error_verifying_recovery_code": "Fehler bei der Überprüfung des Wiederherstellungscodes",
|
||||
"totp_verification_failed": "TOTP-Überprüfung fehlgeschlagen",
|
||||
"error_verifying_totp_code": "Fehler bei der Überprüfung des TOTP-Codes",
|
||||
"totp_setup": "TOTP-Einrichtung",
|
||||
"scan_qr_code": "Scannen Sie diesen QR-Code mit Ihrer Authenticator-App.",
|
||||
"enter_totp_confirmation": "Geben Sie den 6-stelligen Code aus Ihrer App zur Bestätigung ein:",
|
||||
"confirm": "Bestätigen",
|
||||
"please_enter_valid_code": "Bitte geben Sie einen gültigen 6-stelligen Code ein.",
|
||||
"totp_enabled_successfully": "TOTP wurde erfolgreich aktiviert.",
|
||||
"error_generating_recovery_code": "Fehler beim Generieren des Wiederherstellungscodes",
|
||||
"error_loading_qr_code": "Fehler beim Laden des QR-Codes.",
|
||||
"error_disabling_totp_setting": "Fehler beim Deaktivieren der TOTP-Einstellung",
|
||||
"user_management": "Benutzerverwaltung",
|
||||
"add_user": "Benutzer hinzufügen",
|
||||
"remove_user": "Benutzer entfernen",
|
||||
"user_permissions": "Benutzerberechtigungen",
|
||||
"oidc_configuration": "OIDC-Konfiguration",
|
||||
"oidc_provider_url": "OIDC-Anbieter-URL",
|
||||
"oidc_client_id": "OIDC-Client-ID",
|
||||
"oidc_client_secret": "OIDC-Client-Geheimnis",
|
||||
"oidc_redirect_uri": "OIDC-Umleitungs-URI",
|
||||
"global_totp_settings": "Globale TOTP-Einstellungen",
|
||||
"global_otpauth_url": "Globale OTPAuth-URL",
|
||||
"login_options": "Anmeldeoptionen",
|
||||
"disable_login_form": "Anmeldeformular deaktivieren",
|
||||
"disable_basic_http_auth": "HTTP-Basis-Authentifizierung deaktivieren",
|
||||
"disable_oidc_login": "OIDC-Anmeldung deaktivieren",
|
||||
"save_settings": "Einstellungen speichern",
|
||||
"at_least_one_login_method": "Mindestens eine Anmeldemethode muss aktiviert bleiben.",
|
||||
"settings_updated_successfully": "Einstellungen wurden erfolgreich aktualisiert.",
|
||||
"error_updating_settings": "Fehler beim Aktualisieren der Einstellungen",
|
||||
"user_permissions_updated_successfully": "Benutzerberechtigungen wurden erfolgreich aktualisiert.",
|
||||
"error_updating_permissions": "Fehler beim Aktualisieren der Berechtigungen",
|
||||
"no_users_found": "Keine Benutzer gefunden.",
|
||||
"user_folder_only": "Nur Benutzerordner",
|
||||
"read_only": "Nur Lesen",
|
||||
"disable_upload": "Upload deaktivieren",
|
||||
"error_loading_users": "Fehler beim Laden der Benutzer",
|
||||
"save_permissions": "Berechtigungen speichern"
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -128,18 +128,18 @@ document.addEventListener("DOMContentLoaded", function () {
|
||||
|
||||
if (darkModeToggle) {
|
||||
darkModeToggle.textContent = document.body.classList.contains("dark-mode")
|
||||
? "Light Mode"
|
||||
: "Dark Mode";
|
||||
? t("light_mode")
|
||||
: t("dark_mode");
|
||||
|
||||
darkModeToggle.addEventListener("click", function () {
|
||||
if (document.body.classList.contains("dark-mode")) {
|
||||
document.body.classList.remove("dark-mode");
|
||||
localStorage.setItem("darkMode", "false");
|
||||
darkModeToggle.textContent = "Dark Mode";
|
||||
darkModeToggle.textContent = t("dark_mode");
|
||||
} else {
|
||||
document.body.classList.add("dark-mode");
|
||||
localStorage.setItem("darkMode", "true");
|
||||
darkModeToggle.textContent = "Light Mode";
|
||||
darkModeToggle.textContent = t("light_mode");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user