2009-08-25 27 views
8

Điều gì sẽ là một sản phẩm tốt để bản địa hóa một bản phân phối WPF dựa trên MVVM có thể thay đổi ngôn ngữ của nó khi chạy? Tất nhiên tôi có thể tạo một thuộc tính chuỗi trong ViewModel cho mỗi và mọi chuỗi được hiển thị ở đâu đó trong View nhưng điều đó dường như khá tẻ nhạt với tôi. Có cách tiếp cận chung/thực tiễn tốt nhất cho việc này không?Bản địa hóa các ứng dụng dựa trên MVVM dựa trên WPF

Trả lời

9

WPF has a lot of support for localization. Có lẽ bạn có thể tận dụng điều đó? Thật không may tôi nghĩ rằng việc thay đổi ngôn ngữ giao diện người dùng tại thời gian chạy là hơi khó khăn và bạn có thể cần phải đi lên với chương trình của riêng bạn.

Ngoài ra, vì mô hình chế độ xem là thuyết bất khả tri giao diện người dùng, tôi không nghĩ lưu trữ chuỗi giao diện người dùng trong mô hình chế độ xem là giải pháp tốt. Chúng thuộc về khung nhìn.

+3

Xét rằng View-Model là một mô hình của View, cá nhân tôi nghĩ rằng đây là nơi lý tưởng để đặt nội địa hóa.Điều này cũng sẽ cho phép giao diện người dùng Silverlight và WPF cục bộ từ cùng một kiểu xem. –

+5

Tôi phải không đồng ý với Pete Davis. Bản địa hóa thuộc về chế độ xem chứ không phải chế độ xem. Mô hình xem không cần phải lo lắng về cách chế độ xem muốn hiển thị chính nó. Và, nội địa hóa chỉ là cách mà chế độ xem có thể tự thể hiện bằng các ngôn ngữ thay thế. –

6

Thay vì có chuỗi giao diện người dùng trong mô hình quan điểm của bạn, bạn có thể lưu trữ chúng trong nguồn lực của lắp ráp và truy cập chúng trực tiếp từ XAML, sử dụng x:Static:

<TextBlock Text="{x:Static props:Resources.MyLabel}"/> 

Các namespace props nên tham khảo namespace Properties của assembly của bạn :

xmlns:props="clr-namespace:My.Assembly.Properties" 
+0

Chỉ cần đảm bảo rằng quyền truy cập Tài nguyên của bạn đã được sửa đổi là Công khai chứ không phải Nội bộ. – midspace

9

Dưới đây là một excellent article about WPF localization. Nó đề cập đến các kỹ thuật nội địa hóa của Microsoft hỗ trợ, và một vài người khác

tôi sẽ không giới thiệu các giải pháp "chính thức" cho nội địa hóa ... nó thực sự là một nỗi đau để sử dụng, nó sẽ thay đổi bạn XAML (thêm x: Uid các thuộc tính cho mọi phần tử có thể được bản địa hóa) và không có công cụ tốt nào từ MS để làm cho nó trở thành một giải pháp dễ dàng. Bản địa hóa resx cũ tốt dễ sử dụng hơn nhiều và tích hợp khá tốt với WPF chỉ với một vài thủ thuật (cụ thể là các phần mở rộng đánh dấu và/hoặc các thuộc tính đính kèm). Ngoài ra, bạn có thể dễ dàng thay đổi ngôn ngữ giao diện khi chạy nhờ hệ thống ràng buộc.

+0

+1 cho bài viết của Rick Strahl. Cái này tốt. Trên thực tế, hệ thống ràng buộc không tuân theo nguyên tắc văn hóa của chuỗi giao diện người dùng hiện tại, nhưng bài viết này cho bạn biết cách khắc phục vấn đề này trong số những thứ khác. Sự lựa chọn tốt. –

+0

+1 câu trả lời rất hữu ích. Cảm ơn bài viết – gyurisc

1

Bạn có thể sử dụng Tiện ích đánh dấu tùy chỉnh để tra cứu các giá trị được bản địa hóa và cập nhật chúng khi văn hóa giao diện người dùng thay đổi.

Dưới đây là một ví dụ về cách này có thể làm việc:

<Label x:Name="lblResxHelloWorldMarkupExtension1Value" 
Content="{res:Res Id=HelloWorld,Default=Hello#}" 
Margin="{res:Res Id=HelloWorldMargin,Default=10}" 
Width="{res:Res Id=HelloWorldWidth, 
ResourceSet=WpfClickOnce.MyFormRes, Default=50}" /> 

Ví dụ này được lấy từ tuyệt vời WPF Localization Hướng dẫn tác giả Rick Strahl và Michele Leroux Bustamante ở đây: http://wpflocalization.codeplex.com/. Tải xuống hướng dẫn từ trang web này, nơi kỹ thuật này được mô tả chi tiết ở dạng tài liệu và với một ứng dụng mẫu.

Một ưu điểm khác của phương pháp này là nó hoạt động trong nhà thiết kế.

1

Nếu bạn gần như quan tâm đến chủ đề này, bạn có thể xem thư viện của tôi mà tôi đang phát triển trên codeplex.

LocalizationLibrary: http://localizationlibrary.codeplex.com/

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