WPF 에서 초간단 런타임 다중 언어 지원
제가 다니는 직장에서 최근에 시작한 프로젝트는 WPF (윈도즈 앱의 GUI 를 만드는 기술중 하나) 기반입니다. 제 매니저는 50대중반으로 당연히 WinForm 에 익숙하고, 올해 딱 50인 저의 직속 시니어는 WPF에 익숙하고, 전 그냥 다 해봐서 새 프로젝트이니 UWP (저도 이건 그냥 Hello World 찍는 수준입니다만, 다른 OS 에서도 쉽게 잘 되는 이유로...) 로 합시다! 했다가 윈도7 지원 문제로 까이고, 결국 WPF 로 시작되었습니다. 대충 골격은 저희 회사의 주력인 Windows CE 기반의 통신기기 (PBX에 가깝죠) 를 PC 윈도즈에서 모니터링하는 거고, 제가 담당한 부분은 오로지 GUI입니다. ㅋㅋㅋ 캐나다 제품들의 특징 중에 하나가 공용언어인 불어가 들어가는 경우가 많고, 미국 시장에도 진출한 제품들은 멕시코 이민자들이 너무 많은 관계로 스페인어를 지원합니다. 그러니 당연히 제가 담당한 부분도 그게 되야 하는거죠. 헐~
저도 WPF 로 Localization 은 처음 해보는거라, 구글님과 스텍오버플로님에게 열심히 매달리고 있는데... 기본적으로 WPF 의 컴파일 타임 다중 언어 지원은 M$ 의 문서가 잘되어 있습니다만, 런타임간에 언어 전환은 네트에서 수많은 해결책들을 찾아 볼 수 있습니다.
저도 WPF 로 Localization 은 처음 해보는거라, 구글님과 스텍오버플로님에게 열심히 매달리고 있는데... 기본적으로 WPF 의 컴파일 타임 다중 언어 지원은 M$ 의 문서가 잘되어 있습니다만, 런타임간에 언어 전환은 네트에서 수많은 해결책들을 찾아 볼 수 있습니다.
- WPF Localization – On-the-fly Language Selection
- WPF Localization Using RESX Files
- WPF Runtime Localization
- WPF Localization Extension
- Localizing WPF Applications using Locbaml
- Simple WPF Localization
대충 이 정도가 있는데요. 더 찾아보면 더 있을 것 같습니다. 저 리스트 중에 제일 단순한 방법은 마지막 6번에 있는 방법이에요. Resource.resx 를 여러 언어 버전을 만들어주고 - 예를 들면, 불어는 Resource.fr.resx - 런타임에서 언어를 변경하면 모든 컨트럴에 언어가 바뀌게 됩니다. 이것도 디자인타임에서 변경내용을 실시간으로 보여주기 위해 몇가지 기교를 넣어서 제가 보기엔 그것도 귀찮아 보이더군요. ㅋㅋㅋ 그래서 더 단순한 'Localization of a WPF app - the simple approach' 에서의 방법으로 구현했습니다. 근데 이 문서는 구현한 방법에 대한 설명과 클래스 코드만 있고 데모 코드가 없어서 기존에 XAML-WPF 문법에 익숙하지 않으면 시작도 못해 볼 정도라 스프린트 데모때 설명을 위해 데모 코드를 만들어 봤습니다. 데모 코드는 https://github.com/hotdeveloper/TestLocWpf 에서 받으실 수 있습니다. 내용을 간단히 설명드리면,
소스 코드가 워낙 짧아서 잠시 둘러보시면 금방 이해할 겁니다. 피드백, 문의는 댓글로 주셔요.
Now, let's write funny codes.
솔루션 탐색기에서 프로퍼티를 열어보면 각 언어별 리소스가 있어요.
영어 리소스 파일 내용. 딕셔너리라고 보시면 됩니다.
불어 리소스 파일 내용
MainWindow.xmal 에 리소스 파일의 Name 필드를 적용하는 부분이죠.
버튼을 눌렀을 때, CultureInfo 클래스에 언어 코드를 넣은 오브젝트를 TranslationSource 클래스의 CurrentCulture 에 넣으면 GUI 가 그 언어로 바로 변경됩니다. Null 을 넣으면 시스템 기본 언어로 돌아오죠.
시스템 기본 언어가 적용된 상태죠.
Change 버튼을 누르면 불어가 적용됩니다.
소스 코드가 워낙 짧아서 잠시 둘러보시면 금방 이해할 겁니다. 피드백, 문의는 댓글로 주셔요.
Now, let's write funny codes.
댓글
댓글 쓰기