示例#1
0
        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);
                    }
                }
            }
        }
示例#2
0
        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;
        }
示例#3
0
        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);
        }
示例#4
0
        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);
        }