wake-up-neo.com

Change the language by click on a button

Das Ziel ist es, eine Schaltfläche/Auswahl-Dropdown-Liste oder Ähnliches anzubieten, um die öffentliche Schnittstelle zu wechseln1) Sprache im laufenden Betrieb.

Was ich suche

  • Plugin oder Theme Code ...
  • ... oder Ideen
  • Wenn Sie eine Umgehungslösung mit load_textdomain() verwenden, wird empfohlen, die Übersetzung in PO/MO-Dateien zu belassen
  • Ideen zum Parsen der Zeichenfolgen in die Benutzeroberfläche (z. B. Ajax-/Plain-PHP-/INI-, JSON-, XML-Dateien), wenn Sie sich nicht auf eine Textdomain-Funktion verlassen

Hinweis:

1) Es geht nicht darum, in verschiedenen Sprachen zu veröffentlichen.

2) Ich benötige keinen Code, um das eigentliche Dropdown/den eigentlichen Button/was auch immer zu erstellen. Es geht nur darum, dass der Code/das System die Zeichenfolgen für die Benutzeroberfläche bereitstellt.

Vielen Dank!

21
kaiser

Der mit Abstand beste (einfachste) Weg ist die Verwendung des Gebietsschemafilters (innerhalb von get_locale() ).

Richten Sie zuerst eine Schnellfunktion zum Abrufen einer anderen Sprache für den Filter locale ein.

/**
 * A function returns with returns the user's selectd locale, if stored. 
 */
function wpse35622_get_new_locale($locale=false){
$new_locale = get_user_meta(get_current_user_id(), 'wpse_locale', true);
    if($new_locale)
        return $new_locale;

    return $locale;
}

Ich habe dies als globale Funktion belassen, könnte praktisch sein ...? Den Rest des Plugins habe ich in einer Klasse verpackt.

Es wird ein Dropdown-Menü mit möglichen Sprachen erstellt, aus denen Sie auswählen können.

Nachteile

  • Durchsucht wp-content/languages nach Dateien der Form xx_xx.mo. Wenn es nicht von dieser Form ist (nicht alle .mo-Dateien sind es), wird das Plug-in es nicht aufgreifen!
  • Das Dropdown-Menü enthält eine Liste der gefundenen Gebietsschemas zur Auswahl. Diese werden jedoch im Format "xx_xx" der Gebietsschemas angezeigt und sind nicht für den Menschen geeignet. Irgendwelche Ideen?
  • Tut $locale etwas anderes als Sprache? In diesem Fall ist es immer noch möglich, dasselbe Gebietsschema zu erhalten, aber alternative Übersetzungen bereitzustellen. Es ist allerdings viel unordentlicher ...

Der Code

class SH_Pick_Lang{
    /**
     * A unique name for this plug-in
     */
    static $name ='sh_pick_lang';

    /**
     * Hook the functions
     */
    public function __construct(){

        if( isset($_POST[self::$name]) ){
            add_action('locale',array($this,'update_user'));
        }
        add_filter( 'locale', 'wpse35622_get_new_locale',20 );
        add_action( 'wp_before_admin_bar_render', array( $this, 'admin_bar') );
    }

    /**
     * Update the user's option just in time! Only once mind...
     */
    function update_user($locale){
        $save_locale = $_POST[self::$name];
        update_user_meta(get_current_user_id(), 'wpse_locale', $save_locale);
        remove_filter(current_filter(),__FUNCTION__);
        return $locale;
    }

    /**
     * Add a really horrible looking dropdown menu that I'm sure Kaiser will make look fantastic.
     */
    function admin_bar(){
        global $wp_admin_bar;

        $wp_admin_bar->add_menu( array(
            'id'        => 'shlangpick',
            'title'     => $this->wpse_language_dropown(),
        ) );
    }

    /**
     * Generates a list of available locales.
     * Searches the wp-content/languages folder for files of the form xx_xx.mo
     * 
     * TODO Not all locales are of the form xx_xx.mo - we might miss some.
     * TODO Better way of gettin gthe wp-content/languages folder without a constant?
     */
    function wpse_language_dropown(){
         $name = self::$name;
         $locale = get_locale();
         $langs = get_available_languages();
         $langs[] = 'en_US';

         //For the labels (format_code_lang)
         require_once( ABSPATH . 'wp-admin/includes/ms.php');

         $html = "<form method='post'> ";
         $html .= "<select name='{$name}'>";
         foreach($langs as $lang){
              $label = format_code_lang( $lang );
              $html .= "<option ".selected( $lang, $locale, false)." value='{$lang}'>{$label}</option>";
        }
         $html .= "</select>";
         $html .= get_submit_button('Change Language','secondary', 'submit', true);
         $html .= "</form >";

         return $html;
    }

} // END Class

//Initiate...
$sh_pick_lang = new SH_Pick_Lang();
15
Stephen Harris

Wenn Sie sich mit einer Seitenaktualisierung zufrieden geben können, kann eine Neudefinition der Konstante WPLANG eine Option sein. Ich mache das auf zwei Websites mit mehrsprachigem Inhalt, bei denen das Mehrsprachigkeits-Plugin keine UI-Übersetzung auslöst.

5
Johannes Pille

http://www.qianqin.de/qtranslate/

ist was du brauchst ...

Bearbeite I - nach Kommentar. Erstens - danke für alle, die zum Downvotes-Strom beigetragen haben. (das ist was passiert wenn man nicht oft genug besucht: -))

now - Die Funktion, die den Schalter handhabt, befindet sich in qtranslate-core. (Beginnt mehr oder weniger in Zeile 80 - hängt von der gewünschten Version ab.)

Da Sie nicht in einen NOT OOP Code schauen können und ich jetzt nichts anderes zu tun habe - ich habe 10 Minuten gebraucht, um ihn zu synthetisieren, paraphrasieren Sie diesen Non-OOP-Code mit einem weiteren Non-OOP-Code für Sie.

(Entschuldigung - primitive alte Schule hier)

Angenommen, ich habe die Frage verstanden && Angenommen, Sie möchten, dass der Code für den Administrator bestimmt ist && Angenommen, Sie wissen, wie er auf das Front-End portiert wird, wenn Sie möchten && Angenommen, Sie verstehen, dass der Code nicht optimal ist:

<?php
/*
Plugin Name: k99 language switcher
Plugin URI: http://www.krembo99.com
Description: Admin Language switcher proof of concept only - do not use in production.
Version: 0.0.0.0.0.0.0.1
Author: Krembo99
Author URI: http://www.krembo99.com
*/ 
?>
<?php function k99_add_language_menu() {
    //  k99_load_ajax_display_functions();
?>  
    <div class="mgmb_help_setting">
    <?php _e('Language:','your_text_domain'); ?>
    <select name="mgmb_language_setting_help" id="mgmb_language_setting_help" onChange="mgmb_set_language_cookies(this.value);" >
        <option value="en_US" <?php if($_COOKIE['k99_userLang']=="en_US"){echo "selected";} ?>><?php _e('English','your_text_domain');?></option>
        <option value="de_DE" <?php if($_COOKIE['k99_userLang']=="de_DE"){echo "selected";} ?>><?php _e('German','your_text_domain');?></option>
        <option value="zh_CN" <?php if($_COOKIE['k99_userLang']=="zh_CN"){echo "selected";} ?>><?php _e('Chinese','your_text_domain');?></option>
    </select>
    </div>
<?php   
}
// Now we set that function up to execute when the help action is called
add_filter('contextual_help', 'k99_add_language_menu');

// I guess this is your mysterious "browser stuff"
function k99_language_change($lang){ 
 global $locale;
 // wp_cache_set( "language", $lang, 'options' );
    if ( isset($_COOKIE['k99_userLang'])) {
      $lang = $_COOKIE['k99_userLang'];
    }
    define( 'WPLANG', $lang );
 if($locale!= $lang) {
    $locale = $lang;
    load_plugin_textdomain('your_text_domain', false, dirname( plugin_basename(__FILE__) ) . '/lang'); // sample use for plugins textdomain
    load_plugin_textdomain('your_text_domain2', false, dirname( plugin_basename(__FILE__) ) . '/lang');
    load_plugin_textdomain('your_text_domain3', false, dirname( plugin_basename(__FILE__) ) . '/lang');
 }
  return $locale;
}
add_filter('locale', 'k99_language_change',99);

////////// +++++++++++++++  START COOKIES CREATION +++++++++++++++//////////////////
// Javascript function set the language cookies
// access external
// @param lang - language code
// @return NULL
// or maybe this is the OP´s mysterious "browser stuff" ??
    function mgmb_print_script() {
    ?>
    <script type="text/javascript" >
    function mgmb_set_language_cookies(lang){   
        var Then = new Date(); 
        Then.setTime(Then.getTime() + 10000*60*60*1000 ); //set cookie expire to 10000 hours cookies (hour*minute*seconds*1000)
        document.cookie = "k99_userLang="+lang+";expires="+ Then.toGMTString();
        window.location.reload();
        } 
        </script>
<?php
} 
add_action('admin_print_scripts', 'mgmb_print_script');  // this is not the right way to do .. but no time now.
?>

BEMERKUNGEN :

1 - Dies wurde in 10 min gebaut. auf der lokalen Maschine am Flughafen. Der Grund, warum ich das sage, ist, dass die einzige fertige WordPress-Installation, die ich hier habe, ziemlich alt ist. (2,9 denke ich).

Dies bedeutet, dass wahrscheinlich das Sprachmenü UNTER der kontextbezogenen Hilfediv angezeigt wird, da kürzlich eine neue Div-Struktur (mit Registerkarten) eingeführt wurde - aber es sollte trotzdem funktionieren. (Ich verspreche, später darauf zurückzukommen, wenn ich Zeit habe.)

Wenn ich mehr Zeit hätte (und einen neuen WordPress-Code hier), würde ich dies wahrscheinlich mit add_action( 'admin_bar_menu', 'k99_add_language_menu_2', 1000 ); in die neue Admin-Leiste integrieren (ich habe bereits versprochen, darauf zurückzukommen).

2 - Sie sollten die aufgelisteten Sprachdateien im Ordner "languages" in wp-content (besser ??) oder wp-include haben. In diesem Punkt - der Code ist nur ein Proof-of-Concept - und wenn man mehr Zeit hat, sollte das Menü auf dynamische Weise erstellt werden und nicht so wie hier.

3 - Ihr WPLANG in der Konfiguration sollte leer sein. Ich bin nicht sicher, ob es auf neueren WP-Versionen funktioniert, wenn bereits eine Sprache eingestellt ist.

4 - Es handelt sich um einen einfachen synthetisierten und umschriebenen Proof of Concept, der auf dem basiert, was im qtranslate-Code (auch in der alten Version) zu sehen war. Die meisten Dinge werden also "schnell" und nicht unbedingt "richtig" ausgeführt (wie das Hinzufügen von JS) , keine dedizierte Textdomain etc ..).

EDIT II

jemand hat heute Glück! (Flugverspätung )

Da Sie nach "Ideen" für Ansätze gesucht haben, ist hier eine andere berühmte.

Es passt nicht in ein Plugin oder eine andere nicht-exklusive Umgebung, aber es kann Ihnen eine andere Richtung geben, wie Sie mit dem "Browser-Zeug" umgehen sollen.

Dies ermöglicht es einem, die Sprache mit einem GET wie folgt zu erhalten: <a href="index.php?lang=de">German</a> oder <a href="whatever.php?lang=ml">my Language</a>

Zur Verwendung können Sie einen Code erstellen (nennen wir ihn wp-langswitch.php)

 session_start();
 if ( isset( $_GET['lang'] ) ) {
    $_SESSION['WPLANG'] = $_GET['lang'];
    define ('WPLANG', $_SESSION[WPLANG]);
 } else {
    if(isset($_SESSION['WPLANG'])) {
        define ('WPLANG', $_SESSION['WPLANG']);
        $_GET['lang'] = $_SESSION['WPLANG'];
    } else {
        if ( isset( $_SERVER["HTTP_ACCEPT_LANGUAGE"] ) ) {
            $languages = strtolower( $_SERVER["HTTP_ACCEPT_LANGUAGE"] );
             $languages = explode( ",", $languages );
            $_SESSION['WPLANG'] = $languages[0];
            $_SESSION['WPLANG'] = str_replace("-", "_", $_SESSION['WPLANG']);
            $_GET['lang'] = substr($_SESSION['WPLANG'],0,2);
            define ('WPLANG', $_SESSION[WPLANG]);
        } else {
            define ('WPLANG', '');
        }
    }
 }

jetzt müssen wir in wp-config kurz vor der WPLANG-Konstante unseren Code einfügen.

 require_once(dirname(__FILE__).'/wp-langswitch.php');
 define ('WPLANG', ''); 

Jetzt - natürlich ist es besser, der Mischung einige Cookies hinzuzufügen, um die Sprachen zu speichern.

EDIT III

Ich habe versprochen, später darauf zurückzukommen - hier ist, wie es (auf eine sehr unkorrekte und primitive Weise) in die Admin-Leiste integriert werden kann (anstelle des Kontext-Hilfemenüs)

 function k99_add_language_menu_bar() {
    global $wp_admin_bar, $wpdb;
    if ( !is_super_admin() || !is_admin_bar_showing() )
        return;
// I am sure you can find a way alone to construct array from reading folder . If not , comment and I will update again.

if($_COOKIE['k99_userLang']=="en_US"){$sel==$_COOKIE['k99_userLang'];} 
if($_COOKIE['k99_userLang']=="de_DE"){$sel==$_COOKIE['k99_userLang'];}
if($_COOKIE['k99_userLang']=="zh_CN"){$sel==$_COOKIE['k99_userLang'];}

    $k99_lang = '';
    $k99_lang .= '<select name="mgmb_language_setting_help" id="mgmb_language_setting_help" onChange="mgmb_set_language_cookies(this.value);" >';
    $k99_lang .= '<option value="en_US" >English</option>';
    $k99_lang .= '<option value="de_DE" >German</option>';
    $k99_lang .= '<option value="zh_CN" >Chinese</option></select>';

    /* Add the main siteadmin menu item */
    $wp_admin_bar->add_menu( array( 'id' => 'Language', 'title' => __( 'language', 'your_text_domain3' ), 'href' => FALSE ) );
    $wp_admin_bar->add_menu( array( 'parent' => 'Language', 'title' => $k99_lang, 'href' => FALSE ) );
}
add_action( 'admin_bar_menu', 'k99_add_language_menu_bar', 999 );

Ersetzen Sie einfach diese Funktion (oder fügen Sie sie hinzu) zum alten Code (dem ursprünglichen NON - OOP -Nicht-Plugin).

Wie gesagt, ich habe hier auf local keine neue WordPress-Installation mit Admin-Leiste - aber es sollte funktionieren.

(und dann könnte es auch nicht funktionieren ... aber ich bin sicher, Sie könnten das beheben, wenn Sie es wirklich wollen - auch wenn Sie dachten, es ist nicht OOP) :-)

muss jetzt rennen hoffe es hilft irgendwie.

EDIT IV - Edit III in Arbeitsversion für Admin-Menüleiste geändert (zumindest auf meinem WP 3.4)

da ich keine funktionierende Installation von 3.4 hatte - und jetzt zurückkam und ich tue - habe ich die Edit III-Lösung bearbeitet - und es funktioniert für mich.

Über die Upvotes konnte ich mich nicht weniger Gedanken machen. Und ich brauche keine "Kopfgelder" (was auch immer das sein mag ...). Es war nur zum Zweck der Übung, die Sie vielleicht dem Autor von qTranslate geben sollten. :-) trotz der Tatsache, dass es nicht OOP ist - es ist ein geniales Plugin, von dem man in vielen Bereichen viel lernen kann. Wenn man bedenkt, wann dieses Plugin veröffentlicht wurde, ist es sogar erstaunlich. die unbeschreibliche Mühe wert, einen NON OOP Code zu lesen - auch wenn dies nicht der Fall ist - OOP. Und selbst wenn es nicht richtig eingerückt ist (guter Gott!).

2
krembo99