プラグインを使用していない場合、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で__()文字列を使用する前にロケールを設定してtextdomainをロードしようとしましたが、役に立たなかった(直前に試し、DOING_AJAXのadmin_initフックでも)、両方とも機能しませんでした。
setlocale(LC_ALL, $_POST['lang']);
load_theme_textdomain( 'my_txt_domain', get_template_directory() . '/languages' );
ヒントはありがたいです!
WPMLを使用して後からこれを解決することができましたが、やがてWPMLが非常に肥大化して低速であり、サポートがあまり良くないことがわかりました。ない)またはおそらく2、あなたはそれを必要としません。必要なものは次のとおりです。
LOCALE=de_DE
またはdefine('LOCALE', 'de_DE')
です。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/ をお勧めしますが、必須ではありません。
Yarnを介した翻訳でも 。potファイルを生成 にすてきな方法を提供します。それに基づいて、必要な言語の.POファイルを作成し、翻訳のために送信し、上記の手順に従うだけで簡単です(LOCALEに基づいて、de_DE.moという名前の言語フォルダーに.moファイルを置くことを忘れないでください) 、すべてが期待どおりに機能します。
要するに、私の場合にうまくいった解決策は次のとおりです。
<?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');