2010-03-06 23 views
12

Estoy disolviendo una biblioteca vieja bastante grande con varias funciones auxiliares de PHP que se han acumulado con el tiempo. Estoy buscando reemplazos basados ​​en Zend Framework para tantas de estas funciones como sea posible.¿Determina el (los) idioma (s) del navegador en Zend Framework?

Mi primer candidato es una función que devuelve el idioma del navegador más preferido de los usuarios de la enorme lista que puede ser http_accept_language.

¿Tiene ZF una función para eso?

Me doy cuenta Zend_Translate es capaz de detectar de alguna manera el idioma del navegador, pero no estoy viendo una función disponible públicamente para obtener realmente la cadena de idioma.

Respuesta

11

Aquí van:

$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

¿Qué sucede si la preferencia es solo "en" o "es"? http://stackoverflow.com/questions/16469629/zend-locale-zend-currency-region-code – Michelangelo

+0

He respondido directamente a su pregunta. –

9

Zend_Locale debería ser capaz de ayudarnos, sobre eso.

Véanse los ejemplos y explicaciones en la página Using Zend_Locale(citando):

Para la mayoría de las situaciones, new Zend_Locale() automáticamente seleccione la configuración regional correcta, con preferencia dada a la información proporcionada por web del usuario navegador.


Y hay un par de detalles más adelante en esa página (citando):

El algoritmo de búsqueda utilizado por Zend_Locale para la selección automática de un local utiliza tres fuentes de información:

1.const Zend_Locale::BROWSER - El navegador web del usuario proporciona información con cada solicitud , que se publica por PHP en la variable global HTTP_ACCEPT_LANGUAGE. si no se puede encontrar la configuración regional correspondiente, entonces se da preferencia a y por último FRAMEWORK.

2.const Zend_Locale::ENVIRONMENT - PHP publica la configuración regional del servidor host a través de la función interna PHP setlocale(). Si no se puede encontrar la configuración regional correspondiente , se dará preferencia a FRAMEWORK y finalmente BROWSER.

3.const Zend_Locale::FRAMEWORK - Cuando Zend Framework tiene una forma estandarizada de que especifican valores por defecto de componentes (previsto, pero aún no está disponible), a continuación, utilizando esta constante durante instanciación se dará preferencia a la elección de una configuración regional según en estos valores predeterminados. Si no se puede encontrar ninguna configuración regional coincidente, se dará preferencia a ENVIRONMENT y finalmente BROWSER.

(consejo: ve a leer esa página - no voy a copiar y pegar todo lo que hay que leer ^^)


Editar: y aquí está la porción de código que ilustra mi Comentario:

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

me da:

string(2) "fr" 
bool(false) 

Bueno, mi navegador está pidiendo francés, sin especificar una región ^^

+0

Cheers @Pascal, a la larga podré trabajar con 'Zend_Locale'. Por el momento, sin embargo, estoy reemplazando la biblioteca de funciones de ayuda en una aplicación existente con su propio manejo de localización, así que necesito obtener el código ISO real. –

+0

Oh :-(lástima :-(;;; humph ... hablando en serio: ¿qué hay de la primera instanciación de la configuración regional, dejar que ZF haga su magia, y luego llamar al 'getLanguage()' y/o 'getRegion() 'métodos para obtener el código de la configuración regional? –

+0

He editado mi respuesta para obtener una parte del código, pero veo que me he vencido por @henchman ^^ –

5

He upvoted ambas respuestas. Como una alternativa para conseguir el idioma con Zend_Locale considerar

+1

+1 para el primero: incluso si solo está disponible en PHP> = 5.3, el uso de funciones nativas es bueno * (y las clases intl son una gran adición a PHP). * –

+1

Aceptaré la respuesta basada en Zend porque eso es lo que Pedí, pero +1 porque esto es realmente bueno e incluso incorporado. 5.3.0 es demasiado pedir ahora pero no en un año. Aclamaciones. –

1

¿Existe la posibilidad de forzar Zend_Locale() para conseguir el primer completa idioma (código de idioma y código de región, como 'en_US') en lugar de solo el código de idioma ('en')? De lo contrario, es un problema manejar monedas porque necesitan una configuración regional completa.

¿Cómo manejas este problema? No he encontrado ninguna solución aceptable para ese problema todavía y para mí parece que esto debería ser una tarea para Zend_Locale, en _prepareLocale($locale, $strict = false) por ejemplo.