2009-08-09 2 views
31

Tôi có một ứng dụng WinForms mà tôi muốn dịch sang nhiều ngôn ngữ. Tuy nhiên, tôi không có bất kỳ kinh nghiệm nào với việc bản địa hóa một ứng dụng WinForms, và tôi thấy thông tin rất mâu thuẫn về chủ đề này.Địa phương hóa thích hợp của ứng dụng WinForms

Về cơ bản, những gì tôi muốn là:

  • Trong mã nguồn, tôi muốn chỉ có một tập tin cho mỗi ngôn ngữ
  • tập tin này được biên dịch vào các ứng dụng chính trên biên soạn - không lắp ráp vệ tinh hoặc các tập tin dữ liệu bên ngoài sau khi tạo ứng dụng
  • Người dùng có thể chọn ngôn ngữ, tôi không cần/muốn tự động phát hiện dựa trên hệ điều hành
  • Chủ yếu nên chứa chuỗi và int, nhưng cũng là CultureInfo

Hầu hết các giải pháp tôi đã thấy hoặc có một tệp .resx trên mỗi biểu mẫu và/hoặc các cụm vệ tinh ngoài.

Tôi có phải tự cuộn của riêng mình không? Hoặc là có cái gì đó trong khuôn khổ đã?

.net Framework 3.5 SP1 nếu vấn đề đó quan trọng.

Chỉnh sửa: Đối với hầu hết các phần, Visual Studio đã cung cấp hỗ trợ cho những gì tôi muốn, nhưng có hai vấn đề. Khi tôi đặt Form.Localizable thành true Tôi có hỗ trợ thiết kế đẹp, nhưng điều này tạo ra một resx cho mỗi hình thức. Ý tưởng ghi đè thủ công nó trong InitializeComponent không thành công vì mã được thiết kế riêng của nó sẽ thường xuyên bị ghi đè. Về mặt lý thuyết, tôi chỉ muốn a) ghi đè lên việc tạo ra ComponentResourceManager để trỏ nó vào resx toàn cục của tôi và b) thay đổi cuộc gọi đến ApplyResources thành quá tải lấy một tham số thứ ba là CultureInfo.

Có vẻ như tôi phải thêm lệnh gọi hàm vào hàm dựng của tôi mà được gọi sau InitializeComponent() và ghi đè hành vi của nó. Điều đó có vẻ khủng khiếp không hiệu quả, nhưng Visual Studio là đúng khi nó cảnh báo về việc chạm vào InitializeComponent. Tại thời điểm này, tôi thực sự đang cuộn Khung nội địa hóa WinForms của riêng tôi ...

+1

Không phải như vậy chắc chắn nếu bạn đang yêu cầu một 'thích' của cho một cách địa phương hóa 'rất tùy chỉnh'. –

+1

Có gì sai với phương pháp "một .resx trên mỗi hình thức, một vệ tinh lắp ráp cho mỗi ngôn ngữ và lắp ráp"? Đó thực sự là cách .NET làm việc - nếu bạn không thích điều đó, bạn sẽ phải tự mình cuộn nhiều mã, tôi sợ. –

+2

Sai nghĩa là "một .resx trên mỗi biểu mẫu" (+ ít nhất một đối với tất cả nội dung không phải là một phần của biểu mẫu) tăng theo cấp số nhân thay vì tuyến tính và một assembly cho mỗi ngôn ngữ chỉ là sự lộn xộn bổ sung. chỉ được phép với các bản phát hành mới của ứng dụng. Ngoài ra, hãy xem http://redsolo.blogspot.com/2006/11/localisation-gone-wrong-in-c.html –

Trả lời

4

Tôi đã hỏi một câu hỏi tương tự về ASP.NET và có câu trả lời đầu tiên - công cụ này và luồng công việc của nó cũng có thể là điều gì đó cho bạn - có xem: Lingobit Localizer

Dường như bạn có thể tải ứng dụng Winforms của mình và cho phép bạn bắt đầu dịch nhãn của bạn, v.v. và xem các biểu mẫu trong khi bạn thực hiện. Rất nhiều tính năng khác, cũng như bản dịch gia tăng và bộ nhớ dịch (nếu bạn sử dụng cùng một cụm từ lặp đi lặp lại).

Có vẻ khá hứa hẹn (đối với Winforms) - mặc dù chưa sử dụng nó.

Đây là một số extensive list of potential .NET localization tools - không chắc chắn, chúng hoạt động tốt như thế nào và chúng bao gồm những gì - có giao diện, có thể bạn sẽ tìm thấy những gì bạn đang tìm kiếm.

Marc

+0

Vâng phần mềm này tạo ra một vệ tinh và OP cho biết ông không muốn bất kỳ tập tin vệ tinh. –

+1

Vâng, tôi biết - Tôi đã cố gắng thể hiện rằng có lẽ với sự hỗ trợ công cụ thích hợp, phương pháp lắp ráp vệ tinh không quá tệ sau khi tất cả. –

3

Đây là một chủ đề lớn và có nhiều cách để thực hiện những gì bạn muốn. Khuôn khổ này cung cấp cơ sở nhưng một giải pháp hoàn chỉnh yêu cầu bạn tự thực hiện một số yếu tố nhất định.

Ví dụ: triển khai khung mặc định là tạo tệp .resx cho mọi tài nguyên. Trong ASP.Net điều này có nghĩa là mỗi người dùng/máy chủ điều khiển hoặc trang.Điều này không cho vay chính nó để bảo trì dễ dàng và nếu bạn muốn di chuyển tài nguyên đến cơ sở dữ liệu, bạn cần phải triển khai nhà cung cấp của riêng bạn.

Sự quen thuộc của tôi với Winforms bị giới hạn nhưng nếu bạn đang sử dụng Silverlight hoặc WPF thì hãy đọc công việc của Guy Smith-Ferrier về chủ đề tại: http://www.guysmithferrier.com/category/Internationalization.aspx. Ông cũng có một số bộ công cụ có thể làm cho cuộc sống của bạn dễ dàng hơn tại: http://www.dotneti18n.com/Downloads.aspx.

Tôi đã từng làm việc với anh ấy trước đây và chưa bao giờ gặp bất kỳ ai khác có hiểu biết sâu sắc hơn về chủ đề này.

2

Tôi không có giải pháp cho yêu cầu đầu tiên và thứ hai nhưng xin lưu ý rằng việc bản địa hóa biểu mẫu không đơn giản như dịch từng từ. Bạn cần kiểm tra xem mỗi văn bản đã dịch có phù hợp với điều khiển tương ứng của chúng hay không. Ngoài ra, có thể bạn có biểu tượng hoặc hình ảnh cần phải thay đổi trong một nền văn hóa khác.

Đối với quan điểm của bạn ba, bạn có thể thay đổi ngôn ngữ bằng tay với những dòng sau:

CultureInfo ci = new CultureInfo("fr"); 
Thread.CurrentThread.CurrentUICulture = ci; 
15

Tôi vừa mới hoàn thành một dự án C# Net 3.5 với một vấn đề tương tự. Chúng tôi đã viết plugin WinForms cho một ứng dụng đa ngôn ngữ hiện có với 8 ngôn ngữ (bao gồm cả tiếng Anh).

Đây là cách chúng tôi đã làm điều đó:

  1. Tạo mọi hình thức và giao diện người dùng của chúng tôi bằng ngôn ngữ mặc định, tiếng Anh.

  2. Đặt tất cả các chuỗi nội bộ của chúng tôi trong một tập tin tài nguyên (thứ không gắn trực tiếp vào một hình thức như thông báo lỗi tùy chỉnh và các chức danh hộp thoại vv)

Một khi chúng ta đã hoàn thành hầu hết các công việc và thử nghiệm chúng tôi đã bản địa hóa nó.

  1. Mỗi biểu mẫu đã có tệp .resx nhưng tệp này trống. Chúng tôi đặt thuộc tính 'Bản địa hóa' thành true, tệp .resx được lấp đầy với những thứ như kích thước nút & chuỗi.

  2. Đối với mỗi ngôn ngữ khác, chúng tôi đã thay đổi thuộc tính 'Ngôn ngữ' trên biểu mẫu. Chúng tôi đã chọn phiên bản cơ bản của mỗi ngôn ngữ, ví dụ: 'Tiếng Tây Ban Nha' thay vì 'Tiếng Tây Ban Nha (Chilê)' vv để nó hoạt động cho mọi phương ngữ 'Tây Ban Nha', tôi nghĩ vậy.

  3. Sau đó, chúng tôi đã đi qua từng điều khiển, dịch văn bản của nó và thay đổi kích thước, nếu cần. Điều này tạo ra một .resx cho mỗi sự kết hợp ngôn ngữ và hình thức.

Sau đó, chúng tôi còn lại, cho 8 ngôn ngữ, 8 .resx cho mỗi biểu mẫu và 8 .resx cho các chuỗi chung. Khi biên soạn thư mục đầu ra có .dll chúng tôi đã tạo và sau đó là một thư mục con cho mỗi ngôn ngữ với một .resources.dll trong đó.

Chúng tôi đã có thể kiểm tra các phiên bản của giao diện người dùng trong nhà thiết kế bằng cách chỉ thay đổi thuộc tính ngôn ngữ để kiểm tra xem chúng tôi có đúng kiểu chuỗi & bố cục hay không.

Tất cả trong tất cả khi chúng tôi có đầu của chúng tôi xung quanh nó, nó đã được khá dễ dàng và không đau.

Chúng tôi không cần phải viết bất kỳ tinh chỉnh tùy chỉnh mẫu bốc

+4

Xin lỗi, nhưng tôi không thể đề xuất kỹ thuật này. Nó trở thành một cơn ác mộng bảo trì khi các lĩnh vực cần phải được thêm vào, loại bỏ, hoặc di chuyển xung quanh trên một hình thức. – RenniePet

+5

Đáng buồn thay, đối với hầu hết các phần này ** IS ** những gì MSDN đề nghị cho nội địa hóa WinForms. :(https://msdn.microsoft.com/en-us/library/y99d1cd3(VS.80).aspx –

+1

Đây là cách được Microsoft khuyên dùng để làm điều đó và nó thật kinh khủng –

1

gì bạn đang yêu cầu:

tập tin tài nguyên
  1. không có vệ tinh
  2. chỉ có một kích thước và vị trí kiểm soát theo mẫu.
  3. nhiều ngôn ngữ được nhúng trong tệp thực thi.

Không thể thực hiện được trong IDE của Visual Studio.

gì nó sẽ đòi hỏi một số tùy chỉnh làm việc, về cơ bản hoàn thành tất cả các bước sau:

  • Có được một người quản lý tài nguyên tùy chỉnh để xử lý các file tài nguyên TMX.
  • Đặt tất cả các chuỗi có thể định vị của bạn vào tệp TMX.
    • Đặt tệp TMX này là nhúng tài nguyên trong dự án của bạn.
  • Trong hàm tạo Form của bạn, hãy tạo TMX ResourceManager của bạn, tải tệp TMX từ tài nguyên được nhúng của bạn.
  • Trong mã của bạn, hãy sử dụng tmx ResourceManager thay vì ResourceManager mặc định để nhận các chuỗi được bản địa hóa.
    • Để biểu mẫu sử dụng ResourceManager mặc định để nhận tất cả mọi thứ của nhà thiết kế ngoại trừ chuỗi.
  • Tải tệp TMX của bạn ra bằng các bản dịch ngôn ngữ mới.
    • Có thể thêm nhiều hơn vào bản phát hành tiếp theo của dự án, bằng cách thêm chúng vào tệp TMX này trước khi bạn biên dịch.

NGUỒN: (không phải là một danh sách đầy đủ, bởi bất kỳ phương tiện)