SITECORE MANIA 開発者向け技術ブログ

カスタムパイプライン

新藤

新藤

言語のURLを置き換える方法

今回は言語のURL(「/ja-JP/」や「/en/」)を別のURLに置き換える方法を説明します。
例として「/ja-JP/」を「/」に置き換えたいと思います。

1.LanguageResolverのオーバーライド

LanguageResolverをオーバーライドし、言語URLがないかつ言語クエリがない場合、デフォルト言語を見に行くクラスを作成します。

using Sitecore.Pipelines.HttpRequest;
using Sitecore.Web;
using Sitecore.Data.Managers;
using Sitecore.Globalization;

public class MyLanguageResolver : HttpRequestProcessor
{
  private Language GetQStringLang(HttpRequest request)
  {
    // 言語宣言
    Language language;
    // クエリの"sc_lang"の値を取得
    string str = request.QueryString["sc_lang"];
    // 値が取れなかったら null を返す
    if (string.IsNullOrEmpty(str)) return null;

    // 言語に変換ができなかったら null を返す
    if (!Language.TryParse(str, out language)) return null;

    // 言語を返す
    return language;
  }

  private Language GetLanguageFromRequest(HttpRequest request)
  {
    // クエリから言語を取得
    Language qsLang = GetQStringLang(request);
    // 取得できたら言語を返す
    if (qsLang != null) return qsLang;

    // URLから言語取得して返す
    return Context.Data.FilePathLanguage;
  }

  public override void Process(HttpRequestArgs args)
  {
    // リクエストから言語を取得
    Language languageFromRequest = this.GetLanguageFromRequest(args.Context.Request);
    // 言語が取得できたら取得した言語を、できなかったらデフォルト言語をコンテキスト言語に代入
    Context.Language = languageFromRequest != null ? languageFromRequest : LanguageManager.DefaultLanguage;
  }
}

2.LinkProviderのオーバーライド

LinkProviderをオーバーライドし、日本語コンテンツへのリンクを「/」に置き換えるクラスを作成します。

using Sitecore.Links;
using System.Text.RegularExpressions;

public class MyLinkProvider : LinkProvider
{
  public override string GetItemUrl(Sitecore.Data.Items.Item item, UrlOptions options)
  {
    // アイテムのURLを取得
    var url = base.GetItemUrl(item, options);
    // URLの「/ja-JP/」を「/」に置換
    url = url.Replace("/ja-JP/", "/");
    // TOPへのリンクを置換(※ここの置換はサイトごとに変更してください)
    url = url.Replace("/ja-JP.aspx", "/");
    // URLを返す
    return url;
  }
}

3.Web.configの変更

作成したクラスを適用するためにWeb.configを変更します。

// LanguageResolver設定
// 変更前
<processor type="Sitecore.Pipelines.HttpRequest.LanguageResolver, Sitecore.Kernel"/>
// 変更後
<processor type="[namespace].[クラス名], [アセンブリ名]"/>

// LinkProvider設定
// 変更前
<add name="sitecore" type="Sitecore.Links.LinkProvider, Sitecore.Kernel" ... />
// 変更後
<add name="sitecore" type="[namespace].[クラス名], [アセンブリ名]" languageEmbedding="always" ... />

※今回の例ではLinkProvider設定のすべてのリンクに言語URLを付与する設定(languageEmbedding=”always”)を忘れずにしてください。



※エントリーの内容・画像等は、公開時点での情報に基づきます。
※Sitecoreのバージョンによって実装されている機能が異なります。

この記事を読んだ人はこちらの記事も読んでます

Sitecore導入に関するご相談・資料ダウンロード

導入をご検討・ご依頼の方や、サービスについてご不明点がございましたらお気軽にお問い合わせください。

Sitecoreの運用問題を解決する

既にSitecoreを導入しているお客様向けサービス