it-swarm.com.de

Wie wird das Gebietsschema in Ajax-Anforderungen festgelegt?

Ich entwickle eine Website, die sowohl Russisch als auch Englisch als Front-End-Sprache verwenden kann. Das Theme hat Strings in beide Sprachen übersetzt.

Nun ist mein Problem, wann immer ich einen Hook benutze, wenn ich eingeloggt bin (zum Beispiel um zu veröffentlichen), werden die Strings basierend auf dem Gebietsschema des Benutzers übersetzt, nicht der Website. Diese Zeichenfolgen werden als Metadaten gespeichert, sodass ich sie nach dem Speichern nicht mehr ändern kann.

Dies passiert auch, wenn jemand eine Anfrage mit admin-ajax sendet. Die Antwort verwendet das Gebietsschema des Benutzers anstelle der Front-Ends. Ich habe also keine Kontrolle darüber.

Beispiel:

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

Ich möchte, dass die Zeichenfolge Hello! in der Sprache der Website und nicht in der des Benutzers angezeigt wird.

Beispiel 2:

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

Dadurch wird eine Übersetzung von Hello! gespeichert, die auf der Sprache des Benutzers basiert, der den Beitrag veröffentlicht hat. Dies ist nicht cool und sollte auf der Sprache der Website basieren.

Ist es möglich, alles, was im Theme passiert (einschließlich Ajax-Handler in functions.php), so einzustellen, dass das Gebietsschema der Website verwendet wird?

4
Jack Johansson

(Diese Art von Problemen ist Teil meiner Standardempfehlung, kein zweisprachiges Front-End zu haben.)

Der Hauptgrund für das Problem ist, dass Ihr Ajax Text zurückgibt. AJAX sollte wie eine API behandelt werden, die Werte auf Maschinenebene bereitstellt, die vom Front-End in menschlichen Text übersetzt werden. Wenn Ihr Code so aufgebaut ist, erhalten Sie auch einen besseren und flexibleren Code, da Ihre Geschäftslogik von der Präsentationslogik entkoppelt ist.

Sie sollten also einen Wert für die Textübersetzung in das JS aufnehmen, das das AJAX verarbeitet (wenn Sie die Entwicklungszeit verkürzen, verwenden Sie anstelle von ganzzahligen Werten den englischen Text als "Wert" anstelle von einfach Text.

Dies bläht den JS offensichtlich auf, weshalb es wahrscheinlich besser ist, den wp_localize_script zu verwenden, um nur das in die Warteschlange zu stellen, was aufgrund des Kontexts benötigt wird, aber es ist nicht das Ende der Welt, ihn nur im JS selbst zu haben. (Dies hängt natürlich stark davon ab, wie Sie die eigentliche Übersetzung erhalten. Wenn es sich um die übliche WordPress-Mo-Datei handelt, ist die einzige Option die erste).

(Für Leute, die wtf? denken, müssen Sie höchstwahrscheinlich Datums- und Uhrzeitlokalisierung durchführen, auch wenn Ihre Website auf Englisch ist. Dies ist nur auf der Browserseite möglich. Dasselbe gilt für Währung, Tausendertrennzeichen, also die Idee der JS-Seitenlokalisierung Obwohl es in WP im Moment nicht sehr beliebt ist, gibt es einige Probleme in der realen Welt, die fast nur auf diese Weise gelöst werden können. Daher sollte es eine Selbstverständlichkeit sein, die Lokalisierung in JS zu erweitern.

2
Mark Kaplun