예제 프로그램 Spring.Example.AppContext는 ResourseSet에 포함된 재탐색 객체와 텍스트 로컬라이제이션에 대한 응용 프로그램 컨텍스트의 사용 그리고 객체에 삽입된 리소스 속성에 값을 넣는 것을 보여줍니다.


응용 프로그램 컨텍스트 구성 파일은 인터페이스 IMessageSource를 실행하는 Type Spring.Context.Support.ResourceSetMessageSourcename "messageSource"를 객체 정의로 포함합니다.

이 인터페이스는 텍스트와 이미지 같은 검색되어진 로컬라이즈 리소스에 대한 다양한 메서드를 제공합니다. IApplicationContext 인터페이스가 생성될 때 name 'messageSource'와 객체는 컨텍스트의 IMessageSource 기능에 대한 실행으로 검색에 사용되어 집니다.


ResourceSetMessageSource는 culture-specific 리소스의 컬렉션 정의를 위해 ResourceManager의 리스트를 취합니다.

ResourceManager는 두 가지 방법으로 구성할 수 있습니다. 첫번째 방법은 기본 리소스 이름과 어셈블리를 포함하는 두 개의 문자열을 지정하는 것입니다. 이 예제에서는 프로젝트에 있는 Images.resx가 그것 입니다. 두번째 방법으로는 리소스 기본 이름과 속성으로써 어셈블리 이름인 헬퍼 팩토리 클래스 ResourceManagerFactoryObject를 사용하는 것입니다. 지정된 ResourceManager의 두번째 방법은 여러분의 응용 프로그램의 다른 부분에 있는 ResourceManager에 직접 접근하기를 원할 때 사용하는 방법입니다.


예제 프로그램 있는 리소스 파일인 MyResource.resx와 스페인어로 지정된 리소스 파일인 MyResources.es.resx는 아래와 같은 방법으로 선언합니다.


<object name="messageSourcetype="Spring.Context.Support.ResourceSetMessageSource, Spring.Core">

    <property name="resourceManagers">

        <list>

            <value>Spring.Examples.AppContext.Images, Spring.Examples.AppContext</value>

            <ref object="myResourceManager"/>

        </list>

    </property>

</object>

<object name="myResourceManager" type="Spring.Objects.Factory.Config.ResourceManagerFactoryObject, Spring.Core">

    <property name="baseName">

        <value>Spring.Examples.AppContext.MyResource</value>

    </property>

    <property name="assemblyName">

        <value>Spring.Examples.AppContext</value>

</property>

</object> 


main 응용 프로그램은 응용 프로그램 컨텍스트와 key 이름으로 검색된 다양한 리소스들을 생성합니다. 코드에서 모든 key 이름은 클래스 안에서 static 필드로 선언됩니다. 리소스 파일 Images.resx는 key 이름이 bubblechamber(Keys.BUBBLECHAMBER로 잘 알려진) 로 이미지 데이터를 포함합니다.


다음의 코드 


Image image = (Image)ctx.GetResourceObject(Keys.BUBBLECHAMBER); 


는 컨텍스트에서 이미지를 찾기 위해 사용되어 집니다.


리소스 파일 MyResource.resx는 key 이름 HelloMessage (Keys.HELLO_MESSAGE로 잘 알려진)는 Hello {0} {1} 이라는 문자열을 포함하는데 이 문자열은 텍스트 포맷을 위해 사용되어 집니다.


이것을 사용하기 위한 예제 코드는 아래와 같습니다.


string msg = ctx.GetMessage(Keys.HELLO_MESSAGE,

                                          CultureInfo.CurrentCulture,

                                          "Mr.", "Anderson"); 


이 코드는 전달된 인수값을 이용하여 텍스트 문자열을 검색한 후 placeholder에 문자열을 교체하여 넣고 문자열을 완성하게 되는데 완성된 문자열은 "Hello Mr. Anderson" 이 됩니다. 현재 속한 문화권에 대한 리소스 파일은 MyResource.resx를 사용합니다. 하지만 만약에 스페인어권에 대한 문자열을 사용하고 싶다면 아래와 같은 코드를 사용하면 됩니다.


CultureInfo spanishCultureInfo = new CultureInfo("es");

 

string esMsg = ctx.GetMessage(Keys.HELLO_MESSAGE,

                                              spanishCultureInfo,

                                              "Mr.", "Anderson");


여기서 사용되는 리소스 파일 MyResource.es.resx는 표준 닷넷 로컬라이제이션 대신에 사용되게 됩니다.

스페인어 버전은 영어와 문자열 리소스가 달라야 합니다. 영어가 아니기 때문에 Hello {0}, {1} 이 아니라 "Hola {0}, {1}" 이 되어야 하고 이것의 문자열 결과값은 "Hola Mr. Anderson"이 되게 됩니다.


하지만 스페인어에서 "Mr."의 사용은 바뀌어야 합니다. 이렇게 문자열이 보인다는 것은 스페인 로컬라이제이션에서 이 문자열을 적절하게 바꿔주는 기능을 사용하지 않았기 때문입니다.

이것을 변경하기 위해서는 FemaleGreeting(Keys.FEMALE_GREETING으로 잘 알려진) 이라 불리는 키를 추상화 해야 합니다.

Hola {0}, {1}에 있는 메세지 인수 {0} 자리에 교체되어 삽입되는 값은 DefaultMessageResolvable 이라는 집합내에 매핑된 key에 의해 교체되어 집니다.


string[] codes = {Keys.FEMALE_GREETING};

DefaultMessageResolvable dmr = new DefaultMessageResolvable(codes, null);

msg = ctx.GetMessage(Keys.HELLO_MESSAGE,

                                  CultureInfo.CurrentCulture,

                                  dmr, "Anderson");


위의 코드는 MyResource.resx안에 있는 FemaleGreeting이라는 key에 의해 msg 변수에 문자열 "Hello Mrs. Anderson"을 할당합니다. 그리고 아래의 코드는 스페인어로 Mrs 라는 부분을 변환하여 할당하게 됩니다.


esMsg = ctx.GetMessage(Keys.HELLO_MESSAGE,

                                     spanishCultureInfo,

                                     dmr, "Anderson"); 


결과적으로 이 코드는 esMsg 변수에 "Hola Senora Anderson" 라는 문자열을 할당받게 되는 데 이것은 MyResource.es.resx 내에 있는 "Senora" 라는 key인 FemaleGreeting에 의한 값 입니다.


로컬라이제이션은 문자열에는 적용이 안되고 객체에만 적용이 됩니다.

닷넷 1.1 프레임워크는 ComponentResourceManager 유틸리티 클래스를 제공합니다. 그것은 효과적인 방법으로 객체 속성에 복수의 리소스 값을 적용시킬 수 있습니다. (VS.NET 2005는 윈폼 응용 프로그램에 이 클래스를 사용하여 코드를 추가시키게 되면 무겁게 됩니다.) 이 예제 프로그램은 Person이라는 간단한 클래스를 가집니다. 그것은 Integer 속성 Age와 문자열 속성 name을 가집니다. 리소스 파일 Person.resx는 person.<PropertyName> 이라는 패턴을 가지는 key 이름을 제공하는데 그것은 person.Name, person.Age와 같은 케이스로 작성할 수 있습니다. 객체에 이러한 리소스 값을 할당하는 코드는 다음과 같습니다.


Person p = new Person();

ctx.ApplyResource(p, "person", CultureInfo.CurrentUICulture); 


이들 객체에 속성을 설정하기 위해 Spring을 사용한다면 Spring은 계정 로컬라이제이션에는 이것을 사용할 수 없습니다.

왜냐하면 위의 코드에서 보는 것 처럼 Person 객체의 Culture를 인식하는 속성을 설정하기 때문입니다.







profile

소프트웨어라는 도구를 천문분야에 접목하는 것에 대해 관심을 가지고 있는 1인 입니다.

 

 

한국천문연구원(KASI) 한국형 외계지적생명체 탐색 기술자문 (2010)

Microsoft Visual C# MVP(2009-2010)

세티의 Lonely Star 블로그 운영


facebook: http://www.facebook.com/setipark