mirror of
https://github.com/hargata/lubelog.git
synced 2025-12-12 00:03:10 -06:00
Add translation getter
This commit is contained in:
parent
36ac61d848
commit
cafbb156af
@ -284,6 +284,46 @@ namespace CarCareTracker.Controllers
|
|||||||
var result = _translationHelper.ExportTranslation(translationData);
|
var result = _translationHelper.ExportTranslation(translationData);
|
||||||
return Json(result);
|
return Json(result);
|
||||||
}
|
}
|
||||||
|
[Authorize(Roles =nameof(UserData.IsRootUser))]
|
||||||
|
[HttpGet]
|
||||||
|
public async Task<IActionResult> GetAvailableTranslations()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var httpClient = new HttpClient();
|
||||||
|
var translations = await httpClient.GetFromJsonAsync<Translations>(StaticHelper.TranslationDirectoryPath) ?? new Translations();
|
||||||
|
return PartialView("_Translations", translations);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError($"Unable to retrieve translations: {ex.Message}");
|
||||||
|
return PartialView("_Translations", new Translations());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
[Authorize(Roles = nameof(UserData.IsRootUser))]
|
||||||
|
[HttpGet]
|
||||||
|
public async Task<IActionResult> DownloadTranslation(string continent, string name)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var httpClient = new HttpClient();
|
||||||
|
var translationData = await httpClient.GetFromJsonAsync<Dictionary<string,string>>(StaticHelper.GetTranslationDownloadPath(continent, name)) ?? new Dictionary<string, string>();
|
||||||
|
if (translationData.Any())
|
||||||
|
{
|
||||||
|
_translationHelper.SaveTranslation(name, translationData);
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
_logger.LogError($"Unable to download translation: {name}");
|
||||||
|
return Json(false);
|
||||||
|
}
|
||||||
|
return Json(true);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError($"Unable to download translation: {ex.Message}");
|
||||||
|
return Json(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
|
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
|
||||||
public IActionResult Error()
|
public IActionResult Error()
|
||||||
{
|
{
|
||||||
|
|||||||
@ -16,6 +16,8 @@ namespace CarCareTracker.Helper
|
|||||||
public static string ReminderEmailTemplate = "defaults/reminderemailtemplate.txt";
|
public static string ReminderEmailTemplate = "defaults/reminderemailtemplate.txt";
|
||||||
public static string DefaultAllowedFileExtensions = ".png,.jpg,.jpeg,.pdf,.xls,.xlsx,.docx";
|
public static string DefaultAllowedFileExtensions = ".png,.jpg,.jpeg,.pdf,.xls,.xlsx,.docx";
|
||||||
public static string SponsorsPath = "https://hargata.github.io/hargata/sponsors.json";
|
public static string SponsorsPath = "https://hargata.github.io/hargata/sponsors.json";
|
||||||
|
public static string TranslationPath = "https://hargata.github.io/lubelog_translations";
|
||||||
|
public static string TranslationDirectoryPath = $"{TranslationPath}/directory.json";
|
||||||
public static string GetTitleCaseReminderUrgency(ReminderUrgency input)
|
public static string GetTitleCaseReminderUrgency(ReminderUrgency input)
|
||||||
{
|
{
|
||||||
switch (input)
|
switch (input)
|
||||||
@ -332,6 +334,51 @@ namespace CarCareTracker.Helper
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//Translations
|
||||||
|
public static string GetTranslationDownloadPath(string continent, string name)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(continent) || string.IsNullOrWhiteSpace(name)){
|
||||||
|
return string.Empty;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
switch (continent)
|
||||||
|
{
|
||||||
|
case "NorthAmerica":
|
||||||
|
continent = "North America";
|
||||||
|
break;
|
||||||
|
case "SouthAmerica":
|
||||||
|
continent = "South America";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return $"{TranslationPath}/{continent}/{name}.json";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
public static string GetTranslationName(string name)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(name))
|
||||||
|
{
|
||||||
|
return string.Empty;
|
||||||
|
} else
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
string cleanedName = name.Contains("_") ? name.Replace("_", "-") : name;
|
||||||
|
string displayName = CultureInfo.GetCultureInfo(cleanedName).DisplayName;
|
||||||
|
if (string.IsNullOrWhiteSpace(displayName))
|
||||||
|
{
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return displayName;
|
||||||
|
}
|
||||||
|
} catch (Exception ex)
|
||||||
|
{
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
//CSV Write Methods
|
//CSV Write Methods
|
||||||
public static void WriteGenericRecordExportModel(CsvWriter _csv, IEnumerable<GenericRecordExportModel> genericRecords)
|
public static void WriteGenericRecordExportModel(CsvWriter _csv, IEnumerable<GenericRecordExportModel> genericRecords)
|
||||||
{
|
{
|
||||||
|
|||||||
12
Models/Translations.cs
Normal file
12
Models/Translations.cs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
namespace CarCareTracker.Models
|
||||||
|
{
|
||||||
|
public class Translations
|
||||||
|
{
|
||||||
|
public List<string> Africa { get; set; } = new List<string>();
|
||||||
|
public List<string> Asia { get; set; } = new List<string>();
|
||||||
|
public List<string> Europe { get; set; } = new List<string>();
|
||||||
|
public List<string> NorthAmerica { get; set; } = new List<string>();
|
||||||
|
public List<string> SouthAmerica { get; set; } = new List<string>();
|
||||||
|
public List<string> Oceania { get; set; } = new List<string>();
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -171,7 +171,7 @@
|
|||||||
<select class="form-select" onchange="updateSettings()" id="defaultLanguage">
|
<select class="form-select" onchange="updateSettings()" id="defaultLanguage">
|
||||||
@foreach (string uiLanguage in Model.UILanguages)
|
@foreach (string uiLanguage in Model.UILanguages)
|
||||||
{
|
{
|
||||||
<!option @(Model.UserConfig.UserLanguage == uiLanguage ? "selected" : "")>@uiLanguage</!option>
|
<!option value="@uiLanguage" @(Model.UserConfig.UserLanguage == uiLanguage ? "selected" : "")>@StaticHelper.GetTranslationName(uiLanguage)</!option>
|
||||||
}
|
}
|
||||||
</select>
|
</select>
|
||||||
<div class="input-group-text">
|
<div class="input-group-text">
|
||||||
@ -183,7 +183,7 @@
|
|||||||
<select class="form-select" onchange="updateSettings()" id="defaultLanguage">
|
<select class="form-select" onchange="updateSettings()" id="defaultLanguage">
|
||||||
@foreach (string uiLanguage in Model.UILanguages)
|
@foreach (string uiLanguage in Model.UILanguages)
|
||||||
{
|
{
|
||||||
<!option @(Model.UserConfig.UserLanguage == uiLanguage ? "selected" : "")>@uiLanguage</!option>
|
<!option value="@uiLanguage" @(Model.UserConfig.UserLanguage == uiLanguage ? "selected" : "")>@StaticHelper.GetTranslationName(uiLanguage)</!option>
|
||||||
}
|
}
|
||||||
</select>
|
</select>
|
||||||
}
|
}
|
||||||
@ -209,7 +209,16 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-6 d-grid">
|
<div class="col-6 d-grid">
|
||||||
<input onChange="uploadLanguage(this)" type="file" accept=".json" class="d-none" id="inputLanguage">
|
<input onChange="uploadLanguage(this)" type="file" accept=".json" class="d-none" id="inputLanguage">
|
||||||
|
<div class="btn-group">
|
||||||
<button onclick="openUploadLanguage()" class="btn btn-primary btn-md">@translator.Translate(userLanguage, "Upload")</button>
|
<button onclick="openUploadLanguage()" class="btn btn-primary btn-md">@translator.Translate(userLanguage, "Upload")</button>
|
||||||
|
<button type="button" class="btn btn-md btn-primary btn-md dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false">
|
||||||
|
<span class="visually-hidden">Toggle Dropdown</span>
|
||||||
|
</button>
|
||||||
|
<ul class="dropdown-menu">
|
||||||
|
<li><a class="dropdown-item" href="#" onclick="showTranslationDownloader()">@translator.Translate(userLanguage, "Get Translations")</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col-6 d-grid">
|
<div class="col-6 d-grid">
|
||||||
<button onclick="deleteLanguage()" @(Model.UserConfig.UserLanguage == "en_US" ? "disabled" : "") class="btn btn-danger btn-md">@translator.Translate(userLanguage, "Delete")</button>
|
<button onclick="deleteLanguage()" @(Model.UserConfig.UserLanguage == "en_US" ? "disabled" : "") class="btn btn-danger btn-md">@translator.Translate(userLanguage, "Delete")</button>
|
||||||
@ -308,6 +317,12 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="modal fade" data-bs-focus="false" id="translationDownloadModal" tabindex="-1" role="dialog" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-lg" role="document">
|
||||||
|
<div class="modal-content" id="translationDownloadModalContent">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
<script>
|
<script>
|
||||||
function showReminderUrgencyThresholdModal(){
|
function showReminderUrgencyThresholdModal(){
|
||||||
Swal.fire({
|
Swal.fire({
|
||||||
|
|||||||
75
Views/Home/_Translations.cshtml
Normal file
75
Views/Home/_Translations.cshtml
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
@using CarCareTracker.Helper
|
||||||
|
@inject IConfigHelper config
|
||||||
|
@inject ITranslationHelper translator
|
||||||
|
@model Translations
|
||||||
|
@{
|
||||||
|
var userConfig = config.GetUserConfig(User);
|
||||||
|
var userLanguage = userConfig.UserLanguage;
|
||||||
|
}
|
||||||
|
<div class="modal-header">
|
||||||
|
<h5 class="modal-title" id="translationDownloaderModalLabel">@translator.Translate(userLanguage, "Available Translations")</h5>
|
||||||
|
<button type="button" class="btn-close" onclick="hideTranslationDownloader()" aria-label="Close"></button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body" onkeydown="handleEnter(this)">
|
||||||
|
<form class="form-inline">
|
||||||
|
<div class="form-group" style="max-height:50vh; overflow-x:hidden; overflow-y:scroll;">
|
||||||
|
@foreach(var translation in Model.Africa)
|
||||||
|
{
|
||||||
|
<div class="row mb-2">
|
||||||
|
<div class="col-10">@StaticHelper.GetTranslationName(translation)</div>
|
||||||
|
<div class="col-2">
|
||||||
|
<button type="button" class="btn btn-primary" onclick="downloadTranslation('Africa','@translation')"><i class="bi bi-download"></i></button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
@foreach (var translation in Model.Asia)
|
||||||
|
{
|
||||||
|
<div class="row mb-2">
|
||||||
|
<div class="col-10">@StaticHelper.GetTranslationName(translation)</div>
|
||||||
|
<div class="col-2">
|
||||||
|
<button type="button" class="btn btn-primary" onclick="downloadTranslation('Asia','@translation')"><i class="bi bi-download"></i></button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
@foreach (var translation in Model.Europe)
|
||||||
|
{
|
||||||
|
<div class="row mb-2">
|
||||||
|
<div class="col-10">@StaticHelper.GetTranslationName(translation)</div>
|
||||||
|
<div class="col-2">
|
||||||
|
<button type="button" class="btn btn-primary" onclick="downloadTranslation('Europe','@translation')"><i class="bi bi-download"></i></button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
@foreach (var translation in Model.NorthAmerica)
|
||||||
|
{
|
||||||
|
<div class="row mb-2">
|
||||||
|
<div class="col-10">@StaticHelper.GetTranslationName(translation)</div>
|
||||||
|
<div class="col-2">
|
||||||
|
<button type="button" class="btn btn-primary" onclick="downloadTranslation('NorthAmerica','@translation')"><i class="bi bi-download"></i></button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
@foreach (var translation in Model.SouthAmerica)
|
||||||
|
{
|
||||||
|
<div class="row mb-2">
|
||||||
|
<div class="col-10">@StaticHelper.GetTranslationName(translation)</div>
|
||||||
|
<div class="col-2">
|
||||||
|
<button type="button" class="btn btn-primary" onclick="downloadTranslation('SouthAmerica','@translation')"><i class="bi bi-download"></i></button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
@foreach (var translation in Model.Oceania)
|
||||||
|
{
|
||||||
|
<div class="row mb-2">
|
||||||
|
<div class="col-10">@StaticHelper.GetTranslationName(translation)</div>
|
||||||
|
<div class="col-2">
|
||||||
|
<button type="button" class="btn btn-primary" onclick="downloadTranslation('Oceania','@translation')"><i class="bi bi-download"></i></button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
}
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-secondary" onclick="hideTranslationDownloader()">@translator.Translate(userLanguage, "Cancel")</button>
|
||||||
|
</div>
|
||||||
File diff suppressed because one or more lines are too long
@ -234,3 +234,22 @@ function exportTranslation(){
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
function showTranslationDownloader() {
|
||||||
|
$.get('/Home/GetAvailableTranslations', function(data){
|
||||||
|
$('#translationDownloadModalContent').html(data);
|
||||||
|
$('#translationDownloadModal').modal('show');
|
||||||
|
})
|
||||||
|
}
|
||||||
|
function hideTranslationDownloader() {
|
||||||
|
$('#translationDownloadModal').modal('hide');
|
||||||
|
}
|
||||||
|
function downloadTranslation(continent, name) {
|
||||||
|
$.get(`/Home/DownloadTranslation?continent=${continent}&name=${name}`, function (data) {
|
||||||
|
if (data) {
|
||||||
|
successToast("Translation Downloaded");
|
||||||
|
updateSettings();
|
||||||
|
} else {
|
||||||
|
errorToast(genericErrorMessage());
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user