web-dev-qa-db-fra.com

sélection de langue conditionnelle (thème) au 'runtime'

J'ai deux problèmes pour changer la langue du thème au moment de l'exécution. Je ne suis pas sûr du titre de ma question, j'espère que ma description aidera.

J'utilise déjà un plugin Polylang et ses fonctionnalités intéressantes: lier des pages avec un contenu identique mais avec différentes langues ET configurer le menu principal pour chaque langue ET un commutateur de langue qui sera ajouté au menu principal.

(J'ai aussi essayé xLanguage et xili-language, mais ils ne me convenaient pas)

Polylang a de très jolies fonctionnalités, mais j'en ai besoin de plus:

  • un livre d'or, c'est une page qui agit comme un livre d'or, pas de contenu que des commentaires. J'ai besoin du formulaire, etc. (thème) en deux langues, mais ne fait qu'une page
  • J'ai un deuxième menu dans le pied de page, je souhaite également utiliser différents éléments de menu (noms et liens) pour chaque langue.

Est-il possible de changer de langue en passant quelques paramètres HTTP GET (et redirection), puis en vérifiant les paramètres et en modifiant/rechargeant la page avec la langue requise?

J'ai déjà essayé de changer la valeur wordpress_polylang dans le cookie, mais aucun effet. J'ai trouvé la référence pour load_theme_textdomain mais il n'y a pas de paramètre pour passer une langue.

J'utilise le thème Starkers, basé sur vingt.

// edit: J'ai trouvé cet extrait dans le fichier core.php du plugin polylang, cela aiderait peut-être.

// NOTE: I believe there are two ways for a plugin to force the WP language
// as done by xili_language and here: load text domains and reinitialize wp_locale 
//    with the action 'wp'
// as done by qtranslate: define the locale with the action 'plugins_loaded', but
//     in this case, the language must be specified in the url.
function load_textdomains() {
    // sets the current language
    if (!($this->curlang = $this->get_current_language()))
        return; // something went wrong

    // set a cookie to remember the language. check headers have not been sent to avoid ugly error
    if (!headers_sent())
        setcookie('wordpress_polylang', $this->curlang->slug, time() + 31536000 /* 1 year */, COOKIEPATH, COOKIE_DOMAIN);

    // set all our language filters and actions
    $this->add_language_filters();

    // our override_load_textdomain filter has done its job. let's remove it before calling load_textdomain
    remove_filter('override_load_textdomain', array(&$this, 'mofile'));

    // now we can load text domains with the right language
    $new_locale = get_locale();
    foreach ($this->list_textdomains as $textdomain)
        load_textdomain( $textdomain['domain'], str_replace($this->default_locale, $new_locale, $textdomain['mo']));

    // and finally load user defined strings (check first that base64_decode is not disabled)
    if (function_exists('base64_decode')) {
        global $l10n;
        $mo = new MO();
        $reader = new POMO_StringReader(base64_decode(get_option('polylang_mo'.$this->curlang->term_id)));
        $mo->import_from_reader($reader);
        $l10n['pll_string'] = &$mo;
    }

    // reinitializes wp_locale for weekdays and months, as well as for text direction
    global $wp_locale;
    $wp_locale->init();
    $wp_locale->text_direction = get_metadata('term', $this->curlang->term_id, '_rtl', true) ? 'rtl' : 'ltr';
}
1
timaschew

J'ai trouvé une solution, vraiment sale, mais qui fonctionne.

Dans le fichier core.php du plugin polylang, j'ai trouvé ceci:

// NOTE: I believe there are two ways for a plugin to force the WP language
// as done by xili_language and here: load text domains and reinitialize wp_locale with the action 'wp'
// as done by qtranslate: define the locale with the action 'plugins_loaded', but in this case, the language must be specified in the url.
function load_textdomains() {
    // sets the current language

    if (!($this->curlang = $this->get_current_language()))
    return; // something went wrong

    // --- modified --> check for guestbook, which should be display in different languages
    $this->check_joined_content();
    ...
}

define("GUESTBOOK_PAGE_ID", "12");
define("GUESTBOOK_HTTP_PARAM", "guestbook_lang");

function check_joined_content() {
    $gl = $_GET[GUESTBOOK_HTTP_PARAM];
    if(isset($gl)) {
        if ($this->curlang->object_id != GUESTBOOK_PAGE_ID) {
            return;
        }
        if ($gl == "de") {
            $this->curlang = $this->get_language("de");
        } else {
            $this->curlang = $this->get_language("en");
        }
    }
}

accès aux pages via http get params: ?guestbook_lang=en et ?guestbook_lang=de

1
timaschew