限制 Kentico Pages 应用程序中的 UI 语言下拉菜单

Limiting the UI language drop-down in the Kentico Pages application

我正在 Kentico 中构建一个多语言站点,我希望用户能够有限地访问他们可以在 Pages 应用程序中创建的语言。我可以使用用户属性中的 语言 选项卡指定用户可以编辑的语言,如 Kentico 文档中 User management 页面所示。​​

这样做的结果是,如果我的用户试图查看他们尚未分配给他们并且尚未创建页面的语言,那么他们将获得许可 error/warning:

You are not allowed to create this culture version.

我想做的是限制 Pages 应用程序中的下拉列表,这样我只能 select 我有权更改的语言。我找不到任何可能将下拉列表限制为仅指定语言的设置。

理想情况下,对于我的用例,用户应该只能看到他们可以在页面应用程序中编辑的页面,因为有超过 30 种语言。

如何限制 UI 语言下拉列表只显示允许用户查看的语言?

页面应用程序中的语言下拉列表最终由 LanguageMenu 控件(您可以在 CMSModules\Content\Controls\LanguageMenu.ascx 中找到)提供。您需要复制此文件并修改 Page_Load 方法,以根据设定的文化(如果有)限制语言。

一个非常简单的示例是在构建列表项的循环之前添加以下代码:

var userCultureIDs = new List<Int32>();
var userCulturesSet = false;
if (CurrentUser.Bindings.CollectionNames.Contains("UserCultures") && CurrentUser.Bindings["UserCultures"].Count > 0)
{
    foreach (var userCulture in CurrentUser.Bindings["UserCultures"])
    {
        userCultureIDs.Add((Int32)userCulture["CultureID"]);
        userCulturesSet = true;
    }
}

然后在该循​​环内,制作第一行:

if (userCulturesSet && !userCultureIDs.Contains(culture.CultureID) && !CurrentUser.CheckPrivilegeLevel(UserPrivilegeLevelEnum.GlobalAdmin)) continue;

这确保如果您是全局管理员,您将获得所有内容,并且 - 如果未设置语言 - 您将获得默认列表。

与最佳实践一样,您最好在修改这些控件之前复制这些控件,以确保不会导致任何意外的副作用。请记住这一点,注意控制链:

  1. CMSModules\Content\CMSDesk\Default.aspx
  2. CMSModules\Content\Controls\ContentNavigation.aspx
  3. CMSModules\Content\Controls\TreeLanguageMenu.ascx
  4. CMSModules\Content\Controls\LanguageMenu.ascx