为了获得最佳性能,您必须混合资源文件(用于静态内容)和本地化数据库字符串(用于动态、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));
}
}
}
}
一旦您实现了该骨架,您当前的线程将具有正确的本地化设置,因此您的本地化资源文件将被自动选择。您所要做的就是在您的数据库中查询最适合当前线程本地化设置的本地化内容(如果可用)。