2009-09-22 4 views
12

Tôi có một tình huống mà tôi cần phải đặt ngôn ngữ của quá trình của tôi thành en-US.Làm cách nào để thay đổi CurrentCulture của toàn bộ quá trình (không chỉ là chuỗi hiện tại) trong .Net?

tôi biết làm thế nào để làm điều này cho thread hiện hành:

System.Threading.Thread.CurrentThread.CurrentCulture = 
    System.Globalization.CultureInfo.CreateSpecificCulture("en-US"); 

Nhưng ứng dụng của tôi sử dụng BackgroundWorkers để làm một số chế biến, và miền địa phương cho các đề người lao động dường như không bị ảnh hưởng bởi sự thay đổi trên để họ sinh ra chủ đề chính.

Vậy làm cách nào để tôi có thể đặt ngôn ngữ cho tất cả các chuỗi trong ứng dụng của mình mà không cần đặt nó trong một cách thủ công?

Trả lời

14

Bạn sẽ phải thay đổi ngôn ngữ hệ điều hành nếu bạn muốn thực hiện điều đó. Vì lý do gì bạn muốn BackgroundWorkers chạy trong en-US?

Bạn nên có lớp doanh nghiệp của mình chạy trong nền văn hóa bất biến và chỉ có một nền văn hóa cụ thể cho giao diện người dùng của người dùng cuối.

Nếu bạn đang sử dụng các thành phần BackgroundWorker, và phải làm điều này bạn có thể thử một cái gì đó như thế này trong các phương pháp DoWork:

// In DoWork 
System.Globalization.CultureInfo before = System.Threading.Thread.CurrentThread.CurrentCulture; 
try 

{ 
    System.Threading.Thread.CurrentThread.CurrentCulture = 
     new System.Globalization.CultureInfo("en-US"); 
// Proceed with specific code 
} 

finally 
{ 
    System.Threading.Thread.CurrentThread.CurrentUICulture = before; 
} 
+1

Nhân viên nền có thể rất tốt được chạy trong lớp UI (như một 'phần BackgroundWorker' trên một' Mẫu 'ví dụ) –

+0

@ Fredrik- Có (đặc biệt nếu nó là thành phần Công nhân nền), nhưng bạn không cập nhật giao diện người dùng trên chuỗi công nhân nền. Ít nhất bạn không biết nếu bạn đang sử dụng nó đúng cách. – RichardOD

+0

Nhân viên nền làm đôi.Parse (chuỗi) trên một số đầu vào, vi phạm cho một số ngôn ngữ nhất định có biểu diễn điểm thập phân kỳ lạ. Vì vậy, tôi vẫn cần phải biết làm thế nào để thiết lập miền địa phương cho toàn bộ quá trình. Bạn đang nói điều này là không thể? –

0

Chúng tôi sử dụng lớp helper cho BackgroudWorker như thế này:

public static class BackgroundWorkerHelper 
{ 
public static void RunInBackground(Action doWorkAction, Action completedAction, CultureInfo cultureInfo) 
    { 
     var worker = new BackgroundWorker(); 
     worker.DoWork += (_, args) => 
     { 
      System.Threading.Thread.CurrentThread.CurrentCulture = cultureInfo; 
      System.Threading.Thread.CurrentThread.CurrentUICulture = cultureInfo; 
      doWorkAction.Invoke(); 
     }; 
     worker.RunWorkerCompleted += (_, args) => 
     { 
      System.Threading.Thread.CurrentThread.CurrentCulture = cultureInfo; 
      System.Threading.Thread.CurrentThread.CurrentUICulture = cultureInfo; 
      completedAction.Invoke(); 
     }; 

     worker.RunWorkerAsync(); 
    } 
} 

Ví dụ về cách sử dụng:

BackgroundWorkerHelper.RunInBackground(() => { Work(); },() => { AfterWork(); },Thread.CurrentThread.CurrentCulture); 
1

Sử dụng này:

worker.RunWorkerAsync(Thread.CurrentThread.CurrentCulture.LCID);//Pass the LCID as argument 

sau khi vào làm việc làm này:

Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(int.Parse(e.Argument.ToString())); 
+0

+1 để sử dụng mã nhận diện văn hóa thay vì tên văn hóa. Điều này là cần thiết để tách 'Tây Ban Nha - Tây Ban Nha' khỏi' Tây Ban Nha - Tây Ban Nha', ví dụ, trong đó '0x0C0A' sử dụng thứ tự sắp xếp quốc tế và' 0x040A' sử dụng thứ tự sắp xếp truyền thống. REF: [CultureInfo Class] (https://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo%28v=vs.100%29.aspx) – AlwaysLearning