共享一下“资源文件做多语言版本”的类

类别:.NET开发 点击:0 评论:0 推荐:
看了 杨云 发的”利用资源文件做多语言版本软件之乐趣”感觉,方法并不是很方便,共享一下我的 资源文件 类
其实这个 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

 

本文地址:http://com.8s8s.com/it/it42716.htm