Pero la mayor parte del tiempo, tu sitio web no estará disponible en los 136 principales idiomas. El métodoSí, pero si quieres hilar fino en tus aplicaciones pronto descubrirás que Symfony se queda corto con el métodogetPreferredCulture()
devuelve el mejor lenguaje mediante la comparación de los idiomas preferidos del usuario y los idiomas de tu sitio web:
// in an action
$language = $request->getPreferredCulture(array('en', 'fr'));
getPreferredCulture()
:/** * Returns the preferred culture for the current request. * * @param array $cultures An array of ordered cultures available * * @return string The preferred culture */ public function getPreferredCulture(array $cultures = null) { $preferredCultures = $this->getLanguages(); if (null === $cultures) { return isset($preferredCultures[0]) ? $preferredCultures[0] : null; } if (!$preferredCultures) { return $cultures[0]; } $preferredCultures = array_values(array_intersect($preferredCultures, $cultures)); return isset($preferredCultures[0]) ? $preferredCultures[0] : $cultures[0]; }
Aunque resulte raro, en la mayoría de los casos este nivel de complejidad es el suficiente ya que Symfony arreglará cualquier imprecisión que pueda darse si este mecanismo falla. No hay que olvidar que en el fichero settings.yml debemos definir una cultura por defecto para nuestra aplicación.
Pero, ¿qué pasa si un usuario configura su navegador para español de México e inglés (en ese orden de prioridad) y mi aplicación admite español (genérico) e inglés? El algoritmo anterior nos devolverá como preferido el inglés erróneamente. Según la configuración del navegador, se debería presentar un texto en español (aunque no sea en su variedad mexicana) y si esto no fuera posible, una traducción en inglés.
Es decir, los códigos de 5 carácteres de culturas como es_MX especifican una variedad del español pero no excluyen la cultura es a secas.
Por lo tanto, propongo el siguiente método para realizar una selección más precisa y configurable:
/** * Makes the best choice of culture. It can check the domain of preferred * languages in order to choose a more generic language if it's available. * * Example: * * preferred cultures: es_ES, en * available cultures: es, en, fr * * In this example this method will return 'es' over 'en' as the best choice * if $checkCultureDomains flag is enabled. * * If no preferred culture is available this method will return the * $defaultCulture. * * @param array $availableCultures Array of valid available cultures * @param array $preferredCultures Array of preferred cultures. Order DOES matter (lower index => higher priority) * @param string $defaultCulture A default culture if none of the preferred cultures is available * @param bool $checkCultureDomains Flag to enable/disable language domain check * @return string best choice culture */ public static function bestChoiceCulture($availableCultures, $preferredCultures, $defaultCulture, $checkCultureDomains = true) { foreach ($preferredCultures as $culture) { if (in_array($culture, $availableCultures)) { return $culture; } if ($checkCultureDomains) { $domain = substr($culture, 0, 2); if ($domain != $culture && in_array($domain, $availableCultures)) { return $domain; } } } return $defaultCulture; }
Happy coding!
No hay comentarios:
Publicar un comentario