首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于如何实现特定语言页面CMS的思考

关于如何实现特定语言页面CMS的思考
EN

Stack Overflow用户
提问于 2012-12-26 22:13:54
回答 2查看 123关注 0票数 1

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

这并不是问题所在。

问题是我应该如何为这些页面建立我的表格。我已经做了我的数据库设计,但没有考虑到网页的一部分。

对于页面(称为网页)和特定于语言或文化的信息(称为Webpages_local),我已经有了下表结构,这些信息在所有语言中都是相等的。

属性是,可以添加或删除,这样我就可以轻松、动态地执行CRUD操作了?

我使用具有以下url结构的MVC4剃刀语法

代码语言:javascript
复制
url: "{language}/{controller}/{action}/{id}"

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

也许可以使用url的控制器部分,并将其作为键保存在我的网页表和筛选器以及所选的语言上?

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

从技术上讲,我该怎么做?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-27 00:31:26

我将使用OnActionExecuting来处理检索lang进程,如下所示:

代码语言:javascript
复制
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,如下所示:

代码语言:javascript
复制
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);
}

出于SEO的原因,我建议您定义一条路线,如:

代码语言:javascript
复制
    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)" }
   );

给你的网址是:

代码语言:javascript
复制
/nl/p/about/1 //the p is just an identifier for 'page', to differentiate this routes from others
票数 0
EN

Stack Overflow用户

发布于 2012-12-26 22:23:22

我将添加一个名为language或类似于您的表的列,而不是有多个表。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14046890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档