Table of Contents

如何使用透视和翻译

透视用于控制哪些对象会显示在特定的客户端视图中。 翻译(区域设置)提供本地化的名称、描述和显示文件夹。 两者都使用 TOM 对象上的索引器属性。 有关访问 TOM 对象及其索引器的详细信息,请参阅 @how-to-navigate-tom-hierarchy。

快速参考

// Perspectives
measure.InPerspective["Sales"] = true;              // include in perspective
measure.InPerspective["Sales"] = false;             // exclude from perspective
var isIn = measure.InPerspective["Sales"];           // check membership

// Translations
measure.TranslatedNames["da-DK"] = "Omsætning";    // set translated name
measure.TranslatedDescriptions["da-DK"] = "...";    // set translated description
measure.TranslatedDisplayFolders["da-DK"] = "Salg"; // set translated folder

var name = measure.TranslatedNames["da-DK"];     // read translation (empty string if unset)

// Iterate cultures
foreach (var culture in Model.Cultures)
    Info(culture.Name);                              // "da-DK", "de-DE", etc.

设置透视成员关系

The InPerspective 索引器可用于表、列、度量值和层次结构 (即任何实现 (xref:TabularEditor.TOMWrapper.ITabularPerspectiveObject) 的对象)。

// Add all measures in a table to a perspective
Model.Tables["Sales"].Measures.ForEach(m => m.InPerspective["Sales Report"] = true);

// Remove a table and its children from a perspective
var table = Model.Tables["Internal"];
table.InPerspective["Sales Report"] = false;

复制透视成员关系

将一个对象的透视可见性复制到另一个对象。

var source = Model.AllMeasures.First(m => m.Name == "Revenue");
var target = Model.AllMeasures.First(m => m.Name == "Revenue YTD");

foreach (var p in Model.Perspectives)
    target.InPerspective[p.Name] = source.InPerspective[p.Name];

创建和删除透视

// Create a new perspective (empty upon creation -- add objects as shown above)
var p = Model.AddPerspective("Executive Dashboard");

// Remove a perspective
Model.Perspectives["Old View"].Delete();

设置翻译

翻译索引器适用于实现 (xref:TabularEditor.TOMWrapper.ITranslatableObject) 接口的对象(表、列、度量值、层次结构、级别)。 显示文件夹的翻译需要对象实现 (xref:TabularEditor.TOMWrapper.IFolderObject)(度量值、列、层次结构)。

var m = Model.AllMeasures.First(m => m.Name == "Revenue");
m.TranslatedNames["da-DK"] = "Omsætning";
m.TranslatedDescriptions["da-DK"] = "Total omsætning i DKK";
m.TranslatedDisplayFolders["da-DK"] = "Salg";

查找缺失的翻译

foreach (var culture in Model.Cultures)
{
    var missing = Model.AllMeasures
        .Where(m => string.IsNullOrEmpty(m.TranslatedNames[culture.Name]));

    Info($"{culture.Name}: {missing.Count()} measures without translated names");
}

根据命名约定批量设置翻译

// Copy the default name as the translation for cultures that are missing it
foreach (var culture in Model.Cultures)
{
    Model.AllMeasures
        .Where(m => string.IsNullOrEmpty(m.TranslatedNames[culture.Name]))
        .ForEach(m => m.TranslatedNames[culture.Name] = m.Name);
}

创建和删除区域设置

// Add a new culture
var culture = Model.AddTranslation("fr-FR");

// Remove a culture
Model.Cultures["fr-FR"].Delete();

Dynamic LINQ 等效写法

在 BPA 规则表达式中,可直接访问透视和翻译索引器。

C# Script Dynamic LINQ (BPA)
m.InPerspective["Sales"] InPerspective["Sales"]
!m.InPerspective["Sales"] not InPerspective["Sales"]
string.IsNullOrEmpty(m.TranslatedNames["da-DK"]) String.IsNullOrEmpty(TranslatedNames["da-DK"])

另见