Как вынудить Wordpress временно переключить локаль (использующий qTranslate)? [закрытый]

У меня есть многоязычное выполнение хранилища WooCommerce и qTranslate, и пытаюсь установить многоязычные адреса электронной почты клиентов. Проблема, "порядок, полное" электронное письмо послано от администраторского бэкенда, и это отправляется на языке, бэкенд используется в, не на языке, в котором был первоначально сделан порядок.

Что у меня есть работа, до сих пор хранит локаль порядка как пользовательское поле и включает мой код в электронную почту WooCommerce, отправляющую механизм. Что я должен сделать, теперь должен динамично переключить текущую локаль на ту, сохраненную в данных порядка, диспетчеризировать электронную почту и переключить его назад.

В настоящее время я пытаюсь вызвать локаль во множестве мест, но ни один из них не работает. Вот текущий код:

// get order language and its locale from qTranslate config
$order_custom_data = get_post_custom($order_id);
$new_locale = $order_custom_data['Customer Locale'][0];

// save current locale
$old_locale = get_locale();

// set the current locale and send email with it active
setlocale(LC_ALL, $new_locale);
global $q_config, $locale;
$locale = $new_locale;
$q_config['language'] = substr($new_locale, 0, 2);
// dispatch email
global $wc_cle_wc_email;
$wc_cle_wc_email->customer_processing_order($order_id);

// set the old locale back
$q_config['language'] = substr($old_locale, 0, 2);
$locale = $old_locale;
setlocale(LC_ALL, $old_locale);

Отладьте выходные шоу ток и локали порядка, считанные правильно, и a get_locale() назовите параллельными customer_processing_order() производит локаль порядка вместо текущей. Но электронная почта, сгенерированная customer_processing_order() вызов создается с текущими языковыми строками вместо тех, которые на языке порядка. Какие-либо идеи, как работать вокруг этого?

5
18.11.2012, 20:32
2 ответа

И я получил его. То, что отсутствовало, перезагружало текстовый домен для WooCommerce, который был загружен текущей локалью при инициализации:

// set the current locale and send email with it active
unload_textdomain('woocommerce');
setlocale(LC_ALL, $new_locale);
global $q_config, $locale, $woocommerce;
$locale = $new_locale;
$q_config['language'] = substr($new_locale, 0, 2);
$woocommerce->load_plugin_textdomain();

global $wc_cle_wc_email;
$wc_cle_wc_email->customer_completed_order($order_id);

// set the old locale back
unload_textdomain('woocommerce');
$q_config['language'] = substr($old_locale, 0, 2);
$locale = $old_locale;
setlocale(LC_ALL, $old_locale);
$woocommerce->load_plugin_textdomain();

Некоторые вызовы, устанавливающие переменные локали, являются, вероятно, избыточными и/или просто ненужными, но это работает.

5
19.02.2020, 22:07
  • 1
    , куда Вы помещали этот код? действительно ли эта внутренняя часть является рычагом? Я застреваю на той же самой вещи! –  deweydb 12.07.2014, 01:30
  • 2
    Большой, tnx много, этот код сохранил меня, имел немного отличающуюся реализацию: сгенерированный 2 различных файла HTML для 2 различных языков на сообщении сохраняют действие. –  DzoniT 22.10.2016, 01:17

Хорошо, вот немного больше полного ответа для тех, кто натыкается на это позже.

add_filter( 'woocommerce_checkout_fields' , 'custom_override_checkout_fields' );
function custom_override_checkout_fields( $fields ) {
         $fields['order']['language']['placeholder'] = '';
         $fields['order']['language']['type'] = 'text';
         $fields['order']['language']['label'] = 'language';
         $fields['order']['language']['class'] = array('hidden'); 
         $fields['order']['language']['default'] = qtrans_getLanguage();
     return $fields;
}

И затем... необходимо сохранить то поле на контроле, который прост:

/**
 * Save the language to the order (despite what woocommerce doc says this is required)
 */
add_action( 'woocommerce_checkout_update_order_meta', 'my_custom_checkout_field_update_order_meta' );
function my_custom_checkout_field_update_order_meta( $order_id ) {
    if ( ! empty( $_POST['language'] ) ) {
        update_post_meta( $order_id, 'language', sanitize_text_field( $_POST['language'] ) );
    }
}

И затем... (эта часть является небольшим hacky, но я сцепляюсь в начало почтового создания (предмет) и затем изменяю язык на язык порядка). Я не думаю, что действительно необходимо волноваться о возврате его с тех пор, после того как поток умирает, это переключится назад для установки по умолчанию. И это должно просто умереть прямо после отправки этого электронного письма, потому что это только происходит на обратном вызове.

add_filter('woocommerce_email_subject_customer_completed_order', 'waspdigital_order_complete_language_fix', 1, 2);
function waspdigital_order_complete_language_fix( $subject, $order ){
    global $woocommerce;
    $new_locale = get_post_meta( $order->id, 'language', true);
    // set the current locale and send email with it active
    unload_textdomain('woocommerce');
    setlocale(LC_ALL, $new_locale);
    global $q_config, $locale, $woocommerce;
    $locale = $new_locale;
    $q_config['language'] = substr($new_locale, 0, 2);
    $woocommerce->load_plugin_textdomain();

/*
    // set the old locale back
    unload_textdomain('woocommerce');
    $q_config['language'] = substr($old_locale, 0, 2);
    $locale = $old_locale;
    setlocale(LC_ALL, $old_locale);
    $woocommerce->load_plugin_textdomain();
*/

    return $subject;
}
3
19.02.2020, 22:07

Теги

Похожие вопросы