Skip to main content

Command Palette

Search for a command to run...

[윈폼] 지역화 기능을 이용한 다국어 지원하기

Published
2 min read
[윈폼] 지역화 기능을 이용한 다국어 지원하기

지역화 기능을 이용한 다국어 지원하기

Windows Forms에서 제공하는 폼 기반 리소스를 이용화면 화면에 보이는 텍스트 및 각종 리소스를 언어 별로 별도 처리 할 수 있게 됩니다. 폼 기반 리소스와 함께 프로젝트 리소스 방식을 이용할 수 있습니다.

  • 폼 기반 리소스
    • 폼의 텍스트 및 이미지와 같은 지역화 가능한 UI 요소에 대한 리소스 파일을 생성합니다. 이후 리소스 파일이 어셈블리에 내장되게 됩니다. 이를 폼 기반 리소스라고 합니다.
  • 프로젝트 리소스
    • 리소스 파일 템플릿을 추가한 다음 XML 디자이너를 통해 리소스를 편집합니다. 그런 후 코드를 통해 리소스에 접근하는 방식을 프로젝트 리소스라고 합니다.

일반적으로 Windows Forms 응용 프로그램에서 UI 요소와 관련된 대부분의 리소스에 폼 기반 리소스를 사용해야 편리합니다. 그러나 오류 메시지와 같은 비형태 기반의 사용자 인터페이스 문자열 및 이미지의 경우 프로젝트 리소스를 이용해야 합니다.

테스트 환경

  • Visual Studio 2022
  • .NET 6, C# 10
  • Windows Forms

폼 기반 리소스를 이용한 지역화

Windows Forms은 Localizable 속성을 통해 지역화 대상 리소스를 자동 생성하는 기능이 있습니다. 이 속성을 True로 변경합시다.

image.png

Language속성에 한국어를 입력한 후 저장합니다.

image.png

영어에 맞게 화면을 구성합니다.

image.png

그리고 한국어에 맞게 화면을 구성합니다.

image.png

이때, 주의해야 할 것은 문자열 뿐만 아니라 컨트롤의 속성도 리소스로 관리하게 되므로 컨트롤의 좌표 등 모든 리소스가 별도 저장이 됩니다. 그래서 되도록이면 default 폼을 완성 한 후 Language속성에 다른 언어를 입력하여 리소스를 생성 하는 것이 좋습니다. 그렇지 않으면 리소스 별도 컨트롤을 일일히 조정해야 하는 불편함이 생깁니다.

지역화 된 리소스는 다음의 코드를 통해 적용됩니다.

  var name = "ko-KR";
  var cultureInfo = new CultureInfo(name);
  Thread.CurrentThread.CurrentUICulture = cultureInfo;
  Thread.CurrentThread.CurrentCulture = cultureInfo;

그러면 폼은 CurrentUICulture 속성에 맞는 리소스를 찾아 적용하게 됩니다.

실행 화면

한국어의 경우,

image.png

영어의 경우,

image.png

프로젝트에 리소스를 수동으로 추가

폼 종속적인 다양한 정적 리소스는 폼의 Languages 속성으로 생성되는 리소스 파일로 관리 하는 것이 좋습니다. 그러나 폼에 직접적인 관련이 없는 정적 리소스나 상황에 따라 다르게 표현되어야 하는 동적 리소스의 경우 프로젝트에 수동으로 리소스를 추가하여 관리하게 됩니다.

프로젝트에 추가/새 항목을 통해 새로운 리소스 파일을 추가 합니다.

image.png

생성해야 하는 리소스 파일의 구성은 다음과 같습니다.

  • Resource1.resx : 기본 리소스 파일이 되며, 해당 지역의 언어 리소스가 없을 경우 선택됩니다.
  • Resource1.ko-KR.resx : 한국어(한국) 리소스 파일입니다.
  • Resource1.ko.resx : 한국어 리소스 파일입니다.

현 지역이 한국어(한국)인 경우, 최초 Resource1.ko-KR.resx 파일을 찾게 되고 없을 경우, 그 다음으로 Resource1.ko.resx 파일을, 이 파일도 없을 경우, Resource1.resx 이 파일을 리소스 파일로 선택하게 됩니다.

폼에 버튼을 배치하고 지역에 따라 버튼 Text 속성을 다르게 줍니다.

한국어,

image.png

영어,

image.png

그리고 Resource1.resx, Resource1.ko-KR.resxResources1.en-US.resx를 다음과 같이 입력합니다.

Resource1.ko-KR.resx

image.png

Resource1.resx 및 Resource1.en-US.resx

image.png

버튼 클릭 이벤트를 다음과 같이 코딩합니다.

  private void button1_Click(object sender, EventArgs e)
  {
      MessageBox.Show(Resource1.QuestionContent, Resource1.QuestionTitle, MessageBoxButtons.OK, MessageBoxIcon.Question);
  }

실행 화면

한국어 선택 시,

image.png

영어 선택 시,

image.png

샘플 소스

  • https://github.com/dimohy/csharp-check/tree/main/WinForms/4.Localizing/sample

More from this blog

개발, 테스트, 운영에서의 도커 활용

핵심 원칙: "한 번 빌드하고, 어디서든 실행한다 (Build once, run anywhere)" 도커의 가장 큰 장점은 환경 일관성입니다. 동일한 도커 이미지를 사용하여 개발, 테스트, 운영 환경을 구성함으로써 "제 PC에서는 됐는데..." 하는 문제를 최소화할 수 있습니다. 1. 개발 단계 (Development) 목표: 빠른 코드 변경 반영, 쉬운 디버깅, 실제 운영 환경과 유사한 환경 구성. Docker 사용 방안: Dockerf...

May 9, 20256 min read15

[EF Core] 데이터 삭제 시 소프트 삭제 적용

DB에서 데이터를 삭제하면 일반적으로 복구할 수 없습니다. 또한 관계에 따라 영구 삭제 자체가 어려울 수도 있습니다. 그래서 데이터를 영구 삭제하는 대신 IsDeleted 속성을 true로 주고 IsDeleted 속성을 필터링해서 조회하는 방법을 사용하기도 합니다. 이를 소프트 삭제라고 합니다. 그런데 EF에서 알아서 데이터 삭제 시 소프트 삭제를 하고 쿼리시 IsDeleted 속성을 체크해서 삭제한 데이터를 제외한 데이터만 쿼리하게 하는 ...

Mar 18, 20243 min read19

[EF Core] ValueConverter를 이용해서 엔터티 속성의 도메인 관리

EF Core를 사용하면서 문자열 길이 등의 특성을 일일이 지정하는 것은 번거롭습니다. ... [MaxLength(32)] public string? 제목 { get; set; } 엔터티가 한 개일 때는 상관이 없으나 제목 유형이 여러 엔터티에 사용될 경우 유형을 지정하기 번거롭습니다. 속성 유형을 도메인으로 관리하면 참 편할텐데요, ValueConverter를 이용할 수 있습니다. 그런데 이것을 인터페이스 정적 추상를 사용해서 다음처럼 ...

Mar 16, 20242 min read8

디모이 블로그

154 posts

.NET 관련 기술을 선호하고 새로운 언어를 배우는데 관심이 있습니다.