2010-02-10 23 views
21

Tôi là một ứng dụng được viết bằng C# không có GUI hoặc giao diện người dùng, nhưng thay vào đó viết các tệp được phân tích bởi một ứng dụng khác (trong XML và các ứng dụng khác).Có thể thiết lập CultureInfo cho một ứng dụng .NET hay chỉ là một chuỗi?

Tôi có một khách hàng có CultureInfo có NumberDecimalSeparator được đặt thành dấu phẩy, gây ra lỗi phân tích cú pháp với số dấu phẩy động (PI sẽ kết thúc là 3,1415).

Tôi muốn một cách để đặt CultureInfo trên toàn cầu trong ứng dụng, cho tất cả các chuỗi. Tôi đã thử:

  1. The (rõ ràng) Cách tiếp cận thông thường của thiết CurrentThread.CurrentCulture như dòng đầu tiên trong Main() nhưng nó dường như được thiết lập lại.
  2. Biến thể/mở rộng trên http://www.codeproject.com/KB/cs/Change_App_Culture.aspx
  3. Làm tương tự (# 1) trên các chủ đề được tạo rõ ràng trong ứng dụng.

Và thay đổi để sử dụng định dạng rõ ràng không phải là một tùy chọn (150K + dòng, được viết bởi nhân viên cũ).

[Chỉnh sửa] Ứng dụng này liên kết với một ổ cắm và xử lý yêu cầu từ khách hàng chuyên dụng. Tùy thuộc vào loại yêu cầu, nó sinh ra các lớp xử lý khác nhau.

Xin lỗi, khi tôi đăng lần đầu, tôi phải làm rõ trong # 1 rằng (Tôi mặc dù) Tôi đã làm điều này trong tất cả các trình xử lý đã được sinh ra một cách rõ ràng.

Hóa ra tôi đã bỏ qua chuỗi/xử lý đã gây ra sự cố. Vì vậy, các ứng dụng đang hoạt động đúng bây giờ, nhưng câu hỏi vẫn còn về nếu văn hóa có thể được thiết lập trên tất cả các chủ đề.

Nếu nó có thể lặp qua tất cả các chuỗi, nó cũng sẽ giải quyết được vấn đề. Vì vậy:

Làm thế nào tôi có thể nhận được tất cả Chủ đề đối tượng (không ProcessThread) trong quá trình hiện tại?

Trả lời

13

Thật không may, mỗi chủ đề mới bắt đầu với hệ thống thông tin địa phương , ngay cả khi nó bắt đầu từ một chủ đề đã được thay đổi ngôn ngữ của nó thành một cái gì đó khác.

Đây là một hình ảnh khổng lồ mà tôi đã gặp phải trong một trong các ứng dụng của chúng tôi khi sử dụng BackgroundWorker để tải tệp.

Cách tiếp cận tôi đã sử dụng thành công là đặt ngôn ngữ trên chuỗi khởi động và sau đó sử dụng nhà máy tạo chuỗi để tạo chủ đề bằng "ngôn ngữ ứng dụng". Đối với BackgroundWorkers, bạn có thể sử dụng một nhà máy hoặc một lớp dẫn xuất, vì Thread được niêm phong trong khi BackgroundWorker thì không.

+6

Giúp duy nhất nếu bạn đang kiểm soát tạo thread. Đôi khi bạn phải đối phó với các chủ đề được tạo bởi .NET. Người ta không bao giờ nên quên dòng thánh ** 'System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo (" EN-US ");' ** – Bitterblue

6

Tôi không nghĩ rằng bạn có thể thiết lập các nền văn hóa cho toàn bộ ứng dụng, nhưng bạn có thể thiết lập các explicilty văn hóa bất cứ khi nào bạn tạo ra một chủ đề:

using System; 
using System.Globalization; 
using System.Threading; 

class Program { 

    static void thread_test() { 
     Console.WriteLine("Culture: {0}", CultureInfo.CurrentCulture.DisplayName); 
    } 

    public static void Main(params string[] args) { 
     Thread t = new Thread(thread_test); 
     t.CurrentCulture = new CultureInfo("it-it"); 
     t.Start(); 
     t.Join(); 
    } 
} 
3

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");

26

Trong .NET 4.5 bạn có thể sử dụng CultureInfo.DefaultThreadCurrentCulture

Các vấn đề liên quan