Asp.net 在MVC4中实现多语言(本地化)的最佳方式(性能)是什么?

Asp.net 在MVC4中实现多语言(本地化)的最佳方式(性能)是什么?,asp.net,asp.net-mvc,asp.net-mvc-4,localization,Asp.net,Asp.net Mvc,Asp.net Mvc 4,Localization,我用asp.NETMVC4构建了自己的cms,我想让它成为多语言的 我考虑在这些行的数据库中创建表: id、名称、语言、值 然后创建一个助手来检查正确的语言,然后给出正确的名称值 @html.L("Newsletter.Title") 顺便问一下,我听说了.resx文件,那么什么是最好的方法呢?(表演) 有没有一种方法可以使用web而不是在visual studio中处理这些文件 我想让用户(不知道什么是.rest文件、编程等)能够添加语言并在web上进行翻译。就性能而言,使用资源文件(.re

我用asp.NETMVC4构建了自己的cms,我想让它成为多语言的

我考虑在这些行的数据库中创建表: id、名称、语言、值

然后创建一个助手来检查正确的语言,然后给出正确的名称值

@html.L("Newsletter.Title")
顺便问一下,我听说了.resx文件,那么什么是最好的方法呢?(表演) 有没有一种方法可以使用web而不是在visual studio中处理这些文件


我想让用户(不知道什么是.rest文件、编程等)能够添加语言并在web上进行翻译。

就性能而言,使用资源文件(.resx)很难击败,因为这些文件实际上是服务器上的XML文件-您不必往返于数据库获取本地化文本

系统使用具有关联文本值的键,并为每个支持的区域设置使用单独的resx文件

为了使用这些字符串,可以使用如下强类型类-

<h1>@WebResources.Page_Title_String</h1>

<p>@WebResources.Intro_Paragraph</p>
@WebResources.Page\u Title\u字符串
@WebResources.Intro_段

这使得您可以轻松地将站点发送到不同的语言中进行翻译,因为所有字符串都位于一个位置,并且有很多工具可用于处理VisualStudio内外的文件。甚至有可能

由于这实际上是一个XML文件,因此您可以使用Linq to XML轻松地对其进行操作,以创建一个web界面来更改文本(如果需要)。我见过至少两种商业产品使用这种方法对产品文本进行本地化和定制


有关资源文件的更多详细信息,请参阅和。

我认为resx文件非常适合本地化“静态”资源,如按钮、导航等,而不是真正的动态内容,如页面上的文本。但这总是取决于你的CMS是用来做什么的。我知道的几乎每一个CMS都将数据保存在数据库中。它只是比.resx文件更灵活。

但无论如何,不要建立自己的CMS。你为什么要这么做?有大量高度优化的CMS。

为了获得最佳性能,您必须混合使用资源文件(用于静态内容)和本地化数据库字符串(用于动态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));
            }
        }
    }
}
本地化属性:

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));
            }
        }
    }
}

一旦实现了该框架,当前线程将具有适当的本地化设置,因此将自动选择本地化的资源文件。你所要做的就是查询数据库中最适合当前线程本地化设置的本地化内容(如果可用)。

我建立自己的cms是出于一些原因我建立自己的cms是出于一些原因,首先:我想学习mvc,我想成为一名专业程序员(我才24岁)。2) 我喜欢挑战和用我的大脑“工作”,还有。3) 我对cms如何工作以及如何使用它有更多的了解。4.)性能-我完全可以控制,并且知道每个文件的目的。。。不管怎样,我会用桌子。你们有什么指南或示范吗,我怎么用桌子呢?特别是模型的验证,不是真的。但是有两种方法:或者每种语言都有一个列,或者在每个条目中都有两个字段将它们组合在一起并指定语言。不知道你说的验证是什么意思?