web-dev-qa-db-ja.com

Ajax-プラグインなしのgettext

プラグインを使用していない場合、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');

私はこれらの質問をチェックしました: q1q2 、しかし何も適用/解決しません私の場合。 :/

私はajaxで__()文字列を使用する前にロケールを設定してtextdomainをロードしようとしましたが、役に立たなかった(直前に試し、DOING_AJAXのadmin_initフックでも)、両方とも機能しませんでした。

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

load_theme_textdomain( 'my_txt_domain', get_template_directory() . '/languages' );

ヒントはありがたいです!

2
trainoasis

WPMLを使用して後からこれを解決することができましたが、やがてWPMLが非常に肥大化して低速であり、サポートがあまり良くないことがわかりました。ない)またはおそらく2、あなたはそれを必要としません。必要なものは次のとおりです。

  1. テーマ.envまたはwp-config.phpでLOCALEを設定します。例は、wp-configの場合はLOCALE=de_DEまたはdefine('LOCALE', 'de_DE')です。
  2. .MOファイルの場所に基づいてテキストドメインをロードします(これをafter_setup_themeフックで実行します)

load_theme_textdomain( 'your_domain', get_template_directory() . '/languages' );

  1. 設定した場所に基づいて、フィルターを介してロケールを設定します

/** * 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/ をお勧めしますが、必須ではありません。

Yarnを介した翻訳でも 。potファイルを生成 にすてきな方法を提供します。それに基づいて、必要な言語の.POファイルを作成し、翻訳のために送信し、上記の手順に従うだけで簡単です(LOCALEに基づいて、de_DE.moという名前の言語フォルダーに.moファイルを置くことを忘れないでください) 、すべてが期待どおりに機能します。

1
trainoasis

要するに、私の場合にうまくいった解決策は次のとおりです。

<?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');

正しいロケールを確実に取得するために、AJAXアクションであっても、コード内のいくつかの場所でget_locale()関数を使用しました。適切なコードを取得することで、未翻訳のテキストの問題はtext domainと結びついていると考えるようになりました。テーマのテキストドメインを WPのドキュメントで説明 として追加し、テストテキストをブルガリア語に翻訳しました(そのためbg_BG.moを生成しました)が、AJAX内のgettext関数はアクションはテストテキストを翻訳しませんでした。

さらに調査した結果、load_textdomain()を使用する代わりに、load_theme_textdomain()を使用して単一の.moファイルを追加できることがわかりました。すべての翻訳はWooCommerceのテキストドメインにあるため、WooCommerceの.moファイルを指すにはload_textdomain()が必要でした。 WooCommerceのドキュメント は、ファイルが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');

テキストドメインのドキュメントを読み込む

0
Valentin Genev