Add translation system (#85)

This commit is contained in:
Miguel Ribeiro
2024-01-23 22:46:26 +01:00
committed by GitHub
parent d287f303f0
commit d7366dcfb0
35 changed files with 965 additions and 317 deletions
+9 -9
View File
@@ -15,7 +15,7 @@ function resetForm() {
const id = document.querySelector("#id");
id.value = "";
const formTitle = document.querySelector("#form-title");
formTitle.textContent = "Add subscription";
formTitle.textContent = translate('add_subscription');
const logo = document.querySelector("#form-logo");
logo.src = "";
logo.style = 'display: none';
@@ -35,7 +35,7 @@ function resetForm() {
function fillEditFormFields(subscription) {
const formTitle = document.querySelector("#form-title");
formTitle.textContent = "Edit subscription";
formTitle.textContent = translate('edit_subscription');
const logo = document.querySelector("#form-logo");
const defaultLogo = window.theme && window.theme == "light" ? "images/wallos.png" : "images/walloswhite.png";
const logoFile = subscription.logo !== null ? "images/uploads/logos/" + subscription.logo : defaultLogo;
@@ -91,19 +91,19 @@ function openEditSubscription(event, id) {
if (response.ok) {
return response.json();
} else {
showErrorMessage("Failed to load subscription");
showErrorMessage(translate('failed_to_load_subscription'));
}
})
.then((data) => {
if (data.error || data === "Error") {
showErrorMessage("Failed to load subscription");
showErrorMessage(translate('failed_to_load_subscription'));
} else {
const subscription = data;
fillEditFormFields(subscription);
}
})
.catch((error) => {
showErrorMessage("Failed to load subscription");
showErrorMessage(translate('failed_to_load_subscription'));
});
}
@@ -145,11 +145,11 @@ function deleteSubscription(id) {
})
.then(response => {
if (response.ok) {
showSuccessMessage("Subscription deleted");
showSuccessMessage(translate('subscription_deleted'));
fetchSubscriptions();
closeAddSubscription();
} else {
alert("Error deleting the subscription");
alert(translate('error_deleting_subscription'));
}
})
.catch(error => {
@@ -188,7 +188,7 @@ function searchLogo() {
}
})
.catch(error => {
console.error("Error fetching image results:", error);
console.error(translate('error_fetching_image_results'), error);
});
} else {
nameInput.focus();
@@ -243,7 +243,7 @@ function fetchSubscriptions() {
}
})
.catch(error => {
console.error("Error reloading subscriptions:", error);
console.error(translate('error_reloading_subscription'), error);
});
}
+34
View File
@@ -0,0 +1,34 @@
let i18n = {
// Dashboard
'error_reloading_subscription': 'Error reloading subscription:',
'error_fetching_image_results': 'Error fetching image results:',
'subscription_deleted': 'Subscription deleted',
'error_deleting_subscription': "Error deleting subscription",
'failed_to_load_subscription': "Failed to load subscription",
'edit_subscription': "Edit subscription",
'add_subscription': "Add subscription",
// Settings
'network_response_error': "Network response was not ok",
'failed_add_member': 'Failed to add member',
'member': 'Member',
'save_member': 'Save member',
'delete_member': 'Delete member',
'failed_remove_member': 'Failed to remove member',
'failed_save_member': 'Failed to sabe member',
'failed_add_category': 'Failed to add categpry',
'category': 'Category',
'save_category': 'Save category',
'delete_category': 'Delete category',
'failed_remove_category': 'Failed to remove category',
'currency': 'Currency',
'currency_code': 'Currency code',
'save_currency': 'Save currency',
'delete_currency': 'Delete currency',
'failed_remove_currency': 'Failed to remove currency',
'failed_save_currency': 'Failed to save currency',
'cant_disable_payment_in_use': 'Can\'t disable payment in use',
'failed_save_payment_method': 'Failed to sabe payment method',
'unknown_error': 'Unknown error, please try again.',
'error_saving_notification_data': 'Error saving notification data',
'error_sending_notification': 'Error sending notification',
};
+7
View File
@@ -0,0 +1,7 @@
function translate(key) {
if (i18n[key]) {
return i18n[key];
} else {
return "[Translation Missing]";
}
}
+34
View File
@@ -0,0 +1,34 @@
let i18n = {
// Dashboard
'error_reloading_subscription': 'Erro ao carregar a subscrição:',
'error_fetching_image_results': 'Erro ao obter imagens:',
'subscription_deleted': 'Subscrição eliminada',
'error_deleting_subscription': 'Erro ao eliminar a subscrição',
'failed_to_load_subscription': 'Falha ao carregar a subscrição',
'edit_subscription': 'Editar subscrição',
'add_subscription': 'Adicionar subscrição',
// Settings
'network_response_error': 'Erro de resposta de rede',
'failed_add_member': 'Falha ao adicionar membro',
'member': 'Membro',
'save_member': 'Guardar membro',
'delete_member': 'Remover membro',
'failed_remove_member': 'Erro ao remover membro',
'failed_save_member': 'Erro ao guardar membro',
'failed_add_category': 'Erro ao adicionar categoria',
'category': 'Categoria',
'save_category': 'Guardar categoria',
'delete_category': 'Remover categoria',
'failed_remove_category': 'Erro ao remover categoria',
'currency': 'Moeda',
'currency_code': 'Código de moeda',
'save_currency': 'Guardar moeda',
'delete_currency': 'Remover moeda',
'failed_remove_currency': 'Erro ao remover moeda',
'failed_save_currency': 'Erro ao guardar moeda',
'cant_disable_payment_in_use': 'Não é possível desativar pagamento em uso',
'failed_save_payment_method': 'Erro ao guardar método de pagamento',
'unknown_error': 'Erro desconhecido, por favor, tente novamente.',
'error_saving_notification_data': 'Erro ao guardar dados de notificação',
'error_sending_notification': 'Erro ao enviar notificação',
};
+58
View File
@@ -0,0 +1,58 @@
function setCookie(name, value, days) {
var expires = "";
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
expires = "; expires=" + date.toUTCString();
}
document.cookie = name + "=" + value + expires + "; path=/";
}
function storeFormFieldValue(fieldId) {
var fieldElement = document.getElementById(fieldId);
if (fieldElement) {
localStorage.setItem(fieldId, fieldElement.value);
}
}
function storeFormFields() {
storeFormFieldValue('username');
storeFormFieldValue('email');
storeFormFieldValue('password');
storeFormFieldValue('confirm_password');
storeFormFieldValue('currency');
}
function restoreFormFieldValue(fieldId) {
var fieldElement = document.getElementById(fieldId);
if (fieldElement) {
fieldElement.value = localStorage.getItem(fieldId) || '';
}
}
function restoreFormFields() {
restoreFormFieldValue('username');
restoreFormFieldValue('email');
restoreFormFieldValue('password');
restoreFormFieldValue('confirm_password');
restoreFormFieldValue('currency');
}
function removeFromStorage() {
localStorage.removeItem('username');
localStorage.removeItem('email');
localStorage.removeItem('password');
localStorage.removeItem('confirm_password');
localStorage.removeItem('currency');
}
function changeLanguage(selectedLanguage) {
storeFormFields();
setCookie("language", selectedLanguage, 365);
location.reload();
}
window.onload = function () {
restoreFormFields();
removeFromStorage();
};
+56 -56
View File
@@ -24,8 +24,8 @@ function addMemberButton(memberId) {
fetch(url)
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok');
showErrorMessage("Failed to add member");
throw new Error(translate('network_response_error'));
showErrorMessage(translate('failed_add_member'));
}
return response.json();
})
@@ -39,9 +39,9 @@ function addMemberButton(memberId) {
let input = document.createElement("input");
input.type = "text";
input.placeholder = "Member";
input.placeholder = translate('member');
input.name = "member";
input.value = "Member";
input.value = translate('member');
let editLink = document.createElement("button");
editLink.className = "image-button medium"
@@ -52,7 +52,7 @@ function addMemberButton(memberId) {
let editImage = document.createElement("img");
editImage.src = "images/siteicons/save.png";
editImage.title = "Save Member";
editImage.title = translate('save_member');
editLink.appendChild(editImage);
@@ -65,7 +65,7 @@ function addMemberButton(memberId) {
let deleteImage = document.createElement("img");
deleteImage.src = "images/siteicons/delete.png";
deleteImage.title = "Delete Member";
deleteImage.title = translate('delete_member');
deleteLink.appendChild(deleteImage);
@@ -80,7 +80,7 @@ function addMemberButton(memberId) {
document.getElementById("addMember").disabled = false;
})
.catch(error => {
showErrorMessage("Failed to add member");
showErrorMessage(translate('failed_add_member'));
document.getElementById("addMember").disabled = false;
});
@@ -91,7 +91,7 @@ function removeMember(memberId) {
fetch(url)
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok');
throw new Error(translate('network_response_error'));
}
return response.json();
})
@@ -101,13 +101,13 @@ function removeMember(memberId) {
if (divToRemove) {
divToRemove.parentNode.removeChild(divToRemove);
}
showSuccessMessage("Member removed");
showSuccessMessage(responseData.message);
} else {
showErrorMessage(responseData.errorMessage || "Failed to remove member");
showErrorMessage(responseData.errorMessage || translate('failed_remove_member'));
}
})
.catch(error => {
showErrorMessage("Failed to remove member");
showErrorMessage(translate('failed_remove_member'));
});
}
@@ -124,19 +124,19 @@ function editMember(memberId) {
.then(response => {
saveButton.classList.remove("disabled");
if (!response.ok) {
showErrorMessage("Failed to save member");
showErrorMessage(translate('failed_save_member'));
}
return response.json();
})
.then(responseData => {
if (responseData.success) {
showSuccessMessage("Member saved");
showSuccessMessage(responseData.message);
} else {
showErrorMessage(responseData.errorMessage || "Failed to save member");
showErrorMessage(responseData.errorMessage || translate('failed_save_member'));
}
})
.catch(error => {
showErrorMessage("Failed to save member");
showErrorMessage(translate('failed_save_member'));
});
}
}
@@ -147,8 +147,8 @@ function addCategoryButton(categoryId) {
fetch(url)
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok');
showErrorMessage("Failed to add category");
throw new Error(translate('network_response_error'));
showErrorMessage(translate('failed_add_category'));
}
return response.json();
})
@@ -162,9 +162,9 @@ function addCategoryButton(categoryId) {
let input = document.createElement("input");
input.type = "text";
input.placeholder = "Category";
input.placeholder = translate('category');
input.name = "category";
input.value = "Category";
input.value = translate('category');
let editLink = document.createElement("button");
editLink.className = "image-button medium"
@@ -175,7 +175,7 @@ function addCategoryButton(categoryId) {
let editImage = document.createElement("img");
editImage.src = "images/siteicons/save.png";
editImage.title = "Save Category";
editImage.title = translate('save_category');
editLink.appendChild(editImage);
@@ -188,7 +188,7 @@ function addCategoryButton(categoryId) {
let deleteImage = document.createElement("img");
deleteImage.src = "images/siteicons/delete.png";
deleteImage.title = "Delete Category";
deleteImage.title = translate('delete_category');
deleteLink.appendChild(deleteImage);
@@ -203,7 +203,7 @@ function addCategoryButton(categoryId) {
document.getElementById("addCategory").disabled = false;
})
.catch(error => {
showErrorMessage("Failed to add category");
showErrorMessage(translate('failed_add_category'));
document.getElementById("addCategory").disabled = false;
});
@@ -214,7 +214,7 @@ function removeCategory(categoryId) {
fetch(url)
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok');
throw new Error(translate('network_response_error'));
}
return response.json();
})
@@ -224,13 +224,13 @@ function removeCategory(categoryId) {
if (divToRemove) {
divToRemove.parentNode.removeChild(divToRemove);
}
showSuccessMessage("Category removed");
showSuccessMessage(responseData.message);
} else {
showErrorMessage(responseData.errorMessage || "Failed to remove category");
showErrorMessage(responseData.errorMessage || translate('failed_remove_category'));
}
})
.catch(error => {
showErrorMessage("Failed to remove category");
showErrorMessage(translate('failed_remove_category'));
});
}
@@ -247,19 +247,19 @@ function editCategory(categoryId) {
.then(response => {
saveButton.classList.remove("disabled");
if (!response.ok) {
showErrorMessage("Failed to save category");
showErrorMessage(translate('failed_save_category'));
}
return response.json();
})
.then(responseData => {
if (responseData.success) {
showSuccessMessage("Category saved");
showSuccessMessage(responseData.message);
} else {
showErrorMessage(responseData.errorMessage || "Failed to save category");
showErrorMessage(responseData.errorMessage || translate('failed_save_category'));
}
})
.catch(error => {
showErrorMessage("Failed to save category");
showErrorMessage(translate('failed_save_category'));
});
}
}
@@ -270,7 +270,7 @@ function addCurrencyButton(currencyId) {
fetch(url)
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok');
throw new Error(translate('network_response_error'));
showErrorMessage(response.text());
}
return response.text();
@@ -292,13 +292,13 @@ function addCurrencyButton(currencyId) {
let inputName = document.createElement("input");
inputName.type = "text";
inputName.placeholder = "Currency";
inputName.placeholder = translate('currency');
inputName.name = "currency";
inputName.value = "Currency";
inputName.value = translate('currency');
let inputCode = document.createElement("input");
inputCode.type = "text";
inputCode.placeholder = "Currency Code";
inputCode.placeholder = translate('currency_code');
inputCode.name = "code";
inputCode.value = "CODE";
@@ -311,7 +311,7 @@ function addCurrencyButton(currencyId) {
let editImage = document.createElement("img");
editImage.src = "images/siteicons/save.png";
editImage.title = "Save Currency";
editImage.title = translate('save_currency');
editLink.appendChild(editImage);
@@ -324,7 +324,7 @@ function addCurrencyButton(currencyId) {
let deleteImage = document.createElement("img");
deleteImage.src = "images/siteicons/delete.png";
deleteImage.title = "Delete Currency";
deleteImage.title = translate('delete_currency');
deleteLink.appendChild(deleteImage);
@@ -352,23 +352,23 @@ function removeCurrency(currencyId) {
fetch(url)
.then(response => {
if (!response.ok) {
throw new Error("There was an error removing the currency");
throw new Error(translate('network_response_error'));
}
return response.json();
})
.then(data => {
if (data.success) {
showSuccessMessage("Currency removed");
showSuccessMessage(data.message);
let divToRemove = document.querySelector(`[data-currencyid="${currencyId}"]`);
if (divToRemove) {
divToRemove.parentNode.removeChild(divToRemove);
}
} else {
showErrorMessage(data.message || "Failed to remove currency");
showErrorMessage(data.message || translate('failed_remove_currency'));
}
})
.catch(error => {
showErrorMessage(error.message || "There was an error removing the currency");
showErrorMessage(error.message || translate('failed_remove_currency'));
});
}
@@ -388,7 +388,7 @@ function editCurrency(currencyId) {
fetch(url)
.then(response => {
if (!response.ok) {
throw new Error("There was an error saving the currency");
throw new Error(translate('network_response_error'));
}
return response.json();
})
@@ -396,17 +396,17 @@ function editCurrency(currencyId) {
if (data.success) {
saveButton.classList.remove("disabled");
saveButton.disabled = false;
showSuccessMessage(currencyName + " was saved");
showSuccessMessage(decodeURI(data.message));
} else {
saveButton.classList.remove("disabled");
saveButton.disabled = false;
showErrorMessage(data.message || "Failed to save currency");
showErrorMessage(data.message || translate('failed_save_currency'));
}
})
.catch(error => {
saveButton.classList.remove("disabled");
saveButton.disabled = false;
showErrorMessage(error.message || "There was an error saving the currency");
showErrorMessage(error.message || translate('failed_save_currency'));
});
}
}
@@ -415,7 +415,7 @@ function togglePayment(paymentId) {
const element = document.querySelector(`div[data-paymentid="${paymentId}"]`);
if (element.dataset.inUse === 'yes') {
return showErrorMessage('Can\'t delete used payment method');
return showErrorMessage(translate(cant_disable_payment_in_use));
}
const newEnabledState = element.dataset.enabled === '1' ? '0' : '1';
@@ -425,18 +425,18 @@ function togglePayment(paymentId) {
fetch(url).then(response => {
if (!response.ok) {
throw new Error("There was an error saving the payments method");
throw new Error(translate('network_response_error'));
}
return response.json();
}).then(data => {
if (data.success) {
element.dataset.enabled = newEnabledState;
showSuccessMessage(`${paymentMethodName} was saved`);
showSuccessMessage(`${paymentMethodName} ${data.message}`);
} else {
showErrorMessage(data.message || "Failed to save payments method");
showErrorMessage(data.message || translate('failed_save_payment_method'));
}
}).catch(error => {
showErrorMessage(error.message || "There was an error saving the payments method");
showErrorMessage(error.message || translate('failed_save_payment_method'));
});
}
@@ -457,14 +457,14 @@ document.addEventListener('DOMContentLoaded', function() {
document.getElementById("avatar").src = "images/avatars/" + newAvatar + ".svg";
var newUsername = document.getElementById("username").value;
document.getElementById("user").textContent = newUsername;
showSuccessMessage("User details saved");
showSuccessMessage(data.message);
} else {
showErrorMessage(data.errorMessage);
}
document.getElementById("userSubmit").disabled = false;
})
.catch(error => {
showErrorMessage("Unknown error, please try again");
showErrorMessage(translate('unknown_error'));
});
});
@@ -484,7 +484,7 @@ function addFixerKeyButton() {
.then(response => response.json())
.then(data => {
if (data.success) {
showSuccessMessage("API key saved successfully");
showSuccessMessage(data.message);
document.getElementById("addFixerKey").disabled = false;
} else {
showErrorMessage(data.message);
@@ -529,14 +529,14 @@ function saveNotificationsButton() {
.then(response => response.json())
.then(data => {
if (data.success) {
showSuccessMessage("Notification settings saved successfully.");
showSuccessMessage(data.message);
} else {
showErrorMessage(data.errorMessage);
}
button.disabled = false;
})
.catch(error => {
showErrorMessage("Error saving notification data");
showErrorMessage(translate('error_saving_notification_data'));
button.disabled = false;
});
}
@@ -569,14 +569,14 @@ function testNotificationButton() {
.then(response => response.json())
.then(data => {
if (data.success) {
showSuccessMessage("Notification sent successfully.");
showSuccessMessage(data.message);
} else {
showErrorMessage(data.errorMessage);
}
button.disabled = false;
})
.catch(error => {
showErrorMessage("Error sending notification");
showErrorMessage(translate('error_sending_notification'));
button.disabled = false;
});
}