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