Cambiare la lingua manualmente durante l'esecuzione?
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.

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
esetup_theme
, ma prima che il tema venga caricato e prima cheafter_setup_theme
venga attivato. Caricare l'inglese e poi ricaricare il dominio di testo in tedesco sull'hookinit
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.

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

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

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

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

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

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

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

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

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