setlocale() es una función PHP que permite establecer el idioma que quieres usar en determinadas funciones.
setlocale ( int $category , string $locale [, string $... ] ) : string
El primer parámetro es a la categoría de funciones afectadas por el nuevo idioma y el segundo parámetro es el idioma o arrays de idiomas que quieres utilizar.
En mi caso particular estaba tratando de que la biblioteca Carbon, que facilita la gestión de fechas y horas, me devolviera la fecha actual en español, en formato textual: 20 de febrero. La función que estaba usando recibía un array en el que uno de sus elementos es la fecha en formato Y-m-d H:i:s y devuelve la fecha en formato textual en español.
private function computaDescripcion(Array $array): string { try { setlocale(LC_ALL, 'es_ES'); $fecha = Carbon::createFromFormat('Y-m-d H:i:s', $array['fecha_celebracion']); $descripcion = $fecha->day . ' de ' . $fecha->localeMonth . '. '; return $descripcion; } catch (\Exception $exception) { echo "Ha ocurrido un error al generar la descripción: " . $exception->getMessage(); } }
Esta función debería de devolver la fecha en español, pero al ejecutar el comando por consola que llamaba a esta función me devolvía el mes en inglés:
"20 de February"
Lo primero es comprobar la comando de configuración regional instalada en el servidor. Para ello uso el comando “locale”, que muestra información sobre la configuración regional actual.
$ locale -a C C.UTF-8 en_AG en_AG.utf8 en_AU.utf8 en_BW.utf8 en_CA.utf8 en_DK.utf8 en_GB.utf8 en_HK.utf8 en_IE.utf8 en_IL en_IL.utf8 en_IN en_IN.utf8 en_NG en_NG.utf8 en_NZ.utf8 en_PH.utf8 en_SG.utf8 en_US.utf8 en_ZA.utf8 en_ZM en_ZM.utf8 en_ZW.utf8 POSIX
Aparece la configuración local en varias variantes de inglés, pero no en español.
La solución es instalar en el equipo donde se ejecuta PHP el pack del lenguaje correspondiente
$ sudo /usr/share/locales/install-language-pack es_ES
Al volver a ejecutar la aplicación, el resultado es:
"20 de febrero"