2008-09-23 7 views
89

Tôi đã xem xét việc tạo ra các ứng dụng phù hợp cho nhiều ngôn ngữ trong C# vì tôi cần phải làm việc trên một dự án nhỏ trong trường hợp này. Tôi đã tìm thấy cơ bản hai cách để làm điều này:Thực hành tốt nhất để tạo một ứng dụng đa ngôn ngữ trong C#/WinForms?

Đặt thuộc tính có thể bản địa hóa của biểu mẫu thành đúng, đặt thuộc tính Ngôn ngữ, điền tất cả các nhãn và như vậy và bạn 'đã hoàn thành'. Hạn chế lớn nhất tôi thấy ở đây là: cách tạo các thứ khác không phải là một phần của biểu mẫu sẵn sàng cho nhiều ngôn ngữ (ví dụ: cửa sổ bật lên, tệp nhật ký hoặc cửa sổ, v.v.).

Tạo tệp tài nguyên, ví dụ: 'Lang.en-us.resx' và một tệp cho mọi ngôn ngữ, ví dụ như 'Lang.nl-nl.resx' và điền vào bằng Chuỗi. IDE dường như tạo ra một lớp cho tôi một cách tự động, vì vậy trong đoạn code tôi có thể sử dụng Lang.SomeText. Hạn chế lớn nhất tôi thấy trong điều này là: đối với mọi hình thức tôi cần phải đặt tất cả các nhãn và chú thích khác mình trong mã (và nó dường như không ràng buộc dữ liệu hoạt động với các tài nguyên này).

Tôi chắc chắn, tuy nhiên, cũng có các phương pháp khác để thực hiện việc này.

Vì vậy, phương pháp hay nhất là gì? Cách đơn giản nhất cho các ứng dụng nhỏ (một vài biểu mẫu, kết nối cơ sở dữ liệu, v.v) và điều gì tốt nhất cho các ứng dụng lớn hơn?

+2

Tôi nhận thấy rằng không phải kiểu câu hỏi mang tính xây dựng (hay khác "không hợp lệ cho SO") là một trong những câu hỏi có giá trị nhất :) Câu hỏi này cũng là một câu hỏi hay. một minh chứng tốt về cách sử dụng đa ngôn ngữ bổ trợ cho hỗ trợ đa ngôn ngữ https://www.youtube.com/watch?v=SNIyP1QQdVs – Prokurors

+0

Thật khó để gắn kết với nhau tất cả các mảnh kiến ​​thức trên internet đôi khi, và tôi tìm câu hỏi này vô giá ngay bây giờ. Chắc chắn có những lúc đóng những câu hỏi mềm là ít mang tính xây dựng hơn là để chúng cởi mở, và tôi nghĩ đây là một trong những thời điểm đó. :) –

Trả lời

18

Tôi luôn sử dụng các tệp tài nguyên cho các ứng dụng đa ngôn ngữ.
Có nhiều bài viết trên web giải thích cách sử dụng chúng.

Tôi đã sử dụng hai cách khác nhau:

  • Một tập tin tài nguyên theo mẫu
  • Một tài nguyên toàn cầu tập tin

Các tập tin tài nguyên/form, là dễ dàng hơn để thực hiện, bạn chỉ cần nhập các giá trị trong tệp tài nguyên, nhưng tôi thấy phương pháp này khó duy trì hơn, vì các nhãn được phân tán trong suốt ứng dụng.

Tệp tài nguyên chung cho phép bạn tập trung tất cả nhãn (hình ảnh, v.v.) trong một tệp (cho mỗi ngôn ngữ), nhưng nó có nghĩa là đặt thủ công nhãn trong tải biểu mẫu. Tập tin này cũng có thể được sử dụng cho các thông báo lỗi, vv

Một câu hỏi của hương vị ...

Một điểm cuối cùng, tôi viết chương trình bằng tiếng Anh và tiếng Pháp, tôi sử dụng "en" và "fr" chứ không phải " en-US "và" fr-FR ". Đừng làm phức tạp những thứ khác nhau, các sự pha loãng khác nhau của tiếng Anh (Mỹ, Anh, Úc, vv) có ít sự khác biệt đủ để chỉ sử dụng một (giống như tiếng Pháp).

+2

Đôi khi bạn phải lo lắng về các phương ngữ. Ví dụ, các ký tự Trung Quốc hoàn toàn khác nhau trong tiếng Trung Phồn thể (Đài Loan) so với tiếng Trung giản thể (Trung Quốc đại lục). – MarkJ

+1

@MarkJ [Tài liệu MSDN] (http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo (v = vs.80) .aspx) đề cập rằng tiếng Trung phồn thể và tiếng Trung giản thể không phải là phương ngữ (quốc gia/khu vực) nhưng nền văn hóa trung tính. Msdn: "Một nền văn hóa trung lập là một nền văn hóa có liên quan đến một ngôn ngữ nhưng không phải với một quốc gia/khu vực. Một nền văn hóa cụ thể là một nền văn hóa được liên kết với một ngôn ngữ và một quốc gia/khu vực. văn hóa và "fr-FR" là một nền văn hóa cụ thể. Lưu ý rằng "zh-CHS" (tiếng Trung giản thể) và "zh-CHT" (tiếng Trung phồn thể) là văn hóa trung tính. " – broadband

+0

Gần đây tôi đã thực hiện việc này với sự trợ giúp của [link] (http://www.codeproject.com/Articles/15248/Globalization-of-Windows-Applications-in-Minute), 2 bước không được đề cập ở đó: 1. Nhấp vào tất cả tệp .resource và đặt thuộc tính "Xây dựng tác vụ" thành "Nội dung". 2. Nhấp vào tất cả các tệp .resource và đặt thuộc tính "Sao chép vào thư mục đầu ra" thành "Sao chép luôn". – Sourav

9

Gần đây tôi đã viết một chương trình hỗ trợ cả tiếng Đức và tiếng Anh. Tôi rất ngạc nhiên khi biết rằng nếu tôi chỉ đơn giản là đặt tên tài nguyên tiếng Anh của tôi là LanguageResources.resx và tài nguyên tiếng Đức của tôi LanguageResources.de.resx, nó sẽ tự động chọn ngôn ngữ chính xác. ResXFileCodeGenerator đã chăm sóc nó cho tôi.

Lưu ý rằng các trường trong hai tệp giống nhau và bất kỳ trường nào chưa được nhập của Đức sẽ hiển thị trong ứng dụng vì tiếng Anh là ngôn ngữ tệp không cụ thể nhất là tệp mặc định. Khi tìm kiếm một chuỗi nó đi từ cụ thể nhất (ex .de-DE.resx) đến ít cụ thể nhất (ví dụ: .resx).

Để xem các chuỗi của bạn, hãy sử dụng các cuộc gọi ResourceManager.GetString hoặc ResourceManager.GetObject. Ứng dụng sẽ cung cấp cho bạn ResourceManager miễn phí.

4

Vì lợi ích của những người khác có thể gặp phải vấn đề này (hơn 1 năm sau bài đăng cuối cùng), tôi là tác giả của một sản phẩm nội địa hóa chuyên nghiệp giúp cho toàn bộ quá trình dịch thuật trở nên dễ dàng. Đó là một add-in Visual Studio sẽ trích xuất tất cả chuỗi ".resx" từ bất kỳ giải pháp tùy ý nào và tải chúng vào một tệp duy nhất có thể được dịch bằng ứng dụng độc lập miễn phí (người dịch có thể tải xuống từ trang web của tôi). Cùng một add-in sau đó sẽ nhập các chuỗi đã dịch trở lại giải pháp của bạn. Cực kỳ dễ sử dụng với nhiều tính năng bảo vệ tích hợp sẵn, nhiều chuông và còi, và trợ giúp trực tuyến (bạn sẽ không cần nhiều). Xem thêm http://www.hexadigm.com

+0

Điều này sẽ được thêm làm hàm gốc cho visualstudio! Phần mềm tuyệt vời! – Caverna

+0

Cảm ơn rất nhiều (đánh giá cao). Tôi đã đồng ý với bạn trước khi bắt đầu sản phẩm (khoảng 10 năm trước) nhưng nếu MSFT thực hiện nó ngày hôm nay nó sẽ đưa tôi ra khỏi kinh doanh :) – Larry