[원] ASP.NET MVC 3 Razor 다국어 참조 솔루션 보완

5733 단어 asp.net
그 당시 장골동품이 이성룡에게 마누라를 빌려주었는데 결국 다시 빌려주지 못했다고 한다.이 일은 두 가지 측면에서 모두 탓해야 한다. 장골동품은 동기가 불순하고 이성룡은 사람됨도 너그럽지 않지만, 일반적인 상황에서 남의 이익을 챙기는 것은 매우 중독적이다.
Reflector 아무도 모르지..NET가 여러 해 동안 사용한 사람은 더 이상 볼 필요가 없을 것이다.NET 소스 코드는 첫째, 이전에 보았고, 둘째, 많은 실현 방식과 운행 원리로 칠팔팔구 맞출 수 있지만, 초보자나 확인하고 싶은 데 자주 사용되지 않는 것이 있다.NET 유형의 소스 코드를 가진 사람에게 Reflector가 없으면 정말 괴롭다.그런데 엊그저께 갑자기 소식을 들었는데 리플렉터가 요금을 받았다!!!이렇게 쓰기 좋은 공구를 공짜로 쓰지 않다니???이것은 마치 장골동품이 이성룡에게 마누라를 빌려준 것처럼 이성룡에게 밤마다 생황을 울리며 유유자적하다. 어느 날 갑자기 장골동품이 마누라를 되찾으려고 한다. 이성룡은 쓸쓸하고 쓸쓸하다. 틀림없이 기분이 좋지 않을 것이다. 그러나 장골동품이 빌려준 것은 살아있는 물건이다. 무슨 까닭인지 이성룡을 따르고 장골동품에 돈을 다 날렸다.하지만 Reflector는 사물입니다. 아무리 소리를 질러도 주인의 명령을 따라야 합니다.또 멀어졌어..
본론으로 들어가기
4윗글 언급, System을 사용합니다.Resources.ResXResourceReader(System.Windows.Forms.dll) 유형이 자원 파일의 항목을 획득하는 방식으로 MVC에서의 Localization을 실현했다. 그러나 이 방안은 원형 또는 참고 방안일 뿐이다. 오늘 이 유형을 연구해 봤는데 다행히 동료의 수중에 승진하지 않은 Reflector가 있었다.(내가 부주의로 자동 업그레이드 버튼을 눌렀는데 이것은 권리 침해가 아니겠지.) ResX Resource Reader의 실현 원리를 열어봤는데 원래 이 유형은 XML을 해석하는 방식으로 자원 항목을 꺼내서 IDictionary Enumerator에 넣는 것이었다.
이렇게 하면 이 유형은 웹 프로그램에서 안전하게 사용할 수 있다는 것을 많이 알 수 있다.이 유형의 주요 비용은resx 파일을 읽고 해석하는 데 있습니다.평소에 습관적으로 나는 캐시를 사용하여 어떤 상황하에서의 성능 문제를 해결하는 것을 비교적 좋아한다. 이번에는 예외가 없다.NET4 중 1 시스템.Runtime.Caching.Memory Cache는 아직 사용한 적이 없어서 꺼내서 손을 익혔다.
piapia의, 위의 코드를 다음과 같이 수정합니다.
    public static class LocalizationHelpers

    {

        public static string Lang(this HtmlHelper htmlhelper, string key)

        {

            var viewPath = (htmlhelper.ViewContext.View as BuildManagerCompiledView).ViewPath;

            var viewName = viewPath.Substring(viewPath.LastIndexOf('/'), viewPath.Length - viewPath.LastIndexOf('/')).TrimStart('/');

            var filePath = htmlhelper.ViewContext.HttpContext.Server.MapPath(viewPath.Substring(0, viewPath.LastIndexOf('/') + 1)) + "App_LocalResources";

            var langs = htmlhelper.ViewContext.HttpContext.Request.UserLanguages;



            string resxPath = string.Format(@"{0}\{1}.resx", filePath, viewName);



            foreach (var lang in langs)

            {

                if (File.Exists(string.Format(@"{0}\{1}.{2}.resx", filePath, viewName, lang)))

                {

                    resxPath = string.Format(@"{0}\{1}.{2}.resx", filePath, viewName, lang);

                    break;

                }

            }



            var result = ResXCache.GetResValue(resxPath, key);



            return result;

        }



        public static class ResXCache

        {

            public static string GetResValue(string file, string key)

            {

                ObjectCache cache = MemoryCache.Default;



                IEnumerable<DictionaryEntry> resxs = null;



                if (cache.Contains(file) == false)

                {

                    resxs = new ResXResourceReader(file).Cast<DictionaryEntry>();

                    cache.Add(file, resxs, new CacheItemPolicy() { Priority = CacheItemPriority.NotRemovable });

                }

                else

                {

                    resxs = cache.GetCacheItem(file).Value as IEnumerable<DictionaryEntry>;

                }



                return (string)resxs.FirstOrDefault<DictionaryEntry>(x => x.Key.ToString() == key).Value;

            }

        }

    }


OK, 기본적으로 이 방안은 프로젝트에 쓸 수 있을 것 같아.
3월 19일 콘텐츠를 업데이트하고 Lang 방법을 재작성하여 자원 파일의 존재 여부를 검증하는 절차를 줄였습니다 --------------------------------------------------------------------------
    public static class LocalizationHelper

    {

        public static string Lang(this HtmlHelper htmlhelper, string key)

        {

            var viewPath = (htmlhelper.ViewContext.View as BuildManagerCompiledView).ViewPath;

            var viewName = viewPath.Substring(viewPath.LastIndexOf('/'), viewPath.Length - viewPath.LastIndexOf('/')).TrimStart('/');

            var filePath = htmlhelper.ViewContext.HttpContext.Server.MapPath(viewPath.Substring(0, viewPath.LastIndexOf('/') + 1)) + "App_LocalResources";

            var langs = htmlhelper.ViewContext.HttpContext.Request.UserLanguages.Union<string>(new string[] { "" });



            IEnumerable<DictionaryEntry> resxs = null;



            foreach (var lang in langs)

            {

                var resxKey =

                    string.IsNullOrWhiteSpace(lang) ? string.Format(@"{0}\{1}.resx", filePath, viewName) : string.Format(@"{0}\{1}.{2}.resx", filePath, viewName, lang);



                resxs = GetResx(resxKey);



                if (resxs != null) { break; }

            }



            return (string)resxs.FirstOrDefault<DictionaryEntry>(x => x.Key.ToString() == key).Value;

        }



        private static IEnumerable<DictionaryEntry> GetResx(string resxKey)

        {

            ObjectCache cache = MemoryCache.Default;



            IEnumerable<DictionaryEntry> resxs = null;



            if (cache.Contains(resxKey))

            {

                resxs = cache.GetCacheItem(resxKey).Value as IEnumerable<DictionaryEntry>;

            }

            else

            {

                if (File.Exists(resxKey))

                {

                    resxs = new ResXResourceReader(resxKey).Cast<DictionaryEntry>();

                    cache.Add(resxKey, resxs, new CacheItemPolicy() { Priority = CacheItemPriority.NotRemovable });

                }

            }



            return resxs;

        }

    }

좋은 웹페이지 즐겨찾기