【问题标题】:Globalization and localization in ASP.NET Core 2.0 shared satellite assembly and in main projectASP.NET Core 2.0 共享卫星程序集和主项目中的全球化和本地化
【发布时间】:2018-07-02 18:34:54
【问题描述】:

最近我开始了一个 ASP.NET Core 2.0 解决方案。我需要在一个项目中分离 ViewModels 类以与其他项目共享。每个视图模型类都有其 DataAnnotations 属性,我需要使用全球化和本地化。每个使用 ViewModels 项目作为参考的项目在 Resources/Controllers 和 Resources/Views 文件夹中也有自己的语言资源。

后端项目中的 LoginViewModel.cs 示例:

public class LoginViewModel
{
    [Required]
    [Display(Name ="UserName")]
    public string UserName { get; set; }

    [Required]
    [DataType(DataType.Password)]
    [Display(Name = "Password"))]
    public string Password { get; set; }
}

根据MSDN documentation,我可以创建一个 SharedResource 类和一个 SharedResource.es.resx(不是像 SharedResource.resx 这样的默认资源文件),并通过使用以下方法在主 ASP.NET 项目中设置自定义类 DataAnnotation localizer Provider ConfigureServices 中的代码:

services.AddLocalization(options => options.ResourcesPath = "Resources");
services.AddMvc()
            .AddDataAnnotationsLocalization(options =>
             {
                options.DataAnnotationLocalizerProvider = (type, factory) => factory.Create(typeof(Backend.Resources.SharedResources));
             });

在配置方法中:

var supportedCultures = new[]
        {
            new CultureInfo("es-CO")
        };

        app.UseRequestLocalization(new RequestLocalizationOptions()
        {
            DefaultRequestCulture = new Microsoft.AspNetCore.Localization.RequestCulture("en-US"),
            SupportedCultures = supportedCultures,
            SupportedUICultures = supportedCultures
        });

我尝试过之前提到的场景,但是当我运行应用程序时,使用 LoginViewModel 的登录 cshtml 会显示用户名和密码,而不是 SharedResource.es.resx 中的“Usuario”和“Contraseña”。 ¿ 不能在程序集中使用或注入 IStringLocalizer,所以我必须使用默认的资源文件?

我希望清楚!

【问题讨论】:

  • 您找到解决方案了吗?

标签: c# asp.net asp.net-mvc asp.net-core-2.0


【解决方案1】:

看着MSDN page you linked

资源文件命名

资源以其类的完整类型名称减去程序集名称来命名。例如,项目中的法语资源,其主程序集为 LocalizationWebsite.Web.dll 的类 LocalizationWebsite.Web.Startup 将被命名为 Startup.fr.resx。类LocalizationWebsite.Web.Controllers.HomeController 的资源将命名为Controllers.HomeController.fr.resx。如果目标类的命名空间与程序集名称不同,则需要完整的类型名称。例如,在示例项目中,ExtraNamespace.Tools 类型的资源将被命名为 ExtraNamespace.Tools.fr.resx

由于您的模型类被命名为 Backend.LoginViewModel 并且可能程序集名称为 Backend,因此对于默认区域性资源文件应命名为 LoginViewModel.resx,对于每个本地化区域性应命名为 LoginViewModel.<culture>.resx

在样例工程中,ConfigureServices方法将ResourcesPath设置为“Resources”,所以主控法语资源文件的工程相对路径为Resources/Controllers.HomeController.fr.resx。或者,您可以使用文件夹来组织资源文件。对于家庭控制器,路径为Resources/Controllers/HomeController.fr.resx。如果您不使用ResourcesPath 选项,.resx 文件将进入项目基目录。 HomeController 的资源文件将命名为 Controllers.HomeController.fr.resx。选择使用点还是路径命名约定取决于您希望如何组织资源文件。

此路径显然必须在主 AspNetCore 程序集内,否则将无法找到这些文件夹。

【讨论】:

  • NightOwl888,¿Backend.LoginViewModel.resx 必须驻留在后端项目的特定文件夹中? ¿ 我可以以这种方式直接使用资源:[Display(Name ="UserName")] 或其他方式:[Display(Name ="UserName", ResourceType = typeof(LoginViewModel))]?
  • 我的问题的重点是尝试解决以下情况:具有属性和数据注释的 ViewModel 位于与主项目不同的项目中,其中显示此类数据注释的 cshtml 通过标签显示名称自动显示在正确的语言,¿我应该把那个 resx 文件放在哪里来解析数据注释的语言?我希望主要的 ASP.NET 核心项目显示例如一个使用 LoginViewModel(在后端项目中)的 cshtml 视图,标签文本以正确的语言显示,例如:Display(Name="UserName")。
  • 我尝试过作为 MSDN 示例,但它不起作用。示例重点是 View Models 驻留在 Main ASP.NET 项目中的 Models 文件夹中。
猜你喜欢
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-28
  • 2017-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多