插件自定义异常消息的翻译类

时间:2019-05-17 10:48:30

标签: c# dynamic dynamics-crm dynamics-365 language-translation

我想创建一个类来翻译我的插件自定义异常消息。

我能够使用以下代码针对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,我想要类似的东西。谢谢

1 个答案:

答案 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"
}