/// <summary> /// Gets all cultures found in the directory. The search is done by: /// 1) Enumerate all folders named with valid culture names /// 2) Check that the folder contains resource files /// The result is not cached. /// </summary> /// <param name="executingDirectory">The directory to check.</param> /// <returns>The cultures found. If none an empty list is returned.</returns> internal static IReadOnlyList <CultureInfo> GetAllCultures(DirectoryInfo executingDirectory) { if (!executingDirectory.Exists) { return(EmptyCultures); } HashSet <CultureInfo> cultures = null; foreach (var directory in executingDirectory.EnumerateDirectories("*", SearchOption.TopDirectoryOnly)) { if (Culture.TryGet(directory.Name, out var culture)) { if (directory.EnumerateFiles("*.resources.dll", SearchOption.TopDirectoryOnly).Any()) { if (cultures == null) { cultures = new HashSet <CultureInfo>(CultureInfoComparer.ByName); } cultures.Add(culture); } } } var entryAssembly = Assembly.GetEntryAssembly(); if (entryAssembly != null) { var neutralLanguageAttribute = entryAssembly.GetCustomAttribute <NeutralResourcesLanguageAttribute>(); if (Culture.TryGet(neutralLanguageAttribute?.CultureName, out var neutralCulture)) { if (cultures == null) { cultures = new HashSet <CultureInfo>(CultureInfoComparer.ByName); } cultures.Add(neutralCulture); } var pattern = $"{entryAssembly.GetName().Name}\\.(?<culture>[A-Za-z]{{1,8}}(-[A-Za-z0-9]{{1,8}})*)\\.resources\\.dll"; foreach (var name in entryAssembly.GetManifestResourceNames()) { var match = Regex.Match(name, pattern, RegexOptions.IgnoreCase); if (match.Success && Culture.TryGet(match.Groups["culture"].Value, out var culture)) { if (cultures == null) { cultures = new HashSet <CultureInfo>(CultureInfoComparer.ByName); } cultures.Add(culture); } } } return(cultures?.OrderBy(x => x.Name).ToArray() ?? EmptyCultures); }
/// <summary> /// Gets all cultures found in the directory. The search is donde by: /// 1) Enumerate all folders named with valid culture names /// 2) Check that the folder contains resource files /// The result is not cached /// </summary> /// <param name="executingDirectory">The directory to check</param> /// <returns>The cultures found. If none an empty list is returned.</returns> internal static IReadOnlyList <CultureInfo> GetAllCultures(DirectoryInfo executingDirectory) { if (!executingDirectory.Exists) { return(EmptyCultures); } HashSet <CultureInfo> cultures = null; foreach (var directory in executingDirectory.EnumerateDirectories("*", SearchOption.TopDirectoryOnly)) { var cultureName = directory.Name; if (!Culture.Exists(directory.Name)) { continue; } if (directory.EnumerateFiles("*.resources.dll", SearchOption.TopDirectoryOnly).Any()) { if (Culture.TryGet(cultureName, out var culture)) { if (cultures == null) { cultures = new HashSet <CultureInfo>(CultureInfoComparer.ByName); } cultures.Add(culture); } } } var entryAssembly = Assembly.GetEntryAssembly(); if (entryAssembly != null) { var neutralLanguageAttribute = (NeutralResourcesLanguageAttribute)Attribute.GetCustomAttribute(entryAssembly, typeof(NeutralResourcesLanguageAttribute)); var name = neutralLanguageAttribute?.CultureName; if (name != null && Culture.TryGet(name, out var neutralCulture)) { if (cultures == null) { cultures = new HashSet <CultureInfo>(CultureInfoComparer.ByName); } cultures.Add(neutralCulture); } } return(cultures?.OrderBy(x => x.Name).ToArray() ?? EmptyCultures); }