【问题标题】:MVC 6 : how to use RESX files?MVC 6:如何使用 RESX 文件?
【发布时间】:2015-07-30 10:32:31
【问题描述】:

我正在尝试将现有的 ASP.NET MVC 5 项目迁移到 MVC 6 vNext 项目,虽然我已经能够解决并解决大部分问题,但我似乎找不到任何有关如何使用 RESX 的文档MVC 6 中用于本地化的资源文件

我的 ViewModel 正在使用类似

的语句
 [Required(ErrorMessageResourceType = typeof(Resources.MyProj.Messages), ErrorMessageResourceName = "FieldRequired")]

只要正确包含 RESX 并且正确设置访问修饰符,这在 MVC 5 中运行良好,但在 vNext 项目中似乎不起作用 有谁知道如何在 MVC 6 vNext 项目中使用 RESX?

我在这里和 GIT 中心网站上看到了一些帖子,其中说 ASP.NET 5 / MVC 6 的本地化故事已经完成,但我找不到任何使用资源字符串的合适示例。

使用上面的代码给我一个错误

错误 CS0246 找不到类型或命名空间名称“资源” (您是否缺少 using 指令或程序集引用?)

编辑:更改文本以澄清我正在寻找在 vNext (MVC 6) 项目中实现本地化,我能够使其在 MVC 5 中工作。

编辑 2:在实施 Mohammed 的答案后,本地化位开始工作,但我现在遇到了一个新错误。

一旦我包含

  "Microsoft.AspNet.Localization": "1.0.0-beta7-10364",
    "Microsoft.Framework.Localization": "1.0.0-beta7-10364",

打包并在 Startup.cs 的 ConfigureServices 中添加以下行

   services.AddMvcLocalization();

执行以下代码时出现新错误。

  public class HomeController : Controller
    {
        private readonly IHtmlLocalizer _localizer;

        public HomeController(IHtmlLocalizer<HomeController> localizer)
        {
            _localizer = localizer;
        }
          ....

错误:

处理请求时发生未处理的异常。

InvalidOperationException:无法解析服务类型 'Microsoft.Framework.Runtime.IApplicationEnvironment' 尝试 激活 'Microsoft.Framework.Localization.ResourceManagerStringLocalizerFactory'。 Microsoft.Framework.DependencyInjection.ServiceLookup.Service.CreateCallSite(ServiceProvider 提供者,ISet`1 callSiteChain)

无法确定它是我缺少的依赖还是代码中存在问题

编辑 3:

致任何仍在寻找解决方案的人。此时,您可以使用 Muhammad Rehan Saee 的答案中的代码在您的 CSHTML 中获得本地化支持。然而,在验证属性中启用本地化的故事尚未完成(在本次编辑时:2015 年 9 月 8 日) 在 GITHUB 网站上查看以下 mvc 的问题:

https://github.com/aspnet/Mvc/issues/2766#issuecomment-137192942

PS : 为了修复 InvalidOperationException 我做了以下操作

以所有依赖为beta7-*并清除所有内容 我的 C:\Users\.dnx\packages 摆脱了错误。

关于我提出的问题的详细信息:

https://github.com/aspnet/Mvc/issues/2893#issuecomment-127164729

编辑:2015 年 12 月 25 日

现在终于可以在 MVC 6 中使用了。

在这里写了一篇快速的博文:http://pratikvasani.github.io/archive/2015/12/25/MVC-6-localization-how-to/

【问题讨论】:

  • @Coulton:我可以在我现有的 MVC 5 项目中使用 RESX,就像你在上面的链接中提到的那样,我的问题是在新的 vNext 项目的 MVC 6 中不起作用。我正在寻找一种在 MVC 6 中使用现有 Resx 文件的方法

标签: asp.net-mvc asp.net-core asp.net-core-mvc


【解决方案1】:

您可以查看 ASP.NET MVC GitHub 项目 here 上的完整示例。在撰写本文时,这都是非常新的代码,可能会发生变化。您需要将以下内容添加到您的启动中:

public class Startup
{
    // Set up application services
    public void ConfigureServices(IServiceCollection services)
    {
        // Add MVC services to the services container
        services.AddMvc();
        services.AddMvcLocalization();

        // Adding TestStringLocalizerFactory since ResourceStringLocalizerFactory uses ResourceManager. DNX does
        // not support getting non-enu resources from ResourceManager yet.
        services.AddSingleton<IStringLocalizerFactory, TestStringLocalizerFactory>();
    }

    public void Configure(IApplicationBuilder app)
    {
        app.UseCultureReplacer();

        app.UseRequestLocalization();

        // Add MVC to the request pipeline
        app.UseMvcWithDefaultRoute();
    }
}

IStringLocalizerFactory 似乎用于从 resx 类型创建 IStringLocalizer 的实例。然后,您可以使用IStringLocalizer 获取本地化字符串。这是完整的界面(LocalizedString 只是一个名称值对):

/// <summary>
/// Represents a service that provides localized strings.
/// </summary>
public interface IStringLocalizer
{
    /// <summary>
    /// Gets the string resource with the given name.
    /// </summary>
    /// <param name="name">The name of the string resource.</param>
    /// <returns>The string resource as a <see cref="LocalizedString"/>.</returns>
    LocalizedString this[string name] { get; }

    /// <summary>
    /// Gets the string resource with the given name and formatted with the supplied arguments.
    /// </summary>
    /// <param name="name">The name of the string resource.</param>
    /// <param name="arguments">The values to format the string with.</param>
    /// <returns>The formatted string resource as a <see cref="LocalizedString"/>.</returns>
    LocalizedString this[string name, params object[] arguments] { get; }

    /// <summary>
    /// Gets all string resources.
    /// </summary>
    /// <param name="includeAncestorCultures">
    /// A <see cref="System.Boolean"/> indicating whether to include
    /// strings from ancestor cultures.
    /// </param>
    /// <returns>The strings.</returns>
    IEnumerable<LocalizedString> GetAllStrings(bool includeAncestorCultures);

    /// <summary>
    /// Creates a new <see cref="ResourceManagerStringLocalizer"/> for a specific <see cref="CultureInfo"/>.
    /// </summary>
    /// <param name="culture">The <see cref="CultureInfo"/> to use.</param>
    /// <returns>A culture-specific <see cref="IStringLocalizer"/>.</returns>
    IStringLocalizer WithCulture(CultureInfo culture);
}

最后你可以像这样将IStringLocalizer注入你的控制器(注意IHtmlLocalizer&lt;HomeController&gt;继承自IStringLocalizer):

public class HomeController : Controller
{
    private readonly IHtmlLocalizer _localizer;

    public HomeController(IHtmlLocalizer<HomeController> localizer)
    {
        _localizer = localizer;
    }

    public IActionResult Index()
    {
        return View();
    }

    public IActionResult Locpage()
    {
        ViewData["Message"] = _localizer["Learn More"];
        return View();
    }
}

【讨论】:

  • 感谢您的信息,我现在了解他们在资源处理方面的尝试,不幸的是我遇到了另一个问题。似乎软件包中存在冲突一旦我添加“Microsoft.Framework.Localization”:“1.0.0-beta7-10364”作为依赖项,我就开始收到错误:找不到方法:' Boolean Microsoft.Framework.DependencyInjection.ServiceCollectionExtensions.TryAdd 您之前是否见过此错误?
  • 我尽可能使用 beta7。实际上,我也尝试过使用 beta5 版本的 Microsoft.Framework.Localization。这似乎也不起作用 :( 令人惊讶的是 MVC 6 缺少这么多基本功能。我希望他们会在 RTM 之前清除其中的一些
  • 最好坚持使用所有软件包的一个版本。我认为本地化是在 Beta 6 或 7 中引入的。MVC 6 将在 11 月完成,还有很长的路要走。
  • 这方面有什么更新吗?我认为本地化应该在现在发布的 beta7 中准备好,但它似乎仍然非常缺乏。即使使用最新的工具更新,vs2015 也没有添加 .resx 文件的选项。我希望能够将类库用于 resx 文件,并能够使用 razor 中的 @MyResources.FooLabel 之类的语法从控制器以及视图中引用这些文件。那有可能吗?本地化何时真正可以使用?
  • @JoeAudette :本地化故事仍在完成中。虽然现在您可以编译 Muhammad 提到的本地化资源,但您仍然不能在验证属性中使用本地化字符串。看看这个github.com/aspnet/Mvc/issues/2766#issuecomment-137192942
【解决方案2】:

在 mvc 6.0.0-rc1-final 中有所改变。在浏览了许多其他论坛之后,如果有人计划使用本地化功能的最新更改,则以下配置将起作用。

在 startup.cs 中配置

public void ConfigureServices(IServiceCollection services)
    {           
        services.AddMvc();           
        services.AddMvc().AddViewLocalization().AddDataAnnotationsLocalization();
        services.AddSingleton<IStringLocalizerFactory, CustomStringLocalizerFactory>();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {           
        var requestLocalizationOptions = new RequestLocalizationOptions
        {                
            SupportedCultures = new List<CultureInfo>{
                new CultureInfo("en-US"),    
                new CultureInfo("fr-CH")
            },
            SupportedUICultures = new List<CultureInfo>
            {
                new CultureInfo("en-US"),                    
                new CultureInfo("fr-CH")                    
            }
        };
        app.UseRequestLocalization(requestLocalizationOptions, new RequestCulture(new CultureInfo("en-US")));           
    }

您可以开始在控制器中使用 IHtmlLocalizer。

您可以使用查询字符串http://localhost:5000/Home/Contact?culture=fr-CH 进行测试,或者通过在“语言和输入设置”下添加首选语言来更改 chrome 中的文化

【讨论】:

  • 为什么要发布不完整的代码?因为什么时候跳过CustomStringLocalizerFactory 被认为是不相关的?
猜你喜欢
  • 2021-04-30
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-03
相关资源
最近更新 更多