web-dev-qa-db-fra.com

Ajax - gettext sans plugin

Comment feriez-vous pour définir la langue correcte renvoyée dans AJAX appels, lorsque vous n'utilisez aucun plug-in?

Toutes les autres chaînes de la page fonctionnent correctement en définissant simplement WPLANG avec les paramètres régionaux appropriés.

Exemple:

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

J'ai vérifié ces questions: q1 , q2 , mais aucune ne s'applique/ne résout mon cas. : /

J'ai essayé de définir les paramètres régionaux et de charger textdomain avant d'utiliser les chaînes __ () dans ajax, mais en vain (essayé juste avant, et également dans le hook admin_init pour DOING_AJAX), les deux ne fonctionnaient pas.

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

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

Tous les conseils appréciés!

2
trainoasis

J'ai réussi à résoudre ce problème plus tard en utilisant WPML, mais au fil du temps, nous avons constaté que WPML est assez volumineux et lent, le support n'est pas très bon, et si vous n'avez besoin que d'une langue (mais les chaînes originales pour le thème sont en anglais et la langue dont vous avez besoin n'est pas) ou peut-être 2, vous n'en avez pas besoin. La seule chose dont vous avez besoin est:

  1. Définissez LOCALE dans votre thème .env ou wp-config.php. Un exemple serait LOCALE=de_DE ou define('LOCALE', 'de_DE') pour wp-config.
  2. Demandez à votre domaine de texte chargé en fonction de l'emplacement de vos fichiers .MO (exécutez ceci dans le hook after_setup_theme)

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

  1. Configurez vos paramètres régionaux via des filtres en fonction de l'endroit où vous les définissez

/** * Set locale based on our .env LOCALE */ add_filter( 'locale', function($locale) { if ( !is_admin() && getenv('LOCALE') !== false) $locale = getenv('LOCALE'); return $locale; });

En outre, je recommande vivement https://roots.io/sage/ de commencer votre thème, mais ce n’est pas obligatoire.

Il fournit un bon moyen de générer votre fichier .pot pour les traductions via Yarn aussi. Basé sur cela, il est assez facile de créer des fichiers .PO à partir de celui-ci pour les langues dont vous avez besoin, de les envoyer pour traduction et de suivre les étapes ci-dessus (n'oubliez pas de mettre le fichier .mo dans le dossier des langues, nommé de_DE.mo en fonction de votre LOCALE et tout fonctionne comme prévu.

1
trainoasis

En bref, voici la solution qui a fonctionné dans mon cas:

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

J'ai utilisé la fonction get_locale() à plusieurs endroits dans mon code, même dans mon action AJAX, pour m'assurer que les paramètres régionaux étaient corrects. Obtenir le bon code m'a amené à penser que le problème de texte non traduit est lié au domaine de texte . J'ai déjà ajouté le domaine de texte de mon thème comme décrit dans la documentation de WP et j'ai fait traduire un texte de test en bulgare (par conséquent, j'avais bg_BG.mo généré), mais la fonction gettext dans AJAX action n'a pas traduit le texte de test.

Après quelques recherches supplémentaires, j'ai découvert qu'il était possible d'ajouter un seul fichier .mo avec load_textdomain() au lieu d'utiliser load_theme_textdomain(). Depuis toutes les traductions dans le domaine de texte de WooCommerce, j’avais besoin de load_textdomain() pour pointer vers les fichiers .mo de WooCommerce. La documentation de WooCommerce indique que les fichiers sont dans 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');

charge la documentation du domaine texte .

0
Valentin Genev