预先注意一些事项:
- 我的回答更多是对这个问题的回答,您在其中添加了评论,然后导致了这个问题
- 在我的答案中,我使用的是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
如果存在该语言的翻译版本,则会以请求的语言返回产品的标题和说明。如果不存在翻译,则将返回默认语言的标题和描述。



