プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2017/12/13

多言語対応のための共通のリソースファイルの作成

event_note2017/12/13 4:50

ASP.NET Core (.NET Core) で多言語対応を行う際、共通のリソースファイルを参照したいことがあります。

例えば、DataAnnotations で Validation を行った場合のメッセージとか、メッセージ系は特に共通で使用したいと思うことが多いと思います。
ということで、試してみました。
尚、多言語対応の基本については以下の過去記事を参考にしてみてください。

環境

  • Visual Studio 2017
  • ASP.NET Core 2.0

前提

基本的な設定は済んでいるという前提です。
以下の記事を参考にしてください。

準備

リソースファイルの作成

リソースファイルを置く場所として指定したパス (ここでは Resource フォルダとします) にカルチャー毎のリソースファイルを作成します。
リソースファイルの名前は SharedResource とします。

英語だと SharedResource.en.resx、日本語だと SharedResource.ja.resx というような感じです。

ダミークラスの作成

共通のリソースファイルを使用するためには、それをまとめるためのダミークラスを作成する必要があるみたいです。
Resource フォルダに SharedResource.cs というダミークラスを作成し、以下のようなコードを書きます。

// Dummy class to group shared resources
namespace プロジェクト名
{
    public class SharedResource
    {
    }
}

namespace が違うと上手くローカライズされないので注意です。

使用方法

基本的に DI するだけで使用できます。

コントローラーでの使用方法

Controller では以下のように使用します。

private readonly IStringLocalizer<HomeController> localizer;
private readonly IStringLocalizer<SharedResource> sharedLocalizer;

public HomeController(IStringLocalizer<HomeController> localizer, IStringLocalizer<SharedResource> sharedLocalizer)
{
    this.localizer = localizer;
    this.sharedLocalizer = sharedLocalizer;
}

public IActionResult Index()
{
    ViewData["Message"] = localizer["hoge"];
    ViewData["Common"] = sharedLocalizer["piyo"];

    return View();
}

View での使用方法

View では以下のように使用します。

@using Microsoft.AspNetCore.Mvc.Localization
@inject IHtmlLocalizer<SharedResource> sharedLocalizer;

<!-- 中略 -->

<p>© 2017 - @sharedLocalizer["foo"]</p>

参考 URL