private void MaybeAddNewTranslations(Type type, NotificationTriggerDataTrigger raw, TriggerPropertyEntry entry, EnumTranslation translation) { //We have an entry, but maybe it doesn't contain our language var html = (string)entry.RawInput.GetValue(raw); if (html == null) { return; } var values = HtmlParser.Default.GetDropDownList(html).SelectMany( d => d.Options.Select(o => new ForeignEnumValue(o.InnerHtml, o.Value, o.Selected, GetEnglishValue(entry.Property, type, o.Value), type)) ).ToList(); foreach (var value in values) { var match = translation.Translations.FirstOrDefault(t => t.Value == value.Value); if (match == null) { translation.Translations.Add(value); } else { var newNames = value.ForeignName.Where(n => !match.ForeignName.Contains(n)).ToArray(); if (newNames.Length > 0) { match.ForeignName.AddRange(newNames); } } } }
private void AddForeignEnum(Type type, NotificationTriggerDataTrigger raw, TriggerPropertyEntry entry, out EnumTranslation translation) { //We don't have an entry var html = (string)entry.RawInput.GetValue(raw); //Special case TriggerCondition in case the first trigger retrieved with a Condition property is a Change Trigger if (html == null && type != typeof(TriggerCondition)) { translation = null; return; } List <ForeignEnumValue> values = new List <ForeignEnumValue>(); if (html != null) { values.AddRange(HtmlParser.Default.GetDropDownList(html).SelectMany( d => d.Options.Select(o => new ForeignEnumValue(o.InnerHtml, o.Value, o.Selected, GetEnglishValue(entry.Property, type, o.Value), type)) ).DistinctBy(v => v.Value)); } //TriggerCondition.Change is a special case that's not listed in the HTML DropDown list options. It never //needs translating, so we set its English value to null. if (type == typeof(TriggerCondition)) { values.Add(new ForeignEnumValue("change", "change", false, null, type)); } translation = new EnumTranslation(type, values); TranslationMap[type] = translation; }
private ForeignEnumValue GetEnumDataFromSelectedValue(EnumTranslation translation, TriggerPropertyEntry entry, NotificationTriggerDataTrigger raw, string typedValue) { //Maybe the typed value has a different value to its raw counterpart. e.g. in German, //the typed value might be "Min." while the german value is "Minute" ForeignEnumValue enumData = null; var rawValue = (string)entry.RawProperty.GetValue(raw); if (typedValue != rawValue) { var rawInput = (string)entry.RawInput.GetValue(raw); //e.g. condition "change" on change triggers (which thankfully is always in English) doesn't have rawInput if (rawInput != null) { var selected = HtmlParser.Default.GetDropDownList(rawInput) .SelectMany(d => d.Options.Where(o => o.Selected)).First(); enumData = translation.Translations.Single(t => t.Value == selected.Value); enumData.ForeignName.Add(typedValue); } } return(enumData); }
private ForeignEnumValue GetEnumData(PropertyCache property, TriggerPropertyEntry entry, NotificationTriggerDataTrigger raw, string typedValue) { EnumTranslation translation; var underlyingType = property.Type.GetCacheValue().Underlying ?? property.Type; ForeignEnumValue enumData; bool isNew = false; lock (lockObj) { if (!TranslationMap.TryGetValue(underlyingType, out translation)) { AddForeignEnum(underlyingType, raw, entry, out translation); isNew = true; } if (translation == null) { return(null); } if (translation.Type == typeof(NotificationAction)) { var split = typedValue.Split('|'); typedValue = $"{split[0]}|{split[1]}"; } //In the case of NotificationActions, we only add a translation when it's the "None" action, //so we aren't guaranteed to have a translation enumData = translation.Translations.SingleOrDefault(t => t.ForeignName.Contains(typedValue)); if (enumData == null && !isNew) { MaybeAddNewTranslations(underlyingType, raw, entry, translation); enumData = translation.Translations.SingleOrDefault(t => t.ForeignName.Contains(typedValue)); } if (enumData == null) { enumData = GetEnumDataFromSelectedValue(translation, entry, raw, typedValue); } } return(enumData); }