안녕하세요.
코딩하는남자에 코딩연습생입니다
이번에 회사에서 관리하는 MES 프로그램에 갑작스런 외국인 사용자가 추가 되어
기존 한국어/인도네시아어만 사용되고 있었는데 중국어를 추가해야 될 일이 발생했어요~
그래서 어떤식으로 다국어 기능을 구현할까 고민하다가 좋은 정보가 있어 블로그에 기재하게 되었습니다
원리는 간단합니다
기존 프로젝트에 언어별 Resource 파일을 추가해서
컨트롤별 한국어/인도네이아어/중국어 작성해 놓고 이벤트에 따라 해당 리소스 파일의 정보를 보여주는식으로
구동 되어 집니다
[구현 방법]
1. 기존 프로젝트에 폴더를 삽입
- 저는 Language라고 햇어요
(솔루션 탐색기에서 폴더 추가하는 방법은 따로 설명하지 않을께요)
2. Language 폴더에 리소스 파일을 생성합니다
- 리소스파일명은 개인 취향입니다 저는 Str.resx라고 했어요
(Language폴더에서 마우스 오른쪽 버튼을 누루고 추가 새 항목 선택 후 리소스파일을 선택하면 됩니다)
- 총 3개의 리소스 파일을 추가했습니다
(Str.resx : 기본 리소스 파일, Str.ko-KR.resx : 한국어 리소스 파일, Str.zh-CN.resx : 중국어 리소스 파일)
3. 리소스 파일의 액세스 한정자 확인
- Str.resx 기본 리소스 파일의 액세스 한정자 타입은 Internal 입니다
- Str.ko-KR.resx와 Str.zh-CN.resx 파일의 액세스 한정자 타입은 코드 생성 안됨으로 하시면 됩니다
(보통 생성 순서에 따르 자동 지정되니 확인만 하시면 될거 같습니다)
4. 디자인을 통해 언어 선택을 할 콤보박스를 생성
- 저는 콤보박스로 했는데 이것도 개인취향이니 편하신데로 해도 되요
5. 콤보박스 이벤트 생성
- comboBox1_SelectedIndexChanged 이벤트 생성하여 콤보박스의 Index가 변경될때 발생하도록 합니다
6. comboBox1_SelectedIndexChanged 코드 생성
- CultureInfo 함수를 사용하기 위해서는 "using System.Globalization;" 선언문을 꼭 해주셔야 합니다
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
if (comboBox1.SelectedIndex == 0)
{
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("ko-KR");
SetTextLanguage();
}
else if (comboBox1.SelectedIndex == 1)
{
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("zh-CN");
SetTextLanguage();
}
}
- 언어 선택에 다른 컨트롤 변경 코드 생성
public void SetTextLanguage()
{
lblUSERMODE.Text = POPMachine.Language.Str.lblUSERMODE;
label4.Text = POPMachine.Language.Str.label4;
NAME_DATE.Text = POPMachine.Language.Str.NAME_DATE;
button1.Text = POPMachine.Language.Str.button1;
button3.Text = POPMachine.Language.Str.button3;
button4.Text = POPMachine.Language.Str.button4;
label5.Text = POPMachine.Language.Str.label5;
label14.Text = POPMachine.Language.Str.label14;
label2.Text = POPMachine.Language.Str.label2;
label8.Text = POPMachine.Language.Str.label8;
label10.Text = POPMachine.Language.Str.label10;
label7.Text = POPMachine.Language.Str.label7;
label9.Text = POPMachine.Language.Str.label9;
label6.Text = POPMachine.Language.Str.label6;
label16.Text = POPMachine.Language.Str.label16;
label11.Text = POPMachine.Language.Str.label11;
label13.Text = POPMachine.Language.Str.label13;
cmdRun_WMIX_NO1.Text = POPMachine.Language.Str.cmdRun_WMIX_NO1;
cmdRun_WMIX_NO2.Text = POPMachine.Language.Str.cmdRun_WMIX_NO2;
cmdRun_WMIX_NO3.Text = POPMachine.Language.Str.cmdRun_WMIX_NO3;
cmdRun_WHLOT_NO.Text = POPMachine.Language.Str.cmdRun_WHLOT_NO;
cmdRun_WRACK_NO.Text = POPMachine.Language.Str.cmdRun_WRACK_NO;
cmdRun_NG_SELFCHACK.Text = POPMachine.Language.Str.cmdRun_NG_SELFCHACK;
cmdRun_WPART_CUST.Text = POPMachine.Language.Str.cmdRun_WPART_CUST;
cmdRun_WFORM_MCPLAN.Text = POPMachine.Language.Str.cmdRun_WFORM_MCPLAN;
cmdRun_WLOT_NO.Text = POPMachine.Language.Str.cmdRun_WLOT_NO;
hoverGradientButton1.Text = POPMachine.Language.Str.hoverGradientButton1;
cmdRun_WPCardScan.Text = POPMachine.Language.Str.cmdRun_WPCardScan;
cmdRun_WStart.Text = POPMachine.Language.Str.cmdRun_WStart;
cmdRun_WOKQty.Text = POPMachine.Language.Str.cmdRun_WOKQty;
cmdRun_WPrint.Text = POPMachine.Language.Str.cmdRun_WPrint;
cmdRun_WMCStopHist.Text = POPMachine.Language.Str.cmdRun_WMCStopHist;
cmdRun_WFinish.Text = POPMachine.Language.Str.cmdRun_WFinish;
cmdRun_WProcImage.Text = POPMachine.Language.Str.cmdRun_WProcImage;
cmdRun_WNGQty.Text = POPMachine.Language.Str.cmdRun_WNGQty;
cmdRun_WLPrint.Text = POPMachine.Language.Str.cmdRun_WLPrint;
cmdRun_WWaiting.Text = POPMachine.Language.Str.cmdRun_WWaiting;
button5.Text = POPMachine.Language.Str.button5;
cmdRun_Workers.Text = POPMachine.Language.Str.cmdRun_Workers;
cmdRun_WorkHist.Text = POPMachine.Language.Str.cmdRun_WorkHist;
cmdRun_Mold.Text = POPMachine.Language.Str.cmdRun_Mold;
cmdRun_Wheel.Text = POPMachine.Language.Str.cmdRun_Wheel;
cmdRun_SubPartImage.Text = POPMachine.Language.Str.cmdRun_SubPartImage;
cmdRun_PCardStatus.Text = POPMachine.Language.Str.cmdRun_PCardStatus;
cmdRun_Video.Text = POPMachine.Language.Str.cmdRun_Video;
cmdRun_Call.Text = POPMachine.Language.Str.cmdRun_Call;
cmdRun_Setting.Text = POPMachine.Language.Str.cmdRun_Setting;
cmdRun_Exit.Text = POPMachine.Language.Str.cmdRun_Exit;
}
저는 해당 화면에 컨트롤이 많아 이렇게 나열했지만 좀 더 응용하면 Resource 파일을 연계하여
같은 종류의 컨트롤별 자동 지정되도록 구현하면 Source Code가 좀 더 깔끔해질거 같네요
이렇게 구현하게되면 나중에 언어가 추가 될때 당황하지 않고 Resorce파일만 추가하여 적용해주면
더 많은 언어들의 쉽게 적용할 수 있습니다
한번 도전해 보세요^^
감사합니다
'코딩정보 > C#' 카테고리의 다른 글
[C#] Soket 통신으로 RFID 연결하기 #2 (0) | 2019.12.13 |
---|---|
[C#] stdole.dll 어셈블리의 강력한 이름 서명이 잘못되었습니다. (0) | 2019.12.11 |
[C#] "lc.exe"이(가) 종료되었습니다(코드: -1) (0) | 2019.12.05 |
[C#] Soket 통신으로 RFID 연결하기 #1 (0) | 2019.12.04 |
[C#] 프로세스 실행 상태 확인 (0) | 2019.11.29 |