Changeset 3739707
- Timestamp:
- 10/11/2026 03:41:36 PM (2 weeks ago)
- Location:
- langforge
- Files:
-
- 14 edited
- 1 copied
-
tags/1.2.2 (copied) (copied from langforge/trunk )
-
tags/1.2.2/admin/class-admin.php (modified) (1 diff)
-
tags/1.2.2/assets/css/language-switcher.css (modified) (2 diffs)
-
tags/1.2.2/includes/class-forge-queue.php (modified) (11 diffs)
-
tags/1.2.2/includes/class-language-switcher.php (modified) (1 diff)
-
tags/1.2.2/langforge.php (modified) (2 diffs)
-
tags/1.2.2/languages/langforge.pot (modified) (2 diffs)
-
tags/1.2.2/readme.txt (modified) (3 diffs)
-
trunk/admin/class-admin.php (modified) (1 diff)
-
trunk/assets/css/language-switcher.css (modified) (2 diffs)
-
trunk/includes/class-forge-queue.php (modified) (11 diffs)
-
trunk/includes/class-language-switcher.php (modified) (1 diff)
-
trunk/langforge.php (modified) (2 diffs)
-
trunk/languages/langforge.pot (modified) (2 diffs)
-
trunk/readme.txt (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
langforge/tags/1.2.2/admin/class-admin.php
r3736621 r3739707 1203 1203 <div class="lf-card-head"> 1204 1204 <span class="dashicons dashicons-translation"></span> 1205 <h2><?php esc_html_e('Language Switcher', 'langforge'); ?><?php Forge_Docs_Link::render('langforge', 'adding-a-language-switcher-to-your-site', __('Language switcher', 'langforge'), __('Widget, shortcode, menu item— pick a placement.', 'langforge')); ?></h2>1205 <h2><?php esc_html_e('Language Switcher', 'langforge'); ?><?php Forge_Docs_Link::render('langforge', 'adding-a-language-switcher-to-your-site', __('Language switcher', 'langforge'), __('Widget, shortcode, template function — pick a placement.', 'langforge')); ?></h2> 1206 1206 </div> 1207 1207 <div class="lf-card-body"> -
langforge/tags/1.2.2/assets/css/language-switcher.css
r3628343 r3739707 72 72 } 73 73 74 /* Keyboard and touch: the list opens while focus is on the current language or 75 * on any entry inside it (no script needed). Kept as its own rule so a browser 76 * without :focus-within still gets the hover rule above. */ 77 .lf-dropdown > ul > li:focus-within .lf-lang-dropdown, 78 .lf-dropdown > ul > li:focus-within .wpml-ls-sub-menu { 79 display: block; 80 } 81 74 82 .lf-dropdown .lf-lang-dropdown li, 75 83 .lf-dropdown .wpml-ls-sub-menu li { … … 99 107 background: #f5f5f5 !important; 100 108 color: #111 !important; 109 } 110 111 /* Visible keyboard focus. currentColor follows the chip's colour in the theme 112 * header and the menu's dark text, so the ring reads on light and dark bars. */ 113 .lf-dropdown .lf-current-lang:focus-visible { 114 outline: 2px solid currentColor; 115 outline-offset: 2px; 116 } 117 118 .lf-language-switcher.lf-dropdown .lf-lang-dropdown a:focus-visible, 119 .lf-language-switcher.lf-dropdown .wpml-ls-sub-menu a:focus-visible { 120 background: #f5f5f5 !important; 121 color: #111 !important; 122 outline: 2px solid currentColor; 123 outline-offset: -2px; 101 124 } 102 125 -
langforge/tags/1.2.2/includes/class-forge-queue.php
r3739248 r3739707 50 50 // the broken DDL would never have run the fixed one. 51 51 const DB_VERSION = '1.0.1'; 52 // Every query below spells the table out as {$wpdb->prefix}forge_queue, so 53 // that the text handed to $wpdb is a literal a reader can check on sight; 54 // this constant names the same table for insert/update and the DDL. 52 // Everything below spells the table out as {$wpdb->prefix}forge_queue — 53 // queries, insert/update and the schema statements alike — so that 54 // what is handed to $wpdb is a literal a reader can check on sight. The 55 // constant names the same table for code outside this class. 55 56 const TABLE = 'forge_queue'; 56 57 const CRON_HOOK = 'forge_queue_process'; … … 60 61 private static $handlers = []; 61 62 private $concurrency = 5; 62 private $table;63 63 64 64 public static function instance() { … … 68 68 69 69 private function __construct() { 70 global $wpdb;71 $this->table = $wpdb->prefix . self::TABLE;72 73 70 $this->maybe_create_table(); 74 71 $this->schedule_cron(); … … 106 103 public static function dispatch($job_type, $payload, $plugin, $opts = []) { 107 104 global $wpdb; 108 $table = $wpdb->prefix . self::TABLE;109 105 110 106 $delay = intval($opts['delay'] ?? 0); … … 113 109 : current_time('mysql', true); 114 110 115 $inserted = $wpdb->insert($ table, [ // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- custom plugin table; direct query intended.111 $inserted = $wpdb->insert($wpdb->prefix . 'forge_queue', [ // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- custom plugin table; direct query intended. 116 112 'plugin' => sanitize_key($plugin), 117 113 'job_type' => sanitize_key($job_type), … … 229 225 $handler = self::$handlers[$job->job_type] ?? null; 230 226 if (!$handler) { 231 $wpdb->update($ this->table, [ // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- custom plugin table; direct query intended.227 $wpdb->update($wpdb->prefix . 'forge_queue', [ // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- custom plugin table; direct query intended. 232 228 'status' => 'failed', 233 229 'result' => 'No handler registered for: ' . $job->job_type, … … 247 243 248 244 // Success 249 $wpdb->update($ this->table, [ // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- custom plugin table; direct query intended.245 $wpdb->update($wpdb->prefix . 'forge_queue', [ // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- custom plugin table; direct query intended. 250 246 'status' => 'completed', 251 247 'result' => is_array($result) ? wp_json_encode($result) : 'ok', … … 259 255 if ($attempts >= $job->max_attempts) { 260 256 // Failed permanently 261 $wpdb->update($ this->table, [ // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- custom plugin table; direct query intended.257 $wpdb->update($wpdb->prefix . 'forge_queue', [ // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- custom plugin table; direct query intended. 262 258 'status' => 'failed', 263 259 'result' => $e->getMessage(), … … 268 264 // Retry with exponential backoff: 1m, 5m, 25m 269 265 $delay = pow(5, $attempts - 1) * 60; 270 $wpdb->update($ this->table, [ // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- custom plugin table; direct query intended.266 $wpdb->update($wpdb->prefix . 'forge_queue', [ // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- custom plugin table; direct query intended. 271 267 'status' => 'pending', 272 268 'result' => 'Retry ' . $attempts . ': ' . $e->getMessage(), … … 447 443 448 444 global $wpdb; 449 $wpdb->query( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange -- own table from $wpdb->prefix; uninstall-only 450 // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery.SchemaChange -- own table from $wpdb->prefix and a class constant; a table name cannot be a placeholder, and no user input reaches this string 451 "DROP TABLE IF EXISTS `" . $wpdb->prefix . self::TABLE . "`" 452 ); 445 $wpdb->query("DROP TABLE IF EXISTS `{$wpdb->prefix}forge_queue`"); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange -- uninstall of the last suite plugin drops the suite's own table. 453 446 454 447 return true; … … 637 630 $charset = $wpdb->get_charset_collate(); 638 631 639 // DDL for dbDelta: a table name cannot be a placeholder; it is the 640 // site's prefix and the class constant, and no request value reaches it. 641 $sql = "CREATE TABLE {$this->table} ( 632 $sql = "CREATE TABLE {$wpdb->prefix}forge_queue ( 642 633 id bigint(20) unsigned NOT NULL AUTO_INCREMENT, 643 634 plugin varchar(20) NOT NULL, -
langforge/tags/1.2.2/includes/class-language-switcher.php
r3736621 r3739707 181 181 <ul> 182 182 <li class="wpml-ls-slot-shortcode_actions wpml-ls-item wpml-ls-item-<?php echo esc_attr($current_lang); ?> wpml-ls-current-language wpml-ls-first-item wpml-ls-item-legacy-dropdown"> 183 <a href="#" class="lf-current-lang wpml-ls-link" >183 <a href="#" class="lf-current-lang wpml-ls-link" aria-haspopup="true"> 184 184 <?php if ($args['show_flags']): ?> 185 185 <?php echo wp_kses_post( $this->render_flag_for_switcher($current) ); ?> -
langforge/tags/1.2.2/langforge.php
r3739248 r3739707 4 4 * Plugin URI: https://langforgewp.com 5 5 * Description: Multilingual plugin for WordPress — language routing (4 URL formats), manual translation, language switcher, string translation, hreflang SEO, Glossary, WooCommerce, unlimited languages, REST/WP-CLI, WPML compatibility, and one-click migration. AI translation available via the Lang Forge Pro add-on. 6 * Version: 1.2. 16 * Version: 1.2.2 7 7 * Author: Avakode 8 8 * Author URI: https://avakode.com … … 19 19 } 20 20 21 define('LANGFORGE_VERSION', '1.2. 1');21 define('LANGFORGE_VERSION', '1.2.2'); 22 22 // Schema version is independent from plugin version. Bump only when one of 23 23 // the langforge_* tables changes shape; LANGFORGE_Schema::maybe_upgrade compares -
langforge/tags/1.2.2/languages/langforge.pot
r3739248 r3739707 3 3 msgid "" 4 4 msgstr "" 5 "Project-Id-Version: Lang Forge – Multilingual, Translation & hreflang SEO 1.2. 1\n"5 "Project-Id-Version: Lang Forge – Multilingual, Translation & hreflang SEO 1.2.2\n" 6 6 "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/langforge\n" 7 7 "POT-Creation-Date: 2026-10-10T11:01:48+00:00\n" … … 634 634 635 635 #: admin/class-admin.php:1205 636 msgid "Widget, shortcode, menu item— pick a placement."636 msgid "Widget, shortcode, template function — pick a placement." 637 637 msgstr "" 638 638 -
langforge/tags/1.2.2/readme.txt
r3739248 r3739707 6 6 Tested up to: 7.1 7 7 Requires PHP: 7.4 8 Stable tag: 1.2. 18 Stable tag: 1.2.2 9 9 License: GPLv2 or later 10 10 License URI: https://www.gnu.org/licenses/gpl-2.0.html … … 158 158 == Changelog == 159 159 160 = 1.2.2 = 161 * The dropdown language switcher can now be opened without a mouse. It opens when you reach it with the keyboard or tap it on a touch screen, and the language you are on shows a visible outline. Before, the list opened only on mouse hover, so keyboard and touch users could not pick a language. 162 * The Language Switcher box on the settings page no longer suggests a menu item as a placement. It names the placements that exist: widget, shortcode and template function. 163 * Needs Lang Forge Pro 1.1.4 or newer if you run the add-on, as before. 164 160 165 = 1.2.1 = 161 166 * Fixed a fatal error on sites that run WooCommerce. The 1.2.0 package from WordPress.org called a function that was not in the package, so a page with an Add to cart button, a product attribute label or WooCommerce breadcrumbs could stop with an error. If you run WooCommerce, update now. … … 274 279 275 280 281 = 1.2.2 = 282 Needs Lang Forge Pro 1.1.4 or newer if you run the add-on, as before. The dropdown language switcher now opens from the keyboard and on touch screens, not only on mouse hover. 283 276 284 = 1.2.1 = 277 285 Fixes a fatal error on sites that run WooCommerce with the 1.2.0 package from WordPress.org: update now if you run WooCommerce. Needs Lang Forge Pro 1.1.4 or newer if you run the add-on, as before. -
langforge/trunk/admin/class-admin.php
r3736621 r3739707 1203 1203 <div class="lf-card-head"> 1204 1204 <span class="dashicons dashicons-translation"></span> 1205 <h2><?php esc_html_e('Language Switcher', 'langforge'); ?><?php Forge_Docs_Link::render('langforge', 'adding-a-language-switcher-to-your-site', __('Language switcher', 'langforge'), __('Widget, shortcode, menu item— pick a placement.', 'langforge')); ?></h2>1205 <h2><?php esc_html_e('Language Switcher', 'langforge'); ?><?php Forge_Docs_Link::render('langforge', 'adding-a-language-switcher-to-your-site', __('Language switcher', 'langforge'), __('Widget, shortcode, template function — pick a placement.', 'langforge')); ?></h2> 1206 1206 </div> 1207 1207 <div class="lf-card-body"> -
langforge/trunk/assets/css/language-switcher.css
r3628343 r3739707 72 72 } 73 73 74 /* Keyboard and touch: the list opens while focus is on the current language or 75 * on any entry inside it (no script needed). Kept as its own rule so a browser 76 * without :focus-within still gets the hover rule above. */ 77 .lf-dropdown > ul > li:focus-within .lf-lang-dropdown, 78 .lf-dropdown > ul > li:focus-within .wpml-ls-sub-menu { 79 display: block; 80 } 81 74 82 .lf-dropdown .lf-lang-dropdown li, 75 83 .lf-dropdown .wpml-ls-sub-menu li { … … 99 107 background: #f5f5f5 !important; 100 108 color: #111 !important; 109 } 110 111 /* Visible keyboard focus. currentColor follows the chip's colour in the theme 112 * header and the menu's dark text, so the ring reads on light and dark bars. */ 113 .lf-dropdown .lf-current-lang:focus-visible { 114 outline: 2px solid currentColor; 115 outline-offset: 2px; 116 } 117 118 .lf-language-switcher.lf-dropdown .lf-lang-dropdown a:focus-visible, 119 .lf-language-switcher.lf-dropdown .wpml-ls-sub-menu a:focus-visible { 120 background: #f5f5f5 !important; 121 color: #111 !important; 122 outline: 2px solid currentColor; 123 outline-offset: -2px; 101 124 } 102 125 -
langforge/trunk/includes/class-forge-queue.php
r3739248 r3739707 50 50 // the broken DDL would never have run the fixed one. 51 51 const DB_VERSION = '1.0.1'; 52 // Every query below spells the table out as {$wpdb->prefix}forge_queue, so 53 // that the text handed to $wpdb is a literal a reader can check on sight; 54 // this constant names the same table for insert/update and the DDL. 52 // Everything below spells the table out as {$wpdb->prefix}forge_queue — 53 // queries, insert/update and the schema statements alike — so that 54 // what is handed to $wpdb is a literal a reader can check on sight. The 55 // constant names the same table for code outside this class. 55 56 const TABLE = 'forge_queue'; 56 57 const CRON_HOOK = 'forge_queue_process'; … … 60 61 private static $handlers = []; 61 62 private $concurrency = 5; 62 private $table;63 63 64 64 public static function instance() { … … 68 68 69 69 private function __construct() { 70 global $wpdb;71 $this->table = $wpdb->prefix . self::TABLE;72 73 70 $this->maybe_create_table(); 74 71 $this->schedule_cron(); … … 106 103 public static function dispatch($job_type, $payload, $plugin, $opts = []) { 107 104 global $wpdb; 108 $table = $wpdb->prefix . self::TABLE;109 105 110 106 $delay = intval($opts['delay'] ?? 0); … … 113 109 : current_time('mysql', true); 114 110 115 $inserted = $wpdb->insert($ table, [ // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- custom plugin table; direct query intended.111 $inserted = $wpdb->insert($wpdb->prefix . 'forge_queue', [ // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- custom plugin table; direct query intended. 116 112 'plugin' => sanitize_key($plugin), 117 113 'job_type' => sanitize_key($job_type), … … 229 225 $handler = self::$handlers[$job->job_type] ?? null; 230 226 if (!$handler) { 231 $wpdb->update($ this->table, [ // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- custom plugin table; direct query intended.227 $wpdb->update($wpdb->prefix . 'forge_queue', [ // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- custom plugin table; direct query intended. 232 228 'status' => 'failed', 233 229 'result' => 'No handler registered for: ' . $job->job_type, … … 247 243 248 244 // Success 249 $wpdb->update($ this->table, [ // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- custom plugin table; direct query intended.245 $wpdb->update($wpdb->prefix . 'forge_queue', [ // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- custom plugin table; direct query intended. 250 246 'status' => 'completed', 251 247 'result' => is_array($result) ? wp_json_encode($result) : 'ok', … … 259 255 if ($attempts >= $job->max_attempts) { 260 256 // Failed permanently 261 $wpdb->update($ this->table, [ // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- custom plugin table; direct query intended.257 $wpdb->update($wpdb->prefix . 'forge_queue', [ // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- custom plugin table; direct query intended. 262 258 'status' => 'failed', 263 259 'result' => $e->getMessage(), … … 268 264 // Retry with exponential backoff: 1m, 5m, 25m 269 265 $delay = pow(5, $attempts - 1) * 60; 270 $wpdb->update($ this->table, [ // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- custom plugin table; direct query intended.266 $wpdb->update($wpdb->prefix . 'forge_queue', [ // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching -- custom plugin table; direct query intended. 271 267 'status' => 'pending', 272 268 'result' => 'Retry ' . $attempts . ': ' . $e->getMessage(), … … 447 443 448 444 global $wpdb; 449 $wpdb->query( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange -- own table from $wpdb->prefix; uninstall-only 450 // phpcs:ignore WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQL.NotPrepared, WordPress.DB.DirectDatabaseQuery.SchemaChange -- own table from $wpdb->prefix and a class constant; a table name cannot be a placeholder, and no user input reaches this string 451 "DROP TABLE IF EXISTS `" . $wpdb->prefix . self::TABLE . "`" 452 ); 445 $wpdb->query("DROP TABLE IF EXISTS `{$wpdb->prefix}forge_queue`"); // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching, WordPress.DB.DirectDatabaseQuery.SchemaChange -- uninstall of the last suite plugin drops the suite's own table. 453 446 454 447 return true; … … 637 630 $charset = $wpdb->get_charset_collate(); 638 631 639 // DDL for dbDelta: a table name cannot be a placeholder; it is the 640 // site's prefix and the class constant, and no request value reaches it. 641 $sql = "CREATE TABLE {$this->table} ( 632 $sql = "CREATE TABLE {$wpdb->prefix}forge_queue ( 642 633 id bigint(20) unsigned NOT NULL AUTO_INCREMENT, 643 634 plugin varchar(20) NOT NULL, -
langforge/trunk/includes/class-language-switcher.php
r3736621 r3739707 181 181 <ul> 182 182 <li class="wpml-ls-slot-shortcode_actions wpml-ls-item wpml-ls-item-<?php echo esc_attr($current_lang); ?> wpml-ls-current-language wpml-ls-first-item wpml-ls-item-legacy-dropdown"> 183 <a href="#" class="lf-current-lang wpml-ls-link" >183 <a href="#" class="lf-current-lang wpml-ls-link" aria-haspopup="true"> 184 184 <?php if ($args['show_flags']): ?> 185 185 <?php echo wp_kses_post( $this->render_flag_for_switcher($current) ); ?> -
langforge/trunk/langforge.php
r3739248 r3739707 4 4 * Plugin URI: https://langforgewp.com 5 5 * Description: Multilingual plugin for WordPress — language routing (4 URL formats), manual translation, language switcher, string translation, hreflang SEO, Glossary, WooCommerce, unlimited languages, REST/WP-CLI, WPML compatibility, and one-click migration. AI translation available via the Lang Forge Pro add-on. 6 * Version: 1.2. 16 * Version: 1.2.2 7 7 * Author: Avakode 8 8 * Author URI: https://avakode.com … … 19 19 } 20 20 21 define('LANGFORGE_VERSION', '1.2. 1');21 define('LANGFORGE_VERSION', '1.2.2'); 22 22 // Schema version is independent from plugin version. Bump only when one of 23 23 // the langforge_* tables changes shape; LANGFORGE_Schema::maybe_upgrade compares -
langforge/trunk/languages/langforge.pot
r3739248 r3739707 3 3 msgid "" 4 4 msgstr "" 5 "Project-Id-Version: Lang Forge – Multilingual, Translation & hreflang SEO 1.2. 1\n"5 "Project-Id-Version: Lang Forge – Multilingual, Translation & hreflang SEO 1.2.2\n" 6 6 "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/langforge\n" 7 7 "POT-Creation-Date: 2026-10-10T11:01:48+00:00\n" … … 634 634 635 635 #: admin/class-admin.php:1205 636 msgid "Widget, shortcode, menu item— pick a placement."636 msgid "Widget, shortcode, template function — pick a placement." 637 637 msgstr "" 638 638 -
langforge/trunk/readme.txt
r3739248 r3739707 6 6 Tested up to: 7.1 7 7 Requires PHP: 7.4 8 Stable tag: 1.2. 18 Stable tag: 1.2.2 9 9 License: GPLv2 or later 10 10 License URI: https://www.gnu.org/licenses/gpl-2.0.html … … 158 158 == Changelog == 159 159 160 = 1.2.2 = 161 * The dropdown language switcher can now be opened without a mouse. It opens when you reach it with the keyboard or tap it on a touch screen, and the language you are on shows a visible outline. Before, the list opened only on mouse hover, so keyboard and touch users could not pick a language. 162 * The Language Switcher box on the settings page no longer suggests a menu item as a placement. It names the placements that exist: widget, shortcode and template function. 163 * Needs Lang Forge Pro 1.1.4 or newer if you run the add-on, as before. 164 160 165 = 1.2.1 = 161 166 * Fixed a fatal error on sites that run WooCommerce. The 1.2.0 package from WordPress.org called a function that was not in the package, so a page with an Add to cart button, a product attribute label or WooCommerce breadcrumbs could stop with an error. If you run WooCommerce, update now. … … 274 279 275 280 281 = 1.2.2 = 282 Needs Lang Forge Pro 1.1.4 or newer if you run the add-on, as before. The dropdown language switcher now opens from the keyboard and on touch screens, not only on mouse hover. 283 276 284 = 1.2.1 = 277 285 Fixes a fatal error on sites that run WooCommerce with the 1.2.0 package from WordPress.org: update now if you run WooCommerce. Needs Lang Forge Pro 1.1.4 or newer if you run the add-on, as before.
Note:
See TracChangeset
for help on using the changeset viewer.
![(please configure the [header_logo] section in trac.ini)](/chrome/site/your_project_logo.png)