2012-09-24 14 views
21

मुझे उपयोगकर्ता की क्षेत्रीय सेटिंग्स के संबंध में विंडोज 8 मेट्रो ऐप्स (एक्सएएमएल & सी #) में कुछ समस्याएं आ रही हैं। ऐसा लगता है कि ऐप्स उपयोगकर्ता की क्षेत्रीय सेटिंग्स का सम्मान नहीं करेंगे, भले ही आपका विंडोज 8 फ़िनिश प्रारूप में दिनांक और समय प्रदर्शित करने के लिए सेट हो, फिर भी ऐप्स उन्हें यूएस-स्वरूपण का उपयोग करके प्रदर्शित करेंगे। लेकिन यह इतनी बड़ी समस्या है कि मुझे कुछ याद आना चाहिए?WinRT ऐप्स और क्षेत्रीय सेटिंग्स। उपयोगकर्ता की क्षेत्रीय सेटिंग्स के आधार पर तिथियों और संख्याओं को प्रारूपित करने का सही तरीका?

इसका परीक्षण करने के लिए मैंने WPF-application बनाकर शुरू किया।

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(); 
    } 

यहाँ मेरी डिफ़ॉल्ट क्षेत्रीय सेटिंग है:: आवेदन सिर्फ CurrentCulture और स्वरूपित DateTime.Now बाहर प्रिंट Regional settings

जब चलाने के लिए, एप्लिकेशन फिनिश प्रारूप में प्रदर्शित की गई तिथि:

Finnish formatting

फिर मैंने क्षेत्रीय सेटिंग्स को अमेरिका में बदल दिया: US Regional settings

और जब एप्लिकेशन फिर से चलाया गया था, संस्कृति और स्वरूपण बदल दिया है: US wpf formatting

यह के रूप में मैं सब कुछ उम्मीद काम करने के लिए और यह भी कि कैसे मैं WinRT क्षुधा काम करने की उम्मीद है।

तो अगले चरण के रूप में, मैंने एक ही कोड के साथ एक WinRT (XAML & सी #) ऐप बनाया और क्षेत्रीय सेटिंग्स को वापस फिनिश में वापस कर दिया। समस्या:

Winrt formatting

यहां तक ​​कि जब मैं क्षेत्रीय सेटिंग कि स्वरूपण "फिनिश" होना चाहिए के माध्यम से परिभाषित किया है, WinRT एप्लिकेशन अमेरिका-स्वरूपण के साथ दिनांक प्रदर्शित करता है। मैं फिर ऐप्स के परियोजना फ़ाइल को संशोधित और fi-fi डिफ़ॉल्ट भाषा बनाया:

Finnish winrt formatting

अजीब:

Default language

यह परिवर्तन भी एप्लिकेशन की संस्कृति को संशोधित किया। मैंने डिफ़ॉल्ट भाषा को अपने डिफ़ॉल्ट मान में वापस बदल दिया और फ़ॉर्मेटिंग को यूएस में बहाल कर दिया गया। इसके बाद मैंने प्रोजेक्ट के अंदर फ़ोल्डर्स "स्ट्रिंग्स-फाई-एफआई" बनाया और परियोजना पर खाली "Resources.resw" जोड़ा। के रूप में मैं अब फिनिश स्वरूपण हो रही थी इस खाली फ़ाइल, पर्याप्त प्रतीत हो रहा है: जैसे ही मैं खाली संसाधन फ़ाइल को हटाने के रूप में

Resource file Finnish formatting

, formattings अमेरिका के लिए वापस reverts:

Resource file removed US formatting winrt

बहुत अजीब।

इससे कुछ प्रश्न होते हैं, लेकिन मुख्य बात यह है कि: क्या यह जानबूझकर है कि WinRT-Apps उपयोगकर्ता की क्षेत्रीय सेटिंग्स का पालन नहीं करते हैं जैसे डब्ल्यूपीएफ ऐप्स करते हैं?

उत्तर

14

यह थोड़ी देर हो गया है, लेकिन सवाल पूरी तरह से उत्तर नहीं दिया गया है, इसलिए मुझे अपना छोटा सा शोध साझा करने दें। डेपेची ज्यादातर सही है, लेकिन उसने केवल एक लिंक प्रदान किया और वास्तव में सुनिश्चित नहीं था।

हां, यह अप्रत्याशित परिवर्तन जानबूझकर है। हमें CultureInfo का अब और उपयोग नहीं करना चाहिए क्योंकि इसमें विरासत कोड हैं और माइक्रोसॉफ्ट चाहते हैं कि हम इसके बजाय Windows.Globalization API का उपयोग करें।

वर्तमान क्षेत्र प्राप्त करने के लिए हम उपयोग कर सकते हैं:

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

लेकिन जैसे-जैसे मैंने देखा कि यह केवल इस क्षेत्र में जानकारी शामिल है, वहाँ कोई भाषा कोड है। भाषा प्राप्त करने के लिए हम उपयोग कर सकते हैं:

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) 

वे "en-US" की तरह प्रारूप भाषा-क्षेत्र में BCP47 भाषा टैग लौट यदि भाषा बोलियों या की तरह "pl" सिर्फ भाषा है यदि भाषा प्रमुख बोलियों नहीं है ।

हम यह भी एक प्राथमिक भाषा है जो सभी बाकी को पार कर जाएगी सेट कर सकते हैं:

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

(यह एक मौजूदा सेटिंग है और उपयोगकर्ता के अनुरोध पर इस्तेमाल किया जा माना जाता है)

भी नए एपीआई नहीं है तिथि, समय और संख्या के लिए:

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 

वहाँ वास्तव में एक बहुत Windows.Globalization APIs में अधिक है, लेकिन मुझे लगता है कि यह हमें सामान्य विचार देता है।

आप विंडो पर इस मुद्दे के बारे में कुछ विषय भी पा सकते हैं कुछ माइक्रोसॉफ्ट कर्मचारी उत्तर के साथ ws 8 dev center forum, लेकिन वे मुख्य रूप से आपको प्रलेखन में भेजते हैं।

+3

तो, acutally कैसे प्राप्त/उपयोगकर्ता क्षेत्रीय स्वरूप सेटिंग का अनुपालन? मैंने परीक्षण उद्देश्य के लिए निम्न कॉन्फ़िगरेशन के साथ विंडोज फोन 8.1 एमुलेटर शुरू किया: यूआई भाषा: जर्मन, क्षेत्र: यूएस, प्रारूप सेटिंग्स: आयरिश मुझे जानकारी प्राप्त करने का कोई तरीका नहीं मिला है, कि उपयोगकर्ता ने अपनी प्रारूप सेटिंग्स सेट की है आयरिश के लिए। और मेरी एकमात्र इच्छा डेटटाइम को प्रारूपित करना है जैसे कि उपयोगकर्ता इसे देखना चाहता है। और क्षेत्रीय प्रारूप स्वचालित रूप से इसका क्षेत्र नहीं है, मैंने डिवाइस को या यूआई लैंगौज को चुना है। मेरे उपकरणों पर मैंने यूआई को अंग्रेजी में सेट किया है लेकिन जर्मन प्रारूप में सभी टाइमस्टैम्प और तिथियां देखना चाहते हैं ... – Kornelis

+0

धन्यवाद, निम्नलिखित बहुत अच्छा था, क्योंकि मुझे आईएसओ 3166-1 अल्फा 2 https://en.wikipedia.org/ की आवश्यकता थी विकी/आईएसओ_3166-1_alpha-2 भौगोलिक क्षेत्र उपयोगकर्ता पंजीकरण = नया भौगोलिक क्षेत्र(); स्ट्रिंग क्षेत्र कोड = उपयोगकर्ता रीजन। कोड दोवेंटर; – Quincy

+0

यह मेरे लिए काम करता है लेकिन अब मुझे बड़ी संख्या की आवश्यकता है और 'मुद्राफॉर्मेटर' दशमलव का समर्थन नहीं करता है इसलिए मुझे एक कामकाज की आवश्यकता है ... –

4

यह जानबूझकर है। माइक्रोसॉफ्ट ओएस की भाषा में अनुप्रयोगों को मजबूर करने से दूर जा रहा है। इसके बजाए, प्रत्येक एप्लिकेशन एप्लिकेशन द्वारा घोषित की गई जानकारी का उपयोग करता है (प्रकट भाषाओं, विंडोज़। ग्लोबलाइजेशन.एपप्लिकेशंस भाषाएं। मैनुअल लाइफ्रेजेज) पर उपयोगकर्ता द्वारा घोषित किया गया है और उपयोगकर्ता द्वारा घोषित किया गया है (उपयोगकर्ता भाषा, Windows.System.UserProfile.GlobalizationPreferences.Languages ​​पर देखे जाने योग्य) को प्रदर्शित करने के तरीके को निर्धारित करने के लिए संसाधन और वैश्वीकृत तिथियां और समय। भाषाओं के इस सेट को एप्लिकेशन भाषा कहा जाता है (Windows.Globalization.AplicationLanguages.Languages ​​पर देखे जाने योग्य)। जो व्यवहार आप देख रहे हैं वह इसलिए है क्योंकि आप उपयोगकर्ता भाषाओं और मेनिफेस्ट भाषाओं के साथ झुका रहे हैं और आपको विभिन्न एप्लिकेशन भाषाएं मिलेंगी।

+4

दिलचस्प दृष्टिकोण, हालांकि ब्रिटेन में रहने वाले पुर्तगाली (और वर्तमान में माइक्रोसॉफ्ट के लिए काम कर रहे) के रूप में मैं नहीं कर सकता इससे अधिक असहमत नहीं है! यहां मेरा विचार है: मेरा विन 10 फोन भाषा "अंग्रेजी यूएस", देश "यूनाइटेड किंगडम" और क्षेत्रीय प्रारूप "पुर्तगाली (पुर्तगाल)" पर सेट है। आउटलुक सही पीटी-पीटी प्रारूप में तारीख दिखाता है, लेकिन अन्य सभी एप्स एन-यूएस का उपयोग करने का आग्रह करते हैं जो आईएमएचओ गलत है और मुझे उम्मीद नहीं है !! –

0

यह पोस्ट दो साल पहले पूछे जाने पर भी प्रासंगिक प्रतीत होता है। मैं बस उस पर आया क्योंकि मैं एक ही चीज़ के उत्तर की तलाश में था। मैं अपने WP8.1 WinRT ऐप में क्षेत्रीय प्रारूप में तिथियां भी प्रदर्शित करना चाहता था। यहां पोस्ट की गई जानकारी में मदद मिलती है, लेकिन इसे एक साथ टुकड़ा करना मुश्किल था।

यह है कि मैं क्या के साथ आया था और यह जवाब मैं जरूरत के रूप में मेरे लिए काम करने लगता है है:

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; 
} 
संबंधित मुद्दे

 संबंधित मुद्दे