Plugin Directory

Changeset 3485281


Ignore:
Timestamp:
03/18/2026 04:59:15 AM (2 weeks ago)
Author:
noricku
Message:

Deploy version 2.7.7

  • Updated to version 2.7.7
  • Package created via automated build process
  • Validated package contents and size

🤖 Automated deployment via wporg-deploy.sh

Location:
markdown-renderer-for-github/trunk
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • markdown-renderer-for-github/trunk/changelog.txt

    r3484405 r3485281  
    77
    88## [Unreleased]
     9
     10## [2.7.7] - 2026-03-18
     11### Fixed
     12- replace hardcoded 'en'/'ja' defaults with locale-aware fallback
    913
    1014## [2.7.6] - 2026-03-17
  • markdown-renderer-for-github/trunk/includes/admin/class-gfmr-settings-renderer.php

    r3484405 r3485281  
    672672     */
    673673    public function render_multilingual_default_language_field() {
    674         $options = $this->settings->get_settings();
    675         $default = $options['multilingual_default_language'] ?? 'en';
    676         $languages = $options['multilingual_supported_languages'] ?? array( 'en', 'ja' );
     674        $options   = $this->settings->get_settings();
     675        $default   = $options['multilingual_default_language'] ?? GFMR_Settings::get_locale_lang();
     676        $languages = $options['multilingual_supported_languages'] ?? array( GFMR_Settings::get_locale_lang() );
    677677        ?>
    678678        <select name="<?php echo esc_attr( GFMR_Settings::OPTION_NAME ); ?>[multilingual_default_language]">
     
    692692    public function render_multilingual_supported_languages_field() {
    693693        $options = $this->settings->get_settings();
    694         $languages = $options['multilingual_supported_languages'] ?? array( 'en', 'ja' );
     694        $languages = $options['multilingual_supported_languages'] ?? array( GFMR_Settings::get_locale_lang() );
    695695        $available_languages = array(
    696696            'en' => 'English',
     
    861861        $options   = $this->settings->get_settings();
    862862        $style     = $options['multilingual_switcher_label_style'] ?? GFMR_Language_Switcher::DEFAULT_LABEL_STYLE;
    863         $languages = array_slice( $options['multilingual_supported_languages'] ?? array( 'en', 'ja' ), 0, 2 );
     863        $languages = array_slice( $options['multilingual_supported_languages'] ?? array( GFMR_Settings::get_locale_lang() ), 0, 2 );
    864864        $flag_map  = GFMR_Language_Switcher::get_flag_map();
    865865
     
    917917    public function render_multilingual_switcher_language_order_field() {
    918918        $options    = $this->settings->get_settings();
    919         $languages  = $options['multilingual_supported_languages'] ?? array( 'en', 'ja' );
     919        $languages  = $options['multilingual_supported_languages'] ?? array( GFMR_Settings::get_locale_lang() );
    920920        $order      = $options['multilingual_switcher_language_order'] ?? array();
    921921        $flag_map   = GFMR_Language_Switcher::get_flag_map();
  • markdown-renderer-for-github/trunk/includes/admin/class-gfmr-settings-sanitizer.php

    r3484405 r3485281  
    8181        }
    8282
     83        // Retrieve old settings early for fallback logic.
     84        $old_settings = \get_option( GFMR_Settings::OPTION_NAME, array() );
     85        $locale_lang  = GFMR_Settings::get_locale_lang();
     86
    8387        // Sanitize multilingual URL settings.
    8488        $sanitized['multilingual_url_mode'] = isset( $input['multilingual_url_mode'] ) && in_array( $input['multilingual_url_mode'], array( 'query', 'path' ), true ) ? \sanitize_key( $input['multilingual_url_mode'] ) : 'path';
    8589        $sanitized['multilingual_hide_default_lang'] = ! empty( $input['multilingual_hide_default_lang'] );
    86         $sanitized['multilingual_default_language'] = isset( $input['multilingual_default_language'] ) ? \sanitize_key( $input['multilingual_default_language'] ) : 'en';
     90
     91        // Sanitize default language: input → old settings → WordPress locale.
     92        if ( isset( $input['multilingual_default_language'] ) ) {
     93            $sanitized['multilingual_default_language'] = \sanitize_key( $input['multilingual_default_language'] );
     94        } elseif ( ! empty( $old_settings['multilingual_default_language'] ) && GFMR_Settings::is_valid_language_code( $old_settings['multilingual_default_language'] ) ) {
     95            $sanitized['multilingual_default_language'] = \sanitize_key( $old_settings['multilingual_default_language'] );
     96        } else {
     97            $sanitized['multilingual_default_language'] = $locale_lang;
     98        }
     99
    87100        $sanitized['multilingual_hreflang_enabled'] = ! empty( $input['multilingual_hreflang_enabled'] );
    88101        $sanitized['multilingual_redirect_query'] = ! empty( $input['multilingual_redirect_query'] );
    89102
    90         // Sanitize supported languages array.
    91         if ( isset( $input['multilingual_supported_languages'] ) && is_array( $input['multilingual_supported_languages'] ) ) {
    92             $sanitized_languages = array();
    93             foreach ( $input['multilingual_supported_languages'] as $lang ) {
    94                 $lang = \sanitize_key( $lang );
    95                 if ( preg_match( '/^[a-z]{2}$/', $lang ) ) {
    96                     $sanitized_languages[] = $lang;
    97                 }
    98             }
    99             // Ensure at least one language is selected.
    100             $sanitized['multilingual_supported_languages'] = ! empty( $sanitized_languages ) ? array_values( array_unique( $sanitized_languages ) ) : array( 'en' );
     103        // Sanitize supported languages: input → old settings → WordPress locale.
     104        $old_languages = $this->sanitize_language_array( $old_settings['multilingual_supported_languages'] ?? array() );
     105        $input_languages = ( isset( $input['multilingual_supported_languages'] ) && is_array( $input['multilingual_supported_languages'] ) )
     106            ? array_unique( $this->sanitize_language_array( $input['multilingual_supported_languages'] ) )
     107            : array();
     108
     109        if ( ! empty( $input_languages ) ) {
     110            $sanitized['multilingual_supported_languages'] = $input_languages;
     111        } elseif ( ! empty( $old_languages ) ) {
     112            $sanitized['multilingual_supported_languages'] = $old_languages;
    101113        } else {
    102             $sanitized['multilingual_supported_languages'] = array( 'en', 'ja' );
     114            $sanitized['multilingual_supported_languages'] = array( $locale_lang );
    103115        }
    104116
    105117        // Schedule rewrite rules flush when rewrite-affecting settings change.
    106         $old_settings           = \get_option( GFMR_Settings::OPTION_NAME, array() );
    107118        $rewrite_affecting_keys = array(
    108119            'multilingual_url_mode',
     
    146157        }
    147158
     159        // Ensure default language is included in supported languages.
     160        if ( ! in_array( $sanitized['multilingual_default_language'], $sanitized['multilingual_supported_languages'], true ) ) {
     161            array_unshift( $sanitized['multilingual_supported_languages'], $sanitized['multilingual_default_language'] );
     162        }
     163
    148164        // Sanitize PlantUML settings.
    149165        $sanitized['plantuml_enabled']              = ! empty( $input['plantuml_enabled'] );
     
    152168        return $sanitized;
    153169    }
     170
     171    /**
     172     * Sanitize and validate an array of language codes
     173     *
     174     * @param mixed $languages Raw language array (or null/non-array).
     175     * @return array Validated 2-letter language codes, or empty array.
     176     */
     177    private function sanitize_language_array( $languages ) {
     178        if ( ! is_array( $languages ) ) {
     179            return array();
     180        }
     181
     182        return array_values(
     183            array_filter(
     184                array_map( '\\sanitize_key', $languages ),
     185                array( GFMR_Settings::class, 'is_valid_language_code' )
     186            )
     187        );
     188    }
    154189}
  • markdown-renderer-for-github/trunk/includes/admin/class-gfmr-settings.php

    r3484405 r3485281  
    6969
    7070    /**
     71     * Cached locale language code (memoized per request)
     72     *
     73     * @var string|null
     74     */
     75    private static $locale_lang_cache = null;
     76
     77    /**
    7178     * Option name for theme settings
    7279     */
     
    182189
    183190    /**
     191     * Get 2-letter language code from WordPress locale
     192     *
     193     * @return string 2-letter language code (e.g. 'en', 'ja'), falls back to 'en'
     194     */
     195    public static function get_locale_lang() {
     196        if ( null !== self::$locale_lang_cache ) {
     197            return self::$locale_lang_cache;
     198        }
     199        $lang                    = strtolower( substr( \get_locale(), 0, 2 ) );
     200        self::$locale_lang_cache = self::is_valid_language_code( $lang ) ? $lang : 'en';
     201        return self::$locale_lang_cache;
     202    }
     203
     204    /**
     205     * Validate a 2-letter language code
     206     *
     207     * Checks structure only (2 alpha characters). Callers are responsible for
     208     * normalizing case via sanitize_key() when storing values.
     209     *
     210     * @param mixed $lang Language code to validate.
     211     * @return bool True if valid 2-letter alpha code.
     212     */
     213    public static function is_valid_language_code( $lang ) {
     214        if ( ! is_string( $lang ) ) {
     215            return false;
     216        }
     217        return (bool) preg_match( '/^[a-zA-Z]{2}$/', $lang );
     218    }
     219
     220    /**
    184221     * Get default settings
    185222     *
     
    187224     */
    188225    public function get_default_settings() {
    189         $locale = \get_locale();
    190         $default_lang = substr( $locale, 0, 2 );
     226        $default_lang = self::get_locale_lang();
    191227
    192228        return array(
     
    216252            'multilingual_hide_default_lang'       => true,
    217253            'multilingual_default_language'        => $default_lang,
    218             'multilingual_supported_languages'     => array( 'en', 'ja' ),
     254            'multilingual_supported_languages'     => 'en' === $default_lang ? array( 'en' ) : array( 'en', $default_lang ),
    219255            'multilingual_hreflang_enabled'        => true,
    220256            'multilingual_redirect_query'          => true,
     
    498534    public static function reset_instance_for_testing() {
    499535        if ( defined( 'WP_TESTS_DOMAIN' ) ) {
    500             self::$instance = null;
    501             self::$hooks_registered = false;
     536            self::$instance          = null;
     537            self::$hooks_registered  = false;
     538            self::$locale_lang_cache = null;
    502539        }
    503540    }
  • markdown-renderer-for-github/trunk/includes/multilingual/class-gfmr-url-rewriter.php

    r3484405 r3485281  
    272272     */
    273273    public function get_supported_languages() {
    274         $settings = $this->settings->get_settings();
    275         $languages = $settings['multilingual_supported_languages'] ?? array( 'en', 'ja' );
     274        $settings  = $this->settings->get_settings();
     275        $languages = $settings['multilingual_supported_languages'] ?? array();
    276276
    277277        // Validate and sanitize language codes
    278278        $valid_languages = array();
    279279        foreach ( (array) $languages as $lang ) {
    280             $lang = sanitize_key( $lang );
    281             if ( preg_match( '/^[a-z]{2}$/', $lang ) ) {
    282                 $valid_languages[] = $lang;
     280            if ( GFMR_Settings::is_valid_language_code( $lang ) ) {
     281                $valid_languages[] = sanitize_key( $lang );
    283282            }
    284283        }
    285284
    286         return $valid_languages ? $valid_languages : array( 'en' );
     285        return $valid_languages ? $valid_languages : array( GFMR_Settings::get_locale_lang() );
    287286    }
    288287
     
    294293    public function get_default_language() {
    295294        $settings = $this->settings->get_settings();
    296         $default = $settings['multilingual_default_language'] ?? '';
     295        $default  = $settings['multilingual_default_language'] ?? '';
    297296
    298297        // Fallback to WordPress locale
    299298        if ( ! $default ) {
    300             $locale = get_locale();
    301             $default = substr( $locale, 0, 2 );
     299            return GFMR_Settings::get_locale_lang();
    302300        }
    303301
  • markdown-renderer-for-github/trunk/includes/rendering/class-gfmr-block-registry.php

    r3484405 r3485281  
    278278        // For Pro version: includes/core/ is a symlink to Free version
    279279        // Use realpath() to resolve actual Free version path and reference languages from there
     280        // Note: __DIR__ = includes/rendering/ (2 levels deep from plugin root)
    280281        if ( defined( 'GFMR_PRO_VERSION' ) ) {
    281282            $real_includes_dir = realpath( __DIR__ );
    282             $languages_path    = dirname( $real_includes_dir ) . '/languages';
     283            $languages_path    = dirname( $real_includes_dir, 2 ) . '/languages';
     284            // Fallback: if symlink-resolved path doesn't contain languages dir,
     285            // try the standard Free version plugin directory
     286            if ( ! is_dir( $languages_path ) ) {
     287                $languages_path = WP_PLUGIN_DIR . '/markdown-renderer-for-github/languages';
     288            }
    283289        } else {
    284290            $languages_path = plugin_dir_path( GFMR_PLUGIN_FILE ) . 'languages';
     291        }
     292
     293        if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
     294            $this->log_debug( 'i18n languages_path: ' . $languages_path );
    285295        }
    286296
  • markdown-renderer-for-github/trunk/markdown-renderer-for-github.php

    r3484405 r3485281  
    44 * Plugin URI:        https://github.com/wakalab/markdown-renderer-for-github
    55 * Description:       Renders GFM (GitHub Flavored Markdown) content beautifully on the front end using JavaScript libraries. It supports syntax highlighting for code blocks and diagram rendering with Mermaid.js.
    6  * Version:           2.7.6
     6 * Version:           2.7.7
    77 * Requires at least: 6.5
    88 * Requires PHP:      8.2
  • markdown-renderer-for-github/trunk/readme.txt

    r3484405 r3485281  
    66Tested up to: 6.9.4
    77Requires PHP: 8.2
    8 Stable tag: 2.7.6
     8Stable tag: 2.7.7
    99License: GPLv2 or later
    1010License URI: https://www.gnu.org/licenses/gpl-2.0.html
     
    142142
    143143== Changelog ==
     144
     145= 2.7.7 =
     146* replace hardcoded 'en'/'ja' defaults with locale-aware fallback
    144147
    145148= 2.7.6 =
     
    297300* Add comprehensive test suite for hasMathContent detection
    298301
    299 = 1.14.0 =
    300 * Optimize test execution time and fix WordPress tests
    301 * improve code quality and PHPCS compliance
    302 * Fix security audit script errors
    303 * Replace non-existent WordPress-Security with WordPress-Extra
    304 * Remove visual empty lines in diff code blocks on frontend
    305 * Update prefix policy backward compatibility note
    306 * Add comprehensive unit tests for applyDiffHighlighting
    307 
    308302== Upgrade Notice ==
    309303
Note: See TracChangeset for help on using the changeset viewer.