diff --git a/Oqtane.Client/Modules/Admin/Languages/Index.razor b/Oqtane.Client/Modules/Admin/Languages/Index.razor index 069948a7..cb097355 100644 --- a/Oqtane.Client/Modules/Admin/Languages/Index.razor +++ b/Oqtane.Client/Modules/Admin/Languages/Index.razor @@ -30,7 +30,7 @@ else @context.Version - @if (UpgradeAvailable(context.Code)) + @if (UpgradeAvailable(context.Code, context.Version)) { } @@ -40,21 +40,21 @@ else } @code { - private List _languages; - private List _packages; + private List _languages; + private List _packages; - public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; + public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; - protected override async Task OnParametersSetAsync() - { - _languages = await LanguageService.GetLanguagesAsync(PageState.Site.SiteId); + protected override async Task OnParametersSetAsync() + { + _languages = await LanguageService.GetLanguagesAsync(PageState.Site.SiteId, Constants.PackageId); - var cultures = await LocalizationService.GetCulturesAsync(); + var cultures = await LocalizationService.GetCulturesAsync(); var culture = cultures.First(c => c.Name.Equals(Constants.DefaultCulture)); if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) { - _packages = await PackageService.GetPackagesAsync("translation"); + _packages = await PackageService.GetPackagesAsync("translation"); } } @@ -75,15 +75,16 @@ else } } - private bool UpgradeAvailable(string code) + private bool UpgradeAvailable(string code, string version) { var upgradeavailable = false; if (_packages != null) { - var package = _packages.Where(item => item.PackageId == ("Oqtane.Client." + code)).FirstOrDefault(); - if (package != null) + var package = _packages.Where(item => item.PackageId == (Constants.PackageId + "." + code)).FirstOrDefault(); + if (package != null) { - upgradeavailable = (Version.Parse(package.Version).CompareTo(Version.Parse(Constants.Version)) == 0); + upgradeavailable = (Version.Parse(package.Version).CompareTo(Version.Parse(Constants.Version)) == 0) && + (Version.Parse(package.Version).CompareTo(Version.Parse(version)) > 0); } } @@ -96,7 +97,7 @@ else { if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) { - await PackageService.DownloadPackageAsync(Constants.PackageId + ".Client." + code, Constants.Version, Constants.PackagesFolder); + await PackageService.DownloadPackageAsync(Constants.PackageId + "." + code, Constants.Version, Constants.PackagesFolder); await logger.LogInformation("Translation Downloaded {Code} {Version}", code, Constants.Version); await PackageService.InstallPackagesAsync(); AddModuleMessage(string.Format(Localizer["Success.Language.Install"], NavigateUrl("admin/system")), MessageType.Success); diff --git a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Edit.razor b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Edit.razor index e514c2ec..c0f8c951 100644 --- a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Edit.razor +++ b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Edit.razor @@ -1,7 +1,10 @@ @namespace Oqtane.Modules.Admin.ModuleDefinitions @inherits ModuleBase +@using System.Globalization +@using Microsoft.AspNetCore.Localization @inject IModuleDefinitionService ModuleDefinitionService @inject IPackageService PackageService +@inject ILanguageService LanguageService @inject NavigationManager NavigationManager @inject IStringLocalizer Localizer @inject IStringLocalizer SharedLocalizer @@ -99,35 +102,32 @@ @SharedLocalizer["Cancel"] - @if (_packages != null) + @if (_languages != null) { - if (_packages.Count > 0) + @if (_languages.Count > 0) { - + +
+ @SharedLocalizer["Name"] + @Localizer["Code"] + @Localizer["Version"] +   +
+ @context.Name + @context.Code + @context.Version -

@context.Name

  by:  @context.Owner
- @(context.Description.Length > 400 ? (context.Description.Substring(0, 400) + "...") : context.Description)
- @(String.Format("{0:n0}", context.Downloads)) @SharedLocalizer["Search.Downloads"]  |   - @SharedLocalizer["Search.Released"]: @context.ReleaseDate.ToString("MMM dd, yyyy")  |   - @SharedLocalizer["Search.Version"]: @context.Version - @((MarkupString)(!string.IsNullOrEmpty(context.PackageUrl) ? "  |  " + SharedLocalizer["Search.Source"] + ": " + new Uri(context.PackageUrl).Host + "" : "")) - @((MarkupString)(context.TrialPeriod > 0 ? "  |  " + context.TrialPeriod + " " + @SharedLocalizer["Trial"] + "" : "")) - - - @if (context.Price != null && !string.IsNullOrEmpty(context.PackageUrl)) + @if (context.IsDefault) { - - } - - - @if (context.Price != null && !string.IsNullOrEmpty(context.PaymentUrl)) - { - @context.Price.Value.ToString("$#,##0.00") + } else { - + if (UpgradeAvailable(_packagename + "." + context.Code, context.Version)) + { + + } }
@@ -140,6 +140,7 @@
@Localizer["Search.NoResults"]
+
} }
@@ -169,7 +170,7 @@

@@ -179,110 +180,120 @@ } @code { - private ElementReference form; - private bool validated = false; - private int _moduleDefinitionId; - private string _name; + private ElementReference form; + private bool validated = false; + private int _moduleDefinitionId; + private string _name; private string _description = ""; private string _categories; - private string _moduledefinitionname = ""; + private string _moduledefinitionname = ""; private string _version; private string _packagename = ""; private string _owner = ""; - private string _url = ""; - private string _contact = ""; - private string _license = ""; - private string _runtimes = ""; - private string _permissions; - private string _createdby; - private DateTime _createdon; - private string _modifiedby; - private DateTime _modifiedon; + private string _url = ""; + private string _contact = ""; + private string _license = ""; + private string _runtimes = ""; + private string _permissions; + private string _createdby; + private DateTime _createdon; + private string _modifiedby; + private DateTime _modifiedon; #pragma warning disable 649 - private PermissionGrid _permissionGrid; + private PermissionGrid _permissionGrid; #pragma warning restore 649 private List _packages; + private List _languages; private string _productname = ""; - private string _packageid = ""; private string _packagelicense = ""; - private string _packageversion = ""; + private string _packageid = ""; - public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; + public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Admin; - protected override async Task OnInitializedAsync() - { - try - { - _moduleDefinitionId = Int32.Parse(PageState.QueryString["id"]); - var moduleDefinition = await ModuleDefinitionService.GetModuleDefinitionAsync(_moduleDefinitionId, ModuleState.SiteId); - if (moduleDefinition != null) - { - _name = moduleDefinition.Name; + protected override async Task OnInitializedAsync() + { + try + { + _moduleDefinitionId = Int32.Parse(PageState.QueryString["id"]); + var moduleDefinition = await ModuleDefinitionService.GetModuleDefinitionAsync(_moduleDefinitionId, ModuleState.SiteId); + if (moduleDefinition != null) + { + _name = moduleDefinition.Name; _description = moduleDefinition.Description; - _categories = moduleDefinition.Categories; - _moduledefinitionname = moduleDefinition.ModuleDefinitionName; + _categories = moduleDefinition.Categories; + _moduledefinitionname = moduleDefinition.ModuleDefinitionName; _version = moduleDefinition.Version; _packagename = moduleDefinition.PackageName; _owner = moduleDefinition.Owner; - _url = moduleDefinition.Url; - _contact = moduleDefinition.Contact; - _license = moduleDefinition.License; - _runtimes = moduleDefinition.Runtimes; - _permissions = moduleDefinition.Permissions; - _createdby = moduleDefinition.CreatedBy; - _createdon = moduleDefinition.CreatedOn; - _modifiedby = moduleDefinition.ModifiedBy; - _modifiedon = moduleDefinition.ModifiedOn; + _url = moduleDefinition.Url; + _contact = moduleDefinition.Contact; + _license = moduleDefinition.License; + _runtimes = moduleDefinition.Runtimes; + _permissions = moduleDefinition.Permissions; + _createdby = moduleDefinition.CreatedBy; + _createdon = moduleDefinition.CreatedOn; + _modifiedby = moduleDefinition.ModifiedBy; + _modifiedon = moduleDefinition.ModifiedOn; - _packages = await PackageService.GetPackagesAsync("translation", "", "", moduleDefinition.PackageName); + _packages = await PackageService.GetPackagesAsync("translation", "", "", _packagename); + _languages = await LanguageService.GetLanguagesAsync(-1, _packagename); + foreach (var package in _packages) + { + var code = package.PackageId.Split('.').Last(); + if (!_languages.Any(item => item.Code == code)) + { + _languages.Add(new Language { Code = code, Name = CultureInfo.GetCultureInfo(code).DisplayName, Version = package.Version, IsDefault = true }); + } + } + _languages = _languages.OrderBy(item => item.Name).ToList(); } - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Loading ModuleDefinition {ModuleDefinitionId} {Error}", _moduleDefinitionId, ex.Message); - AddModuleMessage(Localizer["Error.Module.Load"], MessageType.Error); - } - } + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Loading ModuleDefinition {ModuleDefinitionId} {Error}", _moduleDefinitionId, ex.Message); + AddModuleMessage(Localizer["Error.Module.Load"], MessageType.Error); + } + } - private async Task SaveModuleDefinition() - { - validated = true; - var interop = new Interop(JSRuntime); - if (await interop.FormValid(form)) - { - try - { - var moduledefinition = await ModuleDefinitionService.GetModuleDefinitionAsync(_moduleDefinitionId, ModuleState.SiteId); - if (moduledefinition.Name != _name) - { - moduledefinition.Name = _name; - } - if (moduledefinition.Description != _description) - { - moduledefinition.Description = _description; - } - if (moduledefinition.Categories != _categories) - { - moduledefinition.Categories = _categories; - } - moduledefinition.Permissions = _permissionGrid.GetPermissions(); - await ModuleDefinitionService.UpdateModuleDefinitionAsync(moduledefinition); - await logger.LogInformation("ModuleDefinition Saved {ModuleDefinition}", moduledefinition); - NavigationManager.NavigateTo(NavigateUrl()); - } - catch (Exception ex) - { - await logger.LogError(ex, "Error Saving ModuleDefinition {ModuleDefinitionId} {Error}", _moduleDefinitionId, ex.Message); - AddModuleMessage(Localizer["Error.Module.Save"], MessageType.Error); - } - } - else - { - AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning); - } - } + private async Task SaveModuleDefinition() + { + validated = true; + var interop = new Interop(JSRuntime); + if (await interop.FormValid(form)) + { + try + { + var moduledefinition = await ModuleDefinitionService.GetModuleDefinitionAsync(_moduleDefinitionId, ModuleState.SiteId); + if (moduledefinition.Name != _name) + { + moduledefinition.Name = _name; + } + if (moduledefinition.Description != _description) + { + moduledefinition.Description = _description; + } + if (moduledefinition.Categories != _categories) + { + moduledefinition.Categories = _categories; + } + moduledefinition.Permissions = _permissionGrid.GetPermissions(); + await ModuleDefinitionService.UpdateModuleDefinitionAsync(moduledefinition); + await logger.LogInformation("ModuleDefinition Saved {ModuleDefinition}", moduledefinition); + NavigationManager.NavigateTo(NavigateUrl()); + } + catch (Exception ex) + { + await logger.LogError(ex, "Error Saving ModuleDefinition {ModuleDefinitionId} {Error}", _moduleDefinitionId, ex.Message); + AddModuleMessage(Localizer["Error.Module.Save"], MessageType.Error); + } + } + else + { + AddModuleMessage(SharedLocalizer["Message.InfoRequired"], MessageType.Warning); + } + } private void HideModal() { @@ -290,37 +301,53 @@ _packagelicense = ""; StateHasChanged(); } - - private async Task GetPackage(string packageid, string version) + + private bool UpgradeAvailable(string packagename, string version) { + var upgradeavailable = false; + if (_packages != null) + { + var package = _packages.Where(item => item.PackageId == packagename).FirstOrDefault(); + if (package != null) + { + upgradeavailable = (Version.Parse(package.Version).CompareTo(Version.Parse(version)) > 0); + } + + } + return upgradeavailable; + } + + private async Task GetPackage(string packagename) + { + var version = _packages.Where(item => item.PackageId == packagename).FirstOrDefault().Version; try { - var package = await PackageService.GetPackageAsync(packageid, version); + var package = await PackageService.GetPackageAsync(packagename, version); if (package != null) { _productname = package.Name; - _packageid = package.PackageId; if (!string.IsNullOrEmpty(package.License)) { _packagelicense = package.License.Replace("\n", "
"); } - _packageversion = package.Version; + _packageid = package.PackageId; } StateHasChanged(); } catch (Exception ex) { - await logger.LogError(ex, "Error Getting Package {PackageId} {Version}", packageid, version); + await logger.LogError(ex, "Error Getting Package {PackageId} {Version}", packagename, version); AddModuleMessage(Localizer["Error.Translation.Download"], MessageType.Error); } } - private async Task DownloadTranslation() + private async Task DownloadPackage(string packagename) { try { - await PackageService.DownloadPackageAsync(_packageid, _version, Constants.PackagesFolder); - await logger.LogInformation("Package {PackageId} {Version} Downloaded Successfully", _packageid, _version); + var version = _packages.Where(item => item.PackageId == packagename).FirstOrDefault().Version; + await PackageService.DownloadPackageAsync(packagename, version, Constants.PackagesFolder); + await logger.LogInformation("Package {PackageId} {Version} Downloaded Successfully", packagename, version); AddModuleMessage(Localizer["Success.Translation.Download"], MessageType.Success); _productname = ""; _packagelicense = ""; @@ -328,7 +355,7 @@ } catch (Exception ex) { - await logger.LogError(ex, "Error Downloading Package {PackageId} {Version}", _packageid, _version); + await logger.LogError(ex, "Error Downloading Package {PackageId} {Version}", _packagename, _version); AddModuleMessage(Localizer["Error.Translation.Download"], MessageType.Error); } } diff --git a/Oqtane.Server/Controllers/LanguageController.cs b/Oqtane.Server/Controllers/LanguageController.cs index ef9b0aa1..7e33c2ee 100644 --- a/Oqtane.Server/Controllers/LanguageController.cs +++ b/Oqtane.Server/Controllers/LanguageController.cs @@ -36,23 +36,37 @@ namespace Oqtane.Controllers public IEnumerable Get(string siteid, string packagename) { int SiteId; - if (int.TryParse(siteid, out SiteId) && SiteId == _alias.SiteId) + if (int.TryParse(siteid, out SiteId) && (SiteId == _alias.SiteId || SiteId == -1)) { - if (string.IsNullOrEmpty(packagename)) + List languages = new List(); + if (SiteId == -1) { - packagename = "Oqtane"; - } - var languages = _languages.GetLanguages(SiteId).ToList(); - foreach (var file in Directory.EnumerateFiles(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), $"{packagename}.*{Constants.SatelliteAssemblyExtension}", SearchOption.AllDirectories)) - { - var code = Path.GetFileName(Path.GetDirectoryName(file)); - if (languages.Any(item => item.Code == code)) + if (!string.IsNullOrEmpty(packagename)) { - languages.Single(item => item.Code == code).Version = FileVersionInfo.GetVersionInfo(file).FileVersion; + foreach (var file in Directory.EnumerateFiles(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), $"{packagename}.*{Constants.SatelliteAssemblyExtension}", SearchOption.AllDirectories)) + { + var code = Path.GetFileName(Path.GetDirectoryName(file)); + languages.Add(new Language { Code = code, Name = CultureInfo.GetCultureInfo(code).DisplayName, Version = FileVersionInfo.GetVersionInfo(file).FileVersion, IsDefault = false }); + } } } - var defaultCulture = CultureInfo.GetCultureInfo(Constants.DefaultCulture); - languages.Add(new Language { Code = defaultCulture.Name, Name = defaultCulture.DisplayName, Version = Constants.Version, IsDefault = !languages.Any(l => l.IsDefault) }); + else + { + languages = _languages.GetLanguages(SiteId).ToList(); + if (!string.IsNullOrEmpty(packagename)) + { + foreach (var file in Directory.EnumerateFiles(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location), $"{packagename}.*{Constants.SatelliteAssemblyExtension}", SearchOption.AllDirectories)) + { + var code = Path.GetFileName(Path.GetDirectoryName(file)); + if (languages.Any(item => item.Code == code)) + { + languages.Single(item => item.Code == code).Version = FileVersionInfo.GetVersionInfo(file).FileVersion; + } + } + } + var defaultCulture = CultureInfo.GetCultureInfo(Constants.DefaultCulture); + languages.Add(new Language { Code = defaultCulture.Name, Name = defaultCulture.DisplayName, Version = Constants.Version, IsDefault = !languages.Any(l => l.IsDefault) }); + } return languages.OrderBy(item => item.Name); } else