setlocale en PHP no cambia el idioma a español

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"

Leave a comment

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.