看了 杨云 发的”利用资源文件做多语言版本软件之乐趣”感觉,方法并不是很方便,共享一下我的 资源文件 类
其实这个 class 在 HtmlEditor3.1 中就曾经使用过
sealed class Manager#region sealed class Manager /**//// <summary> /// 实现对资源文件(resx)的管理 /// <seealso cref="ResourceManager"/> /// </summary> /// <remarks> /// 暂时用于获取全球化的语言信息资源<br/> /// Create By lion <br/> /// 2004-08-11 11:56 <br/> /// Support .Net Framework v1.1.4322 <br/> /// 调用时只要传递 Thread.CurentThread.CurentUICulutre 给那个类就可<br/> /// </remarks> /// <permission cref="System.Security.PermissionSet">public sealed</permission> public sealed class Manager { /**//// <summary> /// 资源文件列表 /// </summary> /// <permission cref="System.Security.PermissionSet">private</permission> private static Hashtable _resources; /**//// <summary> /// Manager 构造函数 /// </summary> /// <permission cref="System.Security.PermissionSet">public</permission> public Manager(){} Function Custom#region Function Custom /**//// <summary> /// 确定区域性特定资源的访问 /// </summary> /// <param name="resxName"> 资源名称</param> /// <permission cref="System.Security.PermissionSet">internal</permission> /// <example> /// <code> /// EnsureResources(resxName); /// </code> /// </example> internal static void EnsureResources(string resxName) { if(_resources == null) { _resources = new Hashtable(); } try { if(!_resources.ContainsKey(resxName)) { _resources.Add(resxName, new ResourceManager("CSDN.AssemblyResourceManager." + resxName, typeof(CSDN.AssemblyResourceManager.Manager).Assembly)); } } catch{} } /**//// <summary> /// 返回指定的 <see cref="Object"/> 资源的值 /// </summary> /// <seealso cref="GetString"/> /// <param name="resxName"> 资源名称</param> /// <param name="name"> 要获取的资源名</param> /// <returns> 针对调用方的当前区域性设置而本地化的资源的值。如果不可能有匹配项,则返回空引用(Visual Basic 中为 Nothing)。资源值可以为空引用 (Nothing)。</returns> /// <permission cref="System.Security.PermissionSet"> public</permission> /// <exception cref="ArgumentNullException"> name 参数为空引用(Visual Basic 中为 Nothing)。</exception> /// <exception cref="MissingManifestResourceException"> 未找到可用的资源集,并且没有非特定区域性的资源。</exception> /// <example> /// 下面的代码演示如何调用 <see cref="GetObject"/> /// <code> /// string str = GetObject(resxName, name); /// </code> /// </example> public static object GetObject(string resxName, string name) { return GetObject(resxName, name, null); } /**//// <summary> /// 返回指定的 <see cref="Object"/> 资源的值 /// </summary> /// <seealso cref="GetString"/> /// <param name="resxName"> 资源名称</param> /// <param name="name"> 要获取的资源名</param> /// <param name="culture"> <see cref="System.Globalization.CultureInfo"/> 对象,它表示资源被本地化为的区域性。注意,如果尚未为该区域性本地化此资源,则查找将使用区域性的 Parent 属性回退,并在签入非特定语言区域性后停止。 如果该值为空引用(Visual Basic 中为 Nothing),则使用区域性的 CurrentUICulture 属性获取 CultureInfo</param> /// <returns> 为指定区域性本地化的资源的值。如果不可能有“最佳匹配”,则返回空引用(Visual Basic 中为 Nothing)。</returns> /// <permission cref="System.Security.PermissionSet">public</permission> /// <exception cref="ArgumentNullException"> name 参数为空引用(Visual Basic 中为 Nothing)。</exception> /// <exception cref="MissingManifestResourceException"> 未找到可用的资源集,并且没有非特定区域性的资源。</exception> /// <example> /// 下面的代码演示如何调用 <see cref="GetObject"/> /// <code> /// object o = GetObject(resxName, name, culture); /// </code> /// </example> public static object GetObject(string resxName, string name, CultureInfo culture) { EnsureResources(resxName); ResourceManager res = _resources[resxName] as ResourceManager; if(res !=null) return res.GetObject(name, culture); return null; } /**//// <summary> /// 返回指定的 <see cref="String"/> 资源的值 /// </summary> /// <seealso cref="GetObject"/> /// <param name="resxName"> 资源名称</param> /// <param name="name"> 要获取的资源名。</param> /// <returns> 针对调用方的当前区域性设置而本地化的资源的值。如果不可能有匹配项,则返回空引用(Visual Basic 中为 Nothing)。</returns> /// <permission cref="System.Security.PermissionSet">public</permission> /// <exception cref="ArgumentNullException"> name 参数为空引用(Visual Basic 中为 Nothing)。</exception> /// <exception cref="MissingManifestResourceException"> 未找到可用的资源集,并且没有非特定区域性的资源。</exception> /// <exception cref="InvalidOperationException"> 指定资源的值不是字符串。</exception> /// <example> /// 下面的代码演示如何调用 <see cref="GetString"/> /// <code> /// string str = GetString(resxName, name); /// </code> /// </example> public static string GetString(string resxName, string name) { return GetString(resxName, name, null); } /**//// <summary> /// 返回指定的 <see cref="String"/> 资源的值 /// </summary> /// <seealso cref="GetObject"/> /// <param name="resxName"> 资源名称</param> /// <param name="name"> 要获取的资源名。</param> /// <param name="culture"> <see cref="CultureInfo"/> 对象,它表示资源被本地化为的区域性。注意,如果尚未为该区域性本地化此资源,则查找将使用区域性的 Parent 属性回退,并在签入非特定语言区域性后停止。 如果该值为空引用(Visual Basic 中为 Nothing),则使用区域性的 CurrentUICulture 属性获取 CultureInfo</param> /// <returns>为指定区域性本地化的资源的值。如果不可能有最佳匹配,则返回空引用(Visual Basic 中为 Nothing)。</returns> /// <permission cref="System.Security.PermissionSet">public</permission> /// <exception cref="ArgumentNullException"> name 参数为空引用(Visual Basic 中为 Nothing)。</exception> /// <exception cref="MissingManifestResourceException"> 未找到可用的资源集,并且没有非特定区域性的资源。</exception> /// <exception cref="InvalidOperationException"> 指定资源的值不是字符串。</exception> /// <example> /// 下面的代码演示如何调用 <see cref="GetString"/> /// <code> /// string str = GetString(resxName, name, culture); /// </code> /// </example> public static string GetString(string resxName, string name, CultureInfo culture) { EnsureResources(resxName); ResourceManager res = _resources[resxName] as ResourceManager; if(res!=null) return res.GetString(name, culture); return string.Empty; } /**//// <summary> /// 通知 ResourceManager 对所有 ResourceSet 对象调用 Close,并释放所有资源 /// </summary> /// <remarks> 此方法将缩小正在运行的应用程序中的工作集。以后在此 <see cref="ResourceManager"/> 上的任何资源查找都和第一次查找一样花费时间,因为它需要再次搜索和加载资源。<br/> /// 这在某些复杂线程处理方案中可能有用;在这种情况下创建新的 ResourceManager 不失为明智之举。<br/> /// 此方法还可用于以下情况:由当前的 ResourceManager 打开的 .resources 文件必须被明确释放,而无需等到 ResourceManager 完全超出范围并对它进行垃圾回收。 ///</remarks> ///<permission cref="System.Security.PermissionSet">public</permission> public static void ReleaseAllResources() { if(_resources!=null) { //找到所有存在的 Resources 调用Close,并释放所有资源 for(int i=0;i< _resources.Count;i++) { ResourceManager rm = (ResourceManager)_resources[i]; rm.ReleaseAllResources(); } } } #endregion } #endregion