Phương pháp hay nhất để tạo ứng dụng đa ngôn ngữ trong C # / WinForms? [đóng cửa]


94

Tôi đang tìm cách tạo các ứng dụng phù hợp với nhiều ngôn ngữ trong C # vì tôi cần làm việc trong một dự án nhỏ trong trường hợp này. Về cơ bản tôi đã tìm thấy hai cách để làm điều này:

Đặt thuộc tính Localizable của biểu mẫu thành true, đặt thuộc tính Language, điền vào tất cả các nhãn và như vậy, và bạn đã 'xong việc'. Hạn chế lớn mà tôi thấy ở đây là: làm thế nào để làm cho những 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 một 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ụ 'Lang.nl-nl.resx' và lấp đầy nó bằng các Chuỗi. IDE dường như tự động tạo ra một lớp cho tôi, vì vậy trong mã, tôi chỉ có thể sử dụng Lang.SomeText. Hạn chế lớn nhất mà tôi thấy ở đây là: đối với mọi biểu mẫu, tôi cần tự đặt tất cả các nhãn và chú thích khác trong mã (và có vẻ như ràng buộc dữ liệu không hoạt động với các tài nguyên này).

Tuy nhiên, tôi chắc chắn rằng có những phương pháp khác để làm điều này.

Vì vậy, thực hành tốt nhất là gì? Điều gì dễ 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à quy mô nào tốt nhất cho các ứng dụng lớn hơn?


3
Tôi nhận thấy rằng câu hỏi không mang tính xây dựng (hoặc loại câu hỏi "không hợp lệ cho SO" khác) là một trong những câu hỏi có giá trị nhất :) sử dụng đa ngôn ngữ add-in hỗ trợ đa ngôn ngữ youtube.com/watch?v=SNIyP1QQdVs
Prokurors

1
Đôi khi thật khó để ghép lại tất cả những phần kiến ​​thức vụn vặt trên internet, và tôi thấy câu hỏi này là vô giá ngay bây giờ. Chắc chắn rằng có những lúc việc đóng các câu hỏi mềm ít mang tính xây dựng hơn là để chúng mở, và tôi nghĩ đây là một trong những thời điểm đó. :)

Câu trả lời:


20

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ó rất nhiều bài báo 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 tài nguyên cho mỗi biểu mẫu
  • Tệp tài nguyên chung

Tệp / biểu mẫu tài nguyên dễ thực hiện hơ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 cách tiếp cận này khó duy trì hơn, vì các nhãn được phân tán khắp ứng dụng.

Tệp tài nguyên chung cho phép bạn tập trung tất cả cá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à thiết lập thủ công các nhãn trong tải biểu mẫu. Tệp này cũng có thể được sử dụng cho các thông báo lỗi, v.v.

Một câu hỏi về 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 mọi thứ, các kiểu loãng khác nhau của tiếng Anh (Mỹ, Anh, Úc, v.v.) có rất ít sự khác biệt đủ để chỉ sử dụng một (tương tự với tiếng Pháp).


2
Bạn phải lo lắng về phương ngữ đôi khi. 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
Tài liệu @MarkJ MSDN đề 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) mà là văn hóa trung lập. Msdn: "Một nền văn hóa trung lập là một nền văn hóa được liên kết với một ngôn ngữ nhưng không gắn 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 gắn liền với một ngôn ngữ và một quốc gia / khu vực. Ví dụ:" fr "là một 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à những nền văn hóa trung lập. "
băng thông rộng

Gần đây tôi đã làm điều này với sự trợ giúp của liên kết , 2 bước không được đề cập ở đó: 1. Nhấp vào tất cả các tệp .resource và đặt thuộc tính "Build Action" thành "Content". 2. Nhấp vào tất cả các tệp .resource và đặt thuộc tính "Copy to Output Directory" thành "Copy Always".
Sourav

1
@Kiquenet Để có câu trả lời đầy đủ (kèm theo mã) bao gồm hỗ trợ rộng rãi .NET, hãy xem: stackoverflow.com/a/35813707/2901207
CularBytes Ngày

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 phát hiện ra rằng nếu tôi đặt tên cho tài nguyên tiếng Anh của mình là LanguageResources.resx và tài nguyên tiếng Đức của tôi là LanguageResources.de.resx, nó sẽ tự động chọn đúng ngôn ngữ. ResXFileCodeGenerator đã giải quyết tất cả cho tôi.

Lưu ý rằng các trường trong hai tệp đều giống nhau và bất kỳ trường nào chưa được nhập bằng tiếng Đức sẽ hiển thị trong ứng dụng dưới dạng tiếng Anh vì 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 (ví dụ: .de-DE.resx) đến ít cụ thể nhất (ví dụ: .resx).

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


6

Vì lợi ích của những người khác có thể bắt gặp điều 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 bản địa hóa chuyên nghiệp giúp toàn bộ quá trình dịch trở nên cực kỳ dễ dàng. Đó là một phần bổ trợ Visual Studio sẽ trích xuất tất cả cá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 chuỗi này từ trang web của tôi). Phần bổ trợ tương tự 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 biện pháp bảo vệ tích hợp, 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 http://www.hexadigm.com


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

Cảm ơn rất nhiều (đánh giá cao). Tôi đã có thể đồ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 nay nó sẽ đưa tôi ra khỏi kinh doanh :)
Larry
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.