From 99d8a902f7be222badc91f9994004bfb8dc0a5f6 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Wed, 15 Mar 2023 13:44:35 +0300 Subject: [PATCH 1/3] Localization: Skip virtual json files without culture code --- .../Json/JsonLocalizationDictionaryBuilder.cs | 16 ++++++++++------ ...ualFileLocalizationResourceContributorBase.cs | 9 +++++++++ 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Json/JsonLocalizationDictionaryBuilder.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Json/JsonLocalizationDictionaryBuilder.cs index abbfb9b9c6..28ff6bb9b7 100644 --- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Json/JsonLocalizationDictionaryBuilder.cs +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Json/JsonLocalizationDictionaryBuilder.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Text.Json; +using JetBrains.Annotations; using Microsoft.Extensions.Localization; namespace Volo.Abp.Localization.Json; @@ -12,6 +13,7 @@ public static class JsonLocalizationDictionaryBuilder /// Builds an from given file. /// /// Path of the file + [CanBeNull] public static ILocalizationDictionary BuildFromFile(string filePath) { try @@ -36,24 +38,26 @@ public static class JsonLocalizationDictionaryBuilder /// Builds an from given json string. /// /// Json string + [CanBeNull] public static ILocalizationDictionary BuildFromJsonString(string jsonString) { JsonLocalizationFile jsonFile; + string cultureCode; try { jsonFile = JsonSerializer.Deserialize(jsonString, DeserializeOptions); + cultureCode = jsonFile.Culture; + + if (string.IsNullOrEmpty(cultureCode)) + { + return null; + } } catch (JsonException ex) { throw new AbpException("Can not parse json string. " + ex.Message); } - var cultureCode = jsonFile.Culture; - if (string.IsNullOrEmpty(cultureCode)) - { - throw new AbpException("Culture is empty in language json file."); - } - var dictionary = new Dictionary(); var dublicateNames = new List(); foreach (var item in jsonFile.Texts) diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/VirtualFiles/VirtualFileLocalizationResourceContributorBase.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/VirtualFiles/VirtualFileLocalizationResourceContributorBase.cs index 1713adc473..40bb9de7c5 100644 --- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/VirtualFiles/VirtualFileLocalizationResourceContributorBase.cs +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/VirtualFiles/VirtualFileLocalizationResourceContributorBase.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; +using JetBrains.Annotations; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Localization; @@ -98,6 +99,12 @@ public abstract class VirtualFileLocalizationResourceContributorBase : ILocaliza } var dictionary = CreateDictionaryFromFile(file); + + if (dictionary == null) + { + continue; + } + if (dictionaries.ContainsKey(dictionary.CultureName)) { throw new AbpException($"{file.GetVirtualOrPhysicalPathOrNull()} dictionary has a culture name '{dictionary.CultureName}' which is already defined! Localization resource: {_resource.ResourceName}"); @@ -111,6 +118,7 @@ public abstract class VirtualFileLocalizationResourceContributorBase : ILocaliza protected abstract bool CanParseFile(IFileInfo file); + [CanBeNull] protected virtual ILocalizationDictionary CreateDictionaryFromFile(IFileInfo file) { using (var stream = file.CreateReadStream()) @@ -119,5 +127,6 @@ public abstract class VirtualFileLocalizationResourceContributorBase : ILocaliza } } + [CanBeNull] protected abstract ILocalizationDictionary CreateDictionaryFromFileContent(string fileContent); } From 3b5bc8aa04eea5897989eb2b865c58e5d9bdf223 Mon Sep 17 00:00:00 2001 From: Yunus Emre Kalkan Date: Wed, 15 Mar 2023 13:45:59 +0300 Subject: [PATCH 2/3] Update JsonLocalizationDictionaryBuilder.cs --- .../Json/JsonLocalizationDictionaryBuilder.cs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Json/JsonLocalizationDictionaryBuilder.cs b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Json/JsonLocalizationDictionaryBuilder.cs index 28ff6bb9b7..04ec79aaf6 100644 --- a/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Json/JsonLocalizationDictionaryBuilder.cs +++ b/framework/src/Volo.Abp.Localization/Volo/Abp/Localization/Json/JsonLocalizationDictionaryBuilder.cs @@ -42,21 +42,20 @@ public static class JsonLocalizationDictionaryBuilder public static ILocalizationDictionary BuildFromJsonString(string jsonString) { JsonLocalizationFile jsonFile; - string cultureCode; try { jsonFile = JsonSerializer.Deserialize(jsonString, DeserializeOptions); - cultureCode = jsonFile.Culture; - - if (string.IsNullOrEmpty(cultureCode)) - { - return null; - } } catch (JsonException ex) { throw new AbpException("Can not parse json string. " + ex.Message); } + + var cultureCode = jsonFile.Culture; + if (string.IsNullOrEmpty(cultureCode)) + { + return null; + } var dictionary = new Dictionary(); var dublicateNames = new List(); From 7cbb0c29020e6a22e87ca96cb6d2b258c770180e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Halil=20=C4=B0brahim=20Kalkan?= Date: Wed, 15 Mar 2023 14:26:59 +0300 Subject: [PATCH 3/3] Add warning for culture section of localization files. --- docs/en/Localization.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/en/Localization.md b/docs/en/Localization.md index 089567422c..a432d6afb2 100644 --- a/docs/en/Localization.md +++ b/docs/en/Localization.md @@ -87,6 +87,8 @@ A JSON localization file content is shown below: * Every localization file should define the `culture` code for the file (like "en" or "en-US"). * `texts` section just contains key-value collection of the localization strings (keys may have spaces too). +> ABP will ignore (skip) the JSON file if the `culture` section is missing. + ### Default Resource `AbpLocalizationOptions.DefaultResourceType` can be set to a resource type, so it is used when the localization resource was not specified: