最高のパフォーマンスを実現するには、リソース ファイル (静的コンテンツ用) とローカライズされた DB 文字列 (CMS で作成された動的コンテンツ用) を混在させる必要があります。
これは、ブログのこのガイドで説明した ResourceFiles + LocalizationRoute + LocalizationAttribute GlobalFilter アプローチを使用して簡単に行うことができます。
ローカリゼーション ルート:
routes.MapRoute(
name: "DefaultLocalized",
url: "{lang}/{controller}/{action}/{id}",
constraints: new { lang = @"(\w{2})|(\w{2}-\w{2})" }, // en or en-US
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
ローカリゼーション属性:
public class LocalizationAttribute : ActionFilterAttribute
{
private string _DefaultLanguage = "en";
public LocalizationAttribute(string defaultLanguage)
{
_DefaultLanguage = defaultLanguage;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
string lang = (string)filterContext.RouteData.Values["lang"] ?? _DefaultLanguage;
if (lang != _DefaultLanguage)
{
try
{
Thread.CurrentThread.CurrentCulture =
Thread.CurrentThread.CurrentUICulture = new CultureInfo(lang);
}
catch (Exception e)
{
throw new NotSupportedException(String.Format("ERROR: Invalid language code '{0}'.", lang));
}
}
}
}
そのスケルトンを実装するとすぐに、現在のスレッドに適切なローカライズ セットが設定されるため、ローカライズされたリソース ファイルが自動的に選択されます。現在のスレッドのローカライズ設定に最も適したローカライズされたコンテンツ (利用可能な場合) を DB にクエリするだけです。