有人可以帮我弄清楚如何使用 CRM 2011 SDK 为一个选项集的标签检索不同的语言吗?
我的任务如下:例如,我与德语有联系,那么我的 sdk 应该带回该语言的选项集值。有我联系一个英文国家,sdk应该把英文标签给我带回来等等..
获取值没问题:
int optSetValue = ((OptionSetValue)entity["optionsetFieldName"]).value
但是我怎样才能得到正确语言的标签呢?
有人可以帮我弄清楚如何使用 CRM 2011 SDK 为一个选项集的标签检索不同的语言吗?
我的任务如下:例如,我与德语有联系,那么我的 sdk 应该带回该语言的选项集值。有我联系一个英文国家,sdk应该把英文标签给我带回来等等..
获取值没问题:
int optSetValue = ((OptionSetValue)entity["optionsetFieldName"]).value
但是我怎样才能得到正确语言的标签呢?
您需要执行 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。我相信应该包含正确的代码,虽然我还没有测试过......
要检索选定值的用户本地化选项标签,请尝试
string myoption;
if (!entity.FormattedValues.TryGetValue("optionsetFieldName", out myoption))
{
myoption = "Not found";
}
也可以使用 LINQ 查询FormattedValues IList<KeyValuePair<string,string>>
。
string optionlabel =entity.FormattedValues["optionsetFieldName"];
为我工作的代码:
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;
}