2

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

我想过在这些行的数据库中制作表:id,name,language,value

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

@html.L("Newsletter.Title")

顺便说一句,我听说过 .resx 文件,那么最好的方法是什么?(性能)并且有没有办法使用网络而不是在视觉工作室中处理这些文件?

我想为用户(不知道什么是 .rest 文件、编程等)添加功能,可以添加语言并将其翻译到网络中。

4

3 回答 3

1

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

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

为了使用这些字符串,您将使用像这样的强类型类 -

<h1>@WebResources.Page_Title_String</h1>

<p>@WebResources.Intro_Paragraph</p>

由于所有字符串都在一个位置,并且有大量工具可用于处理 Visual Studio 内部和外部的文件,因此可以轻松地将您的网站发送到不同的语言进行翻译。甚至可以使用 Bing 翻译文件,让您的翻译人员抢占先机

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

有关资源文件的更多详细信息,请参阅ASP.NET 网页资源概述如何:为 ASP.NET 网站创建资源文件。

于 2013-07-14T16:46:47.823 回答
1

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

于 2013-07-15T08:29:46.963 回答
0

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

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

于 2015-08-03T21:16:31.907 回答