ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • WPF 응용프로그램 지역화하기
    dev/WPF 2010. 10. 14. 14:28

    0. 준비
    Locbaml.exe

     

    1. 지역화 할 어플리케이션 작성

     

    2. 응용 프로그램의 기본 컬쳐 설정

    csproj 파일을 열어 PropertyGroup 엘리먼트의 자식으로 UICulture 를 추가하여 기본 컬쳐를 명시합니다.

     

    3. 응용 프로그램에서 지역화 되어야 하는 요소 플래그를 설정

    지역화가 되어야 하는 요소들에 Uid 라는 특별한 어트리뷰트를 추가합니다.
    <Button x:Uid="Btn1" ...
    과 같은 문법으로 XAML 문서 내에서의 식별자 역할을 합니다.

    하지만 모든 요소를 일일이 수작업으로 하기엔 양이 많을 수 있으므로 다음 그림과 같이 msbuild 를 이용해서 자동화 할 수 있습니다.

    Visual Studio 의 명령 프롬프트를 열어 msbuild /t:target [프로젝트 파일 경로] 를 입력하면 됩니다.

    msbuild 를 이용한 결과를 보면 모든 요소에 x:Uid 가 붙은것을 볼 수 있습니다.

     

    4. 지역화 가능한 콘텐츠 추출

    앞에서 en-US 로 프로젝트 설정을 한 후 빌드를 하게되면 다음 그림과 같이 프로젝트 출력폴더에 en-US 폴더가 생기고 프로젝트명.resources.dll 의 위성 어셈블리가 생성됩니다. 이 파일이 OS 설정이 en-US 일때 사용되는 지역화 리소스파일입니다.

    이 위성 어셈블리를 바탕으로 다른 언어에서 사용될 어셈블리를 위한 컨텐츠를 추출하면 됩니다. 이때 locbaml.exe 를 사용합니다.

    locbaml.exe 파일을 프로젝트 출력 폴더에 복사한후 커맨드 창에서 locbaml.exe /parse [위성어셈블리경로] 를 입력하면 프로젝트명.resources.csv 파일이 생성됩니다.

    생성된 cvs 파일을 보면 다음 그림과 같은 내용이 포함되어있는데 컬럼별 의미는 MSDN 문서를 참고하세요.

    이제 이 파일을 가지고 번역될 내용을 입력한 후 적당한 이름으로 저장합니다.

    위와 같이 엑셀을 이용하면 수정이 편리합니다. 주의할 점은 엑셀로 저장시 ansi 형태로 저장이 되는데 한글의 경우 UTF8로 다시 변경하여 저장을 해줘야 글자가 깨지지 않고 나옵니다.

     

    5. 위성 어셈블리 만들기

    이제 마지막으로 번역된 csv 파일과 기본 언어의 위성어셈블리를 가지고 번역된 언어의 위성 어셈블리를 만들면 됩니다. 마찬가지로 locbaml.exe 를 이용합니다.

    locbaml.exe /generate [기본 언어 위성어셈블리 경로] /trans:[번역된 csv 경로] /cul:[생성될 언어-지역] /out:[생성 폴더] 의 명령을 실행해주면 /out 인자로 입력한 폴더에 번역된 위성 어셈블리가 생성됩니다. 주의할 사항은 /out 인자에 넣어줄 경로는 미리 생성을 해야합니다. 안그러면 에러가 나네요.


     

    6. 테스트

    생성된 위성 어셈블리를 테스트 하려면 OS 의 컬처를 변경해야한다. 하지만 이보다 더 쉽게 테스트해 보려면, 현재 쓰레드의 컬쳐를 변경하느 코드를 사용하면 된다. 이 작업은 윈도우를 생성하거나 또는 윈도우를 나타내기 전에 수행해야 하므로 응용 프로그램 이벤트를 사용하거나 응용 프로그램 클래스의 생성자를 사용하는 것이 효과적이다.

    최종 결과를 확인하면 다음과 같이 en-US 와 ko-KR 의 컬처에 따라 화면의 텍스트가 다르게 나옴을 확인할 수 있다.

    추가로 CLR 이 위성 어셈블리를 프로빙(probing) 하기 시작할 때는 다음의 선행 규칙들을 따른다.
    - 우선 CLR 은 이용 가능한 가장 상세한 디렉토리를 검사한다. fr-FR 같은 현재 언어와 지역을 목표로 하는 위성 어셈블리를 찾아본다는 것을 의미한다.
    - 위의 단계에서 디렉토리를 찾을 수 없다면, CLR 은 fr 같은 현재 언어를 목표로 하는 위성 어셈블리를 찾는다.
    - 위의 단계에서 디렉토리를 찾을 수 없다면, IOException 예외를 던진다.

    추가로 고려해야 할 사항은 모든 지역화 가능한 콘텐츠가 사용자 인터페이스에 나타나는 지역화 가능한 프로퍼티로 정의된 것은 아니다. 예를 들어, 어떤 일이 발생할 때 에러 메시지를 보여줘야 할 필요가 있다 .이 상황을 XAML 로 다루는 최선의 방법은 개체 리소스(object resource)를 사용하는 것이다. 예를 들어 에러 미시지 문자열을 특정 윈도우에 리소스로 저장하거나, 아니면 응용 프로그램 전체의 리소스 또는 여러 개의 응용 프로그램에 걸쳐 공유되는 리소스 사전으로 저장할 수 있다.

    위 예제에 사용된 풀소스

    참고자료
    WPF in C# 2008, 11장. 리소스
    http://msdn.microsoft.com/ko-kr/library/ms788718.aspx

Designed by Tistory.