2013-05-28 34 views
7

Tôi cố gắng để đạt được hai điều:Localization trong ASP.NET MVC 4 sử dụng App_GlobalResources

  1. Khoanh vùng các “xây dựng trong” thông báo lỗi cho “FieldMustBeDate” và "FieldMustBeNumeric".
  2. Bản địa hóa một số thông báo lỗi khác mà bạn gặp phải, ví dụ: "PropertyValueRequired".

Bằng cách sử dụng http://forums.asp.net/t/1862672.aspx/1 cho vấn đề 1 và MVC 4 ignores DefaultModelBinder.ResourceClassKey cho vấn đề 2 Tôi đã quản lý để làm việc tại địa phương.

Tuy nhiên ngay sau khi tôi xuất bản lên trang web, thông báo lỗi "được tích hợp sẵn" mặc định trở lại tiếng Anh trong khi các thông báo lỗi khác vẫn được bản địa hóa.

Tôi đã đọc một số địa điểm sử dụng App_GlobalResources nên tránh, tuy nhiên tôi không thể hoàn thành vấn đề 1 mà không sử dụng vấn đề này.

Tôi đã tạo tệp .resx với tên "WebResources.resx", đặt Hành động xây dựng thành "Nhúng", đặt Sao chép sang thư mục đầu ra thành "Không sao chép", đặt Công cụ tùy chỉnh thành "PublicResXFileCodeGenerator" và đặt Không gian tên công cụ tùy chỉnh thành "Tài nguyên". Bản thân Dự án được đặt thành chỉ Xuất bản các tệp cần thiết.

My Global.asax.cs chứa sau (có liên quan) Mã:

ClientDataTypeModelValidatorProvider.ResourceClassKey = "WebResources"; 
    DataAnnotationsModelValidatorProvider.RegisterAdapter(
    typeof(RequiredAttribute), 
    typeof(MyRequiredAttributeAdapter)); 

Và MyRequiredAttributeAdapter lớp chứa đoạn mã sau:

public class MyRequiredAttributeAdapter : RequiredAttributeAdapter 
{ 
    public MyRequiredAttributeAdapter(
     ModelMetadata metadata, 
     ControllerContext context, 
     RequiredAttribute attribute 
    ) 
     : base(metadata, context, attribute) 
    { 
     if (attribute.ErrorMessageResourceType == null) 
     { 
      attribute.ErrorMessageResourceType = typeof(Resources.WebResources); 
     } 
     if (attribute.ErrorMessageResourceName == null) 
     { 
      attribute.ErrorMessageResourceName = "PropertyValueRequired"; 
     } 
    } 
} 

này đang làm việc tại địa phương tuy nhiên không ai có bất kỳ ý tưởng về làm thế nào để có được "được xây dựng trong" tin nhắn để làm việc sau khi điều này được xuất bản?

Cảm ơn sự giúp đỡ của bạn!

Trân trọng, Andreas

Trả lời

5

Tôi đã tự mình tìm ra điều này. Nếu bạn đang cố gắng thực hiện ở trên, bạn phải tách các thông báo lỗi được bản địa hóa.

Tạo tệp * .resx cho các thông báo lỗi khác fx "PropertyValueRequired" và đặt Build Action thành "Embedded", đặt Copy to Output Directory thành "Do no Copy", đặt Công cụ tùy chỉnh thành "PublicResXFileCodeGenerator" và đặt Không gian tên công cụ tùy chỉnh thành "Tài nguyên".

Trong trường hợp của tôi, tôi đã chuyển sang "PropertyValueRequired" vào một tập tin gọi là LocalDanish.resx (vẫn còn trong thư mục App_GlobalResources) và thay đổi dòng trong "MyRequiredAttributeAdapter" của tôi từ

attribute.ErrorMessageResourceType = typeof(Resources.WebResources); 

để

attribute.ErrorMessageResourceType = typeof(Resources.LocalDanish); 

Để nhận được thông báo lỗi "tích hợp sẵn" hoạt động, bạn phải tạo hai tệp * .resx. Tôi đã tạo WebResources.resx và WebResources.da.resx. KHÔNG thay đổi bất cứ điều gì, để lại các thiết lập trên chúng theo mặc định (Build Action to "Content", v.v.). Tôi đoán trang web sẽ tự động tìm kiếm * .da.resx tệp trong trường hợp của tôi vì tôi đã đặt toàn cầu hóa trong WebConfig của mình:

<globalization uiCulture="da-DK" culture="da-DK"/> 

Hy vọng điều này sẽ giúp mọi người.

Trân trọng, Andreas

+0

Cảm ơn bạn! Vấn đề này đã khiến tôi phát điên! – KTW

1

Tôi đã thực hiện một số bổ sung nhỏ để các bài bản gốc, mà không dịch tất cả thư trong trường hợp của tôi. (Độ dài chuỗi và giá trị thuộc tính không hợp lệ)

Làm theo các bước trên, để tạo tệp * .resx, đặt thuộc tính của chúng, sau đó đặt ngôn ngữ trong web.config, như được mô tả bởi Andreas.

Sau đó tạo một vài adapter:

// As described in original post: 
public class LocalizedRequiredAttributeAdapter : RequiredAttributeAdapter 
{ 
    public LocalizedRequiredAttributeAdapter(
     ModelMetadata metadata, 
     ControllerContext context, 
     RequiredAttribute attribute 
    ) 
     : base(metadata, context, attribute) 
    { 
     if (attribute.ErrorMessageResourceType == null) 
      attribute.ErrorMessageResourceType = typeof(Resources.Resources); 
     if (attribute.ErrorMessageResourceName == null) 
      attribute.ErrorMessageResourceName = "PropertyValueRequired"; 
    } 
} 

// Addition to original post: 
public class LocalizedStringLengthAttributeAdapter : StringLengthAttributeAdapter 
{ 
    public LocalizedStringLengthAttributeAdapter(
     ModelMetadata metadata, 
     ControllerContext context, 
     StringLengthAttribute attribute 
    ) 
     : base(metadata, context, attribute) 
    { 
     if (attribute.ErrorMessageResourceType == null) 
      attribute.ErrorMessageResourceType = typeof(Resources.Resources); 
     if (attribute.ErrorMessageResourceName == null) 
      attribute.ErrorMessageResourceName = "StringLengthAttribute_ValidationError"; 
    } 
} 

Và trong Global.asax.cx:

// Addition to original post: (Used for "PropertyValueInvalid") 
DefaultModelBinder.ResourceClassKey = "Resources"; 

// As described in original post: 
ClientDataTypeModelValidatorProvider.ResourceClassKey = "Resources"; 
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(RequiredAttribute), typeof(LocalizedRequiredAttributeAdapter)); 
DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(StringLengthAttribute), typeof(LocalizedStringLengthAttributeAdapter)); 
Các vấn đề liên quan