C # में स्थानीयकरण का उपयोग कैसे करें


268

मैं बस काम करने के लिए स्थानीयकरण प्राप्त करने के लिए प्रतीत नहीं कर सकता।

मेरे पास एक क्लास लाइब्रेरी है। अब मैं वहां रेक्स फाइलें बनाना चाहता हूं , और थ्रेड कल्चर के आधार पर कुछ मान लौटाता हूं ।

मैं उसे कैसे कर सकता हूँ?


PS: सुनिश्चित करें कि आपने दृश्य स्टूडियो के लिए मुफ्त Microsoft MAT (बहुभाषी ऐप टूलकिट) एक्सटेंशन स्थापित किया है ;-)
juFo

जवाबों:


571
  • अपने प्रोजेक्ट में एक संसाधन फ़ाइल जोड़ें (आप इसे "strings.resx" कह सकते हैं) निम्न कार्य करके: प्रोजेक्ट में
    राइट-क्लिक करें गुण , संदर्भ मेनू में Add -> नया आइटम ... चुनें, फिर सूची में विजुअल C # आइटम लेने "संसाधन फ़ाइल" और इसे नाम 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 में जा सकते हैं।


24
जवाब "पीछे के दृश्यों" प्लंबिंग का संदर्भ दे सकता है जो कि विजुअल स्टूडियो द्वारा यहां किया जा रहा है: resx.designer.cs फ़ाइल, इंटेलीजेंस कार्य करता है; सैटेलाइट असेंबलियों को क्लास लाइब्रेरी के साथ संकलित किया जाता है, जिसे संकलित असेंबली और किसी भी बाद की परियोजनाओं के साथ तैनात करने की आवश्यकता होती है, जो इसका उपयोग करते हैं, आदि ... उत्तर अच्छा और सरल है, लेकिन यह समझाने में मदद नहीं करता है कि चीजें कहां गलत हो सकती हैं जैसे यदि आप Visual Studio का उपयोग नहीं करते हैं।
ताओ

13
+1 पोस्ट! फ़ाइलों को मैन्युअल रूप से बनाने के बजाय, Zeta Resource Editor ( zeta-resource-editor.com/index.html ) आज़माएँ । यह मुफ़्त है और आपको वीएस में अनुवाद के इन प्रकारों को तेजी से करने में मदद करता है।
13

4
Access ModifierPublicसंसाधन वर्ग उत्पन्न करने के लिए सेट किया जाना चाहिए । गुण नाम में वर्ग आवश्यक नहीं है, यह वह जगह है जहाँ आप .resx फ़ाइल रखते हैं।
एंड्री मोइसेव

3
विदित हो कि वीएस 2017 में विनफॉर्म में स्थानीयकरण के साथ रेक्स बग (कम से कम 15.4 संस्करण तक) के कारण काम नहीं कर रहा है। एक टिकट उपलब्ध है: developercommunity.visualstudio.com/content/problem/63772/…
muccix

4
.NET 4.5 के अनुसार, System.Globalization.CultureInfo.DefaultThreadCurrentCulture का उपयोग थ्रेड के बजाय करना संभव है। CurrentThread.CurrentUICulture ताकि आप थ्रेड के बजाय पूरे एप्लिकेशन के लिए लोकेल को बदल दें
GrixM

41

यह वास्तव में काफी सरल है। उदाहरण के लिए, एक नई संसाधन फ़ाइल बनाएँ 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वर्ग इसका उपयोग भी करता है।


स्थानीय सेट कैसे करें?
मैथ्यूस साइमन

1
@ मैथ्यूसिमोन: आपको जरूरत नहीं है डिफ़ॉल्ट रूप से, उपयोगकर्ता का वर्तमान स्थान उपयोग किया जाता है। यदि आप एक निश्चित लोकेल को बाध्य करना चाहते हैं (जैसे कि उपयोगकर्ताओं को भाषा को मैन्युअल रूप से बदलने की अनुमति देने के लिए), तो आपको प्रत्येक थ्रेड में सिस्टम लोड होने से पहले System.Thread.Thread.CurrentCulture और CurrentUICulture सेट करना होगा। रनटाइम पर अपडेट के बजाय इसके लिए एप्लिकेशन को पुनरारंभ करना आसान है।
ओरेगनगॉस्ट

15

इसके अलावा @Fredrik Mörk के स्ट्रिंग्स पर शानदार जवाब, स्थानीयकरण को एक रूप में जोड़ने के लिए निम्न कार्य करें:

  • सेट प्रपत्र की संपत्ति "Localizable"के लिएtrue
  • प्रपत्र की Languageसंपत्ति को अपनी इच्छित भाषा में बदलें (उन सभी के साथ एक अच्छा ड्रॉप-डाउन)
  • उस रूप में नियंत्रणों का अनुवाद करें और ज़रूरत पड़ने पर उन्हें स्थानांतरित करें (उन स्क्वैश को वास्तव में लंबे पूर्ण फ्रांसीसी वाक्य में!)

संपादित करें: स्थानीयकरण विंडोज फॉर्म पर MSDN का यह आलेख मेरे द्वारा लिंक किए गए मूल नहीं है ... लेकिन ज़रूरत पड़ने पर अधिक प्रकाश डाला जा सकता है। (पुराने को हटा दिया गया है)


Msdn लेख अब उपलब्ध नहीं है, कोई प्रतिस्थापन?
फूमाग

यकीन नहीं है - मैंने सबसे अच्छा एक जोड़ा है जिसे मैं देख सकता हूं, लेकिन मुझे याद नहीं है कि लेख 7 साल पहले
कैसा

14

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")


2
नाम स्थान (y) के संरक्षण पर टिप्पणी के लिए धन्यवाद, जो - यदि चूक गया - कोई त्रुटि उत्पन्न नहीं करेगा, लेकिन केवल कमबैक संसाधन पर वापस लौटें।
मोस्का पं।

11

@ फ़्रेड्रिक मोर जवाब का एक फिक्स और विस्तार ।

  • 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 है


1

मेरे मामले में

[assembly: System.Resources.NeutralResourcesLanguage("ru-RU")]

असेंबलीइन्फो में.सामान्य रूप से काम करने के लिए चीजों को रोका।


0

के अलावा @Eric बोले-Feysot जवाब:

उपग्रह असेंबलियों के लिए धन्यवाद, स्थानीयकरण .dll / .exe फ़ाइलों के आधार पर बनाया जा सकता है । इस तरफ:

  • स्रोत कोड (VS प्रोजेक्ट) को भाषा प्रोजेक्ट से अलग किया जा सकता है,
  • एक नई भाषा जोड़ने से परियोजना को फिर से शुरू करने की आवश्यकता नहीं होती है,
  • अनुवाद अंत-उपयोगकर्ता द्वारा भी किया जा सकता है।

एक छोटा ज्ञात उपकरण है, जिसे LSACreator कहा जाता है (गैर-व्यावसायिक उपयोग या खरीदने के विकल्प के लिए मुफ़्त) जो आपको .dll / .exe फ़ाइलों के आधार पर मानकीकरण बनाने की अनुमति देता है। वास्तव में, आंतरिक रूप से (भाषा परियोजना की निर्देशिका में) यह रेसक्स फ़ाइलों के स्थानीयकृत संस्करणों को बनाता / प्रबंधित करता है और इसी तरह से @Eric Bole-Feysot के रूप में एक असेंबली को संकलित करता है।


0

रिसोर्स मैनेजर और .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 (मैं उस पुस्तकालय का अनुरक्षक हूं)


0

सामान्य तौर पर आप अपने अनुवाद संसाधन फ़ाइलों में रखते हैं, जैसे resource.resx।

प्रत्येक विशिष्ट संस्कृति का एक अलग नाम होता है, जैसे resource.nl.resx, resource.fr.resx, resource.de.resx,…

अब एक समाधान का सबसे महत्वपूर्ण हिस्सा अपने अनुवादों को बनाए रखना है। Visual Studio में Microsoft MAT उपकरण: बहुभाषी ऐप टूलकिट (MAT) स्थापित करें। Winforms, wpf, asp.net (कोर), uwp, के साथ काम करता है ...

सामान्य तौर पर, उदाहरण के लिए, WPF प्रोजेक्ट में WPF समाधान के लिए

  • Visual Studio के लिए Microsoft MAT एक्सटेंशन स्थापित करें।
  • समाधान एक्सप्लोरर में, अपने प्रोजेक्ट> गुण> असेंबलीइन्फो
  • असेंबली में शामिल करेंइन्फो। अपनी डिफ़ॉल्ट, तटस्थ भाषा (मेरे मामले में अंग्रेजी) पर क्लिक करें: [assembly: System.Resources.NeutralResourcesLanguage("en")]
  • समाधान एक्सप्लोरर में अपनी परियोजना का चयन करें और दृश्य स्टूडियो में, शीर्ष मेनू से, "टूल"> "बहुभाषी ऐप टूलकिट"> "चयन सक्षम करें" पर क्लिक करें, परियोजना के लिए MAT को सक्षम करने के लिए।
    • अब राइट माउस सॉल्यूशन एक्सप्लोरर में प्रोजेक्ट पर क्लिक करें, "बहुभाषी ऐप टूलकिट"> "अनुवाद भाषाओं को जोड़ें ..." चुनें और उस भाषा का चयन करें जिसके लिए आप अनुवाद जोड़ना चाहते हैं। उदाहरण के लिए डच।

आप जो देखेंगे वह यह है कि एक नया फ़ोल्डर बनाया जाएगा, जिसे "MultilingualResources" कहा जाएगा जिसमें एक ....nl.xlfफ़ाइल होगी।

अब आपको केवल यही करना है:

  1. अपने डिफ़ॉल्ट रिसोर्स में अपना अनुवाद जोड़ें ।resx फ़ाइल (मेरे मामले में अंग्रेजी)
  2. .Xlf फ़ाइल (NOT .resx फ़ाइल) पर क्लिक करके अनुवाद करें। .xlf फाइलें .xx फ़ाइलों को जनरेट / अपडेट करेंगी।

(.xlf फाइलें "बहुभाषी संपादक" के साथ खुलनी चाहिए, अगर यह स्थिति नहीं है, तो सही माउस .xlf फ़ाइल पर क्लिक करें, "ओपन विथ ..." चुनें और "बहुभाषी संपादक" चुनें।

मज़े करो! अब आप यह भी देख सकते हैं कि क्या अनुवाद नहीं किया गया है, बाहरी अनुवाद कंपनियों को xlf में अनुवाद निर्यात करें, उन्हें फिर से आयात करें, अन्य परियोजनाओं आदि से अनुवाद रीसायकल करें ...

और जानकारी:

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.