Проблема с динамически загружаемой спутниковой сборкой Silverlight 4 - PullRequest
2 голосов
/ 21 апреля 2011

Я динамически загружаю файл XAP, который имеет встроенную сборку ресурсов, с одним файлом ресурсов (ApplicationStrings.fr-CA.resx). Я использую WebClient для загрузки файла XAP и использую следующий код для загрузки сборки, основываясь на работе, проделанной Джеффом Просисом в этом посте: http://www.wintellect.com/CS/blogs/jprosise/archive/2010/06/21/dynamic-localization-in-silverlight.aspx.

Обратите внимание, что я также вручную создаю XAP-файл из папки fr-CA со сборкой и ApplicationManifest.xaml, как описано шагами Гая Смита-Ферье, перечисленными в его презентации здесь 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;

Сборка, кажется, загружается нормально, и я сопоставил пространства имен с файлом ресурсов по умолчанию (ApplicationStrings.resx) с загруженным файлом ресурсов (ApplicationStrings.fr-CA.resx). Как видно из кода, культура установлена ​​для текущего потока.

Однако вызовы ApplicationStrings.ResourceManager.GetString (...) не возвращают ресурсы для заданной культуры. Например, следующий код должен возвращать строку для новой культуры (fr-CA), но всегда возвращает культуру по умолчанию (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);
        }
    }

Есть предложения? Спасибо.

** ОБНОВЛЕНИЕ

Я понял это ... Я забыл сбросить поддерживаемые локальные данные в файле проекта моей спутниковой сборки:

<SupportedCultures>fr-CA</SupportedCultures>

Я также сделал структуру папок точно такой же, как и для ресурсов по умолчанию в моем основном приложении Silverlight.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...