开发者

Silverlight 4 dynamically downloaded satellite assembly problem

I am dynamically downloading a XAP file that has an embedded resource assembly, with a single resource file (ApplicationStrings.fr-CA.resx). I am using WebClient to pull down the XAP file and using the following code to load the assembly, based on work done by Jeff Prosise in this post: http://www.wintellect.com/CS/blogs/jprosise/archive/2010/06/21/dynamic-localization-in-silverlight.aspx.

Note that I also manually create the XAP file from the fr-CA folder with assembly and the ApplicationManifest.xaml, as described by Guy Smith-Ferrier's steps listed in his presentation here http://www.guysmithferrier.com/post/2010/10/Building-Localized-XAP-Resource-Files-For-Silverlight-4.aspx.

  // Get the application manifest from the downloaded XAP
  StreamResourceInfo sri = new StreamResourceInfo(e.Result, null);
  XmlReader reader = XmlReader.Create(Application.GetResourceStream(sri, new   Uri("AppManifest.xaml", UriKind.Relative)).Stream);

  AssemblyPartCollection parts = new AssemblyPartCollection();

  // Enumerate the assemblies in the downloaded XAP
  if (reader.Read())
  {
      reader.ReadStartElement();

      if (reader.ReadToNextSibling("Deployment.Parts"))
      {
          while (reader.ReadToFollowing("AssemblyPart"))
          {
              parts.Add(new AssemblyPart() { Source = reader.GetAttribute("Source") });
          }
      }
  }

  // Load the satellite assemblies
  foreach (AssemblyPart part in parts)
  {
      if (part.Source.ToLower().Contains("resources"))
      {
          Stream assembly = Application.GetResourceStream(sri, new Uri(part.Source,  UriKind.Relative)).Stream;
          part.Load(assembly);
      }
  }

  // Change the culture
  Thread.CurrentThread.CurrentCulture = culture;
  Thread.CurrentThread.CurrentUICulture = culture;

The assembly seems to load ok, and I have matched up namespaces with the default resource file (ApplicationStrings.resx) with the downloaded resource file (ApplicationStrings.fr-CA.resx). As seen the code, the culture is set for the current thread.

However, calls to ApplicationStrings.ResourceManager.GetString(...) do not return the resources for the set culture. For example, the following should return a string for the new culture (fr-CA), but always returns the default culture (en-US).

 /// <summary>
    ///   Looks up a localized string similar to User Name:.
    /// </summary>
    public static string Label_UserName {
        get {
            return ResourceManager.GetString("Label_UserName", resourceCulture);
        }
    }

Any suggestions? Thanks.

** UPDATE

I figured it out...I had forgotten to reset my supported locals in my satellite assembly project file:

<SupportedCultures>fr-CA</SupportedCultures>

I also made my folder structure exactly as it is for the default resources in m开发者_开发知识库y main Silverlight application.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜