多言語対応の実装手順
国際展開を視野に入れたシステム開発において、ASP.NET MVCアプリケーションに多言語対応を組み込む方法を解説します。本実装ではリソースファイルとルーティングによる言語切替を採用します。
- 言語リソースプロジェクトの作成
新しいクラスライブラリプロジェクト「App.Lang」を作成 以下のリソースファイルを追加
BaseRes.resx(デフォルト:日本語)
BaseRes.en.resx(英語版)
プロジェクトにSystem.Webの参照を追加
- カルチャ管理モジュールの実装 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;
}
}
}
- 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>
- ルーティング設定 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 }
);
}
- ビューでの利用例 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>
- 現在の言語情報の取得
CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
string currentLang = cultureInfo.Name; // "ja" or "en"
URL生成例:
<a href="/@currentLang/Product/Create">新規作成</a>
<!-- 実際の表示例:/en/Product/Create -->