2011-11-14 8 views
2

私は、en(デフォルト)とfr-CAの2つの言語がインストールされたsitecore 6.5を使用しています。ツリーにはenとfr-CAの両方の内容を持つ項目があります。アイテムが作成された後に言語の名前を変更しました

問題はフランスのURLがそれに「FR-CA」を持っていることであり、我々はそれが「FR」になりたい、例えば:

http://website.com/fr/page.aspx代わりのhttp://website.com/fr-CA/page.aspx

私はから言語の名前を変更しようとしました'fr-CA'から 'fr'に変更してURLを修正したが、コンテンツは古い言語 'fr-CA'を指しているので、en、fr、fr-CAという3つの言語が表示される。名前の変更を認識していません。

ご意見をいただければ幸いです。

おかげで、 タレク

答えて

5

問題は、あなたが..あなたが今frバージョンを作ることができますが、あなたが見ているように、これがある意味、言語の名前を変更することにより、固定することができないアイテムのfr-CAバージョンを作成しているあります3つの可能なバージョンになりました。

ひとつは、言語をSitecoreだけにして、リンクをどのように提供して処理するかを変更することです。

おそらく、自分のメソッドをSitecoreのhttpRequestBeginパイプラインに追加する必要があります。これは、LanguageResolverのエントリに従います。 RawUrlを解析し、Sitecore.Context.Langauge' to French if the first element in it matched/fr/`を設定することができます。

非常に迅速&汚い例:

public class MyLanguageResolver : HttpRequestProcessor 
{ 
    public override void Process(HttpRequestArgs args) 
    { 
     string languageText = WebUtil.ExtractLanguageName(args.Context.Request.RawUrl); 

     if(languageText == "fr") 
     { 
      Sitecore.Context.Language = LanguageManager.GetLanguage("fr-CA"); 
     } 
    } 
} 

おそらく、また、彼らはサイトコアによって解決されたときに、あなたのURLをフォーマットするweb.configファイルの<linkManager>セクションにLinkProviderを上書きする必要があります。

もう一つの非常に迅速な&汚い例:

public class MyLinkProvider : LinkProvider 
{ 
    public override string GetItemUrl(Sitecore.Data.Items.Item item, UrlOptions options) 
    { 
     var url = base.GetItemUrl(item, options); 
     url = url.Replace("/fr-CA/", "/fr/"); 
     return url; 
    }  
} 

もう一つの方法は、(それがスクリプトを介して実行する必要がありますよう、もう少し長いったらしい)へfr-CAバージョンからデータをコピーすることですfrのバージョンを確認し、各アイテムのfr-CAバージョンを削除します。あなたのコンテンツ項目に言語を更新するための別の方法を

private void CopyLanguage(ID id, Language sourceLanguage, Language destinationLanguage) 
    { 
     var master = Database.GetDatabase("master"); 

     var sourceLanguageItem = master.GetItem(id, sourceLanguage); 
     var destinationLanguageItem = master.GetItem(id, destinationLanguage); 

     using (new SecurityDisabler()) 
     { 
      destinationLanguageItem.Editing.BeginEdit(); 

      //for each field in source, create in destination if it does not exist 
      foreach (Field sf in sourceLanguageItem.Fields) 
      { 
       if (sf.Name.Contains("_")) continue; 

       destinationLanguageItem.Fields[sf.Name].Value = sf.Value; 
      } 

      destinationLanguageItem.Editing.AcceptChanges(); 

      ////Remove the source language version 
      ItemManager.RemoveVersions(sourceLanguageItem,sourceLanguage, SecurityCheck.Disable); 
     } 
    } 

をやろうとしているものも含む

ラフヘルパーメソッドは次のとおりです。

  1. 輸出FR-CA言語へa .xmlファイル(コントロールパネルの使用)
  2. .xmlファイルでは、allとタグをおよびで置き換えます。
  3. masterデータベースのfr-CA言語をfrに変更します。
  4. 。([コントロールパネル]から)xmlファイル
  5. ファイル名を指定して実行クリーンアップデータベースタスク

また、あなたはUnversionedFieldsとVersionedFieldsテーブル内のすべてのレコードのためのFRとFR-CAの言語を変更するSQLスクリプトを作成することができます。

これ以上の情報や例が必要な場合は、お知らせください。 :)

+0

ありがとう!私は詳細を本当に感謝します。私は上記のように 'fr-CA'を残し、自分の言語リゾルバとリンクマネージャを作成しました。さまざまな言語と言語のパラメータを扱うのは少し難解でしたが、うまく機能しました。 –

関連する問題