[.NET 5] 리소스(Resource)파일을 이용한 다국어 처리
.NET에서 리소스(Resource)파일을 이용한 다국어 처리는 오래된 방식입니다.
간단하게 구현하는 방법을 알아봅시다.
1. 리소스(Resource) 파일 만들기
이 프로젝트에서는 'Resource' 폴더에 파일을 만듭니다.
프로젝트에 어느 위치에 있어도 참조하는 데 문제는 없습니다.
추가 > 새 항목 > 리소스 파일(Resources File)
을 추가합니다.
기본 언어는 언어-국가 코드가 없는 파일명으로 만들어야 합니다.
나머지 추가된 언어들은 언어-국가 코드를 넣어 만듭니다.
이 프로젝트에서는
- LangStr.resx
- LangStr.ko.resx
이렇게 생성했습니다.
2. 데이터 넣기
다국어로 사용할 언어 데이터를 넣어 줍니다.
'LangStr.resx'에는 기본언어인 영어를 넣어 줍니다.
'LangStr.ko.resx'에는 한국어를 넣어 줍니다.
만약 데이터를 넣고 다음과 같은 오류가 난다면 비주얼 스튜디오(Visual Studio)에 영어 언어팩을 설치해 봅니다.
사용자 지정 도구 ResXFileCodeGenerator가 입력 파일 [파일명].resx에 대한 출력을 생성하지 못했지만 특정 오류가 기록되지는 않았습니다.
그래도 해결되지 않으면 다음 글을 참고해 적용해 봅시다.
참고 : zinzza - 사용자 지정 도구 ResXFileCodeGenerator가 입력 파일 ***.resx에 대한 출력을 생성하지 못했지만 특정 오류가 기록되지는 않았습니다.
3. 언어 바꾸기
언어를 바꾸기 위해선 아래 코드를 사용해 문화권을 바꿔야 합니다.
Thread.CurrentThread.CurrentCulture
= new System.Globalization.CultureInfo(sCulture);
문화권이 바뀌면 자동으로 '.[언어-국가 코드].resx' 파일의 내용이 교체됩니다.
4. 테스트 코드 만들기
* 이 프로젝트는 윈폼에서 테스트하고 있습니다. *
테스트 코드를 만들어 봅시다.
폼에 레이블 2개와 버튼 2개를 넣습니다.
'ChangeCulture'함수를 만들고 문화권을 바꿔주는 코드를 넣어 줍니다.
/// <summary>
/// 언어 변경
/// </summary>
/// <param name="sCulture">변경할 언어-국가코드</param>
public void ChangeCulture(string sCulture)
{
Thread.CurrentThread.CurrentCulture
= new System.Globalization.CultureInfo(sCulture);
Thread.CurrentThread.CurrentUICulture
= new System.Globalization.CultureInfo(sCulture);
this.Text = LangStr.Title;
this.label1.Text = LangStr.Apple;
this.label2.Text = LangStr.Pineapple;
}
각 버튼에서 위 함수를 'en'과 'ko'를 전달하는 코드를 넣고 테스트합니다.
마무리
포스팅에 사용한 프로젝트 : github dang-gun/DotNetSamples - Localize_Resource
사실 이전 버전들과 사용 방법에 차이가 거의 없습니다.
정리 차원에서 한 번 더 포스팅했습니다.
하지만 예전과 달리 환경이 많이 달라져서 리소스를 이용한 다국처리는 좋은 방법이라고 할 수 없습니다.
리소스를 이용한 다국어 처리는 빌드를 거쳐야 한다는 치명적인 단점이 있습니다.
협업할 때 번역하는 쪽에서 '.resx'를 다룰 줄 아는지가 변수가 되는 문제도 있죠.
(다룰 줄 모르면 툴을 제공하고 교육하거나 엑셀로 작업해서 개발자가 변환해서 넣습니다.)
이런 단점은 회사가 프로그램을 0부터 100까지 컨트롤할 때는 문제가 없지만 요즘 이런 식으로 작업이 가능한 회사는 많이 줄었다는 것이 문제죠.
B2B 프로그램이라면 업체별로 커스텀 해줘야 하는데 이러면 언어관리만 해도 헬이 된다는 문제도 있습니다.
(업체 * 언어 = 언어 리소스 관리 난이도)
거기다 작은 프로그램이나 공개 소프트웨어의 경우 언어 같은 것은 유저가 직접 수정할 수 있게 제공하는 것이 좋은데 빌드가 불가능하니 개발자가 붙어서 캐어를 해야 한다는 문제도 생깁니다.
그래서 소스가 공개되 있는 프로그램의 경우 직접 기여를 하거나 빌드를 해서 사용하라고 안내를 하는 경우도 있습니다 ㅎㅎㅎㅎ
요즘은 외부 파일(혹은 DB)을 이용하는 방식을 많이 사용합니다.
그렇다고 리소스 방식을 안 쓰는 건 아닙니다만......
닷넷 빠돌이인 저조차 리소스 방식의 다국어 구현이 "끔찍하다"라는 평에 반론을 못할 정도니까요 ㅎㅎㅎㅎ