Merge pull request #1097 from hargata/Hargata/1093

translation request limit workaround
This commit is contained in:
Hargata Softworks 2025-10-08 23:05:58 -06:00 committed by GitHub
commit b697501e59
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 78 additions and 21 deletions

View File

@ -7,6 +7,7 @@ using Microsoft.AspNetCore.Authorization;
using System.Security.Claims;
using CarCareTracker.Logic;
using System.Globalization;
using System.Text.Json;
namespace CarCareTracker.Controllers
{
@ -304,15 +305,28 @@ namespace CarCareTracker.Controllers
}
[Authorize(Roles = nameof(UserData.IsRootUser))]
[HttpPost]
public IActionResult SaveTranslation(string userLanguage, Dictionary<string, string> translationData)
public IActionResult SaveTranslation(IFormFile file)
{
var userLanguage = Path.GetFileNameWithoutExtension(file.FileName);
var translationData = new Dictionary<string, string>();
using (var sReader = new StreamReader(file.OpenReadStream()))
{
var sData = sReader.ReadToEnd();
translationData = JsonSerializer.Deserialize<Dictionary<string, string>>(sData);
}
var result = _translationHelper.SaveTranslation(userLanguage, translationData);
return Json(result);
}
[Authorize(Roles = nameof(UserData.IsRootUser))]
[HttpPost]
public IActionResult ExportTranslation(Dictionary<string, string> translationData)
public IActionResult ExportTranslation(IFormFile file)
{
var translationData = new Dictionary<string, string>();
using (var sReader = new StreamReader(file.OpenReadStream()))
{
var sData = sReader.ReadToEnd();
translationData = JsonSerializer.Deserialize<Dictionary<string, string>>(sData);
}
var result = _translationHelper.ExportTranslation(translationData);
return Json(result);
}

View File

@ -169,13 +169,69 @@ function showTranslationEditor() {
function hideTranslationEditor() {
$('#translationEditorModal').modal('hide');
}
function createAndUploadTranslation(translationName, translationData) {
let jsonData = JSON.stringify(translationData);
let translationBlob = new Blob([jsonData], { type: "application/json" });
let translationFile = new File([translationBlob], `${translationName}.json`, { type: "application/json" });
let formData = new FormData();
formData.append("file", translationFile);
sloader.show();
$.ajax({
url: "/Home/SaveTranslation",
data: formData,
cache: false,
processData: false,
contentType: false,
type: 'POST',
success: function (response) {
sloader.hide();
if (response.success) {
setTimeout(function () { window.location.href = '/Home/Index?tab=settings' }, 500);
} else {
errorToast(response.message);
}
},
error: function () {
sloader.hide();
errorToast("An error has occurred, please check the file size and try again later.");
}
});
}
function createAndExportTranslation(translationData) {
let jsonData = JSON.stringify(translationData);
let translationBlob = new Blob([jsonData], { type: "application/json" });
let translationFile = new File([translationBlob], `translationexport.json`, { type: "application/json" });
let formData = new FormData();
formData.append("file", translationFile);
sloader.show();
$.ajax({
url: "/Home/ExportTranslation",
data: formData,
cache: false,
processData: false,
contentType: false,
type: 'POST',
success: function (response) {
sloader.hide();
if (!response) {
errorToast(genericErrorMessage());
} else {
window.location.href = response;
}
},
error: function () {
sloader.hide();
errorToast("An error has occurred, please check the file size and try again later.");
}
});
}
function saveTranslation() {
var currentLanguage = $("#defaultLanguage").val();
var translationData = [];
var translationData = {};
$(".translation-keyvalue").map((index, elem) => {
var translationKey = $(elem).find('.translation-key');
var translationValue = $(elem).find('.translation-value textarea');
translationData.push({ key: translationKey.text().replaceAll(' ', '_').trim(), value: translationValue.val().trim() });
translationData[translationKey.text().replaceAll(' ', '_').trim()] = translationValue.val().trim();
});
if (translationData.length == 0) {
errorToast(genericErrorMessage());
@ -200,35 +256,22 @@ function saveTranslation() {
},
}).then(function (result) {
if (result.isConfirmed) {
$.post('/Home/SaveTranslation', { userLanguage: result.value.translationFileName, translationData: translationData }, function (data) {
if (data.success) {
successToast("Translation Updated");
updateSettings();
} else {
errorToast(genericErrorMessage());
}
});
createAndUploadTranslation(result.value.translationFileName, translationData);
}
});
}
function exportTranslation(){
var translationData = [];
var translationData = {};
$(".translation-keyvalue").map((index, elem) => {
var translationKey = $(elem).find('.translation-key');
var translationValue = $(elem).find('.translation-value textarea');
translationData.push({ key: translationKey.text().replaceAll(' ', '_').trim(), value: translationValue.val().trim() });
translationData[translationKey.text().replaceAll(' ', '_').trim()] = translationValue.val().trim();
});
if (translationData.length == 0) {
errorToast(genericErrorMessage());
return;
}
$.post('/Home/ExportTranslation', { translationData: translationData }, function (data) {
if (!data) {
errorToast(genericErrorMessage());
} else {
window.location.href = data;
}
});
createAndExportTranslation(translationData);
}
function showTranslationDownloader() {
$.get('/Home/GetAvailableTranslations', function(data){