ニュースやイベントの日付

ウェブサイトのルートで日付や時刻の書式を設定すると、ニュースの項目やイベントの日付もそれに合わせた書式となります。これで一安心と思うと、さにあらず。よく見ると"8月 2010"とか、本当は"2010年8月"とでもしたいような表示が残っていることに気がつきます。この辺りは、以下のフロントエンドモジュールに存在します。

  • カレンダー関係
    • カレンダー
    • イベントメニュー
    • イベントリスト
  • ニュース関係
    • ニュースアーカイブ
    • ニュースアーカイブメニュー

表示形式を年、月、日を選択できるフロントエンドモジュールでは、それぞれによって現れ方も異なります。

問題の詳細

問題点を整理すると以下の様になります。

  1. 年と月の表示の順番が"月 年"で固定されている箇所があります。
  2. 月は"8月"と単位が付いて表示される一方で、年は"2010”と数値の値だけで表示されています。
  3. ミニカレンダーの表示で"日曜日"が"日曜"と表示されますが、"日"だけでも十分に意味が通ります。

「ウェブサイトのルート」で設定した日付の書式が影響しないのは、簡単に言えば表示に至る流れが異なることにあります。ニュースの記事や個々のイベントと異なり、カレンダーやニュースアーカイブメニューの表示はユーザーからの入力、すなわち対象とする期間の指定に基づいて、表示する日付が変わってくるという側面もあります。

年と月の順番と年の単位

年と月の表示を作成する部分は、これらカレンダーやニュースのモジュールでは、PHPの関数date()の"F Y"をハードコーディングして書かれている部分があります。

ContaoのparseDate()で"F Y"の並びを処理する過程で言語ファイルの内容が反映されて、英語では"August 2010"に、日本語では"8月 2010"となります。

さらに、ここでは年に単位を付ける表示を反映させる手段がないため、年は常に4桁の数値による表示となります。

ミニカレンダー

ミニカレンダーは、

  • カレンダーのフロントエンドモジュールでテンプレートに"cal_mini"を指定
  • ニュースアーカイブメニューの形式を「日」に指定

とした場合に表示されます。似たようなコードですが、実際は別々に実装されています。

そして、いずれの場合も使用するテンプレートで、utf8_substr()で「完全な曜日」から先頭の二文字を切り出すという処理を行っています。以下はcal_mini.tplからの抜粋です。

  <tr>
<?php foreach ($this->days as $i=>$day): ?>
    <th class="label<?php if ($i == 0 || $i == 6) echo ' weekend'; ?>"><?php echo utf8_substr($day, 0, 2); ?></th>
<?php endforeach; ?>
  </tr>

テンプレートだけで対応

まず、テンプレートだけで対応する方法を考えます。

この方法は本体に手を入れる必要なく簡単に行うことが可能ですが、他の言語に影響を与えないように注意する必要もあります。

グローバル変数の$GLOBALS['TL_LANGUAGE']にに、2文字のISO-639による言語コードで、現在使用している言語の文字列が入っていますので、これで切り分けることができます。

ニュースアーカイブとニュースアーカイブメニュー

以下のpatchでは現在の言語が日本語、言語コードが"ja"の場合だけ、以下の処理を行うような修正を加えています。

  1. ”月 年"の文字列をスペースで分けて、逆の順番でスペースで連結します。
  2. 入れ替えた文字列の後ろに"年"を追加します。

なお、patchファイルにはニュースに対する最小限の変更で、ニュースアーカイブメニューの形式を「日」の単位にした場合は考慮していません。

ミニカレンダー

一方、ミニカレンダーの方は、以下のような変更をテンプレートに加えることで表示を調整できます。これと同様な変更はcal_mini.tplにも行えるはずです。

--- mod_newsmenu_day.tpl.orig	2010-02-12 02:06:53.000000000 +0900
+++ mod_newsmenu_day.tpl	2010-08-22 15:54:45.000000000 +0900
@@ -15,7 +15,12 @@
   </tr>
   <tr>
 <?php foreach ($this->days as $day): ?>
-    <th class="label"><?php echo utf8_substr($day, 0, 2); ?></th>
+    <th class="label"><?php
+if ($GLOBALS['TL_LANGUAGE'] == 'ja')
+    echo utf8_substr($day, 0, 1);
+else
+    echo utf8_substr($day, 0, 2);
+?></th>
 <?php endforeach; ?>
   </tr>
 </thead>