2013-04-21 85 views
0

我正在構建一個簡單的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; 
     } 
    } 
} 

的主要問題是,該文本未進行本地化,也不能輕易地本地化:簡單地傳遞格式字符串並不能解決英語語法多元化的問題,也不需要與其他語言一起工作。

一個可能的解決方案是從模型庫中移除概述字符串生成邏輯並將其移至消費者應用程序項目(無論如何本地化),但是模型庫也負責生成其他可能具有概述的實體包含在其中的消息,例如,系統的一部分會自動生成CalendarItem表中的條目,該表中有一個Description列,其中填充了IAccountService的概述。我不知道如何解開這個結。

回答

1

看來你正朝着正確的方向前進 - 在ASP.NET MVC表示層處理本地化。實現的一種方式是在表示層中有效地維護類層次結構,從而解決相應域實體的本地化問題。域模型甚至不會公開DisplayNameOverview等屬性 - 這些屬性完全位於表示層中。

要本地化像OverviewIntenseAuditService你可以有一個IntenseAuditServiceViewModel其中概述屬性檢索本地化的格式字符串,其中您提供的「變量」,如迭代次數,審覈日期等,您可以顯式處理語調通過具有複數和單數字符串格式。因此,在這種情況下,你可以有4個本地化資源稱爲IntenseAuditServiceOverview_DoReport_Plural,IntenseAuditServiceOverview_DoReport_Singular,IntenseAuditServiceOverview_NoReport_Plural,IntenseAuditServiceOverview_NoReport_Singular與EN-US是像

審計第一格式字符串{0:年月日},並將其報告給feds和{1:#,0} 迭代。

根據您的本地化需求,您可能會以不同的方式考慮因素。另一種方法是隻需要每個子字符串的本地化版本。您可能還需要爲每種語言進一步定製。

+0

謝謝。我的解決方案是返回一個'Dictionary ',並使用命名的字符串佔位符獲取已知字符串的客戶端格式。 – Dai 2013-05-23 06:25:39