NGMsoftware

NGMsoftware
로그인 회원가입
  • 매뉴얼
  • 학습
  • 매뉴얼

    학습


    C# C# .NET Core 매크로 프로그램 만들기. (이미지 및 다국어 리소스 모듈 추가)

    페이지 정보

    본문

    안녕하세요. 엔지엠소프트웨어입니다. 이전 시간에 .NET Core 프레임워크를 이용해서 윈도우 폼 GUI를 만들었습니다. 오늘은 다국어를 처리할 수 있는 리소스 매니저 모듈을 만들거예요. 윈도우 응용 프로그램이나 웹 응용프로그램이 유사한 방식을 사용합니다. 다만, 구현하는 방법이 약간(?) 다릅니다. 다국어를 지원하는 응용프로그램을 만드는건 많은 노력과 시간이 필요합니다. 물론, 프로그램의 규모가 클수록 비례하는 부분이죠^^

     

    비주얼 스튜디오에서 프로젝트를 열고, 새로운 프로젝트를 추가하세요. 프로젝트명은 Fw.Client.ResourceManager입니다. 기존에 만들었던 NGM 6 매크로 프로그램은 솔루션 전체에 하나의 리소스만 사용했습니다. 방대한 내용 때문인지 점점 느려지는 느낌을 받아서, 이번에는 클라이언트와 시스템으로 나눠서 만들 예정입니다. 다음에 매크로 엔진을 만들 때 시스템용 리소스 매니저를 하나 더 추가할께요.

    8Z9Xl0m.jpg

     

     

    리소스 매니저의 구조는 아래와 같습니다. 기존에 NGM 6에는 더 많은 클래스가 있었는데요. 라이브러리의 용도와 달라서 리소스 관련된 것들만 제외하고 모두 삭제 했습니다. Caption, Description, Image 폴더를 각각 만들고, 맵핑용 클래스도 추가해줍니다. 그리고, 전체적으로 리소스를 관리할 매니저도 추가하세요.

    njYRilh.jpg

     

     

    매니저는 리소스로부터 인스턴스화 하는 기능을 담당합니다.

        public class Manager
        {
            private static System.Resources.ResourceManager _resxCaption = new System.Resources.ResourceManager("GlobalResource.Caption.Globalization", typeof(Manager).Assembly);
            private static System.Resources.ResourceManager _resxDescription = new System.Resources.ResourceManager("GlobalResource.Description.Globalization", typeof(Manager).Assembly);
            private static System.Resources.ResourceManager _resxImage = new System.Resources.ResourceManager("GlobalResource.Image.Globalization", typeof(Manager).Assembly);
    
            public static System.Resources.ResourceManager Caption { get { return _resxCaption; } }
    
            public static System.Resources.ResourceManager Description { get { return _resxDescription; } }
    
            public static System.Resources.ResourceManager Image { get { return _resxImage; } }
        }

     

    각각의 리소스들은 싱글톤(Singletone) 디자인이 적용되어 있습니다. 한번 생성된 인스턴스가 다시 생성되지 않도록 하기 위함입니다. 싱글톤을 적용할 때 몇가지 주의할점이 있습니다. 멀티 스레딩 환경에서 동시에 접근하는 경우인데요. 이런 경우를 대비하기 위해서 추가적인 설정이 필요하지만, 우리는 에디터 또는 플레이어가 실행될 때 한번 초기화하면 되기 때문에 스레딩까지 신경쓰지 않아도 됩니다.

        /// <summary>
        /// 제목을 표시하는 모든 리소스를 관리하는 매니저입니다.
        /// </summary>
        public class CaptionResource
        {
            private static System.Resources.ResourceManager? _resxManager = null;
    
            /// <summary>
            /// 중앙에서 관리되는 리소스 매니저 인스턴스를 가져옵니다.
            /// </summary>
            public static System.Resources.ResourceManager Instance
            {
                get
                {
                    if (_resxManager == null)
                    {
                        _resxManager = new System.Resources.ResourceManager("Fw.Client.ResourceManager.Caption.Globalization", typeof(CaptionResource).Assembly);
                    }
                    return _resxManager;
                }
            }
        }

     

    위 내용을 참고해서 Image와 Description도 코딩해보세요. 이제 에디터 프로젝트에서 리소스 매니저를 참조 추가하세요.

    ncq9P6K.jpg

     

     

    MainView의 읽기 전용 속성을 3개 추가 해줍니다. 리소스들도 관리할 수 있는 클래스를 하나 만들고 싶지만... 많아봐야 5~6개정도 될거 같아서 이건 건너뛰도록 할께요.

        public partial class MainView : KryptonForm
        {
            public System.Resources.ResourceManager ResxDescription { get; }
    
            public System.Resources.ResourceManager ResxCaption { get; }
    
            public System.Resources.ResourceManager ResxImage { get; }

     

    .NET Framework에서는 속성에 ReadOnly 특성을 달아주거나 한정자를 추가하면 되는데요. .NET Core는 복잡도를 줄이기 위해 속성에 set을 사용하지 않으면 자동으로 읽기 전용으로 작동합니다. 참고로, ReadOnly와 Constant는 동작 방식이 다릅니다. 상수로 설정하면 속성을 초기화할 수 없기 때문에 읽기 전용으로 만들었습니다. 그리고, 접근 제한을 위해 생성자에서 1번만 초기화해야 합니다.

            public MainView()
            {
                InitializeComponent();
    
                this.ResxDescription = Fw.Client.ResourceManager.DescriptionResources.Instance;
                this.ResxCaption = Fw.Client.ResourceManager.CaptionResource.Instance;
                this.ResxImage = Fw.Client.ResourceManager.ImageResource.Instance;
            }

     

    위에서 깜밖하고 설명하지 않은 내용이 있었네요. 아래 그림과 같이 리소스 매니저의 각각의 폴더에 지원할 다국어만큼 리소스 파일을 추가해야 합니다. 아래 그림을 참고해서 네이밍룰을 지켜야 합니다. 저는 영어와 한국어 2개만 일단 추가 해두었습니다. 엔지엠 6에서는 중국어까지 포함되어 있는데요. 이번엔... 중국어는 빼야 할거 같습니다. 나중에 필요할 때 추가하면 되니까요^^

    neSuUR4.jpg

     

     

    이제 마지막까지 왔네요. 리소스를 사용하려면 아래와 같이 GetString 메소드로 리소스 키를 가져오면 내용이 자동으로 바인딩됩니다.

                DockManager.AttachDocks(kryptonDockingManager, new Model.Editor.PageModel[] 
                { 
                    new Model.Editor.PageModel 
                    {
                        Name = Ai.Dock.Tool,
                        View = new Docks.ToolDock(),
                        Text = this.ResxCaption.GetString(Ai.Dock.Tool),
                        Title = this.ResxCaption.GetString(Ai.Dock.Tool),
                        Description = this.ResxCaption.GetString($"{Ai.Dock.Tool}{Ai.Definition.Description}")
                    },
                    new Model.Editor.PageModel
                    {
                        Name = Ai.Dock.Function,
                        View = new Docks.FunctionDock(),
                        Text = this.ResxCaption.GetString(Ai.Dock.Function),
                        Title = this.ResxCaption.GetString(Ai.Dock.Function),
                        Description = this.ResxCaption.GetString($"{Ai.Dock.Function}{Ai.Definition.Description}")
                    }
                });

     

    핵심 코드는 아래 한줄입니다.

    Text = this.ResxCaption.GetString(Ai.Dock.Tool),

     

    캡션 리소스에는 아래와 같이 들어 있습니다.

    gx6ZMGH.jpg

     

     

    아직 다국어를 변경하고 적용하는 기능은 구현하지 않았습니다. 따라서, 한국어와 영어를 번갈아가면서 확인할수는 없는데요. 이 부분은 나중에 구현하기로 하고, 일단은 시스템 컬쳐를 따라가기 때문에 기본적으로 한국어가 적용되어야 합니다. 잘 되는지 확인 해볼까요?

    53qR403.jpg

     

     

    도구 상자와 함수 상자 그리고, 속성이 한글로 잘 표시되고 있네요. 영어로도 잘 나오는지 확인하기 위해 아래와 같이 컬쳐를 변경 해보세요.

            private void MainView_Load(object sender, EventArgs e)
            {
                System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("en-US");

     

    다시 실행해보면 영어로 잘 나옵니다.

    Tlaty4C.jpg

     

     

    다음 시간에는 리본 컨트롤에 다국어 설정을 추가하고, 정상적으로 동작하는지 테스트 해볼께요~

     

    개발자에게 후원하기

    MGtdv7r.png

     

    추천, 구독, 홍보 꼭~ 부탁드립니다.

    여러분의 후원이 빠른 귀농을 가능하게 해줍니다~ 답답한 도시를 벗어나 귀농하고 싶은 개발자~

    감사합니다~

    • 네이버 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 카카오스토리 공유하기
    추천0 비추천0

    댓글목록

    등록된 댓글이 없습니다.