From 171e2be4278e0cdccb26602404f7b6d568d49ae0 Mon Sep 17 00:00:00 2001 From: Giovanni Cascione Date: Tue, 9 May 2023 00:41:07 +0200 Subject: [PATCH 1/3] SLUGS: fix language autodetection --- src/init.php | 2 ++ src/modules/module_loader.php | 20 ++++++++++++++++++++ src/modules/slugs/early_hooks.php | 27 +++++++++++++++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 src/modules/slugs/early_hooks.php diff --git a/src/init.php b/src/init.php index 0cf1bac7..0ac471ef 100644 --- a/src/init.php +++ b/src/init.php @@ -82,6 +82,8 @@ function qtranxf_init_language(): void { $url_info['language'] = qtranxf_detect_language( $url_info ); $q_config['language'] = apply_filters( 'qtranslate_language', $url_info['language'], $url_info ); + QTX_Module_Loader::load_active_modules_early_hooks(); + assert( isset( $q_config['url_info']['doing_front_end'] ) ); if ( $q_config['url_info']['doing_front_end'] && qtranxf_can_redirect() ) { qtranxf_check_url_maybe_redirect( $url_info ); diff --git a/src/modules/module_loader.php b/src/modules/module_loader.php index c0ccd0ec..48080430 100644 --- a/src/modules/module_loader.php +++ b/src/modules/module_loader.php @@ -39,4 +39,24 @@ public static function load_active_modules(): void { } } } + + /** + * Loads early hooks from modules previously activated in the options. + * + * Attention! This assumes the current states stored in the options are valid. + * This doesn't perform any check, neither on the plugin conditions nor the folder structure. + * In the worst case the state can be refreshed by reactivating the plugin. + * + * Note also the modules should be loaded before "qtranslate_init_language" is triggered. + */ + public static function load_active_modules_early_hooks(): void { + $modules_state = get_option( QTX_OPTIONS_MODULES_STATE, array() ); + + foreach ( $modules_state as $module_id => $state ) { + $target = QTRANSLATE_DIR . '/src/modules/' . $module_id . '/' . 'early_hooks.php'; + if ( $state === QTX_MODULE_STATE_ACTIVE && file_exists( $target ) ) { + require_once( $target ); + } + } + } } diff --git a/src/modules/slugs/early_hooks.php b/src/modules/slugs/early_hooks.php new file mode 100644 index 00000000..c6083d6c --- /dev/null +++ b/src/modules/slugs/early_hooks.php @@ -0,0 +1,27 @@ + Date: Tue, 5 Mar 2024 01:05:47 +0100 Subject: [PATCH 2/3] Fix site url redirection when default language is hidden --- src/modules/slugs/early_hooks.php | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/src/modules/slugs/early_hooks.php b/src/modules/slugs/early_hooks.php index c6083d6c..d58da5fa 100644 --- a/src/modules/slugs/early_hooks.php +++ b/src/modules/slugs/early_hooks.php @@ -3,7 +3,7 @@ add_filter( 'qtranslate_language_detect_redirect', 'qtranxf_slugs_language_detect_redirect', 600, 3 ); /** -* Allows url redirection due to language auto detection only if site url has been requested +* Disables all redirections except when site url is requested, if default language is hidden. In this case url is redirected to default language site url. * * @see qtranxf_check_url_maybe_redirect * @param string $url_lang proposed target URL for the active language to redirect to. @@ -14,14 +14,23 @@ */ function qtranxf_slugs_language_detect_redirect($url_lang, $url_orig, $url_info): string { global $q_config; - if (site_url().'/' === $url_orig) - return $url_lang; - else { - if ( empty( $url_info['lang_url'] ) ){ - return qtranxf_convertURL( $url_orig, $q_config['default_language'],false,true ); - } else { - return $url_orig; - } - } -} + if ( ( site_url().'/' === $url_orig && $q_config['hide_default_language'] ) || empty( $url_info['lang_url'] ) ){ + + $url_res = qtranxf_convertURL( $url_orig, $q_config['default_language'],false,true ); + + if ( qtranxf_detect_language_front( $url_info ) != $q_config['default_language'] ) { + + if ( $url_info['cookie_front_or_admin_found'] ) + qtranxf_set_language_cookie( $q_config['default_language'] ); + + if ( $url_res == $url_orig ) + $q_config['url_info'] = qtranxf_url_set_language( $urlinfo, $q_config['default_language'], $showLanguage ); + + } + + } else + $url_res = $url_orig; + + return $url_res; +} From 8c9fc822a465efb3411a89d90082e7ed4cad39e3 Mon Sep 17 00:00:00 2001 From: Giovanni Cascione Date: Mon, 18 Mar 2024 17:18:09 +0100 Subject: [PATCH 3/3] Fix switch to default language from site url --- src/modules/slugs/early_hooks.php | 35 +++++++++++++------------------ 1 file changed, 15 insertions(+), 20 deletions(-) diff --git a/src/modules/slugs/early_hooks.php b/src/modules/slugs/early_hooks.php index d58da5fa..56d6249e 100644 --- a/src/modules/slugs/early_hooks.php +++ b/src/modules/slugs/early_hooks.php @@ -3,7 +3,9 @@ add_filter( 'qtranslate_language_detect_redirect', 'qtranxf_slugs_language_detect_redirect', 600, 3 ); /** -* Disables all redirections except when site url is requested, if default language is hidden. In this case url is redirected to default language site url. +* Disables default redirection when language is not detectable from url (e.g. default language url with hide_default_language activated). +* Exception is made for site_url(), for which language detection feature is preserved. +* * * @see qtranxf_check_url_maybe_redirect * @param string $url_lang proposed target URL for the active language to redirect to. @@ -14,23 +16,16 @@ */ function qtranxf_slugs_language_detect_redirect($url_lang, $url_orig, $url_info): string { global $q_config; - - if ( ( site_url().'/' === $url_orig && $q_config['hide_default_language'] ) || empty( $url_info['lang_url'] ) ){ - - $url_res = qtranxf_convertURL( $url_orig, $q_config['default_language'],false,true ); - - if ( qtranxf_detect_language_front( $url_info ) != $q_config['default_language'] ) { - - if ( $url_info['cookie_front_or_admin_found'] ) - qtranxf_set_language_cookie( $q_config['default_language'] ); - - if ( $url_res == $url_orig ) - $q_config['url_info'] = qtranxf_url_set_language( $urlinfo, $q_config['default_language'], $showLanguage ); - - } - - } else - $url_res = $url_orig; - - return $url_res; + /* Make sure urls with no lang info are treated as default language, unless it's site_url */ + if ( untrailingslashit( site_url() ) != untrailingslashit( $url_orig ) && empty( $url_info['lang_url'] ) ){ + return qtranxf_convertURL( $url_orig, $q_config['default_language'], false, true ); + /* The following fixes the case when the browser removes language marker from default language site url (caching?) passing directly _$SERVER['REQUEST_URI'] with language info removed. + * In this case is not possible to switch to default language from site url. + * Application of this hack is narrowed down to the cases where referer is site url in current language, to preserve language detection feature as much as possible. + * @TODO: check if a cleaner fix is applicable. */ + } else if ( $q_config['hide_default_language'] && untrailingslashit( site_url() ) == untrailingslashit( $url_orig ) && untrailingslashit($url_lang) === untrailingslashit( wp_get_raw_referer() ) ) { + return qtranxf_convertURL( $url_orig, $q_config['default_language'], false, true ); + } + /* All other cases follow default behaviour */ + return $url_lang; }