Restructures project with feature-based organization
Refactors project structure to support modular, feature-driven development Introduces comprehensive language localization support Adds menu management with role-based access control Implements dynamic sidebar and theme switching capabilities Enhances project scalability and maintainability
This commit is contained in:
parent
fac7754d7a
commit
d7f3c55a2a
60 changed files with 3214 additions and 20 deletions
8
app/Features/Language/Models/SupportedCulture.cs
Normal file
8
app/Features/Language/Models/SupportedCulture.cs
Normal file
|
|
@ -0,0 +1,8 @@
|
|||
namespace CalendarServer.Features.Language.Models;
|
||||
|
||||
public class SupportedCulture
|
||||
{
|
||||
public required string Code { get; set; }
|
||||
public required string Name { get; set; }
|
||||
public required string NativeName { get; set; }
|
||||
}
|
||||
10
app/Features/Language/Services/ILocalizationService.cs
Normal file
10
app/Features/Language/Services/ILocalizationService.cs
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
using CalendarServer.Features.Language.Models;
|
||||
|
||||
namespace CalendarServer.Features.Language.Services;
|
||||
|
||||
public interface ILocalizationService
|
||||
{
|
||||
string Get(string key, string? culture = null);
|
||||
string CurrentCulture { get; }
|
||||
IEnumerable<SupportedCulture> GetSupportedCultures();
|
||||
}
|
||||
48
app/Features/Language/Services/JsonLocalizationService.cs
Normal file
48
app/Features/Language/Services/JsonLocalizationService.cs
Normal file
|
|
@ -0,0 +1,48 @@
|
|||
using System.Text.Json;
|
||||
using CalendarServer.Features.Language.Models;
|
||||
|
||||
namespace CalendarServer.Features.Language.Services;
|
||||
|
||||
public class JsonLocalizationService : ILocalizationService
|
||||
{
|
||||
private readonly string _translationsPath;
|
||||
|
||||
public JsonLocalizationService(IWebHostEnvironment env)
|
||||
{
|
||||
_translationsPath = Path.Combine(env.ContentRootPath, "Features", "Language", "Translations");
|
||||
}
|
||||
|
||||
public string CurrentCulture => "en";
|
||||
|
||||
public string Get(string key, string? culture = null)
|
||||
{
|
||||
culture ??= CurrentCulture;
|
||||
var filePath = Path.Combine(_translationsPath, $"{culture}.json");
|
||||
|
||||
if (!File.Exists(filePath))
|
||||
return key;
|
||||
|
||||
var json = File.ReadAllText(filePath);
|
||||
var doc = JsonDocument.Parse(json);
|
||||
|
||||
var parts = key.Split('.');
|
||||
JsonElement current = doc.RootElement;
|
||||
|
||||
foreach (var part in parts)
|
||||
{
|
||||
if (!current.TryGetProperty(part, out current))
|
||||
return key;
|
||||
}
|
||||
|
||||
return current.GetString() ?? key;
|
||||
}
|
||||
|
||||
public IEnumerable<SupportedCulture> GetSupportedCultures()
|
||||
{
|
||||
return new List<SupportedCulture>
|
||||
{
|
||||
new() { Code = "da", Name = "Danish", NativeName = "Dansk" },
|
||||
new() { Code = "en", Name = "English", NativeName = "English" }
|
||||
};
|
||||
}
|
||||
}
|
||||
30
app/Features/Language/TagHelpers/LocalizeTagHelper.cs
Normal file
30
app/Features/Language/TagHelpers/LocalizeTagHelper.cs
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
using Microsoft.AspNetCore.Razor.TagHelpers;
|
||||
using CalendarServer.Features.Language.Services;
|
||||
|
||||
namespace CalendarServer.Features.Language.TagHelpers;
|
||||
|
||||
[HtmlTargetElement(Attributes = "localize")]
|
||||
public class LocalizeTagHelper : TagHelper
|
||||
{
|
||||
private readonly ILocalizationService _localize;
|
||||
|
||||
public LocalizeTagHelper(ILocalizationService localize)
|
||||
{
|
||||
_localize = localize;
|
||||
}
|
||||
|
||||
[HtmlAttributeName("localize")]
|
||||
public string Key { get; set; } = string.Empty;
|
||||
|
||||
public override void Process(TagHelperContext context, TagHelperOutput output)
|
||||
{
|
||||
var translated = _localize.Get(Key);
|
||||
|
||||
if (!string.IsNullOrEmpty(translated) && translated != Key)
|
||||
{
|
||||
output.Content.SetContent(translated);
|
||||
}
|
||||
|
||||
output.Attributes.RemoveAll("localize");
|
||||
}
|
||||
}
|
||||
33
app/Features/Language/Translations/da.json
Normal file
33
app/Features/Language/Translations/da.json
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
{
|
||||
"menu": {
|
||||
"home": "Dashboard",
|
||||
"calendar": "Kalender",
|
||||
"pos": "Kasse",
|
||||
"products": "Produkter & Lager",
|
||||
"suppliers": "Leverandører",
|
||||
"customers": "Kunder",
|
||||
"employees": "Medarbejdere",
|
||||
"reports": "Statistik & Rapporter",
|
||||
"settings": "Indstillinger",
|
||||
"account": "Abonnement & Konto"
|
||||
},
|
||||
"groups": {
|
||||
"dashboard": "Dashboard",
|
||||
"data": "Data",
|
||||
"analytics": "Analyse",
|
||||
"system": "System"
|
||||
},
|
||||
"common": {
|
||||
"save": "Gem",
|
||||
"cancel": "Annuller",
|
||||
"search": "Søg",
|
||||
"close": "Luk",
|
||||
"delete": "Slet",
|
||||
"edit": "Rediger",
|
||||
"add": "Tilføj"
|
||||
},
|
||||
"sidebar": {
|
||||
"lockScreen": "Lås skærm",
|
||||
"appName": "Salon OS"
|
||||
}
|
||||
}
|
||||
33
app/Features/Language/Translations/en.json
Normal file
33
app/Features/Language/Translations/en.json
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
{
|
||||
"menu": {
|
||||
"home": "Dashboard",
|
||||
"calendar": "Calendar",
|
||||
"pos": "Point of Sale",
|
||||
"products": "Products & Inventory",
|
||||
"suppliers": "Suppliers",
|
||||
"customers": "Customers",
|
||||
"employees": "Employees",
|
||||
"reports": "Statistics & Reports",
|
||||
"settings": "Settings",
|
||||
"account": "Subscription & Account"
|
||||
},
|
||||
"groups": {
|
||||
"dashboard": "Dashboard",
|
||||
"data": "Data",
|
||||
"analytics": "Analytics",
|
||||
"system": "System"
|
||||
},
|
||||
"common": {
|
||||
"save": "Save",
|
||||
"cancel": "Cancel",
|
||||
"search": "Search",
|
||||
"close": "Close",
|
||||
"delete": "Delete",
|
||||
"edit": "Edit",
|
||||
"add": "Add"
|
||||
},
|
||||
"sidebar": {
|
||||
"lockScreen": "Lock screen",
|
||||
"appName": "Salon OS"
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue