/// <summary> /// Looks up in the cached <see cref="ResourceManager"/> list for the searched <see cref="ResourceManager"/>. /// </summary> /// <param name="resourceAssembly">The resource assembly.</param> /// <param name="resourceDictionary">The dictionary to look up.</param> /// <returns> /// The found <see cref="ResourceManager"/> /// </returns> /// <exception cref="System.InvalidOperationException"> /// If the ResourceManagers cannot be looked up /// </exception> /// <exception cref="System.ArgumentException"> /// If the searched <see cref="ResourceManager"/> wasn't found /// </exception> protected ResourceManager GetResourceManager(string resourceAssembly, string resourceDictionary) { Assembly assembly = null; ResourceManager resManager; string foundResource = null; string resManagerNameToSearch = "." + resourceDictionary + ResourceFileExtension; var resManKey = resourceAssembly + resManagerNameToSearch; #if !SILVERLIGHT // Here comes our great hack for full VS2012+ design time support with multiple languages. // We check only every second to reduce overhead in the designer. var now = DateTime.Now; if (AppDomain.CurrentDomain.FriendlyName.Contains("XDesProc") && ((now - lastUpdateCheck).TotalSeconds >= 1.0)) { // This block is only handled during design time. lastUpdateCheck = now; // Get the directory of the executing assembly (some strange path in the middle of nowhere on the disk and attach "\tmp", e.g.: // %userprofile%\AppData\Local\Microsoft\VisualStudio\12.0\Designer\ShadowCache\erys4uqz.oq1\l24nfewi.r0y\tmp\ var assemblyDir = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "tmp"); // Find the VS process that shows our design. foreach (var process in Process.GetProcesses()) { if (!process.ProcessName.Contains(".vshost")) { continue; } // Get the executable path (all paths are cached now in order to reduce WMI load. var dir = Path.GetDirectoryName(GetExecutablePath(process.Id)); if (string.IsNullOrEmpty(dir)) { continue; } // Get all files matching our resource assembly. var files = Directory.GetFiles(dir, resourceAssembly + ".*", SearchOption.AllDirectories); if (files.Length > 0) { // Get more files. files = Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories).Where(f => IsFileOfInterest(f, dir)).ToArray(); // Remove the resource manager from the dictionary. TryRemove(resManKey); // Copy all newer or missing files. foreach (var f in files) { try { var dst = Path.Combine(assemblyDir, f.Replace(dir + "\\", "")); if (!File.Exists(dst) || (Directory.GetLastWriteTime(dst) < Directory.GetLastWriteTime(f))) { var dstDir = Path.GetDirectoryName(dst); if (String.IsNullOrEmpty(dstDir)) { continue; } if (!Directory.Exists(dstDir)) { Directory.CreateDirectory(dstDir); } File.Copy(f, dst, true); } } // ReSharper disable once EmptyGeneralCatchClause catch { } } // Prepare and load (new) assembly. var file = Path.Combine(assemblyDir, resourceAssembly + ".exe"); if (!File.Exists(file)) { file = Path.Combine(assemblyDir, resourceAssembly + ".dll"); } assembly = Assembly.LoadFrom(file); // Must break here - otherwise, we might have caught another instance of VS. break; } } } #endif if (!TryGetValue(resManKey, out resManager)) { // If the assembly cannot be loaded, throw an exception if (assembly == null) { try { // go through every assembly loaded in the app domain var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies(); foreach (var assemblyInAppDomain in loadedAssemblies) { // get the assembly name object AssemblyName assemblyName = new AssemblyName(assemblyInAppDomain.FullName); // check if the name of the assembly is the seached one if (assemblyName.Name == resourceAssembly) { // assigne the assembly assembly = assemblyInAppDomain; // stop the search here break; } } // check if the assembly is still null if (assembly == null) { // assign the loaded assembly #if SILVERLIGHT var name = new AssemblyName(resourceAssembly); assembly = Assembly.Load(name.FullName); #else assembly = Assembly.Load(new AssemblyName(resourceAssembly)); #endif } } catch (Exception ex) { throw new Exception(string.Format("The Assembly '{0}' cannot be loaded.", resourceAssembly), ex); } } // get all available resourcenames string[] availableResources = assembly.GetManifestResourceNames(); // get all available types (and ignore unloadable types, e.g. because of unsatisfied dependencies) IEnumerable <Type> availableTypes; try { availableTypes = assembly.GetTypes(); } catch (ReflectionTypeLoadException e) { availableTypes = e.Types.Where(t => t != null); } // The proposed approach of Andras (http://wpflocalizeextension.codeplex.com/discussions/66098?ProjectName=wpflocalizeextension) Func <Type, string> tryGetNamespace = delegate(Type type) { // Ignore unloadable types try { return(type.Namespace); } catch (Exception) { return(null); } }; var possiblePrefixes = availableTypes.Select(tryGetNamespace).Where(n => n != null).Distinct().ToList(); foreach (string availableResource in availableResources) { if (availableResource.EndsWith(resManagerNameToSearch) && possiblePrefixes.Any(p => availableResource.StartsWith(p + "."))) { // take the first occurrence and break foundResource = availableResource; break; } } // NOTE: Inverted this IF (nesting is bad, I know) so we just create a new ResourceManager. -gen3ric if (foundResource != null) { // remove ".resources" from the end foundResource = foundResource.Substring(0, foundResource.Length - ResourceFileExtension.Length); // First try the simple retrieval Type resourceManagerType; try { resourceManagerType = assembly.GetType(foundResource); } catch (Exception) { resourceManagerType = null; } // If simple doesn't work, check all of the types without using dot notation if (resourceManagerType == null) { var dictTypeName = resourceDictionary.Replace('.', '_'); Func <Type, bool> matchesDictTypeName = delegate(Type type) { // Ignore unloadable types try { return(type.Name == dictTypeName); } catch (Exception) { return(false); } }; resourceManagerType = availableTypes.FirstOrDefault(matchesDictTypeName); } resManager = GetResourceManagerFromType(resourceManagerType); } else { resManager = new ResourceManager(resManagerNameToSearch, assembly); } // if no one was found, exception if (resManager == null) { throw new ArgumentException(string.Format("No resource manager for dictionary '{0}' in assembly '{1}' found! ({1}.{0})", resourceDictionary, resourceAssembly)); } // Add the ResourceManager to the cachelist Add(resManKey, resManager); try { #if SILVERLIGHT var cultures = CultureInfoHelper.GetCultures(); foreach (var c in cultures) { var dir = c.Name + "/"; foreach (var p in Deployment.Current.Parts) { if (p.Source.StartsWith(dir)) { AddCulture(c); break; } } } #else var assemblyLocation = Path.GetDirectoryName(assembly.Location); // Get the list of all cultures. var cultures = CultureInfo.GetCultures(CultureTypes.AllCultures); foreach (var c in cultures) { var rs = resManager.GetResourceSet(c, true, false); if (rs != null) { AddCulture(c); } } #endif } catch { // This may lead to problems with Silverlight } } // return the found ResourceManager return(resManager); }
/// <summary> /// Looks up in the cached <see cref="ResourceManager"/> list for the searched <see cref="ResourceManager"/>. /// </summary> /// <param name="resourceAssembly">The resource assembly (e.g.: <c>BaseLocalizeExtension</c>). NULL = Name of the executing assembly</param> /// <param name="resourceDictionary">The dictionary to look up (e.g.: ResHelp, Resources, ...). NULL = Name of the default resource file (Resources)</param> /// <returns> /// The found <see cref="ResourceManager"/> /// </returns> /// <exception cref="System.InvalidOperationException"> /// If the ResourceManagers cannot be looked up /// </exception> /// <exception cref="System.ArgumentException"> /// If the searched <see cref="ResourceManager"/> wasn't found /// </exception> protected ResourceManager GetResourceManager(string resourceAssembly, string resourceDictionary) { PropertyInfo propInfo; MethodInfo methodInfo; Assembly assembly = null; ResourceManager resManager; string foundResource = null; string resManagerNameToSearch = "." + resourceDictionary + ResourceFileExtension; string[] availableResources; var keyManKey = resourceAssembly + resManagerNameToSearch; if (!TryGetValue(keyManKey, out resManager)) { // if the assembly cannot be loaded, throw an exception try { // go through every assembly loaded in the app domain foreach (Assembly assemblyInAppDomain in AppDomain.CurrentDomain.GetAssemblies()) { // check if the name pf the assembly is not null if (assemblyInAppDomain.FullName != null) { // get the assembly name object AssemblyName assemblyName = new AssemblyName(assemblyInAppDomain.FullName); // check if the name of the assembly is the seached one if (assemblyName.Name == resourceAssembly) { // assigne the assembly assembly = assemblyInAppDomain; // stop the search here break; } } } // check if the assembly is still null if (assembly == null) { // assign the loaded assembly #if SILVERLIGHT var name = new AssemblyName(resourceAssembly); assembly = Assembly.Load(name.FullName); #else assembly = Assembly.Load(new AssemblyName(resourceAssembly)); #endif } } catch (Exception ex) { throw new Exception(string.Format("The Assembly '{0}' cannot be loaded.", resourceAssembly), ex); } // get all available resourcenames availableResources = assembly.GetManifestResourceNames(); // The proposed approach of Andras (http://wpflocalizeextension.codeplex.com/discussions/66098?ProjectName=wpflocalizeextension) var possiblePrefixes = new List <string>(assembly.GetTypes().Select((t) => t.Namespace).Distinct()); for (int i = 0; i < availableResources.Length; i++) { if (availableResources[i].EndsWith(resManagerNameToSearch)) { var matches = possiblePrefixes.Where((p) => availableResources[i].StartsWith(p + ".")); if (matches.Count() != 0) { // take the first occurrence and break foundResource = availableResources[i]; break; } } } // if no one was found, exception if (foundResource == null) { throw new ArgumentException( string.Format( "No resource manager for dictionary '{0}' in assembly '{1}' found! ({1}.{0})", resourceDictionary, resourceAssembly)); } // remove ".resources" from the end foundResource = foundResource.Substring(0, foundResource.Length - ResourceFileExtension.Length); //// Resources.{foundResource}.ResourceManager.GetObject() //// ^^ prop-info ^^ method get try { // get the propertyinfo from resManager over the type from foundResource var resourceManagerType = assembly.GetType(foundResource); // check if the resource manager was found. // if not, assume that the assembly was build with VisualBasic. // in this case try to manipulate the resource identifier. if (resourceManagerType == null) { #if SILVERLIGHT var assemblyName = resourceAssembly; #else var assemblyName = assembly.GetName().Name; #endif resourceManagerType = assembly.GetType(foundResource.Replace(assemblyName, assemblyName + ".My.Resources")); } propInfo = resourceManagerType.GetProperty(ResourceManagerName, ResourceBindingFlags); // get the GET-method from the methodinfo methodInfo = propInfo.GetGetMethod(true); // get the static ResourceManager property object resManObject = methodInfo.Invoke(null, null); // cast it to a ResourceManager for better working with resManager = (ResourceManager)resManObject; } catch (Exception ex) { // this error has to get thrown because this has to work throw new InvalidOperationException("Cannot resolve the ResourceManager!", ex); } // Add the ResourceManager to the cachelist Add(keyManKey, resManager); try { #if SILVERLIGHT var cultures = CultureInfoHelper.GetCultures(); foreach (var c in cultures) { var dir = c.Name + "/"; foreach (var p in Deployment.Current.Parts) { if (p.Source.StartsWith(dir)) { AddCulture(c); break; } } } #else var assemblyLocation = Path.GetDirectoryName(assembly.Location); // Get all directories named like a specific culture. var dirs = Directory.GetDirectories(assemblyLocation, "??-??").ToList(); // Get all directories named like a culture. dirs.AddRange(Directory.GetDirectories(assemblyLocation, "??")); // Get the list of all cultures. var cultures = CultureInfo.GetCultures(CultureTypes.AllCultures); foreach (var c in cultures) { var dir = Path.Combine(assemblyLocation, c.Name); if (Directory.Exists(dir) && Directory.GetFiles(dir, "*.resources.dll").Length > 0) { AddCulture(c); } } #endif } catch { // This may lead to problems with Silverlight } } // return the found ResourceManager return(resManager); }
/// <summary> /// Looks up in the cached <see cref="ResourceManager"/> list for the searched <see cref="ResourceManager"/>. /// </summary> /// <param name="resourceAssembly">The resource assembly.</param> /// <param name="resourceDictionary">The dictionary to look up.</param> /// <returns> /// The found <see cref="ResourceManager"/> /// </returns> /// <exception cref="System.InvalidOperationException"> /// If the ResourceManagers cannot be looked up /// </exception> /// <exception cref="System.ArgumentException"> /// If the searched <see cref="ResourceManager"/> wasn't found /// </exception> protected ResourceManager GetResourceManager(string resourceAssembly, string resourceDictionary) { PropertyInfo propInfo; MethodInfo methodInfo; Assembly assembly = null; ResourceManager resManager; string foundResource = null; string resManagerNameToSearch = "." + resourceDictionary + ResourceFileExtension; string[] availableResources; //var resManKey = designPath + resourceAssembly + resManagerNameToSearch; var resManKey = resourceAssembly + resManagerNameToSearch; #if !SILVERLIGHT if (AppDomain.CurrentDomain.FriendlyName.Contains("XDesProc")) { var assemblyDir = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "tmp"); foreach (var process in Process.GetProcesses()) { if (!process.ProcessName.Contains(".vshost")) { continue; } var dir = Path.GetDirectoryName(process.Modules[0].FileName); var files = Directory.GetFiles(dir, resourceAssembly + ".*", SearchOption.AllDirectories); var dirs = Directory.GetDirectories(dir); if (files.Length > 0) { files = Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories); bool updateManager = false; foreach (var f in files) { var dst = Path.Combine(assemblyDir, f.Replace(dir + "\\", "")); if (!File.Exists(dst) || (Directory.GetLastWriteTime(dst) < Directory.GetLastWriteTime(f))) { updateManager = true; break; } } if (updateManager) { TryRemove(resManKey); if (shadowCacheAppDomain != null) { AppDomain.Unload(shadowCacheAppDomain); shadowCacheAppDomain = null; GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); } foreach (var f in files) { var dst = Path.Combine(assemblyDir, f.Replace(dir + "\\", "")); var dstDir = Path.GetDirectoryName(dst); if (!Directory.Exists(dstDir)) { Directory.CreateDirectory(dstDir); } File.Copy(f, dst, true); } } var file = Path.Combine(assemblyDir, resourceAssembly + ".exe"); if (!File.Exists(file)) { file = Path.Combine(assemblyDir, resourceAssembly + ".dll"); } //if (shadowCacheAppDomain == null) //{ // shadowCacheAppDomain = AppDomain.CreateDomain("LocalizationDomain"); // AppDomain.CurrentDomain.AssemblyResolve += (s, e) => // { // return Assembly.LoadFrom(file); // }; //} //var name = new AssemblyName { CodeBase = file }; //assembly = shadowCacheAppDomain.Load(resourceAssembly); assembly = Assembly.LoadFrom(file); break; } break; } } #endif if (!TryGetValue(resManKey, out resManager)) { // If the assembly cannot be loaded, throw an exception if (assembly == null) { try { // go through every assembly loaded in the app domain var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies(); foreach (var assemblyInAppDomain in loadedAssemblies) { // check if the name pf the assembly is not null if (assemblyInAppDomain.FullName != null) { // get the assembly name object AssemblyName assemblyName = new AssemblyName(assemblyInAppDomain.FullName); // check if the name of the assembly is the seached one if (assemblyName.Name == resourceAssembly) { // assigne the assembly assembly = assemblyInAppDomain; // stop the search here break; } } } // check if the assembly is still null if (assembly == null) { // assign the loaded assembly #if SILVERLIGHT var name = new AssemblyName(resourceAssembly); assembly = Assembly.Load(name.FullName); #else assembly = Assembly.Load(new AssemblyName(resourceAssembly)); #endif } } catch (Exception ex) { throw new Exception(string.Format("The Assembly '{0}' cannot be loaded.", resourceAssembly), ex); } } // get all available resourcenames availableResources = assembly.GetManifestResourceNames(); // The proposed approach of Andras (http://wpflocalizeextension.codeplex.com/discussions/66098?ProjectName=wpflocalizeextension) var possiblePrefixes = new List <string>(assembly.GetTypes().Select((t) => t.Namespace).Distinct()); for (int i = 0; i < availableResources.Length; i++) { if (availableResources[i].EndsWith(resManagerNameToSearch)) { var matches = possiblePrefixes.Where((p) => availableResources[i].StartsWith(p + ".")); if (matches.Count() != 0) { // take the first occurrence and break foundResource = availableResources[i]; break; } } } // NOTE: Inverted this IF (nesting is bad, I know) so we just create a new ResourceManager. -gen3ric if (foundResource != null) { // remove ".resources" from the end foundResource = foundResource.Substring(0, foundResource.Length - ResourceFileExtension.Length); var dictTypeName = resourceDictionary.Replace('.', '_'); foreach (var type in assembly.GetTypes()) { if (type.Name == dictTypeName) { try { propInfo = type.GetProperty(ResourceManagerName, ResourceBindingFlags); // get the GET-method from the methodinfo methodInfo = propInfo.GetGetMethod(true); // cast it to a ResourceManager for better working with resManager = (ResourceManager)methodInfo.Invoke(null, null); break; } catch { } } } } else { resManager = new ResourceManager(resManagerNameToSearch, assembly); } // if no one was found, exception if (resManager == null) { throw new ArgumentException(string.Format("No resource manager for dictionary '{0}' in assembly '{1}' found! ({1}.{0})", resourceDictionary, resourceAssembly)); } // Add the ResourceManager to the cachelist Add(resManKey, resManager); try { #if SILVERLIGHT var cultures = CultureInfoHelper.GetCultures(); foreach (var c in cultures) { var dir = c.Name + "/"; foreach (var p in Deployment.Current.Parts) { if (p.Source.StartsWith(dir)) { AddCulture(c); break; } } } #else var assemblyLocation = Path.GetDirectoryName(assembly.Location); // Get the list of all cultures. var cultures = CultureInfo.GetCultures(CultureTypes.AllCultures); foreach (var c in cultures) { var dir = Path.Combine(assemblyLocation, c.Name); if (Directory.Exists(dir) && Directory.GetFiles(dir, "*.resources.dll").Length > 0) { AddCulture(c); } } #endif } catch { // This may lead to problems with Silverlight } } // return the found ResourceManager return(resManager); }
/// <summary> /// Looks up in the cached <see cref="ResourceManager"/> list for the searched <see cref="ResourceManager"/>. /// </summary> /// <param name="resourceAssembly">The resource assembly.</param> /// <param name="resourceDictionary">The dictionary to look up.</param> /// <returns> /// The found <see cref="ResourceManager"/> /// </returns> /// <exception cref="System.InvalidOperationException"> /// If the ResourceManagers cannot be looked up /// </exception> /// <exception cref="System.ArgumentException"> /// If the searched <see cref="ResourceManager"/> wasn't found /// </exception> protected ResourceManager GetResourceManager(string resourceAssembly, string resourceDictionary) { Assembly assembly = null; ResourceManager resManager; string foundResource = null; string resManagerNameToSearch = "." + resourceDictionary + ResourceFileExtension; var resManKey = resourceAssembly + resManagerNameToSearch; #if !SILVERLIGHT if (AppDomain.CurrentDomain.FriendlyName.Contains("XDesProc")) { var assemblyDir = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "tmp"); foreach (var process in Process.GetProcesses()) { if (!process.ProcessName.Contains(".vshost")) { continue; } var dir = Path.GetDirectoryName(GetExecutablePath(process.Id)); if (string.IsNullOrEmpty(dir)) { continue; } var files = Directory.GetFiles(dir, resourceAssembly + ".*", SearchOption.AllDirectories); if (files.Length > 0) { files = Directory.GetFiles(dir, "*.*", SearchOption.AllDirectories).Where(f => IsFileOfInterest(f, dir)).ToArray(); bool updateManager = false; foreach (var f in files) { var dst = Path.Combine(assemblyDir, f.Replace(dir + "\\", "")); if (!File.Exists(dst) || (Directory.GetLastWriteTime(dst) < Directory.GetLastWriteTime(f))) { updateManager = true; break; } } if (updateManager) { TryRemove(resManKey); if (shadowCacheAppDomain != null) { AppDomain.Unload(shadowCacheAppDomain); shadowCacheAppDomain = null; GC.Collect(); GC.WaitForPendingFinalizers(); GC.Collect(); } foreach (var f in files) { try { var dst = Path.Combine(assemblyDir, f.Replace(dir + "\\", "")); var dstDir = Path.GetDirectoryName(dst); if (String.IsNullOrEmpty(dstDir)) { continue; } if (!Directory.Exists(dstDir)) { Directory.CreateDirectory(dstDir); } File.Copy(f, dst, true); } // ReSharper disable once EmptyGeneralCatchClause catch { } } } var file = Path.Combine(assemblyDir, resourceAssembly + ".exe"); if (!File.Exists(file)) { file = Path.Combine(assemblyDir, resourceAssembly + ".dll"); } assembly = Assembly.LoadFrom(file); } break; } } #endif if (!TryGetValue(resManKey, out resManager)) { // If the assembly cannot be loaded, throw an exception if (assembly == null) { try { // go through every assembly loaded in the app domain var loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies(); foreach (var assemblyInAppDomain in loadedAssemblies) { // get the assembly name object AssemblyName assemblyName = new AssemblyName(assemblyInAppDomain.FullName); // check if the name of the assembly is the seached one if (assemblyName.Name == resourceAssembly) { // assigne the assembly assembly = assemblyInAppDomain; // stop the search here break; } } // check if the assembly is still null if (assembly == null) { // assign the loaded assembly #if SILVERLIGHT var name = new AssemblyName(resourceAssembly); assembly = Assembly.Load(name.FullName); #else assembly = Assembly.Load(new AssemblyName(resourceAssembly)); #endif } } catch (Exception ex) { throw new Exception(string.Format("The Assembly '{0}' cannot be loaded.", resourceAssembly), ex); } } // get all available resourcenames string[] availableResources = assembly.GetManifestResourceNames(); // get all available types (and ignore unloadable types, e.g. because of unsatisfied dependencies) IEnumerable <Type> availableTypes; try { availableTypes = assembly.GetTypes(); } catch (ReflectionTypeLoadException e) { availableTypes = e.Types.Where(t => t != null); } // The proposed approach of Andras (http://wpflocalizeextension.codeplex.com/discussions/66098?ProjectName=wpflocalizeextension) Func <Type, string> tryGetNamespace = delegate(Type type) { // Ignore unloadable types try { return(type.Namespace); } catch (Exception) { return(null); } }; var possiblePrefixes = availableTypes.Select(tryGetNamespace).Where(n => n != null).Distinct().ToList(); foreach (string availableResource in availableResources) { if (availableResource.EndsWith(resManagerNameToSearch) && possiblePrefixes.Any(p => availableResource.StartsWith(p + "."))) { // take the first occurrence and break foundResource = availableResource; break; } } // NOTE: Inverted this IF (nesting is bad, I know) so we just create a new ResourceManager. -gen3ric if (foundResource != null) { // remove ".resources" from the end foundResource = foundResource.Substring(0, foundResource.Length - ResourceFileExtension.Length); // First try the simple retrieval Type resourceManagerType; try { resourceManagerType = assembly.GetType(foundResource); } catch (Exception) { resourceManagerType = null; } // If simple doesn't work, check all of the types without using dot notation if (resourceManagerType == null) { var dictTypeName = resourceDictionary.Replace('.', '_'); Func <Type, bool> matchesDictTypeName = delegate(Type type) { // Ignore unloadable types try { return(type.Name == dictTypeName); } catch (Exception) { return(false); } }; resourceManagerType = availableTypes.FirstOrDefault(matchesDictTypeName); } resManager = GetResourceManagerFromType(resourceManagerType); } else { resManager = new ResourceManager(resManagerNameToSearch, assembly); } // if no one was found, exception if (resManager == null) { throw new ArgumentException(string.Format("No resource manager for dictionary '{0}' in assembly '{1}' found! ({1}.{0})", resourceDictionary, resourceAssembly)); } // Add the ResourceManager to the cachelist Add(resManKey, resManager); try { #if SILVERLIGHT var cultures = CultureInfoHelper.GetCultures(); foreach (var c in cultures) { var dir = c.Name + "/"; foreach (var p in Deployment.Current.Parts) { if (p.Source.StartsWith(dir)) { AddCulture(c); break; } } } #else var assemblyLocation = Path.GetDirectoryName(assembly.Location); // Get the list of all cultures. var cultures = CultureInfo.GetCultures(CultureTypes.AllCultures); foreach (var c in cultures) { var rs = resManager.GetResourceSet(c, true, false); if (rs != null) { AddCulture(c); } } #endif } catch { // This may lead to problems with Silverlight } } // return the found ResourceManager return(resManager); }