부록 E. 지역화(Localization)

지역화는 문서화가 안 돼 있는 Bash 의 특징입니다.

지역화된 쉘 스크립트는 시스템의 로케일에 따라 정의된 언어로 텍스트를 출력해 줍니다. 독일의 베를린에 있는 리눅스 유저는 독일어로 된 스크립트의 출력을 얻을 수 있는 반면에 미국의 메릴랜드에 있는 그의 사촌은 똑같은 스크립트임에도 불구하고 영어로 된 출력을 얻을 수 있습니다.

사용자에게 에러나 프롬프트등을 지역화된 메세지로 보여주려면 다음에 나오는 형식을 쓰면 됩니다.

#!/bin/bash
# localized.sh

E_CDERROR=65

error()
{
  printf "$@" >&2
  exit $E_CDERROR
}

cd $var || error $"Can't cd to %s." "$var"
read -p $"Enter the value: " var
# ...

bash$ bash -D localized.sh
"Can't cd to %s."
 "Enter the value: "
이 목록들은 지역화된 텍스트를 보여줍니다.(-D 옵션은 스크립트를 실행시키지 않고 $ 뒤에서 큰따옴표로 쿼우트된 문자열들을 보여줍니다.)

bash$ bash --dump-po-strings localized.sh
#: a:6
msgid "Can't cd to %s."
msgstr ""
#: a:7
msgid "Enter the value: "
msgstr ""
--dump-po-strings 옵션은 -D와 닮았지만 gettext"po" 포맷을 사용합니다.

자 이제 스크립트가 msgstr을 참고해서 특정 언어로 메세지를 번역하도록 languge.po를 빌드하면 됩니다. 예를 살펴 볼까요?

ko.po:
#: a:6
msgid "Can't cd to %s."
msgstr "%s 디렉토리로 옮겨갈 수 없습니다."
#: a:7
msgid "Enter the value: "
msgstr "값을 넣으세요: "

그 다음엔 msgfmt을 실행시키세요.

msgfmt -o localized.sh.mo ko.po

그러면 localized.sh.mo 파일이 생기는데 이 파일을 /usr/local/share/locale/ko/LC_MESSAGES 디렉토리에다 두고 스크립트의 첫 부분에 다음 두 줄을 추가해 주세요.
TEXTDOMAINDIR=/usr/local/share/locale
TEXTDOMAIN=localized.sh

이제 어떤 사용자가 이 스크립트를 한국어 환경에서 실행시킨다면 영어 메세지 대신에 한글 메세지를 보게 될 것입니다.

참고: Bash 예전 버전이나 다른 쉘에서 지역화를 하려면 gettext-s 옵션을 걸어서 사용해야 합니다. 이런 경우에 쉘 스크립트는 다음처럼 해 주면 됩니다.

#!/bin/bash
# localized.sh

E_CDERROR=65

error() {
  local format=$1
  shift
  printf "$(gettext -s "$format")" "$@" >&2
  exit $E_CDERROR
}
cd $var || error "Can't cd to %s." "$var"
read -p "$(gettext -s "Enter the value: ")" var
# ...

TEXTDOMAINTEXTDOMAINDIR 변수는 전체 환경으로 export 되어야 합니다.

---

이 부록은 Stephane Chazelas 가 작성해 주었습니다.