【发布时间】:2017-08-18 00:37:12
【问题描述】:
按照this 关于如何使用 .NET Core 实现全球化和本地化的文档,我的目标是将我的所有资源存储在位于不同项目(类库)中的单个全局资源文件中。
项目 1 - Startup.cs
public class Startup
{
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true);
if (env.IsEnvironment("Development"))
{
builder.AddApplicationInsightsSettings(developerMode: true);
}
builder.AddEnvironmentVariables();
Configuration = builder.Build();
}
public IConfigurationRoot Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddApplicationInsightsTelemetry(Configuration);
services.AddLocalization(lo => lo.ResourcesPath = "/MYCLASSLIBRARY"); //External project ~ How?
services.AddMvc(config =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
config.Filters.Add(new AuthorizeFilter(policy));
});
services.Configure<RequestLocalizationOptions>(
opts =>
{
var supportedCultures = new List<CultureInfo>
{
new CultureInfo("en-US"),
new CultureInfo("sv-SE")
};
opts.DefaultRequestCulture = new RequestCulture(culture: "en-US", uiCulture: "en-US");
opts.SupportedCultures = supportedCultures;
opts.SupportedUICultures = supportedCultures;
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRequestLocalization(app.ApplicationServices.GetService<IOptions<RequestLocalizationOptions>>().Value);
app.UseMvc();
app.UseDefaultFiles();
app.UseStaticFiles();
}
}
项目 2 - 类库
项目 1 - 控制器
using MYCLASSLIBRARY; //External project
[Route("api/[controller]")]
public class HelloController : Controller
{
private readonly IStringLocalizer<Test> _localizer; //External project class
public OrganisationController(IStringLocalizer<Test> localizer)
{
_mapper = mapper;
_localizer = localizer;
}
[HttpGet("GetResource")]
public string GetResource()
{
return _localizer["Help"];
}
}
设置 ResourcesPath 时如何引用外部项目?
services.AddLocalization(lo => lo.ResourcesPath = "/MYCLASSLIBRARY");
【问题讨论】:
-
我假设您正在使用 .resx 文件。 Here 是一个以编程方式构建它们的链接。 .resx 文件的关键在于它们是嵌入的。 Another answer 试图解释这一点,但遗憾的是被否决了。不知道为什么本地化需要在单独的程序集中。也许,我错过了什么。
-
我不是在以编程方式构建资源之后,我只想在我的启动文件中注册外部资源:) 使用单独程序集的原因是因为我希望能够使用相同的资源从多个项目中检索资源,例如从 Web.WebApi 或我的中间层 Business.WebService(两个不同的项目)中检索资源。这两个项目都将引用资源类库。
-
您的“另一个答案”是一个 5 年前的问题。使用 mvc 5 及以下版本实现外部资源没有任何问题。 “虽然在 ASP.NET Core 中保留了每个文化一个 .resx 文件的概念,但使用资源的方式发生了很大变化。在以前的版本中,当您将 .resx 文件添加到您的解决方案中时,将创建一个设计器文件,通过 Resources.MyTitleString 等调用提供对资源的静态强类型访问。"
-
好的。我现在知道了。但是,我会质疑您的 DAL 是否需要承担该责任。归根结底,您的 UI/WebApi 层可能是应该进行演示的地方。我知道你要去哪里,但你可以通过将所有本地化/演示移动到它所属的层来简化事情。
-
好吧,我听到了,但是想象一下,如果我的 DAL 中有一个电子邮件服务,它有 100~ 个 SendEmail 功能。如果我将资源处理转移到我的 WebLayer 中,那就太混乱了。我将不得不在我的 WebLayer 中构建某种额外的 EmailService 来创建不同的电子邮件格式,然后将其传递给 DAL .. 我不知道这可能更好
标签: c# .net localization asp.net-core .net-core