关于如何为语言特定页面实现CMS的想法

时间:2012-12-26 22:13:54

标签: database internationalization asp.net-mvc-4

我正在建立一个网上商店,我正在实施语言选择以及CMS。我还必须为网站管理员提供通过CMS编辑页面的方法。

其中没有问题。

问题是我应该如何为这些页面构建表格。我已经完成了数据库设计,但并不认为网页是完整的。

对于页面的所有语言(称为Webpages)以及语言或文化特定信息(称为Webpages_local),我已经拥有以下表格结构。 Snippet of database design

我可以添加或删除哪些属性,以便我可以轻松动态地执行CRUD操作?

我正在使用带有 razor语法 MVC4 以及以下网址结构:

url: "{language}/{controller}/{action}/{id}"

我现在主要担心的是,当访问者按下时,我不确定如何显示页面的语言特定内容,例如,指向“关于”页面的链接。

也许使用网址的控制器部分并将其保存为我的网页表格中的一个键并对其进行过滤以及选择的语言?

所以当访问者访问http://example.com/nl/About时,我在我的AboutController中检索“nl”和“about”,当然先过滤它们然后再查询数据库选择正确的nl内容吗?

我应该如何在技术上解决这个问题?

2 个答案:

答案 0 :(得分:0)

我会在你的表中添加一个名为language或类似的列,而不是有多个表。

然后,您的控制器可以在菜单表中找到所请求的语言键后获取正确的页面,然后它可以读取您的网页表中的内容。

答案 1 :(得分:0)

我会使用OnActionExecuting来处理检索lang过程,例如:

protected override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            #region set Language
            var lang = string.Empty;
            if (filterContext.RouteData.Values["lang"] != null && !string.IsNullOrWhiteSpace(filterContext.RouteData.Values["lang"].ToString()))
            {

                // set the culture from the route data (url {lang})
                lang = filterContext.RouteData.Values["lang"].ToString();
                switch (lang)
                {
                    case "es":
                        break;
                    case "en":
                        break;
                    default:
                        lang = "es";//default language
                        filterContext.RouteData.Values["lang"] = lang;
                        filterContext.HttpContext.Response.Redirect("/");
                        break;
                }

            }
            else
            {
                //set default language
                lang = "es";
                filterContext.RouteData.Values["lang"] = lang;
            }

            Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(lang);
            Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);

            #endregion

            base.OnActionExecuting(filterContext);
        }

然后在您的代码中的任何位置,您只需阅读Thread.CurrentThread.CurrentCulture(这将是您的全局lang指示符)即可显示正确的语言。

更新 - 知道我明白你的观点=)

如果页面将动态创建,那么每页不会有ActionResult,您只需要一个ActionResult:

public ActionResult ShowPage(int id,string slug)
{
   //Use the slug to check for url attacks and ensure 301 redirections to the correct url
   var page = db.Webpages_local.First(p=> p.id == id 
          && p.culture.name == Thread.CurrentThread.CurrentCulture);

   return View(page);
}

出于搜索引擎优化的原因,我建议您定义一条路线:

    routes.MapRoute(
       name: "LocalizedPages",
       url: "{lang}/p/{slug}/{id}",
       defaults: new { controller = "Page", action = "Show", id = UrlParameter.Optional },
       constraints: new { lang = @"(es|en|fr|nl)" }
   );

这给你的网址如下:

/nl/p/about/1 //the p is just an identifier for 'page', to differentiate this routes from others