如何强制WordPress临时切换区域设置(使用qTranslate)?

时间:2012-11-18 作者:olex

我有一个运行WooCommerce和qTranslate的多语言商店,正在尝试设置多语言客户电子邮件。问题是,“订单完成”电子邮件是从管理后端发送的,它是用后端使用的语言发送的,而不是用最初下单时使用的语言。

到目前为止,我的工作是将订单区域设置存储为自定义字段,并将代码插入WooCommerce的电子邮件发送机制。我现在需要做的是动态地将当前区域设置切换到订单数据中保存的区域设置,发送电子邮件,然后将其切换回来。

目前,我正在尝试在许多地方强制使用locale,但都不起作用。以下是当前代码:

// 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() 调用是使用当前语言字符串而不是顺序语言中的字符串生成的。有没有办法解决这个问题?

2 个回复
SO网友:olex

我明白了。缺少的是重新加载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();
设置语言环境变量的一些调用可能是多余的和/或根本不必要的,但这是可行的。

SO网友:deweydb

好吧,对于那些后来偶然发现这个问题的人,这里有一个更完整的答案。

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

结束