From 610d8f09de57b8ff2b20be7a5df754e9b61fca93 Mon Sep 17 00:00:00 2001 From: Hisham Bin Ateya Date: Sun, 4 Jan 2026 22:08:54 +0300 Subject: [PATCH] Bump OCC.DataLocalization to 1.3.0 --- .../AdminMenu.cs | 71 +++--- .../Controllers/AdminController.cs | 220 ++++++++---------- .../DataTranslationProvider.cs | 48 ++-- .../Manifest.cs | 2 +- .../Models/Translation.cs | 33 ++- .../Models/TranslationsDocument.cs | 31 ++- ...OrchardCoreContrib.DataLocalization.csproj | 4 +- .../README.md | 3 +- .../ContentFieldResourceStringProvider.cs | 68 +++--- .../ContentTypeResourceStringProvider.cs | 49 ++-- .../Services/TranslationsManager.cs | 61 +++-- .../Startup.cs | 64 +++-- .../ContentFieldResourcesViewModel.cs | 21 +- .../ContentTypeResourcesViewModel.cs | 17 +- 14 files changed, 321 insertions(+), 371 deletions(-) diff --git a/src/OrchardCoreContrib.DataLocalization/AdminMenu.cs b/src/OrchardCoreContrib.DataLocalization/AdminMenu.cs index daba5657..6929d832 100644 --- a/src/OrchardCoreContrib.DataLocalization/AdminMenu.cs +++ b/src/OrchardCoreContrib.DataLocalization/AdminMenu.cs @@ -1,49 +1,46 @@ +using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.Localization; using OrchardCore.Navigation; + +namespace OrchardCoreContrib.DataLocalization; + using OrchardCoreContrib.Navigation; -namespace OrchardCore.DataLocalization +/// +/// Represents a localization menu in the admin site. +/// +/// +/// Creates a new instance of the . +/// +/// The . +public class AdminMenu(IStringLocalizer S) : AdminNavigationProvider { - using OrchardCoreContrib.Navigation; - - /// - /// Represents a localization menu in the admin site. - /// - public class AdminMenu : AdminNavigationProvider + private static readonly RouteValueDictionary _routeValues = new() { - private readonly IStringLocalizer S; + { "area", "OrchardCoreContrib.DataLocalization" } + }; - /// - /// Creates a new instance of the . - /// - /// The . - public AdminMenu(IStringLocalizer localizer) - { - S = localizer; - } - - /// - public override void BuildNavigation(NavigationBuilder builder) - { - builder - .Add(S["Configuration"], NavigationConstants.AdminMenuConfigurationPosition, localization => localization - .Add(S["Settings"], settings => settings - .Add(S["Localization"], localization => localization - .AddClass("localization").Id("localization") - .Add(S["Data Resources"], S["Data Resources"].PrefixPosition(), data => data - .AddClass("data-resources").Id("data-resources") - .Add(S["Content Types"], S["Content Types"].PrefixPosition(), type => type - .Action("ManageContentTypeResources", "Admin", new { area = "OrchardCoreContrib.DataLocalization" }) - .LocalNav() - ) - .Add(S["Content Fields"], S["Content Fields"].PrefixPosition(), type => type - .Action("ManageContentFieldResources", "Admin", new { area = "OrchardCoreContrib.DataLocalization" }) - .LocalNav() - ) + /// + public override void BuildNavigation(NavigationBuilder builder) + { + builder + .Add(S["Configuration"], NavigationConstants.AdminMenuConfigurationPosition, localization => localization + .Add(S["Settings"], settings => settings + .Add(S["Localization"], localization => localization + .AddClass("localization").Id("localization") + .Add(S["Data Resources"], S["Data Resources"].PrefixPosition(), data => data + .AddClass("data-resources").Id("data-resources") + .Add(S["Content Types"], S["Content Types"].PrefixPosition(), type => type + .Action("ManageContentTypeResources", "Admin", _routeValues) + .LocalNav() + ) + .Add(S["Content Fields"], S["Content Fields"].PrefixPosition(), type => type + .Action("ManageContentFieldResources", "Admin", _routeValues) + .LocalNav() ) ) ) - ); - } + ) + ); } } diff --git a/src/OrchardCoreContrib.DataLocalization/Controllers/AdminController.cs b/src/OrchardCoreContrib.DataLocalization/Controllers/AdminController.cs index 8b8f4f39..eb95b886 100644 --- a/src/OrchardCoreContrib.DataLocalization/Controllers/AdminController.cs +++ b/src/OrchardCoreContrib.DataLocalization/Controllers/AdminController.cs @@ -8,160 +8,140 @@ using OrchardCoreContrib.DataLocalization.ViewModels; using OrchardCoreContrib.Localization; using OrchardCoreContrib.Localization.Data; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -namespace OrchardCoreContrib.DataLocalization.Controllers +namespace OrchardCoreContrib.DataLocalization.Controllers; + +public class AdminController( + IContentDefinitionService contentDefinitionService, + IEnumerable dataResourceStringProviders, + TranslationsManager translationsManager, + IMemoryCache memoryCache, + IHtmlLocalizer H, + INotifier notifier) : Controller { - public class AdminController : Controller + private const string ResourcesCachePrefix = "OCC-CultureDictionary-"; + private const string AntiForgeryTokenKey = "__RequestVerificationToken"; + + public async Task ManageContentTypeResources([FromQuery] string selectedCulture) { - private const string ResourcesCachePrefix = "OCC-CultureDictionary-"; - private const string AntiForgeryTokenKey = "__RequestVerificationToken"; - - private readonly IContentDefinitionService _contentDefinitionService; - private readonly IEnumerable _dataResourceStringProviders; - private readonly TranslationsManager _translationsManager; - private readonly IMemoryCache _memoryCache; - private readonly INotifier _notifier; - private readonly IHtmlLocalizer H; - - public AdminController( - IContentDefinitionService contentDefinitionService, - IEnumerable dataResourceStringProviders, - TranslationsManager translationsManager, - IMemoryCache memoryCache, - IHtmlLocalizer htmlLocalizer, - INotifier notifier) - { - _contentDefinitionService = contentDefinitionService; - _dataResourceStringProviders = dataResourceStringProviders; - _translationsManager = translationsManager; - _memoryCache = memoryCache; - _notifier = notifier; - H = htmlLocalizer; - } + var resourcesNames = await GetResourcesNamesAsync(ContentTypeResourceStringProvider.Context); + + var translationsDocument = await translationsManager.GetTranslationsDocumentAsync(); - public async Task ManageContentTypeResources([FromQuery] string selectedCulture) + var viewModel = new ContentTypeResourcesViewModel { - var resourcesNames = await GetResourcesNamesAsync(ContentTypeResourceStringProvider.Context); + ResourcesNames = resourcesNames, + Translations = [], + SelectedCulture = selectedCulture + }; - var translationsDocument = await _translationsManager.GetTranslationsDocumentAsync(); + if (!string.IsNullOrEmpty(selectedCulture) && + translationsDocument.Translations.TryGetValue(selectedCulture, out IEnumerable value)) + { + viewModel.Translations = value; + } - var viewModel = new ContentTypeResourcesViewModel - { - ResourcesNames = resourcesNames, - Translations = Enumerable.Empty(), - SelectedCulture = selectedCulture - }; + return View(viewModel); + } - if (!String.IsNullOrEmpty(selectedCulture) && translationsDocument.Translations.ContainsKey(selectedCulture)) - { - viewModel.Translations = translationsDocument.Translations[selectedCulture]; - } + [HttpPost] + [ActionName(nameof(ManageContentTypeResources))] + public async Task ManageContentTypeResourcesPost([FromQuery] string selectedCulture) + { + await UpdateResourcesAsync(ContentTypeResourceStringProvider.Context, selectedCulture); - return View(viewModel); - } + return RedirectToAction(nameof(ManageContentTypeResources), new { selectedCulture }); + } - [HttpPost] - [ActionName(nameof(ManageContentTypeResources))] - public async Task ManageContentTypeResourcesPost([FromQuery] string selectedCulture) - { - await UpdateResourcesAsync(ContentTypeResourceStringProvider.Context, selectedCulture); + public async Task ManageContentFieldResources([FromQuery] string selectedCulture, [FromQuery] string contentType) + { + var context = $"{contentType}-{ContentFieldResourceStringProvider.Context}"; + var resourcesNames = await GetResourcesNamesAsync(context); - return RedirectToAction(nameof(ManageContentTypeResources), new { selectedCulture }); - } + var translationsDocument = await translationsManager.GetTranslationsDocumentAsync(); - public async Task ManageContentFieldResources([FromQuery] string selectedCulture, [FromQuery] string contentType) + var viewModel = new ContentFieldResourcesViewModel { - var context = $"{contentType}-{ContentFieldResourceStringProvider.Context}"; - var resourcesNames = await GetResourcesNamesAsync(context); + ContentTypes = (await contentDefinitionService.GetTypesAsync()).Select(t => t.Name), + ResourcesNames = resourcesNames, + Translations = [], + SelectedContentType = contentType, + SelectedCulture = selectedCulture + }; + + if (!string.IsNullOrEmpty(selectedCulture) && + translationsDocument.Translations.TryGetValue(selectedCulture, out IEnumerable value)) + { + viewModel.Translations = value; + } - var translationsDocument = await _translationsManager.GetTranslationsDocumentAsync(); + return View(viewModel); + } - var viewModel = new ContentFieldResourcesViewModel - { - ContentTypes = (await _contentDefinitionService.GetTypesAsync()).Select(t => t.Name), - ResourcesNames = resourcesNames, - Translations = Enumerable.Empty(), - SelectedContentType = contentType, - SelectedCulture = selectedCulture - }; - - if (!String.IsNullOrEmpty(selectedCulture) && translationsDocument.Translations.ContainsKey(selectedCulture)) - { - viewModel.Translations = translationsDocument.Translations[selectedCulture]; - } + [HttpPost] + [ActionName(nameof(ManageContentFieldResources))] + public async Task ManageContentFieldResourcesPost([FromQuery] string selectedCulture, [FromQuery] string contentType) + { + var context = $"{contentType}-{ContentFieldResourceStringProvider.Context}"; + + await UpdateResourcesAsync(context, selectedCulture); - return View(viewModel); - } + return RedirectToAction(nameof(ManageContentFieldResources), new { selectedCulture, contentType }); + } - [HttpPost] - [ActionName(nameof(ManageContentFieldResources))] - public async Task ManageContentFieldResourcesPost([FromQuery] string selectedCulture, [FromQuery] string contentType) + private async Task> GetResourcesNamesAsync(string context) + { + IEnumerable resourcesNames = null; + foreach (var dataResourceStringProvider in dataResourceStringProviders) { - var context = $"{contentType}-{ContentFieldResourceStringProvider.Context}"; - - await UpdateResourcesAsync(context, selectedCulture); + resourcesNames = (await dataResourceStringProvider.GetAllResourceStringsAsync(context)) + .Select(r => r.GetMessageId()); - return RedirectToAction(nameof(ManageContentFieldResources), new { selectedCulture, contentType }); + if (resourcesNames.Any()) + { + break; + } } - private async Task> GetResourcesNamesAsync(string context) - { - IEnumerable resourcesNames = null; - foreach (var dataResourceStringProvider in _dataResourceStringProviders) - { - resourcesNames = (await dataResourceStringProvider.GetAllResourceStringsAsync(context)) - .Select(r => r.GetMessageId()); + return resourcesNames; + } - if (resourcesNames.Any()) - { - break; - } - } + private async Task UpdateResourcesAsync(string context, string culture) + { + var translations = new List(); - return resourcesNames; - } + var translationsDocument = await translationsManager.GetTranslationsDocumentAsync(); - private async Task UpdateResourcesAsync(string context, string culture) + if (translationsDocument.Translations.TryGetValue(culture, out IEnumerable translationsValue)) { - var translations = new List(); + translations = [.. translationsValue]; + } - var translationsDocument = await _translationsManager.GetTranslationsDocumentAsync(); + foreach (var key in Request.Form.Keys.Where(k => !k.Equals(AntiForgeryTokenKey))) + { + var value = Request.Form[key].ToString(); + var index = translations.FindIndex(t => t.Context == context && t.Key == key); - if (translationsDocument.Translations.ContainsKey(culture)) + if (index > -1) { - translations = translationsDocument.Translations[culture].ToList(); + translations[index].Value = value; } - - foreach (var key in Request.Form.Keys.Where(k => !k.Equals(AntiForgeryTokenKey))) + else { - var value = Request.Form[key].ToString(); - var index = translations.FindIndex(t => t.Context == context && t.Key == key); - - if (index > -1) - { - translations[index].Value = value; - } - else + translations.Add(new Translation { - translations.Add(new Translation - { - Context = context, - Key = key, - Value = value - }); - } + Context = context, + Key = key, + Value = value + }); } + } - await _translationsManager.UpdateTranslationAsync(culture, translations); + await translationsManager.UpdateTranslationAsync(culture, translations); - // Purge the resource cache - _memoryCache.Remove(ResourcesCachePrefix + culture); + // Purge the resource cache + memoryCache.Remove(ResourcesCachePrefix + culture); - await _notifier.SuccessAsync(H["The resource has been saved successfully."]); - } + await notifier.SuccessAsync(H["The resource has been saved successfully."]); } } diff --git a/src/OrchardCoreContrib.DataLocalization/DataTranslationProvider.cs b/src/OrchardCoreContrib.DataLocalization/DataTranslationProvider.cs index f6447a6c..bc07fa4f 100644 --- a/src/OrchardCoreContrib.DataLocalization/DataTranslationProvider.cs +++ b/src/OrchardCoreContrib.DataLocalization/DataTranslationProvider.cs @@ -2,42 +2,32 @@ using OrchardCore.Localization; using OrchardCoreContrib.DataLocalization.Services; using OrchardCoreContrib.Localization.Data; -using System.Linq; -namespace OrchardCoreContrib.DataLocalization +namespace OrchardCoreContrib.DataLocalization; + +/// +/// Provides a translations from the underlying data store. +/// +/// +/// Creates a new instance of . +/// +/// The . +public class DataTranslationProvider(IServiceScopeFactory scopeFactory) : IDataTranslationProvider { - /// - /// Provides a translations from the underlying data store. - /// - public class DataTranslationProvider : IDataTranslationProvider + /// + public void LoadTranslations(string cultureName, CultureDictionary dictionary) { - private readonly IServiceScopeFactory _scopeFactory; - - /// - /// Creates a new instance of . - /// - /// The . - public DataTranslationProvider(IServiceScopeFactory scopeFactory) + using (var scope = scopeFactory.CreateScope()) { - _scopeFactory = scopeFactory; - } + var translationsManager = scope.ServiceProvider.GetService(); - /// - public void LoadTranslations(string cultureName, CultureDictionary dictionary) - { - using (var scope = _scopeFactory.CreateScope()) - { - var translationsManager = scope.ServiceProvider.GetService(); - - var translationsDocument = translationsManager.GetTranslationsDocumentAsync().Result; + var translationsDocument = translationsManager.GetTranslationsDocumentAsync().Result; - if (translationsDocument.Translations.ContainsKey(cultureName)) - { - var records = translationsDocument.Translations[cultureName] - .Select(t => new CultureDictionaryRecord(t.Key, t.Context, new[] { t.Value })); + if (translationsDocument.Translations.TryGetValue(cultureName, out IEnumerable value)) + { + var records = value.Select(t => new CultureDictionaryRecord(t.Key, t.Context, [t.Value])); - dictionary.MergeTranslations(records); - } + dictionary.MergeTranslations(records); } } } diff --git a/src/OrchardCoreContrib.DataLocalization/Manifest.cs b/src/OrchardCoreContrib.DataLocalization/Manifest.cs index 15c55bc0..a5ac3628 100644 --- a/src/OrchardCoreContrib.DataLocalization/Manifest.cs +++ b/src/OrchardCoreContrib.DataLocalization/Manifest.cs @@ -5,7 +5,7 @@ Name = "Data Localization", Author = ManifestConstants.Author, Website = ManifestConstants.Website, - Version = "1.1.1", + Version = "1.3.0", Category = "Internationalization", Dependencies = new[] { "OrchardCore.Localization" } )] diff --git a/src/OrchardCoreContrib.DataLocalization/Models/Translation.cs b/src/OrchardCoreContrib.DataLocalization/Models/Translation.cs index 4f081672..aaf7efe7 100644 --- a/src/OrchardCoreContrib.DataLocalization/Models/Translation.cs +++ b/src/OrchardCoreContrib.DataLocalization/Models/Translation.cs @@ -1,23 +1,22 @@ -namespace OrchardCoreContrib.DataLocalization.Models +namespace OrchardCoreContrib.DataLocalization.Models; + +/// +/// Represents a translation. +/// +public class Translation { /// - /// Represents a translation. + /// Gets the translation context. /// - public class Translation - { - /// - /// Gets the translation context. - /// - public string Context { get; set; } + public string Context { get; set; } - /// - /// Gets the translation key. - /// - public string Key { get; set; } + /// + /// Gets the translation key. + /// + public string Key { get; set; } - /// - /// Gets the translation value. - /// - public string Value { get; set; } - } + /// + /// Gets the translation value. + /// + public string Value { get; set; } } diff --git a/src/OrchardCoreContrib.DataLocalization/Models/TranslationsDocument.cs b/src/OrchardCoreContrib.DataLocalization/Models/TranslationsDocument.cs index 571e2a54..e772cff3 100644 --- a/src/OrchardCoreContrib.DataLocalization/Models/TranslationsDocument.cs +++ b/src/OrchardCoreContrib.DataLocalization/Models/TranslationsDocument.cs @@ -1,25 +1,22 @@ using OrchardCore.Data.Documents; -using System; -using System.Collections.Generic; -namespace OrchardCoreContrib.DataLocalization.Models +namespace OrchardCoreContrib.DataLocalization.Models; + +/// +/// Represents a documents that contains a list of . +/// +public class TranslationsDocument : Document { /// - /// Represents a documents that contains a list of . + /// Creates a new instance of . /// - public class TranslationsDocument : Document + public TranslationsDocument() { - /// - /// Creates a new instance of . - /// - public TranslationsDocument() - { - Translations = new Dictionary>(StringComparer.OrdinalIgnoreCase); - } - - /// - /// Gets the list of the translations associated with a culture. - /// - public Dictionary> Translations { get; } + Translations = new Dictionary>(StringComparer.OrdinalIgnoreCase); } + + /// + /// Gets the list of the translations associated with a culture. + /// + public Dictionary> Translations { get; } } diff --git a/src/OrchardCoreContrib.DataLocalization/OrchardCoreContrib.DataLocalization.csproj b/src/OrchardCoreContrib.DataLocalization/OrchardCoreContrib.DataLocalization.csproj index d1ce4439..f91f0ec3 100644 --- a/src/OrchardCoreContrib.DataLocalization/OrchardCoreContrib.DataLocalization.csproj +++ b/src/OrchardCoreContrib.DataLocalization/OrchardCoreContrib.DataLocalization.csproj @@ -2,10 +2,11 @@ true - 1.2.0 + 1.3.0 The Orchard Core Contrib Team Provides a localization feature for dynamic data. + README.md BSD-3-Clause https://github.com/OrchardCoreContrib/OrchardCoreContrib.Modules/tree/main/src/OrchardCoreContrib.DataLocalization/README.md https://github.com/OrchardCoreContrib/OrchardCoreContrib.Modules @@ -26,6 +27,7 @@ + diff --git a/src/OrchardCoreContrib.DataLocalization/README.md b/src/OrchardCoreContrib.DataLocalization/README.md index a6a5ca7f..03162a7a 100644 --- a/src/OrchardCoreContrib.DataLocalization/README.md +++ b/src/OrchardCoreContrib.DataLocalization/README.md @@ -4,7 +4,7 @@ This module provides features for localizing dynamic data. ## Version -1.1.1 +1.3.0 ## Category @@ -28,6 +28,7 @@ Internationalization | Name | Version | |-------------------------------------------------------------------------------------------------------------------------|-------------| +| [`OrchardCoreContrib.DataLocalization`](https://www.nuget.org/packages/OrchardCoreContrib.DataLocalization/1.3.0) | 1.3.0 | | [`OrchardCoreContrib.DataLocalization`](https://www.nuget.org/packages/OrchardCoreContrib.DataLocalization/1.2.0) | 1.2.0 | | [`OrchardCoreContrib.DataLocalization`](https://www.nuget.org/packages/OrchardCoreContrib.DataLocalization/1.1.1) | 1.1.1 | | [`OrchardCoreContrib.DataLocalization`](https://www.nuget.org/packages/OrchardCoreContrib.DataLocalization/1.1.0) | 1.1.0 | diff --git a/src/OrchardCoreContrib.DataLocalization/Services/ContentFieldResourceStringProvider.cs b/src/OrchardCoreContrib.DataLocalization/Services/ContentFieldResourceStringProvider.cs index ddbd2440..7b5f517e 100644 --- a/src/OrchardCoreContrib.DataLocalization/Services/ContentFieldResourceStringProvider.cs +++ b/src/OrchardCoreContrib.DataLocalization/Services/ContentFieldResourceStringProvider.cs @@ -1,43 +1,55 @@ -using OrchardCore.ContentManagement.Metadata.Settings; +using OrchardCore.ContentManagement.Metadata; using OrchardCore.ContentTypes.Services; using OrchardCore.Localization; using OrchardCoreContrib.Localization.Data; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -namespace OrchardCoreContrib.DataLocalization.Services +namespace OrchardCoreContrib.DataLocalization.Services; + +/// +/// Represents a resource string provider for content fields. +/// +/// +/// Creates a instance of . +/// +/// The . +public class ContentFieldResourceStringProvider( + IContentDefinitionService contentDefinitionService, + IContentDefinitionManager contentDefinitionManager) : IDataResourceStringProvider { - /// - /// Represents a resource string provider for content fields. - /// - public class ContentFieldResourceStringProvider : IDataResourceStringProvider + internal static readonly string Context = "ContentField"; + + /// + public async Task> GetAllResourceStringsAsync() { - internal static readonly string Context = "ContentField"; + var cultureDictionary = new List(); - private readonly IContentDefinitionService _contentDefinitionService; + var typeViewModels = await contentDefinitionService.GetTypesAsync(); - /// - /// Creates a instance of . - /// - /// The . - public ContentFieldResourceStringProvider(IContentDefinitionService contentDefinitionService) + foreach (var typeViewModel in typeViewModels) { - _contentDefinitionService = contentDefinitionService; + var fields = await GetFieldNamesAsync(typeViewModel.TypeDefinition.Name); + + cultureDictionary.AddRange(fields.Select(field => new CultureDictionaryRecordKey + { + MessageId = field, + Context = $"{typeViewModel.Name}-{Context}" + })); } - /// - public async Task> GetAllResourceStringsAsync() + return cultureDictionary; + } + + private async Task> GetFieldNamesAsync(string contentType) + { + var typeDefinition = await contentDefinitionManager.GetTypeDefinitionAsync(contentType); + + if (typeDefinition is null) { - var contentTypes = await _contentDefinitionService.GetTypesAsync(); - - return contentTypes - .SelectMany(t => t.TypeDefinition.Parts.SelectMany(p => p.PartDefinition.Fields.Select(f => new { ContentType = t.Name, ContentField = f.GetSettings().DisplayName }))) - .Select(t => new CultureDictionaryRecordKey - { - MessageId = t.ContentField, - Context = $"{t.ContentType}-{Context}" - }); + return []; } + + return typeDefinition.Parts + .SelectMany(p => p.PartDefinition.Fields) + .Select(f => f.Name); } } diff --git a/src/OrchardCoreContrib.DataLocalization/Services/ContentTypeResourceStringProvider.cs b/src/OrchardCoreContrib.DataLocalization/Services/ContentTypeResourceStringProvider.cs index a560ead1..eb7b3d08 100644 --- a/src/OrchardCoreContrib.DataLocalization/Services/ContentTypeResourceStringProvider.cs +++ b/src/OrchardCoreContrib.DataLocalization/Services/ContentTypeResourceStringProvider.cs @@ -1,40 +1,29 @@ using OrchardCore.ContentTypes.Services; using OrchardCore.Localization; using OrchardCoreContrib.Localization.Data; -using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; -namespace OrchardCoreContrib.DataLocalization.Services -{ - /// - /// Represents a resource string provider for content types. - /// - public class ContentTypeResourceStringProvider : IDataResourceStringProvider - { - internal static readonly string Context = "ContentType"; +namespace OrchardCoreContrib.DataLocalization.Services; - private readonly IContentDefinitionService _contentDefinitionService; +/// +/// Represents a resource string provider for content types. +/// +/// +/// Creates a instance of . +/// +/// The . +public class ContentTypeResourceStringProvider(IContentDefinitionService contentDefinitionService) : IDataResourceStringProvider +{ + internal static readonly string Context = "ContentType"; - /// - /// Creates a instance of . - /// - /// The . - public ContentTypeResourceStringProvider(IContentDefinitionService contentDefinitionService) - { - _contentDefinitionService = contentDefinitionService; - } + /// + public async Task> GetAllResourceStringsAsync() + { + var contentTypes = await contentDefinitionService.GetTypesAsync(); - /// - public async Task> GetAllResourceStringsAsync() + return contentTypes.Select(t => new CultureDictionaryRecordKey { - var contentTypes = await _contentDefinitionService.GetTypesAsync(); - - return contentTypes.Select(t => new CultureDictionaryRecordKey - { - MessageId = t.DisplayName, - Context = Context - }); - } + MessageId = t.DisplayName, + Context = Context + }); } } diff --git a/src/OrchardCoreContrib.DataLocalization/Services/TranslationsManager.cs b/src/OrchardCoreContrib.DataLocalization/Services/TranslationsManager.cs index 88c462a3..767b3d9d 100644 --- a/src/OrchardCoreContrib.DataLocalization/Services/TranslationsManager.cs +++ b/src/OrchardCoreContrib.DataLocalization/Services/TranslationsManager.cs @@ -1,45 +1,38 @@ using OrchardCoreContrib.DataLocalization.Models; using OrchardCore.Documents; -using System.Threading.Tasks; -using System.Collections.Generic; -namespace OrchardCoreContrib.DataLocalization.Services +namespace OrchardCoreContrib.DataLocalization.Services; + +/// +/// Manages +/// +/// +/// Creates a new instance of . +/// +/// +public class TranslationsManager(IDocumentManager documentManager) { /// - /// Manages + /// Loads the translations document from the store for updating and that should not be cached. /// - public class TranslationsManager - { - private readonly IDocumentManager _documentManager; - - /// - /// Creates a new instance of . - /// - /// - public TranslationsManager(IDocumentManager documentManager) => _documentManager = documentManager; + public Task LoadTranslationsDocumentAsync() => documentManager.GetOrCreateMutableAsync(); - /// - /// Loads the translations document from the store for updating and that should not be cached. - /// - public Task LoadTranslationsDocumentAsync() => _documentManager.GetOrCreateMutableAsync(); - - /// - /// Gets the translations document from the cache for sharing and that should not be updated. - /// - public Task GetTranslationsDocumentAsync() => _documentManager.GetOrCreateImmutableAsync(); + /// + /// Gets the translations document from the cache for sharing and that should not be updated. + /// + public Task GetTranslationsDocumentAsync() => documentManager.GetOrCreateImmutableAsync(); - /// - /// Updates the translations for a given culture. - /// - /// The culture for the updated transaltions. - /// The translations to be updated. - public async Task UpdateTranslationAsync(string culture, IEnumerable translations) - { - var document = await LoadTranslationsDocumentAsync(); - - document.Translations[culture] = translations; + /// + /// Updates the translations for a given culture. + /// + /// The culture for the updated transaltions. + /// The translations to be updated. + public async Task UpdateTranslationAsync(string culture, IEnumerable translations) + { + var document = await LoadTranslationsDocumentAsync(); + + document.Translations[culture] = translations; - await _documentManager.UpdateAsync(document); - } + await documentManager.UpdateAsync(document); } } diff --git a/src/OrchardCoreContrib.DataLocalization/Startup.cs b/src/OrchardCoreContrib.DataLocalization/Startup.cs index e2dea5d8..9f8d23d4 100644 --- a/src/OrchardCoreContrib.DataLocalization/Startup.cs +++ b/src/OrchardCoreContrib.DataLocalization/Startup.cs @@ -4,51 +4,47 @@ using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Options; using OrchardCore.Admin; -using OrchardCore.DataLocalization; using OrchardCore.Modules; using OrchardCore.Mvc.Core.Utilities; using OrchardCore.Navigation; using OrchardCoreContrib.DataLocalization.Controllers; using OrchardCoreContrib.DataLocalization.Services; using OrchardCoreContrib.Localization.Data; -using System; -namespace OrchardCoreContrib.DataLocalization -{ - /// - /// Represents an entry point to register the page preview bar required services. - /// - public class Startup : StartupBase - { - private readonly AdminOptions _adminOptions; +namespace OrchardCoreContrib.DataLocalization; - public Startup(IOptions adminOptions) - { - _adminOptions = adminOptions.Value; - } +/// +/// Represents an entry point to register the page preview bar required services. +/// +public class Startup(IOptions adminOptions) : StartupBase +{ + private readonly AdminOptions _adminOptions = adminOptions.Value; - /// - public override void ConfigureServices(IServiceCollection services) - { - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); - services.AddScoped(); + /// + public override void ConfigureServices(IServiceCollection services) + { + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); + services.AddScoped(); - services.AddDataLocalization(); + services.AddDataLocalization(); - services.Replace(ServiceDescriptor.Singleton()); - } + services.Replace(ServiceDescriptor.Singleton()); + } - /// - public override void Configure(IApplicationBuilder app, IEndpointRouteBuilder routes, IServiceProvider serviceProvider) - { - routes.MapAreaControllerRoute( - name: "DataLocalization", - areaName: "OrchardCoreContrib.DataLocalization", - pattern: _adminOptions.AdminUrlPrefix + "/DataLocalization", - defaults: new { controller = typeof(AdminController).ControllerName(), action = nameof(AdminController.ManageContentTypeResources) } - ); - } + /// + public override void Configure(IApplicationBuilder app, IEndpointRouteBuilder routes, IServiceProvider serviceProvider) + { + routes.MapAreaControllerRoute( + name: "DataLocalization", + areaName: "OrchardCoreContrib.DataLocalization", + pattern: _adminOptions.AdminUrlPrefix + "/DataLocalization", + defaults: new + { + controller = typeof(AdminController).ControllerName(), + action = nameof(AdminController.ManageContentTypeResources) + } + ); } } diff --git a/src/OrchardCoreContrib.DataLocalization/ViewModels/ContentFieldResourcesViewModel.cs b/src/OrchardCoreContrib.DataLocalization/ViewModels/ContentFieldResourcesViewModel.cs index 941f5310..45ecbd84 100644 --- a/src/OrchardCoreContrib.DataLocalization/ViewModels/ContentFieldResourcesViewModel.cs +++ b/src/OrchardCoreContrib.DataLocalization/ViewModels/ContentFieldResourcesViewModel.cs @@ -1,21 +1,18 @@ using OrchardCoreContrib.DataLocalization.Models; -using System; -using System.Collections.Generic; -namespace OrchardCoreContrib.DataLocalization.ViewModels +namespace OrchardCoreContrib.DataLocalization.ViewModels; + +public class ContentFieldResourcesViewModel { - public class ContentFieldResourcesViewModel - { - public IEnumerable ContentTypes { get; set; } + public IEnumerable ContentTypes { get; set; } - public IEnumerable ResourcesNames { get; set; } + public IEnumerable ResourcesNames { get; set; } - public IEnumerable Translations { get; set; } + public IEnumerable Translations { get; set; } - public string SelectedContentType { get; set; } + public string SelectedContentType { get; set; } - public string SelectedCulture { get; set; } + public string SelectedCulture { get; set; } - public bool HasCulture => !String.IsNullOrEmpty(SelectedCulture); - } + public bool HasCulture => !string.IsNullOrEmpty(SelectedCulture); } diff --git a/src/OrchardCoreContrib.DataLocalization/ViewModels/ContentTypeResourcesViewModel.cs b/src/OrchardCoreContrib.DataLocalization/ViewModels/ContentTypeResourcesViewModel.cs index ba7e1e4b..ce0b7fa5 100644 --- a/src/OrchardCoreContrib.DataLocalization/ViewModels/ContentTypeResourcesViewModel.cs +++ b/src/OrchardCoreContrib.DataLocalization/ViewModels/ContentTypeResourcesViewModel.cs @@ -1,17 +1,14 @@ using OrchardCoreContrib.DataLocalization.Models; -using System; -using System.Collections.Generic; -namespace OrchardCoreContrib.DataLocalization.ViewModels +namespace OrchardCoreContrib.DataLocalization.ViewModels; + +public class ContentTypeResourcesViewModel { - public class ContentTypeResourcesViewModel - { - public IEnumerable ResourcesNames { get; set; } + public IEnumerable ResourcesNames { get; set; } - public IEnumerable Translations { get; set; } + public IEnumerable Translations { get; set; } - public string SelectedCulture { get; set; } + public string SelectedCulture { get; set; } - public bool HasCulture => !String.IsNullOrEmpty(SelectedCulture); - } + public bool HasCulture => !string.IsNullOrEmpty(SelectedCulture); }