protected override List <TRow> GetItems() { var items = base.GetItems(); if (items.Any()) { var attr = items.First().GetType().GetCustomAttribute <LocalizationRowAttribute>(); if (attr == null) { return(items); } var localRowType = attr.LocalizationRow; var localRowFactory = FastReflection.DelegateForConstructor <Row>(localRowType); var localRow = localRowFactory(); var foreignKeyFieldName = attr.MappedIdField ?? ((Field)((IIdRow)items.First()).IdField).PropertyName; var foreignKeyField = localRow.FindFieldByPropertyName(foreignKeyFieldName) ?? localRow.FindField(foreignKeyFieldName); var foreignKeyCriteria = new Criteria(foreignKeyField.PropertyName ?? foreignKeyField.Name); var languageIdKeyField = ((Field)((ILocalizationRow)localRow).CultureIdField).PropertyName; var languageIdField = localRow.FindFieldByPropertyName(languageIdKeyField) ?? localRow.FindField(languageIdKeyField); var languageIdCriteria = new Criteria(languageIdField.PropertyName ?? languageIdField.Name); var culture = CultureInfo.CurrentUICulture.TwoLetterISOLanguageName; var userLanguage = new LanguageRow(); using (var connectionLanguage = SqlConnections.NewFor <LanguageRow>()) { userLanguage = connectionLanguage.TryFirst <LanguageRow>(new Criteria(LanguageRow.Fields.LanguageId).Like($"%{culture}%")); if (userLanguage == null) { return(items); } } var listHandler = DefaultHandlerFactory.ListHandlerFor(localRowType); var listRequest = DefaultHandlerFactory.ListRequestFor(localRowType); listRequest.ColumnSelection = ColumnSelection.List; listRequest.Criteria = (foreignKeyCriteria.In(items.Select(i => i.IdField[i])) && languageIdCriteria == userLanguage.Id.Value); var translationsResponse = listHandler.Process(SqlConnections.NewFor <TRow>(), listRequest); if (translationsResponse.Entities.Count == 0) { return(items); } foreach (var item in items) { var translated = translationsResponse.Entities.Cast <IOMPLocalizationLangRow>().FirstOrDefault( t => (Int32)foreignKeyField.AsObject(t as Row) == item.IdField[item]); if (translated != null && !string.IsNullOrEmpty(translated.NameField[translated as Row])) { item.NameField[item] = translated.NameField[translated as Row]; } } } return(items); }
private LanguageRow GetLanguageRow(String paLanaguage) { LanguageRow lcLanguageRow; lcLanguageRow = new LanguageRow(null); foreach (DataRow lcRow in clLanaguageList.Rows) { lcLanguageRow.Row = lcRow; if (lcLanguageRow.Language == paLanaguage) { return(lcLanguageRow); } } return(null); }
public void OnReturn(IListRequestHandler handler) { if (handler.Response.Entities.Count == 0) { return; } // Lets Get the main row and translate it var culture = CultureInfo.CurrentUICulture.TwoLetterISOLanguageName; var userLanguage = new LanguageRow(); using (var connectionLanguage = SqlConnections.NewFor <LanguageRow>()) { userLanguage = connectionLanguage.TryFirst <LanguageRow>(new Criteria(LanguageRow.Fields.LanguageId).Like($"%{culture}%")); if (userLanguage == null) { return; } } var listHandler = DefaultHandlerFactory.ListHandlerFor(localRowType); var listRequest = DefaultHandlerFactory.ListRequestFor(localRowType); listRequest.ColumnSelection = ColumnSelection.List; List <IOMPLocalizationRow> localList = handler.Response.Entities.Cast <IOMPLocalizationRow>().ToList(); listRequest.Criteria = (foreignKeyCriteria.In(localList.Select(s => s.IdField[s as Row])) && languageIdCriteria == userLanguage.Id.Value); var translationsResponse = listHandler.Process(handler.Connection, listRequest); if (translationsResponse.Entities.Count > 0) { var responseLang = translationsResponse.Entities.Cast <IOMPLocalizationLangRow>(); // Validate They have IName row foreach (IOMPLocalizationRow responseEntity in handler.Response.Entities) { var entityLang = responseLang .FirstOrDefault(s => (Int32)foreignKeyField.AsObject(s as Row) == responseEntity.IdField[responseEntity as Row]); if (entityLang != null && !string.IsNullOrEmpty(entityLang?.NameField[entityLang as Row])) { responseEntity.NameField[responseEntity as Row] = entityLang?.NameField[entityLang as Row]; } } } // How about the joined tables, lets translate them too var localizationRowFields = handler.Row.GetFields(); foreach (var localizationRowField in localizationRowFields.Where(f => !String.IsNullOrEmpty(f.ForeignTable))) { var foreignKeyAttr = localizationRowField.GetAttribute <ForeignKeyAttribute>(); var textualFieldAttr = localizationRowField.GetAttribute <TextualFieldAttribute>(); if (foreignKeyAttr.RowType == null || textualFieldAttr == null || string.IsNullOrEmpty(textualFieldAttr.Value)) { continue; } var foreignRowFactory = FastReflection.DelegateForConstructor <Row>(foreignKeyAttr.RowType); var foreignRow = foreignRowFactory(); var foreignAttr = foreignRow.GetType().GetCustomAttribute <LocalizationRowAttribute>(); if (foreignAttr == null) { continue; } var foreignLangType = foreignAttr.LocalizationRow; var foreignLangRowFactory = FastReflection.DelegateForConstructor <Row>(foreignLangType); var foreignLangRow = foreignLangRowFactory(); var externalForeignKeyFieldName = foreignAttr.MappedIdField ?? ((Field)((IIdRow)foreignRow).IdField).PropertyName; var externalForeignKeyField = foreignLangRow.FindFieldByPropertyName(externalForeignKeyFieldName) ?? foreignLangRow.FindField(externalForeignKeyFieldName); var listForeignHandler = DefaultHandlerFactory.ListHandlerFor(foreignLangType); var listForeignRequest = DefaultHandlerFactory.ListRequestFor(foreignLangType); listRequest.ColumnSelection = ColumnSelection.List; var externalForeignCriteria = new Criteria(externalForeignKeyField.PropertyName ?? externalForeignKeyField.Name); var idList = new List <Int32>(); foreach (IOMPLocalizationRow responseEntity in handler.Response.Entities) { var idToAdd = (Int32?)localizationRowField.AsObject(responseEntity as Row); if (idToAdd.HasValue) { idList.Add(idToAdd.Value); } } if (!idList.Any()) { continue; } listForeignRequest.Criteria = externalForeignCriteria.In(idList.Distinct()) && languageIdCriteria == userLanguage.Id.Value; var translationsForeignResponse = listForeignHandler.Process(handler.Connection, listForeignRequest); if (translationsForeignResponse.TotalCount > 0) { foreach (IOMPLocalizationRow responseEntity in handler.Response.Entities) { var localId = (Int32?)localizationRowField.AsObject(responseEntity as Row); var entityLang = translationsForeignResponse.Entities.Cast <IOMPLocalizationLangRow>() .FirstOrDefault(s => (Int32?)externalForeignKeyField.AsObject(s as Row) == localId); if (entityLang != null) { var foreignEntityName = entityLang?.NameField[entityLang as Row]; var textualFieldExternal = (responseEntity as Row).FindField(textualFieldAttr.Value); if (!string.IsNullOrEmpty(foreignEntityName)) { textualFieldExternal.AsObject(responseEntity as Row, foreignEntityName); } } } } } }
public void UpdateView() { pushedPage = null; var sheet = CharacterSheetStorage.Instance.selectedCharacter; if (sheet == null) { return; } var languagesCount = languages.Count; var rowsCount = languageRows.Count; var updateCount = Math.Min(languagesCount, rowsCount); for (var i = 0; i < updateCount; i++) { var languageIndex = i; var row = languageRows[i]; var language = languages[i]; row.name.Text = language; EventHandler handler = (s, e) => Language_Tap(language, languageIndex); MainPage.SetTapHandler(row.frame, handler, 1); } var count = languagesCount - rowsCount; if (count > 0) { for (var i = 0; i < count; i++) { var languageIndex = updateCount + i; var language = languages[languageIndex]; var row = new LanguageRow(); row.frame = CreateFrame(language); row.name = row.frame.Content as Label; row.name.TextDecorations = TextDecorations.Underline; EventHandler handler = (s, e) => Language_Tap(language, languageIndex); MainPage.SetTapHandler(row.frame, handler, 1); languageRows.Add(row); var rowIndex = languageIndex; Languages.Children.Add(row.frame, 0, rowIndex); } } else if (count < 0) { while (languageRows.Count > languages.Count) { var last = languageRows.Count - 1; var row = languageRows[last]; languageRows.RemoveAt(last); Languages.Children.Remove(row.frame); } } rowsCount = languageRows.Count; if ((Languages.RowDefinitions == null) || (Languages.RowDefinitions.Count != rowsCount)) { Languages.RowDefinitions = new RowDefinitionCollection(); for (int i = 0; i < rowsCount; i++) { Languages.RowDefinitions.Add(new RowDefinition() { Height = GridLength.Auto, }); } } }