Index: lang/php/Date_Holidays_Driver_Japanese/src/Date/Holidays/Driver/Japanese.php
===================================================================
--- lang/php/Date_Holidays_Driver_Japanese/src/Date/Holidays/Driver/Japanese.php (revision 11235)
+++ lang/php/Date_Holidays_Driver_Japanese/src/Date/Holidays/Driver/Japanese.php (revision 11402)
@@ -101,9 +101,16 @@
 {
     /**
-     * an array of substitute holidays
+     * a translation file name
      *
      * @access  private
      */
-    var $_substituteHolidays = array();
+    var $_translationFile = null;
+
+    /**
+     * a translation locale
+     *
+     * @access  private
+     */
+    var $_translationLocale = null;
 
     /**
@@ -129,4 +136,6 @@
     {
         parent::_buildHolidays();
+
+        $this->_clearHolidays();
 
         $this->_buildNewYearsDay();
@@ -505,9 +514,4 @@
     function _buildSubstituteHolidays()
     {
-        // remove 'previous' substitute holidays
-        foreach ($this->_substituteHolidays as $internalName) {
-            $this->_removeHoliday($internalName);
-        }
-
         // calculate 'current' substitute holidays
         foreach ($this->_dates as $internalName => $date) {
@@ -527,5 +531,4 @@
                 if (!is_null($date)) {
                     $name = 'substituteHolidayFor' . $internalName;
-                    $this->_substituteHolidays[] = $name;
                     $this->_addHoliday($name,
                                        $date,
@@ -534,4 +537,10 @@
                 }
             }
+        }
+
+        // reset translated titles if set.
+        // because substitute Holidays change each year.
+        if (!is_null($this->_translationFile)) {
+            $this->addTranslationFile($this->_translationFile, $this->_translationLocale);
         }
     }
@@ -567,5 +576,68 @@
         return $date;
     }
+
+    /**
+     * Add a language-file's content
+     *
+     * The language-file's content will be parsed and translations,
+     * properties, etc. for holidays will be made available with the specified
+     * locale.
+     *
+     * @param string $file   filename of the language file
+     * @param string $locale locale-code of the translation
+     *
+     * @access   public
+     * @return   boolean true on success, otherwise a PEAR_ErrorStack object
+     * @throws   object PEAR_Errorstack
+     */
+    function addTranslationFile($file, $locale)
+    {
+        $result = parent::addTranslationFile($file, $locale);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        $this->_translationFile = $file;
+        $this->_translationLocale = $locale;
+        return $result;
+    }
+
+    /**
+     * Add a compiled language-file's content
+     *
+     * The language-file's content will be unserialized and translations,
+     * properties, etc. for holidays will be made available with the
+     * specified locale.
+     *
+     * @param string $file   filename of the compiled language file
+     * @param string $locale locale-code of the translation
+     *
+     * @access   public
+     * @return   boolean true on success, otherwise a PEAR_ErrorStack object
+     * @throws   object PEAR_Errorstack
+     */
+    function addCompiledTranslationFile($file, $locale)
+    {
+        $result = parent::addCompiledTranslationFile($file, $locale);
+        if (PEAR::isError($result)) {
+            return $result;
+        }
+        $this->_translationFile = $file;
+        $this->_translationLocale = $locale;
+        return $result;
+    }
+
+    /**
+     * clear all holidays
+     *
+     * @access   private
+     * @return   void
+     */
+    function _clearHolidays()
+    {
+        $this->_holidays = array();
+        $this->_internalNames = array();
+        $this->_dates = array();
+        $this->_titles = array();
+    }
 }
 ?>
-
