演练:本地化 Visual Studio SharePoint 应用程序

本地化 SharePoint 应用程序是指将其硬编码的字符串替换为从资源文件中检索本地化的字符串值的表达式和语句。 本演练演示如何本地化一个 SharePoint 网页应用程序的所有字符串元素。

本演练将演示以下任务:

  • 本地化代码。

  • 本地化 ASPX 标记。

  • 本地化功能。

系统必备

您需要在开发计算机上安装以下组件才能完成本演练:

了解以下概念很有用,但对于完成本演练并不是必需的:

本地化 SharePoint 代码

SharePoint 应用程序中的代码通常包含 UI 文本的硬编码字符串。 可通过将这些字符串替换为对 GetGlobalResourceObject 的调用来本地化这些字符串。 通过修改一个 Web 部件项目开始演练。

修改 Web 部件项目

  1. 完成主题演练:为 SharePoint 创建 Web 部件中概述的过程。

  2. 将 Web 部件项目加载到 Visual Studio 中后,向该 Web 部件项目中添加一个**“应用程序页”**项目项。使用默认名称 ApplicationPage1.aspx。

  3. 向该 Web 部件项目中添加一个**“资源文件”项目项。 使用默认名称 Resource1.resx。 “资源文件”项目项模板位于“添加新项”**对话框中的语言项目项模板文件夹下。

    资源文件将在**“资源编辑器”**中打开。

  4. 在**“资源编辑器”**中,输入以下字符串 IDs 和值:

    字符串 ID

    String1

    Path to Employee Data File(员工数据文件的路径)

    String2

    Location of the XML file that contains employee data(包含员工数据的 XML 文件的位置)

    String3

    Show Managers Only(仅显示经理)

    String4

    Shows only employees that are managers(仅显示担任经理的员工)

    String5

    Show All Employees(显示所有员工)

    String6

    Employee List(员工列表)

    String7

    Display Employee List(显示员工列表)

    String8

    Application Page(应用程序页)

    String9

    My Application page description(我的应用程序页说明)

  5. 通过在**“解决方案资源管理器”中单击 Resource1.resx 节点,然后在“编辑”菜单上单击“复制”**,创建该文件的副本。

  6. 在**“解决方案资源管理器”中单击该 Web 部件节点,然后在“编辑”菜单上单击“粘贴”**。

  7. 右击复制的文件,然后单击**“重命名”**。 将该文件命名为 Resource1.ja-JP.resx。

    此文件充当日语本地化资源文件,随后将编译为附属程序集并部署到 SharePoint。

  8. 在资源编辑器中打开 Resource1.ja-JP.resx,并在每个值的前面追加单词 JAPANESE。

    例如,“Path to Employee Data File”将变为“JAPANESE Path to Employee Data File”。在实际的本地化情况中,这些字符串将使用日语字符。

  9. 将 Resource1.resx 和 Resource1.ja-JP.resx 的**“部署类型”属性均更改为“AppGlobalResource”**。

    这样将使这些文件部署到服务器上的 App_GlobalResources 文件夹,并将资源提供给所有基于 ASP.NET 的项目。

    提示

    仅对添加到 SharePoint 项目项中的资源文件显示“部署类型”属性。

  10. 双击 Package.package,将其在**“包设计器”**中打开。

  11. 单击**“高级”按钮,单击“添加”按钮,然后单击“添加现有程序集”**。

    这将打开**“添加现有程序集”**对话框。

  12. 生成项目以创建本地化附属 DLL。

  13. 在**“添加现有程序集”对话框中,单击“源文件路径”**旁边的省略号 (ASP.NET 移动设计器中的省略号) 按钮,并找到本地化的附属 DLL。

    程序集文件位于项目目录中的 .. \bin\debug\ja-JP 下。

  14. 将**“部署目标”选项保留为“GlobalAssemblyCache”**。

  15. 在**“位置”**框中,在“位置”路径的前面添加区域性 ID 文件夹。 对于此示例,将现有值更改为 jp-JA\Web 部件名称.resources.dll。 如果您的项目有多个附属 DLL,请为每个 DLL 重复此步骤。

    此步骤是必需的,因为包不允许相同文件夹中存在两个同名文件。 通过基于区域性 ID 创建子文件夹,可允许将两个文件打包在一起。

  16. 完成后,单击“确定”以关闭该对话框。

  17. 打开 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;
    
  18. 将现有变量声明和功能替换为以下内容。

        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();
                }
            }
    
  19. 添加以下新功能。

    // 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);
        }
    }
    
  20. F5 生成并运行该解决方案。

  21. 在 SharePoint 中,单击**“网站操作”选项卡上的“更多选项”以显示“创建”**对话框。

  22. 在**“创建”对话框的“筛选方式”部分单击“页”,在已安装项窗格中单击“Web 部件页”,然后单击“创建”**按钮。

  23. 在**“新建 Web 部件页”对话框的“名称”框中输入值,然后单击“创建”**按钮。

  24. 在 Web 部件页上,单击 Web 部件以显示工具栏。

  25. 在**“类别”部分单击“自定义”文件夹,在“Web 部件”部分选择 Web 部件,然后单击“添加”**按钮。

  26. 单击 Web 部件的下拉按钮,然后单击**“编辑 Web 部件”**以显示 Web 部件属性对话框。

  27. 展开**“杂项”部分,输入 data.xml 文件的路径,单击“应用”,然后单击“确定”**。

  28. 数据网格出现后,再次单击 Web 部件的下拉按钮,并注意自定义谓词以默认语言显示。

  29. 在 Web 部件页的上角,单击名称旁边的下拉箭头。 如果成功安装了语言包,则有一个名为**“选择显示语言”的命令。 指向该命令,然后在上下文菜单中单击“日语”**。 (如果安装了其他语言包,该语言选项将显示在此处。)

    页上的文本即会以选定语言显示。

  30. 单击 Web 部件的下拉按钮,然后单击**“编辑 Web 部件”**以显示 Web 部件属性对话框。

  31. 展开**“杂项”**部分,并注意应用程序中的所有可见字符串如何以本地化语言显示。 自定义属性框标签、控件的工具提示以及谓词都将以本地化语言显示。

  32. 将语言切换回默认语言并关闭 SharePoint 页。

本地化 ASPX 标记

可以使用资源文件来本地化 ASPX 页和控件中的标记。

本地化 ASPX 标记

  1. 双击应用程序页以查看其标记。

  2. 通过将现有 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:资源文件名, 资源字符串 ID%>。 这些表达式显示基于当前语言的本地化资源字符串。

  3. 将 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:资源文件名, 字符串 ID%>" />。 这些表达式显示基于当前语言的本地化资源字符串。

  4. 在**“解决方案资源管理器”中选择应用程序页,然后在“视图”菜单上单击“代码”**以显示应用程序页背后的代码。

  5. 添加下列代码。

    protected void btn1_Click(object sender, EventArgs e)
    {
        Response.Redirect("http://MyServer/MyPage.aspx", false);            
    }
    
  6. F5 生成并运行该解决方案。

    应用程序页将出现,其中包含默认资源字符串。

  7. 在应用程序页的上角,单击名称旁边的下拉箭头,并选择本地化语言。

    页上的文本将出现,其中包含本地化的资源字符串。

  8. 单击**“Display Employee List”**按钮以显示 Web 部件页。

  9. 将语言切换回默认语言并关闭 SharePoint 页。

本地化功能

功能具有显示在 SharePoint 中的名称和说明。 可以使用功能资源文件来本地化这些字符串。 这些资源文件独立于应用程序中的其他资源文件。

本地化功能

  1. 在**“解决方案资源管理器”中右击“Feature1”节点,然后单击“添加功能资源”**。

  2. 在**“添加资源”对话框中,选择默认区域性“固定语言”**。

    这会将一个名为 Resources.resx 的文件添加到充当默认功能资源的功能。 资源文件将在**“资源编辑器”**中打开。

  3. 在**“资源编辑器”**中,输入以下字符串 ID 和值:

    字符串 ID

    String1

    My Feature Title(我的功能标题)

    String2

    My feature description(我的功能说明)

  4. 添加另一个功能资源文件,但选择其他区域性,例如“日语(日本)”。

    这会向功能中添加一个名为 Resources.ja-JP.rex 的文件。 由于功能资源要求其名称中有完整的区域性标识符,因此请在列表中选择指定完整区域性的区域性 ID。 例如,选择“日语(日本)”,而不是“日语”。

  5. 将本地化资源文件中的字符串值更改为与默认功能资源文件中的字符串值不同的值。

  6. 双击 Feature1.feature 文件,将其在**“功能设计器”**中打开。

  7. 将**“标题”**框中的文本替换为 $Resources:String1。

  8. 将**“说明”**框中的文本替换为 $Resources:String2。

  9. F5 生成并运行该解决方案。

  10. 在 SharePoint 页上,单击**“网站操作”选项卡上的“网站设置”**。

  11. 单击**“网站集管理”下的“网站集功能”**链接。

  12. 在**“网站集管理”**页的上角,单击名称旁边的下拉箭头,并选择本地化语言。 功能标题和说明将出现,其中包含本地化的资源字符串。

  13. 将语言切换回默认语言并关闭 SharePoint 页。

请参见

任务

如何:添加资源文件

其他资源

如何:本地化功能

如何:本地化 ASPX 标记

如何:本地化代码