Cambiare la lingua manualmente durante l'esecuzione?

18 apr 2012, 19:56:29
Visualizzazioni: 31.1K
Voti: 8

Mi chiedo, c'è un modo per cambiare la lingua (locale) durante l'esecuzione usando WordPress?

Mi spiego meglio: ho creato un URL personalizzato per creare un file XML con dati per l'integrazione con un'altra applicazione web. L'URL ha anche una parte che indica la lingua. Diciamo che questo è il mio URL

http://example.com/custom/url/en

dove l'ultima parte dell'URL è la lingua inglese. In questo caso vorrei che WordPress generasse un XML in inglese. Ma come posso istruire WordPress a cambiare la lingua in quel punto dell'esecuzione?

Da notare che devo cambiare la lingua perché uso anche variabili di sistema che vengono tradotte, come __(), _e() e così via.

1
Commenti

possibile duplicato di Cambiare lingua cliccando un pulsante

kaiser kaiser
19 apr 2012 02:29:02
Tutte le risposte alla domanda 3
1
16

Sto cercando di fare una cosa simile, e gli esperti della mailing list wp-hackers (Otto, Nacin) mi hanno detto questo:

Non cercare di modificare WPLANG, non puoi cambiare una costante definita con define. Invece, modifica la variabile globale $locale, o applica un filtro su 'locale'.

Quindi la soluzione migliore è applicare un filtro sulla variabile globale 'locale'. L'unico modo per farlo è creare un plugin personalizzato. Se inserisci il seguente codice nel tuo file functions.php, non funzionerà correttamente perché verrà eseguito troppo tardi nella sequenza di caricamento di WP.

Il tuo plugin potrebbe essere così (sto riutilizzando la parte di test dell'URI da OneTrickPony, puoi sostituirla con un altro metodo di test condizionale):

<?php
/*
Plugin Name: Cambia lingua a runtime
Plugin URI: http://wordpress.stackexchange.com/questions/49451/change-locale-at-runtime
*/

function wpsx_redefine_locale($locale) {
    // esegui i test sull'URI
        $lang = explode('/', $_SERVER['REQUEST_URI']);
        // qui cambia in inglese se richiesto
        if(array_pop($lang) === 'en'){
          $locale = 'en_US';
        // altrimenti mantieni la lingua predefinita
        }else{
          $locale = 'gr_GR';
        }
    return $locale;
}
add_filter('locale','wpsx_redefine_locale',10);  
?>

Spero che questo possa aiutare qualcuno!

Qualche avvertimento in più (citando Andrew Nacin), riguardo al costo in termini di prestazioni quando si cambia la lingua:

È possibile "scambiare" una lingua dopo che quella predefinita è stata caricata, ma sconsiglio di farlo perché è inefficiente, a meno che la tua lingua predefinita non sia l'inglese, nel qual caso non è così grave.

I file del dominio di testo predefinito vengono caricati dopo plugins_loaded e setup_theme, ma prima che il tema venga caricato e prima che after_setup_theme venga attivato. Caricare l'inglese e poi ricaricare il dominio di testo in tedesco sull'hook init andrebbe bene, a livello di prestazioni, poiché l'inglese non ha file mo. Ma caricare lo spagnolo per impostazione predefinita e poi passare al tedesco non sarebbe ottimale.

Vedi http://codex.wordpress.org/Plugin_API/Action_Reference per informazioni utili sulla sequenza di caricamento.

8 mar 2013 13:39:14
Commenti

Assicurati che questo filtro non venga aggiunto all'interno di un'altra azione, ad esempio su init - questo è troppo tardi per caricare il textdomain corretto.

fischi fischi
9 mar 2017 15:03:56
10

Non so se sia possibile farlo all'interno di un plugin, a causa delle costanti che WordPress richiede siano definite prima di un certo punto, ma controlla la lingua richiesta in wp-config.php e definisci la costante necessaria:

// divide l'URI
$lang = explode('/', $_SERVER['REQUEST_URI']);

// qui cambia in inglese se richiesto
if(array_pop($lang) === 'en'){
  define('WPLANG', 'en_US');

// altrimenti mantieni la lingua predefinita
}else{
  define('WPLANG', 'gr_GR');
}
18 apr 2012 20:27:44
Commenti

+1 E, sì, è possibile ridefinire la costante WPLANG all'interno di un plugin.

Johannes Pille Johannes Pille
18 apr 2012 20:33:21

Quello che faccio è estendere il mio tema tramite il file functions.php. Ho provato il codice sopra nel mio file ma non funziona :( Comunque grazie, ma sto ancora cercando una soluzione

KodeFor.Me KodeFor.Me
18 apr 2012 20:35:22

Hai provato ad aggiungerlo in wp-config? In ogni caso, controlla se stai definendo WPLANG lì

onetrickpony onetrickpony
18 apr 2012 20:40:31

@MerianosNikos: WPLANG dovrebbe essere nel formato languagecode_CODICEPAESE, cioè "en_US", "de_DE", "pt_BR" o simili. A parte questo, quanto sopra dovrebbe funzionare.

Johannes Pille Johannes Pille
18 apr 2012 20:46:41

One Trick Pony: WPLANG è definito in wp-config.php perché la lingua principale del mio sito web è il greco. Jahanned Pille ho provato sia en_US che en ma nessun cambiamento

KodeFor.Me KodeFor.Me
18 apr 2012 20:58:46

Fai un controllo dell'URI solo per l'inglese?

onetrickpony onetrickpony
18 apr 2012 21:00:01

Inglese o Greco. Sono installate due lingue

KodeFor.Me KodeFor.Me
18 apr 2012 21:12:05

@Merianos: Guarda questo pastebin per un semplice plugin che dovrebbe fare al caso tuo.

Johannes Pille Johannes Pille
18 apr 2012 21:12:51

Ho aggiornato anche il mio codice, ma devi sostituire la costante che stai definendo in wp-config con questa per farlo funzionare. @Johannes: il problema con il cambiare la lingua all'interno di un plugin è che alcune funzioni di localizzazione potrebbero essere chiamate prima che il tuo plugin venga eseguito. Inoltre non hai la garanzia che questo plugin venga caricato per primo

onetrickpony onetrickpony
18 apr 2012 21:52:15

Non consiglio di usare array_pop su request_uri ? pratica molto rozza e inaffidabile..

T.Todua T.Todua
5 nov 2018 11:46:15
Mostra i restanti 5 commenti
0

Innanzitutto, assicurati che la lingua desiderata sia nell'elenco (sotto "ha un pacchetto linguistico"). Se confermato, utilizza questo codice:

//imposta la lingua desiderata
add_filter( 'locale', function($locale) {
    if ( !is_admin() ) 
        $locale = "zh_TW";
    return $locale;
});

Se non hai selezionato quella lingua nella dashboard di WP, potresti dover utilizzare l'hook dell'installatore a livello di codice:

//controlla se non è installata, quindi installa
add_action('wp', 'my_locale_implemention');
function my_locale_implemention()
{
    $my_locale = get_locale();  //get_user_locale
    if ( !empty($my_locale) && !in_array( $my_locale, get_available_languages() ) ) {
        require_once( ABSPATH . 'wp-admin/includes/file.php' );
        require_once( ABSPATH . 'wp-admin/includes/translation-install.php' );
        $language = wp_download_language_pack( $my_locale );
        if ( $language ) {
            if(empty($_POST)) header("location: ".$_SERVER['REQUEST_URI']); exit; //ricarica la pagina
        }
    }
}
4 nov 2018 18:46:34