Sigo encontrándome con un requisito i18n en el que mis datos (no mi IU) deben ser internacionalizados.Internacionalización del contenido en Entity Framework
public class FooEntity
{
public long Id { get; set; }
public string Code { get; set; } // Some values might not need i18n
public string Name { get; set } // but e.g. this needs internationalized
public string Description { get; set; } // and this too
}
¿Cuáles son algunos de los enfoques que pueda usar?
Algunas cosas que he intentado: -
1) almacenar una clave de recursos en el PP
public class FooEntity
{
...
public string NameKey { get; set; }
public string DescriptionKey { get; set; }
}
- Pros: No es necesario el caso de consultas para obtener una traducción entidad.
System.Globalization
maneja los retrocesos para usted. - Contras: Las traducciones no pueden ser fácilmente administradas por un usuario administrador (tienen que implementar archivos de recursos cada vez que cambie mi
Foo
).
2) utilizar un tipo de LocalizableString
entidad
public class FooEntity
{
...
public int NameId { get; set; }
public virtual LocalizableString Name { get; set; }
public int NameId { get; set; }
public virtual LocalizableString Description { get; set; }
}
public class LocalizableString
{
public int Id { get; set; }
public ICollection<LocalizedString> LocalizedStrings { get; set; }
}
public class LocalizedString
{
public int Id { get; set; }
public int ParentId { get; set; }
public virtual LocalizableString Parent { get; set; }
public int LanguageId { get; set; }
public virtual Language Language { get; set; }
public string Value { get; set; }
}
public class Language
{
public int Id { get; set; }
public string Name { get; set; }
public string CultureCode { get; set; }
}
- Pros: Todas las cadenas localizadas en la misma tabla. La validación se puede realizar por cadena.
- Contras: Las consultas son horribles. Tiene que incluir la tabla LocalizedStrings una vez para cada cadena localizable en la entidad padre. Los retrocesos son difíciles e implican uniones extensas. No ha encontrado una manera de evitar N + 1 al recuperar, p. datos para una tabla.
3) Utilizar una entidad matriz con todas las propiedades invariantes y entidades secundarias que contienen todas las propiedades localizadas
public class FooEntity
{
...
public ICollection<FooTranslation> Translations { get; set; }
}
public class FooTranslation
{
public long Id { get; set; }
public int ParentId { get; set; }
public virtual FooEntity Parent { get; set; }
public int LanguageId { get; set; }
public virtual Language Language { get; set; }
public string Name { get; set }
public string Description { get; set; }
}
public class Language
{
public int Id { get; set; }
public string Name { get; set; }
public string CultureCode { get; set; }
}
- Pros: No es tan difícil (pero sigue siendo demasiado duro) para obtener! una traducción completa de una entidad en la memoria.
- Contras: Doble el número de entidades. No se pueden manejar las traducciones parciales de una entidad, especialmente el caso en el que, por ejemplo, el nombre proviene de
es
pero la descripción procede deles-AR
.
que tengo tres requisitos para una solución
Los usuarios pueden editar las entidades, idiomas y traducciones en tiempo de ejecución
Los usuarios pueden proporcionar traducciones parciales con las secuencias que faltan procedentes de un repliegue según System.Globalization
Las entidades se pueden traer a la memoria sin ejecutarlas p. ej. N + 1 números
Todavía no respondido, a mí también me interesó. – polkduran
No está claro lo que consideraría una respuesta aceptable. Si alguien tiene una opción 4, es probable que también tenga pros/contras. – explunit
Pregunta aclarada. No espero que haya una solución perfecta, pero espero que haya una mejor que la que he tenido hasta ahora. –