lynx   »   [go: up one dir, main page]

macOS Sequoia (15.4 以降) で cal や date を打つと出力がおかしい

$ cal
      3月 2025
日 月 火 水 木 金 土
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

5 月なのに 3 月と言われる。

$ date
#午後

date#午後 という文字列が返ってくる。

状況は cal -y するとある程度理解できて、

$ cal -y | grep "[0-9]月"
         PM            %Y年 %B%e日 %A %X %Z            1月
         2月                    3月                    4月
         5月                    6月                    7月
         8月                    9月                   10月

と、本来「1月」「2月」となるべきところに「PM」「%Y年 %B%e日 %A %X %Z」が入り込んでいる。どこかで何らかのズレが生じているのだろう。

どうやら日本語だけの問題っぽく、LANG を変えると正常に出力される。

$ LANG=C cal
      May 2025
Su Mo Tu We Th Fr Sa
             1  2  3
 4  5  6  7  8  9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
$ LANG=C date
Thu May 22 02:01:25 JST 2025

これはもう LOCALE の問題であろう。と /usr/share/locale/ 以下を眺めると、ja_JP.UTF-8 を含むいくつかの言語ファイルで行数が違うのが見える。

$ wc -l /usr/share/locale/*.UTF-8/LC_TIME
...
      58 /usr/share/locale/is_IS.UTF-8/LC_TIME
      58 /usr/share/locale/it_CH.UTF-8/LC_TIME
      58 /usr/share/locale/it_IT.UTF-8/LC_TIME
      60 /usr/share/locale/ja_JP.UTF-8/LC_TIME
      58 /usr/share/locale/kk_KZ.UTF-8/LC_TIME
      60 /usr/share/locale/ko_KR.UTF-8/LC_TIME
      58 /usr/share/locale/lt_LT.UTF-8/LC_TIME
      58 /usr/share/locale/lv_LV.UTF-8/LC_TIME
      58 /usr/share/locale/mn_MN.UTF-8/LC_TIME
...

en_US.UTF-8ja_JP.UTF-8 を見比べると、確かにおかしい。

$ cat -n /usr/share/locale/en_US.UTF-8/LC_TIME
...
    38  Saturday
    39  %H:%M:%S
    40  %m/%d/%Y
    41  %a %b %e %X %Y
    42  AM
    43  PM
    44  %a %b %e %X %Z %Y
    45  January
    46  February
    47  March
...
$ cat -n /usr/share/locale/ja_JP.UTF-8/LC_TIME
...
    38  土曜日
    39  %H時%M分%S秒
    40  %Y/%m/%d
    41  %a %b/%e %T %Y
    42  #午前
    43  AM
    44  #午後
    45  PM
    46  %Y年 %B%e日 %A %X %Z
    47  1月
...

先ほど cal -y で出力されていたのもこの 45 行目、46 行目ですね。

じゃあ /usr/share/locale/ja_JP.UTF-8/LC_TIME を書き換えたら直るんじゃないかと思ったら sudo でも編集できない。SIP (System Integrity Protection) によって守られてるんだった。

ここまで見て「面白い〜」と社の Slack で共有したところ、id:KashEight から「man setlocale が参考になりそう?」という反応を貰った。

$ man setlocale
...
FILES
     $PATH_LOCALE/locale/category
     /usr/share/locale/locale/category  locale file for the locale locale and the category category.
     /usr/local/share/locale/locale/category
                                        locale file for the locale locale and the category category.
...

環境変数 $PATH_LOCALE を見ているので、リカバリーモードで無理矢理 /usr/share/locale/ 以下を書き換えなくてもどうにかなりそう。

$HOME/.config/locale/ 以下に ja_JP.UTF-8/ をまるっとコピーして、LC_TIME を弄る。

$ diff -u {/usr/share,$HOME/.config}/locale/ja_JP.UTF-8/LC_TIME
--- /usr/share/locale/ja_JP.UTF-8/LC_TIME       2025-04-12 14:16:09
+++ /Users/onaka/.config/locale/ja_JP.UTF-8/LC_TIME   2025-05-17 13:51:58
@@ -39,10 +39,8 @@
 %H時%M分%S秒
 %Y/%m/%d
 %a %b/%e %T %Y
-#午前
-AM
-#午後
-PM
+午前
+午後
 %Y年 %B%e日 %A %X %Z
 1月
 2月

環境変数を設定して、caldate を打つと……

$ export PATH_LOCALE=$HOME/.config/locale
$ cal
      5月 2025         
日 月 火 水 木 金 土  
             1  2  3  
 4  5  6  7  8  9 10  
11 12 13 14 15 16 17  
18 19 20 21 22 23 24  
25 26 27 28 29 30 31  
$ date
2025年 5月22日 木曜日 02時19分11秒 JST

やったぜ!

以下のディスカッションも見つけました。Sequoia 15.4 以降のバグっぽいのでフィードバックしておきましょう。先日出た 15.5 でも直ってない!

Mac - ターミナルにて2ヶ月前のカレンダーが表示されます - Apple コミュニティ

Лучший частный хостинг