Есть ряд методов.Вот как определить язык пользователя:
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"
}