2012-06-30 27 views
7

Một điều rất đơn giản và tôi không thể làm cho nó hoạt động. Tôi muốn toàn cầu hóa dll của tôi vì vậy tôi đang sử dụng các tập tin tài nguyên + ResourceManager.Resourcemanager đang trả về cùng một tài nguyên, mặc dù CultureInfo được chỉ định

tôi gọi là ResourceManager như thế này:

var p = new ResourceManager("Appname.Default", Assembly.GetExecutingAssembly()); 

Lấy chuỗi như thế này

System.Diagnostics.Debug.WriteLine(p.GetString("greeting")); 
System.Diagnostics.Debug.WriteLine(p.GetString("greeting", new CultureInfo("nl"))); 
System.Diagnostics.Debug.WriteLine(p.GetString("greeting", new CultureInfo("nl-NL"))); 
System.Diagnostics.Debug.WriteLine(p.GetString("greeting", new CultureInfo("en"))); 

Và nó trả gấp 4 lần cùng một chuỗi. Tệp của tôi được gọi là

Default.resx 
Default.en.resx 
Default.nl.resx 
Default.nl-NL.resx 

Tất cả cài đặt tệp đều giống nhau, nhưng như đã đề cập - chỉ tài nguyên trong tệp Mặc định được sử dụng.

Tôi đang xem gì ở đây?

+2

Are file resx thực sự nhận được biên soạn thành Satellite Assembly? Tìm trong thư mục bin \ Debug và tìm thư mục con có tên en, nl và nl-NL. –

+0

Thử tải bản dịch qua 'Default.ResourceManager.GetString'. Nhiều khả năng trình quản lý tài nguyên bạn đang tạo sẽ nhận được một số tham số sai. –

Trả lời

10

Có một số cách sử dụng tệp tài nguyên, một trong số đó đang sử dụng tệp .resx. Các tệp này được tự động bản địa hóa, dựa trên giá trị của Thread.CurrentThread.CurrentUICulture. Tập tin .resx mặc định được biên dịch vào trong assembly, nó là một phần của (ví dụ file chính của bạn), trong khi các tài nguyên cục bộ (Default.nl-NL.resx) được biên dịch vào thư mục riêng của chúng (dựa trên mã định danh văn hóa, nl-NL trong trường hợp này) được gọi là <AssemblyName>.resources.dll.

Giá trị địa chỉ từ các tài nguyên đó dễ dàng như <ResourceName>.<KeyName>, ví dụ: Default.Greeting. Để kiểm tra nó, bạn thay đổi văn hóa, sử dụng:

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US"); 
Console.WriteLine(Default.Greeting); 

Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("nl-NL"); 
Console.WriteLine(Default.Greeting); 

Mà sẽ ra

Hello 
Hallo 

On khởi động chương trình, Văn hóa giao diện người dùng được thiết lập với nền văn hóa của máy tính khi nó đang chạy, vì vậy bạn thắng không phải tự xác định ngôn ngữ để luôn trình bày các tài nguyên được bản địa hoá. Vì vậy, các tệp .resx dường như là cách để đi.

Khi sử dụng ResourceManager từ var p = new ResourceManager("Appname.Default", Assembly.GetExecutingAssembly());, bạn sẽ phải đọc .resources tệp. Nếu không có (trong trường hợp của bạn) Appname.Default.resources tệp, p.GetString sẽ không thành công. Vì vậy, tôi đoán bạn đã tạo một tệp .resources trước đó, nhưng chưa chuyển đổi các tệp .resx đã bản địa hóa thành các tệp .resources.

Nếu bạn muốn sử dụng ResourceManager để có thể xác định văn hóa, bạn có thể sử dụng:

Default.ResourceManager.GetString("Greeting", new CultureInfo("en-US")); 
+1

Cảm ơn - Tôi không biết tại sao tôi không chỉ sử dụng Resources.Default. Phải là cuối tuần! –

+0

@CodeCaster bạn có thể vui lòng xem câu hỏi của tôi được không. http://stackoverflow.com/questions/24070892/resources-dont-load-current-culture – Marc

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