Как заставить WordPress временно переключать язык (используя qTranslate)?

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

До сих пор я работаю, сохраняя локализацию заказа как настраиваемое поле и подключая свой код к механизму отправки электронной почты 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); 

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

И я понял. Не удалось перезагрузить текстовый домен для 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(); 

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

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

 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'] ) ); } } 

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

 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; }