Altere o idioma clicando em um botão

20

O objetivo é oferecer um menu suspenso de botão / seleção ou semelhante para alternar rapidamente a linguagem interface pública 1) .

O que estou procurando

  • Plugin ou Código do tema ...
  • ... ou Idéias
  • Usar uma alternativa com load_textdomain() seria interessante para deixar a tradução para arquivos .po / .mo
  • Idéias sobre como analisar as strings na interface (ex. arquivos ajax / plain php / ini, json, xml) quando não confiar em alguma função textdomain

Nota:

1) Não se trata de publicar em diferentes idiomas.

2) Eu não preciso de código para fazer o drop-down / button / whatever. É apenas sobre o código / sistema que entrega as strings para a interface do usuário.

Obrigado!

    
por kaiser 05.12.2011 / 19:53

3 respostas

15

De longe, a melhor maneira (mais fácil) é usar o filtro de localidade (em get_locale() ).

Primeiro, configure uma função rápida para recuperar um idioma diferente para usar no filtro locale .

/**
 * 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;
}

Eu deixei isso como uma função global, pode ser útil ...? O resto do plug-in que eu envolvi dentro de uma classe.

Cria um menu suspenso de possíveis idiomas a partir do qual você pode selecionar.

Desvantagens

  • Pesquisa wp-content/languages para arquivos no formato xx_xx.mo . Se não é dessa forma (nem todos os arquivos .mo são), o plug-in não atende a ele!
  • A lista suspensa fornece uma lista das localidades encontradas para escolha, mas elas são exibidas no formato 'xx_xx' das localidades, e não de forma amigável para o usuário - quaisquer ideias
  • O $locale faz algo diferente de idioma? Em caso afirmativo, ainda é possível obter o mesmo local, mas fornecer traduções alternativas. É muito mais confuso ...

O código

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();
    
por Stephen Harris 05.07.2012 / 15:21
5

Se você puder se contentar com uma atualização de página, redefinir a constante WPLANG pode ser uma opção. Estou fazendo isso em dois sites com conteúdo multilíngüe, em que o plug-in de multilinguagem não aciona a tradução da interface do usuário.

    
por Johannes Pille 05.12.2011 / 20:23
2

enlace

é o que você precisa ...

Editar I - após comentário. Primeiro - obrigado por todos que contribuíram no torrent downvotes. (isso é o que acontece quando alguém não visita com frequência suficiente: -))

agora - A função que lida com o switch está no qtranslate-core. (começa na linha 80 mais ou menos - depende da versão que você quer.)

Como você não pode olhar para um código NOT OOP, e estou agora sem mais nada para fazer - levei 10 minutos para sintetizar, parafrasear compilar esse não-OOp com outro código não-OOP para você.

(desculpe, - old skool primitivo aqui)

Supondo que entendi a pergunta & & Supondo que você queira que o código seja para admin & & supondo que você saberá como portá-lo para o front end se quiser & & supondo que você entenda que o código não é ideal:

<?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.
?>

OBSERVAÇÕES:

1 - Este foi construído em 10 min. na máquina local, enquanto no aeroporto. A razão pela qual eu digo isso é que a única instalação wordpress disponível que tenho aqui é bastante antiga. (2.9 eu acho).

Isso significa que provavelmente o menu de idiomas aparecerá sob o div de ajuda contextual, devido ao fato de que uma nova estrutura div foi introduzida recentemente (com abas) - mas ainda assim deve funcionar. (Eu prometo voltar a isso mais tarde, se eu tiver tempo)

Se eu tivesse mais tempo (e um novo código wordpress aqui) eu provavelmente iria integrar isso na nova barra de administração com add_action( 'admin_bar_menu', 'k99_add_language_menu_2', 1000 ); (eu já prometi voltar a isso)

2 - você deve ter os arquivos de idiomas listados dentro da pasta "languages" em wp-content (better ??) ou wp-include. Quanto a este ponto - o código é apenas uma prova de conceito - e, claro, se alguém tem mais tempo, o menu deve ser construído de forma dinâmica e não como aqui.

3 - o seu WPLANG em config deve estar vazio. Não tenho certeza de que funcionará em versões wp mais recentes se uma linguagem já estiver definida.

4 - é uma simples prova sintetizada e parafraseada de conceito construída sobre o que foi visto no código qtranslate (também versão antiga) - então a maioria das coisas é feita de maneira "rápida", não necessariamente "correta" ( como adicionar JS, não textdomain dedicado etc ..).

EDIT II

alguém tem sorte hoje! (Atraso de Voo)

Já que você estava procurando por "idéias" para abordagens, aqui está outra famosa.

Ele não caberá em um plug-in ou em qualquer outro ambiente não exclusivo, mas poderá fornecer uma outra orientação sobre como lidar com o "material do navegador".

Isso permitirá que uma pessoa receba o idioma com um GET como: <a href="index.php?lang=de">German</a> ou <a href="whatever.php?lang=ml">my Language</a>

Para usar, você pode criar um código (vamos chamá-lo de 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', '');
        }
    }
 }

agora, em wp-config, logo antes da constante WPLANG, precisamos incluir nosso código.

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

Agora - obviamente, seria melhor adicionar alguns cookies à mistura para armazenar os idiomas.

EDIT III

Eu prometi voltar a isso mais tarde - aqui está como (de uma maneira não correta e primitiva) ele pode ser integrado dentro da barra de administração (ao invés do menu de ajuda contextual)

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

Apenas substitua esta função (ou adicione) ao código antigo (o não plugin original não-OOP).

Como eu disse, eu não tenho uma nova instalação wordpress aqui no local que possui admin-bar - mas deve funcionar.

(e, em seguida, novamente, pode não funcionar ... mas tenho certeza que você poderia consertar isso, se você realmente quer - até pensei que não é OOP): -)

tenho que correr agora. espero que ajude de alguma forma.

EDIT IV - alterou a edição III para a versão de trabalho para a barra de menus do administrador (pelo menos no meu wp 3.4)

desde que eu não tinha uma instalação funcional de 3.4 - e agora voltei e o faço - editei a solução Edit III - e funciona para mim.

Sobre o upvotes, eu não poderia me importar menos. E eu não preciso de nenhuma "recompensa" (o que quer que seja que seja ...) Foi apenas por causa do exercício que você deve dar ao autor do qTranslate. :-) apesar do fato de que não é OOP - é um plugin genioso com muito a aprender em muitas áreas. considerando o "quando" desta versão do plugin, é até incrível. Vale a pena o esforço indescritível de ler um código não-OOP - mesmo que não seja - OOP. E mesmo que não seja corretamente recuado (bom deus!).

    
por krembo99 05.12.2011 / 21:30