gpt4 book ai didi

ef-code-first - EF Code First 多语言支持

转载 作者:行者123 更新时间:2023-12-03 18:42:47 34 4
gpt4 key购买 nike

假设您必须使用 EF Code First 和 POCO 类开发支持多种语言的网站,您将如何对 POCO 类进行建模以支持这种情况?

通过多语言支持,我的意思不仅是拥有例如在一些资源文件中为您的 UI 标记翻译,但您还需要在数据库中存储给定域实体的名称、描述等。

例如:假设您的领域模型有一个实体产品。在您的数据库中,您需要存储 2 种语言的产品名称和描述(为简单起见,2 个字段)(但将来可以添加更多语言)。
根据当前的文化,UI 需要从资源文件中提取标签的文本(这很容易实现),但您还需要显示来自数据库的产品的名称和描述。

最佳答案

最后,我制作了自己的类来支持我的数据库数据中的多语言。

我是西类牙人,我已经在这里翻译了我的代码,也许它有简单的语法错误,

  • 您有一个 Product 类,它的 ProductName 属性为 MultilingualString 类型
  • MultilingualString 类对每种未知语言都有一个默认文本,并有一个该文本的翻译列表。它有设置不同翻译的方法(SetTranslation)和翻译成特定语言的方法。最后这个类有一个属性 tu 转换为当前线程文化(翻译)
  • 您有包含语言和翻译文本的 Translation 类

  • 这里的代码:
    public class Product
    {
    public int Id { get; set; }
    public MultilingualString ProductName { get; set; }
    }

    public class MultilingualString
    {
    // You need it only to make the class persistent
    public int Id { get; set; }

    public string Text { get; set; }
    public virtual ICollection<Translation> Translations { get; set; }

    public string Translation { get { return Translate(); } }

    public void SetTranslation(string language, string text)
    {
    if (Translations == null)
    Translations = new List<Translation>();

    var found = Translations.Where(t => t.Language.ToUpper() == language.ToUpper()).FirstOrDefault();
    if (found == null)
    Translations.Add(new Translation() { Language = language, Text = text });
    else
    found.Text = text;
    }

    public string Translate(string cultureName)
    {
    return Translate(new CultureInfo(cultureName));
    }


    public string Translate(CultureInfo culture = null)
    {
    if (culture == null)
    culture = Thread.CurrentThread.CurrentCulture;

    var translation = Translations == null
    ? null
    : Translations.Where(
    t =>
    culture.Name.ToUpper(CultureInfo.InvariantCulture).StartsWith(
    t.Language.ToUpper(CultureInfo.InvariantCulture))).FirstOrDefault();

    return translation == null ? Text : translation.Text;
    }
    }

    public class Translation
    {
    // You need it only to make the class persistent
    public int Id { get; set; }
    public string Language { get; set; }
    public string Text { get; set; }
    }

    您可以构建 DbContext 类并进行如下测试:
    public class MultilingualContext : DbContext
    {
    public DbSet<Product> Products { get; set; }
    }

    [TestClass]
    public class Tests
    {
    [TestMethod]
    public void ThisWorksFine()
    {
    using (var context = new MultilingualContext())
    {
    var product = new Product();
    context.Products.Add(product);

    product.ProductName = new MultilingualString() { Text = "Beer (default language)" };
    product.ProductName.SetTranslation("en", "Beer");
    product.ProductName.SetTranslation("es", "Cerveza");
    product.ProductName.SetTranslation("fr", "Bière");
    product.ProductName.SetTranslation("de", "Bier");

    var spanishProductName = product.ProductName.Translate(new CultureInfo("es"));
    Assert.AreEqual(spanishProductName, "Cerveza");

    var culture = Thread.CurrentThread.CurrentCulture;

    Thread.CurrentThread.CurrentCulture = new CultureInfo("en");
    Assert.AreEqual(product.ProductName.Translation, "Beer");
    Thread.CurrentThread.CurrentCulture = new CultureInfo("es");
    Assert.AreEqual(product.ProductName.Translation, "Cerveza");
    Thread.CurrentThread.CurrentCulture = new CultureInfo("fr");
    Assert.AreEqual(product.ProductName.Translation, "Bière");
    Thread.CurrentThread.CurrentCulture = new CultureInfo("de");
    Assert.AreEqual(product.ProductName.Translation, "Bier");
    Thread.CurrentThread.CurrentCulture = new CultureInfo("it");
    Assert.AreEqual(product.ProductName.Translation, "Beer (default language)");

    Thread.CurrentThread.CurrentCulture = culture;

    context.SaveChanges();


    }
    }
    }

    我必须结束它,我希望这一切正常;)

    此致!

    更新

    还有一件事,当您删除产品时,不要删除多语言字符串条目。您可以将业务逻辑添加到您的服务中,并在删除产品时删除多语言条目。

    或不!。如果您不删除多语言条目,您将拥有越来越多的 MultilingualStrings 条目,您可以利用此存储库为 future 的产品提供翻译的产品名称。

    您可以将 MultilingualStrings 添加到上下文中:
    public class MultilingualContext : DbContext
    {
    public DbSet<Product> Products { get; set; }
    public DbSet<MultilingualString> MultilingualStrings { get; set; }
    }

    然后你可以在 ProductNameTextBoxOnChange 事件中搜索 MultilingualStrings 例如:
    context.MultilingualStrings.Where(s => s.Translation.StartsWith(ProductNameTextBox.Text));

    您可以将此存储库用于具有多语言字符串的其他实体的其他属性。

    关于ef-code-first - EF Code First 多语言支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8367487/

    34 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com