You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
cosmopet.ae/wp-content/plugins copy/woocommerce-multilingual/inc/class-wcml-wc-gateways.php

406 lines
13 KiB

<?php
use WCML\StandAlone\NullSitePress;
use WCML\Utilities\WcAdminPages;
use WPML\API\Sanitize;
use WPML\Collect\Support\Collection;
use WPML\Core\ISitePress;
use WPML\FP\Fns;
use function WCML\functions\isStandAlone;
class WCML_WC_Gateways {
const WCML_BACS_ACCOUNTS_CURRENCIES_OPTION = 'wcml_bacs_accounts_currencies';
const STRINGS_CONTEXT = 'admin_texts_woocommerce_gateways';
private $current_language;
/** @var woocommerce_wpml */
private $woocommerce_wpml;
/** @var SitePress|NullSitePress */
private $sitepress;
/**
* @param woocommerce_wpml $woocommerce_wpml
* @param SitePress|NullSitePress $sitepress
*/
public function __construct( woocommerce_wpml $woocommerce_wpml, ISitePress $sitepress ) {
$this->sitepress = $sitepress;
$this->woocommerce_wpml = $woocommerce_wpml;
$this->current_language = $this->sitepress->get_current_language();
if ( 'all' === $this->current_language ) {
$this->current_language = $this->sitepress->get_default_language();
}
}
public function add_hooks() {
if ( isStandAlone() ) {
if ( WcAdminPages::isPaymentSettings() ) {
add_action( 'init', [ $this, 'load_bacs_gateway_currency_selector_hooks' ], 11 );
}
} else {
add_action( 'init', [ $this, 'on_init_hooks' ], 11 );
add_filter( 'woocommerce_payment_gateways', Fns::withoutRecursion( Fns::identity(), [ $this, 'loaded_woocommerce_payment_gateways' ] ) );
}
}
public function on_init_hooks() {
add_filter( 'woocommerce_gateway_title', [ $this, 'translate_gateway_title' ], 10, 2 );
add_filter( 'woocommerce_gateway_description', [ $this, 'translate_gateway_description' ], 10, 2 );
if ( WcAdminPages::isPaymentSettings() ) {
add_action( 'admin_footer', [ $this, 'show_language_links_for_gateways' ] );
$this->load_bacs_gateway_currency_selector_hooks();
}
}
public function load_bacs_gateway_currency_selector_hooks() {
if ( WcAdminPages::isSection( WcAdminPages::SECTION_BACS ) && wcml_is_multi_currency_on() ) {
$this->set_bacs_gateway_currency();
add_action( 'admin_footer', [ $this, 'append_currency_selector_to_bacs_account_settings' ] );
}
}
public function loaded_woocommerce_payment_gateways( $load_gateways ) {
foreach ( $load_gateways as $key => $gateway ) {
$load_gateway = $gateway;
if ( is_string( $gateway ) ) {
if ( class_exists( $gateway ) ) {
$load_gateway = new $gateway();
} else {
continue;
}
}
$this->register_gateway_settings_strings( $load_gateway->id, $load_gateway->settings );
$this->payment_gateways_filters( $load_gateway );
$load_gateways[ $key ] = $load_gateway;
}
return $load_gateways;
}
/**
* @param string $gateway_id
* @param array $settings
*/
public function register_gateway_settings_strings( $gateway_id, $settings ) {
if ( isset( $settings['enabled'] ) && 'yes' === $settings['enabled'] ) {
foreach ( $this->get_gateway_text_keys_to_translate() as $text_key ) {
if ( isset( $settings[ $text_key ] ) && ! $this->get_gateway_string_id( $settings[ $text_key ], $gateway_id, $text_key ) ) {
$language = $this->gateway_setting_language( $settings[ $text_key ], $gateway_id, $text_key );
icl_register_string( self::STRINGS_CONTEXT, $gateway_id . '_gateway_' . $text_key, $settings[ $text_key ], false, $language );
}
}
}
}
/**
* @param WC_Payment_Gateway $gateway
*/
public function payment_gateways_filters( $gateway ) {
if ( isset( $gateway->id ) ) {
$this->translate_gateway_strings( $gateway );
}
}
/**
* @param WC_Payment_Gateway $gateway
*/
public function translate_gateway_strings( $gateway ) {
if ( isset( $gateway->enabled ) && $gateway->enabled !== 'no' ) {
if ( isset( $gateway->instructions ) ) {
$gateway->instructions = $this->translate_gateway_instructions( $gateway->instructions, $gateway->id );
}
if ( isset( $gateway->description ) ) {
$gateway->description = $this->translate_gateway_description( $gateway->description, $gateway->id );
}
if ( isset( $gateway->title ) ) {
$gateway->title = $this->translate_gateway_title( $gateway->title, $gateway->id );
}
}
}
public function translate_gateway_title( $title, $gateway_id ) {
return $this->get_translated_gateway_string( $title, $gateway_id, 'title' );
}
public function translate_gateway_description( $description, $gateway_id ) {
return $this->get_translated_gateway_string( $description, $gateway_id, 'description' );
}
public function translate_gateway_instructions( $instructions, $gateway_id ) {
return $this->get_translated_gateway_string( $instructions, $gateway_id, 'instructions' );
}
public function get_translated_gateway_string( $string, $gateway_id, $name ) {
$translated_string = apply_filters(
'wpml_translate_single_string',
$string,
self::STRINGS_CONTEXT,
$gateway_id . '_gateway_' . $name,
$this->get_current_gateway_language()
);
if ( $translated_string === $string ) {
$translated_string = __( $string, 'woocommerce' );
if ( 'cheque' === $gateway_id && $translated_string === $string && 'title' === $name ) {
$translated_string = _x( $string, 'Check payment method', 'woocommerce' );
}
}
return $translated_string;
}
/**
* @return string
*/
private function get_current_gateway_language() {
$postData = wpml_collect( $_POST );
if ( $postData->isNotEmpty() ) {
if ( $this->is_user_order_note( $postData ) ) {
$current_gateway_language = WCML_Orders::getLanguage( $postData->get( 'post_id' ) );
} elseif ( $this->is_refund_line_item( $postData ) ) {
$current_gateway_language = WCML_Orders::getLanguage( $postData->get( 'order_id' ) );
} else {
$current_gateway_language = $this->get_order_action_gateway_language( $postData );
}
} else {
$current_gateway_language = $this->get_order_ajax_action_gateway_language();
}
/**
* Filters the current gateway language
*
* @since 4.9.0
*
* @param string $current_gateway_language
*/
return apply_filters( 'wcml_current_gateway_language', $current_gateway_language );
}
/**
* @param Collection $postData
*
* @return bool
*/
private function is_user_order_note( Collection $postData ) {
return 'woocommerce_add_order_note' === $postData->get( 'action' ) && 'customer' === $postData->get( 'note_type' );
}
/**
* @param Collection $postData
*
* @return bool
*/
private function is_refund_line_item( Collection $postData ){
return 'woocommerce_refund_line_items' === $postData->get( 'action' );
}
/**
* @param Collection $postData
*
* @return string
*/
private function get_order_action_gateway_language( Collection $postData ) {
if ( $postData->get( 'post_ID' ) ) {
$is_saving_new_order = wpml_collect( [
'auto-draft',
'draft'
] )->contains( $postData->get( 'post_status' ) )
&& 'editpost' === $postData->get( 'action' )
&& $postData->get( 'save' );
if ( $is_saving_new_order && isset( $_COOKIE[ WCML_Orders::DASHBOARD_COOKIE_NAME ] ) ) {
return $_COOKIE[ WCML_Orders::DASHBOARD_COOKIE_NAME ];
}
$is_order_emails_status = wpml_collect( [
'wc-completed',
'wc-processing',
'wc-refunded',
'wc-on-hold'
] )->contains( $postData->get( 'order_status' ) );
$is_send_order_details_action = 'send_order_details' === $postData->get( 'wc_order_action' );
if ( $is_order_emails_status || $is_send_order_details_action ) {
return WCML_Orders::getLanguage( $postData->get( 'post_ID' ) );
}
}
return $this->current_language;
}
/**
* @return string
*/
private function get_order_ajax_action_gateway_language(){
$getData = wpml_collect( $_GET );
if ( $getData->isNotEmpty() ) {
$is_order_ajax_action = 'woocommerce_mark_order_status' === $getData->get( 'action' ) && wpml_collect( [
'completed',
'processing'
] )->contains( $getData->get( 'status' ) );
if ( $is_order_ajax_action && $getData->get( 'order_id' ) ) {
return WCML_Orders::getLanguage( $getData->get( 'order_id' ) );
}
}
return $this->current_language;
}
public function show_language_links_for_gateways() {
$text_keys = $this->get_gateway_text_keys_to_translate();
$wc_payment_gateways = WC_Payment_Gateways::instance();
foreach ( $wc_payment_gateways->payment_gateways() as $payment_gateway ) {
if ( isset( $_GET['section'] ) && $_GET['section'] == $payment_gateway->id ) {
foreach ( $text_keys as $text_key ) {
if ( isset( $payment_gateway->settings[ $text_key ] ) ) {
$setting_value = $payment_gateway->settings[ $text_key ];
} elseif ( $text_key === 'instructions' ) {
$setting_value = $payment_gateway->description;
} else {
$setting_value = $payment_gateway->$text_key;
}
$input_name = $payment_gateway->plugin_id . $payment_gateway->id . '_' . $text_key;
$gateway_option = $payment_gateway->plugin_id . $payment_gateway->id . '_settings';
$lang_selector = new WPML_Simple_Language_Selector( $this->sitepress );
$language = $this->gateway_setting_language( $setting_value, $payment_gateway->id, $text_key );
$lang_selector->render(
[
'id' => $gateway_option . '_' . $text_key . '_language_selector',
'name' => 'wcml_lang-' . $gateway_option . '-' . $text_key,
'selected' => $language,
'show_please_select' => false,
'echo' => true,
'style' => 'width: 18%;float: left;margin-top: 3px;',
]
);
$st_page = admin_url( 'admin.php?page=' . WPML_ST_FOLDER . '/menu/string-translation.php&context=' . self::STRINGS_CONTEXT . '&search=' . esc_attr( preg_replace( "/[\n\r]/", '', $setting_value ) ) );
?>
<script>
var input = jQuery('#<?php echo esc_js( $input_name ); ?>');
if ( input.length > 0 ) {
input.parent().append('<div class="translation_controls"></div>');
input.parent().find('.translation_controls').append('<a href="<?php echo $st_page; ?>" style="margin-left: 10px"><?php _e( 'translations', 'woocommerce-multilingual' ); ?></a>');
jQuery('#<?php echo $gateway_option . '_' . $text_key . '_language_selector'; ?>').prependTo( input.parent().find('.translation_controls') );
}else{
jQuery('#<?php echo $gateway_option . '_' . $text_key . '_language_selector'; ?>').remove();
}
</script>
<?php
}
}
}
}
private function gateway_setting_language( $setting_value, $gateway_id, $text_key ) {
if ( $this->get_gateway_string_id( $setting_value, $gateway_id, $text_key ) ) {
return $this->woocommerce_wpml->strings->get_string_language( $setting_value, self::STRINGS_CONTEXT, $gateway_id . '_gateway_' . $text_key );
} else {
return $this->sitepress->get_default_language();
}
}
private function get_gateway_string_id( $value, $gateway_id, $name ) {
return icl_get_string_id( $value, self::STRINGS_CONTEXT, $gateway_id . '_gateway_' . $name );
}
public function set_bacs_gateway_currency() {
foreach ( $_POST as $key => $value ) {
if ( '_enabled' === substr( $key, -8 ) ) {
$gateway = str_replace( '_enabled', '', $key );
}
}
if ( isset( $gateway ) ) {
if ( 'woocommerce_bacs' === $gateway && isset( $_POST['bacs-currency'] ) ) {
update_option( self::WCML_BACS_ACCOUNTS_CURRENCIES_OPTION, array_map( [ Sanitize::class, 'string' ], $_POST['bacs-currency'] ) );
}
}
}
public function get_gateway_text_keys_to_translate() {
$text_keys = [
'title',
'description',
'instructions',
];
return apply_filters( 'wcml_gateway_text_keys_to_translate', $text_keys );
}
public function append_currency_selector_to_bacs_account_settings() {
$template_loader = new WPML_Twig_Template_Loader( [ $this->sitepress->get_wp_api()->constant( 'WCML_PLUGIN_PATH' ) . '/templates/multi-currency/' ] );
$currencies_dropdown_ui = new WCML_Currencies_Dropdown_UI( $template_loader );
list( $default_dropdown, $currencies_output ) = $this->get_dropdown( $currencies_dropdown_ui );
wp_enqueue_script( 'wcml-bacs-accounts-currencies', WCML_PLUGIN_URL . '/res/js/bacs-accounts-currencies' . WCML_JS_MIN . '.js', [ 'jquery' ], WCML_VERSION, true );
wp_localize_script(
'wcml-bacs-accounts-currencies',
'wcml_data',
[
'currencies_dropdown' => $currencies_output,
'label' => __( 'Currency', 'woocommerce-multilingual' ),
'default_dropdown' => $default_dropdown,
]
);
}
/**
* @param WCML_Currencies_Dropdown_UI $currencies_dropdown_ui
*
* @return array
*/
public function get_dropdown( $currencies_dropdown_ui ) {
$bacs_settings = get_option( 'woocommerce_bacs_accounts', [] );
$active_currencies = $this->woocommerce_wpml->multi_currency->get_currency_codes();
$default_currency = wcml_get_woocommerce_currency_option();
$bacs_accounts_currencies = get_option( self::WCML_BACS_ACCOUNTS_CURRENCIES_OPTION, [] );
$currencies_output = [];
$default_dropdown = $currencies_dropdown_ui->get( $active_currencies, $default_currency );
if ( $bacs_settings ) {
foreach ( $bacs_settings as $id => $account_settings ) {
$currencies_output[ $id ] = isset( $bacs_accounts_currencies[ $id ] ) ? $currencies_dropdown_ui->get( $active_currencies, $bacs_accounts_currencies[ $id ] ) : $default_dropdown;
}
} else {
$currencies_output[] = $default_dropdown;
}
return [ $default_dropdown, $currencies_output ];
}
}