This article is currently in the process of being translated into Hindi (~99% done).
Application Culture / UICulture
यदि आपने अपनी WPF एप्लिकेशन में नंबरों या तिथियों के साथ थोड़ा बहुत काम किया है, जैसे कि इस ट्यूटोरियल में दिए गए किसी लेख के कारण, तो आपने शायद एक दिलचस्प चीज़ देखी होगी: नंबर और तिथियां अपने आप उस प्रारूप में प्रदर्शित होती हैं जो आपके कंप्यूटर पर उपयोग किए गए प्रारूप से मेल खाती है। अगर आप किसी अंग्रेजी-भाषी देश में रहते हैं, तो यह आपको बहुत बड़ी बात नहीं लग सकती, लेकिन अगर आप उन कई देशों में से किसी एक में रहते हैं जहां तिथियां और/या नंबर अलग तरह से प्रदर्शित किए जाते हैं, तो यह वाकई बहुत शानदार है।
और यदि आप सोच रहे हैं, "निश्चित रूप से नंबरों और तिथियों जैसे साधारण चीज़ों को प्रारूपित करने में इतनी अधिक विविधताएँ नहीं हो सकतीं?", तो मैं सुझाव देता हूँ कि आप इस सैंपल ऐप को देखें, जिसमें मैंने वही नंबर और वही तिथि यूएस, जर्मनी और स्वीडन में उनके पसंदीदा प्रारूप के अनुसार प्रारूपित की है:

जैसा कि आप देख सकते हैं, नंबरों और तिथियों को प्रदर्शित करने में कई सूक्ष्म अंतर होते हैं। अच्छी खबर यह है कि .NET फ्रेमवर्क इसमें आपकी काफी मदद कर सकता है - वास्तव में, यह पहले से ही करता है: डिफ़ॉल्ट रूप से, तिथियों और नंबरों को उस कंप्यूटर की सिस्टम सेटिंग्स के अनुसार प्रारूपित किया जाता है जहां आपकी एप्लिकेशन चल रही है। खराब खबर यह है कि यह व्यवहार हमेशा आपकी आवश्यकताओं के अनुरूप नहीं हो सकता। लेकिन चिंता न करें - आप इसे आसानी से बदल सकते हैं। यह सब CultureInfo क्लास के उपयोग से संबंधित है, जिसके बारे में आप C# ट्यूटोरियल में CultureInfo के लेख में अधिक पढ़ सकते हैं। अभी के लिए, आइए चर्चा करें कि इन तकनीकों को अपनी WPF एप्लिकेशन में कैसे लागू करें।
ऐड-हॉक फॉर्मैटिंग
यदि आपको केवल किसी विशेष जानकारी के लिए स्वरूपण लागू करना है, जैसे कि किसी एकल Label नियंत्रण की सामग्री, तो आप इसे आसानी से और तुरंत कर सकते हैं। इसके लिए आप ToString() मेथड और CultureInfo क्लास का संयोजन उपयोग कर सकते हैं। उदाहरण के लिए, ऊपर दिए गए उदाहरण में, मैंने विभिन्न संस्कृतियों के आधार पर स्वरूपण इस प्रकार लागू किया:
double largeNumber = 123456789.42;
CultureInfo usCulture = new CultureInfo("en-US");
CultureInfo deCulture = new CultureInfo("de-DE");
CultureInfo seCulture = new CultureInfo("sv-SE");
lblNumberUs.Content = largeNumber.ToString("N2", usCulture);
lblNumberDe.Content = largeNumber.ToString("N2", deCulture);
lblNumberSe.Content = largeNumber.ToString("N2", seCulture);
यह कुछ मामलों के लिए पर्याप्त हो सकता है, जहां आपको केवल कुछ जगहों पर विशेष स्वरूपण की आवश्यकता होती है, लेकिन सामान्य रूप से, आपको यह तय करना चाहिए कि आपकी एप्लिकेशन सिस्टम सेटिंग्स (डिफ़ॉल्ट) का उपयोग करेगी या आप इस व्यवहार को पूरे एप्लिकेशन के लिए किसी विशेष संस्कृति सेटिंग के साथ ओवरराइड करेंगे।
CurrentCulture और CurrentUICulture
अपनी WPF एप्लिकेशन में किसी अन्य संस्कृति को लागू करना काफी आसान है। आप संभावित रूप से Thread क्लास की CurrentThread प्रॉपर्टी पर मिलने वाले दो गुणों के साथ काम करेंगे: CurrentCulture और CurrentUICulture लेकिन इन दोनों में अंतर क्या है?
CurrentCulture प्रॉपर्टी वह है जो यह नियंत्रित करती है कि संख्या, तिथियां आदि कैसे स्वरूपित होंगी। इसका डिफ़ॉल्ट मान उस कंप्यूटर के ऑपरेटिंग सिस्टम से आता है जो एप्लिकेशन चला रहा है, और इसे ऑपरेटिंग सिस्टम द्वारा उपयोग की जाने वाली भाषा से स्वतंत्र रूप से बदला जा सकता है। उदाहरण के लिए, जर्मनी में रहने वाले किसी व्यक्ति के लिए यह बहुत सामान्य है कि वे अपने इंटरफेस की भाषा के रूप में अंग्रेज़ी का चयन करें, जबकि संख्या और तिथियों के लिए जर्मन स्वरूप पसंद करें। ऐसे स्थिति में, CurrentCulture प्रॉपर्टी का डिफ़ॉल्ट मान जर्मन होगा।
CurrentUICulture प्रॉपर्टी यह निर्दिष्ट करती है कि इंटरफ़ेस को कौन सी भाषा का उपयोग करना चाहिए। यह केवल तब प्रासंगिक होता है जब आपकी एप्लिकेशन कई भाषाओं का समर्थन करती हो, जैसे कि भाषा-संसाधन फ़ाइलों के उपयोग के माध्यम से। यह आपको एक भाषा (जैसे अंग्रेज़ी) को इंटरफ़ेस के लिए उपयोग करने की अनुमति देता है, जबकि संख्या, तिथियों आदि के इनपुट/आउटपुट को संभालने के लिए दूसरी भाषा (जैसे जर्मन) का उपयोग किया जा सकता है।
एप्लिकेशन की संस्कृति बदलना
इसे ध्यान में रखते हुए, अब आपको यह तय करना होगा कि CurrentCulture और/या CurrentUICulture को बदलना है या नहीं। इसे आप लगभग कभी भी बदल सकते हैं, लेकिन इसे एप्लिकेशन शुरू करते समय बदलना सबसे उचित होता है - अन्यथा, स्विच करने से पहले कुछ आउटपुट पहले से ही डिफ़ॉल्ट संस्कृति के साथ जेनरेट हो सकता है। यहां एक उदाहरण दिया गया है, जहां हम एप्लिकेशन की Culture और UICulture को Application_Startup() इवेंट में बदलते हैं, जिसे आपकी WPFhttps://wpf-tutorial.com/hi/504/a-wpf-application/application-culture-uiculture/# एप्लिकेशन की App.xaml.cs फाइल में उपयोग किया जा सकता है:
private void Application_Startup(object sender, StartupEventArgs e)
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
}
चूंकि हम Thread क्लास और CultureInfo का उपयोग करते हैं, इसलिए यह ध्यान रखें कि यदि ये पहले से मौजूद नहीं हैं, तो आवश्यक नेमस्पेस को अपनी फाइल में शामिल करना न भूलें:
using System.Threading;
using System.Globalization;
इसके साथ, अब संख्या और तिथियां जर्मन (de-DE) प्रारूप के अनुसार स्वरूपित की जाएंगी। जैसा कि उल्लेख किया गया है, यदि आपकी एप्लिकेशन कई भाषाओं का समर्थन नहीं करती है, तो आप UICulture के लिए संस्कृति को परिभाषित करने वाली अंतिम पंक्ति को छोड़ सकते हैं।
Application_Startup इवेंट के दौरान, या कम से कम आपकी मुख्य विंडो के कंस्ट्रक्टर में संस्कृति बदलना सबसे उपयुक्त है, क्योंकि जो मान पहले से जेनरेट हो चुके हैं, वे CurrentCulture प्रॉपर्टी बदलने पर स्वचालित रूप से अपडेट नहीं होते। इसका मतलब यह नहीं है कि आप इसे बाद में नहीं बदल सकते, जैसा कि अगले उदाहरण में दिखाया गया है। यह उदाहरण यह भी स्पष्ट रूप से दिखाता है कि CurrentCulture प्रॉपर्टी के द्वारा आउटपुट पर कैसे प्रभाव पड़ता है:
<Window x:Class="WpfTutorialSamples.WPF_Application.ApplicationCultureSwitchSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfTutorialSamples.WPF_Application"
mc:Ignorable="d"
Title="ApplicationCultureSwitchSample" Height="200" Width="320">
<StackPanel Margin="20">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Label>Number:</Label>
<Label Name="lblNumber" Grid.Column="1" />
<Label Grid.Row="1">Date:</Label>
<Label Name="lblDate" Grid.Row="1" Grid.Column="1" />
</Grid>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="0,20">
<Button Tag="en-US" Click="CultureInfoSwitchButton_Click" HorizontalContentAlignment="Stretch">English (US)</Button>
<Button Tag="de-DE" Click="CultureInfoSwitchButton_Click" HorizontalContentAlignment="Stretch" Margin="10,0">German (DE)</Button>
<Button Tag="sv-SE" Click="CultureInfoSwitchButton_Click" HorizontalContentAlignment="Stretch">Swedish (SE)</Button>
</StackPanel>
</StackPanel>
</Window>
using System;
using System.Globalization;
using System.Threading;
using System.Windows;
using System.Windows.Controls;
namespace WpfTutorialSamples.WPF_Application
{
public partial class ApplicationCultureSwitchSample : Window
{
public ApplicationCultureSwitchSample()
{
InitializeComponent();
}
private void CultureInfoSwitchButton_Click(object sender, RoutedEventArgs e)
{
Thread.CurrentThread.CurrentCulture = new CultureInfo((sender as Button).Tag.ToString());
lblNumber.Content = (123456789.42d).ToString("N2");
lblDate.Content = DateTime.Now.ToString();
}
}
}
दिलचस्प हिस्सा CultureInfoSwitchButton_Click इवेंट में पाया जाता है, जहां हम यह निर्धारित करते हैं कि कौन सा बटन क्लिक किया गया, और उसके आधार पर CurrentCulture सेट करते हैं। इसके बाद, हम उन दो लेबल्स को अपडेट करते हैं जिनमें एक संख्या और एक तिथि होती है:

संस्कृति और थ्रेड्स: DefaultThreadCurrentCulture प्रॉपर्टी
यदि आपकी एप्लिकेशन एक से अधिक थ्रेड्स का उपयोग करती है, तो आपको DefaultThreadCurrentCulture प्रॉपर्टी का उपयोग करने पर विचार करना चाहिए। यह CultureInfo क्लास में पाई जाती है (जो .NET फ्रेमवर्क संस्करण 4.5 में पेश की गई थी) और यह सुनिश्चित करती है कि न केवल वर्तमान थ्रेड, बल्कि भविष्य में बनने वाले थ्रेड्स भी समान संस्कृति का उपयोग करें। आप इसे इस प्रकार उपयोग कर सकते हैं, उदाहरण के लिए, Application_Startup इवेंट में:
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("de-DE");
तो, क्या आपको CurrentCulture और DefaultThreadCurrentCultureदोनों प्रॉपर्टीज़ सेट करनी होंगी? वास्तव में, नहीं - यदि आपने पहले से CurrentCulture प्रॉपर्टी को नहीं बदला है, तो DefaultThreadCurrentCulture प्रॉपर्टी को सेट करने से CurrentCulture पर भी प्रभाव पड़ेगा। दूसरे शब्दों में, यदि आप अपनी एप्लिकेशन में कई थ्रेड्स का उपयोग करने की योजना बना रहे हैं, तो CurrentCulture की बजाय DefaultThreadCurrentCulture का उपयोग करना अधिक समझदारी है - यह सभी परिस्थितियों का ध्यान रखेगा।
सारांश
अपनी WPF एप्लिकेशन की संस्कृति को संभालना बहुत महत्वपूर्ण है, लेकिन सौभाग्य से, WPF यह काम आपके लिए अधिकांशतः पहले से ही करता है, वह भी बिना किसी अतिरिक्त प्रयास के। यदि आपको डिफ़ॉल्ट व्यवहार को बदलने की आवश्यकता हो, तो इसे CurrentCulture और CurrentUICulture प्रॉपर्टीज़ का उपयोग करके आसानी से किया जा सकता है, जैसा कि इस लेख के विभिन्न उदाहरणों में दिखाया गया है।