194 lines
5.4 KiB
PHP
194 lines
5.4 KiB
PHP
<?php
|
|
/**
|
|
* @package Polylang
|
|
*/
|
|
|
|
/**
|
|
* WPML Compatibility class
|
|
* Defines some WPML constants
|
|
* Registers strings in a persistent way as done by WPML
|
|
*
|
|
* @since 1.0.2
|
|
*/
|
|
class PLL_WPML_Compat {
|
|
/**
|
|
* Singleton instance
|
|
*
|
|
* @var PLL_WPML_Compat|null
|
|
*/
|
|
protected static $instance;
|
|
|
|
/**
|
|
* Stores the strings registered with the WPML API.
|
|
*
|
|
* @var array
|
|
*/
|
|
protected static $strings = array();
|
|
|
|
/**
|
|
* @var PLL_WPML_API
|
|
*/
|
|
public $api;
|
|
|
|
/**
|
|
* Constructor.
|
|
*
|
|
* @since 1.0.2
|
|
*/
|
|
protected function __construct() {
|
|
// Load the WPML API.
|
|
require_once __DIR__ . '/wpml-legacy-api.php';
|
|
$this->api = new PLL_WPML_API();
|
|
|
|
$strings = get_option( 'polylang_wpml_strings' );
|
|
|
|
if ( is_array( $strings ) ) {
|
|
self::$strings = $strings;
|
|
add_filter( 'pll_get_strings', array( $this, 'get_strings' ) );
|
|
}
|
|
|
|
add_action( 'pll_language_defined', array( $this, 'define_constants' ) );
|
|
add_action( 'pll_no_language_defined', array( $this, 'define_constants' ) );
|
|
}
|
|
|
|
/**
|
|
* Access to the single instance of the class
|
|
*
|
|
* @since 1.7
|
|
*
|
|
* @return PLL_WPML_Compat
|
|
*/
|
|
public static function instance() {
|
|
if ( empty( self::$instance ) ) {
|
|
self::$instance = new self();
|
|
}
|
|
return self::$instance;
|
|
}
|
|
|
|
/**
|
|
* Defines two WPML constants once the language has been defined
|
|
* The compatibility with WPML is not perfect on admin side as the constants are defined
|
|
* in 'setup_theme' by Polylang (based on user info) and 'plugins_loaded' by WPML (based on cookie).
|
|
*
|
|
* @since 0.9.5
|
|
*
|
|
* @return void
|
|
*/
|
|
public function define_constants() {
|
|
if ( ! empty( PLL()->curlang ) ) {
|
|
if ( ! defined( 'ICL_LANGUAGE_CODE' ) ) {
|
|
define( 'ICL_LANGUAGE_CODE', PLL()->curlang->slug );
|
|
}
|
|
|
|
if ( ! defined( 'ICL_LANGUAGE_NAME' ) ) {
|
|
define( 'ICL_LANGUAGE_NAME', PLL()->curlang->name );
|
|
}
|
|
} elseif ( ! PLL() instanceof PLL_Frontend ) {
|
|
if ( ! defined( 'ICL_LANGUAGE_CODE' ) ) {
|
|
define( 'ICL_LANGUAGE_CODE', 'all' );
|
|
}
|
|
|
|
if ( ! defined( 'ICL_LANGUAGE_NAME' ) ) {
|
|
define( 'ICL_LANGUAGE_NAME', '' );
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Unlike pll_register_string, icl_register_string stores the string in database
|
|
* so we need to do the same as some plugins or themes may expect this.
|
|
* We use a serialized option to store these strings.
|
|
*
|
|
* @since 1.0.2
|
|
*
|
|
* @param string|string[] $context The group in which the string is registered.
|
|
* @param string $name A unique name for the string.
|
|
* @param string $string The string to register.
|
|
* @return void
|
|
*/
|
|
public function register_string( $context, $name, $string ) {
|
|
if ( ! $string || ! is_scalar( $string ) ) {
|
|
return;
|
|
}
|
|
|
|
/*
|
|
* WPML accepts arrays as context and internally converts them to strings.
|
|
* See WPML_Register_String_Filter::truncate_name_and_context().
|
|
* This possibility is used by Types.
|
|
*/
|
|
if ( is_array( $context ) ) {
|
|
$name = isset( $context['context'] ) ? $name . $context['context'] : $name;
|
|
$context = $context['domain'] ?? '';
|
|
}
|
|
|
|
// If a string has already been registered with the same name and context, let's replace it.
|
|
$exist_string = $this->get_string_by_context_and_name( $context, $name );
|
|
if ( $exist_string && $exist_string !== $string ) {
|
|
$languages = PLL()->model->get_languages_list();
|
|
|
|
// Assign translations of the old string to the new string, except for the default language.
|
|
foreach ( $languages as $language ) {
|
|
if ( $language->is_default ) {
|
|
continue;
|
|
}
|
|
$mo = new PLL_MO();
|
|
$mo->import_from_db( $language );
|
|
$mo->add_entry( $mo->make_entry( $string, $mo->translate( $exist_string ) ) );
|
|
$mo->export_to_db( $language );
|
|
}
|
|
$this->unregister_string( $context, $name );
|
|
}
|
|
|
|
// Registers the string if it does not exist yet (multiline as in WPML).
|
|
$to_register = array( 'context' => $context, 'name' => $name, 'string' => $string, 'multiline' => true, 'icl' => true );
|
|
if ( ! in_array( $to_register, self::$strings ) ) {
|
|
$key = md5( "$context | $name" );
|
|
self::$strings[ $key ] = $to_register;
|
|
update_option( 'polylang_wpml_strings', self::$strings );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Removes a string from the registered strings list
|
|
*
|
|
* @since 1.0.2
|
|
*
|
|
* @param string $context The group in which the string is registered.
|
|
* @param string $name A unique name for the string.
|
|
* @return void
|
|
*/
|
|
public function unregister_string( $context, $name ) {
|
|
$key = md5( "$context | $name" );
|
|
if ( isset( self::$strings[ $key ] ) ) {
|
|
unset( self::$strings[ $key ] );
|
|
update_option( 'polylang_wpml_strings', self::$strings );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Adds strings registered by icl_register_string to those registered by pll_register_string
|
|
*
|
|
* @since 1.0.2
|
|
*
|
|
* @param array $strings existing registered strings
|
|
* @return array registered strings with added strings through WPML API
|
|
*/
|
|
public function get_strings( $strings ) {
|
|
return empty( self::$strings ) ? $strings : array_merge( $strings, self::$strings );
|
|
}
|
|
|
|
/**
|
|
* Get a registered string by its context and name
|
|
*
|
|
* @since 2.0
|
|
*
|
|
* @param string $context The group in which the string is registered.
|
|
* @param string $name A unique name for the string.
|
|
* @return string The registered string, empty if none was found.
|
|
*/
|
|
public function get_string_by_context_and_name( $context, $name ) {
|
|
$key = md5( "$context | $name" );
|
|
return isset( self::$strings[ $key ] ) ? self::$strings[ $key ]['string'] : '';
|
|
}
|
|
}
|