web-dev-qa-db-ja.com

Ajaxリクエストでロケールを設定する方法

フロントエンドの言語としてロシア語と英語の両方を使用できるWebサイトを開発しています。テーマは両方の言語で文字列を翻訳しました。

今私の問題は、私がログインしているときにフックを使用するときはいつでも(たとえば、パブリッシュを投稿するためにフックする)、文字列はWebサイトではなくユーザーのロケールに基づいて翻訳されます。これらの文字列はメタデータとして保存されるので、保存後に変更することはできません。

これは誰かがadmin-ajaxを使ってリクエストを送信したときにも起こります。応答はフロントエンドではなくユーザーのロケールを使用します。だから私はそれを制御することはできません。

例:

add_action('wp_ajax_my_ajax', 'my_ajax_function');
function my_ajax_function(){
    _e('Hello!','text-domain');
}

Hello!文字列は、ユーザーの言語ではなくWebサイトの言語にする必要があります。

例2:

add_action( 'publish_post', 'example_hook' );
function example_hook($post_id){
    $data = __('Hello!','text-domain');
    add_post_meta($post_id, 'my_metadata', $data);
}

これにより、投稿を公開したユーザーの言語に基づいたHello!の翻訳が節約されます。これはクールではないため、Webサイトの言語に基づく必要があります。

Webサイトのロケールを使用するようにテーマで行われていることすべて(functions.phpのajaxハンドラーを含む)を設定することは可能ですか?

4
Jack Johansson

(この種の問題は、私の標準的な推奨が2つの言語のフロントエンドを持たないことである理由の一部です)

問題の主な理由はあなたのajaxがテキストを返すことです。 AJAXはフロントエンドがヒューマンテキストに変換する機械レベルの値を提供するAPIのように扱われるべきです。あなたのコードがそのように構築されているとき、あなたはまたあなたのビジネスロジックがプレゼンテーションのものから切り離されているので、あなたはより良くそしてより柔軟なコードになるでしょう。

そのため、AJAXを処理するJSにテキスト変換の値を含める必要があります(開発時間が短い場合は、整数型の値ではなく、プレーンテキストの代わりに英語のテキストを「値」として使用します)。テキスト。

これは明らかにJSを肥大化させるため、コンテキストに基づいて必要なものだけをエンキューするためにwp_localize_scriptを使用することをお勧めしますが、それをJS自体に含めるだけでは終わりません。 (これが通常のwordpressの.moファイルに含まれている場合、実際の翻訳をどのように取得するかに大きく左右されます。その場合、最初の選択肢が唯一の選択肢です)。

(あなたのサイトが英語であってもwtf?を考える人々のために、あなたはたぶん日付時間ローカライズをする必要があります、そしてそれはブラウザ側でのみ行うことができます。現在のところWPではあまり一般的ではありませんが、実際にはその方法でしか解決できない問題がいくつかあります。そのため、JSでのローカライズの拡張は当然のことです)

2
Mark Kaplun