Tôi tiếp tục yêu cầu i18n khi dữ liệu của tôi (không phải giao diện người dùng của tôi) cần được quốc tế hóa.Quốc tế hóa nội dung trong 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
}
Tôi có thể sử dụng một số phương pháp nào?
Một số điều tôi đã cố gắng: -
1) Cất giữ một phím nguồn trong db
public class FooEntity
{
...
public string NameKey { get; set; }
public string DescriptionKey { get; set; }
}
- Ưu điểm: Không cần phải cho các truy vấn phức tạp để có được một dịch thực thể.
System.Globalization
xử lý các khoản hoàn trả cho bạn. - Nhược điểm: Người dùng quản trị không thể dễ dàng quản lý bản dịch (phải triển khai tệp tài nguyên bất cứ khi nào thay đổi của tôi
Foo
s).
2) Sử dụng một loại thực thể 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; }
}
- Ưu điểm: Tất cả các dây cục bộ trong cùng một bảng. Xác nhận có thể được thực hiện cho mỗi chuỗi.
- Nhược điểm: Truy vấn rất đáng sợ. Phải bao gồm bảng LocalizedStrings một lần cho mỗi chuỗi có thể bản địa hóa trên thực thể cha. Sự sụp đổ là khó khăn và liên quan đến việc tham gia rộng rãi. Đã không tìm thấy cách tránh N + 1 khi truy xuất ví dụ: dữ liệu cho một bảng.
3) Sử dụng một công ty mẹ với tất cả các thuộc tính bất biến và các tổ chức con chứa tất cả các thuộc tính cục bộ
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; }
}
- Ưu điểm: Không như cứng (nhưng vẫn còn quá cứng) để có được! bản dịch đầy đủ của một thực thể vào bộ nhớ.
- Nhược điểm: Tăng gấp đôi số lượng thực thể. Không thể xử lý bản dịch từng phần của một thực thể - đặc biệt là trường hợp, như vậy, Tên là đến từ
es
nhưng Mô tả đến từes-AR
.
tôi có ba yêu cầu cho một giải pháp
Người dùng có thể chỉnh sửa các đối tượng, ngôn ngữ và bản dịch trong thời gian chạy
Người dùng có thể cung cấp dịch từng phần với chuỗi mất tích đến từ một dự phòng theo System.Globalization
Thực thể có thể được đưa vào bộ nhớ mà không cần chạy trong ví dụ: Các vấn đề về N + 1
Vẫn chưa được trả lời, tôi cũng quan tâm. – polkduran
Nó không rõ ràng những gì bạn sẽ xem xét một câu trả lời chấp nhận được. Nếu ai đó có một tùy chọn 4 nó có khả năng có ưu/khuyết quá. – explunit
Câu hỏi đã được làm rõ. Tôi không mong đợi có một giải pháp hoàn hảo, nhưng hy vọng có một giải pháp tốt hơn tôi đã nghĩ ra cho đến nay. –