我正在尝试使用.NET Core的新本地化功能,但在Microsoft提供的简单示例之外,https://docs.microsoft.com/en-us/aspnet/core/fundamentals/localization#resource-file-naming。
我将控制器放在一个单独的项目ProjectA.Controllers中,而我在一个公共项目ProjectB.Localization中有一个共享资源类。我按照文档中的规定配置了我的启动类。
我不清楚如何命名我的资源文件以及准确放置它的位置。我已将选项存储在目录" Resources"中。是在我的SharedResource类的Web项目或ProjectB.Localization中吗?文档说如果它是一个单独的程序集,则应使用完整的命名空间。所以我给它起了名字," WorldCart.Facilities.Localization.SharedResource.es.resx"并将其放在网站的资源文件夹中。
当我运行网络应用程序,并在家庭控制器中调试时,我没有得到翻译的字符串,我得到英文版。
有什么想法吗?
答案 0 :(得分:4)
答案很晚,但可能会帮助某人... 我遇到过类似的情况,我必须将资源文件放在单独的通用程序集中,而不是将其放在邮件web / api项目(Core 2.1)中。原因是,我可能正在使用来自诸如Business或DAL层的其他程序集的本地化资源来引发警告/错误/信息消息。这就是我所做的:
假设我的Web项目名称空间为MyApp.Web
,而我的资源位于单独的类lib MyApp.Resources
中。在资源库中,创建一个文件夹(可选),说“ Messages”并创建一个类Messages.cs
。在遵循命名约定的同一文件夹内创建资源文件。例如Messages.fr.resx
。
在主项目的ConfigureServices
方法中,添加没有任何资源路径*的本地化:
services.AddLocalization();
services.Configure<RequestLocalizationOptions>(
opts =>
{
/* your configurations*/
var supportedCultures = new List<CultureInfo>
{
new CultureInfo("en"),
new CultureInfo("fr")
};
opts.DefaultRequestCulture = new RequestCulture("en", "en");
// Formatting numbers, dates, etc.
opts.SupportedCultures = supportedCultures;
// UI strings that we have localized.
opts.SupportedUICultures = supportedCultures;
});
在Configure
方法中,添加app.UseRequestLocalization();
在您的控制器中,注入IStringLocalizer<Messages> localizer
,其中Messages
是您在资源库中创建的类。您所有的本地化资源将在localizer
对象(即localizer["your key or default text"]
)中可用。
ResourcePath
选项中不添加任何services.AddLocalization();
的原因是由于资源文件(Messages.fr.resx
)和哑类(Messages.cs
)在同一条道路上。框架将检查相对于我们在IStringLocalizer<>
中指定的类的资源文件。如果Messages.cs
位于MyApp.Resources
lib的根文件夹中,而资源文件位于文件夹“ xyz”内,则配置应为services.AddLocalization(ops => ops.ResourcesPath = "xyz");
更新-响应评论中的查询:
MVC视图
在MVC视图中,已记录的方法是使用IViewLocalizer
,但不支持资源共享。因此,您可以在视图中注入IStringLocalizer<>
以使用共享资源。例如:
@inject IStringLocalizer<Messages> localizer
<h2>Information - @localizer["Shared resource access in MVC Views"]</h2>
数据注释 为了在数据注释中使用共享资源,可以在服务中使用factory方法:
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_1)
.AddDataAnnotationsLocalization(options => {
options.DataAnnotationLocalizerProvider = (type, factory) =>
factory.Create(typeof(Messages));
});
其中Messages
中的typeof(Messages)
是您的共享资源虚拟类。