목차
우분투 영문 로케일 설정
$ locale
LANG=ko_KR.UTF-8
LANGUAGE=
LC_CTYPE=“ko_KR.UTF-8”
LC_NUMERIC=“ko_KR.UTF-8”
LC_TIME=“ko_KR.UTF-8”
LC_COLLATE=“ko_KR.UTF-8”
LC_MONETARY=“ko_KR.UTF-8”
LC_MESSAGES=“ko_KR.UTF-8”
LC_PAPER=“ko_KR.UTF-8”
LC_NAME=“ko_KR.UTF-8”
LC_ADDRESS=“ko_KR.UTF-8”
LC_TELEPHONE=“ko_KR.UTF-8”
LC_MEASUREMENT=“ko_KR.UTF-8”
LC_IDENTIFICATION=“ko_KR.UTF-8”
LC_ALL=
$ sudo vi /etc/default/locale
LC_ALL=en_US.UTF-8
LANG=en_US.UTF-8
$ logout
다시 로그인 후
$ locale
위 기록은 /etc/default/locale을 수정하던 환경의 절차다. 적용 전 locale -a로 en_US.utf8이 생성되어 있는지 확인한다. 없다면 해당 배포판의 로케일 생성 도구로 먼저 추가해야 한다.
LANG은 기본 로케일이고 LC_* 값이 설정되어 있으면 해당 범주에서 LANG보다 우선한다. LC_ALL은 모든 범주를 강제로 덮어쓰므로 지속 설정에 남기기 전에 다른 로케일 설정을 무시해도 되는지 확인한다. 한 셸에서만 임시로 시험하려면 다음처럼 실행할 수 있다.
LANG=en_US.UTF-8 locale
서버 전체의 기본값을 바꾸면 기존 프로세스의 출력 언어, 날짜, 숫자 형식이 영향을 받을 수 있다. 설정 후 새 로그인 셸에서 locale을 다시 확인하고, 특정 서비스에만 필요한 변경이라면 서비스 환경 변수로 범위를 좁힌다.
로케일이 바뀌는 범위 이해하기
로케일은 화면에 보이는 문장만 바꾸지 않는다. LC_TIME은 날짜 표시, LC_NUMERIC은 소수점 표기, LC_COLLATE는 정렬 순서, LC_MESSAGES는 프로그램 메시지에 영향을 준다. 따라서 서버 로그를 영문으로 보고 싶다는 이유로 시스템 전체를 바꾸면, 같은 서버에서 실행하는 배치 프로그램의 출력 형식도 달라질 수 있다.
flowchart LR LANG[LANG: 기본값] --> 범주[LC_TIME·LC_NUMERIC·LC_MESSAGES 등] 개별[개별 LC_* 설정] -->|해당 범주 우선| 범주 전체[LC_ALL 설정] -->|모든 범주 최우선| 범주
locale 출력에서 LANG=en_US.UTF-8이어도 LC_MESSAGES=ko_KR.UTF-8가 남아 있으면 메시지는 계속 한국어로 보일 수 있다. 반대로 LC_ALL을 설정하면 각 범주의 개별 값을 모두 덮는다. 영문 메시지만 필요한 경우에는 전체 설정 대신 해당 명령을 LC_MESSAGES=C 명령어로 실행하는 방법을 먼저 고려한다.
Ubuntu에서 기본값을 바꿀 때
locale -a에 원하는 로케일이 없다면 로케일을 생성해야 한다. Debian/Ubuntu의 locales 패키지가 설치된 환경에서 다음 순서로 확인할 수 있다. 사용 중인 Ubuntu 릴리스에 따라 기본 설정 파일 경로가 다를 수 있으므로 update-locale의 도움말과 현재 설정을 먼저 본다.
locale -a | rg -i '^en_US\.utf8$'
sudo locale-gen en_US.UTF-8
sudo update-locale LANG=en_US.UTF-8 LC_ALL
마지막 명령의 LC_ALL에는 값을 주지 않았으므로 기존의 전역 덮어쓰기 설정을 제거하겠다는 뜻이다. 기존 시스템에 범주별 설정이 있다면 함께 유지되는지 확인한다. 설정 후 현재 셸에서 바로 바뀌지 않을 수 있으므로 새 로그인 세션을 열어 locale, locale -a, printenv LANG LC_ALL LC_MESSAGES를 다시 본다. locale: Cannot set LC_* to default locale 같은 경고가 나오면 선언한 로케일이 실제 생성됐는지부터 확인한다.
| 목적 | 변경 범위 | 확인 방법 |
|---|---|---|
| 한 명령만 영문 메시지로 실행 | LC_MESSAGES=C 명령어 | 그 명령의 출력 언어 |
| 현재 셸에서 시험 | export LANG=en_US.UTF-8 | 같은 셸에서 locale |
| 새 로그인 세션의 기본값 변경 | update-locale | 다시 로그인한 뒤 locale |
| 특정 서비스만 변경 | 서비스 환경 변수 | 서비스 재시작 후 실제 프로세스 환경과 로그 |
서비스 프로세스는 로그인 셸과 다른 환경으로 시작할 수 있다. 터미널의 locale이 영문으로 바뀌어도 systemd 서비스 출력이 그대로라면 서비스 단위의 환경을 확인한다. Linux locale(7) 매뉴얼에 우선순위와 범주가, Ubuntu update-locale 매뉴얼에 전역 설정 명령이 설명돼 있다.