Schimbarea manuală a localizării în timpul execuției?
Mă întreb, există vreo modalitate de a schimba localizarea în timpul execuției folosind WordPress?
Ce vreau să spun este că am creat un URL personalizat pentru a crea un fișier XML cu date pentru integrarea cu o altă aplicație web. URL-ul are și o porțiune pentru limbă. Să zicem că acesta este URL-ul meu
http://example.com/custom/url/en
unde ultima porțiune a URL-ului este limba engleză. În acest caz, aș dori ca WordPress să genereze un XML în engleză. Dar cum pot instrui WordPress să schimbe localizarea în acel punct al execuției?
Rețineți că trebuie să schimb localizarea deoarece folosesc și variabile de sistem care sunt traduse, precum __(), _e() și așa mai departe.

Încerc să fac ceva similar, iar experții de pe lista de email wp-hackers (Otto, Nacin) mi-au spus următoarele:
Nu încerca să modifici WPLANG, nu poți schimba o constantă definită cu define. În schimb, modifică variabila globală $locale sau adaugă un filtru pe 'locale'.
Deci cea mai bună soluție este să aplici un filtru pe variabila globală 'locale'. Singura modalitate de a face asta este prin crearea unui plugin personalizat. Dacă pui următorul fragment de cod în fișierul tău functions.php
, nu va funcționa corect deoarece va rula prea târziu în secvența de încărcare a WordPress.
Plugin-ul tău ar putea arăta astfel (reutilizez partea de testare URI din OneTrickPony, poți înlocui cu o altă metodă condițională):
<?php
/*
Plugin Name: Schimbă limba la rulare
Plugin URI: http://wordpress.stackexchange.com/questions/49451/change-locale-at-runtime
*/
function wpsx_redefine_locale($locale) {
// rulează testele pe URI
$lang = explode('/', $_SERVER['REQUEST_URI']);
// aici schimbă în engleză dacă este cerut
if(array_pop($lang) === 'en'){
$locale = 'en_US';
// altfoli rămâi la limba implicită
}else{
$locale = 'gr_GR';
}
return $locale;
}
add_filter('locale','wpsx_redefine_locale',10);
?>
Sper că acest lucru poate ajuta pe cineva!
Câteva avertismente suplimentare (citându-l pe Andrew Nacin), referitoare la costul în termeni de performanță când schimbi limba:
Este posibil să "schimbi" limba după ce limba implicită este încărcată, dar aș recomanda împotriva acestui lucru deoarece este ineficient, cu excepția cazului în care limba ta implicită este engleza, caz în care nu este atât de rău.
Fișierele implicite ale domeniului de text sunt încărcate după
plugins_loaded
șisetup_theme
, dar înainte ca tema să fie încărcată și înainte caafter_setup_theme
să se declanșeze. Încărcarea englezei și apoi reîncărcarea domeniului de text în germană pe hook-ulinit
ar fi ok, din punct de vedere al performanței, deoarece engleza nu are fișiere mo. Dar încărcarea spaniolei implicit și apoi trecerea la germană nu ar fi.
Vezi http://codex.wordpress.org/Plugin_API/Action_Reference pentru informații utile despre secvența de încărcare.

Nu știu dacă acest lucru este posibil de realizat într-un plugin, din cauza constantelor pe care WordPress le cere definite înainte de un anumit punct, dar poți verifica limba solicitată în wp-config.php și defini constanta necesară:
// despărțirea URI-ului
$lang = explode('/', $_SERVER['REQUEST_URI']);
// aici schimbă în engleză dacă este solicitat
if(array_pop($lang) === 'en'){
define('WPLANG', 'en_US');
// altfel folosește limba implicită
}else{
define('WPLANG', 'gr_GR');
}

+1 Și, da, este posibil să redefiniți constanta WPLANG dintr-un plugin.

Eu extind tema mea prin fișierul functions.php. Am încercat codul de mai sus în fișierul meu și nu funcționează :( Oricum mulțumesc, dar încă caut o soluție

Ai încercat să adaugi în wp-config? În orice caz, verifică dacă ai definit WPLANG acolo

@MerianosNikos: WPLANG ar trebui să fie în formatul limbaȚARA, adică "en_US", "de_DE", "pt_BR" sau similar. În afară de asta, ar trebui să funcționeze așa cum ai scris mai sus.

One Trick Pony: WPLANG este definit în wp-config.php pentru că limba principală a site-ului meu este greaca. Jahanned Pille am încercat atât en_US cât și en dar nu s-a schimbat nimic

@Merianos: Vezi acest pastebin pentru un simplu plugin care ar trebui să rezolve problema.

Am actualizat și codul meu, dar trebuie să înlocuiți constanta pe care o definiți în wp-config pentru ca aceasta să funcționeze. @Johannes: problema cu schimbarea limbii într-un plugin este că unele funcții de localizare pot fi apelate înainte ca pluginul tău să ruleze. De asemenea, nu ai nicio garanție că acest plugin va fi încărcat primul

În primul rând, asigură-te că limba dorită este într-o listă (sub "are un pachet de limbă"). Dacă este confirmat, atunci folosește următorul cod:
//setează localizarea dorită
add_filter( 'locale', function($locale) {
if ( !is_admin() )
$locale = "zh_TW";
return $locale;
});
Dacă nu ai selectat acea limbă în panoul de administrare WordPress, atunci poate fi necesar să folosești hook-ul de instalare programatic:
//verifică dacă nu este instalat, apoi instalează
add_action('wp', 'my_locale_implemention');
function my_locale_implemention()
{
$my_locale = get_locale(); //obține localizarea utilizatorului
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; //reîncarcă pagina
}
}
}
