Я динамически загружаю файл 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.