从
this question开始一级,可以存储所有(并循环)可用资源和相关文化的方式,以允许用户选择特定文化?
进一步说明:
假设有三个资源文件:
> GUILanguage.resx
> GUILanguage.fr.resx
> GUILanguage.it.resx
我可以在每个名为LanguageName的字符串中有一个字符串.我如何能够以编程方式循环遍历不同的LanguageName值以列出它们(例如列表框)?
编辑:WinForms项目,嵌入式资源.
解决方法
这是我认为适用于Winforms的解决方案:
// get cultures for a specific resource info public static IEnumerable<CultureInfo> EnumSatelliteLanguages(string baseName) { if (baseName == null) throw new ArgumentNullException("baseName"); ResourceManager manager = new ResourceManager(baseName,Assembly.GetExecutingAssembly()); ResourceSet set = manager.GetResourceSet(CultureInfo.InvariantCulture,true,false); if (set != null) yield return CultureInfo.InvariantCulture; foreach (CultureInfo culture in EnumSatelliteLanguages()) { set = manager.GetResourceSet(culture,false); if (set != null) yield return culture; } } // determine what assemblies are available public static IEnumerable<CultureInfo> EnumSatelliteLanguages() { foreach (string directory in Directory.GetDirectories(AppDomain.CurrentDomain.BaseDirectory)) { string name = Path.GetFileNameWithoutExtension(directory); // resource dir don't have an extension... // format is XX or XX-something,we discard directories that can't match. // could/should be replaced by a regex but we still need to catch cultures errors... if (name.Length < 2) continue; if (name.Length > 2 && name[2] != '-') continue; CultureInfo culture = null; try { culture = CultureInfo.GetCultureInfo(name); } catch { // not a good directory... continue; } string resName = Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().Location) + ".resources.dll"; if (File.Exists(Path.Combine(Path.Combine(AppDomain.CurrentDomain.BaseDirectory,name),resName))) yield return culture; } }
以下是如何将它用于WindowsFormsApplication1:
List<CultureInfo> cultures = new List<CultureInfo>(EnumSatelliteLanguages("WindowsFormsApplication1.GUILanguage"));
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。