first commit
This commit is contained in:
@@ -0,0 +1,176 @@
|
||||
<?php
|
||||
/**
|
||||
* WPML\ST\Gettext\Hooks class file.
|
||||
*
|
||||
* @package WPML\ST
|
||||
*/
|
||||
|
||||
namespace WPML\ST\Gettext;
|
||||
|
||||
use SitePress;
|
||||
use function WPML\Container\make;
|
||||
use WPML\ST\Gettext\Filters\IFilter;
|
||||
use WPML\ST\StringsFilter\Provider;
|
||||
|
||||
/**
|
||||
* Class WPML\ST\Gettext\Hooks
|
||||
*/
|
||||
class Hooks implements \IWPML_Action {
|
||||
|
||||
/** @var Filters\IFilter[] $filters */
|
||||
private $filters = [];
|
||||
|
||||
/**
|
||||
* @var SitePress SitePress
|
||||
*/
|
||||
private $sitepress;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
private $string_cache = [];
|
||||
|
||||
/**
|
||||
* @var string|null
|
||||
*/
|
||||
private $lang;
|
||||
|
||||
public function __construct( SitePress $sitepress ) {
|
||||
$this->sitepress = $sitepress;
|
||||
}
|
||||
|
||||
/**
|
||||
* Init hooks.
|
||||
*/
|
||||
public function add_hooks() {
|
||||
add_action( 'plugins_loaded', array( $this, 'init_gettext_hooks' ), 2 );
|
||||
}
|
||||
|
||||
public function addFilter( IFilter $filter ) {
|
||||
$this->filters[] = $filter;
|
||||
}
|
||||
|
||||
public function clearFilters() {
|
||||
$this->filters = [];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $lang
|
||||
*/
|
||||
public function switch_language_hook( $lang ) {
|
||||
$this->lang = $lang;
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws \WPML\Auryn\InjectionException
|
||||
* @deprecated since WPML ST 3.0.0
|
||||
*/
|
||||
public function clear_filters() {
|
||||
// @todo: This is used in WCML tests, we will have to adjust there accordingly.
|
||||
/** @var Provider $filter_provider */
|
||||
$filter_provider = make( Provider::class );
|
||||
$filter_provider->clearFilters();
|
||||
}
|
||||
|
||||
/**
|
||||
* Init gettext hooks.
|
||||
*/
|
||||
public function init_gettext_hooks() {
|
||||
add_filter( 'gettext', [ $this, 'gettext_filter' ], 9, 3 );
|
||||
add_filter( 'gettext_with_context', [ $this, 'gettext_with_context_filter' ], 1, 4 );
|
||||
add_filter( 'ngettext', [ $this, 'ngettext_filter' ], 9, 5 );
|
||||
add_filter( 'ngettext_with_context', [ $this, 'ngettext_with_context_filter' ], 9, 6 );
|
||||
add_action( 'wpml_language_has_switched', [ $this, 'switch_language_hook' ] );
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $translation
|
||||
* @param string $text
|
||||
* @param string|array $domain
|
||||
* @param string|false $name Deprecated since WPML ST 3.0.0 (the name should be automatically created as a hash)
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function gettext_filter( $translation, $text, $domain, $name = false ) {
|
||||
if ( is_array( $domain ) ) {
|
||||
$domain_key = implode( '', $domain );
|
||||
} else {
|
||||
$domain_key = $domain;
|
||||
}
|
||||
|
||||
if ( ! $name ) {
|
||||
$name = md5( $text );
|
||||
}
|
||||
|
||||
if ( ! $this->lang ) {
|
||||
$this->lang = $this->sitepress->get_current_language();
|
||||
}
|
||||
|
||||
$key = $translation . $text . $domain_key . $name . $this->lang;
|
||||
|
||||
if ( isset( $this->string_cache[ $key ] ) ) {
|
||||
return $this->string_cache[ $key ];
|
||||
}
|
||||
|
||||
foreach ( $this->filters as $filter ) {
|
||||
$translation = $filter->filter( $translation, $text, $domain, $name );
|
||||
}
|
||||
|
||||
$this->string_cache[ $key ] = $translation;
|
||||
|
||||
return $translation;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $translation
|
||||
* @param string $text
|
||||
* @param string $context
|
||||
* @param string $domain
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function gettext_with_context_filter( $translation, $text, $context, $domain ) {
|
||||
if ( $context ) {
|
||||
$domain = [
|
||||
'domain' => $domain,
|
||||
'context' => $context,
|
||||
];
|
||||
}
|
||||
|
||||
return $this->gettext_filter( $translation, $text, $domain );
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $translation
|
||||
* @param string $single
|
||||
* @param string $plural
|
||||
* @param string $number
|
||||
* @param string|array $domain
|
||||
* @param string|false $context
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function ngettext_filter( $translation, $single, $plural, $number, $domain, $context = false ) {
|
||||
if ( $number == 1 ) {
|
||||
$string_to_translate = $single;
|
||||
} else {
|
||||
$string_to_translate = $plural;
|
||||
}
|
||||
|
||||
return $this->gettext_with_context_filter( $translation, $string_to_translate, $context, $domain );
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $translation
|
||||
* @param string $single
|
||||
* @param string $plural
|
||||
* @param string $number
|
||||
* @param string $context
|
||||
* @param string $domain
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function ngettext_with_context_filter( $translation, $single, $plural, $number, $context, $domain ) {
|
||||
return $this->ngettext_filter( $translation, $single, $plural, $number, $domain, $context );
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user