2012-06-18 5 views
6

Tôi có một ứng dụng ASP.NET Web API nên phản ứng với tiêu đề Accept-Language của người dùng một cách thích hợp.Cách tốt để thay đổi tài nguyên ngôn ngữ theo yêu cầu

Hiện tại, các chuỗi được lưu trữ trong resx và được truy cập theo cách biên dịch an toàn thông qua lớp được tạo của Visual Studio. Những gì tôi muốn làm là để giữ cho phương pháp tiếp cận hiện tại và tạo ra hội đồng vệ tinh cho mỗi phiên bản dịch của resx. Sau đó, để phân tích tiêu đề Accept-Language của người dùng để xem ngôn ngữ nào người dùng chấp nhận và tải các tài nguyên cho ngôn ngữ được yêu cầu từ lắp ráp vệ tinh.

Tôi cho rằng mình có thể tự mình thực hiện tất cả hành vi này bằng cách tạo một tập hợp các đối tượng cụ thể theo ngôn ngữ với sự trợ giúp của ResourceSet nhưng sau đó sẽ không thể giữ an toàn biên dịch. tự động cập nhật lớp cho tệp resx.

Cách tốt nhất để chọn tài nguyên ngôn ngữ được bản địa hóa là gì?

Trả lời

10

Từ đọc câu hỏi của bạn, tôi không thấy bất cứ điều gì mà ASP.NET không cung cấp tự động. Bạn có thể cấu hình ASP.NET của bạn (cho dù WebForms hoặc MVC) sử dụng tiêu đề yêu cầu accept-language và đặt UICulture thích hợp (sẽ ảnh hưởng đến lắp ráp vệ tinh nào được nạp bởi ResourceManager) và Văn hóa (sẽ ảnh hưởng đến định dạng và phân tích phụ thuộc vào miền địa phương chẳng hạn như ngày và số) một cách thích hợp.

Để cấu hình ứng dụng của bạn để sử dụng danh sách accept-language để đặt cả UICulture và Văn hóa cho mỗi yêu cầu, (theo this MSDN page), cấu hình web.config của bạn như thế này:

<globalization uiCulture="auto" culture="auto" /> 

Ngoài ra còn có một cấu hình tương đương đặt trên mỗi trang. Sau đó, theo quy trình Resource Fallback, nếu ứng dụng của bạn bao gồm lắp ráp vệ tinh cho văn hóa phù hợp (hoặc, thất bại, văn hóa trung tính gốc), nó sẽ được Trình quản lý tài nguyên sử dụng. Nếu không, thì tài nguyên mặc định của bạn sẽ được sử dụng (tiếng Anh nếu đó là ngôn ngữ cơ sở của bạn).

+0

Như bạn đã nói trong bài viết của mình, nếu tôi cố gắng gửi một tiêu đề Accept-Language như sau: 'Accept-Language: it, de, en; q = 0.5' và ASP.NET không thể tìm thấy tài nguyên được yêu cầu bằng tiếng Ý, nó không thử tiếng Đức tiếp theo mà thay vào đó lại quay trở lại văn hóa trung tính. Bất kỳ cách nào để khắc phục hành vi này? –

+0

Có, có vẻ như chỉ tính đến ngôn ngữ hàng đầu trong tiêu đề chấp nhận ngôn ngữ (hoặc ít nhất là ngôn ngữ hàng đầu là tên văn hóa .NET hợp lệ?). Nó sẽ được tốt đẹp nếu nó thông minh hơn và thử những người khác tùy thuộc vào việc bản địa hóa có sẵn. Nhưng có lẽ không thể xác định nội dung được bản địa hóa (phương pháp lắp ráp vệ tinh có nghĩa là bạn có thể có bất kỳ thứ gì, ví dụ như tiếng Đức cho một dll và một tiếng Ý và một tải khác cho một thành phần chứ không phải thành phần khác) và thực tế, phần lớn người dùng cuối có lẽ chỉ quan tâm đến một. – Clafou

+0

Điều đó nói rằng, tôi đã có cùng một vấn đề như bạn tuần trước và kết thúc việc thực hiện thay thế cho cài đặt "tự động" này. Trong trường hợp của tôi, đó là MVC và tôi đã xử lý điều này trong OnActionExecuting. Đó là một chút công việc để làm tất cả chính mình (tất cả các bạn nhận được là một chuỗi tiêu đề với cú pháp q đó, bạn phải phân tích cú pháp nó và xác nhận quá như .NET không cho phép bất kỳ tên văn hóa nào). Tôi đã kết thúc với một cái gì đó như 'var orderedValidAcceptLanguages ​​= AcceptLanguage.Parse (httpContext.Request.Headers [" Accept-Language "]). Where (x => x.IsValid) .OrderByDescending (x => xQ). ToList(); ' – Clafou

2

Bạn có thể viết HttpModule phát hiện tiêu đề ngôn ngữ và đặt văn bản chuỗi hiện tại.

public class LanguageModule : IHttpModule 
{ 
    public void Dispose() 
    { 
    } 

    public void Init(HttpApplication context) 
    { 
     context.BeginRequest += new EventHandler(context_BeginRequest); 
    } 

    void context_BeginRequest(object sender, EventArgs e) 
    { 
     var application = sender as HttpApplication; 
     var context = application.Context; 
     var lang = context.Request.Headers["Accept-Language"]; 

     // eat the cookie (if any) and set the culture 
     if (!string.IsNullOrEmpty(lang)) 
     { 
      var culture = new System.Globalization.CultureInfo(lang); // you may need to interpret the value of "lang" to match what is expected by CultureInfo 

      Thread.CurrentThread.CurrentCulture = culture; 
      Thread.CurrentThread.CurrentUICulture = culture; 
     } 
    } 
} 

ResourceManager et al sẽ tìm ra các phiên bản địa hoá đúng để sử dụng từ văn hóa chủ đề.

+0

Tôi đã xem [this] (http://stackoverflow.com/questions/4910159/how-are-iis7-threads-assigned/4910207#4910207) câu trả lời liên quan đến quản lý luồng trong IIS và từ những gì tôi hiểu, nó có thể là nhiều yêu cầu có thể được phân phối bởi một chuỗi duy nhất. Dường như có thể có xung đột. Tôi nên kiểm tra, mặc dù. –