AJAX-不带插件的getText

时间:2018-04-04 作者:trainoasis

如果不使用任何插件,您将如何设置AJAX调用中返回的正确语言?

只需将WPLANG定义为适当的语言环境,页面中的所有其他字符串都可以正常工作。

示例:

function lpml_get_quiz_result_callback() 
{

    // do plenty of stuff before this 

    // this is always returned in original english language, even if I setlocale before or load textdomain manually.
    $message = __(\'Some english defined string\', \'my_txt_domain\');
    $status = true;

    echo json_encode(array(\'status\' => $status, \'message\' => $message));
    die(); 

} 

add_action(\'wp_ajax_lpml_get_quiz_result\', \'lpml_get_quiz_result_callback\');
add_action(\'wp_ajax_nopriv_lpml_get_quiz_result\', \'lpml_get_quiz_result_callback\');
我检查了以下问题:q1, q2, 但没有一个适用/解决我的问题:/

在ajax中使用\\uuu()字符串之前,我尝试设置语言环境和加载textdomain,但都没有成功(之前尝试过,在admin\\u init hook中也尝试过使用\\u ajax),这两种方法都不起作用。

setlocale(LC_ALL, $_POST[\'lang\']);

load_theme_textdomain( \'my_txt_domain\', get_template_directory() . \'/languages\' );
感谢您的任何提示!

2 个回复
最合适的回答,由SO网友:trainoasis 整理而成

后来我确实通过使用WPML解决了这个问题,但随着时间的推移,我发现WPML非常臃肿和缓慢,支持不是很好,如果您只需要1种语言(但主题的原始字符串是英语的,您需要的语言不是英语)或2种语言,您就不需要它了。您唯一需要的是:

在主题中设置区域设置。env或wp配置。php。例如LOCALE=de_DEdefine(\'LOCALE\', \'de_DE\') 对于wp配置load_theme_textdomain( \'your_domain\', get_template_directory() . \'/languages\' );

根据设置位置,通过过滤器设置语言环境/** * Set locale based on our .env LOCALE */ add_filter( \'locale\', function($locale) { if ( !is_admin() && getenv(\'LOCALE\') !== false) $locale = getenv(\'LOCALE\'); return $locale; });

另外,我非常推荐https://roots.io/sage/ 启动主题,但这不是必需的。

它提供了一种很好的方法generate your .pot file 也可通过纱线进行翻译。基于此,很容易创建。从it中订购所需语言的文件,并将其发送以进行翻译,只需按照上述步骤操作即可(不要忘记将.mo文件放在languages文件夹中,根据您的语言环境命名为de\\u de.mo,并且一切正常。

SO网友:Valentin Genev

简而言之,以下是在我的案例中有效的解决方案:

<?php
function my_theme_ajax_load_more_products() {
    // Using the load_textdomain() function to make sure that
    // the translation file used in the template below is loaded.
    // This is the line that solves the issue, more on it bellow.
    load_textdomain(\'woocommerce\', WP_CONTENT_DIR . \'/languages/plugins/woocommerce-\' . get_locale() . \'.mo\');

    // Some code not related to the issue to give some plain context.
    $args           = json_decode(stripslashes($_POST[\'query_vars\']), true);
    $args[\'offset\'] = $_POST[\'offset\']; 
    $query          =new WP_Query($args);

    if ($query->have_posts()) :  
       while ($query->have_posts()) : $query->the_post();

            // This is standart template part.
            // It contains plenty gettext calls pointed to
            // WooCommerce\'s text domain.

            // The gettext calls were ending untranslated before I
            // added the load_textdomain().
            wc_get_template_part(\'content\', \'product\');

        endwhile;
    endif;

    wp_reset_postdata();

    die;
}
add_action(\'wp_ajax_load_more_products\', \'my_theme_ajax_load_more_products\');
add_action(\'wp_ajax_nopriv_load_more_products\', \'my_theme_ajax_load_more_products\');
我用了get_locale() 在代码中的多个位置(甚至在AJAX操作中)执行函数,以确保获得正确的语言环境。获得正确的代码使我认为未翻译文本的问题与text domain. 我已经将主题的文本域添加为described in WP\'s docs 我将一些测试文本翻译成保加利亚语(因此我生成了bg\\u bg.mo),但AJAX操作中的gettext函数没有翻译测试文本。

经过更多的研究,我发现一个人可以添加一个。mo文件load_textdomain() 而不是使用load_theme_textdomain(). 因为我需要WooCommerce文本域中的所有翻译load_textdomain() 指向WooCommerce的。mo文件。WooCommerce\'s docs 说文件在wp-content/languages/.

// For translations of plugins as WooCommerce
load_textdomain(\'woocommerce\', WP_CONTENT_DIR . \'/languages/plugins/woocommerce-\' . get_locale() . \'.mo\');

// WP_CONTENT_DIR gets the directory path of the wp-content folder
// get_locale() returns the current language code of the page

// For translations of your theme
load_textdomain(\'woocommerce\', get_template_directory() . \'/languages/\' . get_locale() . \'.mo\');
Load text domain\'s docs.

结束

相关推荐

为什么admin-ajax.php中的$_REQUEST是空数组?

我正在尝试使用AJAX上传文件,我正在挂接我的函数,以便在admin AJAX中调用它们。我不能让它工作得很艰难,我也不知道到底出了什么问题,也不知道该去哪里看。然而,我通过修改管理ajax缩小了范围。php一点:// Require an action parameter if ( empty( $_REQUEST[\'action\'] ) ) { $response = array( \'error\' => \'no action parame