private Group AddQuestionGroup(Group sectionToUse, UIDataString key)
        {
            var categoryGroup = sectionToUse.SubGroups?.SingleOrDefault(g => g.Id == "Details") ?? sectionToUse.AddSubGroup("Details");
            var questionGroup = categoryGroup.AddSubGroup($"{FileBody.kQuestionIdPrefix}{key.ScriptureReference}+{key.Question}");

            questionGroup.SubGroups = new List <Group>();
            return(questionGroup);
        }
        public virtual bool TryGetLocalizedString(UIDataString key, out string localized)
        {
            if (m_fastLookup.TryGetValue(key, out Tuple <string, bool> value))
            {
                localized = value.Item1;
                return(value.Item2);
            }
            var info = Localizations.GetStringLocalization(key);

            if (info != null && info.Target.IsLocalized)
            {
                localized = info.Target.Text;
                m_fastLookup.Add(key, new Tuple <string, bool>(localized, true));
                return(true);
            }
            localized = key.SourceUIString;
            m_fastLookup.Add(key, new Tuple <string, bool>(localized, false));
            return(false);
        }
        string LookupTranslation(List <XmlTranslation> translations, UIDataString key)
        {
            XmlTranslation firstMatchOnPhrase = null;

            foreach (var translation in translations)
            {
                if (translation.PhraseKey == key.SourceUIString)
                {
                    if (translation.Reference == key.ScriptureReference)
                    {
                        return(translation.Translation);
                    }
                    if (firstMatchOnPhrase == null)
                    {
                        firstMatchOnPhrase = translation;
                    }
                }
            }
            return(firstMatchOnPhrase?.Translation);
        }
        internal TranslationUnit GetTranslationUnit(UIDataString key)
        {
            switch (key.Type)
            {
            case LocalizableStringType.Category:
                return(Localizations.Categories.TranslationUnits.FirstOrDefault(tu => tu.English == key.SourceUIString));

            case LocalizableStringType.SectionHeading:
                return(Localizations.Groups.FirstOrDefault(g => g.Id == FileBody.GetSectionId(key))?.TranslationUnits.Single());

            case LocalizableStringType.Question:
                return(Localizations.FindQuestionGroup(key)?.TranslationUnits.Single());

            case LocalizableStringType.Alternate:
            case LocalizableStringType.Answer:
            case LocalizableStringType.Note:
                return(Localizations.FindQuestionGroup(key)?.GetQuestionSubGroup(key.Type)?.TranslationUnits.SingleOrDefault(tu => tu.English == key.SourceUIString));

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
        internal TranslationUnit GetLocalizableStringInfo(UIDataString key)
        {
            if (String.IsNullOrWhiteSpace(key?.SourceUIString))
            {
                return(null);
            }

            if (key.Type == LocalizableStringType.Category)
            {
                return(Localizations.Categories.TranslationUnits.SingleOrDefault(tu => tu.English == key.SourceUIString));
            }
            if (key.Type == LocalizableStringType.SectionHeading)
            {
                return(Localizations.Groups.SingleOrDefault(g => g.Id == FileBody.GetSectionId(key))?.TranslationUnits?.Single());
            }

            var question = Localizations.FindQuestionGroup(key);

            if (question == null)
            {
                return(null);
            }
            switch (key.Type)
            {
            case LocalizableStringType.Question:
                return(question.TranslationUnits?.SingleOrDefault());

            case LocalizableStringType.Answer:
            case LocalizableStringType.Note:
            case LocalizableStringType.Alternate:
                return(question.GetQuestionSubGroup(key.Type)?.
                       TranslationUnits.SingleOrDefault(tu => tu.English == key.SourceUIString));

            default:
                throw new Exception("Unhandled type!");
            }
        }
        public TranslationUnit AddLocalizationEntry(UIDataString data, string localizedString = null, bool isLocalized = true, int specificSection = 0)
        {
            if (String.IsNullOrWhiteSpace(data?.SourceUIString))
            {
                throw new ArgumentException("Invalid key!", nameof(data));
            }

            InitializeLookupTable();

            TranslationUnit existing;
            Group           group = null;
            var             type  = data.Type;

            if (type == LocalizableStringType.Category)
            {
                existing = Localizations.Categories.TranslationUnits.SingleOrDefault(c => c.Id == data.SourceUIString);
                if (existing == null)
                {
                    return(Localizations.Categories.AddTranslationUnit(data, localizedString, isLocalized));
                }
            }
            else if (type == LocalizableStringType.SectionHeading)
            {
                var id = FileBody.GetSectionId(data);
                existing = Localizations.Groups.FirstOrDefault(g => g.Id == id)?.TranslationUnits.Single();
                if (existing == null)
                {
                    var sectionGroup = new Group {
                        Id = id
                    };
                    Localizations.Groups.Add(sectionGroup);
                    sectionGroup.SubGroups = new List <Group>();
                    return(sectionGroup.AddTranslationUnit(data, localizedString, isLocalized));
                }
            }
            else
            {
                var sectionGroup = Localizations.FindSectionsForQuestion(data).Skip(specificSection).FirstOrDefault();
                Debug.Assert(sectionGroup != null);
                group = sectionGroup.FindQuestionGroup(data.Question) ?? AddQuestionGroup(sectionGroup, data);
                switch (type)
                {
                case LocalizableStringType.Question:
                    existing = group.TranslationUnits?.FirstOrDefault();
                    break;

                case LocalizableStringType.Alternate:
                    group    = group.SubGroups?.SingleOrDefault(g => g.Id == FileBody.kAlternatesGroupId) ?? group.AddSubGroup(FileBody.kAlternatesGroupId);
                    existing = group.TranslationUnits?.FirstOrDefault(a => a.English == data.SourceUIString);
                    break;

                case LocalizableStringType.Answer:
                    group    = group.SubGroups?.SingleOrDefault(g => g.Id == FileBody.kAnswersGroupId) ?? group.AddSubGroup(FileBody.kAnswersGroupId);
                    existing = group.TranslationUnits?.FirstOrDefault(a => a.English == data.SourceUIString);
                    break;

                case LocalizableStringType.Note:
                    group    = group.SubGroups?.SingleOrDefault(g => g.Id == FileBody.kNotesGroupId) ?? group.AddSubGroup(FileBody.kNotesGroupId);
                    existing = group.TranslationUnits?.FirstOrDefault(a => a.English == data.SourceUIString);
                    break;

                default:
                    throw new ArgumentOutOfRangeException();
                }
            }

            if (existing == null)
            {
                Debug.Assert(group != null);
                return(group.AddTranslationUnit(data, localizedString, isLocalized));
            }
            existing.Target.Text        = localizedString;
            existing.Target.IsLocalized = isLocalized;
            return(existing);
        }
 public string GetLocalizedDataString(UIDataString key, out string localeID)
 {
     localeID = TryGetLocalizedString(key, out string localized) ? Locale : "en";
     return(localized);
 }
 public string GetLocalizedString(UIDataString key, bool failoverToEnglish = true)
 {
     return(TryGetLocalizedString(key, out string localized) ? localized : (failoverToEnglish ? key.SourceUIString : null));
 }