Skip to content

Commit 6c3d412

Browse files
authored
feat: Support multi-resource i18n (#380)
* feat: Support multi-resource i18n addition * feat(i18n): key is not case sensitive
1 parent 2d48db7 commit 6c3d412

File tree

10 files changed

+91
-9
lines changed

10 files changed

+91
-9
lines changed

src/Contrib/Globalization/Masa.Contrib.Globalization.I18n/Extensions/I18nResourceExtensions.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public static I18nResource AddJson(
2828
var resourceContributors = GetResourceContributors(
2929
resource,
3030
resourcesDirectory,
31-
supportedCultures);
31+
supportedCultures.Any() ? supportedCultures : GlobalI18nConfiguration.GetSupportedCultures());
3232
foreach (var resourceContributor in resourceContributors)
3333
{
3434
resource.AddContributor(resourceContributor.CultureName, resourceContributor);

src/Contrib/Globalization/Masa.Contrib.Globalization.I18n/Extensions/ServiceCollectionExtensions.cs

+4-2
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,9 @@ private static CultureSettings AddAndGetCultureSettings(
125125
CultureUtils.GetSupportedCultures(settings.ResourcesDirectory, settings.SupportCultureName);
126126
});
127127
var serviceProvider = services.BuildServiceProvider();
128-
return serviceProvider.GetRequiredService<IOptions<CultureSettings>>().Value;
128+
var settings = serviceProvider.GetRequiredService<IOptions<CultureSettings>>().Value;
129+
GlobalI18nConfiguration.SetSupportedCultures(settings.SupportedCultures);
130+
return settings;
129131
}
130132

131133
private static IServiceCollection AddI18nCore<TResource>(
@@ -145,7 +147,7 @@ private static IServiceCollection AddI18nCore<TResource>(
145147
options.Resources.TryAdd<TResource>(resource =>
146148
{
147149
if (assemblies.Any()) resource.Assemblies = assemblies;
148-
resource.AddJson(localLanguageSettings.ResourcesDirectory ?? ContribI18nConstant.DefaultResourcePath,
150+
resource.AddJson(localLanguageSettings.ResourcesDirectory!,
149151
localLanguageSettings.SupportedCultures);
150152
});
151153
});

src/Contrib/Globalization/Masa.Contrib.Globalization.I18n/FileConfigurationProvider.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ private IConfiguration InitializeConfiguration(string basePath, string cultureNa
5656

5757
private Dictionary<string, string> FormatData()
5858
{
59-
var data = new Dictionary<string, string>();
59+
var data = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
6060
foreach (var item in _dictionary)
6161
{
6262
foreach (var resource in item.Value)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
// Copyright (c) MASA Stack All rights reserved.
2+
// Licensed under the MIT License. See LICENSE.txt in the project root for license information.
3+
4+
namespace Masa.Contrib.Globalization.I18n.Internal;
5+
6+
internal static class GlobalI18nConfiguration
7+
{
8+
private static List<CultureModel> _supportedCultures;
9+
10+
public static void SetSupportedCultures(List<CultureModel> supportedCultures) => _supportedCultures = supportedCultures;
11+
12+
public static List<CultureModel> GetSupportedCultures() => _supportedCultures;
13+
}

src/Contrib/Globalization/Masa.Contrib.Globalization.I18n/Masa.Contrib.Globalization.I18n.csproj

-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515

1616
<ItemGroup>
1717
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="$(MicrosoftPackageVersion)" />
18-
<PackageReference Include="Microsoft.Extensions.Localization" Version="$(MicrosoftPackageVersion)" />
1918
</ItemGroup>
2019

2120
<ItemGroup>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// Copyright (c) MASA Stack All rights reserved.
2+
// Licensed under the MIT License. See LICENSE.txt in the project root for license information.
3+
4+
namespace Masa.Contrib.Globalization.I18n.Tests;
5+
6+
public class CustomResource
7+
{
8+
9+
}

src/Contrib/Globalization/Tests/Masa.Contrib.Globalization.I18n.Tests/I18nTest.cs

+56-3
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,10 @@
44
namespace Masa.Contrib.Globalization.I18n.Tests;
55

66
[TestClass]
7+
// ReSharper disable once InconsistentNaming
78
public class I18nTest
89
{
9-
private const string DEFAULT_RESOURCE = "Resources/I18n";
10+
private static readonly string DefaultResource = Path.Combine("Resources", "I18n");
1011

1112
[TestInitialize]
1213
public void Initialize()
@@ -23,6 +24,7 @@ public void TestLocalization(string cultureName, string expectedValue)
2324
services.AddLogging();
2425
services.TestAddI18n();
2526
var serviceProvider = services.BuildServiceProvider();
27+
// ReSharper disable once InconsistentNaming
2628
var i18n = serviceProvider.GetRequiredService<II18n>();
2729
i18n.SetUiCulture(cultureName);
2830
var value = i18n["Name"];
@@ -39,8 +41,9 @@ public void TestLocalization(string cultureName, string expectedValue)
3941
public void TestLocalization2(string cultureName, string expectedValue)
4042
{
4143
var builder = WebApplication.CreateBuilder();
42-
builder.Services.TestAddI18n(DEFAULT_RESOURCE);
44+
builder.Services.TestAddI18n(DefaultResource);
4345
var serviceProvider = builder.Services.BuildServiceProvider();
46+
// ReSharper disable once InconsistentNaming
4447
var i18n = serviceProvider.GetRequiredService<II18n>();
4548
i18n.SetUiCulture(cultureName);
4649
var value = i18n["Name"];
@@ -56,8 +59,9 @@ public void TestLocalization2(string cultureName, string expectedValue)
5659
public void TestLocalization3(string cultureName, string expectedValue)
5760
{
5861
var builder = WebApplication.CreateBuilder();
59-
builder.Services.AddI18n(DEFAULT_RESOURCE);
62+
builder.Services.AddI18n(DefaultResource);
6063
var serviceProvider = builder.Services.BuildServiceProvider();
64+
// ReSharper disable once InconsistentNaming
6165
var i18n = serviceProvider.GetRequiredService<II18n>();
6266
i18n.SetUiCulture(cultureName);
6367
var value = i18n["Name"];
@@ -67,4 +71,53 @@ public void TestLocalization3(string cultureName, string expectedValue)
6771
value = i18n["Name2"];
6872
Assert.AreEqual("Name2", value);
6973
}
74+
75+
[DataTestMethod]
76+
[DataRow("zh-CN", "Name", "吉姆", false)]
77+
[DataRow("en-US", "Name", "Jim", false)]
78+
[DataRow("zh-CN", "Name2", "吉姆2", true)]
79+
[DataRow("en-US", "Name2", "Jim2", true)]
80+
public void TestAddMultiResources(string culture, string key, string expectedResult, bool isCustom)
81+
{
82+
var services = new ServiceCollection();
83+
services.Configure<MasaI18nOptions>(options =>
84+
options.Resources
85+
.Add<CustomResource>()
86+
.AddJson(Path.Combine("Resources", "I18n2")));
87+
services.AddI18n();
88+
BuildingBlocks.Globalization.I18n.I18n.SetUiCulture(culture);
89+
var actualResult = "";
90+
actualResult = !isCustom ?
91+
BuildingBlocks.Globalization.I18n.I18n.T(key) :
92+
services.BuildServiceProvider().GetRequiredService<II18n<CustomResource>>().T(key);
93+
Assert.AreEqual(expectedResult, actualResult);
94+
}
95+
96+
[DataTestMethod]
97+
[DataRow("zh-CN", "Name", "吉姆", false)]
98+
[DataRow("zh-CN", "name", "吉姆", false)]
99+
[DataRow("en-US", "Name", "Jim", false)]
100+
[DataRow("en-US", "name", "Jim", false)]
101+
[DataRow("zh-CN", "Name2", "吉姆2", true)]
102+
[DataRow("zh-CN", "name2", "吉姆2", true)]
103+
[DataRow("en-US", "Name2", "Name2", true)]
104+
[DataRow("en-US", "name2", "name2", true)]
105+
public void TestAddMultiResources2(string culture, string key, string expectedResult, bool isCustom)
106+
{
107+
var services = new ServiceCollection();
108+
services.Configure<MasaI18nOptions>(options =>
109+
options.Resources
110+
.Add<CustomResource>()
111+
.AddJson(Path.Combine("Resources", "I18n2"),new List<CultureModel>()
112+
{
113+
new("zh-CN")
114+
}));
115+
services.AddI18n();
116+
BuildingBlocks.Globalization.I18n.I18n.SetUiCulture(culture);
117+
var actualResult = "";
118+
actualResult = !isCustom ?
119+
BuildingBlocks.Globalization.I18n.I18n.T(key) :
120+
services.BuildServiceProvider().GetRequiredService<II18n<CustomResource>>().T(key);
121+
Assert.AreEqual(expectedResult, actualResult);
122+
}
70123
}

src/Contrib/Globalization/Tests/Masa.Contrib.Globalization.I18n.Tests/Masa.Contrib.Globalization.I18n.Tests.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
</ItemGroup>
3131

3232
<ItemGroup>
33-
<Content Include="Resources\I18n\*.json">
33+
<Content Include="Resources\I18n*\*.json">
3434
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
3535
</Content>
3636
</ItemGroup>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"Name2": "Jim2"
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"Name2": "吉姆2"
3+
}

0 commit comments

Comments
 (0)