我正在构建一个简单的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
的概述。我不知道如何解开这个结。
答案 0 :(得分:1)
您似乎正朝着正确的方向前进 - 在ASP.NET MVC表示层中处理本地化。实现的一种方式是有效地维护表示层中的类层次结构,该层次结构解析对应的域实体的本地化。域模型甚至不会公开DisplayName
和Overview
这样的属性 - 这些属性完全在表示层中。
要为Overview
本地化IntenseAuditService
之类的内容,您可以拥有IntenseAuditServiceViewModel
,其中overview属性检索本地化格式字符串,您可以在其中提供“变量”,例如迭代次数,审核日期等。您可以通过同时使用复数和单数字符串格式来显式处理变形。因此,在这种情况下,您可以拥有4个本地化资源,名为IntenseAuditServiceOverview_DoReport_Plural,IntenseAuditServiceOverview_DoReport_Singular,IntenseAuditServiceOverview_NoReport_Plural,IntenseAuditServiceOverview_NoReport_Singular,其中en-US中的第一个格式字符串类似于
审核{0:yyyyMMdd},并将其报告给联邦政府和{1:#,0} 迭代。
根据您的本地化需求,您可能会以不同的方式对此进行分析。另一种方法是,只有每个子字符串的本地化版本。您可能还需要针对每种语言进行进一步的自定义。