栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

多语言数据库,默认回退

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

多语言数据库,默认回退

预先注意一些事项:

  • 我的回答更多是对这个问题的回答,您在其中添加了评论,然后导致了这个问题
  • 在我的答案中,我使用的是C#和MS SQL Server(并且我将省略所有OR映射的特定代码)

在我的应用程序中,根据使用情况,我使用两种不同的方法来加载多语言数据:

行政/ CRUD

在用户输入数据或编辑现有数据(例如带有翻译的产品)的情况下,我使用的是与您在问题中上面显示的方法相同的方法,例如:

public class Product{    public int ID {get; set;}    public string SKU {get; set;}    public IList<ProductTranslation> Translations {get; set;}}public class ProductTranslation{    public string Language {get; set;}    public bool IsDefaultLanguage {get; set;}    public string Title {get; set;}    public string Description {get; set;}}

即,我将让OR映射器加载带有所有翻译的产品实例。然后,我遍历翻译并选择所需的翻译。

前端/只读

在这种情况下(主要是前端代码),我通常只向用户显示信息(最好以用户的语言显示),因此我使用了另一种方法:

首先,我使用的是不同的数据模型,该模型不支持/不知道多重翻译的概念。相反,它只是当前用户使用“最佳”语言表示的产品:

public class Product{    public int ID {get; set;}    public string SKU {get; set;}    // language-specific properties    public string Title {get; set;}    public string Description {get; set;}}

为了加载此数据,我使用了不同的查询(或存储过程)。例如,要加载ID

@Id
为该语言的产品
@Language
,我将使用以下查询:

SELECt    p.ID,    p.SKU,    -- get title, description from the requested translation,    -- or fall back to the default if not found:    ISNULL(tr.Title, def.Title) Title,    ISNULL(tr.Description, def.Description) Description  FROM Products p  -- join requested translation, if available:  LEFT OUTER JOIN ProductTranslations tr    ON p.ID = tr.ProductId AND tr.Language = @Language  -- join default language of the product:  LEFT OUTER JOIN ProductTranslations def    ON p.ID = def.ProductId AND def.IsDefaultLanguage = 1  WHERe p.ID = @Id

如果存在该语言的翻译版本,则会以请求的语言返回产品的标题和说明。如果不存在翻译,则将返回默认语言的标题和描述。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/393607.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号