태터데스크 관리자

도움말
닫기
적용하기   첫페이지 만들기

태터데스크 메시지

저장하였습니다.

외국에 출시한 소프트웨어가 날짜 때문에 낭패 본 사연 (4)

2015.05.26 14:10 by 전규현


잠시 후 Google blogger로 이동됩니다.





10년차 개발자인 김과장(가상의 인물)은 최근에 소프트웨어를 영어를 지원하도록 만들었다. 어플리케이션에서 표시되는 모든 메시지(메뉴, 버튼, 다이얼로그 등)를 영어로 번역했다. 그렇게 해서 영어버전을 출시했는데 얼마 안 가서 버그가 보고 되었다.


날짜를 2015/05/15 이렇게 표시를 했는데 미국에서는 05/15/2015로 표기해 달라는 것이다.


김과장은 소스코드를 다음과 같이 수정해서 버그를 해결했다.


if (locale == “en_US”)

     date_format = “mm/dd/yyyy”;

else

     date_format = “yyyy/mm/dd”;


물론 의사코드(pseudocode)이므로 정확한 소스코드는 아니다. 예를 든 것뿐이다. 


그런데 얼마 안 있어서 호주에서는 15/05/2015로 표기를 해달라고 하는 것이다. 기존의 표기는 헷갈린다고 한다. 이렇게 하나씩 고치다 보니 날짜뿐만 아니라 여러 가지 분야에서 끝도 없는 수정이 계속 되었다. 문제는 이렇게 고쳐달라고 요청하는 사용자보다 틀린 것을 참고 쓰거나 아예 포기를 해버리는 사용도 많을 텐데 파악이 안 된다는 것이다.


김과장은 로케일만 알았지 로케일이 시스템에 무엇을 바꾸는지는 잘 몰랐던 것이다. 김과장은 로케일을 제대로 이해하고 있었다면 이렇게 김과장이 직접 로케일의 변화에 따른 프로그래밍을 직접 할 필요가 없었다. 그냥 시스템에서 제공하는 함수를 쓰면 되는 것이었다. 물론 OS나 개발 라이브러리에 따라서 사용법은 조금씩 다르다.




로케일은 시스템의 무엇을 바꿀 수 있을까? 이렇게 로케일이 시스템에 미치는 영향을 6가지로 구분하여서 이를 로케일 카테고리라고 한다.


로케일 카테고리의 약자인 “LC”를 앞에 붙여서 LC_TIME, LC_NUMERIC, LC_MONETARY, LC_COLLATE, LC_CTYPE, LC_MESSAGES 이렇게 6가지가 정의되어 있다. 대부분의 OS와 개발 라이브러리에서 이를 지원하고 있다.


사용법은 setlocale(로케일 카테고리, 로케일) 이다. 즉, setlocale(LC_TIME, “de_DE”) 이렇게 하면 날짜와 시간을 독일 식으로 표현하라는 얘기다. 이렇게 6개를 모두 설정하려면 귀찮기 때문에 LC_ALL이라는 것을 둬서 setlocale(LC_ALL, “de_DE”)이라고 하면 한번에 6개의 카테고리가 모두 독일식으로 설정된다. 


그럼 하나씩 알아보자.


LC_TIME 시간과 날짜의 표현에 대한 설정이다. 김과장이 이 카테고리만 설정하고 이와 관련된 함수만 사용했어도 위에서와 같은 고생은 안 해도 됐다. LC_TIME이 영향을 미치는 함수는 개발 라이브러리에 따라서 다르다. GNU C 라이브러리인 경우에는 strftime(), strptime()이다. PHP나 Python도 strftime()을 지원한다. LC_TIME를 세팅하면 로케일 별로 다른 시간과 날짜가 표시된다.


LC_NUMERIC 숫자 표현을 위한 설정이다. 나라마다 숫자 표현이 크게 다르다는 것을 모르는 개발자도 상당히 많다. 우리는 소수점으로 점(.)을 쓰는 것을 당연하게 생각하지만 그렇지 않은 나라도 매우 많다. 우리가 이렇게 로케일별로 다른 표현을 다 연구할 필요는 없다. LC_NUMERIC이 영향을 미치는 함수를 쓰기만 하면 된다. strtod(), atof()가 그 예이고 sprintf(), printf() 함수도 영향을 받는다. 자세한 것은 나중에 다루겠다.


LC_MONETARY 화폐, 금액을 다루기 위한 설정이다. 영향을 받는 함수는 strfmon()이 있다. 최근에는 유로화를 지원하기 시작하면서 좀 복잡해졌다. 라이브러리 별로 지원하는 것이 조금씩 다르기도 하다.




LC_COLLATE 정렬에 관한 것인데 조금 복잡하다. 정확하게 이해하려면 사전에 어떠한 순서로 정렬이 되는 것이 자연스러운지 생각해보면 된다. 영어에는 대소문자에 대한 정렬 방법이 일반 ASCII 정렬방법과는 약간 다르고 한국어에도 ‘ㄱ’이 어느 위치에 정렬되어야 하는지는 EUC-KR 코드의 순서와는 약간 다르다. ASCII 순서에 따르면A, B, a, b 이렇게 되지만 사전에서는 a, A, b, B이기 때문이다. 물론로케일별로 다르다. Collation이라는 용어는 나중에 Database 설정에도 나오기 때문에 잘 알아두는 것이 좋다. LC_COLLATE가 영향을 미치는 함수는 strcoll(), wcscoll() 등이 있다. 즉, 이런 함수를 이용해서 정렬 함수를 만들어야 각 로케일에 맞는 정렬이 된다.


LC_CTYPE 문자의 종류를 다루기 위한 설정이다. 문자인가 숫자인가, 대소문자 구분을 다룬다. strlen(), stricmp(), strlwr(), strupr() 등의 함수가 영향을 받는다.


LC_MESSAGES 로케일 별로 번역된 메시지를 표현하기 위한 설정이다. catopen(), gettext() 등이 영향을 받는데, 메시징은 국제화에서 별도로 다뤄야 할 만큼 중요하기 때문에 추후 여러 회에 걸쳐서 다뤄질 것이다.


이렇게 거의 모든 OS와 개발라이브러리에서 다루는 6가지 로케일 카테고리 외에도 LC_ADDRESS, LC_NAME, LC_PAPER, LC_TELEPHONE 등을 사용하는 곳도 있다.


우리는 로케일을 지정함으로써 로케일별로 다른 표현 및 기능이 자동으로 바뀌도록 개발을 해야 한다. 소스코드에 if (locale == "de_DE") 등과 같은 표현이 절대로 있어서는 안된다. if (lang == "english")는 더더욱 안된다.


이미지 by Kolmisoft

저작자 표시 비영리 변경 금지
신고

전규현 프로젝트/국제화 , ,

블로그 호스팅을 Google Blogger로 이전합니다.

최근에 블로그에 보안 문제가 발생하여 좀더 안정적으로 블로그를 운영하기 위해서 Google Blogger로 이전합니다. 기존에 http://allofsoftware.net 과 http://www.allofsoftware.net..

한국어(한글) 코드 이야기 (8)

유니코드에 대해서 좀더 알아보기 전에 한국어 코드(문자세트)와 인코딩에 대해서 좀더 알아보자. 1991년에 유니코드가 탄생한 후에 유니코드는 점점 많은 개발자들이 사용하기 시작해서 영역을 넓혀가고 있다. 물론 언젠가는 유니코..

유니코드 영토 전쟁의 승리자는? (7)

이번에는 유니코드의 코드 체계에 대해서 간단하게 알아보고자 한다. 소프트웨어 국제화를 필요로 하는 개발자라면 자주는 아니지만 유니코드 내부 코드 체계를 알아야 할 때가 있다. 다양한 플랫폼에서 개발을 할 때 폰트 등과 관련하..

유니코드는 어떻게 탄생했을까? (6)

소프트웨어 국제화를 이해하기 위해서는 유니코드에 대해서 필수적으로 잘 알아야 한다. 유니코드란 말을 들어보지 않은 개발자는 없지만 관련 용어가 매우 많아서 종종 헷갈린다. 게다가 유니코드가 탄생한지 20년도 더 넘었지만 아직..

직원을 잠재적인 도둑 취급하는 회사

필자는 몇 년 전 A그룹에 강연을 하러 갔다가 곤란한 일을 겪은 적이 있다. 한국 대부분의 대기업이 그렇듯이 보안이 매우 엄격한 회사였다. 나는 직원들의 안내대로 메모리, 외장하드를 모두 빼놓고 회사로 들어갔다. 하지만 강연..

외국에서 팔리는 소프트웨어의 아키텍처 디자인 원칙 (5)

김과장은 그 동안 한국어만 지원하는 소프트웨어 A를 개발해 왔는데 최근에 사장님이 A의 일본어 버전을 만들라고 했다. 그리고 개발 기간도 한달 밖에 주어지지 않았다. 그래서 기존 소스코드를 복사해서 한국어가 들어 있는 모든 ..

소프트웨어 개발자 성장에 꼭 필요한 리뷰

우리나라 개발자들은 프로그래밍은 잘 하는데 대접을 못 받는다는 얘기가 있다. 또, 머리는 좋은데 환경이 나쁘다는 얘기도 있다. 젊은 개발자들은 외국의 개발자들에 전혀 뒤지지 않는데 나이를 먹을수록 실력이 떨어진다는 얘기도 있..

외국에 출시한 소프트웨어가 날짜 때문에 낭패 본 사연 (4)

10년차 개발자인 김과장(가상의 인물)은 최근에 소프트웨어를 영어를 지원하도록 만들었다. 어플리케이션에서 표시되는 모든 메시지(메뉴, 버튼, 다이얼로그 등)를 영어로 번역했다. 그렇게 해서 영어버전을 출시했는데 얼마 안 가서..

독일어 버전 소프트웨어란 말이 잘못된 이유 (3)

본 시리즈는 차례대로 읽으면 소프트웨어 국제화가 전체적으로 이해가 되어서 소프트웨어 개발자에게 도움이 되는 방향으로 진행하려고 하고 있다. 개발자마다 지식과 경험이 천차만별이라서 초급 개발자를 기준으로 작성하고 있다. 경영자..

소프트웨어를 외국에 출시 하면서 흔히 빠지는 함정 (2)

우리나라 소프트웨어 중에서 외국에서 크게 성공했다고 하는 소프트웨어가 있는가? 온라인 게임을 제외하고는 거의 없다. 사실 게임은 국제화, 지역화를 잘 못하더라도 큰 흉이 안 된다. 하지만 그 외의 많은 소프트웨어들은 제품이든..

티스토리 툴바