Domanda

Esiste un modo semplice per analizzare HTTP_ACCEPT_LANGUAGE dell'utente e impostare le impostazioni internazionali in PHP?

So che il framework Zend ha un metodo per farlo, ma preferirei non installare l'intero framework solo per usare quel po 'di funzionalità.

Il pacchetto PEAR I18Nv2 è in beta e non è stato modificato per quasi tre anni, quindi preferirei non usarlo se possibile.

Sarebbe anche bello se potesse capire se il server era in esecuzione su Windows o meno, poiché le stringhe delle impostazioni locali di Windows sono diverse dal resto del mondo ... (invece il tedesco è "deu" o "tedesco" di " de " ;.)

È stato utile?

Soluzione

La bella soluzione è in arrivo .

Senza questo dovrai analizzare quell'intestazione. È un elenco separato da virgole di locali e attributi separati da punto e virgola.

Può apparire così:

en_US, en;q=0.8, fr_CA;q=0.2, *;q=0.1

e quindi prova ogni locale fino a quando setlocale () lo accetta. Preparati che nessuno di loro possa eguagliare.

Non basarti su qualcosa di troppo importante o consentire agli utenti di sovrascriverlo, poiché alcuni utenti potrebbero avere browser configurati in modo errato.


Per le impostazioni internazionali di Windows, forse devi convertire i nomi ISO 639-1 in ISO 639-2 / 3?

Altri suggerimenti

Non è facile come dovrebbe essere (secondo la mia modesta opinione). Prima di tutto devi estrarre le localizzazioni dal $ _SERVER ['HTTP_ACCEPT_LANGUAGE'] e ordinarle in base ai loro valori q . Successivamente devi recuperare le impostazioni internazionali di sistema appropriate per ciascuna delle impostazioni locali indicate, il che non dovrebbe essere un problema su una macchina * nix (potresti dover solo gestire il set di caratteri corretto) ma su Windows dovrai tradurre le impostazioni locali in Impostazioni locali di Windows, ad es de_DE sarà German_Germany (anche in questo caso, ad esempio, devi anche affrontare i problemi relativi ai set di caratteri). Penso che dovrai creare una tabella di ricerca per questo problema - e ci sono molte impostazioni locali ;-)

No, provi una locale dopo l'altra (ordinata con valori q decrescenti) finché non trovi una corrispondenza usando setlocale () (la funzione restituirà false se non è possibile impostare la locale specificata).

Ma poi ci sarà un ultimo ostacolo da affrontare:

  

Le informazioni sulla locale sono mantenute   per processo, non per thread. Se tu   stanno eseguendo PHP su un multithread   API del server come IIS o Apache   Windows potresti riscontrare improvvisi   modifiche delle impostazioni locali mentre a   lo script è in esecuzione nonostante lo script   stesso non ha mai chiamato setlocale ()   si. Questo succede a causa di altri   script eseguiti in thread diversi   dello stesso processo allo stesso tempo   cambiando la localizzazione in tutto il processo usando   setlocale ().

(vedi: http://de2.php.net/manual/en /function.setlocale.php )

Ciò significa che potresti riscontrare improvvisi cambiamenti delle impostazioni locali durante l'esecuzione di uno script perché un altro utente con un set di impostazioni locali diverso ha appena colpito la tua pagina web.

Pertanto, il Zend_Locale menzionato non fare affidamento sulla funzione PHP setlocale () (viene utilizzato solo per recuperare le informazioni sulla locale del sistema) ma utilizza invece un sistema basato sui dati forniti da Progetto CLDR Unicode . Ciò rende il componente indipendente da tutti quei problemi setlocale () ma introduce anche alcune altre carenze come la mancanza di supporto per le operazioni di stringa sensibili alle impostazioni locali (ordinamento per esempio).

  

So che il framework Zend ha un metodo   per fare questo, ma preferirei non installare   l'intero framework solo per usarlo   un po 'di funzionalità.

La buona notizia di Zend è che non è necessario installarlo tutto. È un framework mal accoppiato e puoi semplicemente usare Zend_Locale senza utilizzare nessuno degli altri componenti. Forse vuoi combinarlo con Zend_Translate.

Dai un'occhiata

C'è http_negotiate_language , ma dipende dall'estensione http. In alternativa, vedere i commenti sulla pagina del manuale, per un'implementazione di userland.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top