1 /*
2 This file is part of Telegram Desktop,
3 the official desktop application for the Telegram messaging service.
4
5 For license and copyright information please follow this link:
6 https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
7 */
8 #include "lang/lang_keys.h"
9
10 #include "lang/lang_file_parser.h"
11 #include "ui/integration.h"
12
13 namespace {
14
15 template <typename WithYear, typename WithoutYear>
langDateMaybeWithYear(QDate date,WithYear withYear,WithoutYear withoutYear)16 inline QString langDateMaybeWithYear(
17 QDate date,
18 WithYear withYear,
19 WithoutYear withoutYear) {
20 const auto month = date.month();
21 if (month <= 0 || month > 12) {
22 return u"MONTH_ERR"_q;
23 };
24 const auto year = date.year();
25 const auto current = QDate::currentDate();
26 const auto currentYear = current.year();
27 const auto currentMonth = current.month();
28 if (year != currentYear) {
29 const auto yearIsMuchGreater = [](int year, int otherYear) {
30 return (year > otherYear + 1);
31 };
32 const auto monthIsMuchGreater = [](
33 int year,
34 int month,
35 int otherYear,
36 int otherMonth) {
37 return (year == otherYear + 1) && (month + 12 > otherMonth + 3);
38 };
39 if (false
40 || yearIsMuchGreater(year, currentYear)
41 || yearIsMuchGreater(currentYear, year)
42 || monthIsMuchGreater(year, month, currentYear, currentMonth)
43 || monthIsMuchGreater(currentYear, currentMonth, year, month)) {
44 return withYear(month, year);
45 }
46 }
47 return withoutYear(month, year);
48 }
49
Month(int index)50 tr::phrase<> Month(int index) {
51 switch (index) {
52 case 1: return tr::lng_month1;
53 case 2: return tr::lng_month2;
54 case 3: return tr::lng_month3;
55 case 4: return tr::lng_month4;
56 case 5: return tr::lng_month5;
57 case 6: return tr::lng_month6;
58 case 7: return tr::lng_month7;
59 case 8: return tr::lng_month8;
60 case 9: return tr::lng_month9;
61 case 10: return tr::lng_month10;
62 case 11: return tr::lng_month11;
63 case 12: return tr::lng_month12;
64 }
65 Unexpected("Index in MonthSmall.");
66 }
67
MonthSmall(int index)68 tr::phrase<> MonthSmall(int index) {
69 switch (index) {
70 case 1: return tr::lng_month1_small;
71 case 2: return tr::lng_month2_small;
72 case 3: return tr::lng_month3_small;
73 case 4: return tr::lng_month4_small;
74 case 5: return tr::lng_month5_small;
75 case 6: return tr::lng_month6_small;
76 case 7: return tr::lng_month7_small;
77 case 8: return tr::lng_month8_small;
78 case 9: return tr::lng_month9_small;
79 case 10: return tr::lng_month10_small;
80 case 11: return tr::lng_month11_small;
81 case 12: return tr::lng_month12_small;
82 }
83 Unexpected("Index in MonthSmall.");
84 }
85
MonthDay(int index)86 tr::phrase<> MonthDay(int index) {
87 switch (index) {
88 case 1: return tr::lng_month_day1;
89 case 2: return tr::lng_month_day2;
90 case 3: return tr::lng_month_day3;
91 case 4: return tr::lng_month_day4;
92 case 5: return tr::lng_month_day5;
93 case 6: return tr::lng_month_day6;
94 case 7: return tr::lng_month_day7;
95 case 8: return tr::lng_month_day8;
96 case 9: return tr::lng_month_day9;
97 case 10: return tr::lng_month_day10;
98 case 11: return tr::lng_month_day11;
99 case 12: return tr::lng_month_day12;
100 }
101 Unexpected("Index in MonthDay.");
102 }
103
Weekday(int index)104 tr::phrase<> Weekday(int index) {
105 switch (index) {
106 case 1: return tr::lng_weekday1;
107 case 2: return tr::lng_weekday2;
108 case 3: return tr::lng_weekday3;
109 case 4: return tr::lng_weekday4;
110 case 5: return tr::lng_weekday5;
111 case 6: return tr::lng_weekday6;
112 case 7: return tr::lng_weekday7;
113 }
114 Unexpected("Index in Weekday.");
115 }
116
117 } // namespace
118
langFirstNameGoesSecond()119 bool langFirstNameGoesSecond() {
120 const auto kFirstName = QChar(0x0001);
121 const auto kLastName = QChar(0x0002);
122 const auto fullname = tr::lng_full_name(
123 tr::now,
124 lt_first_name,
125 QString(1, kFirstName),
126 lt_last_name,
127 QString(1, kLastName));
128 return fullname.indexOf(kLastName) < fullname.indexOf(kFirstName);
129 }
130
langDayOfMonth(const QDate & date)131 QString langDayOfMonth(const QDate &date) {
132 auto day = date.day();
133 return langDateMaybeWithYear(date, [&](int month, int year) {
134 return tr::lng_month_day_year(
135 tr::now,
136 lt_month,
137 MonthSmall(month)(tr::now),
138 lt_day,
139 QString::number(day),
140 lt_year,
141 QString::number(year));
142 }, [day](int month, int year) {
143 return tr::lng_month_day(
144 tr::now,
145 lt_month,
146 MonthSmall(month)(tr::now),
147 lt_day,
148 QString::number(day));
149 });
150 }
151
langDayOfMonthFull(const QDate & date)152 QString langDayOfMonthFull(const QDate &date) {
153 auto day = date.day();
154 return langDateMaybeWithYear(date, [day](int month, int year) {
155 return tr::lng_month_day_year(
156 tr::now,
157 lt_month,
158 MonthDay(month)(tr::now),
159 lt_day,
160 QString::number(day),
161 lt_year,
162 QString::number(year));
163 }, [day](int month, int year) {
164 return tr::lng_month_day(
165 tr::now,
166 lt_month,
167 MonthDay(month)(tr::now),
168 lt_day,
169 QString::number(day));
170 });
171 }
172
langMonthOfYear(int month,int year)173 QString langMonthOfYear(int month, int year) {
174 return (month > 0 && month <= 12)
175 ? tr::lng_month_year(
176 tr::now,
177 lt_month,
178 MonthSmall(month)(tr::now),
179 lt_year,
180 QString::number(year))
181 : u"MONTH_ERR"_q;
182 }
183
langMonth(const QDate & date)184 QString langMonth(const QDate &date) {
185 return langDateMaybeWithYear(date, [](int month, int year) {
186 return langMonthOfYear(month, year);
187 }, [](int month, int year) {
188 return MonthSmall(month)(tr::now);
189 });
190 }
191
langMonthOfYearFull(int month,int year)192 QString langMonthOfYearFull(int month, int year) {
193 return (month > 0 && month <= 12)
194 ? tr::lng_month_year(
195 tr::now,
196 lt_month,
197 Month(month)(tr::now),
198 lt_year,
199 QString::number(year))
200 : u"MONTH_ERR"_q;
201 }
202
langMonthFull(const QDate & date)203 QString langMonthFull(const QDate &date) {
204 return langDateMaybeWithYear(date, [](int month, int year) {
205 return langMonthOfYearFull(month, year);
206 }, [](int month, int year) {
207 return Month(month)(tr::now);
208 });
209 }
210
langDayOfWeek(int index)211 QString langDayOfWeek(int index) {
212 return (index > 0 && index <= 7) ? Weekday(index)(tr::now) : u"DAY_ERR"_q;
213 }
214
langDateTime(const QDateTime & date)215 QString langDateTime(const QDateTime &date) {
216 return tr::lng_mediaview_date_time(
217 tr::now,
218 lt_date,
219 langDayOfMonth(date.date()),
220 lt_time,
221 date.time().toString(Ui::Integration::Instance().timeFormat()));
222 }
223
langDateTimeFull(const QDateTime & date)224 QString langDateTimeFull(const QDateTime &date) {
225 return tr::lng_mediaview_date_time(
226 tr::now,
227 lt_date,
228 langDayOfMonthFull(date.date()),
229 lt_time,
230 date.time().toString(Ui::Integration::Instance().timeFormat()));
231 }
232