Schimbarea manuală a localizării în timpul execuției?

18 apr. 2012, 19:56:29
Vizualizări: 31.1K
Voturi: 8

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.

1
Comentarii

posibil duplicat al Schimbarea limbii prin apăsarea unui buton

kaiser kaiser
19 apr. 2012 02:29:02
Toate răspunsurile la întrebare 3
1
16

Î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 și setup_theme, dar înainte ca tema să fie încărcată și înainte ca after_setup_theme să se declanșeze. Încărcarea englezei și apoi reîncărcarea domeniului de text în germană pe hook-ul init 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.

8 mar. 2013 13:39:14
Comentarii

Asigură-te că acest filtru nu este adăugat în cadrul unei alte acțiuni, de exemplu pe init - acest moment este prea târziu pentru a încărca textdomain-ul corect.

fischi fischi
9 mar. 2017 15:03:56
10

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');
}
18 apr. 2012 20:27:44
Comentarii

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

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

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

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

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

onetrickpony onetrickpony
18 apr. 2012 20:40:31

@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.

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

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

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

Verifici URI-ul doar pentru engleză?

onetrickpony onetrickpony
18 apr. 2012 21:00:01

Engleză sau greacă. Sunt instalate două limbi

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

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

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

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

onetrickpony onetrickpony
18 apr. 2012 21:52:15

Nu recomand utilizarea array_pop din request_uri ? practică foarte dură și nesigură..

T.Todua T.Todua
5 nov. 2018 11:46:15
Arată celelalte 5 comentarii
0

Î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
        }
    }
}
4 nov. 2018 18:46:34