Changeset 3485281
- Timestamp:
- 03/18/2026 04:59:15 AM (2 weeks ago)
- Location:
- markdown-renderer-for-github/trunk
- Files:
-
- 8 edited
-
changelog.txt (modified) (1 diff)
-
includes/admin/class-gfmr-settings-renderer.php (modified) (4 diffs)
-
includes/admin/class-gfmr-settings-sanitizer.php (modified) (3 diffs)
-
includes/admin/class-gfmr-settings.php (modified) (5 diffs)
-
includes/multilingual/class-gfmr-url-rewriter.php (modified) (2 diffs)
-
includes/rendering/class-gfmr-block-registry.php (modified) (1 diff)
-
markdown-renderer-for-github.php (modified) (1 diff)
-
readme.txt (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
markdown-renderer-for-github/trunk/changelog.txt
r3484405 r3485281 7 7 8 8 ## [Unreleased] 9 10 ## [2.7.7] - 2026-03-18 11 ### Fixed 12 - replace hardcoded 'en'/'ja' defaults with locale-aware fallback 9 13 10 14 ## [2.7.6] - 2026-03-17 -
markdown-renderer-for-github/trunk/includes/admin/class-gfmr-settings-renderer.php
r3484405 r3485281 672 672 */ 673 673 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() ); 677 677 ?> 678 678 <select name="<?php echo esc_attr( GFMR_Settings::OPTION_NAME ); ?>[multilingual_default_language]"> … … 692 692 public function render_multilingual_supported_languages_field() { 693 693 $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() ); 695 695 $available_languages = array( 696 696 'en' => 'English', … … 861 861 $options = $this->settings->get_settings(); 862 862 $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 ); 864 864 $flag_map = GFMR_Language_Switcher::get_flag_map(); 865 865 … … 917 917 public function render_multilingual_switcher_language_order_field() { 918 918 $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() ); 920 920 $order = $options['multilingual_switcher_language_order'] ?? array(); 921 921 $flag_map = GFMR_Language_Switcher::get_flag_map(); -
markdown-renderer-for-github/trunk/includes/admin/class-gfmr-settings-sanitizer.php
r3484405 r3485281 81 81 } 82 82 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 83 87 // Sanitize multilingual URL settings. 84 88 $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'; 85 89 $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 87 100 $sanitized['multilingual_hreflang_enabled'] = ! empty( $input['multilingual_hreflang_enabled'] ); 88 101 $sanitized['multilingual_redirect_query'] = ! empty( $input['multilingual_redirect_query'] ); 89 102 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; 101 113 } else { 102 $sanitized['multilingual_supported_languages'] = array( 'en', 'ja');114 $sanitized['multilingual_supported_languages'] = array( $locale_lang ); 103 115 } 104 116 105 117 // Schedule rewrite rules flush when rewrite-affecting settings change. 106 $old_settings = \get_option( GFMR_Settings::OPTION_NAME, array() );107 118 $rewrite_affecting_keys = array( 108 119 'multilingual_url_mode', … … 146 157 } 147 158 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 148 164 // Sanitize PlantUML settings. 149 165 $sanitized['plantuml_enabled'] = ! empty( $input['plantuml_enabled'] ); … … 152 168 return $sanitized; 153 169 } 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 } 154 189 } -
markdown-renderer-for-github/trunk/includes/admin/class-gfmr-settings.php
r3484405 r3485281 69 69 70 70 /** 71 * Cached locale language code (memoized per request) 72 * 73 * @var string|null 74 */ 75 private static $locale_lang_cache = null; 76 77 /** 71 78 * Option name for theme settings 72 79 */ … … 182 189 183 190 /** 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 /** 184 221 * Get default settings 185 222 * … … 187 224 */ 188 225 public function get_default_settings() { 189 $locale = \get_locale(); 190 $default_lang = substr( $locale, 0, 2 ); 226 $default_lang = self::get_locale_lang(); 191 227 192 228 return array( … … 216 252 'multilingual_hide_default_lang' => true, 217 253 '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 ), 219 255 'multilingual_hreflang_enabled' => true, 220 256 'multilingual_redirect_query' => true, … … 498 534 public static function reset_instance_for_testing() { 499 535 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; 502 539 } 503 540 } -
markdown-renderer-for-github/trunk/includes/multilingual/class-gfmr-url-rewriter.php
r3484405 r3485281 272 272 */ 273 273 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(); 276 276 277 277 // Validate and sanitize language codes 278 278 $valid_languages = array(); 279 279 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 ); 283 282 } 284 283 } 285 284 286 return $valid_languages ? $valid_languages : array( 'en');285 return $valid_languages ? $valid_languages : array( GFMR_Settings::get_locale_lang() ); 287 286 } 288 287 … … 294 293 public function get_default_language() { 295 294 $settings = $this->settings->get_settings(); 296 $default = $settings['multilingual_default_language'] ?? '';295 $default = $settings['multilingual_default_language'] ?? ''; 297 296 298 297 // Fallback to WordPress locale 299 298 if ( ! $default ) { 300 $locale = get_locale(); 301 $default = substr( $locale, 0, 2 ); 299 return GFMR_Settings::get_locale_lang(); 302 300 } 303 301 -
markdown-renderer-for-github/trunk/includes/rendering/class-gfmr-block-registry.php
r3484405 r3485281 278 278 // For Pro version: includes/core/ is a symlink to Free version 279 279 // Use realpath() to resolve actual Free version path and reference languages from there 280 // Note: __DIR__ = includes/rendering/ (2 levels deep from plugin root) 280 281 if ( defined( 'GFMR_PRO_VERSION' ) ) { 281 282 $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 } 283 289 } else { 284 290 $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 ); 285 295 } 286 296 -
markdown-renderer-for-github/trunk/markdown-renderer-for-github.php
r3484405 r3485281 4 4 * Plugin URI: https://github.com/wakalab/markdown-renderer-for-github 5 5 * 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. 66 * Version: 2.7.7 7 7 * Requires at least: 6.5 8 8 * Requires PHP: 8.2 -
markdown-renderer-for-github/trunk/readme.txt
r3484405 r3485281 6 6 Tested up to: 6.9.4 7 7 Requires PHP: 8.2 8 Stable tag: 2.7. 68 Stable tag: 2.7.7 9 9 License: GPLv2 or later 10 10 License URI: https://www.gnu.org/licenses/gpl-2.0.html … … 142 142 143 143 == Changelog == 144 145 = 2.7.7 = 146 * replace hardcoded 'en'/'ja' defaults with locale-aware fallback 144 147 145 148 = 2.7.6 = … … 297 300 * Add comprehensive test suite for hasMathContent detection 298 301 299 = 1.14.0 =300 * Optimize test execution time and fix WordPress tests301 * improve code quality and PHPCS compliance302 * Fix security audit script errors303 * Replace non-existent WordPress-Security with WordPress-Extra304 * Remove visual empty lines in diff code blocks on frontend305 * Update prefix policy backward compatibility note306 * Add comprehensive unit tests for applyDiffHighlighting307 308 302 == Upgrade Notice == 309 303
Note: See TracChangeset
for help on using the changeset viewer.