サンドボックス ソリューションで Web パーツのタイトル、説明、グループ、quickadd グループをローカライズする方法
-
22-10-2019 - |
質問
他の同様の質問も見ました( これです)、Microsoft のドキュメントを確認しました(ページに由来するものやページに関連するすべてのドキュメントと同様) SharePoint 2010 のサンドボックス ソリューションのローカリゼーション)、その他の記事 (ジョン・パウエル そして SPビット).
とにかく、次の問題を解決できません。
コードのみの Web パーツを備えた VS2010 に SP2010 サンドボックス ソリューションがある、 Web パーツのタイトル、説明をローカライズするにはどうすればよいですか (.webpart ファイル内)、 グループ、QuickAddGroup (要素.xml)?
みんな、ありがとう
その他の注意事項:
コードによって機能のタイトルと説明、Web パーツのコンテンツをローカライズできます (例:一部のラベルのテキスト)。ユーザーがブラウザーで Web パーツのプロパティを編集するときに、Web パーツのプロパティをローカライズするためのカスタム属性についても認識しています。
SP2007 では、Visual Studio のランダムな魔法 (BuildAction + CopyToOutput + CustomTool + 配置場所 + 配置タイプ + マニフェストの編集 ...) を使用して、これを行うことができました。方法は聞かないでください :) )が、これらのオプションのほとんどはサンドボックス ソリューションでは利用できません。
編集
ドキュメントを再読した結果、次のことに気づきました このメモ これにより、少なくとも .webpart ファイルに最後の単語が追加されます。
サンドボックス ソリューションの .webpart ファイル内の文字列は、ローカライズされたリソース ファイルがファーム ソリューションの一部としてファイル システムに個別にインストールされている場合にのみローカライズできます。サンドボックス ソリューションを作成するほとんどの状況では、ターゲット ファームにファーム ソリューションをインストールする権限がないことが原因です。このような場合、サンドボックス ソリューションで .webpart ファイルをローカライズする実際的な方法はありません。これは、Web パーツ ギャラリーの Web パーツの名前がすべての言語のサイトで同じであることを意味します。
これを少なくともプログラム的に行う方法に関するヒント。機能イベント レシーバーのギャラリーに Web パーツを追加することでしょうか?
解決
ハイブリッド アプローチの一部としてリソース ファイルを含むファーム ソリューションをインストールすることはできないと思いますか?可能であれば、これで問題は回避されます。
そうでない場合:(すでにご存知でしたら申し訳ありません) ご存知かと思いますが、.webpart (または .dwp) ファイルで参照されるリソースは次のようになります。「$リソース:コア、webparttitle;」 「core」はリソースファイル名を指し、「webparttitle」はリソース文字列名を指します。これらのリソースは、.webpart ファイルが機能の一部として展開されるときに解決され、ルート サイトには Web パーツ ギャラリーが存在するため、ルート サイトの言語を調べることによって解決されます。これは、サイトにプロビジョニングする時点で 1 回限りのヒットです。
サンドボックスでは、サーバーにインストールされたリソース ファイルのみを参照でき、サンドボックス ソリューションの一部としてデプロイされたリソースは参照できません。したがって、これを回避する唯一の方法は、Feature Receiver のようなコードを使用することのようです。機能がアクティブ化されたら、Web パーツ ギャラリーで Web パーツ ファイルのハンドルを取得し (SPWeb.GetCatalog を使用)、単純な検索と置換を実行し、次の場所に格納されているリソース文字列を探してリソース参照をプログラム的に解決することをお勧めします。フィーチャーレシーバーアセンブリ。
他のヒント
私は Steve の回答と他のリンクに基づいて、必要な主要な手順を使用してこれを構築しています。次に来る人にとっては役立つかもしれません。間違っていたら修正してください。
- Web パーツ ギャラリーを SPList として取得するには、
GetCatalog(SPListTemplateType.WebPartCatalog)
- Web パーツに対応するリスト内の項目を見つけます。マッチングすることで
SPListItem.Name
- Web パーツ ファイルに基づいて XmlTextReader を作成します。
XmlReader xmlReader = new XmlTextReader(listItem.File.OpenBinaryStream());
- リーダーに基づいて XmlDocument を作成します。
XmlDocument xmlDoc = new XmlDocument(xmlReader)
- 次のドキュメントに基づいて XPathNavigator を作成します。
XPathNavigator navigator = xmlDoc.CreateNavigator()
- 次のコマンドを使用して、Web パーツ タイトルの単一の XPathNavigator ノードを取得します。
XPathNavigator titleNode = navigator.SelectSingleNode(titleXPath)
, ここで、titleXPath は「/webParts/webPart/data/properties/property[@name=Title]」です。 - ローカライズされたリソース + 自動生成クラスから取得した値を設定します。
titleNode.SetValue(MyResources.SomeClass.MyWebPartTitle)
- 6を繰り返します。と7。Web パーツの説明 (XPath は "/webParts/webPart/data/properties/property[@name=Description]")
- XmlDocument を次のように保存します。
xmlDoc.Save()
- これをすべて入れてください
FeatureReceiver.FeatureActivated
Web パーツを含む機能のメソッド。
この場合、Web パーツのタイトルをローカライズする簡単な方法は、リスト アイテムのタイトル フィールドを変更することです。
SPList catalog = web.GetCatalog(SPListTemplateType.WebPartCatalog);
SPQuery query = new SPQuery();
query.Query = string.Format( @"<Where><Eq><FieldRef Name='LinkFilename'/><Value Type='Computed'>{0}</Value></Eq></Where>", webPartName);
SPListItem webPartItem = catalog.GetItems(query).Cast<SPListItem>().FirstOrDefault();
webPartItem[SPBuiltInFieldId.Title] = WebPartsResources.Title;
webPartItem.Update();