diff -ruN /usr/src/webalizer-2.01-10/graphs.c /root/work/webalizer-work/graphs.c --- /usr/src/webalizer-2.01-10/graphs.c 2001-06-15 12:34:24.000000000 +0400 +++ /root/work/webalizer-work/graphs.c 2006-04-24 15:35:54.000000000 +0400 @@ -27,6 +27,7 @@ */ #include +#include #include #include #include @@ -34,6 +35,7 @@ #include #include #include +#include #include "webalizer.h" #include "lang.h" @@ -60,6 +62,9 @@ void init_graph(char *, int, int); struct pie_data *calc_arc(float, float); +int koi2utf(char *code, char *buf, int out_len); +void gdImageStringRus(gdImagePtr im, gdFontPtr font, int x, int y, unsigned char *s, int color); +void gdImageStringUpRus(gdImagePtr im, gdFontPtr font, int x, int y, unsigned char *s, int color); /* common public declarations */ @@ -73,6 +78,59 @@ float percent; /* percent storage */ u_long julday; /* julday value */ +int koi2utf(char *code, char *buf, int out_len) { + iconv_t cd; + size_t k, f, t; + int se; + const char* in = code; + char* out = buf; + + cd = iconv_open("UTF-8", "KOI8-R"); + if( cd == (iconv_t)(-1) ) + perror("iconv_open"); + f = strlen(code); + t = out_len; + memset( buf, 0, out_len); + errno = 0; + k = iconv(cd, (char **)&in, &f, &out, &t); + se = errno; + if(se != 0) { + perror("Error converting"); + return 1; + } + + iconv_close(cd); + return 0; +} + +void gdImageStringRus(gdImagePtr im, gdFontPtr font, int x, int y, unsigned char *s, int color) +{ +int rect[8]; +char *buf; +int buflen; + + buflen = strlen(s) * 2; // Unicode string + buf = (char *)malloc(buflen); + koi2utf(s, buf, buflen); + gdImageStringFT(NULL, &rect[0], color, FontName, FontSize, 0.0, x, y, buf); + gdImageStringFT(im, &rect[0], color, FontName, FontSize, 0.0, x, y+FontSize, buf); + free(buf); +} + +void gdImageStringUpRus(gdImagePtr im, gdFontPtr font, int x, int y, unsigned char *s, int color) +{ +int rect[8]; +char *buf; +int buflen; + + buflen = strlen(s) * 2; // Unicode string + buf = (char *)malloc(buflen); + koi2utf(s, buf, buflen); + gdImageStringFT(NULL, &rect[0], color, FontName, FontSize, 1.57, x, y, buf); + gdImageStringFT(im, &rect[0], color, FontName, FontSize, 1.57, x+FontSize, y, buf); + free(buf); +} + struct pie_data { int x; int y; /* line x,y */ int mx; int my; }; /* midpoint x,y */ /* colors */ @@ -128,7 +186,7 @@ s_mth = fmonth; for (i=0;i<12;i++) { - gdImageString(im,gdFontSmall,28+(i*23), /* use language */ + gdImageStringRus(im,gdFontSmall,28+(i*23), /* use language */ 238,s_month[s_mth-1],black); /* specific array */ s_mth++; if (s_mth > 12) s_mth = 1; @@ -138,38 +196,38 @@ } if (maxval <= 0) maxval = 1; sprintf(maxvaltxt, "%lu", maxval); - gdImageStringUp(im,gdFontSmall,8,26+(strlen(maxvaltxt)*6),maxvaltxt,black); + gdImageStringUpRus(im,gdFontSmall,8,26+(strlen(maxvaltxt)*6),maxvaltxt,black); if (graph_legend) /* print color coded legends? */ { /* Kbytes Legend */ i = (strlen(msg_h_xfer)*6); - gdImageString(im,gdFontSmall,491-i,239,msg_h_xfer,dkgrey); - gdImageString(im,gdFontSmall,490-i,238,msg_h_xfer,COLOR4); + gdImageStringRus(im,gdFontSmall,491-i,239,msg_h_xfer,dkgrey); + gdImageStringRus(im,gdFontSmall,490-i,238,msg_h_xfer,COLOR4); /* Sites/Visits Legend */ i = (strlen(msg_h_visits)*6); j = (strlen(msg_h_sites)*6); - gdImageString(im,gdFontSmall,491-i-j-12,11,msg_h_visits,dkgrey); - gdImageString(im,gdFontSmall,490-i-j-12,10,msg_h_visits,COLOR6); - gdImageString(im,gdFontSmall,491-j-9,11,"/",dkgrey); - gdImageString(im,gdFontSmall,490-j-9,10,"/",black); - gdImageString(im,gdFontSmall,491-j,11,msg_h_sites,dkgrey); - gdImageString(im,gdFontSmall,490-j,10,msg_h_sites,COLOR3); + gdImageStringRus(im,gdFontSmall,491-i-j-12,11,msg_h_visits,dkgrey); + gdImageStringRus(im,gdFontSmall,490-i-j-12,10,msg_h_visits,COLOR6); + gdImageStringRus(im,gdFontSmall,491-j-9,11,"/",dkgrey); + gdImageStringRus(im,gdFontSmall,490-j-9,10,"/",black); + gdImageStringRus(im,gdFontSmall,491-j,11,msg_h_sites,dkgrey); + gdImageStringRus(im,gdFontSmall,490-j,10,msg_h_sites,COLOR3); /* Hits/Files/Pages Legend */ i = (strlen(msg_h_pages)*6); j = (strlen(msg_h_files)*6); - gdImageStringUp(im,gdFontSmall,8,231,msg_h_pages,dkgrey); - gdImageStringUp(im,gdFontSmall,7,230,msg_h_pages,COLOR5); - gdImageStringUp(im,gdFontSmall,8,231-i-3,"/",dkgrey); - gdImageStringUp(im,gdFontSmall,7,230-i-3,"/",black); - gdImageStringUp(im,gdFontSmall,8,231-i-12,msg_h_files,dkgrey); - gdImageStringUp(im,gdFontSmall,7,230-i-12,msg_h_files,COLOR2); - gdImageStringUp(im,gdFontSmall,8,231-i-j-15,"/",dkgrey); - gdImageStringUp(im,gdFontSmall,7,230-i-j-15,"/",black); - gdImageStringUp(im,gdFontSmall,8,231-i-j-24,msg_h_hits,dkgrey); - gdImageStringUp(im,gdFontSmall,7,230-i-j-24,msg_h_hits,COLOR1); + gdImageStringUpRus(im,gdFontSmall,8,231,msg_h_pages,dkgrey); + gdImageStringUpRus(im,gdFontSmall,7,230,msg_h_pages,COLOR5); + gdImageStringUpRus(im,gdFontSmall,8,231-i-3,"/",dkgrey); + gdImageStringUpRus(im,gdFontSmall,7,230-i-3,"/",black); + gdImageStringUpRus(im,gdFontSmall,8,231-i-12,msg_h_files,dkgrey); + gdImageStringUpRus(im,gdFontSmall,7,230-i-12,msg_h_files,COLOR2); + gdImageStringUpRus(im,gdFontSmall,8,231-i-j-15,"/",dkgrey); + gdImageStringUpRus(im,gdFontSmall,7,230-i-j-15,"/",black); + gdImageStringUpRus(im,gdFontSmall,8,231-i-j-24,msg_h_hits,dkgrey); + gdImageStringUpRus(im,gdFontSmall,7,230-i-j-24,msg_h_hits,COLOR1); } /* data1 */ @@ -222,7 +280,7 @@ } if (maxval <= 0) maxval = 1; sprintf(maxvaltxt, "%lu", maxval); - gdImageStringUp(im, gdFontSmall,493,26+(strlen(maxvaltxt)*6), + gdImageStringUpRus(im, gdFontSmall,493,26+(strlen(maxvaltxt)*6), maxvaltxt, black); /* data6 */ @@ -258,7 +316,7 @@ if (data4[i] > fmaxval) fmaxval = data4[i]; /* get max val */ if (fmaxval <= 0.0) fmaxval = 1.0; sprintf(maxvaltxt, "%.0f", fmaxval); - gdImageStringUp(im, gdFontSmall,493,130+(strlen(maxvaltxt)*6), + gdImageStringUpRus(im, gdFontSmall,493,130+(strlen(maxvaltxt)*6), maxvaltxt,black); /* data4 */ @@ -340,9 +398,9 @@ for (i=0;i<31;i++) { if ((julday % 7 == 6) || (julday % 7 == 0)) - gdImageString(im,gdFontSmall,25+(i*15),382,numchar[i+1],COLOR1); + gdImageStringRus(im,gdFontSmall,25+(i*15),382,numchar[i+1],COLOR1); else - gdImageString(im,gdFontSmall,25+(i*15),382,numchar[i+1],black); + gdImageStringRus(im,gdFontSmall,25+(i*15),382,numchar[i+1],black); julday++; } @@ -355,38 +413,38 @@ } if (maxval <= 0) maxval = 1; sprintf(maxvaltxt, "%lu", maxval); - gdImageStringUp(im, gdFontSmall,8,26+(strlen(maxvaltxt)*6), + gdImageStringUpRus(im, gdFontSmall,8,26+(strlen(maxvaltxt)*6), maxvaltxt,black); if (graph_legend) /* Print color coded legends? */ { /* Kbytes Legend */ - gdImageStringUp(im,gdFontSmall,494,376,msg_h_xfer,dkgrey); - gdImageStringUp(im,gdFontSmall,493,375,msg_h_xfer,COLOR4); + gdImageStringUpRus(im,gdFontSmall,494,376,msg_h_xfer,dkgrey); + gdImageStringUpRus(im,gdFontSmall,493,375,msg_h_xfer,COLOR4); /* Sites/Visits Legend */ i = (strlen(msg_h_sites)*6); - gdImageStringUp(im,gdFontSmall,494,276,msg_h_sites,dkgrey); - gdImageStringUp(im,gdFontSmall,493,275,msg_h_sites,COLOR3); - gdImageStringUp(im,gdFontSmall,494,276-i-3,"/",dkgrey); - gdImageStringUp(im,gdFontSmall,493,275-i-3,"/",black); - gdImageStringUp(im,gdFontSmall,494,276-i-12,msg_h_visits,dkgrey); - gdImageStringUp(im,gdFontSmall,493,275-i-12,msg_h_visits,COLOR6); + gdImageStringUpRus(im,gdFontSmall,494,276,msg_h_sites,dkgrey); + gdImageStringUpRus(im,gdFontSmall,493,275,msg_h_sites,COLOR3); + gdImageStringUpRus(im,gdFontSmall,494,276-i-3,"/",dkgrey); + gdImageStringUpRus(im,gdFontSmall,493,275-i-3,"/",black); + gdImageStringUpRus(im,gdFontSmall,494,276-i-12,msg_h_visits,dkgrey); + gdImageStringUpRus(im,gdFontSmall,493,275-i-12,msg_h_visits,COLOR6); /* Pages/Files/Hits Legend */ s = ( i=(strlen(msg_h_pages)*6) )+ ( j=(strlen(msg_h_files)*6) )+ ( strlen(msg_h_hits)*6 )+ 52; - gdImageStringUp(im,gdFontSmall,494,s,msg_h_pages,dkgrey); - gdImageStringUp(im,gdFontSmall,493,s-1,msg_h_pages,COLOR5); - gdImageStringUp(im,gdFontSmall,494,s-i-3,"/",dkgrey); - gdImageStringUp(im,gdFontSmall,493,s-i-4,"/",black); - gdImageStringUp(im,gdFontSmall,494,s-i-12,msg_h_files,dkgrey); - gdImageStringUp(im,gdFontSmall,493,s-i-13,msg_h_files,COLOR2); - gdImageStringUp(im,gdFontSmall,494,s-i-j-15,"/",dkgrey); - gdImageStringUp(im,gdFontSmall,493,s-i-j-16,"/",black); - gdImageStringUp(im,gdFontSmall,494,s-i-j-24,msg_h_hits,dkgrey); - gdImageStringUp(im,gdFontSmall,493,s-i-j-25,msg_h_hits,COLOR1); + gdImageStringUpRus(im,gdFontSmall,494,s,msg_h_pages,dkgrey); + gdImageStringUpRus(im,gdFontSmall,493,s-1,msg_h_pages,COLOR5); + gdImageStringUpRus(im,gdFontSmall,494,s-i-3,"/",dkgrey); + gdImageStringUpRus(im,gdFontSmall,493,s-i-4,"/",black); + gdImageStringUpRus(im,gdFontSmall,494,s-i-12,msg_h_files,dkgrey); + gdImageStringUpRus(im,gdFontSmall,493,s-i-13,msg_h_files,COLOR2); + gdImageStringUpRus(im,gdFontSmall,494,s-i-j-15,"/",dkgrey); + gdImageStringUpRus(im,gdFontSmall,493,s-i-j-16,"/",black); + gdImageStringUpRus(im,gdFontSmall,494,s-i-j-24,msg_h_hits,dkgrey); + gdImageStringUpRus(im,gdFontSmall,493,s-i-j-25,msg_h_hits,COLOR1); } /* data1 */ @@ -435,7 +493,7 @@ } if (maxval <= 0) maxval = 1; sprintf(maxvaltxt, "%lu", maxval); - gdImageStringUp(im, gdFontSmall,8,180+(strlen(maxvaltxt)*6), + gdImageStringUpRus(im, gdFontSmall,8,180+(strlen(maxvaltxt)*6), maxvaltxt, black); /* data 6 */ @@ -468,7 +526,7 @@ if (data4[i]>fmaxval) fmaxval = data4[i]; if (fmaxval <= 0.0) fmaxval = 1.0; sprintf(maxvaltxt, "%.0f", fmaxval/1024); - gdImageStringUp(im, gdFontSmall,8,280+(strlen(maxvaltxt)*6), + gdImageStringUpRus(im, gdFontSmall,8,280+(strlen(maxvaltxt)*6), maxvaltxt, black); for (i=0; i<31; i++) @@ -525,14 +583,14 @@ /* x-axis legend */ for (i=0;i<24;i++) { - gdImageString(im,gdFontSmall,33+(i*19),238,numchar[i],black); + gdImageStringRus(im,gdFontSmall,33+(i*19),238,numchar[i],black); if (data1[i] > maxval) maxval = data1[i]; /* get max val */ if (data2[i] > maxval) maxval = data2[i]; if (data3[i] > maxval) maxval = data3[i]; } if (maxval <= 0) maxval = 1; sprintf(maxvaltxt, "%lu", maxval); - gdImageStringUp(im, gdFontSmall, 8, 26+(strlen(maxvaltxt)*6), + gdImageStringUpRus(im, gdFontSmall, 8, 26+(strlen(maxvaltxt)*6), maxvaltxt, black); if (graph_legend) /* print color coded legends? */ @@ -541,16 +599,16 @@ s = ( i=(strlen(msg_h_pages)*6) )+ ( j=(strlen(msg_h_files)*6) )+ ( strlen(msg_h_hits)*6 )+ 52; - gdImageStringUp(im,gdFontSmall,494,s,msg_h_pages,dkgrey); - gdImageStringUp(im,gdFontSmall,493,s-1,msg_h_pages,COLOR5); - gdImageStringUp(im,gdFontSmall,494,s-i-3,"/",dkgrey); - gdImageStringUp(im,gdFontSmall,493,s-i-4,"/",black); - gdImageStringUp(im,gdFontSmall,494,s-i-12,msg_h_files,dkgrey); - gdImageStringUp(im,gdFontSmall,493,s-i-13,msg_h_files,COLOR2); - gdImageStringUp(im,gdFontSmall,494,s-i-j-15,"/",dkgrey); - gdImageStringUp(im,gdFontSmall,493,s-i-j-16,"/",black); - gdImageStringUp(im,gdFontSmall,494,s-i-j-24,msg_h_hits,dkgrey); - gdImageStringUp(im,gdFontSmall,493,s-i-j-25,msg_h_hits,COLOR1); + gdImageStringUpRus(im,gdFontSmall,494,s,msg_h_pages,dkgrey); + gdImageStringUpRus(im,gdFontSmall,493,s-1,msg_h_pages,COLOR5); + gdImageStringUpRus(im,gdFontSmall,494,s-i-3,"/",dkgrey); + gdImageStringUpRus(im,gdFontSmall,493,s-i-4,"/",black); + gdImageStringUpRus(im,gdFontSmall,494,s-i-12,msg_h_files,dkgrey); + gdImageStringUpRus(im,gdFontSmall,493,s-i-13,msg_h_files,COLOR2); + gdImageStringUpRus(im,gdFontSmall,494,s-i-j-15,"/",dkgrey); + gdImageStringUpRus(im,gdFontSmall,493,s-i-j-16,"/",black); + gdImageStringUpRus(im,gdFontSmall,494,s-i-j-24,msg_h_hits,dkgrey); + gdImageStringUpRus(im,gdFontSmall,493,s-i-j-25,msg_h_hits,COLOR1); } /* data1 */ @@ -656,8 +714,8 @@ sprintf(buffer,"%s (%d%%)",legend[i], percent); x=480-(strlen(buffer)*7); - gdImageString(im,gdFontMediumBold, x+1, y+1, buffer, black); - gdImageString(im,gdFontMediumBold, x, y, buffer, i+4); + gdImageStringRus(im,gdFontMediumBold, x+1, y+1, buffer, black); + gdImageStringRus(im,gdFontMediumBold, x, y, buffer, i+4); y+=20; } } @@ -669,8 +727,8 @@ gdImageFill(im, gdata.mx, gdata.my, white); sprintf(buffer,"%s (%d%%)",msg_h_other,100-(int)(s_arc*100)); x=480-(strlen(buffer)*7); - gdImageString(im,gdFontMediumBold, x+1, y+1, buffer, black); - gdImageString(im,gdFontMediumBold, x, y, buffer, white); + gdImageStringRus(im,gdFontMediumBold, x+1, y+1, buffer, black); + gdImageStringRus(im,gdFontMediumBold, x, y, buffer, white); } /* save png image */ @@ -746,7 +804,7 @@ gdImageRectangle(im, 0, 0, xsize-1, ysize-1, black); /* display the graph title */ - gdImageString(im, gdFontMediumBold, 20, 8, title, blue); + gdImageStringRus(im, gdFontMediumBold, 20, 8, title, blue); return; } diff -ruN /usr/src/webalizer-2.01-10/lang/webalizer_lang.russian /root/work/webalizer-work/lang/webalizer_lang.russian --- /usr/src/webalizer-2.01-10/lang/webalizer_lang.russian 2000-10-06 09:27:49.000000000 +0400 +++ /root/work/webalizer-work/lang/webalizer_lang.russian 2006-04-24 14:36:44.000000000 +0400 @@ -201,12 +201,12 @@ char *msg_h_day = "День"; char *msg_h_mth = "Месяц"; char *msg_h_hour = "Час"; -char *msg_h_hits = "запросов"; -char *msg_h_pages = "страниц"; +char *msg_h_hits = "запросов "; +char *msg_h_pages = "страниц "; char *msg_h_visits= "посещений"; -char *msg_h_files = "файлов"; -char *msg_h_sites = "сайтов"; -char *msg_h_xfer = "Кбайт"; +char *msg_h_files = "файлов "; +char *msg_h_sites = "сайтов "; +char *msg_h_xfer = "Кбайт "; char *msg_h_hname = "Имя хоста"; char *msg_h_url = "URL"; char *msg_h_agent = "Броузер"; @@ -276,10 +276,10 @@ char *msg_v_users = "Посмотреть все имена пользователей"; /* short month names MUST BE 3 CHARS in size... pad if needed*/ -char *s_month[12]={ "Янв", "Фев", "Мар", - "Апр", "Май", "Июн", - "Июл", "Авг", "Сен", - "Окт", "Ноя", "Дек"}; +char *s_month[12]={ "Янв ", "Фев ", "Мар ", + "Апр ", "Май ", "Июн ", + "Июл ", "Авг ", "Сен ", + "Окт ", "Ноя ", "Дек "}; /* long month names - can be any length */ char *l_month[12]={ "Январь", "Февраль", "Март", "Апрель", diff -ruN /usr/src/webalizer-2.01-10/Makefile /root/work/webalizer-work/Makefile --- /usr/src/webalizer-2.01-10/Makefile 2006-04-19 14:38:04.000000000 +0400 +++ /root/work/webalizer-work/Makefile 2006-04-21 20:45:30.000000000 +0400 @@ -25,7 +25,7 @@ ETCDIR = /etc CC = gcc CFLAGS = -I/usr/lib -Wall -O2 -LIBS = -lgd -lpng -lz -lm -lnsl +LIBS = -lgd -lpng -lz -lm -lnsl -liconv DEFS = -DETCDIR=\"/etc\" -DHAVE_SOCKET=1 -DHAVE_SYS_SOCKET_H=1 -DHAVE_GETOPT_H=1 -DHAVE_MATH_H=1 LDFLAGS= -L/usr/lib INSTALL= /usr/bin/install -c diff -ruN /usr/src/webalizer-2.01-10/webalizer.c /root/work/webalizer-work/webalizer.c --- /usr/src/webalizer-2.01-10/webalizer.c 2002-04-17 02:11:31.000000000 +0400 +++ /root/work/webalizer-work/webalizer.c 2006-04-21 21:57:58.000000000 +0400 @@ -166,6 +166,8 @@ int dump_search = 0; /* Search strings */ int dump_header = 0; /* Dump header as first rec */ char *dump_path = NULL; /* Path for dump files */ +char *FontName = NULL; /* Font name for garphs */ +int FontSize = 0; int cur_year=0, cur_month=0, /* year/month/day/hour */ cur_day=0, cur_hour=0, /* tracking variables */ @@ -1449,7 +1451,9 @@ "DNSCache", /* DNS Cache file name 84 */ "DNSChildren", /* DNS Children (0=no DNS) 85 */ "DailyGraph", /* Daily Graph (0=no) 86 */ - "DailyStats" /* Daily Stats (0=no) 87 */ + "DailyStats", /* Daily Stats (0=no) 87 */ + "FontName", /* Font name for graphs 88 */ + "FontSize" /* Font size for graphs 89 */ }; FILE *fp; @@ -1593,8 +1597,12 @@ #endif /* USE_DNS */ case 86: daily_graph=(value[0]=='n')?0:1; break; /* HourlyGraph */ case 87: daily_stats=(value[0]=='n')?0:1; break; /* HourlyStats */ + case 88: FontName=save_opt(value); break; /* FontName */ + case 89: FontSize=atoi(value); break; /* FontSize */ } } + if(FontName == NULL) { FontName = "/usr/share/fonts/arial.ttf"; } + if(FontSize == 0) { FontSize = 10; } fclose(fp); } diff -ruN /usr/src/webalizer-2.01-10/webalizer.h /root/work/webalizer-work/webalizer.h --- /usr/src/webalizer-2.01-10/webalizer.h 2001-02-10 03:58:18.000000000 +0300 +++ /root/work/webalizer-work/webalizer.h 2006-04-21 21:49:18.000000000 +0400 @@ -259,5 +259,7 @@ extern void init_counters(); extern int ispage(char *); extern u_long jdate(int,int,int); +extern char *FontName; +extern int FontSize; #endif /* _WEBALIZER_H */ diff -ruN /usr/src/webalizer-2.01-10/webalizer_lang.h /root/work/webalizer-work/webalizer_lang.h --- /usr/src/webalizer-2.01-10/webalizer_lang.h 2000-10-06 09:27:49.000000000 +0400 +++ /root/work/webalizer-work/webalizer_lang.h 2006-04-24 14:36:44.000000000 +0400 @@ -201,12 +201,12 @@ char *msg_h_day = "День"; char *msg_h_mth = "Месяц"; char *msg_h_hour = "Час"; -char *msg_h_hits = "запросов"; -char *msg_h_pages = "страниц"; +char *msg_h_hits = "запросов "; +char *msg_h_pages = "страниц "; char *msg_h_visits= "посещений"; -char *msg_h_files = "файлов"; -char *msg_h_sites = "сайтов"; -char *msg_h_xfer = "Кбайт"; +char *msg_h_files = "файлов "; +char *msg_h_sites = "сайтов "; +char *msg_h_xfer = "Кбайт "; char *msg_h_hname = "Имя хоста"; char *msg_h_url = "URL"; char *msg_h_agent = "Броузер"; @@ -276,10 +276,10 @@ char *msg_v_users = "Посмотреть все имена пользователей"; /* short month names MUST BE 3 CHARS in size... pad if needed*/ -char *s_month[12]={ "Янв", "Фев", "Мар", - "Апр", "Май", "Июн", - "Июл", "Авг", "Сен", - "Окт", "Ноя", "Дек"}; +char *s_month[12]={ "Янв ", "Фев ", "Мар ", + "Апр ", "Май ", "Июн ", + "Июл ", "Авг ", "Сен ", + "Окт ", "Ноя ", "Дек "}; /* long month names - can be any length */ char *l_month[12]={ "Январь", "Февраль", "Март", "Апрель",