web-dev-qa-db-ger.com

bedingte (Themen-) Sprachauswahl zur Laufzeit

Ich habe zwei Probleme, um die Sprache für das Thema zur Laufzeit zu ändern. Ich bin mir bei meinem Fragentitel nicht sicher, hoffe meine Beschreibung hilft.

Ich benutze bereits ein Polylang-Plugin und dort nette Features: Verlinke Seiten mit gleichem Inhalt, aber verschiedenen Sprachen UND konfiguriere das Hauptmenü für jede Sprache UND einen Sprachumschalter, der in das Hauptmenü eingefügt wird.

(Ich habe auch xLanguage und xili-language ausprobiert, aber sie waren für mich nicht angenehm)

Polylang hat sehr schöne Features, aber ich brauche noch ein paar mehr:

  • ein gästebuch, eine seite die wie ein gästebuch wirkt, keine inhalte nur kommentare. Ich brauche das Formular etc. (Thema) in zwei Sprachen, aber es ist nur eine Seite
  • Ich habe ein zweites Menü in der Fußzeile, dort möchte ich auch verschiedene Menüelemente (Namen und Links) für jede Sprache verwenden

Gibt es eine Möglichkeit, die Sprache zu ändern, indem Sie einige HTTP-GET-Parameter übergeben (und umleiten) und dann die Parameter überprüfen und die Seite mit der erforderlichen Sprache ändern/neu laden?

Ich habe bereits versucht, den wordpress_polylang-Wert im Cookie zu ändern, aber keine Auswirkung. Ich habe die Referenz für load_theme_textdomain gefunden, aber es gibt keinen Parameter zum Übergeben einer Sprache.

Ich benutze Starkers Theme, basierend auf Twentyten.

// edit: Ich habe dieses Snippet in der core.php des polylang Plugins gefunden, vielleicht würde es helfen.

// 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

Ich habe eine Lösung gefunden, die wirklich dreckig ist, aber funktioniert.

In der core.php Datei des polylang Plugins habe ich folgendes gefunden:

// 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");
        }
    }
}

zugriff auf die Seiten über http get params: ?guestbook_lang=en und ?guestbook_lang=de

1
timaschew