File: //home/herryo/herryo.com/wp-content/plugins/translatepress-multilingual/includes/functions.php
<?php
if ( !defined('ABSPATH' ) )
exit();
/**
* Outputs language switcher.
*
* Uses customization options from Shortcode language switcher.
*/
function trp_the_language_switcher(){
$trp = TRP_Translate_Press::get_trp_instance();
$language_switcher = $trp->get_component( 'language_switcher' );
echo $language_switcher->language_switcher(); /* phpcs:ignore */ /* escaped inside the function */
}
/**
* Wrapper function for json_encode to eliminate possible UTF8 special character errors
* @param $value
* @return mixed|string|void
*/
function trp_safe_json_encode($value){
if (version_compare(PHP_VERSION, '5.4.0') >= 0 && apply_filters('trp_safe_json_encode_pretty_print', true )) {
$encoded = json_encode($value, JSON_PRETTY_PRINT);
} else {
$encoded = json_encode($value);
}
switch (json_last_error()) {
case JSON_ERROR_NONE:
return $encoded;
case JSON_ERROR_DEPTH:
return 'Maximum stack depth exceeded'; // or trigger_error() or throw new Exception()
case JSON_ERROR_STATE_MISMATCH:
return 'Underflow or the modes mismatch'; // or trigger_error() or throw new Exception()
case JSON_ERROR_CTRL_CHAR:
return 'Unexpected control character found';
case JSON_ERROR_SYNTAX:
return 'Syntax error, malformed JSON'; // or trigger_error() or throw new Exception()
case JSON_ERROR_UTF8:
$clean = trp_utf8ize($value);
return trp_safe_json_encode($clean);
default:
return 'Unknown error'; // or trigger_error() or throw new Exception()
}
}
/**
* Helper function for trp_safe_json_encode that helps eliminate utf8 json encode errors
* @param $mixed
* @return array|string
*/
function trp_utf8ize($mixed) {
if (is_array($mixed)) {
foreach ($mixed as $key => $value) {
$mixed[$key] = trp_utf8ize($value);
}
} else if (is_string ($mixed)) {
return utf8_encode($mixed);
}
return $mixed;
}
/**
* function that gets the translation for a string with context directly from a .mo file
* @TODO this was developped firstly for woocommerce so it maybe needs further development.
*/
function trp_x( $text, $context, $domain, $language ) {
$original_text = $text;
$cache_key = 'trp_x_' . md5( $text . $context . $domain . $language );
$new_text = wp_cache_get( $cache_key );
if ( $new_text !== false ) {
return $new_text;
}
/* try to find the correct path for the textdomain */
$path_cache_key = 'trp_x_path_' . md5( $domain . $language );
$path = wp_cache_get( $path_cache_key );
if ( $path === false ) {
$path = trp_find_translation_location_for_domain( $domain, $language );
wp_cache_set( $path_cache_key, $path );
}
if ( !empty( $path ) ) {
$mo_file = trp_cache_get( 'trp_x_' . $domain . '_' . $language );
if ( false === $mo_file ) {
$mo_file = new MO();
$mo_file->import_from_file( $path );
wp_cache_set( 'trp_x_' . $domain . '_' . $language, $mo_file );
}
if ( !$mo_file ) {
$return = apply_filters( 'trp_x', $text, $original_text, $context, $domain, $language );
wp_cache_set( $cache_key, $return );
return $return;
}
if ( !empty( $mo_file->entries[ $context . '' . $text ] ) ) {
$text = $mo_file->entries[ $context . '' . $text ]->translations[0];
}
}
$return = apply_filters( 'trp_x', $text, $original_text, $context, $domain, $language );
wp_cache_set( $cache_key, $return );
return $return;
}
/**
* updated function that gets the translation for a string with context directly from a .po file
* @TODO the initial trp_x function was returning the translation in english for the slugs I tried to search even if they were translation for them
* the trp_x function also searches the .mo file witch doesn't seem to be the right file, but the .po file instead
*/
function trp_x_updated( $original_text, $context, $domain, $language ){
// Define the base path to the plugin's languages directory
$basePath = WP_CONTENT_DIR . '/languages/plugins/';
// Form the path to the .po file
$poFilePath = $basePath . $domain . '-' . $language . '.po';
if (!file_exists($poFilePath)) {
return $original_text;
}
$poContent = file_get_contents($poFilePath);
$pattern = '/msgctxt\s+"'.preg_quote($context, '/').'"\s+msgid\s+"'.preg_quote($original_text, '/').'"\s+msgstr\s+"(.*?)"/s';
if (preg_match($pattern, $poContent, $matches)) {
return stripslashes($matches[1]);
}
return $original_text;
}
/**
* Function that tries to find the path for a translation file defined by textdomain and language
* @param $domain the textdomain of the string that you want the translation for
* @param $language the language in which you want the translation
* @return string the path of the mo file if it is found else an empty string
*/
function trp_find_translation_location_for_domain( $domain, $language ){
global $trp_template_directory;
if ( !isset($trp_template_directory)){
// "caching" this because it sometimes leads to increased page load time due to many calls
$trp_template_directory = get_template_directory();
}
$path = '';
if( file_exists( WP_LANG_DIR . '/plugins/'. $domain .'-' . $language . '.mo') ) {
$path = WP_LANG_DIR . '/plugins/'. $domain .'-' . $language . '.mo';
}
elseif ( file_exists( WP_LANG_DIR . '/themes/'. $domain .'-' . $language . '.mo') ){
$path = WP_LANG_DIR . '/themes/'. $domain .'-' . $language . '.mo';
} elseif( $domain === '' && file_exists( WP_LANG_DIR . '/' . $language . '.mo')){
$path = WP_LANG_DIR . '/' . $language . '.mo';
} else {
$possible_translation_folders = array( '', 'languages/', 'language/', 'translations/', 'translation/', 'lang/' );
foreach( $possible_translation_folders as $possible_translation_folder ){
if (file_exists($trp_template_directory . '/' . $possible_translation_folder . $domain . '-' . $language . '.mo')) {
$path = $trp_template_directory . '/' . $possible_translation_folder . $domain . '-' . $language . '.mo';
} elseif ( file_exists(WP_PLUGIN_DIR . '/' . $domain . '/' . $possible_translation_folder . $domain . '-' . $language . '.mo') ) {
$path = WP_PLUGIN_DIR . '/' . $domain . '/' . $possible_translation_folder . $domain . '-' . $language . '.mo';
}
}
}
return $path;
}
/**
* Function that appends the affiliate_id to a given url
* @param $link string the given url to append
* @return string url with the added affiliate_id
*/
function trp_add_affiliate_id_to_link( $link ){
//Avangate Affiliate Network
$avg_affiliate_id = get_option('translatepress_avg_affiliate_id');
if ( !empty( $avg_affiliate_id ) ) {
$link = add_query_arg( 'avgref', $avg_affiliate_id, $link );
}
else{
// AffiliateWP
$affiliate_id = get_option('translatepress_affiliate_id');
if ( !empty( $affiliate_id ) ) {
$link = add_query_arg( 'ref', $affiliate_id, $link );
}
}
return esc_url( apply_filters( 'trp_affiliate_link', $link ) );
}
/**
* Function that makes string safe for display.
*
* Can be used on original or translated string.
* Removes any unwanted html code from the string.
* Do not confuse with trim.
*/
function trp_sanitize_string( $filtered, $execute_wp_kses = true ){
if (!is_string($filtered)) return '';
$filtered = preg_replace( '/<script\b[^>]*>(.*?)<\/script>/is', '', $filtered );
// don't remove \r \n \t. They are part of the translation, they give structure and context to the text.
//$filtered = preg_replace( '/[\r\n\t ]+/', ' ', $filtered );
$filtered = trim( $filtered );
$found = false;
while ( preg_match('/%[a-f0-9]{2}/i', $filtered, $match) ) {
$filtered = str_replace($match[0], '', $filtered);
$found = true;
}
if ( $found ) {
// Strip out the whitespace that may now exist after removing the octets.
$filtered = trim( preg_replace('/ +/', ' ', $filtered) );
}
if ( $execute_wp_kses ){
$filtered = trp_wp_kses( $filtered );
}
return $filtered;
}
function trp_wp_kses($string){
if ( apply_filters('trp_apply_wp_kses_on_strings', true) ){
add_filter( 'wp_kses_allowed_html', 'trp_prevent_kses_from_stripping_trp_wbr_tag', 10, 2 );
$string = wp_kses_post($string);
remove_filter('wp_kses_allowed_html', 'trp_prevent_kses_from_stripping_trp_wbr_tag', 10);
}
return $string;
}
function trp_prevent_kses_from_stripping_trp_wbr_tag( $allowedposttags, $context ){
if ( $context === 'post' ){
$allowedposttags['wbr'] = true;
}
return $allowedposttags;
}
/**
* function that checks if $_REQUEST['trp-edit-translation'] is set or if it has a certain value
*/
function trp_is_translation_editor( $value = '' ){
if( isset( $_REQUEST['trp-edit-translation'] ) ){
if( !empty( $value ) ) {
if( $_REQUEST['trp-edit-translation'] === $value ) {
return true;
}
else{
return false;
}
}
else{
$possible_values = array ('preview', 'true');
if( in_array( $_REQUEST['trp-edit-translation'], $possible_values ) ) {
return true;
}
}
}
return false;
}
function trp_remove_accents( $string ){
if ( !preg_match('/[\x80-\xff]/', $string) )
return $string;
if (seems_utf8($string)) {
$chars = array(
// Decompositions for Latin-1 Supplement
'ª' => 'a', 'º' => 'o',
'À' => 'A', 'Á' => 'A',
'Â' => 'A', 'Ã' => 'A',
'Ä' => 'A', 'Å' => 'A',
'Æ' => 'AE','Ç' => 'C',
'È' => 'E', 'É' => 'E',
'Ê' => 'E', 'Ë' => 'E',
'Ì' => 'I', 'Í' => 'I',
'Î' => 'I', 'Ï' => 'I',
'Ð' => 'D', 'Ñ' => 'N',
'Ò' => 'O', 'Ó' => 'O',
'Ô' => 'O', 'Õ' => 'O',
'Ö' => 'O', 'Ù' => 'U',
'Ú' => 'U', 'Û' => 'U',
'Ü' => 'U', 'Ý' => 'Y',
'Þ' => 'TH','ß' => 's',
'à' => 'a', 'á' => 'a',
'â' => 'a', 'ã' => 'a',
'ä' => 'a', 'å' => 'a',
'æ' => 'ae','ç' => 'c',
'è' => 'e', 'é' => 'e',
'ê' => 'e', 'ë' => 'e',
'ì' => 'i', 'í' => 'i',
'î' => 'i', 'ï' => 'i',
'ð' => 'd', 'ñ' => 'n',
'ò' => 'o', 'ó' => 'o',
'ô' => 'o', 'õ' => 'o',
'ö' => 'o', 'ø' => 'o',
'ù' => 'u', 'ú' => 'u',
'û' => 'u', 'ü' => 'u',
'ý' => 'y', 'þ' => 'th',
'ÿ' => 'y', 'Ø' => 'O',
// Decompositions for Latin Extended-A
'Ā' => 'A', 'ā' => 'a',
'Ă' => 'A', 'ă' => 'a',
'Ą' => 'A', 'ą' => 'a',
'Ć' => 'C', 'ć' => 'c',
'Ĉ' => 'C', 'ĉ' => 'c',
'Ċ' => 'C', 'ċ' => 'c',
'Č' => 'C', 'č' => 'c',
'Ď' => 'D', 'ď' => 'd',
'Đ' => 'D', 'đ' => 'd',
'Ē' => 'E', 'ē' => 'e',
'Ĕ' => 'E', 'ĕ' => 'e',
'Ė' => 'E', 'ė' => 'e',
'Ę' => 'E', 'ę' => 'e',
'Ě' => 'E', 'ě' => 'e',
'Ĝ' => 'G', 'ĝ' => 'g',
'Ğ' => 'G', 'ğ' => 'g',
'Ġ' => 'G', 'ġ' => 'g',
'Ģ' => 'G', 'ģ' => 'g',
'Ĥ' => 'H', 'ĥ' => 'h',
'Ħ' => 'H', 'ħ' => 'h',
'Ĩ' => 'I', 'ĩ' => 'i',
'Ī' => 'I', 'ī' => 'i',
'Ĭ' => 'I', 'ĭ' => 'i',
'Į' => 'I', 'į' => 'i',
'İ' => 'I', 'ı' => 'i',
'IJ' => 'IJ','ij' => 'ij',
'Ĵ' => 'J', 'ĵ' => 'j',
'Ķ' => 'K', 'ķ' => 'k',
'ĸ' => 'k', 'Ĺ' => 'L',
'ĺ' => 'l', 'Ļ' => 'L',
'ļ' => 'l', 'Ľ' => 'L',
'ľ' => 'l', 'Ŀ' => 'L',
'ŀ' => 'l', 'Ł' => 'L',
'ł' => 'l', 'Ń' => 'N',
'ń' => 'n', 'Ņ' => 'N',
'ņ' => 'n', 'Ň' => 'N',
'ň' => 'n', 'ʼn' => 'n',
'Ŋ' => 'N', 'ŋ' => 'n',
'Ō' => 'O', 'ō' => 'o',
'Ŏ' => 'O', 'ŏ' => 'o',
'Ő' => 'O', 'ő' => 'o',
'Œ' => 'OE','œ' => 'oe',
'Ŕ' => 'R','ŕ' => 'r',
'Ŗ' => 'R','ŗ' => 'r',
'Ř' => 'R','ř' => 'r',
'Ś' => 'S','ś' => 's',
'Ŝ' => 'S','ŝ' => 's',
'Ş' => 'S','ş' => 's',
'Š' => 'S', 'š' => 's',
'Ţ' => 'T', 'ţ' => 't',
'Ť' => 'T', 'ť' => 't',
'Ŧ' => 'T', 'ŧ' => 't',
'Ũ' => 'U', 'ũ' => 'u',
'Ū' => 'U', 'ū' => 'u',
'Ŭ' => 'U', 'ŭ' => 'u',
'Ů' => 'U', 'ů' => 'u',
'Ű' => 'U', 'ű' => 'u',
'Ų' => 'U', 'ų' => 'u',
'Ŵ' => 'W', 'ŵ' => 'w',
'Ŷ' => 'Y', 'ŷ' => 'y',
'Ÿ' => 'Y', 'Ź' => 'Z',
'ź' => 'z', 'Ż' => 'Z',
'ż' => 'z', 'Ž' => 'Z',
'ž' => 'z', 'ſ' => 's',
// Decompositions for Latin Extended-B
'Ș' => 'S', 'ș' => 's',
'Ț' => 'T', 'ț' => 't',
// Euro Sign
'€' => 'E',
// GBP (Pound) Sign
'£' => '',
// Vowels with diacritic (Vietnamese)
// unmarked
'Ơ' => 'O', 'ơ' => 'o',
'Ư' => 'U', 'ư' => 'u',
// grave accent
'Ầ' => 'A', 'ầ' => 'a',
'Ằ' => 'A', 'ằ' => 'a',
'Ề' => 'E', 'ề' => 'e',
'Ồ' => 'O', 'ồ' => 'o',
'Ờ' => 'O', 'ờ' => 'o',
'Ừ' => 'U', 'ừ' => 'u',
'Ỳ' => 'Y', 'ỳ' => 'y',
// hook
'Ả' => 'A', 'ả' => 'a',
'Ẩ' => 'A', 'ẩ' => 'a',
'Ẳ' => 'A', 'ẳ' => 'a',
'Ẻ' => 'E', 'ẻ' => 'e',
'Ể' => 'E', 'ể' => 'e',
'Ỉ' => 'I', 'ỉ' => 'i',
'Ỏ' => 'O', 'ỏ' => 'o',
'Ổ' => 'O', 'ổ' => 'o',
'Ở' => 'O', 'ở' => 'o',
'Ủ' => 'U', 'ủ' => 'u',
'Ử' => 'U', 'ử' => 'u',
'Ỷ' => 'Y', 'ỷ' => 'y',
// tilde
'Ẫ' => 'A', 'ẫ' => 'a',
'Ẵ' => 'A', 'ẵ' => 'a',
'Ẽ' => 'E', 'ẽ' => 'e',
'Ễ' => 'E', 'ễ' => 'e',
'Ỗ' => 'O', 'ỗ' => 'o',
'Ỡ' => 'O', 'ỡ' => 'o',
'Ữ' => 'U', 'ữ' => 'u',
'Ỹ' => 'Y', 'ỹ' => 'y',
// acute accent
'Ấ' => 'A', 'ấ' => 'a',
'Ắ' => 'A', 'ắ' => 'a',
'Ế' => 'E', 'ế' => 'e',
'Ố' => 'O', 'ố' => 'o',
'Ớ' => 'O', 'ớ' => 'o',
'Ứ' => 'U', 'ứ' => 'u',
// dot below
'Ạ' => 'A', 'ạ' => 'a',
'Ậ' => 'A', 'ậ' => 'a',
'Ặ' => 'A', 'ặ' => 'a',
'Ẹ' => 'E', 'ẹ' => 'e',
'Ệ' => 'E', 'ệ' => 'e',
'Ị' => 'I', 'ị' => 'i',
'Ọ' => 'O', 'ọ' => 'o',
'Ộ' => 'O', 'ộ' => 'o',
'Ợ' => 'O', 'ợ' => 'o',
'Ụ' => 'U', 'ụ' => 'u',
'Ự' => 'U', 'ự' => 'u',
'Ỵ' => 'Y', 'ỵ' => 'y',
// Vowels with diacritic (Chinese, Hanyu Pinyin)
'ɑ' => 'a',
// macron
'Ǖ' => 'U', 'ǖ' => 'u',
// acute accent
'Ǘ' => 'U', 'ǘ' => 'u',
// caron
'Ǎ' => 'A', 'ǎ' => 'a',
'Ǐ' => 'I', 'ǐ' => 'i',
'Ǒ' => 'O', 'ǒ' => 'o',
'Ǔ' => 'U', 'ǔ' => 'u',
'Ǚ' => 'U', 'ǚ' => 'u',
// grave accent
'Ǜ' => 'U', 'ǜ' => 'u',
);
// Used for locale-specific rules
$trp = TRP_Translate_Press::get_trp_instance();
$trp_settings = $trp->get_component( 'settings' );
$settings = $trp_settings->get_settings();
$default_language= $settings["default-language"];
$locale = $default_language;
if ( 'de_DE' == $locale || 'de_DE_formal' == $locale || 'de_CH' == $locale || 'de_CH_informal' == $locale ) {
$chars[ 'Ä' ] = 'Ae';
$chars[ 'ä' ] = 'ae';
$chars[ 'Ö' ] = 'Oe';
$chars[ 'ö' ] = 'oe';
$chars[ 'Ü' ] = 'Ue';
$chars[ 'ü' ] = 'ue';
$chars[ 'ß' ] = 'ss';
} elseif ( 'da_DK' === $locale ) {
$chars[ 'Æ' ] = 'Ae';
$chars[ 'æ' ] = 'ae';
$chars[ 'Ø' ] = 'Oe';
$chars[ 'ø' ] = 'oe';
$chars[ 'Å' ] = 'Aa';
$chars[ 'å' ] = 'aa';
} elseif ( 'ca' === $locale ) {
$chars[ 'l·l' ] = 'll';
} elseif ( 'sr_RS' === $locale || 'bs_BA' === $locale ) {
$chars[ 'Đ' ] = 'DJ';
$chars[ 'đ' ] = 'dj';
}
$string = strtr($string, $chars);
} else {
$chars = array();
// Assume ISO-8859-1 if not UTF-8
$chars['in'] = "\x80\x83\x8a\x8e\x9a\x9e"
."\x9f\xa2\xa5\xb5\xc0\xc1\xc2"
."\xc3\xc4\xc5\xc7\xc8\xc9\xca"
."\xcb\xcc\xcd\xce\xcf\xd1\xd2"
."\xd3\xd4\xd5\xd6\xd8\xd9\xda"
."\xdb\xdc\xdd\xe0\xe1\xe2\xe3"
."\xe4\xe5\xe7\xe8\xe9\xea\xeb"
."\xec\xed\xee\xef\xf1\xf2\xf3"
."\xf4\xf5\xf6\xf8\xf9\xfa\xfb"
."\xfc\xfd\xff";
$chars['out'] = "EfSZszYcYuAAAAAACEEEEIIIINOOOOOOUUUUYaaaaaaceeeeiiiinoooooouuuuyy";
$string = strtr($string, $chars['in'], $chars['out']);
$double_chars = array();
$double_chars['in'] = array("\x8c", "\x9c", "\xc6", "\xd0", "\xde", "\xdf", "\xe6", "\xf0", "\xfe");
$double_chars['out'] = array('OE', 'oe', 'AE', 'DH', 'TH', 'ss', 'ae', 'dh', 'th');
$string = str_replace($double_chars['in'], $double_chars['out'], $string);
}
return $string;
};
/**
* Output an SVG depending on case.
*
* @param string $icon The icon to output. Default no icon.
*/
function trp_output_svg( $icon = '' ) {
switch ( $icon ) {
case 'check':
?>
<svg class="trp-svg-icon fas-check-circle"><use xlink:href="#check-circle"></use></svg>
<?php
break;
case 'error':
?>
<svg class="trp-svg-icon fas-times-circle"><use xlink:href="#times-circle"></use></svg>
<?php
break;
default:
break;
}
}
/**
* Debuger function. Mainly designed for the get_url_for_language() function
*
* @since 1.3.6
*
* @param bool $enabled
* @param array $logger
*/
function trp_bulk_debug($debug = false, $logger = array()){
if(!$debug){
return;
}
error_log('---------------------------------------------------------');
$key_length = '';
foreach ($logger as $key => $value){
if ( strlen($key) > $key_length)
$key_length = strlen($key);
}
foreach ($logger as $key => $value){
error_log("$key : " . str_repeat(' ', $key_length - strlen($key)) . $value);
}
error_log('---------------------------------------------------------');
}
/**
* Used for showing useful notice in Translation Editor
*
* @return bool
*/
function trp_is_paid_version() {
$licence = get_option( 'trp_license_key' );
if ( ! empty( $licence ) ) {
return true;
}
//list of class names
$addons = apply_filters( 'trp_paid_addons', array(
'TRP_IN_Automatic_Language_Detection',
'TRP_IN_Browse_as_other_Role',
'TRP_IN_Extra_Languages',
'TRP_IN_Navigation_Based_on_Language',
'TRP_IN_Seo_Pack',
'TRP_IN_Translator_Accounts',
'TRP_Automatic_Language_Detection',
'TRP_Browse_as_other_Role',
'TRP_Extra_Languages',
'TRP_Navigation_Based_on_Language',
'TRP_Seo_Pack',
'TRP_Translator_Accounts',
) );
foreach ( $addons as $className ) {
if ( class_exists( $className ) ) {
return true;
}
}
return false;
}
/**
* Execute do_shortcode with a specific list of tags
*
* @param $content string String to execute do_shortcode on
* @param $tags_allowed array Array of tags allowed to be executed
* @return string string Resulted string
*/
function trp_do_these_shortcodes( $content, $tags_allowed ){
global $shortcode_tags;
$copy_shortcode_tags = $shortcode_tags;
// select the allowed shortocde tags from the global array
$allowed_shortcode_tags = array();
foreach( $shortcode_tags as $shortcode_tag_key => $shortcode_tag_value){
if ( in_array( $shortcode_tag_key, $tags_allowed ) ){
$allowed_shortcode_tags[$shortcode_tag_key] = $shortcode_tag_value;
}
}
// only execute these shortcode tags on the content
$shortcode_tags = $allowed_shortcode_tags;
// run shortcode
$return_content = do_shortcode($content);
// revert changes to shortcode_tags array
$shortcode_tags = $copy_shortcode_tags;
return $return_content;
}
/**
* Obtains a list of TP languages. Can be without the default one
* in which case use the parameter nodefault set to 'nodefault'
*
* @param string $nodefault param used to return published languages without default one
* @return mixed array with key/value pairs of published language codes and names
*
*/
function trp_get_languages($nodefault=null)
{
$trp_obj = TRP_Translate_Press::get_trp_instance();
$settings_obj = $trp_obj->get_component('settings');
$lang_obj = $trp_obj->get_component('languages');
$default_lang_labels = $settings_obj->get_setting('default-language');
$published_lang = $settings_obj->get_setting('publish-languages');
$published_lang_labels = $lang_obj->get_language_names($published_lang);
if (isset($nodefault) && $nodefault === 'nodefault'){
unset ($published_lang_labels[$default_lang_labels]);
}
return ($published_lang_labels);
}
/**
* Wrapper function for wp_cache_get() that bypasses cache if TRP_DEBUG is on
* @param int|string $key The key under which the cache contents are stored.
* @param string $group Optional. Where the cache contents are grouped. Default empty.
* @param bool $force Optional. Whether to force an update of the local cache
* from the persistent cache. Default false.
* @param bool $found Optional. Whether the key was found in the cache (passed by reference).
* Disambiguates a return of false, a storable value. Default null.
* @return mixed|false The cache contents on success, false on failure to retrieve contents or false when WP_DEBUG is on
*
*/
function trp_cache_get( $key, $group = '', $force = false, &$found = null ){
if( defined( 'TRP_DEBUG' ) && TRP_DEBUG == true )
return false;
$cache = wp_cache_get( $key, $group, $force, $found );
return $cache;
}
/**
* Wrapper function for get_transient() that bypasses cache if TRP_DEBUG is on
*/
function trp_get_transient( $transient ){
if( ( defined( 'TRP_DEBUG' ) && TRP_DEBUG == true ) || defined( 'TRP_DEBUG_TRANSIENT' ) && TRP_DEBUG_TRANSIENT == true )
return false;
return get_transient($transient);
}
/**
* Determine if the setting in Advanced Options should make us add a slash at end of string
* @param $settings the TranslatePress settings object
* @return bool
*/
function trp_force_slash_at_end_of_link( $settings ){
if ( !empty( $settings['trp_advanced_settings'] ) && isset( $settings['trp_advanced_settings']['force_slash_at_end_of_links'] ) && $settings['trp_advanced_settings']['force_slash_at_end_of_links'] === 'yes' )
return true;
else
return false;
}
/**
* This function is used by users to create their own language switcher.
*It returns an array with all the necessary information for the user to create their own custom language switcher.
*
* @return array
*
* The array returned has the following indexes: language_name, language_code, short_language_name, flag_link, current_page_url
*/
function trp_custom_language_switcher() {
$trp = TRP_Translate_Press::get_trp_instance();
$trp_languages = $trp->get_component( 'languages' );
$trp_settings = $trp->get_component( 'settings' );
$settings = $trp_settings->get_settings();
$languages_to_display = $settings['publish-languages'];
$translation_languages = $trp_languages->get_language_names( $languages_to_display );
$url_converter = $trp->get_component( 'url_converter' );
$custom_ls_array = array();
foreach ( $translation_languages as $item => $language ) {
$custom_ls_array[ $item ]['language_name'] = $language;
$custom_ls_array[ $item ]['language_code'] = $item;
$custom_ls_array[ $item ]['short_language_name'] = $url_converter->get_url_slug( $item, false );
$flags_path = TRP_PLUGIN_URL . 'assets/images/flags/';
$flags_path = apply_filters( 'trp_flags_path', $flags_path, $item );
$flag_file_name = $item . '.png';
$flag_file_name = apply_filters( 'trp_flag_file_name', $flag_file_name, $item );
$custom_ls_array[ $item ]['flag_link'] = esc_url( $flags_path . $flag_file_name );
$custom_ls_array[ $item ]['current_page_url'] = esc_url( $url_converter->get_url_for_language( $item, null, '' ) );
}
return $custom_ls_array;
}
/**Function that provides translation for a specific text or html content, into another language.
* The function can be used by third party plugin/theme authors.
*
* @param string $content is the content you want to translate, it must be in the default language and it can be any text or html code
* @param string $language is the language you want to translate the content into, if it is left undefined the content will be translated
* to the current language; it's set to current language by default
* @param bool $prevent_over_translation is a parameter that prevents the translated content from being translated again during the translation
* of the page. This can be set to false if the translated content is used in a way that TranslatePress can't detect the text.
* It's set to true by default
* @return string is the translated content in the chosen language
*/
function trp_translate( $content, $language = null, $prevent_over_translation = true ){
$trp = TRP_Translate_Press::get_trp_instance();
$trp_render = $trp->get_component( 'translation_render' );
global $TRP_LANGUAGE;
$lang_backup = $TRP_LANGUAGE;
if ($language !== null){
$TRP_LANGUAGE = $language;
}
$translated_custom_content = $trp_render->translate_page($content);
if ($prevent_over_translation === true){
$translated_custom_content = '<span data-no-translation>' . $translated_custom_content .'</span>';
}
$TRP_LANGUAGE = $lang_backup;
return $translated_custom_content;
}
function trp_get_license_status(){
$license_details = get_option( 'trp_license_details' );
$is_demosite = ( strpos(site_url(), 'https://demo.translatepress.com' ) !== false );
$status = 'free-version';
if( !empty($license_details) && !$is_demosite) {
/* if we have any invalid response for any of the addon show just the error notification and ignore any valid responses */
if ( !empty( $license_details['invalid'] ) ) {
$status = 'invalid';
//take the first addon details (it should be the same for the rest of the invalid ones)
$license_detail = $license_details['invalid'][0];
if( $license_detail->error == 'missing' )
$status = 'missing';
elseif( $license_detail->error == 'expired' ){
$status = 'expired';
}elseif( $license_detail->error == 'revoked' ){
$status = 'revoked';
}
}elseif( !empty( $license_details['valid'] ) ){
$status = 'valid';
}
}
return $status;
}
/**
* Used by third parties to briefly switch language such as when sending an email
* To get a user's preferred language use this code: get_user_meta( $user_id, 'trp_language', true );
*
* @param $language
* @return void
*/
function trp_switch_language($language){
global $TRP_LANGUAGE, $TRP_LANGUAGE_COPY, $TRP_LANGUAGE_ORIGINAL;
$language = trp_validate_language( $language );
$TRP_LANGUAGE_ORIGINAL = $TRP_LANGUAGE;
$TRP_LANGUAGE = $language;
$TRP_LANGUAGE_COPY = $language;
// Because of 'trp_before_translate_content' filter function is_ajax_frontend() is called and it changes the global $TRP_LANGUAGE according to the url from which it was called.
// Function trp_reset_language() is added on the hook in order to set global $TRP_LANGUAGE according to our need for the email language instead.
add_filter( 'trp_before_translate_content', 'trp_reset_language', 99999999 );
switch_to_locale($language);
add_filter( 'plugin_locale', 'trp_get_locale', 99999999);
}
/**
* Return $TRP_LANGUAGE as plugin locale
*
* @return mixed
*/
function trp_get_locale() {
global $TRP_LANGUAGE;
return $TRP_LANGUAGE;
}
/**
* The value of $TRP_LANGUAGE is set according to the url, which can be problematic in some cases when sending emails
* Restore the $TRP_LANGUAGE value in which email will be sent
*
* @param $output
* @return mixed
*/
function trp_reset_language( $output ){
global $TRP_LANGUAGE, $TRP_LANGUAGE_COPY;
$TRP_LANGUAGE = $TRP_LANGUAGE_COPY;
return $output;
}
/**
* Return a valid TRP language in which the email will be sent
*
* @param $language
* @return mixed
*/
function trp_validate_language( $language ){
$trp = TRP_Translate_Press::get_trp_instance();
$trp_settings = $trp->get_component( 'settings' );
$settings = $trp_settings->get_settings();
if( empty( $language ) || !in_array( $language, $settings['translation-languages'] ) ){
$language = $settings['default-language'];
}
return $language;
}
/**
* Used by third parties to restore original language after using trp_switch_language
*/
function trp_restore_language(){
global $TRP_LANGUAGE, $TRP_LANGUAGE_ORIGINAL;
remove_filter( 'trp_before_translate_content', 'trp_reset_language' );
restore_previous_locale();
remove_filter( 'plugin_locale', 'trp_get_locale' );
$TRP_LANGUAGE = $TRP_LANGUAGE_ORIGINAL;
}
/**
* Determine user language
*
* @param $user_id
* @return mixed
*/
function trp_get_user_language( $user_id ){
return trp_validate_language( get_user_meta( $user_id, 'trp_language', true ) );
}
/**
* Wrapper function for WooCommerce HPOS add, delete and update operations
* Falls back to the traditional post_meta operations
*
* @param $order_id int Post ID
* @param $meta_key string Metadata key
* @param $meta_value mixed Metadata value
* @param $operation_type string Parameter used to determine the type of operation that needs to be performed.
* Accepts: add / delete / update
*/
function trp_woo_hpos_manipulate_post_meta( $order_id, $meta_key, $meta_value, $operation_type ){
if ( class_exists( 'Automattic\WooCommerce\Utilities\OrderUtil' ) && Automattic\WooCommerce\Utilities\OrderUtil::custom_orders_table_usage_is_enabled() ) {
$order = wc_get_order( $order_id );
$function = $operation_type . '_meta_data';
$order->$function( $meta_key, $meta_value );
$order->save();
return;
}
$function = $operation_type . '_post_meta';
$function( $order_id, $meta_key, $meta_value );
}
/**
* Wrapper function for WooCommerce HPOS get operation
* Falls back to the traditional post_meta operation
*
* @param $order_id int Post ID
* @param $meta_key string Metadata key
* @param $single bool Whether to return a single value or not. Default: false
* @return mixed An array of values if `$single` is false. The value of the meta field if `$single` is true. False for an invalid `$post_id` (non-numeric, zero, or negative value). An empty string if a valid but non-existing post ID is passed.
*/
function trp_woo_hpos_get_post_meta( $order_id, $meta_key, $single = false ){
if ( class_exists( 'Automattic\WooCommerce\Utilities\OrderUtil' ) && Automattic\WooCommerce\Utilities\OrderUtil::custom_orders_table_usage_is_enabled() ) {
$order = wc_get_order( $order_id );
if ( !$order ) return false;
return $order->get_meta( $meta_key, $single );
}
return get_post_meta( $order_id, $meta_key, $single );
}
/**
* Helper function that determines if we should output the dynamic translation script later than usual
*
* Some plugins add HTML to the DOM very late in the page load cycle, so the site becomes slow due our mutation observer capturing it
*
* @return bool
*/
function is_late_dom_html_plugin_active(){
$classes_array = ['QueryMonitor']; // for the moment, only Query Monitor matches the criteria
foreach ( $classes_array as $class ){
if ( class_exists( $class ) ) return true;
}
return apply_filters( 'trp_delay_dom_changes_script', false );
}
/**
* Helper function to remove a prefix from a string.
* If we do str_replace that will remove it from the entire string, wherever it finds it.
*
* @return string
*/
function trp_remove_prefix($prefix = '', $string = '') {
// Check if the path starts with the prefix
if (!empty($prefix)){
if (strpos($string, $prefix) === 0) {
// Remove the prefix from the path
return substr_replace($string, '', 0, strlen($prefix));
}
}
// If the prefix is not at the start, return the path unchanged
return $string;
}