2012-09-24 20 views
21

Tôi đang gặp một số sự cố trong ứng dụng Windows 8 Metro (XAML & C#) về cài đặt khu vực của người dùng. Có vẻ như các ứng dụng sẽ không tôn trọng cài đặt vùng của người dùng, vì vậy ngay cả khi Windows 8 của bạn được đặt để hiển thị ngày và giờ ở định dạng Phần Lan, ứng dụng sẽ vẫn hiển thị chúng bằng định dạng của Hoa Kỳ. Nhưng đây là một vấn đề lớn mà phải có một cái gì đó tôi đang mất tích?Ứng dụng WinRT và cài đặt khu vực. Cách chính xác để định dạng ngày và số dựa trên cài đặt vùng của người dùng?

Để kiểm tra điều này, tôi bắt đầu bằng cách tạo một ứng dụng WP2 WPF. Ứng dụng này chỉ in ra CurrentCulture và DateTime.Now định dạng:

private void Culture_Loaded_1(object sender, RoutedEventArgs e) 
    { 
     this.Culture.Text = System.Globalization.CultureInfo.CurrentCulture.DisplayName; 
    } 

    private void Date_Loaded_1(object sender, RoutedEventArgs e) 
    { 
     this.Date.Text = DateTime.Now.ToString(); 
    } 

Dưới đây là các thiết lập mặc định của tôi trong khu vực: Regional settings

Khi chạy, ứng dụng hiển thị ngày ở định dạng Phần Lan:

Finnish formatting

Sau đó, tôi đã thay đổi cài đặt khu vực thành US: US Regional settings

Và khi ứng dụng được chạy lại, văn hóa và định dạng thay đổi: US wpf formatting

Đây là như tôi mong đợi tất cả mọi thứ để làm việc và đây cũng là cách mà tôi mong đợi các ứng dụng WinRT để làm việc.

Vì vậy, với bước tiếp theo, tôi đã tạo ứng dụng WinRT (XAML & C#) với cùng mã và hoàn nguyên cài đặt vùng trở về Phần Lan. Vấn đề:

Winrt formatting

Ngay cả khi tôi đã xác định thông qua các thiết lập khu vực mà các định dạng cần được "Phần Lan", ứng dụng sẽ hiển thị WinRT datetime với Mỹ-định dạng. sau đó tôi sửa đổi hồ sơ dự án của ứng dụng và làm fi-FI ngôn ngữ mặc định:

Default language

Sự thay đổi này cũng biến đổi văn hóa của ứng dụng:

Finnish winrt formatting

Strange. Tôi đã thay đổi Ngôn ngữ mặc định về giá trị mặc định của nó và định dạng đã được khôi phục về Hoa Kỳ. Sau đó tôi tạo ra các thư mục "Strings - fi-FI" bên trong dự án và thêm rỗng "Resources.resw" vào dự án. tập tin rỗng này có vẻ là đủ, vì bây giờ tôi đã nhận được các định dạng Phần Lan:

Resource file Finnish formatting

Ngay sau khi tôi loại bỏ các tập tin tài nguyên trống, formattings quay ngược lại cung của Hoa Kỳ:

Resource file removed US formatting winrt

Rất lạ.

Điều này dẫn đến một vài câu hỏi, nhưng chính tôi nghĩ là: Các ứng dụng WinRT có cố ý không tuân theo các cài đặt khu vực của người dùng như các ứng dụng WPF không?

Trả lời

14

Đã lâu rồi, nhưng câu hỏi chưa được trả lời đầy đủ, vì vậy hãy để tôi chia sẻ nghiên cứu nhỏ của mình. Depechie là chủ yếu là đúng, nhưng ông chỉ cung cấp một liên kết và không thực sự chắc chắn.

Có, thay đổi không mong muốn này là cố ý. Chúng tôi không nên sử dụng CultureInfo nữa vì nó chứa mã cũ và Microsoft muốn chúng tôi sử dụng API Windows.Globalization thay thế.

Để có được khu vực hiện nay chúng ta có thể sử dụng:

GeographicRegion userRegion = new GeographicRegion(); 
string regionCode = userRegion.CodeTwoLetter; 

Nhưng khi tôi nhận thấy nó chỉ chứa thông tin khu vực, không có mã ngôn ngữ. Để có được ngôn ngữ chúng ta có thể sử dụng:

string langRegionCode = Windows.Globalization.Language.CurrentInputMethodLanguageTag; // depends on keyboard settings 
List<string> langs = Windows.System.UserProfile.GlobalizationPreferences.Languages; // all user languages, like in languages control panel 
List<string> applicationlangs = Windows.Globalization.ApplicationLanguages.Languages; // application languages (user languages resolved against languages declared as supported by application) 

Họ trở BCP47 thẻ ngôn ngữ ở định dạng ngôn ngữ-REGION như "en-US" nếu ngôn ngữ có tiếng địa phương hoặc chỉ ngôn ngữ như "pl" nếu ngôn ngữ không có tiếng địa phương lớn .

Chúng tôi cũng có thể thiết lập một ngôn ngữ chính mà sẽ ghi đè tất cả các phần còn lại:

Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = "en-US"; 

(Đây là một môi trường tiếp tục tồn tại và là nghĩa vụ phải được sử dụng ở người sử dụng yêu cầu)

Ngoài ra còn có API mới cho ngày, giờ và số điện thoại:

Windows.Globalization.DateTimeFormatting.DateTimeFormatter dtf = new DateTimeFormatter("longdate", new[] { "en-US" }, "US", CalendarIdentifiers.Gregorian, ClockIdentifiers.TwentyFourHour); 
string longDate = dtf.Format(DateTime.Now); 

Windows.Globalization.NumberFormatting.DecimalFormatter deciamlFormatter = new DecimalFormatter(new string[] { "PL" }, "PL"); 
double d1 = (double)deciamlFormatter.ParseDouble("2,5"); // ParseDouble returns double?, not double 

Có nhiều thứ khác trong Windows.Globalization API, nhưng tôi nghĩ rằng điều này mang lại cho chúng tôi ý tưởng chung. Để đọc thêm:

Bạn cũng có thể tìm thấy một số chủ đề về sự cố trên windo ws 8 dev trung tâm diễn đàn với một số câu trả lời của nhân viên Microsoft, nhưng họ chủ yếu gửi bạn đến tài liệu.

+3

Vì vậy, acutally cách get/tôn trọng những người sử dụng thiết lập Format khu vực? Tôi đã khởi chạy trình mô phỏng điện thoại Windows 8.1 với cấu hình sau cho mục đích thử nghiệm: Giao diện người dùng Ngôn ngữ: Tiếng Đức, Vùng: Hoa Kỳ, Cài đặt định dạng: Ailen Tôi không tìm được cách nào để nhận thông tin. đến Ailen. Và điều ước duy nhất của tôi là định dạng DateTime như người dùng muốn xem nó. Và định dạng khu vực không tự động có nghĩa là khu vực của nó tôi thiết lập thiết bị hoặc Langauge UI tôi đã chọn. Trên thiết bị của tôi, tôi đặt giao diện người dùng sang tiếng Anh nhưng muốn xem tất cả các TimeStamps và Ngày ở định dạng tiếng Đức ... – Kornelis

+0

cảm ơn, điều sau đây rất tuyệt, vì tôi cần ISO 3166-1 alpha2 https://en.wikipedia.org/ wiki/ISO_3166-1_alpha-2 GeographicRegion userRegion = new GeographicRegion(); chuỗi regionCode = userRegion.CodeTwoLetter; – Quincy

+0

Điều này đã làm việc cho tôi nhưng bây giờ tôi cần số lớn và 'CurrencyFormatter' không hỗ trợ số thập phân vì vậy tôi cần giải pháp ... –

4

Đó là ý định. Microsoft đang tránh xa việc buộc các ứng dụng phải có ngôn ngữ của hệ điều hành. Thay vào đó, mỗi ứng dụng sử dụng thông tin được khai báo bởi ứng dụng (các ngôn ngữ biểu hiện, có thể quan sát được tại Windows.Globalization.ApplicationLanguages.ManifestLanguages) và được khai báo bởi người dùng (ngôn ngữ người dùng, có thể quan sát được tại Windows.System.UserProfile.GlobalizationPreferences.Languages) để xác định cách hiển thị tài nguyên và ngày và giờ toàn cầu hóa. Tập hợp các ngôn ngữ này được gọi là ngôn ngữ ứng dụng (có thể quan sát được tại Windows.Globalization.ApplicationLanguages.Languages). Hành vi mà bạn đang thấy là bởi vì bạn đang sử dụng ngôn ngữ người dùng và ngôn ngữ hiển thị và bạn sẽ nhận được các ngôn ngữ ứng dụng khác nhau.

+4

Cách tiếp cận thú vị, mặc dù là người Bồ Đào Nha sống ở Vương quốc Anh (và hiện đang làm việc cho Microsoft), tôi không thể 'không đồng ý nhiều hơn về nó! Đây là quan điểm của tôi: Điện thoại Win10 của tôi có ngôn ngữ được đặt thành "tiếng Anh Mỹ", quốc gia thành "Vương quốc Anh" và định dạng khu vực "Bồ Đào Nha (Bồ Đào Nha)". Outlook hiển thị ngày theo định dạng pt-PT chính xác, nhưng tất cả các ứng dụng khác đều nhấn mạnh vào việc sử dụng en-US mà IMHO sai và không phải những gì tôi mong đợi !! –

0

Bài đăng này dường như vẫn có liên quan mặc dù đã được hỏi hai năm trước. Tôi chỉ gặp nó khi tôi đang tìm kiếm câu trả lời cho cùng một thứ. Tôi cũng muốn hiển thị ngày tháng theo định dạng khu vực trong ứng dụng WinRT WP8.1 của tôi. Thông tin được đăng ở đây sẽ giúp ích, nhưng có một chút khó khăn khi kết hợp nó lại với nhau.

Đây là những gì tôi đã đưa ra và có vẻ như để làm việc cho tôi là câu trả lời tôi cần:

using Windows.Globalization; 
using Windows.Globalization.DateTimeFormatting; 

private string FormatDate(int year, int month, int day) 
{ 
    GeographicRegion userRegion = new GeographicRegion(); 
    string regionCode = userRegion.CodeTwoLetter; 
    var formatter = new DateTimeFormatter("year month day", new[] { regionCode }); 
    DateTime dateToFormat = new DateTime(year, month, day); 
    var formattedDate = formatter.Format(dateToFormat); 
    return formattedDate; 
} 
Các vấn đề liên quan