Plugin Directory

Changeset 3739707


Ignore:
Timestamp:
10/11/2026 03:41:36 PM (2 weeks ago)
Author:
avakodeforge
Message:

Release 1.2.2 (trunk + tag; see readme changelog)

Location:
langforge
Files:
14 edited
1 copied

Legend:

Unmodified
Added
Removed
  • langforge/tags/1.2.2/admin/class-admin.php

    r3736621 r3739707  
    12031203                    <div class="lf-card-head">
    12041204                        <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>
    12061206                    </div>
    12071207                    <div class="lf-card-body">
  • langforge/tags/1.2.2/assets/css/language-switcher.css

    r3628343 r3739707  
    7272}
    7373
     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
    7482.lf-dropdown .lf-lang-dropdown li,
    7583.lf-dropdown .wpml-ls-sub-menu li {
    … …  
    99107    background: #f5f5f5 !important;
    100108    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;
    101124}
    102125
  • langforge/tags/1.2.2/includes/class-forge-queue.php

    r3739248 r3739707  
    5050    // the broken DDL would never have run the fixed one.
    5151    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.
    5556    const TABLE = 'forge_queue';
    5657    const CRON_HOOK = 'forge_queue_process';
    … …  
    6061    private static $handlers = [];
    6162    private $concurrency = 5;
    62     private $table;
    6363
    6464    public static function instance() {
    … …  
    6868
    6969    private function __construct() {
    70         global $wpdb;
    71         $this->table = $wpdb->prefix . self::TABLE;
    72 
    7370        $this->maybe_create_table();
    7471        $this->schedule_cron();
    … …  
    106103    public static function dispatch($job_type, $payload, $plugin, $opts = []) {
    107104        global $wpdb;
    108         $table = $wpdb->prefix . self::TABLE;
    109105
    110106        $delay = intval($opts['delay'] ?? 0);
    … …  
    113109            : current_time('mysql', true);
    114110
    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.
    116112            'plugin'       => sanitize_key($plugin),
    117113            'job_type'     => sanitize_key($job_type),
    … …  
    229225        $handler = self::$handlers[$job->job_type] ?? null;
    230226        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.
    232228                'status' => 'failed',
    233229                'result' => 'No handler registered for: ' . $job->job_type,
    … …  
    247243
    248244            // 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.
    250246                'status'       => 'completed',
    251247                'result'       => is_array($result) ? wp_json_encode($result) : 'ok',
    … …  
    259255            if ($attempts >= $job->max_attempts) {
    260256                // 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.
    262258                    'status'       => 'failed',
    263259                    'result'       => $e->getMessage(),
    … …  
    268264                // Retry with exponential backoff: 1m, 5m, 25m
    269265                $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.
    271267                    'status'       => 'pending',
    272268                    'result'       => 'Retry ' . $attempts . ': ' . $e->getMessage(),
    … …  
    447443
    448444        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.
    453446
    454447        return true;
    … …  
    637630        $charset = $wpdb->get_charset_collate();
    638631
    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 (
    642633            id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
    643634            plugin varchar(20) NOT NULL,
  • langforge/tags/1.2.2/includes/class-language-switcher.php

    r3736621 r3739707  
    181181            <ul>
    182182                <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">
    184184                        <?php if ($args['show_flags']): ?>
    185185                            <?php echo wp_kses_post( $this->render_flag_for_switcher($current) ); ?>
  • langforge/tags/1.2.2/langforge.php

    r3739248 r3739707  
    44 * Plugin URI: https://langforgewp.com
    55 * 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.1
     6 * Version: 1.2.2
    77 * Author: Avakode
    88 * Author URI: https://avakode.com
    … …  
    1919}
    2020
    21 define('LANGFORGE_VERSION', '1.2.1');
     21define('LANGFORGE_VERSION', '1.2.2');
    2222// Schema version is independent from plugin version. Bump only when one of
    2323// the langforge_* tables changes shape; LANGFORGE_Schema::maybe_upgrade compares
  • langforge/tags/1.2.2/languages/langforge.pot

    r3739248 r3739707  
    33msgid ""
    44msgstr ""
    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"
    66"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/langforge\n"
    77"POT-Creation-Date: 2026-10-10T11:01:48+00:00\n"
    … …  
    634634
    635635#: admin/class-admin.php:1205
    636 msgid "Widget, shortcode, menu item — pick a placement."
     636msgid "Widget, shortcode, template function — pick a placement."
    637637msgstr ""
    638638
  • langforge/tags/1.2.2/readme.txt

    r3739248 r3739707  
    66Tested up to: 7.1
    77Requires PHP: 7.4
    8 Stable tag: 1.2.1
     8Stable tag: 1.2.2
    99License: GPLv2 or later
    1010License URI: https://www.gnu.org/licenses/gpl-2.0.html
    … …  
    158158== Changelog ==
    159159
     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
    160165= 1.2.1 =
    161166* 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.
    … …  
    274279
    275280
     281= 1.2.2 =
     282Needs 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
    276284= 1.2.1 =
    277285Fixes 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  
    12031203                    <div class="lf-card-head">
    12041204                        <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>
    12061206                    </div>
    12071207                    <div class="lf-card-body">
  • langforge/trunk/assets/css/language-switcher.css

    r3628343 r3739707  
    7272}
    7373
     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
    7482.lf-dropdown .lf-lang-dropdown li,
    7583.lf-dropdown .wpml-ls-sub-menu li {
    … …  
    99107    background: #f5f5f5 !important;
    100108    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;
    101124}
    102125
  • langforge/trunk/includes/class-forge-queue.php

    r3739248 r3739707  
    5050    // the broken DDL would never have run the fixed one.
    5151    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.
    5556    const TABLE = 'forge_queue';
    5657    const CRON_HOOK = 'forge_queue_process';
    … …  
    6061    private static $handlers = [];
    6162    private $concurrency = 5;
    62     private $table;
    6363
    6464    public static function instance() {
    … …  
    6868
    6969    private function __construct() {
    70         global $wpdb;
    71         $this->table = $wpdb->prefix . self::TABLE;
    72 
    7370        $this->maybe_create_table();
    7471        $this->schedule_cron();
    … …  
    106103    public static function dispatch($job_type, $payload, $plugin, $opts = []) {
    107104        global $wpdb;
    108         $table = $wpdb->prefix . self::TABLE;
    109105
    110106        $delay = intval($opts['delay'] ?? 0);
    … …  
    113109            : current_time('mysql', true);
    114110
    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.
    116112            'plugin'       => sanitize_key($plugin),
    117113            'job_type'     => sanitize_key($job_type),
    … …  
    229225        $handler = self::$handlers[$job->job_type] ?? null;
    230226        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.
    232228                'status' => 'failed',
    233229                'result' => 'No handler registered for: ' . $job->job_type,
    … …  
    247243
    248244            // 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.
    250246                'status'       => 'completed',
    251247                'result'       => is_array($result) ? wp_json_encode($result) : 'ok',
    … …  
    259255            if ($attempts >= $job->max_attempts) {
    260256                // 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.
    262258                    'status'       => 'failed',
    263259                    'result'       => $e->getMessage(),
    … …  
    268264                // Retry with exponential backoff: 1m, 5m, 25m
    269265                $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.
    271267                    'status'       => 'pending',
    272268                    'result'       => 'Retry ' . $attempts . ': ' . $e->getMessage(),
    … …  
    447443
    448444        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.
    453446
    454447        return true;
    … …  
    637630        $charset = $wpdb->get_charset_collate();
    638631
    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 (
    642633            id bigint(20) unsigned NOT NULL AUTO_INCREMENT,
    643634            plugin varchar(20) NOT NULL,
  • langforge/trunk/includes/class-language-switcher.php

    r3736621 r3739707  
    181181            <ul>
    182182                <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">
    184184                        <?php if ($args['show_flags']): ?>
    185185                            <?php echo wp_kses_post( $this->render_flag_for_switcher($current) ); ?>
  • langforge/trunk/langforge.php

    r3739248 r3739707  
    44 * Plugin URI: https://langforgewp.com
    55 * 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.1
     6 * Version: 1.2.2
    77 * Author: Avakode
    88 * Author URI: https://avakode.com
    … …  
    1919}
    2020
    21 define('LANGFORGE_VERSION', '1.2.1');
     21define('LANGFORGE_VERSION', '1.2.2');
    2222// Schema version is independent from plugin version. Bump only when one of
    2323// the langforge_* tables changes shape; LANGFORGE_Schema::maybe_upgrade compares
  • langforge/trunk/languages/langforge.pot

    r3739248 r3739707  
    33msgid ""
    44msgstr ""
    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"
    66"Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/langforge\n"
    77"POT-Creation-Date: 2026-10-10T11:01:48+00:00\n"
    … …  
    634634
    635635#: admin/class-admin.php:1205
    636 msgid "Widget, shortcode, menu item — pick a placement."
     636msgid "Widget, shortcode, template function — pick a placement."
    637637msgstr ""
    638638
  • langforge/trunk/readme.txt

    r3739248 r3739707  
    66Tested up to: 7.1
    77Requires PHP: 7.4
    8 Stable tag: 1.2.1
     8Stable tag: 1.2.2
    99License: GPLv2 or later
    1010License URI: https://www.gnu.org/licenses/gpl-2.0.html
    … …  
    158158== Changelog ==
    159159
     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
    160165= 1.2.1 =
    161166* 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.
    … …  
    274279
    275280
     281= 1.2.2 =
     282Needs 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
    276284= 1.2.1 =
    277285Fixes 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.