Ciągle spotykam się z wymogiem i18n, w którym moje dane (nie mój interfejs) muszą być umiędzynarodowione.Internacjonalizacja treści w 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
}
Jakie metody mogę zastosować?
Niektóre rzeczy Próbowałem: -
1) Przechowywać kluczowym zasobem w db
public class FooEntity
{
...
public string NameKey { get; set; }
public string DescriptionKey { get; set; }
}
- Plusy: Nie ma potrzeby stosowania skomplikowanych zapytań, aby uzyskać przetłumaczone jednostka.
System.Globalization
obsługuje awarie dla ciebie. - Wady: Tłumaczenia nie mogą być łatwo zarządzane przez administratora (muszą wdrażać pliki zasobów, gdy tylko zmienią się moje
Foo
s).
2) Za pomocą jednostki typu LocalizableString
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; }
}
- Pro Wszystkie lokalizowane łańcuchy w tej samej tabeli. Sprawdzanie poprawności może być wykonywane na łańcuchu.
- Minusy: zapytania są okropne. Należy .Zawiera tabelę LocalizedStrings jeden raz dla każdego zlokalizowanego ciągu znaków na elemencie nadrzędnym. Fallouty są trudne i wiążą się z dużym łączeniem. Nie znalazłem sposobu na uniknięcie N + 1 podczas pobierania np. dane dla tabeli.
3) Za pomocą jednostki dominującej ze wszystkimi niezmiennych właściwościach i jednostek podrzędnych zawierających wszystkie miejscowe właściwości
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; }
}
- Plusy: Nie tak trudne (ale wciąż zbyt trudne), aby dostać! pełne tłumaczenie jednostki na pamięć.
- Przeciw: Podwójna liczba elementów. Nie można obsłużyć częściowych tłumaczeń obiektu - szczególnie w przypadku, gdy, powiedzmy, nazwa pochodzi od
es
, ale opis nadchodzi odes-AR
.
Mam trzy wymagania dotyczące rozwiązania
użytkownicy mogą edytować podmioty, języków i tłumaczenia w czasie wykonywania
Użytkownicy mogą dostarczyć częściowe tłumaczenia z brakujących ciągów pochodzących z awaryjnej zgodnie z System.Globalization
Elementy można wprowadzić do pamięci bez uruchamiania na przykład do Wydania N + 1
Nadal nie otrzymałem odpowiedzi, również mnie zainteresowałem. – polkduran
Nie jest jasne, co byś uznał za akceptowalną odpowiedź. Jeśli ktoś ma opcję 4, prawdopodobnie będzie miał również za i przeciw. – explunit
Wyjaśnione pytanie. Nie spodziewam się, że będzie to idealne rozwiązanie, ale mam nadzieję, że jest jeszcze lepsze rozwiązanie niż dotychczas. –