मैं एक उपग्रह असेंबली का उपयोग करने के लिए एक परियोजना को परिवर्तित कर रहा हूं। मैंने एक नई कक्षा पुस्तकालय बनाया (नाम "संसाधन")। सभी डिफ़ॉल्ट संसाधन रूट स्तर *.resx
पर हैं। फिर प्रत्येक संस्कृति के लिए एक फ़ोल्डर है।सैटेलाइट असेंबली, एएसपी.नेट भाषा बदल नहीं रही
"एन /" *.en-GB.resx
साथ *.en.resx
en-GB/ साथ मैं .resx फ़ाइलों बदल Access Modifier
को "सार्वजनिक" और इन सेटिंग्स को बदल दिया है।
BuildAction: EmbeddedResource
CopyToOutputDirectory: CopyAlways
मुझे यकीन है कि .resx
डिजाइनरों *.Designer.cs
"संसाधन" नाम स्थान का उपयोग कर दिया।
मैंने क्लास लाइब्रेरी को एएसपी.नेट एमवीसी ऐप में जोड़ा और global.asax.cs
में मेरी संस्कृति को आवश्यकतानुसार सेट किया गया है।
System.Threading.Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-GB");
System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-GB");
मैं संसाधन वर्ग पुस्तकालय में बाद के निर्माण घटना के लिए al.exe
और Resgen.exe
आदेशों को जोड़ने की कोशिश की।
"C: \ Program Files \ Microsoft SDKs \ Windows \ v7.1 \ बिन \ Resgen.exe" en-GB/MyResourceFile.en-GB.resx "C: \ Program Files \ माइक्रोसॉफ्ट SDKs \ विंडोज \ v7.1 \ Bin \ al.exe "/ t: lib /embed:en-GB/MyResourceFile.en-GB.resources/संस्कृति: en-gb /out:Resources.resources.dll
:MVC के अंदर खोज रहे हैं 3 फाइलों के साथ प्रत्येक भाषा के लिए
bin/
फ़ोल्डरों फ़ोल्डर देखते हैं एप्लिकेशनMyResources.en-GB.Designer.cs, MyResources.en-GB.resx, Resources.resources.dll
रूट स्तर केवल Resources.dll
और Resources.resources.dll
है, लेकिन डिफ़ॉल्ट भाषा के ठीक काम करता है। दूसरा *.resources.dll
पोस्ट-बिल्ड इवेंट के कारण है।
जब मैं CurrentUICulture को बदलता हूं तो यह यूआई भाषा नहीं बदलता है। बाहरी असेंबली में App_GlobalResources/
से संसाधनों को स्थानांतरित करने से पहले यह ठीक काम करता था (रेजर उदाहरण)।
@Resources.MyResources.StringIdentifier
नेट परावर्तक का उपयोग कर इन मतभेद हैं संसाधन .dlls
को देखते हुए।
संपादित करें:
global.asax.cs
में CurrentCulture और UICulture स्थापित करने के बाद, मैं स्वयं एक ResourceManager
जो वास्तव में काम किया है और उम्मीद भाषा में तार लिया गया पुन: प्राप्त करने का परीक्षण किया।
System.Resources.ResourceManager gStrings =
new System.Resources.ResourceManager("Resources.MyResources", System.Reflection.Assembly.Load("Resources")); // Resources=Project Name
string test = gStrings.GetString("TestString"); // WORKS IN GLOBAL.ASAX.CS!!!
मैंने एक एमवीसी नियंत्रक में एक ही परीक्षण की कोशिश की, लेकिन यह काम नहीं करता है।तो संसाधन प्रबंधक को पुनर्प्राप्त किया जा सकता है केवल एकमात्र जगह Global.asax.cs है।
विचित्र रूप से पर्याप्त है कि रेज़र में यूआई स्तर पर एक ही परीक्षण केवल डिफ़ॉल्ट संस्कृतियों को वापस कर देगा! CultureInfo सही है, लेकिन संसाधन प्रबंधक केवल एएसपी.नेट एमवीसी रेजर यूआई में डिफ़ॉल्ट भाषा देता है। (यह परीक्षण के लिए सख्ती से है)
@{
System.Globalization.CultureInfo ci = System.Threading.Thread.CurrentThread.CurrentUICulture;
System.Resources.ResourceManager gStrings =
new System.Resources.ResourceManager("Resources.MyResource", System.Reflection.Assembly.Load("Resources"));
string s = gStrings.GetString("Test"); // DOESN'T WORK IN UI
}
TLDR संस्करण:
उपग्रह विधानसभाओं के लिए App_GlobalResources से संसाधन (.resx) से रूपांतरित किया जा रहा।
हाथ में समस्या।
मैं मैन्युअल रूप से, उपग्रह विधानसभा के लिए एक संसाधनप्रबंधक फोन global.asax
में CurrentUICulture भाषा का प्रयोग कर सकते हैं और यह उम्मीद के रूप में, हालांकि एक ही परीक्षण यूआई की ओर से विफल रहता है और एक MVC नियंत्रक में विफल रहता है काम करता है।
डिफ़ॉल्ट भाषा ठीक काम करती है, तो यूआई स्विच भाषा क्यों नहीं है?
+1। मैं भाषा के लिए कुकीज़ का उपयोग करता हूं, इसलिए संस्कृति केवल सेट है उदा। लॉगिन पर कुछ समय पहले मुझे आपके आवेदन की विस्तार से जांच करने का मौका मिलेगा (और क्या यह वास्तव में उपग्रह संसाधनों के लिए काम करता है), पोस्टिंग के लिए धन्यवाद। वे थोड़ी मुश्किल हैं और कई परियोजनाओं में उपयोग किए जाने पर काफी कठिन जानकारी की आवश्यकता होती है। :) – lko
मुझे लगता है कि आपको आने वाले प्रत्येक अनुरोध के लिए संस्कृतियों को स्थापित करने की आवश्यकता है। हालांकि कुकीज़ से इसे प्राप्त करना ठीक है। मेरे संसाधन एक अलग पुस्तकालय में भी हैं (मुझे लगता है कि सैटेलाइट द्वारा आपका मतलब क्या है?) – Jacco