all-in-one-event-calendar/lib/p28n/wpml.php
2017-11-09 17:36:04 +01:00

367 lines
No EOL
10 KiB
PHP

<?php
/**
* Localization manager for wpml.
*
* @author Time.ly Network, Inc.
* @since 2.0
* @package Ai1EC
* @subpackage Ai1EC.P28n
*/
class Ai1ec_Localization_Helper {
/**
* @var NULL|string Currently asset language
**/
protected $_language = NULL;
/**
* Constructor
*
* Add callbacks to translation plugins
**/
public function __construct() {
add_filter(
'qtranslate_language',
array( $this, 'callback_current_language' )
);
}
/**
* get_translations_of_page method
*
* Get an array of pages, that are translations of current page, or which
* are on the same translation level of this page, i.e. ancestors sharing
* same parent.
*
* @param int $page_id Page to check
*
* @return array List of page IDs to check
*/
public function get_translations_of_page( $page_id ) {
$matches = array();
$page_id = (int)$page_id;
if ( $this->is_wpml_active() ) {
$matches += $this->get_wpml_translations_of_page( $page_id );
}
return $matches;
}
/**
* Returns the ISO-3166 part of the configured locale as a ccTLD.
*
* Used for region biasing in the GEO autocomplete plugin.
*
* @return string ISO-3166 locale name.
*/
public function get_region() {
$locale = explode( '_', get_locale() );
$region = ( isset( $locale[1] ) && $locale[1] != '' )
? strtolower( $locale[1] )
: '';
// Primary ccTLD for United Kingdom is uk.
return ( $region == 'gb' ) ? 'uk' : $region;
}
/**
* get_wpml_translations_of_page method
*
* Get an array of pages, that are translations of current page, or which
* are on the same translation level of this page, i.e. ancestors sharing
* same parent.
* Checks WPML backend.
*
* @param int $page_id Page to check
*
* @return array List of page IDs to check
*/
public function get_wpml_translations_of_page( $page_id, $language = false ) {
global $sitepress, $wpdb;
$page_id = (int)$page_id;
$translations = (array)$sitepress->get_element_translations( $page_id );
if ( empty( $translations ) ) {
$parent_id = $wpdb->get_var(
'SELECT trid FROM ' . $wpdb->prefix . 'icl_translations ' .
'WHERE element_type = \'post_page\' ' .
'AND element_id = ' . $page_id
);
if ( $parent_id ) {
$translations += (array)$sitepress->get_element_translations(
$parent_id
);
}
}
$output = array();
foreach ( $translations as $lang => $entry ) {
$key = $entry->element_id;
if ( $language ) {
$key = $lang;
}
$output[$lang] = $entry->element_id;
}
return $output;
}
/**
* Get a list of localized week day names.
*
* @see Ai1ec_Locale::get_localized_week_names()
*
* @return string Comma-separated list of localized week day names.
*/
public function get_localized_week_names() {
global $wp_locale;
return implode( ',', $wp_locale->weekday_initial );
}
/**
* Return list of localized month names.
*
* @see Ai1ec_Locale::get_localized_month_names()
*
* @return array Comma-separated list of localized month names.
*/
public function get_localized_month_names() {
global $wp_locale;
return implode( ',', $wp_locale->month );
}
/**
* get_translatable_id method
*
* Get ID of AI1EC Event being currently translated.
* If there is none - false is returned.
*
* @return int|bool ID of AI1EC event being translated, or false if none
*/
public function get_translatable_id() {
if (
isset( $_GET['trid'] ) &&
isset( $_GET['source_lang'] ) &&
$this->is_wpml_active()
) {
global $sitepress;
$details = $sitepress->get_element_translations(
$_GET['trid'],
'post_' . AI1EC_POST_TYPE
);
if ( isset( $details[$_GET['source_lang']] ) ) {
return $details[$_GET['source_lang']]->element_id;
}
}
return false;
}
/**
* Uses $wp_locale to get the translated weekday.
*
* @param int $day_index
*
* @return strin
*/
public function get_weekday( $day_index ) {
global $wp_locale;
return $wp_locale->get_weekday( $day_index );
}
/**
* get_wpml_table_join method
*
* Get join conditions to WPML plugin table
*
* @param string $local_id Name of locally referencable table field
*
* @return string SQL condition to include in JOIN
**/
public function get_wpml_table_join( $local_id = 'e.post_id' ) {
global $wpdb;
if ( ! $this->is_wpml_active() ) {
return '';
}
$query = ' LEFT JOIN ' .
$wpdb->prefix . 'icl_translations AS translation' .
' ON (' .
' translation.element_type = \'post_' . AI1EC_POST_TYPE . '\'' .
' AND translation.element_id = ' . $local_id .
' ) ';
return $query;
}
/**
* get_wpml_table_where method
*
* Get WHERE conditions to WPML plugin table
*
* @param string $table_alias Alias by which table is referenced
*
* @return string SQL condition to include in JOIN
**/
public function get_wpml_table_where( $table_alias = 'translation' ) {
global $wpdb;
if ( ! $this->is_wpml_active() ) {
return '';
}
$query = ' AND ( ' .
$table_alias . '.translation_id IS NULL OR ' .
$table_alias . '.language_code = \'' .
$this->get_language() .
'\' ) ';
return $query;
}
/**
* is_wpml_active method
*
* Check if WPML plugin is active.
*
* @return bool Activity
**/
public function is_wpml_active() {
global $sitepress;
if ( isset( $sitepress ) && $sitepress instanceof SitePress ) {
return true;
}
return false;
}
/**
* get_language function
*
* Return current (effective) site language
*
* @return string|null Effective language or NULL if none detected
**/
public function get_language() {
return $this->get_current_language();
}
/**
* get_lang function
*
* Returns the ISO-639 part of the configured locale. The default
* language is English (en).
*
* @return string
**/
public function get_lang() {
$locale = explode( '_', get_locale() );
return ( isset( $locale[0] ) && $locale[0] != '' ) ? $locale[0] : 'en';
}
/**
* Wrapper to accomodate new WPML version.
*
* @return Currently configured language, or default.
*/
public function get_current_language() {
global $sitepress;
if (
$this->is_wpml_active() &&
method_exists( $sitepress, 'get_current_language' )
) {
return $sitepress->get_current_language();
}
return $this->get_default_language();
}
/**
* get_default_language function
*
* Return default (configured) site language
*
* @return string|null Default language or NULL if none detected
*/
public function get_default_language() {
global $sitepress, $q_config;
$language = NULL;
if ( $this->is_wpml_active() ) {
$language = $sitepress->get_default_language();
}
if (
empty( $language ) &&
defined( 'QTRANS_INIT' ) &&
isset( $q_config ) &&
is_array( $q_config ) &&
isset( $q_config['default_language'] )
) {
$language = $q_config['default_language'];
}
if (
NULL !== $language && (
! isset( $language{1} ) ||
isset( $language{3} )
)
) {
$language = NULL;
}
return $language;
}
/**
* set_language function
*
* Set language and bind callbacks to set it on appropriate actions.
*
* @param string $language Language to activate (use)
*
* @return bool Success
**/
public function set_language( $language ) {
$language = (string)$language;
if (
!isset( $language{1} ) ||
isset( $language{3} ) ||
false === ctype_alnum( $language )
) {
return false;
}
$this->_language = $language;
$this->call_set_language();
add_action(
'plugins_loaded',
array( $this, 'call_set_language' ),
1
);
return true;
}
/**
* call_set_language function
*
* Callback for various actions (i.e. plugins_loaded), that actually
* sets language on related objects using {@see $this->_language}
* value.
*
* @return void Method does not return
**/
public function call_set_language() {
global $sitepress, $q_config;
if ( isset( $sitepress ) && $sitepress instanceof SitePress ) {
$sitepress->switch_lang( $this->_language );
}
if (
defined( 'QTRANS_INIT' ) &&
isset( $q_config ) &&
is_array( $q_config )
) {
$q_config['language'] = $this->_language;
}
}
/**
* callback_current_language function
*
* Callback for plugin actions, that returns effective language
* if any.
*
* @param mixed $old_language Language to change
*
* @return string Effective language or {$old_language}
**/
public function callback_current_language( $old_language ) {
if ( NULL !== $this->_language ) {
return $this->_language;
}
return $old_language;
}
}