Hola chicos.
En la clase de hoy estudiaremos como funciona la internacionalización (i18n) de fechas en PHP.
La i18n de fechas en PHP recae sobre el sistema operativo. Se puede ver ejecutando:
# php -a
> setlocale(LC_ALL, 'es_ES.UTF8');
> var_dump(strftime("%d de %B de %Y", 1));
string(21) "01 de January de 1970"
El problema es que no tienes configurado "es_ES.UTF8" en el SO. En linux se puede ver con:
# locale -a
C
C.UTF-8
en_US.utf8
POSIX
Para configurar los locales en ubuntu/debian se hace con dpkg-reconfigure locales
. Tras añadir "es_ES.utf8" ya funciona:
# locale -a
C
C.UTF-8
en_US.utf8
es_ES.utf8
POSIX
# php -a
php > var_dump(strftime("%d de %B de %Y", 1));
string(21) "01 de January de 1970"
php > setlocale(LC_ALL, 'es_ES.UTF8');
php > var_dump(strftime("%d de %B de %Y", 1));
string(19) "01 de enero de 1970"
dpkg-reconfigure locales
en ubuntu/debian usa locale-gen
. Pero ni uno, ni otro funcionan en CentOD/Fedora. Para CentOS existe localedef
[1].
Y esto en linux; en windows y os X es otro infierno. Por esto la gente de PHP creo el módulo intl [2] y internacionaliza una fecha se puede hacer con IntlDateFormatter
[3].
En Teltek si, pero desgraciadamente no todos los hostings/distros tenían dicho modulo, por eso la gente de Symfony creo "the Intl Component": A PHP replacement layer for the C intl extension that also provides access to the localization data of the ICU library. But the replacement layer is limited to the locale "en". If you want to use other locales, you should install the intl extension instead. [4]
PD: En Python es algo parecido.[5]
[1] https://unix.stackexchange.com/questions/140299/locale-gen-command-in-centos6
[2] http://php.net/manual/en/book.intl.php
[3] http://php.net/manual/en/intldateformatter.create.php
[4] https://symfony.com/doc/current/components/intl.html
[5] https://stackoverflow.com/questions/18593661/how-do-i-strftime-a-date-object-in-a-different-locale