2010-03-06 9 views
12

Sto dissolvendo una vecchia libreria piuttosto grande con varie funzioni di helper PHP che si sono accumulate nel tempo. Sto cercando le sostituzioni basate su Zend Framework per quante più funzioni possibili.Determina le lingue del browser in Zend Framework?

Il mio primo candidato è una funzione che restituisce la lingua del browser preferita dall'utenza dall'elenco enorme che può essere http_accept_language.

ZF ha una funzione per questo?

Mi rendo conto che Zend_Translate è in grado di rilevare in qualche modo la lingua del browser, ma non vedo una funzione disponibile pubblicamente per ottenere effettivamente la stringa della lingua.

risposta

11

qui si va:

$locale = new Zend_Locale(); 

// if locale is 'de_AT' then 'de' will be returned as language 
print $locale->getLanguage(); 

// if locale is 'de_AT' then 'AT' will be returned as region 
print $locale->getRegion(); 
+0

Cosa succede se la preferenza è solo "en" o "es"? http://stackoverflow.com/questions/16469629/zend-locale-zend-currency-region-code – Michelangelo

+0

Ho risposto direttamente alla tua domanda. –

9

Zend_Locale dovrebbe essere in grado di aiutare, a tale proposito.

Vedi gli esempi e spiegazioni sulla pagina Using Zend_Locale(citando):

Per la maggior parte delle situazioni, new Zend_Locale() verrà automaticamente selezionare le impostazioni internazionali corrette, con preferenza data alle informazioni fornite dal web dell'utente browser.


E ci sono un altro paio di dettagli in seguito in quella pagina (citando):

L'algoritmo di ricerca utilizzato da Zend_Locale per la selezione automatica di un locale utilizza tre fonti di informazioni:

1.const Zend_Locale::BROWSER - Il browser Web dell'utente fornisce informazioni con ogni richiesta , che è pubblicata da PHP in la variabile globale HTTP_ACCEPT_LANGUAGE. se non è possibile trovare locale corrispondente , la preferenza viene assegnata a ENVIRONMENT e infine a FRAMEWORK.

2.const Zend_Locale::ENVIRONMENT - PHP pubblica locale del server host tramite la funzione interna di PHP setlocale(). Se non è possibile trovare la locale corrispondente , la preferenza è data da a FRAMEWORK e infine da BROWSER.

3.const Zend_Locale::FRAMEWORK - Quando Zend Framework ha un modo standardizzato di specificando default dei componenti (previsto, ma non ancora disponibile), quindi utilizzando questa costante durante esemplificazione darà la preferenza ad la scelta di un locale a base su questi valori predefiniti . Se nessuna locale corrispondente può essere trovata , viene data la preferenza a ENVIRONMENT e infine a BROWSER.

(Consigli: andare a leggere quella pagina - non voglio copiare e incollare tutto quello che c'è da leggere ^^)


Edit: Ed ecco la parte di codice che illustra il mio commento:

$locale = new Zend_Locale(); 
var_dump($locale->getLanguage()); 
var_dump($locale->getRegion()); 
die; 

mi dà:

string(2) "fr" 
bool(false) 

Beh, il mio browser chiede per il francese, senza specificare una regione ^^

+0

Cheers @Pascal, a lungo termine sarò in grado di lavorare con 'Zend_Locale'. Al momento, però, sto solo sostituendo la libreria delle funzioni helper in un'applicazione esistente con la sua gestione delle impostazioni locali, quindi ho bisogno di ottenere il codice ISO effettivo. –

+0

Oh :-(too bad :-(;;; humph ... a proposito di questo: cosa dire di prima instanciating il locale, lasciando che ZF faccia la sua magia, e poi chiama 'getLanguage()' e/o 'getRegion() 'metodi per ottenere il codice locale? –

+0

Ho modificato la mia risposta per ottenere una porzione di codice - ma vedo che sono stato battuto da @henchman ^^ –

5

ho upvoted entrambe le risposte. In alternativa per ottenere la lingua con Zend_Locale considerare

+1

+1 per il primo: anche se è disponibile solo in PHP> = 5.3, l'uso delle funzioni native è buono * (e le classi intl sono un'ottima aggiunta a PHP). * –

+1

Accetterò la risposta basata su Zend perché è quello che Ho chiesto, ma +1 perché questo è davvero bello e persino integrato - 5.3.0 è troppo da chiedere in questo momento ma non lo farà in un anno. Saluti. –

1

C'è una possibilità per forzare Zend_Locale() per ottenere il primo piena locale (codice di lingua e il codice regionale, come 'en_US') invece del solo codice della lingua ('en')? In caso contrario, è un problema gestire le valute perché hanno bisogno di una locale completa.

Come si gestisce questo problema? Non ho ancora trovato alcuna soluzione accettabile per questo problema e per me sembra che questo dovrebbe essere un compito per Zend_Locale, ad esempio in _prepareLocale($locale, $strict = false).