チュートリアル: Visual Studio SharePoint アプリケーションのローカライズ
SharePoint アプリケーションのローカライズでは、ハードコーディングされた文字列を、ローカライズされた文字列値をリソース ファイルから取得する式およびステートメントに置き換えます。 このチュートリアルでは、SharePoint Web ページ アプリケーションのすべての文字列要素をローカライズする方法について説明します。
このチュートリアルでは、次のタスクについて説明します。
コードのローカライズ
ASPX マークアップのローカライズ
フィーチャーのローカライズ
必須コンポーネント
このチュートリアルを実行するには、開発コンピューターに次のコンポーネントが必要です。
サポート対象エディションの Microsoft Windows、SharePoint、Visual Studio。 詳細については、「SharePoint ソリューションの開発要件」を参照してください。
サポートする言語の SharePoint 2010 Language Pack。 Language Pack を使用すると、SharePoint で他の言語を使用できます。 詳細については、「SharePoint Foundation 2010 Language Pack」または「SharePoint Server 2010、Project Server 2010、Search Server 2010、および Office Web Apps 2010 用 2010 Server Language Pack」を参照してください。
「チュートリアル: SharePoint の Web パーツを作成する」で作成したプロジェクト。
次の概念に関する知識があると役に立ちますが、チュートリアルを実行するうえで必須というわけではありません。
Visual Studio アプリケーションのグローバライズとローカライズ。 詳細については、「アプリケーションのグローバライズとローカライズ」を参照してください。
ASP.NET アプリケーションのグローバライズとローカライズ。 詳細については、「ASP.NET のグローバリゼーションおよびローカリゼーション」を参照してください。
SharePoint ソリューションのグローバライズとローカライズ。 詳細については、「Localizing a Solution (ソリューションのローカライズ)」を参照してください。
SharePoint コードのローカライズ
SharePoint アプリケーションのコードでは、多くの場合、UI テキストの文字列がハードコーディングされています。 これらの文字列をローカライズするには、GetGlobalResourceObject の呼び出しに置き換えます。 このチュートリアルでは、まず、Web パーツ プロジェクトを変更します。
Web パーツ プロジェクトを変更するには
「チュートリアル: SharePoint の Web パーツを作成する」の手順を完了します。
Visual Studio に Web パーツ プロジェクトが読み込まれた状態で、Web パーツ プロジェクトにアプリケーション ページ プロジェクト項目を追加します。名前には既定の "ApplicationPage1.aspx" を使用します。
Web パーツ プロジェクトにリソース ファイル プロジェクト項目を追加します。 名前には既定の "Resource1.resx" を使用します。 [リソース ファイル] プロジェクト項目テンプレートは、[新しい項目の追加] ダイアログ ボックスの、言語のプロジェクト項目テンプレート フォルダーの下にあります。
リソース ファイルがリソース エディターで開かれます。
リソース エディターで、次の文字列 IDs と値を入力します。
文字列 ID
値
String1
Path to Employee Data File
String2
Location of the XML file that contains employee data
String3
Show Managers Only
String4
Shows only employees that are managers
String5
Show All Employees
String6
Employee List
String7
Display Employee List
String8
アプリケーション ページ
String9
My Application page description
ソリューション エクスプローラーで Resource1.resx のノードをクリックし、[編集] メニューの [コピー] をクリックして、Resource1.resx をコピーします。
ソリューション エクスプローラーで Web パーツのノードをクリックし、[編集] メニューの [貼り付け] をクリックします。
コピーされたファイルを右クリックし、[名前の変更] をクリックします。 ファイルの名前を "Resource1.ja-JP.resx" に変更します。
このファイルは、日本語のローカライズ リソース ファイルとして、後にサテライト アセンブリにコンパイルされて SharePoint に配置されます。
Resource1.ja-JP.resx をリソース エディターで開き、それぞれの値の前に JAPANESE という語を追加します。
たとえば、"Path to Employee Data File" は "JAPANESE Path to Employee Data File" になります。 実際のローカライズでは、これらの文字列が日本語に置き換えられます。
Resource1.resx と Resource1.ja-JP.resx の両方の [配置タイプ] プロパティを [AppGlobalResource] に変更します。
これにより、これらのファイルがサーバーの App_GlobalResources フォルダーに配置されて、そのリソースをすべての ASP.NET ベース プロジェクトで使用できるようになります。
注意
[配置タイプ] プロパティは、SharePoint プロジェクト項目に追加されたリソース ファイルに対してのみ表示されます。
Package.package をダブルクリックしてパッケージ デザイナーで開きます。
[詳細設定] をクリックし、[追加] をクリックして、[既存のアセンブリの追加] をクリックします。
[既存のアセンブリの追加] ダイアログ ボックスが表示されます。
プロジェクトをビルドして、ローカライズされたサテライト DLL を作成します。
[既存のアセンブリの追加] ダイアログ ボックスで、[ソース パス] の横にある省略記号 () ボタンをクリックして、ローカライズされたサテライト DLL を指定します。
このアセンブリ ファイルは、プロジェクト ディレクトリの \bin\debug\ja-JP にあります。
[配置ターゲット] オプションは [GlobalAssemblyCache] のままにしておきます。
[場所] ボックスで、場所のパスの先頭にカルチャ ID のフォルダーを追加します。 この例の場合は、既存の値を "jp-JA\Web part name.resources.dll" に変更します。 プロジェクトに複数のサテライト DLL がある場合は、この手順を各 DLL に対して繰り返します。
この手順が必要になるのは、同じ名前の 2 つのファイルをパッケージの同じフォルダーに配置することはできないからです。 カルチャ ID に基づくサブフォルダーを作成することにより、同じ名前のファイルをパッケージに含めることができます。
操作を終了したら、[OK] をクリックしてダイアログ ボックスを閉じます。
Web パーツ用のコード ページを開き、既存の Using ステートメントまたは Includes ステートメントを次のコードに置き換えます。
using Microsoft.SharePoint; using Microsoft.SharePoint.WebControls; using System; using System.ComponentModel; using System.Data; using System.Resources; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts;
既存の変数宣言と関数を次のコードに置き換えます。
private DataGrid grid; // Replaced: private static string verbText = "Show Managers Only"; private static string verbText = HttpContext.GetGlobalResourceObject("Resource1", "String3").ToString(); private Label errorMessage = new Label(); protected string xmlFilePath; // Replaced: WedDisplayName and WebDescription attribute strings. [Personalizable(PersonalizationScope.Shared), WebBrowsable(true), LocalizedWebDisplayName("String1"), LocalizedWebDescription("String2")] public string DataFilePath { get { return xmlFilePath; } set { xmlFilePath = value; } } protected override void CreateChildControls() { // Define the grid control that displays employee data in the Web Part. grid = new DataGrid(); grid.Width = Unit.Percentage(100); grid.GridLines = GridLines.Horizontal; grid.HeaderStyle.CssClass = "ms-vh2"; grid.CellPadding = 2; grid.BorderWidth = Unit.Pixel(5); grid.HeaderStyle.Font.Bold = true; grid.HeaderStyle.HorizontalAlign = HorizontalAlign.Center; // Populate the grid control with data in the employee data file. try { DataSet dataset = new DataSet(); dataset.ReadXml(xmlFilePath, XmlReadMode.InferSchema); grid.DataSource = dataset; grid.DataBind(); } catch (Exception x) { errorMessage.Text += x.Message; } // Add control to the controls collection of the Web Part. Controls.Add(grid); Controls.Add(errorMessage); base.CreateChildControls(); } public override WebPartVerbCollection Verbs { get { WebPartVerb customVerb = new WebPartVerb("Manager_Filter_Verb", new WebPartEventHandler(CustomVerbEventHandler)); customVerb.Text = verbText; // Replaced: Hard-coded description with localized string. customVerb.Description = HttpContext.GetGlobalResourceObject("Resource1", "String4").ToString(); WebPartVerb[] newVerbs = new WebPartVerb[] { customVerb }; return new WebPartVerbCollection(base.Verbs, newVerbs); } } protected void CustomVerbEventHandler(object sender, WebPartEventArgs args) { int titleColumn = 2; foreach (DataGridItem item in grid.Items) { if (item.Cells[titleColumn].Text != "Manager") { if (item.Visible == true) { item.Visible = false; } else { item.Visible = true; } } } // if (verbText == "Show Managers Only") if (verbText == HttpContext.GetGlobalResourceObject("Resource1", "String5").ToString()) { // verbText = "Show All Employees"; verbText = HttpContext.GetGlobalResourceObject("Resource1", "String5").ToString(); } else { // verbText = "Show Managers Only"; verbText = HttpContext.GetGlobalResourceObject("Resource1", "String3").ToString(); } }
次の新しい関数を追加します。
// Provide localized values for the WebDisplayName and WebDescription // attribute strings. public class LocalizedWebDisplayName : WebDisplayNameAttribute { public LocalizedWebDisplayName(string resId) { base.DisplayNameValue = FetchLocalizedString(resId); } string FetchLocalizedString(string resourceID) { // Use the ResourceManager to get the string from // the resource file. ResourceManager rm = Resource1.ResourceManager; return rm.GetString(resourceID); } } public class LocalizedWebDescription : WebDescriptionAttribute { public LocalizedWebDescription(string resId) { base.DescriptionValue = FetchLocalizedString(resId); } string FetchLocalizedString(string resourceID) { // Use the ResourceManager to get the string from // the resource file. ResourceManager rm = Resource1.ResourceManager; return rm.GetString(resourceID); } }
F5 キーを押して、ソリューションをビルドして実行します。
SharePoint で、[サイトの操作] タブの [その他のオプション] をクリックして、[作成] ダイアログ ボックスを表示します。
[作成] ダイアログ ボックスで、[フィルター方法] セクションの [ページ] をクリックし、インストールされた項目のペインの [Web パーツ ページ] をクリックして、[作成] をクリックします。
[新しい Web パーツ ページ] ダイアログ ボックスで、[名前] ボックスに値を入力して、[作成] をクリックします。
Web パーツ ページで、Web パーツをクリックしてツール バーを表示します。
[カテゴリ] セクションの [カスタム] フォルダーをクリックし、[Web パーツ] セクションで Web パーツを選択して、[追加] をクリックします。
Web パーツのドロップダウン ボタンをクリックし、[Web パーツの編集] をクリックして、[Web パーツのプロパティ] ダイアログ ボックスを表示します。
[その他] セクションを展開して、data.xml ファイルのパスを入力し、[適用] をクリックして、[OK] をクリックします。
データ グリッドが表示されたら、もう一度 Web パーツのドロップダウン ボタンをクリックして、カスタム動詞が既定の言語で表示されることを確認します。
Web パーツ ページの上隅で、自分の名前の横にあるドロップダウン矢印をクリックします。 Language Pack が正しくインストールされていれば、[表示言語の選択] というコマンドがあります。 そのコマンドをポイントして、コンテキスト メニューで [日本語] をクリックします (別の Language Pack がインストールされている場合は、その言語のオプションが表示されます)。
ページのテキストが、選択した言語で表示されます。
Web パーツのドロップダウン ボタンをクリックし、[Web パーツの編集] をクリックして、[Web パーツのプロパティ] ダイアログ ボックスを表示します。
[その他] セクションを展開して、アプリケーションで表示されるすべての文字列がローカライズ言語で表示されることを確認します。 カスタム プロパティ ボックスのラベル、コントロールのツールヒント、動詞などのすべてが、ローカライズ言語で表示されます。
言語を既定の言語に戻して SharePoint ページを閉じます。
ASPX マークアップのローカライズ
リソース ファイルを使用して ASPX ページと ASPX コントロールのマークアップをローカライズできます。
ASPX マークアップをローカライズするには
アプリケーション ページをダブルクリックしてページのマークアップを表示します。
既存の PlaceHolderMain セクションを次のように置き換えて、アプリケーション ページにラベルとボタン コントロールを追加します。
<asp:Content ID="Main" ContentPlaceHolderID="PlaceHolderMain" runat="server"> <asp:Label ID="lbl" runat="server" Font-Size="Large" Text="<%$Resources:Resource1,String6%>"></asp:Label> <br /> <br /> <asp:Button ID="btn1" runat="server" onclick="btn1_Click" Text="<%$Resources:Resource1,String7%>"></asp:Button> </asp:Content>
ここでは、ハードコーディングされた文字列が <%$Resources:Resource File Name, Resource String ID%> という形式の式に置き換えられています。 これらの式は、現在の言語に基づいて、ローカライズされたリソース文字列を表示します。
PageTitle セクションと PageTitleInTitleArea セクションを次のように置き換えます。
<asp:Content ID="PageTitle" ContentPlaceHolderID="PlaceHolderPageTitle" runat="server"> <asp:Literal ID="Literal1" runat="server" Text="<%$Resources:Resource1, String8%>" /> </asp:Content> <asp:Content ID="PageTitleInTitleArea" ContentPlaceHolderID="PlaceHolderPageTitleInTitleArea" runat="server" > <asp:Literal ID="Literal2" runat="server" Text="<%$Resources:Resource1, String9%>" /> </asp:Content>
ここでは、ハードコーディングされた文字列が <asp:literal ID="Literal1" runat="server" Text="<%$Resources:Resource File Name, String ID%>" /> という形式の式に置き換えられています。 これらの式は、現在の言語に基づいて、ローカライズされたリソース文字列を表示します。
ソリューション エクスプローラーでアプリケーション ページを選択し、[表示] メニューの [コード] をクリックして、アプリケーション ページの分離コードを表示します。
次のコードを追加します。
protected void btn1_Click(object sender, EventArgs e) { Response.Redirect("http://MyServer/MyPage.aspx", false); }
F5 キーを押して、ソリューションをビルドして実行します。
アプリケーション ページが既定のリソース文字列で表示されます。
アプリケーション ページの上隅で、自分の名前の横にあるドロップダウン矢印をクリックして、ローカライズ言語を選択します。
ページのテキストが、ローカライズされたリソース文字列で表示されます。
[Display Employee List] をクリックして Web パーツ ページを表示します。
言語を既定の言語に戻して SharePoint ページを閉じます。
フィーチャーのローカライズ
フィーチャーには、SharePoint に表示される名前と説明があります。 フィーチャー リソース ファイルを使用してそれらの文字列をローカライズできます。 フィーチャー リソース ファイルは、アプリケーションの他のリソース ファイルから独立しています。
フィーチャーをローカライズするには
ソリューション エクスプローラーで [Feature1] ノードを右クリックし、[機能リソースの追加] をクリックします。
[リソースの追加] ダイアログ ボックスで、既定のカルチャ ([インバリアント言語]) を選択します。
これにより、既定のフィーチャー リソースとして使用されるフィーチャーに Resources.resx という名前のファイルが追加されます。 リソース ファイルがリソース エディターで開かれます。
リソース エディターで、次の文字列 ID と値を入力します。
文字列 ID
値
String1
My Feature Title
String2
My feature description
フィーチャー リソース ファイルをもう 1 つ追加して、今度は別のカルチャ ([日本語 (日本)] など) を選択します。
これにより、Resources.ja-JP.rex という名前のファイルがフィーチャーに追加されます。 フィーチャー リソースの名前には完全なカルチャ ID が含まれている必要があるため、完全なカルチャを指定するカルチャ ID を一覧から選択するようにしてください ([日本語] ではなく [日本語 (日本)] を選択するなど)。
ローカライズ リソース ファイルの文字列値を、既定のフィーチャー リソース ファイルとは別の値に変更します。
Feature1.feature ファイルをダブルクリックしてフィーチャー デザイナーで開きます。
[タイトル] ボックスのテキストを "$Resources:String1" に置き換えます。
[説明] ボックスのテキストを "$Resources:String2" に置き換えます。
F5 キーを押して、ソリューションをビルドして実行します。
SharePoint ページで、[サイトの操作] タブの [サイトの設定] をクリックします。
[サイト コレクションの管理] の [サイト コレクションのフィーチャー] リンクをクリックします。
[サイト コレクションの管理] ページの上隅で、自分の名前の横にあるドロップダウン矢印をクリックして、ローカライズ言語を選択します。 フィーチャーのタイトルと説明が、ローカライズされたリソース文字列で表示されます。
言語を既定の言語に戻して SharePoint ページを閉じます。