2

有人可以帮我弄清楚如何使用 CRM 2011 SDK 为一个选项集的标签检索不同的语言吗?

我的任务如下:例如,我与德语有联系,那么我的 sdk 应该带回该语言的选项集值。有我联系一个英文国家,sdk应该把英文标签给我带回来等等..

获取值没问题:

int optSetValue = ((OptionSetValue)entity["optionsetFieldName"]).value

但是我怎样才能得到正确语言的标签呢?

4

4 回答 4

4

您需要执行 aRetrieveAttributeRequest来获取EnumAttributeMetadata,然后根据语言代码查找正确的值:

string languageCode = germanLanguageCode; // Set
int optSetValue =  0; // Set
RetrieveAttributeRequest attributeRequest = new RetrieveAttributeRequest
{
    EntityLogicalName = entityLogicalName,
    LogicalName = attributeName,
    RetrieveAsIfPublished = true
};

var response = (RetrieveAttributeResponse)service.Execute(attributeRequest);
var optionList = ((EnumAttributeMetadata)response.AttributeMetadata).OptionSet.Options;

return optionList.GetFirst(o => o.Value == optSetValue).Label.LocalizedLabels.First(l => l.LanguageCode == languageCode).Label;

或者,如果您的服务以德语用户身份运行,那么您可以通过以下方式访问德语文本return optionList.GetFirst(o => o.Value == optSetValue).Label.UserLocalizedLabel.Label;

我倾向于缓存元数据,而不是不断地访问 CRM 服务器来获取文本信息。但话又说回来,我在一个只有英语的组织中,不必担心人们使用什么语言......

评论的其他答案

GetFirst()只是一个标准的 Linq 方法。只要您在 using 语句中添加了 System.Linq 命名空间,任何 IEnumerable 都会拥有它。

德语位于1031。虽然更正确的方法是查找用户的 UsersSetting.UILanguageId。我相信应该包含正确的代码,虽然我还没有测试过......

于 2013-01-23T13:26:47.330 回答
0

要检索选定值的用户本地化选项标签,请尝试

string myoption;

if (!entity.FormattedValues.TryGetValue("optionsetFieldName", out myoption))
{
    myoption = "Not found";
}

也可以使用 LINQ 查询FormattedValues IList<KeyValuePair<string,string>>

于 2013-01-23T13:20:41.113 回答
0
string optionlabel =entity.FormattedValues["optionsetFieldName"];
于 2013-01-30T22:30:05.017 回答
0

为我工作的代码:

public static dynamic GetOptionSet(string entityName, string fieldName, int langId, OrganizationServiceProxy proxy)
{
    RetrieveEntityRequest retrieveDetails = new RetrieveEntityRequest();
    retrieveDetails.EntityFilters = EntityFilters.All;
    retrieveDetails.LogicalName = entityName;

    RetrieveEntityResponse retrieveEntityResponseObj = (RetrieveEntityResponse)proxy.Execute(retrieveDetails);
    EntityMetadata metadata = retrieveEntityResponseObj.EntityMetadata;
    PicklistAttributeMetadata picklistMetadata = metadata.Attributes.FirstOrDefault(attribute => String.Equals(attribute.LogicalName, fieldName, StringComparison.OrdinalIgnoreCase)) as PicklistAttributeMetadata;
    OptionSetMetadata options = picklistMetadata.OptionSet;
    var optionlist = (from o in options.Options
                          select new { Value = o.Value, Text = o.Label.LocalizedLabels.First(l => l.LanguageCode == langId).Label }).ToList();

    return optionlist;

}
于 2015-06-26T13:44:15.160 回答