【问题标题】:How to set default language in Sitecore multilingual solution?如何在 Sitecore 多语言解决方案中设置默认语言?
【发布时间】:2014-01-10 12:33:56
【问题描述】:

我有一个 3 种语言(英语、es 和 fr)的 Sitecore 网站,用户可以通过网站上的切换开关更改语言。

web.config 站点部分,defaultLanguage 是“en”,但即使在此之后,当我转到 www.abc.com/es.aspx 之类的西班牙语版本时,如果我转到 www.abc.com (英文版)该网站仍然使用西班牙语。

知道如何将默认语言设置为英语吗?

【问题讨论】:

    标签: sitecore multilingual sitecore7


    【解决方案1】:

    假设您的 sites 配置包含

    <site ... language="en" ... />
    

    您可以定义自己的模块,为每个新会话将语言重置为默认语言。

    首先你需要创建模块类:

    using Sitecore.Globalization;
    using System;
    using System.Web;
    using System.Web.SessionState;
    
    namespace My.Assembly.Namespace
    {
      public class ResetLanguageModule : IHttpModule, IRequiresSessionState
      {
        public void Init(HttpApplication app)
        {
          if (app.Modules["Session"] != null)
          {
            SessionStateModule session = (SessionStateModule) app.Modules["Session"];
            session.Start += Session_Start;
          }
    
          app.BeginRequest += Application_BeginRequest;
        }
    
        private static void Application_BeginRequest(object sender, EventArgs e)
        {
          // if there is no referrer or user comes from external site
          if (HttpContext.Current.Request.UrlReferrer == null
            || HttpContext.Current.Request.UrlReferrer.Host != HttpContext.Current.Request.Url.Host)
          {
            // if user is on the root
            if (HttpContext.Current.Request.RawUrl == "/")
            {
              ResetLanguage();
            }
          }
        }
    
        private static void Session_Start(object sender, EventArgs e)
        {
          ResetLanguage();
        }
    
        private static void ResetLanguage()
        {
          if (Sitecore.Context.Language.Name != Sitecore.Context.Site.Language)
          {
            Language currentSiteLanugage;
            if (Language.TryParse(Sitecore.Context.Site.Language, out currentSiteLanugage))
            {
              Sitecore.Context.SetLanguage(currentSiteLanugage, true);
            }
          }
        }
    
        public void Dispose()
        {
        }
      }
    }
    

    然后在web.config注册模块:

    <system.webServer>
      <modules>
        ... all existing modules
        <add name="ResetLanguageModule" type="My.Assembly.Namespace.ResetLanguageModule, My.Assembly" />
      </modules>
    </system.webServer>
    

    当您打开浏览器并关闭选项卡并重新打开时,这可能不起作用,因为浏览器可能仍使会话保持活动状态。

    【讨论】:

    • 感谢 Maras,是否有一种方法可以检查是否也可以在新标签中使用。例如,只要网址是 www.abc.com,其中没有任何语言,它就会使用英文版的网站。
    • 我更新了我的答案。现在,当用户来自外部站点或只是在新选项卡中键入 url 时,语言将被重置。如果您想在用户每次访问站点根目录时重置语言(包括单击导航到 www.abc.com 的链接,只需删除检查 UrlReferrer。并且在更新的解决方案中不再需要使用 Session.Start。跨度>
    【解决方案2】:

    默认情况下,语言解析器会自动从 url 中定义的语言切换到 cookie 中存储的语言。 (在链接管理器的配置中称为 asNeeded)

    设置 languageEmbedding="always" 应该可以解决您的问题。

    另外:查看 John 的博客:http://www.sitecore.net/nederland/Community/Technical-Blogs/John-West-Sitecore-Blog/Posts/2010/11/Overriding-Sitecores-Logic-to-Determine-the-Context-Language.aspx

    【讨论】:

      【解决方案3】:

      在您的&lt;site&gt; 配置中,将language 属性设置为默认值。例如

      <sites>
        <site name="mysite" language="es-ES" ... />
      </sites>
      

      然后,您可以使用显示的路径进行切换,例如 /en/foo/es/foo 或者您甚至可以使用查询字符串来切换语言,例如:?sc_lang=en?sc_lang=es-ES

      详情请参阅this page

      【讨论】:

      • 我也在做同样的事情。但是,假设我关闭了我的网站并且我使用的是西班牙语版本的网站。如果我下次要在不清除 cookie 和缓存的情况下打开网站,它会转到西班牙语版本而不是默认语言的英语。
      • 这是设计使然。你只是自己说的。用户切换到西班牙语,因此 cookie 设置为“现在使用西班牙语”。默认并不意味着总是,默认意味着你第一次来,它设置为英语。一旦用户设置了西班牙语,他们就会被 cookie 保存下来。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-23
      • 2011-07-02
      • 2015-10-13
      • 1970-01-01
      相关资源
      最近更新 更多