我想创建一个类来翻译我的插件自定义异常消息。
我能够使用以下代码针对javascript实现此目标:
LocalizedLabels: {
AlertMessages: {
EmaiTemplateInvitation: {
'1033': 'Please select an Email Template for invitations and try again.',
'1031': 'Bitte wählen Sie eine E-Mail-Vorlage für Einladungen aus und versuchen Sie es erneut.'
},
TypeForecastInfo: {
'1033': 'Please type Forecast information.',
'1031': 'Please type Forecast information.'
}
},
// call by
Alert.show(LocalizedLabels.AlertMessages.EmaiTemplateInvitation[Xrm.Page.context.getUserLcid()], null, null, "WARNING", 500, 200);
对于csharp,我想要类似的东西。谢谢
答案 0 :(得分:1)
方法很多。这是确定用户语言的方法:
int GetUserLanguageCode(IPluginExecutionContext context)
{
var userSettingsQuery = new QueryExpression("usersettings");
userSettingsQuery.ColumnSet.AddColumns("uilanguageid", "systemuserid");
userSettingsQuery.Criteria.AddCondition("systemuserid",
ConditionOperator.Equal,
context.InitiatingUserId);
var userSettings = this.orgService.RetrieveMultiple(userSettingsQuery);
return (int)userSettings.Entities[0]["uilanguageid"];
}
接下来的事情是您需要将本地化存储在某个地方。选项是:
1)静态字典(简单,但很粗略-因为您要使用静态文本内容来注入代码)
2)嵌入式资源(如果您可以始终将本地化与插件代码一起提供)
3)在CRM中声明单独的Web资源(例如xml或json格式),动态地加载它(以防您需要将本地化版本与插件版本分开更改
然后,当您需要引发异常时,就像:
int languageCode = GetUserLanguageCode(context);
throw new InvalidPluginExecutionException(GetResources(languageCode, "TypeForecastInfo"));
如何读取嵌入式资源(只是一个示例,在现实生活中,您可能希望将其缓存在内存中):
public string GetResources(int languageCode, string key)
{
var serializer = new DataContractJsonSerializer(typeof(Dictionary<string, string>));
using (var stream = this.GetType().Assembly.GetManifestResourceStream($"Namespace.{languageCode}.json"))
{
if (stream != null)
{
var map = (Dictionary<string, string>)serializer.ReadObject(stream );
string value;
if (map.TryGetValue(key, out value))
{
return value;
}
}
}
return result;
}
说1033.json
{
"TypeForecastInfo": "Foobar"
}