multi-language – Cambiar el idioma haciendo clic en un botón

Pregunta:

El objetivo es ofrecer un botón / menú desplegable de selección o similar para cambiar el idioma de la interfaz pública 1) sobre la marcha.

Lo que estoy buscando

  • Complemento o código de tema …
  • o Ideas
  • Se agradecería utilizar una load_textdomain() con load_textdomain() para dejar la traducción a los archivos .po / .mo
  • Ideas sobre cómo analizar las cadenas en la interfaz (por ejemplo, archivos ajax / plain php / ini, json, xml) cuando no se depende de alguna función de dominio de texto

Nota:

1) No se trata de publicar en diferentes idiomas.

2) No necesito código para hacer el menú desplegable / botón / lo que sea. Solo se trata del código / sistema que entrega las cadenas para la interfaz de usuario.

¡Gracias!

Respuesta:

De lejos, la mejor manera (la más fácil) es usar el filtro de configuración regional (dentro de get_locale() ).

Primero configure una función rápida para recuperar un idioma diferente para usar en el filtro de 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;
}

Dejé esto como una función global, ¿podría ser útil …? El resto del complemento lo he incluido dentro de una clase.

Crea un menú desplegable de posibles idiomas entre los que puede seleccionar.

Inconvenientes

  • Busca en wp-content/languages archivos con el formato xx_xx.mo . Si no es de esa forma (no todos los archivos .mo lo son), ¡el complemento no lo detectará!
  • El menú desplegable ofrece una lista de las configuraciones regionales encontradas para elegir, pero estas se muestran en el formato de configuraciones regionales 'xx_xx`, no de una manera amigable para los humanos. ¿Alguna idea?
  • ¿ $locale hace algo más que el idioma? Si es así, aún es posible obtener la misma configuración regional, pero proporcione traducciones alternativas. Aunque es mucho más complicado …

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

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top

web tasarım