¿Cómo cambiar el idioma (locale) manualmente en tiempo de ejecución?
Me pregunto, ¿hay alguna forma de cambiar el idioma (locale) en tiempo de ejecución usando WordPress?
Me refiero a que he creado una URL personalizada para crear un archivo XML con datos para la integración con otra aplicación web. La URL también tiene una parte que indica el idioma. Digamos que esta es mi URL:
http://example.com/custom/url/en
donde la última parte de la URL es el idioma inglés. En ese caso, me gustaría que WordPress genere un XML en inglés. Pero, ¿cómo puedo indicarle a WordPress que cambie el idioma en ese punto de la ejecución?
Ten en cuenta que necesito cambiar el idioma porque también uso variables del sistema que están traducidas, como __(), _e() y similares.

Estoy intentando hacer algo similar, y los expertos en la lista de correo wp-hackers (Otto, Nacin) me dijeron esto:
No intentes cambiar WPLANG, no puedes modificar una constante definida (define'd constant). En su lugar, cambia la variable global $locale o aplica un filtro en 'locale'.
Así que la mejor solución es aplicar un filtro sobre la variable global 'locale'. La única manera de hacerlo es creando un plugin personalizado. Si colocas el siguiente fragmento de código en tu archivo functions.php
, no funcionará correctamente porque se ejecutará demasiado tarde en la secuencia de carga de WordPress.
Tu plugin podría verse así (estoy reutilizando la parte de prueba de URI de OneTrickPony, puedes reemplazarla con otro método de prueba condicional):
<?php
/*
Plugin Name: Cambiar locale en tiempo de ejecución
Plugin URI: http://wordpress.stackexchange.com/questions/49451/change-locale-at-runtime
*/
function wpsx_redefinir_locale($locale) {
// ejecuta tus pruebas sobre la URI
$lang = explode('/', $_SERVER['REQUEST_URI']);
// aquí cambia a inglés si se solicita
if(array_pop($lang) === 'en'){
$locale = 'en_US';
// de lo contrario, mantén tu idioma predeterminado
}else{
$locale = 'gr_GR';
}
return $locale;
}
add_filter('locale','wpsx_redefinir_locale',10);
?>
¡Espero que esto pueda ayudar a alguien!
Algunas advertencias adicionales (citando a Andrew Nacin), sobre el costo en términos de rendimiento al cambiar el locale:
Es posible "cambiar" un locale después de que se cargue el locale predeterminado, pero te aconsejaría en contra de eso porque es ineficiente, a menos que tu idioma predeterminado sea inglés, en cuyo caso no es tan malo.
Los archivos del dominio de texto predeterminado se cargan después de
plugins_loaded
ysetup_theme
, pero antes de que se cargue el tema y antes de que se dispareafter_setup_theme
. Cargar inglés y luego volver a cargar el dominio de texto en alemán en el hookinit
estaría bien en términos de rendimiento, ya que el inglés no tiene archivos mo. Pero cargar español por defecto y luego cambiar a alemán no lo estaría.
Consulta http://codex.wordpress.org/Plugin_API/Action_Reference para obtener información útil sobre la secuencia de carga.

No estoy seguro si es posible hacer esto dentro de un plugin, debido a las constantes que WordPress requiere que estén definidas antes de cierto punto, pero puedes verificar el idioma solicitado en wp-config.php y definir la constante necesaria:
// dividir la URI
$lang = explode('/', $_SERVER['REQUEST_URI']);
// aquí cambiar a inglés si se solicita
if(array_pop($lang) === 'en'){
define('WPLANG', 'en_US');
// de lo contrario mantener el idioma por defecto
}else{
define('WPLANG', 'gr_GR');
}

+1 Y, sí, es posible redefinir la constante WPLANG desde un plugin.

Lo que hago es extender mi tema a través del functions.php. He probado el código anterior en mi archivo y no funciona :( De todos modos gracias, pero sigo buscando una solución

¿Probaste agregarlo en wp-config? En cualquier caso, verifica si estás definiendo WPLANG ahí

@MerianosNikos: WPLANG debe ser languagecode_CODIGODEPAIS, es decir, "en_US", "de_DE", "pt_BR" o similar. Aparte de eso, lo anterior debería funcionar.

One Trick Pony: WPLANG está definido en wp-config.php porque el idioma principal de mi sitio web es griego. Jahanned Pille, he probado tanto en_US como en pero no hay cambios.

@Merianos: Mira este pastebin para un plugin simple que debería funcionar.

También he actualizado mi código, pero necesitas reemplazar la constante que defines en wp-config con él para que funcione. @Johannes: el problema con cambiar el idioma dentro de un plugin es que algunas funciones de localización podrían ejecutarse antes de que tu plugin se cargue. Además, no hay garantía de que este plugin se cargue primero

Primero, asegúrate de que tu idioma deseado esté en la lista (bajo "tiene un paquete de idioma"). Si está confirmado, entonces usa este código:
//establecer el idioma deseado
add_filter( 'locale', function($locale) {
if ( !is_admin() )
$locale = "zh_TW";
return $locale;
});
Si no has seleccionado ese idioma en el panel de control de WordPress, entonces podrías necesitar usar el hook de instalación programáticamente:
//verificar si no está instalado, luego instalar
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; //recargar página
}
}
}
