2015-08-25 14 views
6

Khi chúng tôi muốn làm cho ứng dụng của chúng tôi cho tất cả người dùng (nói các ngôn ngữ khác nhau), Chúng tôi cần một công nghệ toàn cầu.
Trong C# chúng tôi sử dụng ResourceManager như sau:Thực hành tốt nhất cho các nguồn lực toàn cầu trong C#

using System; 
using System.Reflection; 
using System.Resources; 

public class Example 
{ 
    public static void Main() 
    { 
     // Retrieve the resource. 
     ResourceManager rm = new ResourceManager("ExampleResources" , 
           typeof(Example).Assembly); 
     string greeting = rm.GetString("Greeting"); 

     Console.Write("Enter your name: "); 
     string name = Console.ReadLine(); 
     Console.WriteLine("{0} {1}!", greeting, name); 
    } 
} 
// The example produces output similar to the following: 
//  Enter your name: John 
//  Hello John! 

Việc lắp ráp có hai nguồn lực ngôn ngữ nhiều hơn hoặc:
hội
| --Assembly.en-us.resx
| --Assembly.zh- cn.resx

Sau đó, chúng tôi lưu trữ để thay đổi tài nguyên bằng cách thay đổi cultureinfo của chuỗi để sử dụng tài nguyên khác nhau.

Nếu ứng dụng có nhiều tệp (lắp ráp) dll.
Tôi muốn có một điểm duy nhất (một tệp tài nguyên cho một ngôn ngữ) cho ứng dụng,
Có một giải pháp tốt cho ý tưởng của tôi không?

Trước khi tôi chỉ thay đổi Chế độ xem Language của Chế độ xem (ví dụ: hoặc UserControl) để triển khai giao diện người dùng khác nhau cho ngôn ngữ tương ứng.

Trả lời

0

Chỉ cần xây dựng quốc tế hóa trong C# bằng cách bạn mô tả. Nhưng như bước cuối cùng của quá trình xây dựng, bạn có thể chạy Fody.Costura.

Điều này sẽ lấy tất cả các dll khác nhau và gói chúng vào ứng dụng của bạn để bạn chỉ có một tệp .exe duy nhất với mọi thứ được bao gồm.

Lợi ích là bạn có thể sử dụng các khung quốc tế hóa C# như dự định mà không có bất kỳ hack nào, nhưng bạn vẫn nhận được một exe duy nhất mà bạn có thể phân phối cho khách hàng của mình.

0

Tôi thấy các khung công tác quốc tế hóa C# rất thiếu, vì vậy, tôi thường là tạo một assembly cho tài nguyên và tham chiếu từ các dự án khác. Các tệp tài nguyên mà tôi tạo ra từ một số công cụ (DB, excel, textfile) và giữ cả hai dữ liệu nguồn và các tệp tài nguyên dưới sự kiểm soát phiên bản.

MyApp.sln 
    ResourceProject.csproj 
    Resources.resx 
    Resources.ru.resx 
    Resources.de.resx 
    Resource.cs 
    Core.csproj 
    UI.csproj 

Lớp tài nguyên có thể tải tất cả các hội đồng khác nhau

namespace MyApp.Resources 
{ 
    public static class Resource 
    { 
     private static ResourceManager manager; 
     static Resource() 
     { 
      manager = new ResourceManager("MyApp.Resources", Assembly.GetAssembly(typeof(Resource))); 
     } 

     public static string GetString(string key, string culture) 
     { 
      return GetString(key, new CultureInfo(culture)); 
     } 

     public static string GetString(string key, CultureInfo culture) 
     { 
      return manager.GetString(key, culture); 
     } 
    } 
} 

lớp đơn giản này có thể được mở rộng theo nhiều cách khác nhau. Trong các hội đồng gọi bạn có thể có các lớp tiện ích sẽ gọi dựa trên văn hóa giao diện người dùng hiện tại hoặc văn bản chủ đề tùy thuộc vào tình huống.

Lưu ý rằng điều này hoàn toàn tránh bất kỳ phương pháp nào được xây dựng trong WinForms hoặc WPF i18N.

Đối với GUI: bạn có thể tạo một tiện ích dịch theo cách đệ quy toàn bộ biểu mẫu. Việc tra cứu chính nó có thể/nên được mở rộng với các cảnh báo cho các phím bị thiếu, các đối số dự phòng, các tiền tố/các không gian tên nếu bạn có hàng ngàn khóa và cứ thế.

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