Класс перевода для плагина пользовательского сообщения об исключении - PullRequest
0 голосов
/ 17 мая 2019

Я хочу создать класс, который переводит сообщения о пользовательских исключениях моего плагина.

Я смог добиться этого для 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.Thankyou

1 Ответ

1 голос
/ 20 мая 2019

Есть ряд методов.Вот как определить язык пользователя:

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 (скажем, в формате 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"
}
...