【问题标题】:Human-readable self-describing entities and localization人类可读的自描述实体和本地化
【发布时间】:2013-04-21 01:00:01
【问题描述】:

我正在构建一个简单的 CRUD 系统,用于管理企业的客户帐户。没什么特别的:)

该应用程序分为两部分:一个与文化无关的模型层,它是保存 EF 实体类的位置。前端是一个执行所有本地化任务的 ASP.NET MVC 项目。

我有一系列类似的EF实体,代表每个账户的附加服务,它们都实现了接口IAccountService,例如:

public interface IAccountService {

    String DisplayName { get; set; }
    String Overview    { get; set; }
}

public partial class IntenseAuditService : IAccountService {

    // Example database columns:
    public DateTime DateTimeOfAudit { get; set; }
    public Boolean ThreatenToReportThemToTheIrs { get; set; }
    public Int32 Iterations { get; set; }

    public String DisplayName { get { return "Intense audit"; } }

    public String Overview {
        get {
            String ret = "Audit on ";
            ret += this.DateTimeOfAudit.ToString();
            if( ThreatenToReportThemToTheIrs ) {
                ret += ", and report them to the feds"
            }
            if( Iterations == 1 ) ret += " and 1 iteration";
            else if( Iterations > 1 ) ret += " and " + Iterations + " iterations.";
            return ret;
        }
    }
}

主要问题是文本没有本地化,也不容易本地化:简单地传入一个格式字符串并不能解决英语语法的复数问题,并且不需要与其他语言一起使用.

一个可能的解决方案是从模型库中删除 Overview 字符串生成逻辑并将其移动到消费者应用程序项目(无论如何都完成本地化),但是模型库还负责生成可能具有 Overview 消息的其他实体例如,其中包含的部分系统会自动在CalendarItem 表中生成条目,该表的Description 列填充有来自IAccountService 的概述。我不知道如何解开这个结。

【问题讨论】:

    标签: .net domain-driven-design


    【解决方案1】:

    看来您正朝着正确的方向前进 - 在 ASP.NET MVC 表示层中处理本地化。一种实现方法是在表示层中有效地维护一个类层次结构,该层次结构解决了相应域实体的本地化问题。域模型甚至不会公开诸如DisplayNameOverview 之类的属性——这些属性将完全在表示层中。

    要将Overview 之类的内容本地化为IntenseAuditService,您可以使用IntenseAuditServiceViewModel,其中的overview 属性检索本地化格式字符串,您可以在其中提供“变量”,例如迭代次数、审核日期等。您可以通过同时使用复数和单数字符串格式来显式处理变形。因此,在这种情况下,您可以拥有 4 个本地化资源,称为 IntenseAuditServiceOverview_DoReport_Plural、IntenseAuditServiceOverview_DoReport_Singular、IntenseAuditServiceOverview_NoReport_Plural、IntenseAuditServiceOverview_NoReport_Singular,其中 en-US 中的第一个格式字符串类似于

    对 {0:yyyyMMdd} 进行审核,并将其报告给联邦调查局和 {1:#,0} 迭代。

    根据您的本地化需求,您可能会以不同的方式考虑这一点。另一种方法是只拥有每个子字符串的本地化版本。您可能还需要对每种语言进行进一步的自定义。

    【讨论】:

    • 谢谢。我的解决方案是返回 Dictionary<String,Object> 并使用命名字符串占位符获取具有已知字符串的客户端格式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-01
    • 2018-09-26
    • 1970-01-01
    • 2014-04-15
    • 2015-01-26
    • 2012-03-25
    • 1970-01-01
    相关资源
    最近更新 更多