2015年3月27日金曜日

ロケールを変更して通貨記号や日時フォーマットをカスタマイズ

Ubuntu のロケールを LANG=en_US.UTF-8 にしているのですが、以下の点が気になるので LANG=en_US.UTF-8 のまま関連するロケールの環境変数を変更してみました。

  • 日付書式が 2015-03-25 とかではなく、Wed 25 Mar 2015 になっている
  • 時刻書式が 24H ではなく AM, PM になっている
  • 通貨記号が \ ではなく $ になっている

Ubuntu バージョン

Ubuntu 14.04 (Trusty Tahr) Server

まずは現状のロケールの状態です。

システムのロケール設定

$ cat /etc/default/locale
LANG="en_US.UTF-8"
LANGUAGE="en_US:en"

LANG 環境変数

$ echo $LANG
en_US.UTF-8

現在のロケール設定

$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

日時フォーマットが YYYY-MM-DD HH:MM:SS (24時間表記) であるロケールを探す

以下を実施するといろいろな国や言語に関する 300以上の language-pack がインストールされます。今回は試しにやってみましたが、HDD 領域やパッケージをダウンロードする NW 帯域等のリソース消費が無駄なので検証環境以外では実施しないほうがよさそうです。

インストールする前の利用可能なロケール数を確認

$ locale -a | wc -l
24

全ての language-pack をインストール

$ apt-cache search language-pack | grep '^language-pack-' | awk '{print $1}' | xargs sudo apt-get -y install

インストール後の利用可能なロケール数を確認

$ locale -a | wc -l
360

日付の並びが YYYY MM DD のものを探す

$ locale -a | xargs -i{} bash -c 'printf "%-16s %s\n" {} "$(LC_TIME={} date +%c)"' | egrep '2015.*03.*26'
en_DK.utf8       2015-03-26T17:17:12 JST
ja_JP.utf8       2015年03月26日 17時17分13秒
ko_KR.utf8       2015년 03월 26일 (목) 오후 05시 17분 13초
si_LK            2015-03-26 17:17:14 +0900
si_LK.utf8       2015-03-26 17:17:14 +0900
ug_CN@latin      Pe, 2015-03-26, 17:17:15
ug_CN.utf8@latin Pe, 2015-03-26, 17:17:15
zh_CN.utf8       2015年03月26日 星期四 17时17分16秒
zh_HK.utf8       2015年03月26日 星期四 17:17:16
zh_SG.utf8       2015年03月26日 17时17分16秒 JST
zh_TW.utf8       2015年03月26日 (週四) 17時17分16秒
  • 360 あるロケールの中で YYYY MM DD の並びとなるものはこんなに少ないんですね。
  • この中でなんとなく自分にあってる en_DK.utf8 を使うことにしました。

LANG=en_US.UTF-8 の状態で LC_TIME を変更しない場合

$ date +%c
Thu 26 Mar 2015 05:57:15 PM JST

LC_TIME=en_DK.utf8 の場合

$ LC_TIME=en_DK.utf8 date +%c
2015-03-26T17:58:46 JST

通貨記号を $ から \

python3 では以下のように LC_MONETARY=ja_JP.UTF-8 とすることで \ になりました。

LANG=en_US.UTF-8 の状態で LC_MONETARY を変更しない場合

$ python3 -c 'import locale; locale.setlocale(locale.LC_ALL, ""); print(locale.currency(123))'
$123.00

LC_MONETARY=ja_JP.UTF-8 の場合

$ LC_MONETARY=ja_JP.UTF-8 python3 -c 'import locale; locale.setlocale(locale.LC_ALL, ""); print(locale.currency(123))'
¥123

しかし、これだけだとなぜか LibreOffice の通貨記号は \ にならないので、いろいろ試したところ LC_CTYPE も ja_JP.UTF-8 にする必要がありました。


ロケールの変更をシステムに反映

まだの場合は language-pack をインストール

$ sudo apt-get install language-pack-en
$ sudo apt-get install language-pack-ja

目的のロケールが使えるようになっていることを確認

$ locale -a | egrep 'ja_JP|en_DK'
en_DK.utf8
ja_JP.utf8

システムのロケール設定を変更

$ sudo update-locale LC_TIME=en_DK.utf8 LC_MONETARY=ja_JP.UTF-8 LC_CTYPE=ja_JP.UTF-8

念のためシステム再起動

システムのロケール設定を確認

$ cat /etc/default/locale
LANG="en_US.UTF-8"
LANGUAGE="en_US:en"
LC_MONETARY=ja_JP.UTF-8
LC_TIME=en_DK.utf8
LC_CTYPE=ja_JP.UTF-8

現在のロケール設定を確認

$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_CTYPE=ja_JP.UTF-8
LC_NUMERIC="en_US.UTF-8"
LC_TIME=en_DK.utf8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=ja_JP.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

日時のフォーマットを確認

$ date +%c
2015-03-26T22:18:40 JST

通貨記号を確認

$ python3 -c 'import locale; locale.setlocale(locale.LC_ALL, ""); print(locale.currency(123))'
¥123

LibreOffice Calc の通貨記号も \ になりました。



0 件のコメント:

コメントを投稿