2012-12-05 17 views
5

मैं एक उपग्रह असेंबली का उपयोग करने के लिए एक परियोजना को परिवर्तित कर रहा हूं। मैंने एक नई कक्षा पुस्तकालय बनाया (नाम "संसाधन")। सभी डिफ़ॉल्ट संसाधन रूट स्तर *.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

यदि हाल ही में एक ऐसी परियोजना स्थापित की गई है जहां आंतरिककरण आपके द्वारा वर्णित रूप से सही या कम काम करता है।

using Perpetuality.Data; 
using System; 
using System.Collections.Generic; 
using System.Globalization; 
using System.Linq; 
using System.Security.Principal; 
using System.Threading; 
using System.Web; 
using System.Web.Mvc; 
using System.Web.Routing; 


namespace Perpetuality.Controllers 
{ 
    public partial class BaseController : Controller 
    { 
     private CultureInfo GetCultureInfo(AuthorizationContext filterContext) 
     { 
      switch ((string)filterContext.RouteData.Values["language"]) 
      { 
       case "nl": 
        return CultureInfo.CreateSpecificCulture("nl-NL"); 
       case "en": 
        return CultureInfo.CreateSpecificCulture("en-US"); 
       case "pt": 
        return CultureInfo.CreateSpecificCulture("pt-PT"); 
       case "de": 
        return CultureInfo.CreateSpecificCulture("de-DE"); 
       case "es": 
        return CultureInfo.CreateSpecificCulture("es-ES"); 
       case "fr": 
        return CultureInfo.CreateSpecificCulture("fr-FR"); 
       case "it": 
        return CultureInfo.CreateSpecificCulture("it-IT"); 
       case "jp": 
        return CultureInfo.CreateSpecificCulture("ja-JP"); 
       default: 
        return CultureInfo.CreateSpecificCulture("en-US"); 
      } 
     } 

     protected override void OnAuthorization(AuthorizationContext filterContext) 
     { 
      Thread.CurrentThread.CurrentCulture = GetCultureInfo(filterContext); 
      Thread.CurrentThread.CurrentUICulture = GetCultureInfo(filterContext); 

      base.OnAuthorization(filterContext); 
     } 
    } 
} 

अपने प्रोजेक्ट में RESX फ़ाइलों तुम्हारा की तुलना में भिन्न निर्दिष्ट कर रहे हैं:

BuildAction: EmbeddedResource 
CopyToOutputDirectory: DoNotCopy 

https://github.com/Jacco/Perpetuality

मैं नियंत्रक में OnAuthorize में HTTP अनुरोध प्रति भाषा स्विच मैं आधार के रूप में उपयोग

मेरे vies में मैं इस तरह के तारों तक पहुंचता हूं:

@Resources.Home.Index.FacebookButtonCaption 

मैंने कुछ भी पोस्ट या प्री बिल्ड सेटअप नहीं किया था।

मेरी परियोजना में भाषा हमेशा यूआरएल पर होती है। अगर कोई उचित भाषा शुरू में नहीं चुनी गई थी तो वह उपयोगकर्ता भाषा स्विच कर सकता था। साझा करने के लिए

+0

+1। मैं भाषा के लिए कुकीज़ का उपयोग करता हूं, इसलिए संस्कृति केवल सेट है उदा। लॉगिन पर कुछ समय पहले मुझे आपके आवेदन की विस्तार से जांच करने का मौका मिलेगा (और क्या यह वास्तव में उपग्रह संसाधनों के लिए काम करता है), पोस्टिंग के लिए धन्यवाद। वे थोड़ी मुश्किल हैं और कई परियोजनाओं में उपयोग किए जाने पर काफी कठिन जानकारी की आवश्यकता होती है। :) – lko

+0

मुझे लगता है कि आपको आने वाले प्रत्येक अनुरोध के लिए संस्कृतियों को स्थापित करने की आवश्यकता है। हालांकि कुकीज़ से इसे प्राप्त करना ठीक है। मेरे संसाधन एक अलग पुस्तकालय में भी हैं (मुझे लगता है कि सैटेलाइट द्वारा आपका मतलब क्या है?) – Jacco

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