ASP.NET MVC5+EF6+EasyUI 管理后台の多言語化実装

多言語対応の実装手順

国際展開を視野に入れたシステム開発において、ASP.NET MVCアプリケーションに多言語対応を組み込む方法を解説します。本実装ではリソースファイルとルーティングによる言語切替を採用します。

  1. 言語リソースプロジェクトの作成

新しいクラスライブラリプロジェクト「App.Lang」を作成 以下のリソースファイルを追加

  BaseRes.resx(デフォルト:日本語)
  BaseRes.en.resx(英語版)

プロジェクトにSystem.Webの参照を追加

  1. カルチャ管理モジュールの実装 App.Admin.CoreにCultureAwareHttpModule.csを作成
using System;
using System.Web;
using System.Web.Routing;
using System.Globalization;
using System.Threading;

namespace App.Admin
{
    public class CultureAwareHttpModule : IHttpModule
    {
        private CultureInfo currentCulture;
        private CultureInfo currentUICulture;

        public void Dispose() { }

        public void Init(HttpApplication context)
        {
            context.BeginRequest += SetCulture;
            context.EndRequest += RestoreCulture;
        }

        private void SetCulture(object sender, EventArgs e)
        {
            currentCulture = Thread.CurrentThread.CurrentCulture;
            currentUICulture = Thread.CurrentThread.CurrentUICulture;

            var httpContext = new HttpContextWrapper(HttpContext.Current);
            var routeData = RouteTable.Routes.GetRouteData(httpContext);

            if (routeData?.Values.TryGetValue("lang", out object langObj) == true)
            {
                string lang = langObj.ToString();
                try
                {
                    var culture = new CultureInfo(lang);
                    Thread.CurrentThread.CurrentCulture = culture;
                    Thread.CurrentThread.CurrentUICulture = culture;
                }
                catch { }
            }
        }

        private void RestoreCulture(object sender, EventArgs e)
        {
            Thread.CurrentThread.CurrentCulture = currentCulture;
            Thread.CurrentThread.CurrentUICulture = currentUICulture;
        }
    }
}
  1. Web.config設定 ASP.NETバージョンに応じた設定

MVC3(IIS7以前)

<system.web>
  <httpModules>
    <add name="CultureAwareHttpModule" type="App.Admin.CultureAwareHttpModule,App.Admin"/>
  </httpModules>
</system.web>

MVC4以降

<system.webServer>
  <modules>
    <add name="CultureAwareHttpModule" type="App.Admin.CultureAwareHttpModule,App.Admin"/>
  </modules>
</system.webServer>
  1. ルーティング設定 RouteConfig.csを編集
public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Localization",
        "{lang}/{controller}/{action}/{id}",
        new { lang = "ja", controller = "Home", action = "Index", id = UrlParameter.Optional },
        new { lang = "^[a-zA-Z]{2}(-[a-zA-Z]{2})?$" }
    );

    routes.MapRoute(
        "Default",
        "{controller}/{action}/{id}",
        new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}
  1. ビューでの利用例 App.Langの参照を追加し、リソースをビューで利用
@using App.Lang

<div class="toolbar">
    @Html.ToolButton("btnSearch", "icon-find", BaseRes.Query, permission, "Search", true)
    @Html.ToolButton("btnAdd", "icon-plus", BaseRes.Create, permission, "Create", true)
    @Html.ToolButton("btnModify", "icon-edit", BaseRes.Edit, permission, "Edit", true)
    @Html.ToolButton("btnView", "icon-info", BaseRes.Detail, permission, "Detail", true)
    @Html.ToolButton("btnRemove", "icon-trash", BaseRes.Delete, permission, "Delete", true)
    @Html.ToolButton("btnExport", "icon-file", BaseRes.Export, permission, "Export", true)
</div>
  1. 現在の言語情報の取得
CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
string currentLang = cultureInfo.Name; // "ja" or "en"

URL生成例:

<a href="/@currentLang/Product/Create">新規作成</a>
<!-- 実際の表示例:/en/Product/Create -->

タグ: ASP.NET MVC5 Entity Framework 6 EasyUI 多言語対応 リソースファイル

7月12日 21:30 投稿