usuarios - ¿Cómo configuro automáticamente la configuración regional de un usuario en PHP?
sistema de login php (4)
¿Hay alguna manera fácil de analizar el HTTP_ACCEPT_LANGUAGE del usuario y establecer la configuración regional en PHP?
Sé que Zend Framework tiene un método para hacer esto, pero prefiero no instalar todo el framework solo para usar ese bit de funcionalidad.
El paquete PEAR I18Nv2 está en versión beta y no se ha modificado durante casi tres años, por lo que prefiero no utilizarlo si es posible.
También sería bueno si pudiera averiguar si el servidor se ejecuta en Windows o no, ya que las cadenas locales de Windows son diferentes del resto del mundo ... (El alemán es "deu" o "alemán" en lugar de "de". )
Sé que Zend Framework tiene un método para hacer esto, pero prefiero no instalar todo el framework solo para usar ese bit de funcionalidad.
La buena noticia sobre Zend es que no necesita instalarlo todo. Es un marco acoplado débilmente y puedes hacer uso de Zend_Locale sin usar ninguno de los otros componentes. Quizás quieras combinarlo con Zend_Translate.
Buena solución está en camino .
Sin eso necesitarás analizar ese encabezado. Es una lista separada por comas de configuraciones regionales 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()
acepte. Prepárate para que ninguno de ellos coincida.
No se base en nada demasiado importante ni permita que los usuarios lo anulen, ya que algunos usuarios pueden haber configurado mal los navegadores.
Para la configuración regional de Windows, ¿quizás deba convertir nombres ISO 639-1 a ISO 639-2 / 3?
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.
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
. Después, debe recuperar la configuración regional del sistema correspondiente para cada una de las configuraciones regionales, lo que no debería ser un problema en una máquina * nix (es posible que tenga que lidiar con el juego de caracteres correcto), pero en Windows deberá traducir las configuraciones regionales a Las configuraciones regionales de Windows, por ejemplo, de_DE
, serán German_Germany
(nuevamente, también tendrá que lidiar con problemas de juego de caracteres si está utilizando UTF-8 en su aplicación, por ejemplo). Creo que tendrás que crear una tabla de búsqueda para este problema, y hay muchos lugares ;-)
No, pruebe una configuración regional después de la otra (ordenada con valores q
descendentes) hasta que encuentre una coincidencia usando setlocale()
(la función devolverá false
si no se pudo establecer la configuración regional dada).
Pero luego habrá un último obstáculo para enfrentar:
La información de la configuración regional se mantiene por proceso, no por hilo. Si está ejecutando PHP en una aplicación de servidor multiproceso como IIS o Apache en Windows, puede experimentar cambios repentinos de la configuración regional mientras se ejecuta una secuencia de comandos, aunque la secuencia de comandos nunca llamó a setlocale (). Esto sucede debido a que otros scripts se ejecutan en diferentes subprocesos del mismo proceso al mismo tiempo, cambiando la configuración regional de todo el proceso utilizando setlocale ().
(ver: http://de2.php.net/manual/en/function.setlocale.php )
Esto significa que puede experimentar cambios repentinos en la configuración regional durante la ejecución de una secuencia de comandos porque otro usuario con una configuración regional diferente simplemente accede a su página web.
Por lo tanto, el Zend_Locale
mencionado no depende de la función de 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 el Proyecto CLDR de Unicode . Esto hace que el componente sea independiente de todos los problemas de setlocale()
, pero esto también introduce algunas otras deficiencias, como la falta de soporte para operaciones de cadenas sensibles a la configuración regional (clasificación, por ejemplo).