我有一个项目,其中我使用资源文件存储一些文本,我也试图使用StringLocalizer <>从资源文件中获取所需的消息。我已经在Startup类中配置了本地化设置,如下所示:
internal static class LocalizationConfiguration
{
private const string ResourcesPath = "Resources";
private const string DefaultCulture = "en-US";
internal static IServiceCollection ConfigureLocalizationSettings(this IServiceCollection services) =>
services
.AddLocalization(options =>
options.ResourcesPath = ResourcesPath);
internal static IApplicationBuilder UseRequestLocalizationMiddleware(this IApplicationBuilder builder) =>
builder
.UseRequestLocalization(new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture(DefaultCulture),
SupportedCultures = new List<CultureInfo>
{
new CultureInfo(DefaultCulture)
}
});
}
我的解决方案包括几个项目。我需要在包含我的业务逻辑-xxx.Handlers的项目中使用StringLocalizer。我还创建了一个名为xxx.Resources的项目,用于存储包含两个目录的资源:
这是我的UserMessages类(它是空的虚拟类,紧随https://docs.microsoft.com/pl-pl/aspnet/core/fundamentals/localization?view=aspnetcore-3.1):
public class UserMessages
{
}
我将StringLocalizer注入到命令处理程序中,然后按如下方式使用它(UserConstants.UserNotFoundMessageKey可以):
var userEntity = await _userRepository.GetUserByIdAsync(command.UserId);
if (userEntity is null)
{
var message = _stringLocalizer[UserConstants.UserNotFoundMessageKey];
var statusCode = (int) HttpStatusCode.NotFound;
throw new CommandException(message, statusCode);
}
问题是,我的消息没有以适当的方式本地化,并且表达式“ _stringLocalizer [UserConstants.UserNotFoundMessageKey]”实际上返回UserNotFoundMessageKey的值,而不是位于资源文件中的消息。我究竟做错了什么??如何正确定位这些消息?
这是有关如何在单独的项目中创建共享资源的完整工作解决方案:
在ProjectA中(SharedResource3_1
在我的解决方案中):
1.Shared
使用UserMessages
class创建Resources
文件夹并使用Shared.UserMessages.en-US.resx
file创建文件夹(不知道为什么创建Shared.UserMessages.en-US.Designer.cs
,但似乎没有用):
UserMessages.cs
:
namespace SharedResource3_1.Shared
{
public class UserMessages
{
}
}
Shared.UserMessages.en-US.resx
:
在ProjectB中(MvcCore3_1
在我的解决方案中):
1.将项目参考添加到ProjectA:
Right-click
ProjectB Dependencies
,Add Project Reference
然后选择,然后选择ProjectA:
然后您可以获取如下参考:
2.Startup.cs:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews();
//add this...
LocalizationConfiguration.ConfigureLocalizationSettings(services);
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
//add this...
LocalizationConfiguration.UseRequestLocalizationMiddleware(app);
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
}
}
internal static class LocalizationConfiguration
{
private const string ResourcesPath = "Resources";
private const string DefaultCulture = "en-US";
internal static IServiceCollection ConfigureLocalizationSettings(this IServiceCollection services) =>
services
.AddLocalization(options =>
options.ResourcesPath = ResourcesPath);
internal static IApplicationBuilder UseRequestLocalizationMiddleware(this IApplicationBuilder builder) =>
builder
.UseRequestLocalization(new RequestLocalizationOptions
{
DefaultRequestCulture = new RequestCulture(DefaultCulture),
SupportedCultures = new List<CultureInfo>
{
new CultureInfo(DefaultCulture)
}
});
}
3.HomeController:
using SharedResource3_1.Shared; //add the reference for the UserMessages in ProjectA
public class HomeController : Controller
{
private readonly IStringLocalizer<UserMessages> _stringLocalizer;
public HomeController(IStringLocalizer<UserMessages> stringLocalizer)
{
_stringLocalizer = stringLocalizer;
}
public IActionResult Index()
{
ViewBag.data = _stringLocalizer["cześć"]; //the key name should be the Name in your resx file...
return View();
}
}
结果:
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句