今回は言語の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のバージョンによって実装されている機能が異なります。