在AJAX中调用getText时不会进行转换

时间:2013-11-08 作者:ako977

当在gettext调用(\\uu()、\\ u e()等)中加载内容时,当我在浏览器中正常呈现页面时,它们可以很好地进行翻译(PHP将内容传递给浏览器),但是当我进行AJAX调用时,gettext不会进行翻译。

我想可能就是这个词,但当我在通常从服务器(而不是通过ajax)加载的内容中使用gettext调用时,它会进行翻译。我正在使用WPML,但我不认为这与它有任何关系?

是否有什么特殊的事情需要我做,或者将load\\u plugin\\u textdomain函数调用添加到特定的操作挂钩?

它现在已添加到“plugins\\u loaded”操作中。我使用他们文档中描述的WordPress ajax方法,我得到了所有数据,只是没有得到gettext翻译。

正如这里所建议的,这些代码片段存在问题。我没有包含gettext。罐和。据我所知,mo文件是有效的(bc/其中的其他文本将在插件本身的其余部分进行翻译)。我只是说明它们的名称以及它们与插件根相关的位置。

//gettext files
// languages/my-plugin-fr_FR.pot
// languages/my-plugin-fr_FR.mo

//Javascript files
// js/main.js
(function($){

  function getResources() {
        $.ajax({
            type: "POST",
            url: ajax_object.ajaxurl,
            dataType: "json",
            data: {                    
                action: \'get_resources\'               
            }
        })
        .done(function(data) {
            if (typeof data == "object" && data.hasOwnProperty("html")) {               
                $(".my-selector").empty().html(data.html);
            } else {
               alert("error on server");              
            }
        })
        .fail(function() {
            alert("error on server");  
        });
    }

  $(document).ready(function() {
     getResources();
  });

})(jQuery);
// end js/main.js


<?php
//MyPlugin class

class MyPlugin {    
  /// This value will be used as a unique identifier for translations
  public static $theme_domain_name = \'my-plugin\';

  public function init() {
     if (!is_admin()) {         
      //any scripts and styles needed for the plugin to work in the front end
      add_action( \'wp_enqueue_scripts\', array($this,\'add_scripts_styles\') );     
    }

    add_action(\'wp_ajax_get_resources\', array($this,\'ajax_get_resources\'));
    add_action(\'wp_ajax_nopriv_get_resources\', array($this,\'ajax_get_resources\'));
  }

  public function ajax_get_resources() {        
        $html = "";

        //just an example of returning post objects
        $posts = get_posts();

        $html .= $this->get_resources_html($posts);

        echo json_encode(array(\'html\'=>$html));

        die();
  }

  public function add_scripts_styles() {
     wp_register_script(\'main-js\', plugin_dir_url(__FILE__) . \'js/main.js\', array(\'jquery\'), \'20131023\' );
     wp_enqueue_script(\'main-js\' );
     wp_localize_script(\'main-js\', \'ajax_object\', array( \'ajaxurl\' => admin_url( \'admin-ajax.php\' ) ) );
  }

  public function get_resources_html($resources) {
     $load_more_text = __(\'Load more\',MyPlugin::$theme_domain_name);       

     //$html .= < do some other work on the resource posts provided >

     $html .= <<<LOAD
<a href="#">
    <span class="text-wrapper"><span class="text">
    {$load_more_text}
    </span></span>
</a>
LOAD;

    return $html;
  }
}
?>

<?php
//root plugin file my-plugin.php

require_once dirname( __FILE__ ) .\'/MyPlugin.php\';

$MyPlugin = new MyPlugin();    

add_action("plugins_loaded",function() {
    load_plugin_textdomain(MyPlugin::$theme_domain_name , false, dirname( plugin_basename(__FILE__) ) . \'/languages/\');
});

$MyPlugin->init();
?>

2 个回复
SO网友:alibabaei

为时已晚,但供公众使用:

/* if qTranslate is installed */
/* set front locale for ajax calls requested from front-end */

function set_locale_for_frontend_ajax_calls() {

    if ( is_admin() && defined( \'DOING_AJAX\' ) && DOING_AJAX
        && substr( $_SERVER[\'HTTP_REFERER\'], 0, strlen( admin_url() ) ) != admin_url() ) {

        load_theme_textdomain( \'your-theme-domain-name\', get_template_directory() . \'/languages’ );
    }
}

add_action( \'admin_init\', \'set_locale_for_frontend_ajax_calls\' );

add_action(\'wp_head\',\'jsURLs\');

function jsURLs(){

    global $q_config;

    ?><script type="text/javascript">
        /* <![CDATA[ */
        var ajaxurl      = "<?php echo admin_url(\'admin-ajax.php?lang=\'.$q_config[\'language\']); ?>";
        /* ]]> */
    </script><?php

}
如果安装了qTranslate,它对我来说是可行的,但如果不安装,则以下操作可能可行:

/* if qTranslate is not installed */
/* set front locale for ajax calls requested from front-end */

function set_locale_for_frontend_ajax_calls() {

    if ( is_admin() && defined( \'DOING_AJAX\' ) && DOING_AJAX
        && substr( $_SERVER[\'HTTP_REFERER\'], 0, strlen( admin_url() ) ) != admin_url() ) {
        setlocale(LC_ALL, $_GET[\'lang\']);
        load_theme_textdomain( \'your-theme-domain-name\', get_template_directory() . \'/languages’ );
    }
}

add_action( \'admin_init\', \'set_locale_for_frontend_ajax_calls\' );

add_action(\'wp_head\',\'jsURLs\');

function jsURLs(){

    global $q_config;

    ?><script type="text/javascript">
        /* <![CDATA[ */
        var ajaxurl      = "<?php echo admin_url(\'admin-ajax.php?lang=\'.get_locale()); ?>";
        /* ]]> */
    </script><?php

}

SO网友:ludovico

由于您使用的是WPML,因此可以获取当前语言,然后使用lang ajax请求中的参数:


<?php
    global $sitepress;
    $current_language = $sitepress->get_current_language(); // get current language
?>



(function($){

  function getResources() {
        $.ajax({
            type: "POST",
            url: ajax_object.ajaxurl,
            dataType: "json",
            data: {                    
                action: \'get_resources\',
                lang:  <?php echo $current_language;  ?>
            }
        })


[...]

结束

相关推荐

AJAX表单似乎已发送,但未返回

我有一个非常简单的表单,有3个复选框,允许用户将视频标记为不合适。我试图发出一个简单的ajax请求来创建一封电子邮件,并给用户一些反馈。表单似乎已发布,信息已发送到标题中,但未返回任何内容。我对使用ajax真的很陌生,所以我肯定我错过了一些东西。模板文件。php:<script type=\"text/javascript\"> var ajaxurl = \'<?php echo admin_url(\'admin-ajax.