File "Multilingual.php"
Full Path: /home/vantageo/public_html/cache/cache/cache/cache/.wp-cli/wp-content/plugins/ajax-search-for-woocommerce/includes/Multilingual.php
File size: 13.73 KB
MIME-type: text/x-php
Charset: utf-8
<?php
namespace DgoraWcas;
// Exit if accessed directly
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
class Multilingual {
public static $currentCurrency = '';
public static $langs = null;
/**
* Check if the website is multilingual
*
* @return bool
*/
public static function isMultilingual() {
$isMultilingual = false;
if ( defined( 'DGWT_WCAS_DISABLE_MULTILINGUAL' ) && DGWT_WCAS_DISABLE_MULTILINGUAL ) {
return false;
}
if ( count( self::getLanguages() ) > 0 && self::getProvider() !== 'not set' ) {
$isMultilingual = true;
}
return $isMultilingual;
}
/**
* Check if WPMl is active
*
* @return bool
*/
public static function isWPML() {
return class_exists( 'SitePress' );
}
/**
* Check if Polylang is active
*
* @return bool
*/
public static function isPolylang() {
return did_action( 'pll_init' );
}
/**
* Get Provider
*
* @return string
*/
public static function getProvider() {
$provider = 'not set';
if ( self::isWPML() ) {
$provider = 'WPML';
}
if ( self::isPolylang() ) {
$provider = 'Polylang';
}
$provider = apply_filters( 'dgwt/wcas/multilingual/provider', $provider );
return $provider;
}
/**
* Check if language code has one of the following format:
* aa, aaa, aa-aa
*
* @param $lang
*
* @return bool
*/
public static function isLangCode( $lang ) {
return ! empty( $lang ) && is_string( $lang ) && (bool) preg_match( '/^([a-zA-Z]{2,15})$|^([a-zA-Z]{2,15}[-_][a-zA-Z]{2,15})$/', $lang );
}
/**
* Get default language
*
* @return string
*/
public static function getDefaultLanguage() {
$defaultLang = 'en';
if ( self::isWPML() ) {
$defaultLang = apply_filters( 'wpml_default_language', null );
}
if ( self::isPolylang() ) {
$defaultLang = pll_default_language( 'slug' );
}
if ( empty( $defaultLang ) ) {
$locale = get_locale();
$defaultLang = substr( $locale, 0, 2 );
}
return apply_filters( 'dgwt/wcas/multilingual/default-language', $defaultLang );
}
/**
* Current language
*
* @return string
*/
public static function getCurrentLanguage() {
$currentLang = self::getDefaultLanguage();
if ( self::isWPML() ) {
$currentLang = apply_filters( 'wpml_current_language', null );
}
if ( self::isPolylang() ) {
$lang = pll_current_language( 'slug' );
if ( $lang ) {
$currentLang = $lang;
} else {
$currentLang = pll_default_language( 'slug' );
}
}
if ( empty( $currentLang ) && ! empty( $_GET['lang'] ) && self::isLangCode( $_GET['lang'] ) ) {
$currentLang = $_GET['lang'];
}
return apply_filters( 'dgwt/wcas/multilingual/current-language', $currentLang );
}
/**
* Get Language of post or product
*
* @param int $postID
*
* @return string
*/
public static function getPostLang( $postID, $postType = 'product' ) {
$lang = self::getDefaultLanguage();
if ( self::isWPML() ) {
global $wpdb;
$postType = 'post_' . $postType;
$tranlationsTable = $wpdb->prefix . 'icl_translations';
$sql = $wpdb->prepare( "SELECT language_code
FROM $tranlationsTable
WHERE element_type=%s
AND element_id=%d", sanitize_key( $postType ), $postID );
$result = $wpdb->get_var( $sql );
if ( self::isLangCode( $result ) ) {
$lang = $result;
}
}
if ( self::isPolylang() ) {
$lang = pll_get_post_language( $postID, 'slug' );
}
$lang = apply_filters( 'dgwt/wcas/multilingual/post-language', $lang, $postID, $postType );
return $lang;
}
/**
* Get term lang
*
* @param int $term ID
* @param string $taxonomy
*
* @return string
*/
public static function getTermLang( $termID, $taxonomy ) {
$lang = self::getDefaultLanguage();
if ( self::isWPML() ) {
global $wpdb;
$elementType = 'tax_' . sanitize_key( $taxonomy );
$tranlationsTable = $wpdb->prefix . 'icl_translations';
$term = \WP_Term::get_instance( $termID, $taxonomy );
if ( is_a( $term, 'WP_Term' ) ) {
$sql = $wpdb->prepare( "SELECT language_code
FROM $tranlationsTable
WHERE element_type = %s
AND element_id=%d",
$elementType, $term->term_taxonomy_id );
$result = $wpdb->get_var( $sql );
if ( self::isLangCode( $result ) ) {
$lang = $result;
}
}
}
if ( self::isPolylang() ) {
$lang = pll_get_term_language( $termID, 'slug' );
}
// TranslatePress/qTranslate-XT has no language relationship with the post, so we always return the default
$lang = apply_filters( 'dgwt/wcas/multilingual/term-language', $lang, $termID, $taxonomy );
return $lang;
}
/**
* Get permalink
*
* @param string $postID
* @param string $url
* @param string $lang
*
* @return string
*/
public static function getPermalink( $postID, $url = '', $lang = '' ) {
$permalink = $url;
if ( self::isWPML() && self::getDefaultLanguage() !== $lang ) {
/**
* 1 if the option is *Different languages in directories*
* 2 if the option is *A different domain per language*
* 3 if the option is *Language name added as a parameter*.
*/
$urlType = apply_filters( 'wpml_setting', 0, 'language_negotiation_type' );
if ( $urlType == 3 ) {
$permalink = apply_filters( 'wpml_permalink', $url, $lang );
} else {
$permalink = apply_filters( 'wpml_permalink', $url, $lang, true );
}
}
$permalink = apply_filters( 'dgwt/wcas/multilingual/post-permalink', $permalink, $lang, $postID );
return $permalink;
}
/**
* Active languages
*
* @param bool $includeInvalid Also return invalid languages
*
* @return array
*/
public static function getLanguages( $includeInvalid = false ) {
$includeHidden = apply_filters( 'dgwt/wcas/multilingual/languages/include-hidden', false );
if ( self::$langs !== null && ! $includeInvalid && ! $includeHidden ) {
return self::$langs;
}
$langs = array();
if ( self::isWPML() ) {
$wpmlLangs = apply_filters( 'wpml_active_languages', null, array( 'skip_missing' => 0 ) );
if ( is_array( $wpmlLangs ) ) {
foreach ( $wpmlLangs as $langCode => $details ) {
if ( self::isLangCode( $langCode ) || $includeInvalid ) {
$langs[] = $langCode;
}
}
}
if ( ! $includeHidden ) {
$hiddenLangs = apply_filters( 'wpml_setting', array(), 'hidden_languages' );
if ( ! empty( $hiddenLangs ) && is_array( $hiddenLangs ) ) {
foreach ( $hiddenLangs as $hiddenLang ) {
if ( ! self::isLangCode( $hiddenLang ) && $includeInvalid ) {
continue;
}
$langs = array_diff( $langs, [ $hiddenLang ] );
}
}
}
}
if ( self::isPolylang() ) {
$langs = pll_languages_list( array(
'hide_empty' => false,
'fields' => ''
) );
// Filter not-active languages
$langs = array_filter( $langs, function ( $lang ) {
// By default, 'active' prop isn't available; It is set the first time the administrator deactivates the language
if ( isset( $lang->active ) && ! $lang->active ) {
return false;
}
return true;
} );
$langs = wp_list_pluck( $langs, 'slug' );
}
if ( empty( $langs ) ) {
$langs[] = self::getDefaultLanguage();
}
$langs = apply_filters( 'dgwt/wcas/multilingual/languages', $langs, $includeInvalid, $includeHidden );
if ( ! $includeInvalid && ! $includeHidden ) {
self::$langs = $langs;
}
return $langs;
}
/**
* Get language details by language code
*
* @param string $lang
* @param string $field | name | locale |
*
* @return string
*/
public static function getLanguageField( $lang, $field ) {
$value = $lang;
if ( self::isWPML() ) {
global $sitepress;
$details = $sitepress->get_language_details( $lang );
if ( $field === 'name' && ! empty( $details['display_name'] ) ) {
$value = $details['display_name'];
}
if ( $field === 'locale' && ! empty( $details['default_locale'] ) ) {
$value = $details['default_locale'];
}
}
if ( self::isPolylang() ) {
$langs = pll_languages_list( array(
'hide_empty' => false,
'fields' => ''
) );
if ( ! empty( $langs ) && is_array( $langs ) ) {
foreach ( $langs as $object ) {
if ( ! empty( $object->slug ) && $object->slug === $lang ) {
if ( $field === 'name' ) {
$value = $object->name;
}
if ( $field === 'locale' ) {
$value = $object->locale;
}
}
}
}
}
return $value;
}
/**
* Get all terms in one taxonomy for all languages
*
* @param string $taxonomy
*
* @return array of WP_Term objects
*/
public static function getTermsInAllLangs( $taxonomy ) {
$terms = array();
if ( self::isWPML() ) {
$currentLang = self::getCurrentLanguage();
$usedIds = array();
foreach ( self::getLanguages() as $lang ) {
do_action( 'wpml_switch_language', $lang );
$args = array(
'taxonomy' => $taxonomy,
'hide_empty' => true,
'suppress_filters' => false
);
$termsInLang = get_terms( apply_filters( 'dgwt/wcas/search/' . $taxonomy . '/args', $args ) );
if ( ! empty( $termsInLang ) && is_array( $termsInLang ) ) {
foreach ( $termsInLang as $termInLang ) {
if ( ! in_array( $termInLang->term_id, $usedIds ) ) {
$terms[] = $termInLang;
$usedIds[] = $termInLang->term_id;
}
}
}
}
do_action( 'wpml_switch_language', $currentLang );
}
if ( self::isPolylang() ) {
$terms = get_terms( array(
'taxonomy' => $taxonomy,
'hide_empty' => true,
'lang' => '', // query terms in all languages
) );
}
$terms = apply_filters( 'dgwt/wcas/multilingual/terms-in-all-languages', $terms, $taxonomy );
return $terms;
}
/**
* Get terms in specific language
*
* @param array $args
* @param string $lang
*
* @return \WP_Term[]
*/
public static function getTermsInLang( $args = array(), $lang = '' ) {
$terms = array();
if ( empty( $lang ) ) {
$lang = self::getDefaultLanguage();
}
if ( self::isWPML() ) {
$currentLang = self::getCurrentLanguage();
$usedIds = array();
do_action( 'wpml_switch_language', $lang );
$args = wp_parse_args( $args, array(
'taxonomy' => '',
'hide_empty' => true,
'suppress_filters' => false
) );
$termsInLang = get_terms( apply_filters( 'dgwt/wcas/search/' . $args['taxonomy'] . '/args', $args ) );
if ( ! empty( $termsInLang ) && is_array( $termsInLang ) ) {
foreach ( $termsInLang as $termInLang ) {
if ( ! in_array( $termInLang->term_id, $usedIds ) ) {
$terms[] = $termInLang;
$usedIds[] = $termInLang->term_id;
}
}
}
do_action( 'wpml_switch_language', $currentLang );
}
if ( self::isPolylang() ) {
$args = wp_parse_args( $args, array(
'taxonomy' => '',
'hide_empty' => true,
'lang' => $lang,
) );
$terms = get_terms( $args );
}
$terms = apply_filters( 'dgwt/wcas/multilingual/terms-in-language', $terms, $args, $lang );
return $terms;
}
public static function searchTerms( $taxonomy, $query, $lang = '' ) {
$terms = array();
if ( empty( $lang ) ) {
$lang = self::getDefaultLanguage();
}
$args = array(
'taxonomy' => $taxonomy,
'hide_empty' => false,
'search' => $query,
);
$terms = get_terms( $args );
}
/**
* Get term in specific language
*
* @param int $termID
* @param string $taxonomy
* @param string $lang
*
* @return object WP_Term
*/
public static function getTerm( $termID, $taxonomy, $lang ) {
$term = null;
if ( self::isWPML() ) {
$currentLang = self::getCurrentLanguage();
do_action( 'wpml_switch_language', $lang );
$term = get_term( $termID, $taxonomy );
do_action( 'wpml_switch_language', $currentLang );
}
if ( self::isPolylang() ) {
$termID = pll_get_term( $termID, $lang );
if ( $termID ) {
$term = get_term( $termID, $taxonomy );
}
}
$term = apply_filters( 'dgwt/wcas/multilingual/term', $term, $termID, $taxonomy, $lang );
return $term;
}
/**
* Check if multicurrency module is enabled
*
* @return bool
*/
public static function isMultiCurrency() {
$multiCurrency = false;
if ( self::isWPML() && function_exists( 'wcml_is_multi_currency_on' ) && wcml_is_multi_currency_on() ) {
$multiCurrency = true;
}
return $multiCurrency;
}
/**
* Get currency code assigned to language
*
* @param string $lang
*
* @return string
*/
public static function getCurrencyForLang( $lang ) {
$currencyCode = '';
if ( self::isWPML() ) {
global $woocommerce_wpml;
if ( ! empty( $woocommerce_wpml ) && is_object( $woocommerce_wpml ) && ! empty( $lang ) ) {
if ( ! empty( $woocommerce_wpml->settings['default_currencies'][ $lang ] ) ) {
$currencyCode = $woocommerce_wpml->settings['default_currencies'][ $lang ];
}
}
}
return $currencyCode;
}
/**
* Set currenct currency
*
* @return void
*/
public static function setCurrentCurrency( $currency ) {
self::$currentCurrency = $currency;
}
/**
* Get currenct currency
*
* @return string
*/
public static function getCurrentCurrency() {
return self::$currentCurrency;
}
/**
* Switch language
*
* @param $lang
*/
public static function switchLanguage( $lang ) {
if ( self::isWPML() && ! empty( $lang ) ) {
do_action( 'wpml_switch_language', $lang );
}
/**
* Some plugins (e.g. Permalink Manager for WooCommerce) use the get_the_terms() function,
* which caches terms related to the product, and we need to clear this cache when changing the language.
*/
if ( function_exists( 'wp_cache_flush_group' ) ) {
wp_cache_flush_group( 'product_cat_relationships' );
} else {
wp_cache_flush();
}
do_action( 'dgwt/wcas/multilingual/switch-language', $lang );
}
}