Strftime en español

Hola
He implementado en un ESP01s un sistema NTP para controlar la hora vía internet. La exactitud no es problema.
Pero para mostrar la hora, uso strftime con este formato strftime(time_output, 50, "%a %d-%m-%y %T\r\n", localtime(&now));
El resultado es algo como

Error de conexión: Tue  07-12-21 11:31:25
Fin de error: Tue  07-12-21 11:34:01

He buscado dentro de las librerías por si pillo el archivo que contenga los días de la semana en inglés, (time.h) pero strftime no me hace caso al traducirlas.
¿Alguna idea de como traducirlo?
Ya sé que usando timeinfo.tm_wday puedo hacerlo, pero prefiero pelearme con strftime a modo de reto

Saludos

PD: ya han vuelto a cambiarlo todo. Así no hay quien publique nada

Un ejemplo por favor!!

Creo que strftime() depende de locale.h y toma de ahí los días por eso no le afecta que cambies las cadenas en time.h.
El tema sería ajustar locale.h a tu zona, creo que debes buscar por ese lado.

Saludos

Aunque encontré como hacerlo no puedo compilar el ejemplo porque no encuentra locale.h

#include <Arduino.h>
#include <stdio.h>
#include <time.h>
#include <locale.h>     /* struct lconv, setlocale, localeconv */

void setup(void) {
  Serial.begin(115200);

  time_t t = 1591050067;
  struct tm *tm = localtime(&t);
  char dts[50];
  setlocale(LC_ALL,"es_ES"); 
  strftime(dts, sizeof(dts), "%z %a %d-%m-%y %T\r\n", tm);
  Serial.println(dts);
}
void loop() {}

me da error

C:\Users\surby\AppData\Local\Temp\ccxjO3LV.ltrans0.ltrans.o: In function `main':
<artificial>:(.text.startup+0x126): undefined reference to `setlocale(int, char const*)'
collect2.exe: error: ld returned 1 exit status
*** [.pio\build\nanoatmega328\firmware.elf] Error 1
========================================== [FAILED] Took 1.82 seconds ==========================================El proceso del terminal "C:\Users\surby\.platformio\penv\Scripts\platformio.exe 'run', '--target', 'upload', '--environment', 'nanoatmega328'" finalizó con el código de salida 1.

No encuentra setlocale() asi que asumo que no existe.
Hay muy poca info para Arduino del tema.

Si funcionara setlocale entonces este link te serviría
https://www.aprenderaprogramar.com/index.php?option=com_content&view=article&id=857:mostrar-fecha-en-espanol-php-setlocale-strftime-formato-datedefault-timezone-set-ejemplos-cu00831b&catid=70&Itemid=193

Gatul: No he podido encontrar nada en todo el disco duro que contenga 'Monday'. Dlls y exes a montones, pero creo que esos no se compilan. Es posible que locale.h tenga relación. Lo estudio

Surbyte: El ejemplo estaba al principio del post con la respuesta. Lo que has puesto en la segunda respuesta estuve probándolo. Funciona en C++ para windows y para PHP, pero en arduino.....

Veremos si encuentro alguna otra forma. Me pondré a estudiar locale y veremos

Saludos y gracias

Coincido, funciona fuera de ambiente Arduino.

Algo hay que solucionar en el locale.h que está en C:\Program Files (x86)\Arduino\hardware\tools\avr\avr\include

#ifndef _LOCALE_H
#define _LOCALE_H

#if 1 /* ??? unimplemented */
#define LC_ALL      0
#define LC_COLLATE  1
#define LC_CTYPE    2
#define LC_MESSAGES 3
#define LC_MONETARY 4
#define LC_NUMERIC  5
#define LC_TIME     6
struct lconv;
extern char *setlocale(int category, const char *locale);
extern struct lconv *localeconv(void);
#endif

#endif /* L_OCALE_H */

Si existe es que algo quiere hacer.

Saludos

Claro yo estaba con Platformio y no se ve igual.
Ahora reviso en IDE.

Que tal si en lugar de dejar

extern char *setlocale(int category, const char *locale);

reemplazas por lo que debería hacer. Eso llama a un .o o .a o sea lib compilada si no me equivoco.

No se si sirve pero lo dejo para tu consideración
https://code.woboq.org/userspace/glibc/locale/setlocale.c.html

Buff. Eso se me escapa de las manos. Creía que se podría actualizar algo de alguna librería para pasarlo a español, pero veo que no. Además, lo hago solo por diversión. Voy a probar a modificar dlls a ver si la pillo :blush:

Saludos

No me sigas, es lo que encontré. Debe haber una manera mas simple.

Y muy agradecido por encontrar algo. Tu ayuda siempre es muy bienvenida.
Como está compilado en un ESP, me voy a liar a buscar dlls del entorno 8266 con el string Monday y cambiarlo por Lunes. Compilar y probar. Bueno, cada día con su nombre. Veremos hasta donde llego.

Gracias Surbyte por este tema y sobre todo por la inestimable ayuda que prestas a todo el mundo aunque a veces no te lo reconozcan

Lo mío se llama suerte. Al tercer archivo lo he pillado. Ahora estoy en modo ajustar, puesto que solo han dejado un nulo entre strings.

C:\Users\........\AppData\Local\Arduino15\packages\esp8266\tools\xtensa-lx106-elf-gcc\3.0.4-gcc10.3-1757bed\xtensa-lx106-elf\lib\libc.a

Los de 3 caracteres no hay problema, pero los nombres completos se solapan y el programa los muestra cortados.
Iré ajustándolos poco a poco y veremos.
La otra opción es buscar ese lib y compilarlo en español

Saludos

PD: ese lib pertenece al ESP2866. Supongo que en el ide estará el original de arduino

Pues ya está. Y funciona más o menos correcto
Los resultados son:

Sab Sabado  11-12-21 19:56:39
Dom Doming  12-12-21 19:56:39 <---- 
Lun Lunes  13-12-21 19:56:39
Mar Martes  14-12-21 19:56:39
Mie Miercoles  15-12-21 19:56:39
Jue Jueves  16-12-21 19:56:39
Vie Vierne  17-12-21 19:56:39 <----

Con las flechas señalo los 2 días incompletos.
Y aquí la conversión completa. Los puntos equivalen a los nulos

Ene.Feb.Mar.Abr.May.Jun.Jul.Ago.Sep.Oct.Nov.Dic.
Enero...Febrero..Marzo.Abril.Juni.Juli.Agosto.Septiembr.Octubre.Noviembr.Diciembr.
Dom.Lun.Mar.Mie.Jue.Vie.Sab.
Doming.Lunes..Martes..Miercoles.Jueves...Vierne.Sabado...

No sé si se puede subir aquí el libc.a modificado por si alguien lo usa.
Saludos

Cómo lo has hecho?
Sube el archivo como .zip para quien lo necesite pero no entendido lo que has hecho.

He modificado con un editor HEX el archivo libc.a y después comprobado que los textos salen correctamente (unas 7 u 8 pruebas)
Ahora lo que quisiera es modificar el archivo origen. Por internet no encuentro donde está el origen de la librería.

libc.zip (1,8 MB)

Os recuerdo que esta librería pertenece a ESP8266. Pero si alguien necesita la de Arduino costaría unos 5 minutos "ponerla al día"

Saludos

Ahh que astuto has estado!! muy buena jugada.

No probaste desplazar las cadenas a ver que resulta?
O sea

Domingo.Lunes.Martes..Miercoles.Jueves..Viernes.Sabado..

O tal vez

Domingo.Lunes.Martes.Miercoles.Jueves.Viernes.Sabado....

Saludos

Y porque no cambias la cadena de salida reemplazando "Mon" por "Lunes" etc etc?
Algo chapuza pero efectivo

Si Gatul, por eso digo que hice 7 u 8 pruebas. Se ve que el offset de inicio es fijo para cada string.
Era un pequeño reto, DanX3. Mejor dicho, ES. En cuanto me vuelva a poner, me lanzo a buscar el archivo fuente del libc de arduino

Saludos

Pues ya he localizado el AVR-libc oficial, aunque tengo dudas que sea el real que usa el ESP.
Si alguien quiere investigar alguna otra función, ahí va el link: avr-libc
He visto algunas funciones en C puro, pero la strftime y como copia los strings me ha hecho explotar el cerebro. Lo estudio a ver si puedo sacarle algo de jugo

Saludos