了解多语言用户界面 (MUI)

上次修改时间: 2015年3月9日

适用范围: SharePoint Foundation 2010

本文内容
多语言用户界面术语
启用对备用语言的支持
更改显示语言
如何本地化显示文本
向用户资源添加翻译

Microsoft SharePoint Foundation 2010 中的多语言用户界面 (MUI) 功能使用户能够更改网站用户界面 (UI) 的语言。

例如,讲西班牙语但在英语用户界面中工作的用户可以将用户界面的语言更改为西班牙语。此时,网站的工具栏、导航栏、列表标题和列标题将显示为西班牙语。同样,讲阿拉伯语的用户可以将用户界面更改为阿拉伯语。在这种情况下,工具栏、导航栏、列表标题和列标题将显示为阿拉伯语,并且网站的从左向右方向将更改为从右向左方向。

为实现此目的,必须通过在装有 SharePoint Foundation 2010 的服务器上安装的语言包提供这些语言,并且 SharePoint Foundation 网站的所有者必须将这些语言作为网站的备用语言。

语言包提供 SharePoint Foundation 2010 所含用户界面文本的翻译。还可以将用户向已创建网站中添加的文本本地化。尽管 SharePoint Foundation 2010 不支持列表项内容的本地化,但是它支持列表部件版式 的本地化,包括列表标题和说明、列标题、用于列表的自定义内容类型的名称和说明,以及列表菜单扩展中使用的显示文本。自定义网站本身的用户界面时(可能采用的方式是,向顶部导航栏或快速启动区域添加节点,或者向功能区添加扩展),还能够用网站支持的所有语言添加这些新元素的显示文本的翻译。可以自定义的所有用户界面文本还受用户创建的语言资源的支持。

多语言用户界面术语

下列各节定义与 SharePoint Foundation 的 MUI 相关的标准术语。

SKU 语言

安装 SharePoint Foundation 所用的语言称为 SKU 语言。它是管理中心应用程序使用的语言,也是在服务器场内创建网站和网站集所用的默认语言。

可以使用 SharePoint Foundation 对象模型来确定 SKU 语言。SPRegionalSettings 类的 GlobalServerLanguage 静态属性返回一个 SPLanguage 对象,其中包含有关 SKU 语言的显示名称及其区域设置 ID (LCID) 的信息。有关 LCID 列表,请参阅 SPLocale.LCID 属性。

默认语言

默认语言 是 SKU 语言或服务器场管理员通过下载和安装语言包已添加到场服务器中的语言。

备注

若要查看可用语言包列表,请参阅 SharePoint Foundation 2010 语言包

SPRegionalSettings 类的 GlobalInstalledLanguages 静态属性返回一个 SPLanguageCollection 对象,您可以枚举该对象以找出默认语言包。集合中的每个 SPLanguage 对象都包含有关已安装语言的显示名称和 LCID 的信息。

默认语言

网站所有者或网站集管理员创建网站或新网站集时,他们可以选择一种语言。选择的语言将成为新网站的默认语言;如果是新网站集,则成为根网站的默认语言。设置网站时,自动创建的用户界面中的文本使用默认语言。添加到支持多种语言的网站中的未翻译用户界面文本也使用默认语言。

SPWeb 类的 UICulture 属性返回一个 CultureInfo 对象,其中包含有关默认语言的信息。

备用语言

网站的所有者可以指定网站将支持哪些默认语言。导航到该网站的用户可以将用户界面的显示语言更改为这些备用语言 中的任何一种。

SPWeb 类的 SupportedUICultures 属性返回 CultureInfo 对象的可枚举集合,这些对象包含有关网站用户界面支持的语言的信息。此集合包括表示默认语言的对象以及表示备用语言的对象。

备注

如果尚未对网站启用 MUI,则 SupportedUICultures 属性返回的集合只包含一个 CultureInfo 对象,它表示默认语言。您可以通过获取 IsMultilingual 属性的值来确定是否已启用 MUI。

用户资源

可以在 SharePoint Foundation 中自定义的任何用户界面文本均受字符串集合支持,每个字符串对应网站支持的一种语言。用户创建的可本地化字符串的集合称为用户资源。

在 SharePoint Foundation 对象模型中,用户资源由 SPUserResource 类的实例表示。例如,列表标题的显示文本由表示列表的 SPList 对象的 Title 属性提供。而 Title 属性从列表的 TitleResource 属性返回的 SPUserResource 对象获取其值。

如果向已创建的网站中添加新用户界面文本,则在用户添加翻译之前,支持该文本的 SPUserResource 对象将对所有语言返回相同的值(初始值)。

备注

用户资源与语言资源 (.resx) 文件不同。语言资源文件是特定语言的。它们包含一种语言的多段文本。相反,SPUserResource 对象是特定于文本的。他们包含一段文本的多种语言表示形式。

启用对备用语言的支持

网站的所有者可以通过在用户界面中导航到"语言设置"页 (/_layouts/muisetng.aspx) 来启用 MUI。(单击"网站操作",然后单击"网站设置"。在"网站管理"下,单击"语言设置"。)默认语言在"备用语言"组中列出。网站当前支持的备用语言名称旁边的框中带有复选标记。可以通过选中或清除复选框来添加或取消语言支持。

可以使用 SharePoint Foundation 对象模型完成相同的任务,方法是获取对 SPWeb 对象的引用,将其 IsMultilingual 属性设置为 true,然后调用 AddSupportedUICulture 方法以添加对一种或多种备用语言的支持,或者调用 RemoveSupportedUICulture 方法以取消支持。下面的控制台应用程序演示了添加备用语言支持的过程:

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using Microsoft.SharePoint;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            using (SPSite site = new SPSite("https://localhost"))
            {
                using (SPWeb web = site.RootWeb)
                {

                    // A website can be created from a template that does not support MUI.
                    SPWebTemplateCollection templates = site.GetWebTemplates(web.Language);
                    SPWebTemplate template = templates[web.WebTemplate];
                    if (template.SupportsMultilingualUI)
                    {

                        // Enable MUI.
                        web.IsMultilingual = true;

                        // Add support for any installed language currently not supported.
                        SPLanguageCollection installed = SPRegionalSettings.GlobalInstalledLanguages;
                        IEnumerable<CultureInfo> supported = web.SupportedUICultures;

                        foreach (SPLanguage language in installed)
                        {
                            CultureInfo culture = new CultureInfo(language.LCID);

                            if (!supported.Contains(culture))
                            {
                                Console.WriteLine("Adding {0}", culture.Name);
                                web.AddSupportedUICulture(culture);
                            }
                        }
                        web.Update();
                    }
                }
            }
            Console.Write("\nPress ENTER to continue....");
            Console.Read();
        }
    }
}
Imports System
Imports System.Collections.Generic
Imports System.Globalization
Imports System.Threading
Imports Microsoft.SharePoint

Module ConsoleApp

    Sub Main()
        Using site As New SPSite("https://localhost")
            Using web As SPWeb = site.RootWeb

                ' A website can be created from a template that does not support MUI.
                Dim templates As SPWebTemplateCollection = site.GetWebTemplates(web.Language)
                Dim template As SPWebTemplate = templates(web.WebTemplate)

                If template.SupportsMultilingualUI Then

                    ' Enable MUI.
                    web.IsMultilingual = True

                    ' Add support for any installed language currently not supported.
                    Dim installed As SPLanguageCollection = SPRegionalSettings.GlobalInstalledLanguages
                    Dim supported As IEnumerable(Of CultureInfo) = web.SupportedUICultures

                    For Each language As SPLanguage In installed
                        Dim culture As New CultureInfo(language.LCID)

                        If Not supported.Contains(culture) Then
                            Console.WriteLine("Adding {0}", culture.Name)
                            web.AddSupportedUICulture(culture)
                        End If
                    Next
                    web.Update()
                End If

            End Using
        End Using
        Console.Write(vbCrLf & "Press ENTER to continue....")
        Console.Read()
    End Sub

End Module

请注意,该控制台应用程序检查网站所基于的 Web 模板是否支持 MUI。可以创建不支持备用语言的 Web 模板。有关详细信息,请参阅 Configuration 元素(网站)中的 SupportsMultilingualUI 属性以及 SPWebTemplate 类的 SupportsMultilingualUI 属性。

为方便起见,该控制台应用程序没有将设置 IsMultilingual 属性的代码放在 try-catch 块中;但是它应该这样做。如果网站具有自定义的级联样式表 (CSS),则尝试将 IsMultilingual 属性设置为 true 将引发 SPException 异常。无法对使用自定义 CSS 文件的网站启用备用语言支持。

与上一示例执行的任务非常相似的一个常见任务是在子网站上复制网站的备用语言集。因为每个新网站都是使用默认语言而不是备用语言创建的,所以必须执行此操作。若要在子网站上复制网站的备用语言支持,只需枚举父网站的 SupportedUICultures 属性返回的集合,并通过调用子网站的 AddSupportedUICulture 方法向子网站中添加对每个区域性的支持。

更改显示语言

在 SharePoint Foundation 2010 中,当用户导航到多语言网站时,该网站将使用客户端浏览器随 HTTP 请求发送的 Accept-Language 标头确定以哪种语言呈现用户界面。如果网站不支持浏览器指定的任何语言,则使用默认语言作为显示语言。

多语言网站还在网页右上角的用户名称旁边显示一个下拉菜单,用户可以在其中选择显示语言。当用户选择的语言不同于当前的显示语言时,网站将切换到新的语言。用户的首选项保存在客户端计算机中留下的 Cookie 中。用户对网站进行后续访问时,网站会从 Cookie 获取用户的语言首选项。

用于获取用户的语言首选项的用户界面由大多数页面顶部的一个 PersonalActions 控件实现。该控件会调用 Page.RegisterStartupScript 方法,以便将以下标记放置在发送到客户端浏览器的 HTML 中。

<script type ="text/javascript"> 
// <![CDATA[
function OnSelectionChange(value)
{
    var today = new Date();
    var oneYear = new Date(today.getTime() + 365 * 24 * 60 * 60 * 1000);
    var url = window.location.href;
    document.cookie = "lcid=" + value + ";path=/;expires=" + oneYear.toGMTString();
    window.location.href = url;
}
// ]]>
</script>

确定显示语言后,SharePoint Foundation 将启动一个线程以处理请求,并设置线程的 Thread.CurrentUICulture 属性以反映语言选择。编写将在服务器上(例如,在 Web 部件中)执行的代码时,可以通过访问 CultureInfo.CurrentUICulture 静态属性来获取当前 HTTP 上下文的显示语言。

下面的示例是一个简单的控制台应用程序,它演示更改显示语言如何影响显示文本。该应用程序枚举网站支持的区域性列表;将当前线程的 CurrentUICulture 属性的值依次设置为每种受支持的区域性;并输出以当前显示语言呈现的网站标题。

using System;
using System.Collections.Generic;
using System.Globalization;
using System.Threading;
using Microsoft.SharePoint;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            using (SPSite site = new SPSite("https://localhost"))
            {
                using (SPWeb web = site.RootWeb)
                {
                    if (web.IsMultilingual)
                    {
                        IEnumerable<CultureInfo> cultures = web.SupportedUICultures;
                        foreach (CultureInfo culture in cultures)
                        {
                            // Change the UI culture of the thread.
                            Thread.CurrentThread.CurrentUICulture = culture;
 
                            // Print the name of the current language and the web title in the current language.
                            Console.WriteLine("{0}  {1}", CultureInfo.CurrentUICulture.Name, web.Title); 
                        }
                    }
                }
            }
            Console.WriteLine("\nPress ENTER to continue....");
            Console.Read();
        }
    }
}
Imports System
Imports System.Collections.Generic
Imports System.Globalization
Imports System.Threading
Imports Microsoft.SharePoint

Module ConsoleApp

    Sub Main()
        Using site As New SPSite("https://localhost")
            Using web As SPWeb = site.RootWeb

                If web.IsMultilingual Then
                    Dim cultures As IEnumerable(Of CultureInfo) = web.SupportedUICultures
                    For Each culture As CultureInfo In cultures

                        ' Change the UI culture of the thread.
                        Thread.CurrentThread.CurrentUICulture = culture

                        ' Print the name of the current language and the web title in the current language.
                        Console.WriteLine("{0}  {1}", CultureInfo.CurrentUICulture.Name, web.Title)
                    Next
                End If

            End Using
        End Using
        Console.Write(vbCrLf & "Press ENTER to continue....")
        Console.Read()
    End Sub

End Module

如何本地化显示文本

Microsoft 提供的用户界面文本的本地化语言资源由一组特定于区域性的资源文件提供,这些文件安装在服务器场中的每台 Web 服务器上。创建新网站时,SharePoint Foundation 将打开网站默认语言的资源文件,查找所需的文本,并将其存储在表示用户界面显示文本的对象中。向网站添加备用语言时,将执行相同的过程以获取 Microsoft 提供的用户界面文本的翻译。

用户可以自定义的任何用户界面元素均由用户资源提供支持,用户资源是一种 SPUserResource 对象,能够为网站支持的每种语言存储用户提供的翻译。例如,SPField 对象的 Title 属性提供列表中某列的显示名称。该属性与 TitleResource 密切相关,后者是返回 SPUserResource 对象的只读属性。获取 Title 属性时,它将返回 TitleResource.Value。设置 Title 属性时,将设置 TitleResource.Value。换句话说,获取或设置 SPField 对象的 Title 属性相当于获取或设置 SPUserResource 对象的 Value 属性。

让我们了解一下 SPUserResource.Value 属性。该属性的源代码类似于以下代码:

public string Value 
{
    get
    {
        return GetValueForUICulture(Thread.CurrentThread.CurrentUICulture);
    }
    set
    {
        SetValueForUICulture(Thread.CurrentThread.CurrentUICulture, value);
    }
}

获取和设置 Value 属性将调用 SPUserResource 类的两个公共方法之一:GetValueForUICulture 方法或 SetValueForUICulture 方法,在每种情况下,都将传递表示当前线程的区域性的 CultureInfo 对象。

SPUserResource 类维护将一组关键字(语言)映射到一组值(翻译)的字典。GetValueForUICulture 方法和 SetValueForUICulture 方法按语言查找字典条目,并获取或设置该语言的字符串值。

用户资源的初始值

创建的新 SPUserResource 对象至少具有一个值,即网站默认语言的值。实际上,用于默认语言的值可能并非以默认语言表示。它可以是用于创建用户资源支持的显示文本的任意字符串,以创建显示文本时使用的任意语言表示。

例如,用户创建新列表时,必须将包含列表标题的字符串作为参数传递给 SPList 类的构造函数。在 SPList 对象中初始化 TitleResource 属性时,同一标题字符串将作为参数传递给 SPUserResource 对象的构造函数。SPUserResource 构造函数中的代码在对象的值字典中创建初始条目,以使用网站的默认语言作为该条目的键,使用标题字符串作为初始值。

如果初始值是用户资源的唯一值,则此初始值将变得特别重要。如果对 GetValueForUICulture 方法的任何调用指定资源字典中不存在的语言,则该方法将返回默认语言的值。因此,默认语言值用于所有未翻译的文本。

如果使用用户资源的对象是由同时部署资源文件的功能创建的,则可以使用特定语言资源 (.resx) 文件中的值初始化这些对象。有关详细信息,请参阅本地化 SharePoint 解决方案(该链接可能指向英文页面)

使用用户资源的用户界面元素

SharePoint Foundation 对象模型具有六个其属性返回 SPUserResource 对象的类:

下表列出了返回 SPUserResource 对象的属性,并说明了这些资源的使用位置。

属性

说明

SPContentType.DescriptionResource

SPContentType.Description 属性返回的字符串的源,它提供内容类型的文字说明。

SPContentType.NameResource

SPContentType.Name 属性返回的字符串的源,它提供内容类型的显示名称。

SPField.DescriptionResource

SPField.Description 属性返回的字符串的源,它提供列的文字说明。

SPField.TitleResource

SPField.Title 属性返回的字符串的源,它提供列的显示名称。

SPList.DescriptionResource

SPList.Description 属性返回的字符串的源,它提供列表的文字说明。

SPList.TitleResource

SPList.Title 属性返回的字符串的源,它提供列表的显示名称。

SPNavigationNode.TitleResource

SPNavigationNode.Title 属性返回的字符串的源,它提供导航节点的显示名称。

SPUserCustomAction.CommandUIExtensionResource

SPUserCustomAction.CommandUIExtension 属性返回的字符串的源,它提供用于功能区的自定义操作的 XML 表示形式。

SPUserCustomAction.DescriptionResource

SPUserCustomAction.Description 属性返回的字符串的源,它提供网站、Web 或列表范围内自定义控件的文字说明。

SPUserCustomAction.TitleResource

SPUserCustomAction.Title 属性返回的字符串的源,它提供用于说明网站、Web 或列表范围内自定义控件的显示文本。

SPWeb.DescriptionResource

SPWeb.Description 属性返回的字符串的源,它提供网站的文字说明。

SPWeb.TitleResource

SPWeb.Title 属性返回的字符串的源,它提供网站的显示名称。

另外两个属性在 SPUserResourceCollection 对象中返回用户资源的集合。SPList 类具有包含 SPUserResource 对象的 UserResources 属性,这些对象具有列表、字段、内容类型,以及与列表相关联的用户自定义操作使用的可本地化资源。如果这些对象的显示文本均未自定义,则 UserResources 属性返回空集合。通常,不对标准列表(如"通知"和"共享文档")的显示文本进行自定义,因此这些列表的 UserResources 属性通常返回空集合。

SPWeb 类的 UserResources 属性通过返回 SPUserResource 对象的集合实现类似的功能,这些对象具有网站、网站栏、内容类型、导航节点,以及与网站相关联的用户自定义操作使用的可本地化资源。在集合中返回的对象仅表示已由网站用户(包括开发人员和管理员)自定义的显示文本。

混合语言

在某些情况下,网站上可能会产生混合语言体验。最明显的一种情况是:网站用户通过添加新元素(如新列表或新导航节点)自定义网站,但同时未提供与这些元素相关联的用户资源的翻译。

另一种混合语言体验可能会出现在某些内置用户界面元素中。错误消息、通知和一些对话框可能无法以当前的显示语言显示。这是因为 SharePoint Foundation 依赖于几种支持技术(例如,Microsoft .NET Framework、Windows Workflow Foundation 和 Microsoft ASP.NET),其中一些技术仅本地化为有限的几种语言。如果由任何支持技术生成的用户界面元素未本地化为网站所有者为网站指定的语言,则该元素以安装支持技术所用的语言(即它的 SKU 语言)显示。

最后,混合语言体验可能会出现在一些管理用户界面元素中。在某些情况下,用户界面文本可能会以安装 SharePoint Foundation 所用的语言显示。这种类型的混合语言体验通常只有网站所有者或管理员可以看到,网站用户看不到。

向用户资源添加翻译

向自定义用户界面文本的用户资源添加翻译的最简单方法是让讲双语的人员导航到网站,切换到一种备用语言,并通过直接在管理用户界面中编辑文本来进行翻译。例如,若要翻译列表的标题和说明,可单击功能区上的"列表设置"。在"常规设置"下,单击"标题、说明和导航",然后编辑"名称"和"说明"框中的文本。以备用语言所做的更改将在支持该文本的用户资源中保存为该语言的值。

网站所有者还可以将未翻译的字符串导出到网站支持的每种备用语言的资源 (.resx) 文件中,从而安排批量翻译用户资源。然后可以将资源文件移交给脱机工作的翻译人员。完成工作后,所有者可以导入资源文件。SharePoint Foundation 会将翻译添加到相应的用户资源中。

可以在用户界面中通过"导出翻译"页 (_layouts/exporttranslations.aspx) 完成导出操作。可以从"导入翻译"页 (_layouts/importtranslations.aspx) 导入完成的翻译。或者,也可以为这两种操作编写自己的代码。您的代码可以调用 SPWeb 类的 ExportUserResources 方法并将结果保存在资源文件中。翻译字符串后,可以通过调用 ImportUserResources 方法将它们导入。这两种方法的文档均包含代码示例。

从开发人员的角度来看,更好的解决方案是在将新功能部署到多语言网站之前进行翻译。您可以创建特定语言的资源文件,通过协作应用程序标记语言 (CAML) 引用它们,将它们打包到 SharePoint 解决方案中,并将它们部署到网站或网站集中。SharePoint Foundation 然后可以使用资源文件来填充您的功能创建的 SPUserResource 对象。有关详细信息,请参阅本地化 SharePoint 解决方案(该链接可能指向英文页面)

允许更改覆盖翻译

"语言设置"页 (_layouts/muisetng.aspx) 为网站所有者提供了在默认语言中进行更改时覆盖备用语言的现有翻译的选项。该页上的"是"和"否"单选按钮将 SPWeb 类的 OverwriteTranslationsOnChange 属性设置为 true 或 false。默认设置为 false(在用户界面中为"否")。

例如,如果 OverwriteTranslationsOnChange 属性设置为 true(在用户界面中为"是"),并且用默认语言工作的用户更改了列表栏的标题文本,则将自动重置 TitleResource 属性(栏标题的源)的所有值。现有备用语言翻译将被新的默认语言文本覆盖。换句换说,文本不再具有翻译。

如果属性返回 false,则默认语言版本更改时,将保留备用语言翻译。在这种情况下,备用语言文本可能不再是默认语言源的有效翻译。

因此,实际上是在选择文本更易于理解(选择"否")还是更准确(选择"是")。

请参阅

任务

演练:本地化 Web 部件

演练:本地化列、内容类型和列表

引用

SupportsMultilingualUI

SPWeb.IsMultilingual

SPWeb.Language

Thread.CurrentUICulture