diff --git a/.gitignore b/.gitignore index 8f8f91ba..d47b8dcf 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,4 @@ Oqtane.Server/Data/*.mdf Oqtane.Server/Data/*.ldf /Oqtane.Server/Properties/PublishProfiles/FolderProfile.pubxml +Oqtane.Server/Content diff --git a/Oqtane.Client/Modules/Admin/Error/Index.razor b/Oqtane.Client/Modules/Admin/Error/Index.razor index 7ddb0ce3..381665ae 100644 --- a/Oqtane.Client/Modules/Admin/Error/Index.razor +++ b/Oqtane.Client/Modules/Admin/Error/Index.razor @@ -1,6 +1,7 @@ -@namespace Oqtane.Modules.Admin.Error +@namespace Oqtane.Modules.Admin.Error @inherits ModuleBase @inject IModuleService ModuleService +@inject IStringLocalizer Localizer @code { public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Anonymous; @@ -10,10 +11,10 @@ Module module = await ModuleService.GetModuleAsync(ModuleState.ModuleId); if (UserSecurity.IsAuthorized(PageState.User, RoleNames.Host)) { - string message = "A Problem Was Encountered Loading Module " + module.ModuleDefinitionName; + string message = Localizer["A Problem Was Encountered Loading Module {0}", module.ModuleDefinitionName]; AddModuleMessage(message, MessageType.Error); } - + await logger.LogCritical("Error Loading Module {Module}", module); } } diff --git a/Oqtane.Client/Modules/Admin/Files/Add.razor b/Oqtane.Client/Modules/Admin/Files/Add.razor index df16cac8..a848ee19 100644 --- a/Oqtane.Client/Modules/Admin/Files/Add.razor +++ b/Oqtane.Client/Modules/Admin/Files/Add.razor @@ -7,7 +7,7 @@ @inject IStringLocalizer Localizer - + - + @@ -47,7 +47,7 @@ @if (_files.Count == 0) { -
@Localizer["No Files Exist In Selected Folder"]
+
@Localizer["No Files Exist In Selected Folder"]
} } @@ -73,7 +73,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Loading Files {Error}", ex.Message); - AddModuleMessage("Error Loading Files", MessageType.Error); + AddModuleMessage(Localizer["Error Loading Files"], MessageType.Error); } } @@ -93,7 +93,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Loading Files {Error}", ex.Message); - AddModuleMessage("Error Loading Files", MessageType.Error); + AddModuleMessage(Localizer["Error Loading Files"], MessageType.Error); } } @@ -103,14 +103,14 @@ { await FileService.DeleteFileAsync(file.FileId); await logger.LogInformation("File Deleted {File}", file.Name); - AddModuleMessage("File " + file.Name + " Deleted", MessageType.Success); + AddModuleMessage(Localizer["File {0} Deleted", file.Name], MessageType.Success); await GetFiles(); StateHasChanged(); } catch (Exception ex) { await logger.LogError(ex, "Error Deleting File {File} {Error}", file.Name, ex.Message); - AddModuleMessage("Error Deleting File " + file.Name, MessageType.Error); + AddModuleMessage(Localizer["Error Deleting File {0}", file.Name], MessageType.Error); } } } diff --git a/Oqtane.Client/Modules/Admin/Jobs/Add.razor b/Oqtane.Client/Modules/Admin/Jobs/Add.razor index fde389bf..8535d2c0 100644 --- a/Oqtane.Client/Modules/Admin/Jobs/Add.razor +++ b/Oqtane.Client/Modules/Admin/Jobs/Add.razor @@ -129,12 +129,12 @@ catch (Exception ex) { await logger.LogError(ex, "Error Adding Job {Job} {Error}", job, ex.Message); - AddModuleMessage("Error Adding Job", MessageType.Error); + AddModuleMessage(Localizer["Error Adding Job"], MessageType.Error); } } else { - AddModuleMessage("You Must Provide The Job Name, Type, Frequency, and Retention", MessageType.Warning); + AddModuleMessage(Localizer["You Must Provide The Job Name, Type, Frequency, and Retention"], MessageType.Warning); } } diff --git a/Oqtane.Client/Modules/Admin/Jobs/Edit.razor b/Oqtane.Client/Modules/Admin/Jobs/Edit.razor index 62929440..65043de8 100644 --- a/Oqtane.Client/Modules/Admin/Jobs/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Jobs/Edit.razor @@ -118,7 +118,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Loading Job {JobId} {Error}", _jobId, ex.Message); - AddModuleMessage("Error Loading Job", MessageType.Error); + AddModuleMessage(Localizer["Error Loading Job"], MessageType.Error); } } @@ -171,12 +171,12 @@ catch (Exception ex) { await logger.LogError(ex, "Error Udate Job {Job} {Error}", job, ex.Message); - AddModuleMessage("Error Updating Job", MessageType.Error); + AddModuleMessage(Localizer["Error Updating Job"], MessageType.Error); } } else { - AddModuleMessage("You Must Provide The Job Name, Type, Frequency, and Retention", MessageType.Warning); + AddModuleMessage(Localizer["You Must Provide The Job Name, Type, Frequency, and Retention"], MessageType.Warning); } } diff --git a/Oqtane.Client/Modules/Admin/Jobs/Index.razor b/Oqtane.Client/Modules/Admin/Jobs/Index.razor index ffd32c17..7a435f77 100644 --- a/Oqtane.Client/Modules/Admin/Jobs/Index.razor +++ b/Oqtane.Client/Modules/Admin/Jobs/Index.razor @@ -28,7 +28,7 @@ else - + @@ -63,17 +63,17 @@ else var status = string.Empty; if (!isEnabled) { - status = "Disabled"; + status = Localizer["Disabled"]; } else { if (isExecuting) { - status = "Executing"; + status = Localizer["Executing"]; } else { - status = "Idle"; + status = Localizer["Idle"]; } } @@ -83,26 +83,26 @@ else private string DisplayFrequency(int interval, string frequency) { - var result = "Every " + interval.ToString() + " "; + var result = $"{Localizer["Every"]} {interval.ToString()} "; switch (frequency) { case "m": - result += "Minute"; + result += Localizer["Minute"]; break; case "H": - result += "Hour"; + result += Localizer["Hour"]; break; case "d": - result += "Day"; + result += Localizer["Day"]; break; case "M": - result += "Month"; + result += Localizer["Month"]; break; } if (interval > 1) { - result += "s"; + result += Localizer["s"]; } return result; @@ -119,7 +119,7 @@ else catch (Exception ex) { await logger.LogError(ex, "Error Deleting Job {Job} {Error}", job, ex.Message); - AddModuleMessage("Error Deleting Job", MessageType.Error); + AddModuleMessage(Localizer["Error Deleting Job"], MessageType.Error); } } diff --git a/Oqtane.Client/Modules/Admin/Jobs/Log.razor b/Oqtane.Client/Modules/Admin/Jobs/Log.razor index f5d8a391..b0049db7 100644 --- a/Oqtane.Client/Modules/Admin/Jobs/Log.razor +++ b/Oqtane.Client/Modules/Admin/Jobs/Log.razor @@ -50,17 +50,17 @@ else var status = string.Empty; if (isExecuting) { - status = "Executing"; + status = Localizer["Executing"]; } else { if (succeeded != null && succeeded.Value) { - status = "Succeeded"; + status = Localizer["Succeeded"]; } else { - status = "Failed"; + status = Localizer["Failed"]; } } diff --git a/Oqtane.Client/Modules/Admin/Login/Index.razor b/Oqtane.Client/Modules/Admin/Login/Index.razor index 25d5b2ae..bc53678e 100644 --- a/Oqtane.Client/Modules/Admin/Login/Index.razor +++ b/Oqtane.Client/Modules/Admin/Login/Index.razor @@ -76,11 +76,11 @@ if (user != null) { - _message = "User Account Verified Successfully. You Can Now Login With Your Username And Password Below."; + _message = Localizer["User Account Verified Successfully. You Can Now Login With Your Username And Password Below."]; } else { - _message = "User Account Could Not Be Verified. Please Contact Your Administrator For Further Instructions."; + _message = Localizer["User Account Could Not Be Verified. Please Contact Your Administrator For Further Instructions."]; _type = MessageType.Warning; } } @@ -109,7 +109,7 @@ else { await logger.LogInformation("Login Failed For Username {Username}", _username); - AddModuleMessage("Login Failed. Please Remember That Passwords Are Case Sensitive And User Accounts Require Email Verification When They Initially Created.", MessageType.Error); + AddModuleMessage(Localizer["Login Failed. Please Remember That Passwords Are Case Sensitive And User Accounts Require Email Verification When They Initially Created."], MessageType.Error); } } else @@ -130,7 +130,7 @@ else { await logger.LogInformation("Login Failed For Username {Username}", _username); - AddModuleMessage("Login Failed. Please Remember That Passwords Are Case Sensitive And User Accounts Require Verification When They Are Initially Created So You May Wish To Check Your Email.", MessageType.Error); + AddModuleMessage(Localizer["Login Failed. Please Remember That Passwords Are Case Sensitive And User Accounts Require Verification When They Are Initially Created So You May Wish To Check Your Email."], MessageType.Error); } } } diff --git a/Oqtane.Client/Modules/Admin/Logs/Detail.razor b/Oqtane.Client/Modules/Admin/Logs/Detail.razor index 7c2c1303..481a9636 100644 --- a/Oqtane.Client/Modules/Admin/Logs/Detail.razor +++ b/Oqtane.Client/Modules/Admin/Logs/Detail.razor @@ -207,7 +207,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Loading Log {LogId} {Error}", _logId, ex.Message); - AddModuleMessage("Error Loading Log", MessageType.Error); + AddModuleMessage(Localizer["Error Loading Log"], MessageType.Error); } } } diff --git a/Oqtane.Client/Modules/Admin/Logs/Index.razor b/Oqtane.Client/Modules/Admin/Logs/Index.razor index 59830a0d..3ace61fd 100644 --- a/Oqtane.Client/Modules/Admin/Logs/Index.razor +++ b/Oqtane.Client/Modules/Admin/Logs/Index.razor @@ -14,13 +14,13 @@ else - + - + @@ -52,7 +52,7 @@ - + @@ -78,7 +78,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Loading Deleted Pages Or Modules {Error}", ex.Message); - AddModuleMessage("Error Loading Deleted Pages Or Modules", MessageType.Error); + AddModuleMessage(Localizer["Error Loading Deleted Pages Or Modules"], MessageType.Error); } } @@ -105,7 +105,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Restoring Deleted Page {Page} {Error}", page, ex.Message); - AddModuleMessage("Error Restoring Deleted Page", MessageType.Error); + AddModuleMessage(Localizer["Error Restoring Deleted Page"], MessageType.Error); } } @@ -140,7 +140,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Restoring Deleted Module {Module} {Error}", module, ex.Message); - AddModuleMessage("Error Restoring Deleted Module", MessageType.Error); + AddModuleMessage(Localizer["Error Restoring Deleted Module"], MessageType.Error); } } @@ -164,7 +164,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Permanently Deleting Module {Module} {Error}", module, ex.Message); - AddModuleMessage("Error Permanently Deleting Module", MessageType.Error); + AddModuleMessage(Localizer["Error Permanently Deleting Module"], MessageType.Error); } } } diff --git a/Oqtane.Client/Modules/Admin/Register/Index.razor b/Oqtane.Client/Modules/Admin/Register/Index.razor index dfff44e0..a9789507 100644 --- a/Oqtane.Client/Modules/Admin/Register/Index.razor +++ b/Oqtane.Client/Modules/Admin/Register/Index.razor @@ -11,10 +11,10 @@ ... - + - +
@@ -45,7 +45,7 @@ } else { - + } @code { @@ -80,28 +80,28 @@ else if (user != null) { await logger.LogInformation("User Created {Username} {Email}", _username, _email); - AddModuleMessage("User Account Created. Please Check Your Email For Verification Instructions.", MessageType.Info); + AddModuleMessage(Localizer["User Account Created. Please Check Your Email For Verification Instructions."], MessageType.Info); } else { await logger.LogError("Error Adding User {Username} {Email}", _username, _email); - AddModuleMessage("Error Adding User. Please Ensure Password Meets Complexity Requirements And Username Is Not Already In Use.", MessageType.Error); + AddModuleMessage(Localizer["Error Adding User. Please Ensure Password Meets Complexity Requirements And Username Is Not Already In Use."], MessageType.Error); } } else { - AddModuleMessage("Passwords Entered Do Not Match", MessageType.Warning); + AddModuleMessage(Localizer["Passwords Entered Do Not Match"], MessageType.Warning); } } else { - AddModuleMessage("You Must Provide A Username, Password, and Email Address", MessageType.Warning); + AddModuleMessage(Localizer["You Must Provide A Username, Password, and Email Address"], MessageType.Warning); } } catch (Exception ex) { await logger.LogError(ex, "Error Adding User {Username} {Email} {Error}", _username, _email, ex.Message); - AddModuleMessage("Error Adding User", MessageType.Error); + AddModuleMessage(Localizer["Error Adding User"], MessageType.Error); } } diff --git a/Oqtane.Client/Modules/Admin/Reset/Index.razor b/Oqtane.Client/Modules/Admin/Reset/Index.razor index 1a04eb46..4ee8ed15 100644 --- a/Oqtane.Client/Modules/Admin/Reset/Index.razor +++ b/Oqtane.Client/Modules/Admin/Reset/Index.razor @@ -64,23 +64,23 @@ else { await logger.LogError("Error Resetting User Password {Username}", _username); - AddModuleMessage("Error Resetting User Password. Please Ensure Password Meets Complexity Requirements.", MessageType.Error); + AddModuleMessage(Localizer["Error Resetting User Password. Please Ensure Password Meets Complexity Requirements."], MessageType.Error); } } else { - AddModuleMessage("Passwords Entered Do Not Match", MessageType.Warning); + AddModuleMessage(Localizer["Passwords Entered Do Not Match"], MessageType.Warning); } } else { - AddModuleMessage("You Must Provide A Username, Password, and Email Address", MessageType.Warning); + AddModuleMessage(Localizer["You Must Provide A Username, Password, and Email Address"], MessageType.Warning); } } catch (Exception ex) { await logger.LogError(ex, "Error Resetting User Password {Username} {Error}", _username, ex.Message); - AddModuleMessage("Error Resetting User Password", MessageType.Error); + AddModuleMessage(Localizer["Error Resetting User Password"], MessageType.Error); } } diff --git a/Oqtane.Client/Modules/Admin/Roles/Add.razor b/Oqtane.Client/Modules/Admin/Roles/Add.razor index e9fc5372..c5bc2a38 100644 --- a/Oqtane.Client/Modules/Admin/Roles/Add.razor +++ b/Oqtane.Client/Modules/Admin/Roles/Add.razor @@ -62,7 +62,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Adding Role {Role} {Error}", role, ex.Message); - AddModuleMessage("Error Adding Role", MessageType.Error); + AddModuleMessage(Localizer["Error Adding Role"], MessageType.Error); } } diff --git a/Oqtane.Client/Modules/Admin/Roles/Edit.razor b/Oqtane.Client/Modules/Admin/Roles/Edit.razor index 2598c810..bac812c9 100644 --- a/Oqtane.Client/Modules/Admin/Roles/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Roles/Edit.razor @@ -60,7 +60,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Loading Role {RoleId} {Error}", _roleid, ex.Message); - AddModuleMessage("Error Loading Role", MessageType.Error); + AddModuleMessage(Localizer["Error Loading Role"], MessageType.Error); } } @@ -81,7 +81,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Saving Role {Role} {Error}", role, ex.Message); - AddModuleMessage("Error Saving Role", MessageType.Error); + AddModuleMessage(Localizer["Error Saving Role"], MessageType.Error); } } } diff --git a/Oqtane.Client/Modules/Admin/Roles/Index.razor b/Oqtane.Client/Modules/Admin/Roles/Index.razor index 6344925d..3afa6c88 100644 --- a/Oqtane.Client/Modules/Admin/Roles/Index.razor +++ b/Oqtane.Client/Modules/Admin/Roles/Index.razor @@ -20,7 +20,7 @@ else
- + @@ -48,7 +48,7 @@ else catch (Exception ex) { await logger.LogError(ex, "Error Deleting Role {Role} {Error}", role, ex.Message); - AddModuleMessage("Error Deleting Role", MessageType.Error); + AddModuleMessage(Localizer["Error Deleting Role"], MessageType.Error); } } } diff --git a/Oqtane.Client/Modules/Admin/Roles/Users.razor b/Oqtane.Client/Modules/Admin/Roles/Users.razor index ecd7cb91..9ceae846 100644 --- a/Oqtane.Client/Modules/Admin/Roles/Users.razor +++ b/Oqtane.Client/Modules/Admin/Roles/Users.razor @@ -25,7 +25,7 @@ else - + @@ -69,13 +69,13 @@ else } else { - AddModuleMessage("You Can Not Delete The Current Site", MessageType.Warning); + AddModuleMessage(Localizer["You Can Not Delete The Current Site"], MessageType.Warning); } } catch (Exception ex) { await Log(alias, LogLevel.Error, "", ex, "Error Deleting Site {SiteId} {Error}", alias.SiteId, ex.Message); - AddModuleMessage("Error Deleting Site", MessageType.Error); + AddModuleMessage(Localizer["Error Deleting Site"], MessageType.Error); } } } diff --git a/Oqtane.Client/Modules/Admin/Sql/Index.razor b/Oqtane.Client/Modules/Admin/Sql/Index.razor index 69191bab..5edd39ab 100644 --- a/Oqtane.Client/Modules/Admin/Sql/Index.razor +++ b/Oqtane.Client/Modules/Admin/Sql/Index.razor @@ -67,7 +67,7 @@ else } else { - AddModuleMessage("You Must Select A Tenant And Provide A SQL Query", MessageType.Warning); + AddModuleMessage(Localizer["You Must Select A Tenant And Provide A SQL Query"], MessageType.Warning); } } @@ -105,7 +105,7 @@ else } else { - table = "No Results Returned"; + table = Localizer["No Results Returned"]; } return table; diff --git a/Oqtane.Client/Modules/Admin/SystemInfo/Index.razor b/Oqtane.Client/Modules/Admin/SystemInfo/Index.razor index 5a1e485a..e7e69635 100644 --- a/Oqtane.Client/Modules/Admin/SystemInfo/Index.razor +++ b/Oqtane.Client/Modules/Admin/SystemInfo/Index.razor @@ -55,7 +55,7 @@
@@ -38,7 +38,7 @@ @if (PageState.QueryString.ContainsKey("id")) { - + } @foreach (Folder folder in _folders) { @@ -44,10 +44,10 @@ { } - Cancel + @Localizer["Cancel"] @if (!_isSystem && PageState.QueryString.ContainsKey("id")) { - + }

@@ -108,7 +108,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Loading Folder {FolderId} {Error}", _folderId, ex.Message); - AddModuleMessage("Error Loading Folder", MessageType.Error); + AddModuleMessage(Localizer["Error Loading Folder"], MessageType.Error); } } @@ -116,13 +116,13 @@ { if (_name == string.Empty || _parentId == -1) { - AddModuleMessage("Folders Must Have A Parent And A Name", MessageType.Warning); + AddModuleMessage(Localizer["Folders Must Have A Parent And A Name"], MessageType.Warning); return; } if (!_name.IsPathOrFileValid()) { - AddModuleMessage("Folder Name Not Valid.", MessageType.Warning); + AddModuleMessage(Localizer["Folder Name Not Valid."], MessageType.Warning); return; } @@ -170,13 +170,13 @@ } else { - AddModuleMessage("An Error Was Encountered Saving The Folder", MessageType.Error); + AddModuleMessage(Localizer["An Error Was Encountered Saving The Folder"], MessageType.Error); } } catch (Exception ex) { await logger.LogError(ex, "Error Saving Folder {FolderId} {Error}", _folderId, ex.Message); - AddModuleMessage("Error Saving Folder", MessageType.Error); + AddModuleMessage(Localizer["Error Saving Folder"], MessageType.Error); } } @@ -204,18 +204,18 @@ } else { - AddModuleMessage("Folder Has Files And Cannot Be Deleted", MessageType.Warning); + AddModuleMessage(Localizer["Folder Has Files And Cannot Be Deleted"], MessageType.Warning); } } else { - AddModuleMessage("Folder Has Subfolders And Cannot Be Deleted", MessageType.Warning); + AddModuleMessage(Localizer["Folder Has Subfolders And Cannot Be Deleted"], MessageType.Warning); } } catch (Exception ex) { await logger.LogError(ex, "Error Deleting Folder {Folder} {Error}", _folderId, ex.Message); - AddModuleMessage("Error Deleting Folder", MessageType.Error); + AddModuleMessage(Localizer["Error Deleting Folder"], MessageType.Error); } } } diff --git a/Oqtane.Client/Modules/Admin/Files/Index.razor b/Oqtane.Client/Modules/Admin/Files/Index.razor index bff90388..26cd56f9 100644 --- a/Oqtane.Client/Modules/Admin/Files/Index.razor +++ b/Oqtane.Client/Modules/Admin/Files/Index.razor @@ -38,7 +38,7 @@
@context.Name @context.ModifiedOn @context.Extension.ToUpper() @Localizer["File"] @context.Name @DisplayStatus(context.IsEnabled, context.IsExecuting) @@ -88,7 +88,7 @@ else catch (Exception ex) { await logger.LogError(ex, "Error Loading Logs {Error}", ex.Message); - AddModuleMessage("Error Loading Logs", MessageType.Error); + AddModuleMessage(Localizer["Error Loading Logs"], MessageType.Error); } } @@ -103,7 +103,7 @@ else catch (Exception ex) { await logger.LogError(ex, "Error Loading Logs {Error}", ex.Message); - AddModuleMessage("Error Loading Logs", MessageType.Error); + AddModuleMessage(Localizer["Error Loading Logs"], MessageType.Error); } } @@ -118,7 +118,7 @@ else catch (Exception ex) { await logger.LogError(ex, "Error Loading Logs {Error}", ex.Message); - AddModuleMessage("Error Loading Logs", MessageType.Error); + AddModuleMessage(Localizer["Error Loading Logs"], MessageType.Error); } } @@ -134,7 +134,7 @@ else catch (Exception ex) { await logger.LogError(ex, "Error Loading Logs {Error}", ex.Message); - AddModuleMessage("Error Loading Logs", MessageType.Error); + AddModuleMessage(Localizer["Error Loading Logs"], MessageType.Error); } } diff --git a/Oqtane.Client/Modules/Admin/ModuleCreator/Index.razor b/Oqtane.Client/Modules/Admin/ModuleCreator/Index.razor index f3712317..79d5eb42 100644 --- a/Oqtane.Client/Modules/Admin/ModuleCreator/Index.razor +++ b/Oqtane.Client/Modules/Admin/ModuleCreator/Index.razor @@ -105,7 +105,7 @@ else } else { - AddModuleMessage("Once You Have Compiled The Module And Restarted The Application You Can Activate The Module Below", MessageType.Info); + AddModuleMessage(Localizer["Once You Have Compiled The Module And Restarted The Application You Can Activate The Module Below"], MessageType.Info); } } @@ -122,11 +122,11 @@ else SettingService.SetSetting(settings, "ModuleDefinitionName", moduleDefinition.ModuleDefinitionName); await SettingService.UpdateModuleSettingsAsync(settings, ModuleState.ModuleId); - AddModuleMessage("The Source Code For Your Module Has Been Created At The Location Specified Below And Must Be Compiled In Order To Make It Functional. Once It Has Been Compiled You Must Restart Your Application To Apply These Changes.", MessageType.Success); + AddModuleMessage(Localizer["The Source Code For Your Module Has Been Created At The Location Specified Below And Must Be Compiled In Order To Make It Functional. Once It Has Been Compiled You Must Restart Your Application To Apply These Changes.", NavigateUrl("admin/system")], MessageType.Success); } else { - AddModuleMessage("You Must Provide A Valid Owner Name, Module Name, And Template", MessageType.Warning); + AddModuleMessage(Localizer["You Must Provide A Valid Owner Name, Module Name, And Template"], MessageType.Warning); } } catch (Exception ex) @@ -187,7 +187,7 @@ else catch (Exception ex) { await logger.LogError(ex, "Error Getting System Info {Error}", ex.Message); - AddModuleMessage("Error Getting System Info", MessageType.Error); + AddModuleMessage(Localizer["Error Getting System Info"], MessageType.Error); } } } diff --git a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor index 22d08ac2..92f26844 100644 --- a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor +++ b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Add.razor @@ -70,7 +70,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Loading Packages {Error}", ex.Message); - AddModuleMessage("Error Loading Packages", MessageType.Error); + AddModuleMessage(Localizer["Error Loading Packages"], MessageType.Error); } } @@ -79,7 +79,7 @@ try { await ModuleDefinitionService.InstallModuleDefinitionsAsync(); - AddModuleMessage("Module Installed Successfully. You Must Restart Your Application To Apply These Changes.", MessageType.Success); + AddModuleMessage(Localizer["Module Installed Successfully. You Must Restart Your Application To Apply These Changes.", NavigateUrl("admin/system")], MessageType.Success); } catch (Exception ex) { @@ -93,13 +93,13 @@ { await PackageService.DownloadPackageAsync(packageid, version, "Modules"); await logger.LogInformation("Module {ModuleDefinitionName} {Version} Downloaded Successfully", packageid, version); - AddModuleMessage("Modules Downloaded Successfully. Click Install To Complete Installation.", MessageType.Success); + AddModuleMessage(Localizer["Modules Downloaded Successfully. Click Install To Complete Installation."], MessageType.Success); StateHasChanged(); } catch (Exception ex) { await logger.LogError(ex, "Error Downloading Module {ModuleDefinitionName} {Version}", packageid, version); - AddModuleMessage("Error Downloading Module", MessageType.Error); + AddModuleMessage(Localizer["Error Downloading Module"], MessageType.Error); } } } diff --git a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Edit.razor b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Edit.razor index b47700eb..367abce8 100644 --- a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Edit.razor +++ b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Edit.razor @@ -161,7 +161,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Loading ModuleDefinition {ModuleDefinitionId} {Error}", _moduleDefinitionId, ex.Message); - AddModuleMessage("Error Loading Module", MessageType.Error); + AddModuleMessage(Localizer["Error Loading Module"], MessageType.Error); } } @@ -190,7 +190,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Saving ModuleDefinition {ModuleDefinitionId} {Error}", _moduleDefinitionId, ex.Message); - AddModuleMessage("Error Saving Module", MessageType.Error); + AddModuleMessage(Localizer["Error Saving Module"], MessageType.Error); } } } diff --git a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor index da1f58a8..a3f0b71e 100644 --- a/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor +++ b/Oqtane.Client/Modules/Admin/ModuleDefinitions/Index.razor @@ -59,7 +59,7 @@ else if (_moduleDefinitions == null) { await logger.LogError(ex, "Error Loading Modules {Error}", ex.Message); - AddModuleMessage("Error Loading Modules", MessageType.Error); + AddModuleMessage(Localizer["Error Loading Modules"], MessageType.Error); } } } @@ -86,12 +86,12 @@ else await PackageService.DownloadPackageAsync(moduledefinitionname, version, "Modules"); await logger.LogInformation("Module Downloaded {ModuleDefinitionName} {Version}", moduledefinitionname, version); await ModuleDefinitionService.InstallModuleDefinitionsAsync(); - AddModuleMessage("Module Installed Successfully. You Must Restart Your Application To Apply These Changes.", MessageType.Success); + AddModuleMessage(Localizer["Module Installed Successfully. You Must Restart Your Application To Apply These Changes.", NavigateUrl("admin/system")], MessageType.Success); } catch (Exception ex) { await logger.LogError(ex, "Error Downloading Module {ModuleDefinitionName} {Version} {Error}", moduledefinitionname, version, ex.Message); - AddModuleMessage("Error Downloading Module", MessageType.Error); + AddModuleMessage(Localizer["Error Downloading Module"], MessageType.Error); } } @@ -100,12 +100,12 @@ else try { await ModuleDefinitionService.DeleteModuleDefinitionAsync(moduleDefinition.ModuleDefinitionId, moduleDefinition.SiteId); - AddModuleMessage("Module Deleted Successfully. You Must Restart Your Application To Apply These Changes.", MessageType.Success); + AddModuleMessage(Localizer["Module Deleted Successfully. You Must Restart Your Application To Apply These Changes.", NavigateUrl("admin/system")], MessageType.Success); } catch (Exception ex) { await logger.LogError(ex, "Error Deleting Module {ModuleDefinition} {Error}", moduleDefinition, ex.Message); - AddModuleMessage("Error Deleting Module", MessageType.Error); + AddModuleMessage(Localizer["Error Deleting Module"], MessageType.Error); } } } diff --git a/Oqtane.Client/Modules/Admin/Modules/Import.razor b/Oqtane.Client/Modules/Admin/Modules/Import.razor index 585aeeda..423361f6 100644 --- a/Oqtane.Client/Modules/Admin/Modules/Import.razor +++ b/Oqtane.Client/Modules/Admin/Modules/Import.razor @@ -35,22 +35,22 @@ bool success = await ModuleService.ImportModuleAsync(ModuleState.ModuleId, _content); if (success) { - AddModuleMessage("Content Imported Successfully", MessageType.Success); + AddModuleMessage(Localizer["Content Imported Successfully"], MessageType.Success); } else { - AddModuleMessage("A Problem Was Encountered Importing Content. Please Ensure The Content Is Formatted Correctly For The Module.", MessageType.Warning); + AddModuleMessage(Localizer["A Problem Was Encountered Importing Content. Please Ensure The Content Is Formatted Correctly For The Module."], MessageType.Warning); } } catch (Exception ex) { await logger.LogError(ex, "Error Importing Module {ModuleId} {Error}", ModuleState.ModuleId, ex.Message); - AddModuleMessage("Error Importing Module", MessageType.Error); + AddModuleMessage(Localizer["Error Importing Module"], MessageType.Error); } } else { - AddModuleMessage("You Must Enter Some Content To Import", MessageType.Warning); + AddModuleMessage(Localizer["You Must Enter Some Content To Import"], MessageType.Warning); } } } diff --git a/Oqtane.Client/Modules/Admin/Pages/Add.razor b/Oqtane.Client/Modules/Admin/Pages/Add.razor index 1d205ba5..72bc3c6f 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Add.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Add.razor @@ -230,7 +230,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Initializing Page {Error}", ex.Message); - AddModuleMessage("Error Initializing Page", MessageType.Error); + AddModuleMessage(Localizer["Error Initializing Page"], MessageType.Error); } } @@ -265,7 +265,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Loading Child Pages For Parent {PageId} {Error}", _parentid, ex.Message); - AddModuleMessage("Error Loading Child Pages For Parent", MessageType.Error); + AddModuleMessage(Localizer["Error Loading Child Pages For Parent"], MessageType.Error); } } @@ -291,7 +291,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Loading Pane Layouts For Theme {ThemeType} {Error}", _themetype, ex.Message); - AddModuleMessage("Error Loading Pane Layouts For Theme", MessageType.Error); + AddModuleMessage(Localizer["Error Loading Pane Layouts For Theme"], MessageType.Error); } } @@ -337,7 +337,7 @@ if (!PagePathIsUnique(page.Path, page.SiteId, _pageList)) { - AddModuleMessage($"A page with path {_path} already exists for the selected parent page. The page path needs to be unique for the selected parent.", MessageType.Warning); + AddModuleMessage(Localizer["A page with path {0} already exists for the selected parent page. The page path needs to be unique for the selected parent.", _path], MessageType.Warning); return; } @@ -390,14 +390,14 @@ } else { - AddModuleMessage("You Must Provide Page Name And Theme/Layout", MessageType.Warning); + AddModuleMessage(Localizer["You Must Provide Page Name And Theme/Layout"], MessageType.Warning); } } catch (Exception ex) { await logger.LogError(ex, "Error Saving Page {Page} {Error}", page, ex.Message); - AddModuleMessage("Error Saving Page", MessageType.Error); + AddModuleMessage(Localizer["Error Saving Page"], MessageType.Error); } } diff --git a/Oqtane.Client/Modules/Admin/Pages/Edit.razor b/Oqtane.Client/Modules/Admin/Pages/Edit.razor index 19f58753..7cd500a6 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Edit.razor @@ -309,7 +309,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Loading Page {PageId} {Error}", _pageId, ex.Message); - AddModuleMessage("Error Loading Page", MessageType.Error); + AddModuleMessage(Localizer["Error Loading Page"], MessageType.Error); } } @@ -352,7 +352,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Loading Child Pages For Parent {PageId} {Error}", _parentid, ex.Message); - AddModuleMessage("Error Loading Child Pages For Parent", MessageType.Error); + AddModuleMessage(Localizer["Error Loading Child Pages For Parent"], MessageType.Error); } } @@ -378,7 +378,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Loading Pane Layouts For Theme {ThemeType} {Error}", _themetype, ex.Message); - AddModuleMessage("Error Loading Pane Layouts For Theme", MessageType.Error); + AddModuleMessage(Localizer["Error Loading Pane Layouts For Theme"], MessageType.Error); } } @@ -424,7 +424,7 @@ if (!PagePathIsUnique(page.Path, page.SiteId, page.PageId, _pageList)) { - AddModuleMessage($"A page with path {_path} already exists for the selected parent page. The page path needs to be unique for the selected parent.", MessageType.Warning); + AddModuleMessage(Localizer["A page with path {0} already exists for the selected parent page. The page path needs to be unique for the selected parent.", _path], MessageType.Warning); return; } @@ -497,13 +497,13 @@ } else { - AddModuleMessage("You Must Provide Page Name", MessageType.Warning); + AddModuleMessage(Localizer["You Must Provide Page Name"], MessageType.Warning); } } catch (Exception ex) { await logger.LogError(ex, "Error Saving Page {Page} {Error}", page, ex.Message); - AddModuleMessage("Error Saving Page", MessageType.Error); + AddModuleMessage(Localizer["Error Saving Page"], MessageType.Error); } } diff --git a/Oqtane.Client/Modules/Admin/Pages/Index.razor b/Oqtane.Client/Modules/Admin/Pages/Index.razor index 4e3966f9..4ff925fc 100644 --- a/Oqtane.Client/Modules/Admin/Pages/Index.razor +++ b/Oqtane.Client/Modules/Admin/Pages/Index.razor @@ -38,7 +38,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Deleting Page {Page} {Error}", page, ex.Message); - AddModuleMessage("Error Deleting Page", MessageType.Error); + AddModuleMessage(Localizer["Error Deleting Page"], MessageType.Error); } } } diff --git a/Oqtane.Client/Modules/Admin/Profiles/Edit.razor b/Oqtane.Client/Modules/Admin/Profiles/Edit.razor index 4eab45b9..86a71c8c 100644 --- a/Oqtane.Client/Modules/Admin/Profiles/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Profiles/Edit.razor @@ -138,7 +138,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Loading Profile {ProfileId} {Error}", _profileid, ex.Message); - AddModuleMessage("Error Loading Profile", MessageType.Error); + AddModuleMessage(Localizer["Error Loading Profile"], MessageType.Error); } } @@ -182,7 +182,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Saving Profile {ProfleId} {Error}", _profileid, ex.Message); - AddModuleMessage("Error Saving Profile", MessageType.Error); + AddModuleMessage(Localizer["Error Saving Profile"], MessageType.Error); } } } diff --git a/Oqtane.Client/Modules/Admin/Profiles/Index.razor b/Oqtane.Client/Modules/Admin/Profiles/Index.razor index e7985f51..0bdf8554 100644 --- a/Oqtane.Client/Modules/Admin/Profiles/Index.razor +++ b/Oqtane.Client/Modules/Admin/Profiles/Index.razor @@ -41,12 +41,12 @@ else { await ProfileService.DeleteProfileAsync(profileId); await logger.LogInformation("Profile Deleted {ProfileId}", profileId); - AddModuleMessage("Profile Deleted", MessageType.Success); + AddModuleMessage(Localizer["Profile Deleted"], MessageType.Success); } catch (Exception ex) { await logger.LogError(ex, "Error Deleting Profile {ProfileId} {Error}", profileId, ex.Message); - AddModuleMessage("Error Deleting Profile", MessageType.Error); + AddModuleMessage(Localizer["Error Deleting Profile"], MessageType.Error); } } } diff --git a/Oqtane.Client/Modules/Admin/RecycleBin/Index.razor b/Oqtane.Client/Modules/Admin/RecycleBin/Index.razor index beaa74c1..2d81476a 100644 --- a/Oqtane.Client/Modules/Admin/RecycleBin/Index.razor +++ b/Oqtane.Client/Modules/Admin/RecycleBin/Index.razor @@ -19,13 +19,13 @@
   Name@Localizer["Name"] @Localizer["Deleted By"] @Localizer["Deleted On"] @context.Name @context.DeletedBy @context.DeletedOn @PageState.Pages.Find(item => item.PageId == context.PageId).Name @context.Title @context.DeletedBy @context.Name @context.Name
@Localizer["Access Framework API"]  - + @code { public override SecurityAccessLevel SecurityAccessLevel => SecurityAccessLevel.Host; diff --git a/Oqtane.Client/Modules/Admin/Tenants/Edit.razor b/Oqtane.Client/Modules/Admin/Tenants/Edit.razor index 34f58934..247b338a 100644 --- a/Oqtane.Client/Modules/Admin/Tenants/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Tenants/Edit.razor @@ -56,7 +56,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Loading Tenant {TenantId} {Error}", tenantid, ex.Message); - AddModuleMessage("Error Loading Tenant", MessageType.Error); + AddModuleMessage(Localizer["Error Loading Tenant"], MessageType.Error); } } @@ -80,7 +80,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Saving Tenant {TenantId} {Error}", tenantid, ex.Message); - AddModuleMessage("Error Saving Tenant", MessageType.Error); + AddModuleMessage(Localizer["Error Saving Tenant"], MessageType.Error); } } } diff --git a/Oqtane.Client/Modules/Admin/Tenants/Index.razor b/Oqtane.Client/Modules/Admin/Tenants/Index.razor index fda4c3a4..2aa70ecb 100644 --- a/Oqtane.Client/Modules/Admin/Tenants/Index.razor +++ b/Oqtane.Client/Modules/Admin/Tenants/Index.razor @@ -18,7 +18,7 @@ else - + @context.Name @@ -56,13 +56,13 @@ else } else { - AddModuleMessage("Tenant Cannot Be Deleted Until The Following Sites Are Deleted: " + message.Substring(2), MessageType.Warning); + AddModuleMessage(Localizer["Tenant Cannot Be Deleted Until The Following Sites Are Deleted: {0}", message.Substring(2)], MessageType.Warning); } } catch (Exception ex) { await logger.LogError(ex, "Error Deleting Tenant {Tenant} {Error}", Tenant, ex.Message); - AddModuleMessage("Error Deleting Tenant", MessageType.Error); + AddModuleMessage(Localizer["Error Deleting Tenant"], MessageType.Error); } } } \ No newline at end of file diff --git a/Oqtane.Client/Modules/Admin/Themes/Add.razor b/Oqtane.Client/Modules/Admin/Themes/Add.razor index fa896dd4..ab042ed5 100644 --- a/Oqtane.Client/Modules/Admin/Themes/Add.razor +++ b/Oqtane.Client/Modules/Admin/Themes/Add.razor @@ -70,7 +70,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Loading Packages {Error}", ex.Message); - AddModuleMessage("Error Loading Packages", MessageType.Error); + AddModuleMessage(Localizer["Error Loading Packages"], MessageType.Error); } } @@ -79,7 +79,7 @@ try { await ThemeService.InstallThemesAsync(); - AddModuleMessage("Theme Installed Successfully. You Must Restart Your Application To Apply These Changes.", MessageType.Success); + AddModuleMessage(Localizer["Theme Installed Successfully. You Must Restart Your Application To Apply These Changes.", NavigateUrl("admin/system")], MessageType.Success); } catch (Exception ex) { @@ -93,13 +93,13 @@ { await PackageService.DownloadPackageAsync(packageid, version, "Themes"); await logger.LogInformation("Theme {ThemeName} {Version} Downloaded Successfully", packageid, version); - AddModuleMessage("Themes Downloaded Successfully. Click Install To Complete Installation.", MessageType.Success); + AddModuleMessage(Localizer["Themes Downloaded Successfully. Click Install To Complete Installation."], MessageType.Success); StateHasChanged(); } catch (Exception ex) { await logger.LogError(ex, "Error Downloading Module {ThemeName} {Version}", packageid, version); - AddModuleMessage("Error Downloading Theme", MessageType.Error); + AddModuleMessage(Localizer["Error Downloading Theme"], MessageType.Error); } } } diff --git a/Oqtane.Client/Modules/Admin/Themes/Index.razor b/Oqtane.Client/Modules/Admin/Themes/Index.razor index 8b64bff8..816bd06f 100644 --- a/Oqtane.Client/Modules/Admin/Themes/Index.razor +++ b/Oqtane.Client/Modules/Admin/Themes/Index.razor @@ -26,17 +26,17 @@ else @if (context.AssemblyName != "Oqtane.Client") - { - - } + { + + } @context.Name @context.Version @if (UpgradeAvailable(context.ThemeName, context.Version)) - { - - } + { + + } @@ -61,7 +61,7 @@ else if (_themes == null) { await logger.LogError(ex, "Error Loading Themes {Error}", ex.Message); - AddModuleMessage("Error Loading Themes", MessageType.Error); + AddModuleMessage(Localizer["Error Loading Themes"], MessageType.Error); } } } @@ -87,12 +87,12 @@ else await PackageService.DownloadPackageAsync(themename, version, "Themes"); await logger.LogInformation("Theme Downloaded {ThemeName} {Version}", themename, version); await ThemeService.InstallThemesAsync(); - AddModuleMessage("Theme Installed Successfully. You Must Restart Your Application To Apply These Changes.", MessageType.Success); + AddModuleMessage(Localizer["Theme Installed Successfully. You Must Restart Your Application To Apply These Changes.", NavigateUrl("admin/system")], MessageType.Success); } catch (Exception ex) { await logger.LogError(ex, "Error Downloading Theme {ThemeName} {Version} {Error}", themename, version, ex.Message); - AddModuleMessage("Error Downloading Theme", MessageType.Error); + AddModuleMessage(Localizer["Error Downloading Theme"], MessageType.Error); } } @@ -101,12 +101,12 @@ else try { await ThemeService.DeleteThemeAsync(Theme.ThemeName); - AddModuleMessage("Theme Deleted Successfully. You Must Restart Your Application To Apply These Changes.", MessageType.Success); + AddModuleMessage(Localizer["Theme Deleted Successfully. You Must Restart Your Application To Apply These Changes.", NavigateUrl("admin/system")], MessageType.Success); } catch (Exception ex) { await logger.LogError(ex, "Error Deleting Theme {Theme} {Error}", Theme, ex.Message); - AddModuleMessage("Error Deleting Theme", MessageType.Error); + AddModuleMessage(Localizer["Error Deleting Theme"], MessageType.Error); } } } \ No newline at end of file diff --git a/Oqtane.Client/Modules/Admin/Themes/View.razor b/Oqtane.Client/Modules/Admin/Themes/View.razor index eb9871c9..2510759d 100644 --- a/Oqtane.Client/Modules/Admin/Themes/View.razor +++ b/Oqtane.Client/Modules/Admin/Themes/View.razor @@ -96,7 +96,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Loading Theme {ThemeName} {Error}", _themeName, ex.Message); - AddModuleMessage("Error Loading Theme", MessageType.Error); + AddModuleMessage(Localizer["Error Loading Theme"], MessageType.Error); } } } diff --git a/Oqtane.Client/Modules/Admin/Upgrade/Index.razor b/Oqtane.Client/Modules/Admin/Upgrade/Index.razor index 9642a090..c0475d59 100644 --- a/Oqtane.Client/Modules/Admin/Upgrade/Index.razor +++ b/Oqtane.Client/Modules/Admin/Upgrade/Index.razor @@ -78,7 +78,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Executing Upgrade {Error}", ex.Message); - AddModuleMessage("Error Executing Upgrade", MessageType.Error); + AddModuleMessage(Localizer["Error Executing Upgrade"], MessageType.Error); } } @@ -95,7 +95,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Downloading Framework {Error}", ex.Message); - AddModuleMessage("Error Downloading Framework", MessageType.Error); + AddModuleMessage(Localizer["Error Downloading Framework"], MessageType.Error); } } } diff --git a/Oqtane.Client/Modules/Admin/UserProfile/Add.razor b/Oqtane.Client/Modules/Admin/UserProfile/Add.razor index 7803a769..d3212726 100644 --- a/Oqtane.Client/Modules/Admin/UserProfile/Add.razor +++ b/Oqtane.Client/Modules/Admin/UserProfile/Add.razor @@ -74,13 +74,13 @@ } else { - AddModuleMessage("User Does Not Exist. Please Verify That The Username Provided Is Correct.", MessageType.Warning); + AddModuleMessage(Localizer["User Does Not Exist. Please Verify That The Username Provided Is Correct."], MessageType.Warning); } } catch (Exception ex) { await logger.LogError(ex, "Error Adding Notification {Notification} {Error}", notification, ex.Message); - AddModuleMessage("Error Adding Notification", MessageType.Error); + AddModuleMessage(Localizer["Error Adding Notification"], MessageType.Error); } } diff --git a/Oqtane.Client/Modules/Admin/UserProfile/Index.razor b/Oqtane.Client/Modules/Admin/UserProfile/Index.razor index 0435b2b1..4b2874b6 100644 --- a/Oqtane.Client/Modules/Admin/UserProfile/Index.razor +++ b/Oqtane.Client/Modules/Admin/UserProfile/Index.razor @@ -149,7 +149,7 @@ else - + @context.FromDisplayName @context.Subject @context.CreatedOn @@ -181,7 +181,7 @@ else - + @context.ToDisplayName @context.Subject @context.CreatedOn @@ -248,13 +248,13 @@ else } else { - AddModuleMessage("Current User Is Not Logged In", MessageType.Warning); + AddModuleMessage(Localizer["Current User Is Not Logged In"], MessageType.Warning); } } catch (Exception ex) { await logger.LogError(ex, "Error Loading User Profile {Error}", ex.Message); - AddModuleMessage("Error Loading User Profile", MessageType.Error); + AddModuleMessage(Localizer["Error Loading User Profile"], MessageType.Error); } } @@ -291,22 +291,22 @@ else await UserService.UpdateUserAsync(user); await SettingService.UpdateUserSettingsAsync(settings, PageState.User.UserId); await logger.LogInformation("User Profile Saved"); - AddModuleMessage("User Profile Updated Successfully", MessageType.Success); + AddModuleMessage(Localizer["User Profile Updated Successfully"], MessageType.Success); } else { - AddModuleMessage("Passwords Entered Do Not Match", MessageType.Warning); + AddModuleMessage(Localizer["Passwords Entered Do Not Match"], MessageType.Warning); } } else { - AddModuleMessage("You Must Provide A Username and Email Address As Well As All Required Profile Information", MessageType.Warning); + AddModuleMessage(Localizer["You Must Provide A Username and Email Address As Well As All Required Profile Information"], MessageType.Warning); } } catch (Exception ex) { await logger.LogError(ex, "Error Saving User Profile {Error}", ex.Message); - AddModuleMessage("Error Saving User Profile", MessageType.Error); + AddModuleMessage(Localizer["Error Saving User Profile"], MessageType.Error); } } diff --git a/Oqtane.Client/Modules/Admin/UserProfile/View.razor b/Oqtane.Client/Modules/Admin/UserProfile/View.razor index 316b17ea..fcd7340c 100644 --- a/Oqtane.Client/Modules/Admin/UserProfile/View.razor +++ b/Oqtane.Client/Modules/Admin/UserProfile/View.razor @@ -10,7 +10,7 @@ @if (title == "From") { @@ -158,7 +158,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Loading Users {Error}", ex.Message); - AddModuleMessage("Error Loading Users", MessageType.Error); + AddModuleMessage(Localizer["Error Loading Users"], MessageType.Error); } } @@ -202,13 +202,13 @@ } else { - AddModuleMessage("User Does Not Exist. Please Verify That The Username Provided Is Correct.", MessageType.Warning); + AddModuleMessage(Localizer["User Does Not Exist. Please Verify That The Username Provided Is Correct."], MessageType.Warning); } } catch (Exception ex) { await logger.LogError(ex, "Error Adding Notification {Notification} {Error}", notification, ex.Message); - AddModuleMessage("Error Adding Notification", MessageType.Error); + AddModuleMessage(Localizer["Error Adding Notification"], MessageType.Error); } } } diff --git a/Oqtane.Client/Modules/Admin/Users/Add.razor b/Oqtane.Client/Modules/Admin/Users/Add.razor index d669f678..89b1e775 100644 --- a/Oqtane.Client/Modules/Admin/Users/Add.razor +++ b/Oqtane.Client/Modules/Admin/Users/Add.razor @@ -14,7 +14,7 @@ + @@ -116,7 +116,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Loading User Profile {Error}", ex.Message); - AddModuleMessage("Error Loading User Profile", MessageType.Error); + AddModuleMessage(Localizer["Error Loading User Profile"], MessageType.Error); } } @@ -150,23 +150,23 @@ else { await logger.LogError("Error Adding User {Username} {Email}", username, email); - AddModuleMessage("Error Adding User. Please Ensure Password Meets Complexity Requirements And Username Is Not Already In Use.", MessageType.Error); + AddModuleMessage(Localizer["Error Adding User. Please Ensure Password Meets Complexity Requirements And Username Is Not Already In Use."], MessageType.Error); } } else { - AddModuleMessage("Passwords Entered Do Not Match", MessageType.Warning); + AddModuleMessage(Localizer["Passwords Entered Do Not Match"], MessageType.Warning); } } else { - AddModuleMessage("You Must Provide A Username, Password, Email Address And All Required Profile Information", MessageType.Warning); + AddModuleMessage(Localizer["You Must Provide A Username, Password, Email Address And All Required Profile Information"], MessageType.Warning); } } catch (Exception ex) { await logger.LogError(ex, "Error Adding User {Username} {Email} {Error}", username, email, ex.Message); - AddModuleMessage("Error Adding User", MessageType.Error); + AddModuleMessage(Localizer["Error Adding User"], MessageType.Error); } } diff --git a/Oqtane.Client/Modules/Admin/Users/Edit.razor b/Oqtane.Client/Modules/Admin/Users/Edit.razor index edabc73d..be68ff7d 100644 --- a/Oqtane.Client/Modules/Admin/Users/Edit.razor +++ b/Oqtane.Client/Modules/Admin/Users/Edit.razor @@ -178,7 +178,7 @@ else catch (Exception ex) { await logger.LogError(ex, "Error Loading User {UserId} {Error}", userid, ex.Message); - AddModuleMessage("Error Loading User", MessageType.Error); + AddModuleMessage(Localizer["Error Loading User"], MessageType.Error); } } @@ -217,18 +217,18 @@ else } else { - AddModuleMessage("Passwords Entered Do Not Match", MessageType.Warning); + AddModuleMessage(Localizer["Passwords Entered Do Not Match"], MessageType.Warning); } } else { - AddModuleMessage("You Must Provide A Username, Password, Email Address, And All Required Profile Information", MessageType.Warning); + AddModuleMessage(Localizer["You Must Provide A Username, Password, Email Address, And All Required Profile Information"], MessageType.Warning); } } catch (Exception ex) { await logger.LogError(ex, "Error Saving User {Username} {Email} {Error}", username, email, ex.Message); - AddModuleMessage("Error Saving User", MessageType.Error); + AddModuleMessage(Localizer["Error Saving User"], MessageType.Error); } } diff --git a/Oqtane.Client/Modules/Admin/Users/Index.razor b/Oqtane.Client/Modules/Admin/Users/Index.razor index 8087f2bf..8ac788ee 100644 --- a/Oqtane.Client/Modules/Admin/Users/Index.razor +++ b/Oqtane.Client/Modules/Admin/Users/Index.razor @@ -31,7 +31,7 @@ else
- +
- - + diff --git a/Oqtane.Client/Modules/Admin/Users/Roles.razor b/Oqtane.Client/Modules/Admin/Users/Roles.razor index 92229829..037daabb 100644 --- a/Oqtane.Client/Modules/Admin/Users/Roles.razor +++ b/Oqtane.Client/Modules/Admin/Users/Roles.razor @@ -14,7 +14,7 @@ else @foreach (PermissionString permission in _permissions) { - + } @foreach (Role role in _roles) @@ -39,7 +39,7 @@ @foreach (PermissionString permission in _permissions) { - + } @@ -65,7 +65,7 @@ @@ -180,7 +180,7 @@ } catch { - _message = "Username Does Not Exist"; + _message = Localizer["Username Does Not Exist"]; } } diff --git a/Oqtane.Client/Modules/Controls/RichTextEditor.razor b/Oqtane.Client/Modules/Controls/RichTextEditor.razor index 40af9497..3a33cc33 100644 --- a/Oqtane.Client/Modules/Controls/RichTextEditor.razor +++ b/Oqtane.Client/Modules/Controls/RichTextEditor.razor @@ -194,7 +194,7 @@ } else { - _message = "You Must Select An Image To Insert"; + _message = Localizer["You Must Select An Image To Insert"]; } } else diff --git a/Oqtane.Client/Modules/Controls/Section.razor b/Oqtane.Client/Modules/Controls/Section.razor index fd8b9a52..027b0e85 100644 --- a/Oqtane.Client/Modules/Controls/Section.razor +++ b/Oqtane.Client/Modules/Controls/Section.razor @@ -46,11 +46,8 @@ { base.OnParametersSet(); - if (IsLocalizable) - { - _heading = !string.IsNullOrEmpty(Heading) - ? Localize(nameof(Heading), Heading) - : Localize(nameof(Name), Name); - } + _heading = !string.IsNullOrEmpty(Heading) + ? Localize(nameof(Heading), Heading) + : Localize(nameof(Name), Name); } } diff --git a/Oqtane.Client/Modules/Controls/TabPanel.razor b/Oqtane.Client/Modules/Controls/TabPanel.razor index 7c2eaa24..e618c896 100644 --- a/Oqtane.Client/Modules/Controls/TabPanel.razor +++ b/Oqtane.Client/Modules/Controls/TabPanel.razor @@ -40,16 +40,13 @@ else { base.OnParametersSet(); - if (IsLocalizable) + if (string.IsNullOrEmpty(Heading)) { - if (string.IsNullOrEmpty(Heading)) - { - Name = Localize(nameof(Name), Name); - } - else - { - Heading = Localize(nameof(Heading), Heading); - } + Name = Localize(nameof(Name), Name); + } + else + { + Heading = Localize(nameof(Heading), Heading); } } diff --git a/Oqtane.Client/Modules/Controls/TriStateCheckBox.razor b/Oqtane.Client/Modules/Controls/TriStateCheckBox.razor index 845db70b..26991f37 100644 --- a/Oqtane.Client/Modules/Controls/TriStateCheckBox.razor +++ b/Oqtane.Client/Modules/Controls/TriStateCheckBox.razor @@ -1,5 +1,6 @@ -@namespace Oqtane.Modules.Controls +@namespace Oqtane.Modules.Controls @inherits ModuleControlBase +@inject IStringLocalizer Localizer @@ -51,11 +52,11 @@ { case true: _src = "images/checked.png"; - _title = "Permission Granted"; + _title = Localizer["Permission Granted"]; break; case false: _src = "images/unchecked.png"; - _title = "Permission Denied"; + _title = Localizer["Permission Denied"]; break; case null: _src = "images/null.png"; diff --git a/Oqtane.Client/Modules/HtmlText/Edit.razor b/Oqtane.Client/Modules/HtmlText/Edit.razor index 25ef9b63..311c4cd7 100644 --- a/Oqtane.Client/Modules/HtmlText/Edit.razor +++ b/Oqtane.Client/Modules/HtmlText/Edit.razor @@ -92,7 +92,7 @@ catch (Exception ex) { await logger.LogError(ex, "Error Saving Content {Error}", ex.Message); - AddModuleMessage("Error Saving Content", MessageType.Error); + AddModuleMessage(Localizer["Error Saving Content"], MessageType.Error); } } } diff --git a/Oqtane.Client/Oqtane.Client.csproj b/Oqtane.Client/Oqtane.Client.csproj index 3ce83439..72024f75 100644 --- a/Oqtane.Client/Oqtane.Client.csproj +++ b/Oqtane.Client/Oqtane.Client.csproj @@ -17,6 +17,7 @@ https://github.com/oqtane/oqtane.framework/releases/tag/v2.0.0 Oqtane true + true @@ -30,6 +31,7 @@ + diff --git a/Oqtane.Client/Program.cs b/Oqtane.Client/Program.cs index af283cec..4c2d1201 100644 --- a/Oqtane.Client/Program.cs +++ b/Oqtane.Client/Program.cs @@ -1,19 +1,23 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.IO; using System.IO.Compression; using System.Linq; using System.Net.Http; using System.Reflection; -using System.Threading.Tasks; using System.Runtime.Loader; +using System.Threading.Tasks; using Microsoft.AspNetCore.Components.Authorization; using Microsoft.AspNetCore.Components.WebAssembly.Hosting; +using Microsoft.AspNetCore.Localization; using Microsoft.Extensions.DependencyInjection; +using Microsoft.JSInterop; using Oqtane.Modules; using Oqtane.Providers; -using Oqtane.Shared; using Oqtane.Services; +using Oqtane.Shared; +using Oqtane.UI; namespace Oqtane.Client { @@ -62,6 +66,7 @@ namespace Oqtane.Client builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); + builder.Services.AddScoped(); await LoadClientAssemblies(httpClient); @@ -88,6 +93,19 @@ namespace Oqtane.Client } var host = builder.Build(); + var jsRuntime = host.Services.GetRequiredService(); + var interop = new Interop(jsRuntime); + var localizationCookie = await interop.GetCookie(CookieRequestCultureProvider.DefaultCookieName); + var culture = CookieRequestCultureProvider.ParseCookieValue(localizationCookie).UICultures[0].Value; + var localizationService = host.Services.GetRequiredService(); + var cultures = await localizationService.GetCulturesAsync(); + + if (culture == null || !cultures.Any(c => c.Name.Equals(culture, StringComparison.OrdinalIgnoreCase))) + { + culture = cultures.Single(c => c.IsDefault).Name; + } + + SetCulture(culture); ServiceActivator.Configure(host.Services); @@ -142,5 +160,12 @@ namespace Oqtane.Client } } } + + private static void SetCulture(string culture) + { + var cultureInfo = CultureInfo.GetCultureInfo(culture); + CultureInfo.DefaultThreadCurrentCulture = cultureInfo; + CultureInfo.DefaultThreadCurrentUICulture = cultureInfo; + } } } diff --git a/Oqtane.Client/Services/Interfaces/ILocalizationService.cs b/Oqtane.Client/Services/Interfaces/ILocalizationService.cs new file mode 100644 index 00000000..b6cd7da0 --- /dev/null +++ b/Oqtane.Client/Services/Interfaces/ILocalizationService.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using Oqtane.Models; + +namespace Oqtane.Services +{ + public interface ILocalizationService + { + Task> GetCulturesAsync(); + } +} diff --git a/Oqtane.Client/Services/LocalizationService.cs b/Oqtane.Client/Services/LocalizationService.cs new file mode 100644 index 00000000..b6c56bca --- /dev/null +++ b/Oqtane.Client/Services/LocalizationService.cs @@ -0,0 +1,22 @@ +using System.Collections.Generic; +using System.Net.Http; +using System.Threading.Tasks; +using Oqtane.Models; +using Oqtane.Shared; + +namespace Oqtane.Services +{ + public class LocalizationService : ServiceBase, ILocalizationService + { + private readonly SiteState _siteState; + + public LocalizationService(HttpClient http, SiteState siteState) : base(http) + { + _siteState = siteState; + } + + private string Apiurl => CreateApiUrl(_siteState.Alias, "Localization"); + + public async Task> GetCulturesAsync() => await GetJsonAsync>(Apiurl); + } +} diff --git a/Oqtane.Client/Themes/Controls/ControlPanel.razor b/Oqtane.Client/Themes/Controls/ControlPanel.razor index 02ae862c..931f3ff3 100644 --- a/Oqtane.Client/Themes/Controls/ControlPanel.razor +++ b/Oqtane.Client/Themes/Controls/ControlPanel.razor @@ -9,7 +9,7 @@ @inject IPageModuleService PageModuleService @inject ILogService logger @inject ISettingService SettingService -@inject IStringLocalizer Localizer +@inject IStringLocalizer Localizer @if (_moduleDefinitions != null && UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, PageState.Page.Permissions)) { @@ -198,6 +198,11 @@ } +@if (ShowLanguageSwitcher) +{ + +} + @if (UserSecurity.IsAuthorized(PageState.User, PermissionNames.Edit, PageState.Page.Permissions) || (PageState.Page.IsPersonalizable && PageState.User != null)) { if (PageState.EditMode) @@ -287,6 +292,9 @@ [Parameter] public string BodyClass { get; set; } = "card-body"; + [Parameter] + public bool ShowLanguageSwitcher { get; set; } = true; + protected override async Task OnInitializedAsync() { @@ -314,12 +322,12 @@ private void CategoryChanged(ChangeEventArgs e) { - Category = (string) e.Value; + Category = (string)e.Value; } private void ModuleChanged(ChangeEventArgs e) { - ModuleDefinitionName = (string) e.Value; + ModuleDefinitionName = (string)e.Value; if (ModuleDefinitionName != "-") { var moduleDefinition = _moduleDefinitions.FirstOrDefault(item => item.ModuleDefinitionName == ModuleDefinitionName); @@ -335,7 +343,7 @@ private void PageChanged(ChangeEventArgs e) { - PageId = (string) e.Value; + PageId = (string)e.Value; if (PageId != "-") { _modules = PageState.Modules @@ -396,17 +404,17 @@ await PageModuleService.AddPageModuleAsync(pageModule); await PageModuleService.UpdatePageModuleOrderAsync(pageModule.PageId, pageModule.Pane); - Message = "
Module Added To Page
"; + Message = $"
{Localizer["Module Added To Page"]}
"; NavigationManager.NavigateTo(NavigateUrl()); } else { - Message = "
You Must Select A Module
"; + Message = $"
{Localizer["You Must Select A Module"]}
"; } } else { - Message = "
Not Authorized
"; + Message = $"
{Localizer["Not Authorized"]}
"; } } diff --git a/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor b/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor new file mode 100644 index 00000000..4dca37bc --- /dev/null +++ b/Oqtane.Client/Themes/Controls/LanguageSwitcher.razor @@ -0,0 +1,43 @@ +@namespace Oqtane.Themes.Controls +@inherits ThemeControlBase +@using System.Globalization +@using Microsoft.AspNetCore.Localization; +@using Oqtane.Models +@inject ILocalizationService LocalizationService +@inject NavigationManager NavigationManager + +@if (_supportedCultures != null) +{ +
+ + +
+} + +@code{ + private IEnumerable _supportedCultures; + + protected override async Task OnParametersSetAsync() + { + _supportedCultures = await LocalizationService.GetCulturesAsync(); + } + + private async Task SetCultureAsync(string culture) + { + if (culture != CultureInfo.CurrentUICulture.Name) + { + var interop = new Interop(JSRuntime); + var localizationCookieValue = CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(culture)); + await interop.SetCookie(CookieRequestCultureProvider.DefaultCookieName, localizationCookieValue, 360); + + NavigationManager.NavigateTo(NavigationManager.Uri, forceLoad: true); + } + } +} diff --git a/Oqtane.Client/Themes/Controls/LoginBase.cs b/Oqtane.Client/Themes/Controls/LoginBase.cs index ed9eb289..27f43497 100644 --- a/Oqtane.Client/Themes/Controls/LoginBase.cs +++ b/Oqtane.Client/Themes/Controls/LoginBase.cs @@ -22,7 +22,7 @@ namespace Oqtane.Themes.Controls { returnurl += "/" + PageState.Page.Path; } - NavigationManager.NavigateTo(NavigateUrl("login", "returnurl=" + returnurl)); + NavigationManager.NavigateTo(NavigateUrl("login", "?returnurl=" + returnurl)); } protected async Task LogoutUser() diff --git a/Oqtane.Client/UI/Installer.razor b/Oqtane.Client/UI/Installer.razor index 8c1fc95a..9231e092 100644 --- a/Oqtane.Client/UI/Installer.razor +++ b/Oqtane.Client/UI/Installer.razor @@ -208,7 +208,7 @@ } else { - _message = "Please Enter All Fields And Ensure Passwords Match And Are Greater Than 5 Characters In Length"; + _message = Localizer["Please Enter All Fields And Ensure Passwords Match And Are Greater Than 5 Characters In Length"]; } } diff --git a/Oqtane.Client/UI/Interop.cs b/Oqtane.Client/UI/Interop.cs index 53b8df4f..3964b070 100644 --- a/Oqtane.Client/UI/Interop.cs +++ b/Oqtane.Client/UI/Interop.cs @@ -1,5 +1,4 @@ -using Microsoft.JSInterop; -using Oqtane.Models; +using Microsoft.JSInterop; using System.Threading.Tasks; namespace Oqtane.UI @@ -233,6 +232,5 @@ namespace Oqtane.UI return Task.CompletedTask; } } - } } diff --git a/Oqtane.Client/UI/ModuleInstance.razor b/Oqtane.Client/UI/ModuleInstance.razor index c619f268..273404e9 100644 --- a/Oqtane.Client/UI/ModuleInstance.razor +++ b/Oqtane.Client/UI/ModuleInstance.razor @@ -1,4 +1,5 @@ @namespace Oqtane.UI +@inject IStringLocalizer Localizer @@ -41,13 +42,13 @@ else { // module does not exist with typename specified - _message = "Module Does Not Have A Component Named " + Utilities.GetTypeNameLastSegment(ModuleState.ModuleType, 0) + ".razor"; + _message = Localizer["Module Does Not Have A Component Named {0}.razor", Utilities.GetTypeNameLastSegment(ModuleState.ModuleType, 0)]; _messagetype = MessageType.Error; } } else { - _message = "Module Type Is Invalid For " + ModuleState.ModuleDefinitionName; + _message = Localizer["Module Type Is Invalid For {0}", ModuleState.ModuleDefinitionName]; _messagetype = MessageType.Error; } diff --git a/Oqtane.Client/UI/SiteRouter.razor b/Oqtane.Client/UI/SiteRouter.razor index 667816ab..469a0a7b 100644 --- a/Oqtane.Client/UI/SiteRouter.razor +++ b/Oqtane.Client/UI/SiteRouter.razor @@ -300,7 +300,7 @@ if (user == null) { // redirect to login page - NavigationManager.NavigateTo(Utilities.NavigateUrl(alias.Path, "login", "returnurl=" + path)); + NavigationManager.NavigateTo(Utilities.NavigateUrl(alias.Path, "login", "?returnurl=" + path)); } else { @@ -565,4 +565,4 @@ => RuntimeInformation.IsOSPlatform(OSPlatform.Create("BROWSER")) ? Oqtane.Shared.Runtime.WebAssembly : Oqtane.Shared.Runtime.Server; -} \ No newline at end of file +} diff --git a/Oqtane.Server/Controllers/FileController.cs b/Oqtane.Server/Controllers/FileController.cs index fb43a7cb..5389b423 100644 --- a/Oqtane.Server/Controllers/FileController.cs +++ b/Oqtane.Server/Controllers/FileController.cs @@ -17,6 +17,7 @@ using Oqtane.Enums; using Oqtane.Infrastructure; using Oqtane.Repository; using Microsoft.AspNetCore.Routing.Constraints; +using Oqtane.Extensions; // ReSharper disable StringIndexOfIsCultureSpecific.1 @@ -314,9 +315,9 @@ namespace Oqtane.Controllers { string merged = ""; - // parse the filename which is in the format of filename.ext.part_x_y + // parse the filename which is in the format of filename.ext.part_x_y string token = ".part_"; - string parts = Path.GetExtension(filename)?.Replace(token, ""); // returns "x_y" + string parts = Path.GetExtension(filename)?.Replace(token, ""); // returns "x_y" int totalparts = int.Parse(parts?.Substring(parts.IndexOf("_") + 1)); filename = Path.GetFileNameWithoutExtension(filename); // base filename @@ -435,45 +436,33 @@ namespace Oqtane.Controllers [HttpGet("download/{id}")] public IActionResult Download(int id) { - string errorpath = Path.Combine(GetFolderPath("images"), "error.png"); - Models.File file = _files.GetFile(id); + var file = _files.GetFile(id); if (file != null) { if (_userPermissions.IsAuthorized(User, PermissionNames.View, file.Folder.Permissions)) { - string filepath = Path.Combine(GetFolderPath(file.Folder), file.Name); + var filepath = Path.Combine(GetFolderPath(file.Folder), file.Name); if (System.IO.File.Exists(filepath)) { - var stream = new FileStream(filepath, FileMode.Open); - return File(stream, "application/octet-stream", file.Name); - } - else - { - _logger.Log(LogLevel.Error, this, LogFunction.Read, "File Does Not Exist {FileId} {FilePath}", id, filepath); - HttpContext.Response.StatusCode = 404; - if (System.IO.File.Exists(errorpath)) - { - var stream = new FileStream(errorpath, FileMode.Open); - return File(stream, "application/octet-stream", file.Name); - } + return PhysicalFile(filepath, file.Name.GetMimeType(), file.Name); } + + _logger.Log(LogLevel.Error, this, LogFunction.Read, "File Does Not Exist {FileId} {FilePath}", id, filepath); + HttpContext.Response.StatusCode = 404; } else { _logger.Log(LogLevel.Error, this, LogFunction.Read, "User Not Authorized To Access File {FileId}", id); HttpContext.Response.StatusCode = 401; - var stream = new FileStream(errorpath, FileMode.Open); - return File(stream, "application/octet-stream", file.Name); } } else { _logger.Log(LogLevel.Error, this, LogFunction.Read, "File Not Found {FileId}", id); HttpContext.Response.StatusCode = 404; - var stream = new FileStream(errorpath, FileMode.Open); - return File(stream, "application/octet-stream", file.Name); } - return null; + string errorPath = Path.Combine(GetFolderPath("images"), "error.png"); + return System.IO.File.Exists(errorPath) ? PhysicalFile(errorPath, errorPath.GetMimeType()) : null; } private string GetFolderPath(Folder folder) diff --git a/Oqtane.Server/Controllers/LocalizationController.cs b/Oqtane.Server/Controllers/LocalizationController.cs new file mode 100644 index 00000000..84b54862 --- /dev/null +++ b/Oqtane.Server/Controllers/LocalizationController.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using Microsoft.AspNetCore.Mvc; +using Oqtane.Infrastructure; +using Oqtane.Models; +using Oqtane.Shared; + +namespace Oqtane.Controllers +{ + [Route(ControllerRoutes.Default)] + public class LocalizationController : Controller + { + private readonly ILocalizationManager _localizationManager; + + public LocalizationController(ILocalizationManager localizationManager) + { + _localizationManager = localizationManager; + } + + // GET: api/localization + [HttpGet()] + public IEnumerable Get() + => _localizationManager.GetSupportedCultures().Select(c => new Culture { + Name = CultureInfo.GetCultureInfo(c).Name, + DisplayName = CultureInfo.GetCultureInfo(c).DisplayName, + IsDefault = _localizationManager.GetDefaultCulture() + .Equals(CultureInfo.GetCultureInfo(c).Name, StringComparison.OrdinalIgnoreCase) + }); + } +} diff --git a/Oqtane.Server/Extensions/ApplicationBuilderExtensions.cs b/Oqtane.Server/Extensions/ApplicationBuilderExtensions.cs index 67676d16..4f43068e 100644 --- a/Oqtane.Server/Extensions/ApplicationBuilderExtensions.cs +++ b/Oqtane.Server/Extensions/ApplicationBuilderExtensions.cs @@ -1,5 +1,4 @@ -using System; -using System.Globalization; +using System; using System.Linq; using System.Reflection; using Microsoft.AspNetCore.Builder; @@ -31,11 +30,9 @@ namespace Oqtane.Extensions var defaultCulture = localizationManager.GetDefaultCulture(); var supportedCultures = localizationManager.GetSupportedCultures(); - CultureInfo.CurrentUICulture = new CultureInfo(defaultCulture); - app.UseRequestLocalization(options => { options.SetDefaultCulture(defaultCulture) - .AddSupportedUICultures(supportedCultures) + .AddSupportedCultures(supportedCultures) .AddSupportedUICultures(supportedCultures); }); diff --git a/Oqtane.Server/Extensions/StringExtensions.cs b/Oqtane.Server/Extensions/StringExtensions.cs index 49b3b2cd..a2c7c88b 100644 --- a/Oqtane.Server/Extensions/StringExtensions.cs +++ b/Oqtane.Server/Extensions/StringExtensions.cs @@ -1,5 +1,6 @@ using System.Collections.Generic; using System.Linq; +using Microsoft.AspNetCore.StaticFiles; namespace Oqtane.Extensions { @@ -11,7 +12,20 @@ namespace Oqtane.Extensions { return false; } + return list.Any(f => s.StartsWith(f)); } + + public static string GetMimeType(this string fileName) + { + var provider = new FileExtensionContentTypeProvider(); + + if (!provider.TryGetContentType(fileName, out var contentType)) + { + contentType = "application/octet-stream"; + } + + return contentType; + } } } diff --git a/Oqtane.Server/Pages/_Host.cshtml b/Oqtane.Server/Pages/_Host.cshtml index 2aa0dd9d..cf2d69f0 100644 --- a/Oqtane.Server/Pages/_Host.cshtml +++ b/Oqtane.Server/Pages/_Host.cshtml @@ -1,17 +1,9 @@ -@page "/" +@page "/" @namespace Oqtane.Pages @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers -@using System.Globalization -@using Microsoft.AspNetCore.Localization @using Microsoft.Extensions.Configuration @inject IConfiguration Configuration @model Oqtane.Pages.HostModel - -@{ - // Set localization cookie - var localizationCookieValue = CookieRequestCultureProvider.MakeCookieValue(new RequestCulture(CultureInfo.CurrentCulture, CultureInfo.CurrentUICulture)); - HttpContext.Response.Cookies.Append(CookieRequestCultureProvider.DefaultCookieName, localizationCookieValue); -} diff --git a/Oqtane.Server/Startup.cs b/Oqtane.Server/Startup.cs index b008ee30..b134a19e 100644 --- a/Oqtane.Server/Startup.cs +++ b/Oqtane.Server/Startup.cs @@ -127,6 +127,7 @@ namespace Oqtane services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); services.AddSingleton(); diff --git a/Oqtane.Shared/Models/Culture.cs b/Oqtane.Shared/Models/Culture.cs new file mode 100644 index 00000000..d426410d --- /dev/null +++ b/Oqtane.Shared/Models/Culture.cs @@ -0,0 +1,11 @@ +namespace Oqtane.Models +{ + public class Culture + { + public string Name { get; set; } + + public string DisplayName { get; set; } + + public bool IsDefault { get; set; } + } +} diff --git a/azuredeploy.json b/azuredeploy.json index 4dd651bc..180ad5fb 100644 --- a/azuredeploy.json +++ b/azuredeploy.json @@ -158,7 +158,8 @@ "name": "[parameters('BlazorWebsiteName')]", "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', variables('hostingPlanName'))]", "siteConfig": { - "webSocketsEnabled": true + "webSocketsEnabled": true, + "netFrameworkVersion": "v5.0" } }, "resources": [
- + @@ -26,7 +26,7 @@ else
- + @@ -98,7 +98,7 @@ else catch (Exception ex) { await logger.LogError(ex, "Error Loading Roles {Error}", ex.Message); - AddModuleMessage("Error Loading Roles", MessageType.Error); + AddModuleMessage(Localizer["Error Loading Roles"], MessageType.Error); } } @@ -112,7 +112,7 @@ else catch (Exception ex) { await logger.LogError(ex, "Error Loading User Roles {UserId} {Error}", userid, ex.Message); - AddModuleMessage("Error Loading User Roles", MessageType.Error); + AddModuleMessage(Localizer["Error Loading User Roles"], MessageType.Error); } } @@ -173,17 +173,17 @@ else await GetUserRoles(); await logger.LogInformation("User Assigned To Role {UserRole}", userrole); - AddModuleMessage("User Assigned To Role", MessageType.Success); + AddModuleMessage(Localizer["User Assigned To Role"], MessageType.Success); } else { - AddModuleMessage("You Must Select A Role", MessageType.Warning); + AddModuleMessage(Localizer["You Must Select A Role"], MessageType.Warning); } } catch (Exception ex) { await logger.LogError(ex, "Error Saving User Roles {UserId} {Error}", userid, ex.Message); - AddModuleMessage("Error Saving User Roles", MessageType.Error); + AddModuleMessage(Localizer["Error Saving User Roles"], MessageType.Error); } } @@ -194,12 +194,12 @@ else await UserRoleService.DeleteUserRoleAsync(UserRoleId); await GetUserRoles(); await logger.LogInformation("User Removed From Role {UserRoleId}", UserRoleId); - AddModuleMessage("User Removed From Role", MessageType.Success); + AddModuleMessage(Localizer["User Removed From Role"], MessageType.Success); } catch (Exception ex) { await logger.LogError(ex, "Error Removing User From Role {UserRoleId} {Error}", UserRoleId, ex.Message); - AddModuleMessage("Error Removing User From Role", MessageType.Error); + AddModuleMessage(Localizer["Error Removing User From Role"], MessageType.Error); } } } diff --git a/Oqtane.Client/Modules/Controls/ActionDialog.razor b/Oqtane.Client/Modules/Controls/ActionDialog.razor index ac7e4690..73723fa5 100644 --- a/Oqtane.Client/Modules/Controls/ActionDialog.razor +++ b/Oqtane.Client/Modules/Controls/ActionDialog.razor @@ -97,11 +97,9 @@ _iconSpan = $" "; } - if (IsLocalizable) - { - Header = Localize(nameof(Header), Header); - Message = Localize(nameof(Message), Message); - } + Text = Localize(nameof(Text), Text); + Header = Localize(nameof(Header), Header); + Message = Localize(nameof(Message), Message); _authorized = IsAuthorized(); } diff --git a/Oqtane.Client/Modules/Controls/ActionLink.razor b/Oqtane.Client/Modules/Controls/ActionLink.razor index eacc9813..1ba9ef12 100644 --- a/Oqtane.Client/Modules/Controls/ActionLink.razor +++ b/Oqtane.Client/Modules/Controls/ActionLink.razor @@ -95,11 +95,7 @@ } - if (IsLocalizable) - { - _text = Localize(nameof(Text), _text); - } - + _text = Localize(nameof(Text), _text); _url = EditUrl(Action, _parameters); _authorized = IsAuthorized(); } diff --git a/Oqtane.Client/Modules/Controls/AuditInfo.razor b/Oqtane.Client/Modules/Controls/AuditInfo.razor index 026a2986..aa2cf790 100644 --- a/Oqtane.Client/Modules/Controls/AuditInfo.razor +++ b/Oqtane.Client/Modules/Controls/AuditInfo.razor @@ -1,5 +1,6 @@ @namespace Oqtane.Modules.Controls @inherits ModuleControlBase +@inject IStringLocalizer Localizer @if (_text != string.Empty) { @@ -39,16 +40,16 @@ _text = string.Empty; if (!String.IsNullOrEmpty(CreatedBy) || CreatedOn.HasValue) { - _text += "

Created "; + _text += $"

{Localizer["Created"]} "; if (!String.IsNullOrEmpty(CreatedBy)) { - _text += " by " + CreatedBy + ""; + _text += $" {Localizer["by"]} {CreatedBy}"; } if (CreatedOn != null) { - _text += " on " + CreatedOn.Value.ToString("MMM dd yyyy HH:mm:ss") + ""; + _text += $" {Localizer["on"]} {CreatedOn.Value.ToString("MMM dd yyyy HH:mm:ss")}"; } _text += "

"; @@ -56,16 +57,16 @@ if (!String.IsNullOrEmpty(ModifiedBy) || ModifiedOn.HasValue) { - _text += "

Last modified "; + _text += $"

{Localizer["Last modified"]} "; if (!String.IsNullOrEmpty(ModifiedBy)) { - _text += " by " + ModifiedBy + ""; + _text += $" {Localizer["by"]} {ModifiedBy}"; } if (ModifiedOn != null) { - _text += " on " + ModifiedOn.Value.ToString("MMM dd yyyy HH:mm:ss") + ""; + _text += $" {Localizer["on"]} {ModifiedOn.Value.ToString("MMM dd yyyy HH:mm:ss")}"; } _text += "

"; @@ -73,16 +74,16 @@ if (!String.IsNullOrEmpty(DeletedBy) || DeletedOn.HasValue) { - _text += "

Deleted "; + _text += $"

{Localizer["Deleted"]} "; if (!String.IsNullOrEmpty(DeletedBy)) { - _text += " by " + DeletedBy + ""; + _text += $" {Localizer["by"]} {DeletedBy}"; } if (DeletedOn != null) { - _text += " on " + DeletedOn.Value.ToString("MMM dd yyyy HH:mm:ss") + ""; + _text += $" {Localizer["on"]} {DeletedOn.Value.ToString("MMM dd yyyy HH:mm:ss")}"; } _text += "

"; diff --git a/Oqtane.Client/Modules/Controls/FileManager.razor b/Oqtane.Client/Modules/Controls/FileManager.razor index 291b2acb..f4650202 100644 --- a/Oqtane.Client/Modules/Controls/FileManager.razor +++ b/Oqtane.Client/Modules/Controls/FileManager.razor @@ -1,7 +1,8 @@ -@namespace Oqtane.Modules.Controls +@namespace Oqtane.Modules.Controls @inherits ModuleControlBase @inject IFolderService FolderService @inject IFileService FileService +@inject IStringLocalizer Localizer @if (_folders != null) { @@ -14,7 +15,7 @@ - + @foreach (File file in _files) { if (file.FileId == FileId) @@ -62,10 +63,10 @@ } - + @if (ShowFiles && GetFileId() != -1) { - + } @@ -219,7 +220,7 @@ { await logger.LogError(ex, "Error Loading Files {Error}", ex.Message); - _message = "Error Loading Files"; + _message = Localizer["Error Loading Files"]; _messagetype = MessageType.Error; } } @@ -278,7 +279,7 @@ { await logger.LogInformation("File Upload Succeeded {Files}", upload); - _message = "File Upload Succeeded"; + _message = Localizer["File Upload Succeeded"]; _messagetype = MessageType.Success; await GetFiles(); @@ -298,7 +299,7 @@ { await logger.LogError("File Upload Failed For {Files}", result.Replace(",", ", ")); - _message = "File Upload Failed"; + _message = Localizer["File Upload Failed"]; _messagetype = MessageType.Error; } } @@ -306,13 +307,13 @@ { await logger.LogError(ex, "File Upload Failed {Error}", ex.Message); - _message = "File Upload Failed"; + _message = Localizer["File Upload Failed"]; _messagetype = MessageType.Error; } } else { - _message = "You Have Not Selected A File To Upload"; + _message = Localizer["You Have Not Selected A File To Upload"]; _messagetype = MessageType.Warning; } } @@ -325,7 +326,7 @@ await FileService.DeleteFileAsync(FileId); await logger.LogInformation("File Deleted {File}", FileId); - _message = "File Deleted"; + _message = Localizer["File Deleted"]; _messagetype = MessageType.Success; await GetFiles(); @@ -337,7 +338,7 @@ { await logger.LogError(ex, "Error Deleting File {File} {Error}", FileId, ex.Message); - _message = "Error Deleting File"; + _message = Localizer["Error Deleting File"]; _messagetype = MessageType.Error; } } diff --git a/Oqtane.Client/Modules/Controls/Label.razor b/Oqtane.Client/Modules/Controls/Label.razor index 85e65d14..b67143cb 100644 --- a/Oqtane.Client/Modules/Controls/Label.razor +++ b/Oqtane.Client/Modules/Controls/Label.razor @@ -43,16 +43,12 @@ else _openLabel += ">"; - if (IsLocalizable) + var text = Localize("Text", String.Empty); + if (text != String.Empty) { - var value = Localize("Text"); - var key = $"{ResourceKey}.Text"; - if (!value.Equals(key)) - { - ChildContent =@@Localize("Text"); - } - - HelpText = Localize(nameof(HelpText), HelpText); + ChildContent =@@text; } + + HelpText = Localize(nameof(HelpText), HelpText); } } diff --git a/Oqtane.Client/Modules/Controls/LocalizableComponent.cs b/Oqtane.Client/Modules/Controls/LocalizableComponent.cs index 657494d7..773df857 100644 --- a/Oqtane.Client/Modules/Controls/LocalizableComponent.cs +++ b/Oqtane.Client/Modules/Controls/LocalizableComponent.cs @@ -15,56 +15,54 @@ namespace Oqtane.Modules.Controls protected bool IsLocalizable { get; private set; } - protected string Localize(string name) - { - var key = $"{ResourceKey}.{name}"; + protected string Localize(string name) => _localizer?[name] ?? name; - // TODO: we should have a ShowMissingResourceKeys option which developers/translators can enable to find missing translations which would display the key rather than the name + protected string Localize(string propertyName, string propertyValue) + { if (!IsLocalizable) { - return name; + return propertyValue; } - return _localizer?[key] ?? name; - } - - protected string Localize(string name, string defaultValue) - { - var key = $"{ResourceKey}.{name}"; - var value = Localize(name); + var key = $"{ResourceKey}.{propertyName}"; + var value = Localize(key); if (value == key) { - return defaultValue; + // Returns default property value (English version) instead of ResourceKey.PropertyName + return propertyValue; } else { - return value; + if (value == String.Empty) + { + // Returns default property value (English version) + return propertyValue; + } + else + { + return value; + } } } protected override void OnParametersSet() { - if (!String.IsNullOrEmpty(ResourceKey)) + IsLocalizable = false; + + if (!String.IsNullOrEmpty(ResourceKey) && ModuleState?.ModuleType != null) { - if (ModuleState?.ModuleType != null) + var moduleType = Type.GetType(ModuleState.ModuleType); + if (moduleType != null) { - var moduleType = Type.GetType(ModuleState.ModuleType); - if (moduleType != null) + using (var scope = ServiceActivator.GetScope()) { - using (var scope = ServiceActivator.GetScope()) - { - var localizerFactory = scope.ServiceProvider.GetService(); - _localizer = localizerFactory.Create(moduleType); - } + var localizerFactory = scope.ServiceProvider.GetService(); + _localizer = localizerFactory.Create(moduleType); + + IsLocalizable = true; } } - - IsLocalizable = true; - } - else - { - IsLocalizable = false; } } } diff --git a/Oqtane.Client/Modules/Controls/PermissionGrid.razor b/Oqtane.Client/Modules/Controls/PermissionGrid.razor index 000f54be..a35a5209 100644 --- a/Oqtane.Client/Modules/Controls/PermissionGrid.razor +++ b/Oqtane.Client/Modules/Controls/PermissionGrid.razor @@ -13,7 +13,7 @@
@Localizer["Role"]@permission.PermissionName@Localizer[permission.PermissionName]
@Localizer["User"]@permission.PermissionName@Localizer[permission.PermissionName]
- +