web-dev-qa-db-ja.com

MVC 6:RESXファイルの使用方法

既存のASP.NETMVC5プロジェクトをMVC6 vNextプロジェクトに移行しようとしていますが、ほとんどの問題を解決して解決することができましたが、RESXリソースファイルの使用方法に関するドキュメントが見つからないようです。 MVC6でのローカリゼーション

私のViewModelsは次のようなステートメントを使用しています

 [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)プロジェクトでのローカリゼーションの実装を探していることを明確にするためにテキストを変更しました。

編集2:モハメッドからの回答を実装した後、ローカリゼーションビットが機能するようになりましたが、新しいエラーで立ち往生しています。

含めたら

  "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.Localization.ResourceManagerStringLocalizerFactory」をアクティブ化しようとしているときに、タイプ「Microsoft.Framework.Runtime.IApplicationEnvironment」のサービスを解決できません。 Microsoft.Framework.DependencyInjection.ServiceLookup.Service.CreateCallSite(ServiceProviderプロバイダー、ISet`1 callSiteChain)

依存関係が欠落しているか、コードに問題があるかを判断できません

編集3:

まだ解決策を探している人に。この時点で、Muhammad Rehan Saeeによる回答のコードを使用して、CSHTMLでローカリゼーションサポートを取得できます。ただし、検証属性でローカリゼーションを有効にするためのストーリーはまだ完了していません(この編集の時点:2015年9月8日)以下のmvcのGITHUBサイトで問題を確認してください:

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日

これはついにMVC6で機能するようになりました。

ここに簡単なブログ投稿を書きました: http://pratikvasani.github.io/archive/2015/12/25/MVC-6-localization-how-to/

17
Pratik

ASP.NET MVC GitHubプロジェクトの完全なサンプルを見ることができます ここ 。執筆時点では、これは非常に新しいコードであり、変更される可能性があります。スタートアップに以下を追加する必要があります。

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<HomeController>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();
    }
}

Mvc 6.0.0-rc1-finalで変更されました。他の多くのフォーラムを通過した後、ローカリゼーション機能の最新の変更を処理することを計画している場合は、以下の構成が機能します。

Startup.csでconfigure

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の下に優先言語を追加して、カルチャを変更します「言語と入力設定」

3
Nishank