Pregunta

¿Hay una manera fácil de analizar HTTP_ACCEPT_LANGUAGE del usuario y establecer la configuración regional en PHP?

Sé que el marco Zend tiene un método para hacer esto, pero prefiero no instalar todo el marco solo para usar esa única funcionalidad.

El paquete PEAR I18Nv2 está en versión beta y no se ha cambiado durante casi tres años, por lo que prefiero no usarlo si es posible.

También sería bueno si pudiera descubrir si el servidor se ejecutaba en Windows o no, ya que las cadenas de configuración regional de Windows son diferentes del resto del mundo ... (en alemán es "deu" o "alemán" en su lugar de " de " ;.)

¿Fue útil?

Solución

Una buena solución es en camino .

Sin eso, deberá analizar ese encabezado. Es una lista separada por comas de locales y atributos separados por punto y coma.

Puede verse así:

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

y luego pruebe cada configuración regional hasta que setlocale () lo acepte. Esté preparado para que ninguno de ellos pueda igualar.

No se base en nada demasiado importante ni permita que los usuarios lo anulen, porque algunos usuarios pueden tener navegadores mal configurados.


Para la configuración regional de Windows, ¿quizás necesite convertir los nombres ISO 639-1 a ISO 639-2 / 3?

Otros consejos

No es tan fácil como debería ser (en mi humilde opinión). En primer lugar, debe extraer las configuraciones regionales de $ _SERVER ['HTTP_ACCEPT_LANGUAGE'] y ordenarlas por sus valores q . Luego, debe recuperar la configuración regional del sistema adecuada para cada una de las configuraciones regionales dadas, lo que no debería ser un problema en una máquina * nix (es posible que solo tenga que hacer frente al juego de caracteres correcto), pero en Windows tendrá que traducir las configuraciones regionales a Configuraciones regionales de Windows, por ejemplo de_DE será German_Germany (de nuevo, también tendrá que hacer frente a los problemas del juego de caracteres si está utilizando UTF-8 en su aplicación, por ejemplo). Creo que tendrá que crear una tabla de búsqueda para este problema, y ??hay muchas configuraciones regionales ;-)

No, intente una configuración regional después de la otra (ordenada con valores descendentes de q ) hasta que encuentre una coincidencia usando setlocale () (la función devolverá false si no se puede establecer la configuración regional dada).

Pero entonces habrá un último obstáculo para hacer frente:

  

La información local se mantiene   por proceso, no por hilo. Si tu   están ejecutando PHP en un multiproceso   API de servidor como IIS o Apache en   Windows puede experimentar repentina   cambios de la configuración regional mientras que un   el script se está ejecutando aunque el script   nunca se llamó setlocale ()   sí mismo. Esto sucede debido a otros   scripts que se ejecutan en diferentes hilos   del mismo proceso al mismo tiempo   cambiar la configuración regional de todo el proceso usando   setlocale ().

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

Esto significa que podría experimentar cambios bruscos de configuración regional durante la ejecución de un script porque otro usuario con un conjunto de configuraciones regionales diferente acaba de acceder a su página web.

Por lo tanto, el mencionado Zend_Locale hace no confíe en la función PHP setlocale () (solo se usa para recuperar la información de configuración regional del sistema) sino que utiliza un sistema basado en los datos proporcionados por Proyecto Unicode CLDR . Esto hace que el componente sea independiente de todos esos problemas de setlocale () , pero esto también introduce algunas otras deficiencias, como la falta de soporte para operaciones de cadena con reconocimiento de ubicación (por ejemplo, la ordenación).

  

Sé que el framework Zend tiene un método   para hacer esto, pero prefiero no instalar   todo el marco solo para usar eso   un poco de funcionalidad.

La buena noticia sobre Zend es que no necesita instalarlo todo. Es un marco de trabajo acoplado y puede usar Zend_Locale sin usar ninguno de los otros componentes. Tal vez quieras combinarlo con Zend_Translate.

Compruébelo

Hay http_negotiate_language , pero depende de la extensión http. Alternativamente, vea los comentarios en la página del manual, para una implementación del usuario.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top