मैं बस काम करने के लिए स्थानीयकरण प्राप्त करने के लिए प्रतीत नहीं कर सकता।
मेरे पास एक क्लास लाइब्रेरी है। अब मैं वहां रेक्स फाइलें बनाना चाहता हूं , और थ्रेड कल्चर के आधार पर कुछ मान लौटाता हूं ।
मैं उसे कैसे कर सकता हूँ?
मैं बस काम करने के लिए स्थानीयकरण प्राप्त करने के लिए प्रतीत नहीं कर सकता।
मेरे पास एक क्लास लाइब्रेरी है। अब मैं वहां रेक्स फाइलें बनाना चाहता हूं , और थ्रेड कल्चर के आधार पर कुछ मान लौटाता हूं ।
मैं उसे कैसे कर सकता हूँ?
जवाबों:
strings.resx
।System.Threading
औरSystem.Globalization
यह कोड चलाएँ:
Console.WriteLine(Properties.strings.Hello);
इसे "हैलो" प्रिंट करना चाहिए।
अब, एक नई संसाधन फ़ाइल जोड़ें, जिसका नाम "strings.fr.resx" है ("fr" भाग पर ध्यान दें; इसमें एक में फ्रेंच में संसाधन होंगे)। स्ट्रिंग स्ट्रिंग में समान नाम के साथ एक स्ट्रिंग संसाधन जोड़ें। लेकिन फ्रेंच में मान के साथ (नाम = "हैलो", मान = "सेल्यूट")। अब, यदि आप निम्नलिखित कोड चलाते हैं, तो इसे सालट प्रिंट करना चाहिए:
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
Console.WriteLine(Properties.strings.Hello);
क्या होता है कि सिस्टम "fr-FR" के लिए संसाधन की तलाश करेगा। यह एक नहीं मिलेगा (क्योंकि हमने आपकी फ़ाइल में "fr" निर्दिष्ट किया है)। यह फिर "fr" के लिए जाँच करने के लिए वापस आ जाएगा, जो इसे खोजता है (और उपयोग करता है)।
निम्नलिखित कोड, "हैलो" प्रिंट करेगा:
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("en-US");
Console.WriteLine(Properties.strings.Hello);
ऐसा इसलिए है क्योंकि इसमें कोई "एन-यूएस" संसाधन नहीं है, और साथ ही कोई "एन" संसाधन नहीं है, इसलिए यह डिफ़ॉल्ट रूप से वापस आ जाएगा, जो कि हमने शुरू से जोड़ा है।
यदि आवश्यक हो तो आप अधिक विशिष्ट संसाधनों के साथ फाइल बना सकते हैं (उदाहरण के लिए strings.fr-FR.resx और strings.fr-CA.resx क्रमशः फ्रांस और कनाडा में फ्रेंच के लिए)। ऐसी प्रत्येक फ़ाइल में आपको उन स्ट्रिंग्स के लिए संसाधनों को जोड़ने की आवश्यकता होगी जो उस संसाधन से भिन्न होते हैं जो इसे वापस गिर जाएगा। इसलिए यदि कोई पाठ फ्रांस और कनाडा में समान है, तो आप इसे स्ट्रिंग्स.फ़्रॉ.रेक्स में रख सकते हैं, जबकि कनाडाई फ्रेंच में अलग-अलग स्ट्रिंग्स स्ट्रिंग्स.-CA -resx में जा सकते हैं।
Access Modifier
Public
संसाधन वर्ग उत्पन्न करने के लिए सेट किया जाना चाहिए । गुण नाम में वर्ग आवश्यक नहीं है, यह वह जगह है जहाँ आप .resx फ़ाइल रखते हैं।
यह वास्तव में काफी सरल है। उदाहरण के लिए, एक नई संसाधन फ़ाइल बनाएँ Strings.resx
। को सेट Access Modifier
करें Public
। Apprioriate फ़ाइल टेम्पलेट का उपयोग करें, इसलिए विज़ुअल स्टूडियो स्वचालित रूप से एक एक्सेसर क्लास उत्पन्न करेगा (नाम Strings
इस मामले में होगा)। यह आपकी डिफ़ॉल्ट भाषा है।
अब, जब आप कहना चाहें, तो जर्मन स्थानीयकरण, एक स्थानीयकृत रेक्स फ़ाइल जोड़ें। यह आमतौर Strings.de.resx
पर इस मामले में होगा। यदि आप ऑस्ट्रिया के लिए अतिरिक्त स्थानीयकरण जोड़ना चाहते हैं, तो आप अतिरिक्त रूप से निर्माण करेंगे Strings.de-AT.resx
।
अब एक स्ट्रिंग बनाएं - नाम के साथ एक स्ट्रिंग दें HelloWorld
। अपने में Strings.resx
, इस स्ट्रिंग को "हैलो, दुनिया!" मान के साथ जोड़ें। में Strings.de.resx
, "हेलो, वेल्ट!" जोड़ें। और Strings.de-AT.resx
, "सर्वस, वेल्ट!" जोड़ें। यह अब तक है।
अब आपके पास यह जनरेट किया गया Strings
वर्ग है, और इसमें एक गटर के साथ एक संपत्ति है HelloWorld
। इस संपत्ति को प्राप्त करने से "सर्वस, वेल्ट" लोड होगा। जब आपका लोकेल डी-एटी, "हेल्लो, वेल्ट! आपका लोकेल किसी भी अन्य डी लोकेल (डी-डे और डी-सीएच सहित), और" हैलो, वर्ल्ड! "है, जब आपका लोकेल कुछ और है। यदि कोई स्ट्रिंग है। स्थानीयकृत संस्करण में गुम है, संसाधन प्रबंधक स्वचालित रूप से श्रृंखला को चलाएगा, सबसे विशेष संसाधन से।
आप ResourceManager
चीजों को लोड करने के तरीके के बारे में अधिक नियंत्रण के लिए वर्ग का उपयोग कर सकते हैं। उत्पन्न Strings
वर्ग इसका उपयोग भी करता है।
इसके अलावा @Fredrik Mörk के स्ट्रिंग्स पर शानदार जवाब, स्थानीयकरण को एक रूप में जोड़ने के लिए निम्न कार्य करें:
"Localizable"
के लिएtrue
Language
संपत्ति को अपनी इच्छित भाषा में बदलें (उन सभी के साथ एक अच्छा ड्रॉप-डाउन)संपादित करें: स्थानीयकरण विंडोज फॉर्म पर MSDN का यह आलेख मेरे द्वारा लिंक किए गए मूल नहीं है ... लेकिन ज़रूरत पड़ने पर अधिक प्रकाश डाला जा सकता है। (पुराने को हटा दिया गया है)
F.Mörk द्वारा शानदार जवाब। लेकिन यदि आप अनुवाद को अपडेट करना चाहते हैं, या एप्लिकेशन जारी होने के बाद नई भाषाओं को जोड़ना चाहते हैं, तो आप फंस गए हैं, क्योंकि आपको हमेशा संसाधन बनाने के लिए इसे फिर से जोड़ना होगा।
यहां संसाधन dll को मैन्युअल रूप से संकलित करने का एक समाधान है। यह resgen.exe और al.exe टूल (sdk के साथ स्थापित) का उपयोग करता है।
कहते हैं कि आपके पास एक स्ट्रिंग्स.fr.resx संसाधन फ़ाइल है, आप निम्नलिखित बैच के साथ एक संसाधन dll संकलित कर सकते हैं:
resgen.exe /compile Strings.fr.resx,WpfRibbonApplication1.Strings.fr.resources
Al.exe /t:lib /embed:WpfRibbonApplication1.Strings.fr.resources /culture:"fr" /out:"WpfRibbonApplication1.resources.dll"
del WpfRibbonApplication1.Strings.fr.resources
pause
मूल नाम स्थान को फ़ाइल नामों में रखना सुनिश्चित करें (यहाँ "WpfRibbonApplication1")
@ फ़्रेड्रिक मोर जवाब का एक फिक्स और विस्तार ।
strings.resx
अपनी परियोजना में एक संसाधन फ़ाइल जोड़ें (या एक अलग फ़ाइल नाम)Access Modifier
करने के लिए सेट Public
(खोला strings.resx
फ़ाइल टैब में)Hello
, मान Hello
)विजुअल स्टूडियो ऑटो एक संबंधित strings
वर्ग उत्पन्न करता है , जिसे वास्तव में रखा गया है strings.Designer.cs
। क्लास उसी नामस्थान में है जिससे आप उम्मीद करेंगे कि नई बनाई गई .cs
फ़ाइल को रखा जाएगा।
यह कोड हमेशा प्रिंट करता है Hello
, क्योंकि यह डिफ़ॉल्ट संसाधन है और कोई भाषा-विशिष्ट संसाधन उपलब्ध नहीं हैं:
Console.WriteLine(strings.Hello);
अब एक नया भाषा-विशिष्ट संसाधन जोड़ें:
strings.fr.resx
(फ्रेंच के लिए)Hello
, मान Salut
)निम्नलिखित कोड प्रिंट करता है Salut
:
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("fr-FR");
Console.WriteLine(strings.Hello);
किस संसाधन का उपयोग किया जाता है, इस पर निर्भर करता है Thread.CurrentThread.CurrentUICulture
। यह विंडोज यूआई भाषा सेटिंग के आधार पर सेट किया गया है, या इस उदाहरण में मैन्युअल रूप से सेट किया जा सकता है। इसके बारे में यहाँ और जानें ।
आप जैसे देश-विशेष संसाधन जोड़ सकते हैं strings.fr-FR.resx
या strings.fr-CA.resx
।
उपयोग की जाने वाली स्ट्रिंग इस प्राथमिकता क्रम में निर्धारित की जाती है:
strings.fr-CA.resx
strings.fr.resx
strings.resx
ध्यान दें कि भाषा-विशिष्ट संसाधन उपग्रह असेंबलियाँ उत्पन्न करते हैं ।
यह भी जानें कि यहाँCurrentCulture
से कैसे भिन्न होता CurrentUICulture
है ।
के अलावा @Eric बोले-Feysot जवाब:
उपग्रह असेंबलियों के लिए धन्यवाद, स्थानीयकरण .dll / .exe फ़ाइलों के आधार पर बनाया जा सकता है । इस तरफ:
एक छोटा ज्ञात उपकरण है, जिसे LSACreator कहा जाता है (गैर-व्यावसायिक उपयोग या खरीदने के विकल्प के लिए मुफ़्त) जो आपको .dll / .exe फ़ाइलों के आधार पर मानकीकरण बनाने की अनुमति देता है। वास्तव में, आंतरिक रूप से (भाषा परियोजना की निर्देशिका में) यह रेसक्स फ़ाइलों के स्थानीयकृत संस्करणों को बनाता / प्रबंधित करता है और इसी तरह से @Eric Bole-Feysot के रूप में एक असेंबली को संकलित करता है।
रिसोर्स मैनेजर और .resx थोड़ा गड़बड़ हैं।
आप Lexical.Localization You का उपयोग कर सकते हैं , जो कोड में डिफ़ॉल्ट मान और संस्कृति विशिष्ट मानों को एम्बेड करने की अनुमति देता है, और फ्यूचर संस्कृतियों (जैसे .json या .resx) के लिए बाहरी स्थानीयकरण फ़ाइलों में विस्तारित किया जा सकता है।
public class MyClass
{
/// <summary>
/// Localization root for this class.
/// </summary>
static ILine localization = LineRoot.Global.Type<MyClass>();
/// <summary>
/// Localization key "Ok" with a default string, and couple of inlined strings for two cultures.
/// </summary>
static ILine ok = localization.Key("Success")
.Text("Success")
.fi("Onnistui")
.sv("Det funkar");
/// <summary>
/// Localization key "Error" with a default string, and couple of inlined ones for two cultures.
/// </summary>
static ILine error = localization.Key("Error")
.Format("Error (Code=0x{0:X8})")
.fi("Virhe (Koodi=0x{0:X8})")
.sv("Sönder (Kod=0x{0:X8})");
public void DoOk()
{
Console.WriteLine( ok );
}
public void DoError()
{
Console.WriteLine( error.Value(0x100) );
}
}
Er (मैं उस पुस्तकालय का अनुरक्षक हूं)
सामान्य तौर पर आप अपने अनुवाद संसाधन फ़ाइलों में रखते हैं, जैसे resource.resx।
प्रत्येक विशिष्ट संस्कृति का एक अलग नाम होता है, जैसे resource.nl.resx, resource.fr.resx, resource.de.resx,…
अब एक समाधान का सबसे महत्वपूर्ण हिस्सा अपने अनुवादों को बनाए रखना है। Visual Studio में Microsoft MAT उपकरण: बहुभाषी ऐप टूलकिट (MAT) स्थापित करें। Winforms, wpf, asp.net (कोर), uwp, के साथ काम करता है ...
सामान्य तौर पर, उदाहरण के लिए, WPF प्रोजेक्ट में WPF समाधान के लिए
[assembly: System.Resources.NeutralResourcesLanguage("en")]
आप जो देखेंगे वह यह है कि एक नया फ़ोल्डर बनाया जाएगा, जिसे "MultilingualResources" कहा जाएगा जिसमें एक ....nl.xlf
फ़ाइल होगी।
अब आपको केवल यही करना है:
(.xlf फाइलें "बहुभाषी संपादक" के साथ खुलनी चाहिए, अगर यह स्थिति नहीं है, तो सही माउस .xlf फ़ाइल पर क्लिक करें, "ओपन विथ ..." चुनें और "बहुभाषी संपादक" चुनें।
मज़े करो! अब आप यह भी देख सकते हैं कि क्या अनुवाद नहीं किया गया है, बाहरी अनुवाद कंपनियों को xlf में अनुवाद निर्यात करें, उन्हें फिर से आयात करें, अन्य परियोजनाओं आदि से अनुवाद रीसायकल करें ...
और जानकारी: