在mvc 4中制作多语言(本地化)的最佳方式(性能)是什么?

时间:2013-07-14 15:18:24

标签: asp.net asp.net-mvc asp.net-mvc-4 localization

我使用asp.net mvc 4构建自己的cms,我想让它成为多语言

我想过在这些行的数据库中创建表: id,名称,语言,价值

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

@html.L("Newsletter.Title")

顺便说一句,我听说过.resx文件,那么最好的方法是什么? (性能) 有没有办法使用网络处理这些文件,而不是在Visual Studio中进行处理?

我希望为用户添加功能(不知道什么是.rest文件,编程等等。)可以添加语言并在网络中进行翻译。

3 个答案:

答案 0 :(得分:1)

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

系统使用具有关联文本值的键,并为每个支持的语言环境使用单独的resx文件。

为了使用这些字符串,您可以使用类似强类型的类 -

<h1>@WebResources.Page_Title_String</h1>

<p>@WebResources.Intro_Paragraph</p>

这使您可以轻松地将您的网站发送到不同的语言,因为所有字符串都在一个地方,并且有很多工具可用于处理Visual Studio内部和外部的文件。甚至可以translate the file using Bing to give your translator a head start

由于这实际上是一个XML文件,您可以使用Linq to XML轻松地操作它,以创建一个Web界面来根据需要更改文本。我已经看到至少有几种商业产品使用这种方法来进行产品文本的本地化和定制。

有关资源文件的详细信息,请参阅ASP.NET Web Page Resources OverviewHow to: Create Resource Files for ASP.NET Web Sites

答案 1 :(得分:1)

我认为resx文件非常适合本地化“静态”资源,如按钮,导航等,但不是真正的动态内容,如页面上的文本。但它总是取决于您的CMS用途。几乎我知道的每个CMS都将数据保存在数据库中。它比.resx文件更灵活。
但无论如何,不​​要建立自己的CMS。你为什么要那样做?有很多高度优化的CMS。

答案 2 :(得分:0)

为了获得最佳性能,您必须混合资源文件(用于静态内容)和本地化DB字符串(用于动态CMS创建的内容)。

您可以使用我在博客上described in this guide的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));
            }
        }
    }
}

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