Compare commits
768 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d205e3b4a3 | ||
|
|
8b40a77297 | ||
|
|
a7e87cc722 | ||
|
|
09f106bd49 | ||
|
|
8a0869fb75 | ||
|
|
7ccf26310d | ||
|
|
e1420ba26c | ||
|
|
c693c9cd44 | ||
|
|
e698557092 | ||
|
|
1238c90450 | ||
|
|
e991dca5a0 | ||
|
|
37093c9f33 | ||
|
|
1dd4f62ece | ||
|
|
9ec27aad53 | ||
|
|
f1d3a946d5 | ||
|
|
fd24f7045e | ||
|
|
33671e7737 | ||
|
|
13ecc6a56b | ||
|
|
20815eecbc | ||
|
|
f2f5ffd861 | ||
|
|
b0971601b1 | ||
|
|
7253d764d2 | ||
|
|
71f3a1f7cf | ||
|
|
950659b29d | ||
|
|
b4392d0e3c | ||
|
|
4571302642 | ||
|
|
5121f04d66 | ||
|
|
77642d2876 | ||
|
|
ef69796798 | ||
|
|
869854fbc2 | ||
|
|
4584d912cc | ||
|
|
ddd3d38dac | ||
|
|
fcba6bc7d7 | ||
|
|
a147c0fb4f | ||
|
|
c3cc3fa9bd | ||
|
|
0f0e14132a | ||
|
|
a2c2ed0b4a | ||
|
|
8bebca4502 | ||
|
|
e9a550d458 | ||
|
|
bee567f2b1 | ||
|
|
0fd7061671 | ||
|
|
96951576c1 | ||
|
|
a665d7cc3c | ||
|
|
9b989329d4 | ||
|
|
eccfd75a83 | ||
|
|
7e8a152eef | ||
|
|
44810f95a5 | ||
|
|
bcd42dbb6a | ||
|
|
6e77126a65 | ||
|
|
735bbef655 | ||
|
|
7006a07dd3 | ||
|
|
7284926db4 | ||
|
|
b506bf9506 | ||
|
|
3fea28f8b0 | ||
|
|
cc6649667c | ||
|
|
24121fbbce | ||
|
|
ef280dae3e | ||
|
|
49f580a36b | ||
|
|
a56d2b1313 | ||
|
|
f083180401 | ||
|
|
7b870edefa | ||
|
|
a293fa1de6 | ||
|
|
3a8898dd24 | ||
|
|
b97c8b9a17 | ||
|
|
a0a8d76441 | ||
|
|
9199612cf7 | ||
|
|
abfd37c045 | ||
|
|
ac243136b9 | ||
|
|
c93e948bb3 | ||
|
|
388803ffdb | ||
|
|
a809ccf229 | ||
|
|
d1796a515e | ||
|
|
a11d3efed6 | ||
|
|
9d7aab4326 | ||
|
|
a3b76fed4c | ||
|
|
21f5f96d69 | ||
|
|
70d3061d59 | ||
|
|
8f7a66a21a | ||
|
|
cd8e944751 | ||
|
|
66e05594f6 | ||
|
|
d06a9e2e5c | ||
|
|
64df9222dd | ||
|
|
900ac46583 | ||
|
|
fda1c8399f | ||
|
|
c2cd4fc75f | ||
|
|
ef5a9eb777 | ||
|
|
8e3100acdd | ||
|
|
50d74fcf25 | ||
|
|
140862ce5a | ||
|
|
966453dd8f | ||
|
|
fcd37adc38 | ||
|
|
6a3989488e | ||
|
|
fbfdef8f9a | ||
|
|
b66c61573f | ||
|
|
9186b28b60 | ||
|
|
915a1b105c | ||
|
|
12b9b3ce71 | ||
|
|
deb4c48551 | ||
|
|
9dfaac8582 | ||
|
|
bd5b9f5347 | ||
|
|
ff4b9a3cfe | ||
|
|
e844d7ed89 | ||
|
|
f3ae8f7f75 | ||
|
|
f137eddbf9 | ||
|
|
c70f75b21a | ||
|
|
141fb875f9 | ||
|
|
344d47e7dd | ||
|
|
4840a9094b | ||
|
|
6f305c8974 | ||
|
|
c83bae3bb5 | ||
|
|
4c1b962486 | ||
|
|
b929e2a7b2 | ||
|
|
1ecd7aa7cf | ||
|
|
881aed50ea | ||
|
|
6272b79f70 | ||
|
|
0fa50f1951 | ||
|
|
dc19f2e76c | ||
|
|
498116c3f6 | ||
|
|
e29dcf7489 | ||
|
|
ec28eea7f0 | ||
|
|
ebce4d0f31 | ||
|
|
bf9492e083 | ||
|
|
cb987c1baf | ||
|
|
e4a4be1f53 | ||
|
|
f6d1fe6c04 | ||
|
|
7e5a29a5cc | ||
|
|
8dbc175c02 | ||
|
|
0473374d51 | ||
|
|
b2d7342b9e | ||
|
|
b965aecc6c | ||
|
|
9290c90bdc | ||
|
|
d83a80ec53 | ||
|
|
248fe1b53f | ||
|
|
bf217bf7aa | ||
|
|
e5de8e22b7 | ||
|
|
5666e84d92 | ||
|
|
a97d1b8669 | ||
|
|
06db13a0ab | ||
|
|
9832af7cce | ||
|
|
cf4a617f2b | ||
|
|
5a6a5fd4d1 | ||
|
|
e6ebc19b4f | ||
|
|
02dd0dbbef | ||
|
|
2e4a437d32 | ||
|
|
63e1d6dab6 | ||
|
|
23133499c7 | ||
|
|
67bd87b50c | ||
|
|
6d31a4246f | ||
|
|
d4f38b6d66 | ||
|
|
959229f143 | ||
|
|
22f9b1a0b1 | ||
|
|
a8fc5a722f | ||
|
|
6102119673 | ||
|
|
0c635a05ff | ||
|
|
307a7791df | ||
|
|
49b056a0ce | ||
|
|
af58ffadcb | ||
|
|
dcbda7b3af | ||
|
|
553cc0c6ae | ||
|
|
067dcbfbeb | ||
|
|
759258bb39 | ||
|
|
3667ef551c | ||
|
|
a3308087a5 | ||
|
|
bfb4652425 | ||
|
|
03c24e2906 | ||
|
|
dc61faace1 | ||
|
|
73ea86ceeb | ||
|
|
9a622ab466 | ||
|
|
65cfd6c81c | ||
|
|
08681ac1b9 | ||
|
|
f9acb5d19b | ||
|
|
e9e187c58b | ||
|
|
3bc20c3550 | ||
|
|
4b25406d14 | ||
|
|
265b7904a8 | ||
|
|
fb2274c58d | ||
|
|
3cfdc9d897 | ||
|
|
11986ac698 | ||
|
|
a08436ecd2 | ||
|
|
e92adf94a7 | ||
|
|
d25356917d | ||
|
|
0adb3b062f | ||
|
|
9316480884 | ||
|
|
4e5082f6c6 | ||
|
|
16d5dbe71c | ||
|
|
133d7874e3 | ||
|
|
4659d5db5d | ||
|
|
af061125dd | ||
|
|
5c4b1f6638 | ||
|
|
ee3d70f879 | ||
|
|
7dadaa1b28 | ||
|
|
a72782e232 | ||
|
|
8654ffb6fb | ||
|
|
90e445eec9 | ||
|
|
910b6d8879 | ||
|
|
8d1c2f832d | ||
|
|
158d2a4124 | ||
|
|
66473738d6 | ||
|
|
6a43107bb2 | ||
|
|
28e7afa412 | ||
|
|
8dc151e14d | ||
|
|
a330a3f2eb | ||
|
|
8f7195d3b2 | ||
|
|
a4e4502d50 | ||
|
|
902da90100 | ||
|
|
d775760f98 | ||
|
|
dfb6600104 | ||
|
|
41ed487d5e | ||
|
|
d156de05a5 | ||
|
|
f4582ddf36 | ||
|
|
7f7b764f7b | ||
|
|
dd8fdfc3d4 | ||
|
|
6c80d443b9 | ||
|
|
cd05586d51 | ||
|
|
dfc1ec3ccf | ||
|
|
ffe6786ad1 | ||
|
|
6068678fa1 | ||
|
|
50b761fab2 | ||
|
|
0d43f16db2 | ||
|
|
3278de9ba1 | ||
|
|
abe1962002 | ||
|
|
5b15f377cd | ||
|
|
d0e5ea78a5 | ||
|
|
853757e611 | ||
|
|
c3860cfe72 | ||
|
|
90b2c077a6 | ||
|
|
fdce4bada7 | ||
|
|
4c8ff1c7ec | ||
|
|
2a153214f6 | ||
|
|
d7c964afc5 | ||
|
|
5943052cd1 | ||
|
|
8512154b45 | ||
|
|
0e5419c60b | ||
|
|
1d26482298 | ||
|
|
126749f04c | ||
|
|
e0e69ce740 | ||
|
|
72b57924b7 | ||
|
|
fdbdeeb956 | ||
|
|
3dbdecf73d | ||
|
|
7dc8943840 | ||
|
|
646b852717 | ||
|
|
075f754a71 | ||
|
|
f65556acb7 | ||
|
|
b2c01991a6 | ||
|
|
4bc5e81513 | ||
|
|
2b24fe95c2 | ||
|
|
358e64f2cc | ||
|
|
5dc50b6d96 | ||
|
|
b91a040a32 | ||
|
|
76db55ff19 | ||
|
|
e17bf18350 | ||
|
|
43b4499125 | ||
|
|
c6d43a802c | ||
|
|
21f8403357 | ||
|
|
40053e3388 | ||
|
|
abcf7e3a47 | ||
|
|
f8913bf9b9 | ||
|
|
51878ab38e | ||
|
|
d3f9a84a0a | ||
|
|
23eedb468f | ||
|
|
9cb89fff45 | ||
|
|
79f0b22276 | ||
|
|
8b2a728a0d | ||
|
|
b4120b156e | ||
|
|
1ae3122c20 | ||
|
|
727acca217 | ||
|
|
5f8d662d67 | ||
|
|
81b432140c | ||
|
|
adc1ee71a9 | ||
|
|
5ac373d4aa | ||
|
|
5b9e24f3f4 | ||
|
|
0e44de2fe3 | ||
|
|
b0125e8165 | ||
|
|
a532067a93 | ||
|
|
f456071c08 | ||
|
|
3896f0995c | ||
|
|
56ff5808a3 | ||
|
|
15c817dd15 | ||
|
|
7246c3f304 | ||
|
|
e4f59f1ec4 | ||
|
|
5f0e9538cf | ||
|
|
73649128f3 | ||
|
|
edc84731ac | ||
|
|
108b116b06 | ||
|
|
dda587dc6f | ||
|
|
4a9dd43598 | ||
|
|
a64cfe661a | ||
|
|
7e418a16ae | ||
|
|
ecf1fa2bbd | ||
|
|
a6157a34bc | ||
|
|
8e37e66706 | ||
|
|
dd6a4931e5 | ||
|
|
2d000e826b | ||
|
|
c1028e7408 | ||
|
|
28b54fac37 | ||
|
|
845fddf5f2 | ||
|
|
e3e2a477c1 | ||
|
|
bf4442ecf5 | ||
|
|
ab6375ef2a | ||
|
|
2535b6e08c | ||
|
|
2f003d416a | ||
|
|
579b358f8b | ||
|
|
231a583bf7 | ||
|
|
f0cfbacb4f | ||
|
|
ae45189436 | ||
|
|
ff8292b863 | ||
|
|
ebe45f73a0 | ||
|
|
88ce676c46 | ||
|
|
426cc2798e | ||
|
|
1d2df63652 | ||
|
|
d22afa36c3 | ||
|
|
a7296f15ac | ||
|
|
b20caee548 | ||
|
|
519832edd7 | ||
|
|
a2cea1e5bc | ||
|
|
b3c198f0d2 | ||
|
|
b45a696b5d | ||
|
|
a2b3fe6411 | ||
|
|
13d4f37726 | ||
|
|
71f34f4e31 | ||
|
|
018f147de6 | ||
|
|
da012cbf8b | ||
|
|
3907a103fc | ||
|
|
efb566bcc7 | ||
|
|
53e8df3542 | ||
|
|
a00d262773 | ||
|
|
b64db54793 | ||
|
|
97c0e3d4a9 | ||
|
|
ba31bbace8 | ||
|
|
606dfd29d3 | ||
|
|
9411d0781b | ||
|
|
7aea200860 | ||
|
|
5d8ac95d07 | ||
|
|
cd0ebb41aa | ||
|
|
eb028b0dad | ||
|
|
61803f7516 | ||
|
|
50bfed79be | ||
|
|
1c77ae818e | ||
|
|
66ede6037d | ||
|
|
01452b7309 | ||
|
|
b5f2470b79 | ||
|
|
49403e9fee | ||
|
|
66d512f26f | ||
|
|
2ba0ebf3e8 | ||
|
|
bbcd27d3c2 | ||
|
|
837a3528cd | ||
|
|
f39662588f | ||
|
|
4b12f52029 | ||
|
|
f2920ddefb | ||
|
|
ce010653d5 | ||
|
|
ce764c862f | ||
|
|
60d821ae3e | ||
|
|
8f7f8fc0b5 | ||
|
|
ec45041a66 | ||
|
|
67a666b282 | ||
|
|
d9404fc566 | ||
|
|
bcd899c641 | ||
|
|
ec61ac29ea | ||
|
|
180e663a43 | ||
|
|
ae1711a685 | ||
|
|
9c3b62574d | ||
|
|
a3637c12d6 | ||
|
|
cae192682b | ||
|
|
6c68bacaef | ||
|
|
ee7a2b564b | ||
|
|
fb25d90b48 | ||
|
|
9075a521f0 | ||
|
|
00a0e595ff | ||
|
|
694ff32b01 | ||
|
|
a74635ff56 | ||
|
|
8c6f3d66b5 | ||
|
|
a49cb06d77 | ||
|
|
f96f478470 | ||
|
|
1d2f713673 | ||
|
|
57d24d0fbf | ||
|
|
584e55a89c | ||
|
|
4560a83441 | ||
|
|
f4658728e8 | ||
|
|
54825dc66f | ||
|
|
d4056ac10a | ||
|
|
8f409a8fe2 | ||
|
|
d369d988b0 | ||
|
|
2a74736761 | ||
|
|
6bd0bf6e69 | ||
|
|
53cee177e8 | ||
|
|
a8afc62db7 | ||
|
|
14328eb601 | ||
|
|
2184755fdf | ||
|
|
3a3cd1f856 | ||
|
|
24a3a41cd6 | ||
|
|
197f6b05ae | ||
|
|
c2e887a86e | ||
|
|
dc1459438c | ||
|
|
00e6da9d64 | ||
|
|
68b3d75705 | ||
|
|
3e538b732a | ||
|
|
833341dea7 | ||
|
|
bc3efe2f4c | ||
|
|
10e4c59f2e | ||
|
|
d9016b7979 | ||
|
|
d975610ecd | ||
|
|
5d1251f6d8 | ||
|
|
bdf802e64a | ||
|
|
f2b888f9ae | ||
|
|
9583007769 | ||
|
|
eb81c33308 | ||
|
|
8d734f5cc4 | ||
|
|
3375ff6152 | ||
|
|
80fc58f83e | ||
|
|
17c0124747 | ||
|
|
c220d4dd17 | ||
|
|
15146725e3 | ||
|
|
ddfab824c3 | ||
|
|
8b5a00ca27 | ||
|
|
04a7f14c0e | ||
|
|
18f14b828c | ||
|
|
0a92e12a62 | ||
|
|
5b71281ec4 | ||
|
|
08fdc4f1fc | ||
|
|
c726bef740 | ||
|
|
94e0ac3f54 | ||
|
|
284f7fc4f7 | ||
|
|
e629460942 | ||
|
|
904e531113 | ||
|
|
ca2f2adc90 | ||
|
|
78a3e329f5 | ||
|
|
5938e0f821 | ||
|
|
4a6ae3b46c | ||
|
|
2327d661b9 | ||
|
|
9790e37154 | ||
|
|
f97d751343 | ||
|
|
81c1f6bd8e | ||
|
|
e3a5a4239b | ||
|
|
fcec85881f | ||
|
|
cfefb8b2e0 | ||
|
|
e81a2a5011 | ||
|
|
d62b488459 | ||
|
|
932bd92b95 | ||
|
|
9fd1f95ab8 | ||
|
|
cf414cb9cb | ||
|
|
f676d32f96 | ||
|
|
7d88c48c39 | ||
|
|
26337a6bd4 | ||
|
|
1263a5bfc0 | ||
|
|
fe21ca5b95 | ||
|
|
0fe9dad515 | ||
|
|
75b33c906d | ||
|
|
835fa77964 | ||
|
|
3e13186560 | ||
|
|
01f191289d | ||
|
|
6586791655 | ||
|
|
b4f6774ca8 | ||
|
|
75d346fe69 | ||
|
|
27780c7327 | ||
|
|
100a8882f1 | ||
|
|
983bd1a57b | ||
|
|
810f7949f4 | ||
|
|
28c502bd85 | ||
|
|
b8c313965f | ||
|
|
8a2dcbbcff | ||
|
|
263b9fa611 | ||
|
|
793e15f80c | ||
|
|
23d1394fb2 | ||
|
|
f97bb23c9d | ||
|
|
d557739a28 | ||
|
|
8d06243b57 | ||
|
|
9a4b73b942 | ||
|
|
d73e0dd13c | ||
|
|
2f3818fe4b | ||
|
|
d3d773079c | ||
|
|
0b2acec50c | ||
|
|
3501e4f44d | ||
|
|
384c540197 | ||
|
|
1b78ffc018 | ||
|
|
79f4f0adbf | ||
|
|
98d71308a8 | ||
|
|
4f0fa66575 | ||
|
|
ecac3a0f16 | ||
|
|
d1898b9a0b | ||
|
|
868c7b170e | ||
|
|
b1c5c53687 | ||
|
|
6704886c6e | ||
|
|
7e45283ba2 | ||
|
|
ff67d876b2 | ||
|
|
4975a0a8d8 | ||
|
|
e34a4338a1 | ||
|
|
0b4986b47a | ||
|
|
937eab5f27 | ||
|
|
70378bfac8 | ||
|
|
29d87f692a | ||
|
|
b1b2798be1 | ||
|
|
2b74ad8b5f | ||
|
|
3098fa6855 | ||
|
|
53883a7f1f | ||
|
|
2c048376d4 | ||
|
|
b583240d58 | ||
|
|
844be11d43 | ||
|
|
53b739139b | ||
|
|
d09d1d72e6 | ||
|
|
01d927aceb | ||
|
|
59abfcbd6d | ||
|
|
4c2ec15f70 | ||
|
|
2b6dfbf4eb | ||
|
|
eb8372eb91 | ||
|
|
c6b2967da0 | ||
|
|
042f51e58f | ||
|
|
c72cf46db7 | ||
|
|
2a7aac76d9 | ||
|
|
a569495f5d | ||
|
|
59e56600bc | ||
|
|
915dec7ba5 | ||
|
|
909bd3dd2d | ||
|
|
d50fad615f | ||
|
|
b036bedbc3 | ||
|
|
55c05d1a6e | ||
|
|
344c0f6427 | ||
|
|
8ab1a7268b | ||
|
|
e5f31dbe8e | ||
|
|
783c5c12e9 | ||
|
|
c972485555 | ||
|
|
c507382d19 | ||
|
|
fbbcbc8753 | ||
|
|
a5fa595627 | ||
|
|
502045f1fa | ||
|
|
e9280777fd | ||
|
|
c36f402b88 | ||
|
|
3a68dd50ce | ||
|
|
eb06c0da08 | ||
|
|
6528567746 | ||
|
|
09229812f4 | ||
|
|
aaa37a3e0d | ||
|
|
c5531b1bd8 | ||
|
|
021115b463 | ||
|
|
698d9c208f | ||
|
|
01a6b432f3 | ||
|
|
a5f44b3ed6 | ||
|
|
a3ba99c682 | ||
|
|
7c709fddba | ||
|
|
8f313b4603 | ||
|
|
41c0a5ee3b | ||
|
|
346f7aadd6 | ||
|
|
be611c1920 | ||
|
|
e33a866a63 | ||
|
|
c846eeed9d | ||
|
|
d052eac019 | ||
|
|
9dbd134601 | ||
|
|
6451e1cfe2 | ||
|
|
9f3f715527 | ||
|
|
0d8e5b139b | ||
|
|
5d5dda548a | ||
|
|
1d32e5267c | ||
|
|
a300a25419 | ||
|
|
4eaf03b922 | ||
|
|
4401ea388c | ||
|
|
dfe6ad3a32 | ||
|
|
e3ef870b29 | ||
|
|
7deb5bfdf2 | ||
|
|
0e46a4402a | ||
|
|
33a15e69bb | ||
|
|
ebe11fdb1e | ||
|
|
f9a7c46868 | ||
|
|
c80c23e8e8 | ||
|
|
5e6c81a98e | ||
|
|
214cc83d4a | ||
|
|
8e643fbf87 | ||
|
|
6008d9e12b | ||
|
|
81da453ec4 | ||
|
|
f34835463d | ||
|
|
eb3419f3fc | ||
|
|
5886a07300 | ||
|
|
69e7c27fd0 | ||
|
|
165cf6809f | ||
|
|
9b2b8b6796 | ||
|
|
3ed6d1dec1 | ||
|
|
9ad1d1c25d | ||
|
|
667e614bf3 | ||
|
|
d49da1fdd0 | ||
|
|
85b0733169 | ||
|
|
7f2bba7c4a | ||
|
|
664ec62396 | ||
|
|
b4a9e45214 | ||
|
|
2eab7044ba | ||
|
|
8d449f91c6 | ||
|
|
be8a836528 | ||
|
|
423782fd2b | ||
|
|
dc1dc8dffa | ||
|
|
16a77e2975 | ||
|
|
df69a70dd7 | ||
|
|
0638c86211 | ||
|
|
8c0de22c14 | ||
|
|
f83568c6c9 | ||
|
|
10d472728c | ||
|
|
2c3cb3f5ce | ||
|
|
fbfe3fd5ed | ||
|
|
b280a26317 | ||
|
|
640db8af7d | ||
|
|
98d9357208 | ||
|
|
f3b6c7c09b | ||
|
|
3a622f111a | ||
|
|
e0b1ed87e8 | ||
|
|
63578affa4 | ||
|
|
74b188fa46 | ||
|
|
fadaf852b7 | ||
|
|
ac6124951a | ||
|
|
89e42af149 | ||
|
|
cf5987b2b4 | ||
|
|
069d8d376c | ||
|
|
fe3d8ea2be | ||
|
|
3ac03b43e1 | ||
|
|
eaf1a532f4 | ||
|
|
f2b0116c1e | ||
|
|
155b5fa831 | ||
|
|
130c77a305 | ||
|
|
2e168d152f | ||
|
|
635ed02198 | ||
|
|
cd81a54062 | ||
|
|
1035d787ab | ||
|
|
29567df407 | ||
|
|
79cb4668f1 | ||
|
|
9bdc19e2fd | ||
|
|
25cd6106f5 | ||
|
|
13fbe59164 | ||
|
|
c261c3367a | ||
|
|
8b92ab25c7 | ||
|
|
0aa1031270 | ||
|
|
dec8bdb39d | ||
|
|
f318aeb67c | ||
|
|
8b791e77d6 | ||
|
|
260b72fec1 | ||
|
|
7d0beafce0 | ||
|
|
3c2f8b65ce | ||
|
|
5f73e8b3bf | ||
|
|
74afeeb85f | ||
|
|
f8920e5fef | ||
|
|
dd76313084 | ||
|
|
627ff6f26e | ||
|
|
705db0b9cf | ||
|
|
47a958d81d | ||
|
|
906fc9cc1d | ||
|
|
44d9525476 | ||
|
|
8b2a549fab | ||
|
|
7312e34f46 | ||
|
|
696be858f6 | ||
|
|
e1f4fd0c7b | ||
|
|
f51320d1bc | ||
|
|
a0764190f2 | ||
|
|
33c5b35444 | ||
|
|
04e10f81b5 | ||
|
|
7f2545a9ef | ||
|
|
a2a16f3f23 | ||
|
|
ab2a947992 | ||
|
|
7d0a73a6b0 | ||
|
|
e3c3a68566 | ||
|
|
4fc026b13c | ||
|
|
c0fed4d2c3 | ||
|
|
b656e14453 | ||
|
|
fbab3964e6 | ||
|
|
d9b270b477 | ||
|
|
7f53a19647 | ||
|
|
9f1e90d007 | ||
|
|
9a439e1941 | ||
|
|
4e4c69993c | ||
|
|
0d085d500f | ||
|
|
f734c0475b | ||
|
|
a30951dc91 | ||
|
|
c4b37950a9 | ||
|
|
7cf832a2f4 | ||
|
|
1f07e7978d | ||
|
|
5adab2739b | ||
|
|
2be76760de | ||
|
|
28c125a3ec | ||
|
|
bdf8a37a8f | ||
|
|
838711e2ac | ||
|
|
c085691c54 | ||
|
|
47506d70ed | ||
|
|
efc7cc4980 | ||
|
|
f2016a8aa5 | ||
|
|
d6bbc375c4 | ||
|
|
885996c5cf | ||
|
|
4e4604e00a | ||
|
|
b057d4fcb7 | ||
|
|
cdf27296e4 | ||
|
|
889f111300 | ||
|
|
520b4f92ab | ||
|
|
feb1d4ebcc | ||
|
|
c11a7589e2 | ||
|
|
c332b7cb40 | ||
|
|
418dcedc4e | ||
|
|
a21eb9d59e | ||
|
|
25ed8fe044 | ||
|
|
b079c79390 | ||
|
|
d7a89ef122 | ||
|
|
b95035e7a2 | ||
|
|
e28d29f276 | ||
|
|
c29d78ac0d | ||
|
|
ad9106b815 | ||
|
|
f3ea24f9f9 | ||
|
|
96fdece478 | ||
|
|
c30a5782df | ||
|
|
c924fcb91f | ||
|
|
46e7b6d6df | ||
|
|
bb8ecf2f84 | ||
|
|
7123a6d647 | ||
|
|
eb4ef8b3d7 | ||
|
|
0d346610a2 | ||
|
|
fe0c1acd79 | ||
|
|
af35beefc2 | ||
|
|
532258bea8 | ||
|
|
5b257293eb | ||
|
|
8e6d23ddd6 | ||
|
|
6d5d61c842 | ||
|
|
9d2e2a1739 | ||
|
|
19e2642ec1 | ||
|
|
f9df522b41 | ||
|
|
b3e5c4a4aa | ||
|
|
06ed6c81a7 | ||
|
|
d1e4dbb603 | ||
|
|
abe8079296 | ||
|
|
033cb2790c | ||
|
|
188edce258 | ||
|
|
34858b36c1 | ||
|
|
044ef3447c | ||
|
|
2660439160 | ||
|
|
3f6f96cfb4 | ||
|
|
99a1c98ae0 | ||
|
|
fd718dfd5c | ||
|
|
31cb2f1999 | ||
|
|
a6a8e32be7 | ||
|
|
594bb8a76b | ||
|
|
228bbc1e8e | ||
|
|
b14c2878b3 | ||
|
|
57f10040e1 | ||
|
|
0fb67c78a9 | ||
|
|
ff0f7f49da | ||
|
|
9682e37547 | ||
|
|
7197d9480b | ||
|
|
3315c9c7f4 | ||
|
|
f57eff4195 | ||
|
|
f0c8e48403 | ||
|
|
de87bed375 | ||
|
|
5cdfaab2db | ||
|
|
acb0b029b9 | ||
|
|
4c74cbbbe9 | ||
|
|
ad64e068db | ||
|
|
6bed3f3f09 | ||
|
|
d02e55da06 | ||
|
|
d662a8f2b9 | ||
|
|
13a93102a5 | ||
|
|
0d6a1e6610 | ||
|
|
05cd9eebb8 | ||
|
|
d93d8ab1cc | ||
|
|
540fa0e669 | ||
|
|
17a10cf6bb | ||
|
|
11d0f9db03 | ||
|
|
f024ceecdd | ||
|
|
08c07a0785 | ||
|
|
b843f91b3c | ||
|
|
4b2c5b3321 | ||
|
|
2b43f2682a | ||
|
|
7da0124286 | ||
|
|
feaeef6482 | ||
|
|
15bcfeec1d | ||
|
|
5fb002ab4c | ||
|
|
f56ddbb1e0 | ||
|
|
6bd2a7c962 | ||
|
|
9d591ae806 | ||
|
|
7d30e3913c | ||
|
|
19d7dd7aa3 |
105
.cursor/rules/api_usage.mdc
Normal file
@@ -0,0 +1,105 @@
|
||||
---
|
||||
description: For tasks requiring sending Telegram server API requests or working with generated API types.
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
||||
# Telegram Desktop API Usage
|
||||
|
||||
## API Schema
|
||||
|
||||
The API definitions are described using [TL Language]\(https:/core.telegram.org/mtproto/TL) in two main schema files:
|
||||
|
||||
1. **`Telegram/SourceFiles/mtproto/scheme/mtproto.tl`**
|
||||
* Defines the core MTProto protocol types and methods used for basic communication, encryption, authorization, service messages, etc.
|
||||
* Some fundamental types and methods from this schema (like basic types, RPC calls, containers) are often implemented directly in the C++ MTProto core (`SourceFiles/mtproto/`) and may be skipped during the C++ code generation phase.
|
||||
* Other parts of `mtproto.tl` might still be processed by the code generator.
|
||||
|
||||
2. **`Telegram/SourceFiles/mtproto/scheme/api.tl`**
|
||||
* Defines the higher-level Telegram API layer, including all the methods and types related to chat functionality, user profiles, messages, channels, stickers, etc.
|
||||
* This is the primary schema used when making functional API requests within the application.
|
||||
|
||||
Both files use the same TL syntax to describe API methods (functions) and types (constructors).
|
||||
|
||||
## Code Generation
|
||||
|
||||
A custom code generation tool processes `api.tl` (and parts of `mtproto.tl`) to create corresponding C++ classes and types. These generated headers are typically included via the Precompiled Header (PCH) for the main `Telegram` project.
|
||||
|
||||
Generated types often follow the pattern `MTP[Type]` (e.g., `MTPUser`, `MTPMessage`) and methods correspond to functions within the `MTP` namespace or related classes (e.g., `MTPmessages_SendMessage`).
|
||||
|
||||
## Making API Requests
|
||||
|
||||
API requests are made using a standard pattern involving the `api()` object (providing access to the `MTP::Instance`), the generated `MTP...` request object, callback handlers for success (`.done()`) and failure (`.fail()`), and the `.send()` method.
|
||||
|
||||
Here's the general structure:
|
||||
|
||||
```cpp
|
||||
// Include necessary headers if not already in PCH
|
||||
|
||||
// Obtain the API instance (usually via api() or MTP::Instance::Get())
|
||||
api().request(MTPnamespace_MethodName(
|
||||
// Constructor arguments based on the api.tl definition for the method
|
||||
MTP_flags(flags_value), // Use MTP_flags if the method has flags
|
||||
MTP_inputPeer(peer), // Use MTP_... types for parameters
|
||||
MTP_string(messageText),
|
||||
MTP_long(randomId),
|
||||
// ... other arguments matching the TL definition
|
||||
MTP_vector<MTPMessageEntity>() // Example for a vector argument
|
||||
)).done([=]\(const MTPResponseType &result) {
|
||||
// Handle the successful response (result).
|
||||
// 'result' will be of the C++ type corresponding to the TL type
|
||||
// specified after the '=' in the api.tl method definition.
|
||||
// How to access data depends on whether the TL type has one or multiple constructors:
|
||||
|
||||
// 1. Multiple Constructors (e.g., User = User | UserEmpty):
|
||||
// Use .match() with lambdas for each constructor:
|
||||
result.match([&]\(const MTPDuser &data) {
|
||||
/* use data.vfirst_name().v, etc. */
|
||||
}, [&]\(const MTPDuserEmpty &data) {
|
||||
/* handle empty user */
|
||||
});
|
||||
|
||||
// Alternatively, check the type explicitly and use the constructor getter:
|
||||
if (result.type() == mtpc_user) {
|
||||
const auto &data = result.c_user(); // Asserts if type is not mtpc_user!
|
||||
// use data.vfirst_name().v
|
||||
} else if (result.type() == mtpc_userEmpty) {
|
||||
const auto &data = result.c_userEmpty();
|
||||
// handle empty user
|
||||
}
|
||||
|
||||
// 2. Single Constructor (e.g., Messages = messages { msgs: vector<Message> }):
|
||||
// Use .match() with a single lambda:
|
||||
result.match([&]\(const MTPDmessages &data) { /* use data.vmessages().v */ });
|
||||
|
||||
// Or check the type explicitly and use the constructor getter:
|
||||
if (result.type() == mtpc_messages) {
|
||||
const auto &data = result.c_messages(); // Asserts if type is not mtpc_messages!
|
||||
// use data.vmessages().v
|
||||
}
|
||||
|
||||
// Or use the shortcut .data() for single-constructor types:
|
||||
const auto &data = result.data(); // Only works for single-constructor types!
|
||||
// use data.vmessages().v
|
||||
|
||||
}).fail([=]\(const MTP::Error &error) {
|
||||
// Handle the API error (error).
|
||||
// 'error' is an MTP::Error object containing the error code (error.type())
|
||||
// and description (error.description()). Check for specific error strings.
|
||||
if (error.type() == u"FLOOD_WAIT_X"_q) {
|
||||
// Handle flood wait
|
||||
} else {
|
||||
Ui::show(Box<InformBox>(Lang::Hard::ServerError())); // Example generic error handling
|
||||
}
|
||||
}).handleFloodErrors().send(); // handleFloodErrors() is common, then send()
|
||||
```
|
||||
|
||||
**Key Points:**
|
||||
|
||||
* Always refer to `Telegram/SourceFiles/mtproto/scheme/api.tl` for the correct method names, parameters (names and types), and response types.
|
||||
* Use the generated `MTP...` types/classes for request parameters (e.g., `MTP_int`, `MTP_string`, `MTP_bool`, `MTP_vector`, `MTPInputUser`, etc.) and response handling.
|
||||
* The `.done()` lambda receives the specific C++ `MTP...` type corresponding to the TL return type.
|
||||
* For types with **multiple constructors** (e.g., `User = User | UserEmpty`), use `result.match([&]\(const MTPDuser &d){ ... }, [&]\(const MTPDuserEmpty &d){ ... })` to handle each case, or check `result.type() == mtpc_user` / `mtpc_userEmpty` and call the specific `result.c_user()` / `result.c_userEmpty()` getter (which asserts on type mismatch).
|
||||
* For types with a **single constructor** (e.g., `Messages = messages{...}`), you can use `result.match([&]\(const MTPDmessages &d){ ... })` with one lambda, or check `type()` and call `c_messages()`, or use the shortcut `result.data()` to access the fields directly.
|
||||
* The `.fail()` lambda receives an `MTP::Error` object. Check `error.type()` against known error strings (often defined as constants or using `u"..."_q` literals).
|
||||
* Directly construct the `MTPnamespace_MethodName(...)` object inside `request()`.
|
||||
* Include `.handleFloodErrors()` before `.send()` for standard flood wait handling.
|
||||
164
.cursor/rules/localization.mdc
Normal file
@@ -0,0 +1,164 @@
|
||||
---
|
||||
description: For tasks requiring changing or adding user facing phrases and text parts.
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
||||
# Telegram Desktop Localization
|
||||
|
||||
## Coding Style Note
|
||||
|
||||
**Use `auto`:** In the actual codebase, variable types are almost always deduced using `auto` (or `const auto`, `const auto &`) rather than being written out explicitly. Examples in this guide may use explicit types for clarity, but prefer `auto` in practice.
|
||||
|
||||
```cpp
|
||||
// Prefer this:
|
||||
auto currentTitle = tr::lng_settings_title(tr::now);
|
||||
auto nameProducer = GetNameProducer(); // Returns rpl::producer<...>
|
||||
|
||||
// Instead of this:
|
||||
QString currentTitle = tr::lng_settings_title(tr::now);
|
||||
rpl::producer<QString> nameProducer = GetNameProducer();
|
||||
```
|
||||
|
||||
## String Resource File
|
||||
|
||||
Base user-facing English strings are defined in the `lang.strings` file:
|
||||
|
||||
`Telegram/Resources/langs/lang.strings`
|
||||
|
||||
This file uses a key-value format with named placeholders:
|
||||
|
||||
```
|
||||
"lng_settings_title" = "Settings";
|
||||
"lng_confirm_delete_item" = "Are you sure you want to delete {item_name}?";
|
||||
"lng_files_selected" = "{count} files selected"; // Simple count example (see Pluralization)
|
||||
```
|
||||
|
||||
Placeholders are enclosed in curly braces, e.g., `{name}`, `{user}`. A special placeholder `{count}` is used for pluralization rules.
|
||||
|
||||
### Pluralization
|
||||
|
||||
For keys that depend on a number (using the `{count}` placeholder), English typically requires two forms: singular and plural. These are defined in `lang.strings` using `#one` and `#other` suffixes:
|
||||
|
||||
```
|
||||
"lng_files_selected#one" = "{count} file selected";
|
||||
"lng_files_selected#other" = "{count} files selected";
|
||||
```
|
||||
|
||||
While only `#one` and `#other` are defined in the base `lang.strings`, the code generation process creates C++ accessors for all six CLDR plural categories (`#zero`, `#one`, `#two`, `#few`, `#many`, `#other`) to support languages with more complex pluralization rules.
|
||||
|
||||
## Translation Process
|
||||
|
||||
While `lang.strings` provides the base English text and the keys, the actual translations are managed via Telegram's translations platform (translations.telegram.org) and loaded dynamically at runtime from the API. The keys from `lang.strings` (including the `#one`/`#other` variants) are used on the platform.
|
||||
|
||||
## Code Generation
|
||||
|
||||
A code generation tool processes `lang.strings` to create C++ structures and accessors within the `tr` namespace. These allow type-safe access to strings and handling of placeholders and pluralization. Generated keys typically follow the pattern `tr::lng_key_name`.
|
||||
|
||||
## String Usage in Code
|
||||
|
||||
Strings are accessed in C++ code using the generated objects within the `tr::` namespace. There are two main ways to use them: reactively (returning an `rpl::producer`) or immediately (returning the current value).
|
||||
|
||||
### 1. Reactive Usage (rpl::producer)
|
||||
|
||||
Calling a generated string function directly returns a reactive producer, typically `rpl::producer<QString>`. This producer automatically updates its value whenever the application language changes.
|
||||
|
||||
```cpp
|
||||
// Key: "settings_title" = "Settings";
|
||||
auto titleProducer = tr::lng_settings_title(); // Type: rpl::producer<QString>
|
||||
|
||||
// Key: "confirm_delete_item" = "Are you sure you want to delete {item_name}?";
|
||||
auto itemNameProducer = /* ... */; // Type: rpl::producer<QString>
|
||||
auto confirmationProducer = tr::lng_confirm_delete_item( // Type: rpl::producer<QString>
|
||||
tr::now, // NOTE: tr::now is NOT passed here for reactive result
|
||||
lt_item_name,
|
||||
std::move(itemNameProducer)); // Placeholder producers should be moved
|
||||
```
|
||||
|
||||
### 2. Immediate Usage (Current Value)
|
||||
|
||||
Passing `tr::now` as the first argument retrieves the string's current value in the active language (typically as a `QString`).
|
||||
|
||||
```cpp
|
||||
// Key: "settings_title" = "Settings";
|
||||
auto currentTitle = tr::lng_settings_title(tr::now); // Type: QString
|
||||
|
||||
// Key: "confirm_delete_item" = "Are you sure you want to delete {item_name}?";
|
||||
const auto currentItemName = QString("My Document"); // Type: QString
|
||||
auto currentConfirmation = tr::lng_confirm_delete_item( // Type: QString
|
||||
tr::now, // Pass tr::now for immediate value
|
||||
lt_item_name, currentItemName); // Placeholder value is a direct QString (or convertible)
|
||||
```
|
||||
|
||||
### 3. Placeholders (`{tag}`)
|
||||
|
||||
Placeholders like `{item_name}` are replaced by providing arguments after `tr::now` (for immediate) or as the initial arguments (for reactive). A corresponding `lt_tag_name` constant is passed before the value.
|
||||
|
||||
* **Immediate:** Pass the direct value (e.g., `QString`, `int`).
|
||||
* **Reactive:** Pass an `rpl::producer` of the corresponding type (e.g., `rpl::producer<QString>`). Remember to `std::move` the producer or use `rpl::duplicate` if you need to reuse the original producer afterwards.
|
||||
|
||||
### 4. Pluralization (`{count}`)
|
||||
|
||||
Keys using `{count}` require a numeric value for the `lt_count` placeholder. The correct plural form (`#zero`, `#one`, ..., `#other`) is automatically selected based on this value and the current language rules.
|
||||
|
||||
* **Immediate (`tr::now`):** Pass a `float64` or `int` (which is auto-converted to `float64`).
|
||||
```cpp
|
||||
int count = 1;
|
||||
auto filesText = tr::lng_files_selected(tr::now, lt_count, count); // Type: QString
|
||||
count = 5;
|
||||
filesText = tr::lng_files_selected(tr::now, lt_count, count); // Uses "files_selected#other"
|
||||
```
|
||||
|
||||
* **Reactive:** Pass an `rpl::producer<float64>`. Use the `tr::to_count()` helper to convert an `rpl::producer<int>` or wrap a single value.
|
||||
```cpp
|
||||
// From an existing int producer:
|
||||
auto countProducer = /* ... */; // Type: rpl::producer<int>
|
||||
auto filesTextProducer = tr::lng_files_selected( // Type: rpl::producer<QString>
|
||||
lt_count,
|
||||
countProducer | tr::to_count()); // Use tr::to_count() for conversion
|
||||
|
||||
// From a single int value wrapped reactively:
|
||||
int currentCount = 5;
|
||||
auto filesTextProducerSingle = tr::lng_files_selected( // Type: rpl::producer<QString>
|
||||
lt_count,
|
||||
rpl::single(currentCount) | tr::to_count());
|
||||
// Alternative for single values (less common): rpl::single(currentCount * 1.)
|
||||
```
|
||||
|
||||
### 5. Custom Projectors
|
||||
|
||||
An optional final argument can be a projector function (like `Ui::Text::Upper` or `Ui::Text::WithEntities`) to transform the output.
|
||||
|
||||
* If the projector returns `OutputType`, the string function returns `OutputType` (immediate) or `rpl::producer<OutputType>` (reactive).
|
||||
* Placeholder values must match the projector's *input* requirements. For `Ui::Text::WithEntities`, placeholders expect `TextWithEntities` (immediate) or `rpl::producer<TextWithEntities>` (reactive).
|
||||
|
||||
```cpp
|
||||
// Immediate with Ui::Text::WithEntities projector
|
||||
// Key: "user_posted_photo" = "{user} posted a photo";
|
||||
const auto userName = TextWithEntities{ /* ... */ }; // Type: TextWithEntities
|
||||
auto message = tr::lng_user_posted_photo( // Type: TextWithEntities
|
||||
tr::now,
|
||||
lt_user,
|
||||
userName, // Must be TextWithEntities
|
||||
Ui::Text::WithEntities); // Projector
|
||||
|
||||
// Reactive with Ui::Text::WithEntities projector
|
||||
auto userNameProducer = /* ... */; // Type: rpl::producer<TextWithEntities>
|
||||
auto messageProducer = tr::lng_user_posted_photo( // Type: rpl::producer<TextWithEntities>
|
||||
lt_user,
|
||||
std::move(userNameProducer), // Move placeholder producers
|
||||
Ui::Text::WithEntities); // Projector
|
||||
```
|
||||
|
||||
## Key Summary
|
||||
|
||||
* Keys are defined in `Resources/langs/lang.strings` using `{tag}` placeholders.
|
||||
* Plural keys use `{count}` and have `#one`/`#other` variants in `lang.strings`.
|
||||
* Access keys via `tr::lng_key_name(...)` in C++.
|
||||
* Call with `tr::now` as the first argument for the immediate `QString` (or projected type).
|
||||
* Call without `tr::now` for the reactive `rpl::producer<QString>` (or projected type).
|
||||
* Provide placeholder values (`lt_tag_name, value`) matching the usage (direct value for immediate, `rpl::producer` for reactive). Producers should typically be moved via `std::move`.
|
||||
* For `{count}`:
|
||||
* Immediate: Pass `int` or `float64`.
|
||||
* Reactive: Pass `rpl::producer<float64>`, typically by converting an `int` producer using `| tr::to_count()`.
|
||||
* Optional projector function as the last argument modifies the output type and required placeholder types.
|
||||
* Actual translations are loaded at runtime from the API.
|
||||
216
.cursor/rules/rpl_guide.mdc
Normal file
@@ -0,0 +1,216 @@
|
||||
---
|
||||
description:
|
||||
globs:
|
||||
alwaysApply: true
|
||||
---
|
||||
# RPL (Reactive Programming Library) Guide
|
||||
|
||||
## Coding Style Note
|
||||
|
||||
**Use `auto`:** In the actual codebase, variable types are almost always deduced using `auto` (or `const auto`, `const auto &`) rather than being written out explicitly. Examples in this guide may use explicit types for clarity, but prefer `auto` in practice.
|
||||
|
||||
```cpp
|
||||
// Prefer this:
|
||||
auto intProducer = rpl::single(123);
|
||||
const auto &lifetime = existingLifetime;
|
||||
|
||||
// Instead of this:
|
||||
rpl::producer<int> intProducer = rpl::single(123);
|
||||
const rpl::lifetime &lifetime = existingLifetime;
|
||||
|
||||
// Sometimes needed if deduction is ambiguous or needs help:
|
||||
auto user = std::make_shared<UserData>();
|
||||
auto data = QByteArray::fromHex("...");
|
||||
```
|
||||
|
||||
## Introduction
|
||||
|
||||
RPL is the reactive programming library used in this project, residing in the `rpl::` namespace. It allows handling asynchronous streams of data over time.
|
||||
|
||||
The core concept is the `rpl::producer`, which represents a stream of values that can be generated over a certain lifetime.
|
||||
|
||||
## Producers: `rpl::producer<Type, Error = no_error>`
|
||||
|
||||
The fundamental building block is `rpl::producer<Type, Error>`. It produces values of `Type` and can optionally signal an error of type `Error`. By default, `Error` is `rpl::no_error`, indicating that the producer does not explicitly handle error signaling through this mechanism.
|
||||
|
||||
```cpp
|
||||
// A producer that emits integers.
|
||||
auto intProducer = /* ... */; // Type: rpl::producer<int>
|
||||
|
||||
// A producer that emits strings and can potentially emit a CustomError.
|
||||
auto stringProducerWithError = /* ... */; // Type: rpl::producer<QString, CustomError>
|
||||
```
|
||||
|
||||
Producers are typically lazy; they don't start emitting values until someone subscribes to them.
|
||||
|
||||
## Lifetime Management: `rpl::lifetime`
|
||||
|
||||
Reactive pipelines have a limited duration, managed by `rpl::lifetime`. An `rpl::lifetime` object essentially holds a collection of cleanup callbacks. When the lifetime ends (either explicitly destroyed or goes out of scope), these callbacks are executed, tearing down the associated pipeline and freeing resources.
|
||||
|
||||
```cpp
|
||||
rpl::lifetime myLifetime;
|
||||
// ... later ...
|
||||
// myLifetime is destroyed, cleanup happens.
|
||||
|
||||
// Or, pass a lifetime instance to manage a pipeline's duration.
|
||||
rpl::lifetime &parentLifetime = /* ... get lifetime from context ... */;
|
||||
```
|
||||
|
||||
## Starting a Pipeline: `rpl::start_...`
|
||||
|
||||
To consume values from a producer, you start a pipeline using one of the `rpl::start_...` methods. These methods subscribe to the producer and execute callbacks for the events they handle.
|
||||
|
||||
The most common method is `rpl::start_with_next`:
|
||||
|
||||
```cpp
|
||||
auto counter = /* ... */; // Type: rpl::producer<int>
|
||||
rpl::lifetime lifetime;
|
||||
|
||||
// Counter is consumed here, use std::move if it's an l-value.
|
||||
std::move(
|
||||
counter
|
||||
) | rpl::start_with_next([=]\(int nextValue) {
|
||||
// Process the next integer value emitted by the producer.
|
||||
qDebug() << "Received: " << nextValue;
|
||||
}, lifetime); // Pass the lifetime to manage the subscription.
|
||||
// Note: `counter` is now in a moved-from state and likely invalid.
|
||||
|
||||
// If you need to start the same producer multiple times, duplicate it:
|
||||
// rpl::duplicate(counter) | rpl::start_with_next(...);
|
||||
|
||||
// If you DON'T pass a lifetime to a start_... method:
|
||||
auto counter2 = /* ... */; // Type: rpl::producer<int>
|
||||
rpl::lifetime subscriptionLifetime = std::move(
|
||||
counter2
|
||||
) | rpl::start_with_next([=]\(int nextValue) { /* ... */ });
|
||||
// The returned lifetime MUST be stored. If it's discarded immediately,
|
||||
// the subscription stops instantly.
|
||||
// `counter2` is also moved-from here.
|
||||
```
|
||||
|
||||
Other variants allow handling errors (`_error`) and completion (`_done`):
|
||||
|
||||
```cpp
|
||||
auto dataStream = /* ... */; // Type: rpl::producer<QString, Error>
|
||||
rpl::lifetime lifetime;
|
||||
|
||||
// Assuming dataStream might be used again, we duplicate it for the first start.
|
||||
// If it's the only use, std::move(dataStream) would be preferred.
|
||||
rpl::duplicate(
|
||||
dataStream
|
||||
) | rpl::start_with_error([=]\(Error &&error) {
|
||||
// Handle the error signaled by the producer.
|
||||
qDebug() << "Error: " << error.text();
|
||||
}, lifetime);
|
||||
|
||||
// Using dataStream again, perhaps duplicated again or moved if last use.
|
||||
rpl::duplicate(
|
||||
dataStream
|
||||
) | rpl::start_with_done([=] {
|
||||
// Execute when the producer signals it's finished emitting values.
|
||||
qDebug() << "Stream finished.";
|
||||
}, lifetime);
|
||||
|
||||
// Last use of dataStream, so we move it.
|
||||
std::move(
|
||||
dataStream
|
||||
) | rpl::start_with_next_error_done(
|
||||
[=]\(QString &&value) { /* handle next value */ },
|
||||
[=]\(Error &&error) { /* handle error */ },
|
||||
[=] { /* handle done */ },
|
||||
lifetime);
|
||||
```
|
||||
|
||||
## Transforming Producers
|
||||
|
||||
RPL provides functions to create new producers by transforming existing ones:
|
||||
|
||||
* `rpl::map`: Transforms each value emitted by a producer.
|
||||
```cpp
|
||||
auto ints = /* ... */; // Type: rpl::producer<int>
|
||||
// The pipe operator often handles the move implicitly for chained transformations.
|
||||
auto strings = std::move(
|
||||
ints // Explicit move is safer
|
||||
) | rpl::map([](int value) {
|
||||
return QString::number(value * 2);
|
||||
}); // Emits strings like "0", "2", "4", ...
|
||||
```
|
||||
|
||||
* `rpl::filter`: Emits only the values from a producer that satisfy a condition.
|
||||
```cpp
|
||||
auto ints = /* ... */; // Type: rpl::producer<int>
|
||||
auto evenInts = std::move(
|
||||
ints // Explicit move is safer
|
||||
) | rpl::filter([](int value) {
|
||||
return (value % 2 == 0);
|
||||
}); // Emits only even numbers.
|
||||
```
|
||||
|
||||
## Combining Producers
|
||||
|
||||
You can combine multiple producers into one:
|
||||
|
||||
* `rpl::combine`: Combines the latest values from multiple producers whenever *any* of them emits a new value. Requires all producers to have emitted at least one value initially.
|
||||
While it produces a `std::tuple`, subsequent operators like `map`, `filter`, and `start_with_next` can automatically unpack this tuple into separate lambda arguments.
|
||||
```cpp
|
||||
auto countProducer = rpl::single(1); // Type: rpl::producer<int>
|
||||
auto textProducer = rpl::single(u"hello"_q); // Type: rpl::producer<QString>
|
||||
rpl::lifetime lifetime;
|
||||
|
||||
// rpl::combine takes producers by const-ref internally and duplicates,
|
||||
// so move/duplicate is usually not strictly needed here unless you
|
||||
// want to signal intent or manage the lifetime of p1/p2 explicitly.
|
||||
auto combined = rpl::combine(
|
||||
countProducer, // or rpl::duplicate(countProducer)
|
||||
textProducer // or rpl::duplicate(textProducer)
|
||||
);
|
||||
|
||||
// Starting the combined producer consumes it.
|
||||
// The lambda receives unpacked arguments, not the tuple itself.
|
||||
std::move(
|
||||
combined
|
||||
) | rpl::start_with_next([=]\(int count, const QString &text) {
|
||||
// No need for std::get<0>(latest), etc.
|
||||
qDebug() << "Combined: Count=" << count << ", Text=" << text;
|
||||
}, lifetime);
|
||||
|
||||
// This also works with map, filter, etc.
|
||||
std::move(
|
||||
combined
|
||||
) | rpl::filter([=]\(int count, const QString &text) {
|
||||
return count > 0 && !text.isEmpty();
|
||||
}) | rpl::map([=]\(int count, const QString &text) {
|
||||
return text.repeated(count);
|
||||
}) | rpl::start_with_next([=]\(const QString &result) {
|
||||
qDebug() << "Mapped & Filtered: " << result;
|
||||
}, lifetime);
|
||||
```
|
||||
|
||||
* `rpl::merge`: Merges the output of multiple producers of the *same type* into a single producer. It emits a value whenever *any* of the source producers emits a value.
|
||||
```cpp
|
||||
auto sourceA = /* ... */; // Type: rpl::producer<QString>
|
||||
auto sourceB = /* ... */; // Type: rpl::producer<QString>
|
||||
|
||||
// rpl::merge also duplicates internally.
|
||||
auto merged = rpl::merge(sourceA, sourceB);
|
||||
|
||||
// Starting the merged producer consumes it.
|
||||
std::move(
|
||||
merged
|
||||
) | rpl::start_with_next([=]\(QString &&value) {
|
||||
// Receives values from either sourceA or sourceB as they arrive.
|
||||
qDebug() << "Merged value: " << value;
|
||||
}, lifetime);
|
||||
```
|
||||
|
||||
## Key Concepts Summary
|
||||
|
||||
* Use `rpl::producer<Type, Error>` to represent streams of values.
|
||||
* Manage subscription duration using `rpl::lifetime`.
|
||||
* Pass `rpl::lifetime` to `rpl::start_...` methods.
|
||||
* If `rpl::lifetime` is not passed, **store the returned lifetime** to keep the subscription active.
|
||||
* Use operators like `| rpl::map`, `| rpl::filter` to transform streams.
|
||||
* Use `rpl::combine` or `rpl::merge` to combine streams.
|
||||
* When starting a chain (`std::move(producer) | rpl::map(...)`), explicitly move the initial producer.
|
||||
* These functions typically duplicate their input producers internally.
|
||||
* Starting a pipeline consumes the producer; use `
|
||||
154
.cursor/rules/styling.mdc
Normal file
@@ -0,0 +1,154 @@
|
||||
---
|
||||
description: For tasks requiring working with user facing UI components.
|
||||
globs:
|
||||
alwaysApply: false
|
||||
---
|
||||
# Telegram Desktop UI Styling
|
||||
|
||||
## Style Definition Files
|
||||
|
||||
UI element styles (colors, fonts, paddings, margins, icons, etc.) are defined in `.style` files using a custom syntax. These files are located alongside the C++ source files they correspond to within specific UI component directories (e.g., `Telegram/SourceFiles/ui/chat/chat.style`).
|
||||
|
||||
Definitions from other `.style` files can be included using the `using` directive at the top of the file:
|
||||
```style
|
||||
using "ui/basic.style";
|
||||
using "ui/widgets/widgets.style";
|
||||
```
|
||||
|
||||
The central definition of named colors happens in `Telegram/SourceFiles/ui/colors.palette`. This file allows for theme generation and loading colors from various sources.
|
||||
|
||||
### Syntax Overview
|
||||
|
||||
1. **Built-in Types:** The syntax recognizes several base types inferred from the value assigned:
|
||||
* `int`: Integer numbers (e.g., `lineHeight: 20;`)
|
||||
* `bool`: Boolean values (e.g., `useShadow: true;`)
|
||||
* `pixels`: Pixel values, ending with `px` (e.g., `borderWidth: 1px;`). Generated as `int` in C++.
|
||||
* `color`: Named colors defined in `colors.palette` (e.g., `background: windowBg;`)
|
||||
* `icon`: Defined inline using a specific syntax (see below). Generates `style::icon`.
|
||||
* `margins`: Four pixel values for margins or padding. Requires `margins(top, right, bottom, left)` syntax (e.g., `margin: margins(10px, 5px, 10px, 5px);` or `padding: margins(8px, 8px, 8px, 8px);`). Generates `style::margins` (an alias for `QMargins`).
|
||||
* `size`: Two pixel values for width and height (e.g., `iconSize: size(16px, 16px);`). Generates `style::size`.
|
||||
* `point`: Two pixel values for x and y coordinates (e.g., `textPos: point(5px, 2px);`). Generates `style::point`.
|
||||
* `align`: Alignment keywords (e.g., `textAlign: align(center);` or `iconAlign: align(left);`). Generates `style::align`.
|
||||
* `font`: Font definitions (e.g., `font: font(14px semibold);`). Generates `style::font`.
|
||||
* `double`: Floating point numbers (e.g., `disabledOpacity: 0.5;`)
|
||||
|
||||
*Note on Borders:* Borders are typically defined using multiple fields like `border: pixels;` (for width) and `borderFg: color;` (for color), rather than a single CSS-like property.
|
||||
|
||||
2. **Structure Definition:** You can define complex data structures directly within the `.style` file:
|
||||
```style
|
||||
MyButtonStyle { // Defines a structure named 'MyButtonStyle'
|
||||
textPadding: margins; // Field 'textPadding' expects margins type
|
||||
icon: icon; // Field 'icon' of type icon
|
||||
height: pixels; // Field 'height' of type pixels
|
||||
}
|
||||
```
|
||||
This generates a `struct MyButtonStyle { ... };` inside the `namespace style`. Fields will have corresponding C++ types (`style::margins`, `style::icon`, `int`).
|
||||
|
||||
3. **Variable Definition & Inheritance:** Variables are defined using `name: value;` or `groupName { ... }`. They can be of built-in types or custom structures. Structures can be initialized inline or inherit from existing variables.
|
||||
|
||||
**Icon Definition Syntax:** Icons are defined inline using the `icon{...}` syntax. The generator probes for `.svg` files or `.png` files (including `@2x`, `@3x` variants) based on the provided path stem.
|
||||
```style
|
||||
// Single-part icon definition:
|
||||
myIconSearch: icon{{ "gui/icons/search", iconColor }};
|
||||
// Multi-part icon definition (layers drawn bottom-up):
|
||||
myComplexIcon: icon{
|
||||
{ "gui/icons/background", iconBgColor },
|
||||
{ "gui/icons/foreground", iconFgColor }
|
||||
};
|
||||
// Icon with path modifiers (PNG only for flips, SVG only for size):
|
||||
myFlippedIcon: icon{{ "gui/icons/arrow-flip_horizontal", arrowColor }};
|
||||
myResizedIcon: icon{{ "gui/icons/logo-128x128", logoColor }}; // Forces 128x128 for SVG
|
||||
```
|
||||
|
||||
**Other Variable Examples:**
|
||||
```style
|
||||
// Simple variables
|
||||
buttonHeight: 30px;
|
||||
activeButtonColor: buttonBgActive; // Named color from colors.palette
|
||||
|
||||
// Variable of a custom structure type, initialized inline
|
||||
defaultButton: MyButtonStyle {
|
||||
textPadding: margins(10px, 15px, 10px, 15px); // Use margins(...) syntax
|
||||
icon: myIconSearch; // Assign the previously defined icon variable
|
||||
height: buttonHeight; // Reference another variable
|
||||
}
|
||||
|
||||
// Another variable inheriting from 'defaultButton' and overriding/adding fields
|
||||
primaryButton: MyButtonStyle(defaultButton) {
|
||||
icon: myComplexIcon; // Override icon with the multi-part one
|
||||
backgroundColor: activeButtonColor; // Add a field not in MyButtonStyle definition
|
||||
}
|
||||
|
||||
// Style group (often used for specific UI elements)
|
||||
chatInput { // Example using separate border properties and explicit padding
|
||||
border: 1px; // Border width
|
||||
borderFg: defaultInputFieldBorder; // Border color (named color)
|
||||
padding: margins(5px, 10px, 5px, 10px); // Use margins(...) syntax for padding field
|
||||
backgroundColor: defaultChatBg; // Background color
|
||||
}
|
||||
```
|
||||
|
||||
## Code Generation
|
||||
|
||||
A code generation tool processes these `.style` files and `colors.palette` to create C++ objects.
|
||||
- The `using` directives resolve dependencies between `.style` files.
|
||||
- Custom structure definitions (like `MyButtonStyle`) generate corresponding `struct MyButtonStyle { ... };` within the `namespace style`.
|
||||
- Style variables/groups (like `defaultButton`, `primaryButton`, `chatInput`) are generated as objects/structs within the `st` namespace (e.g., `st::defaultButton`, `st::primaryButton`, `st::chatInput`). These generated structs contain members corresponding to the fields defined in the `.style` file.
|
||||
- Color objects are generated into the `st` namespace as well, based on their names in `colors.palette` (e.g., `st::windowBg`, `st::buttonBgActive`).
|
||||
- The generated header files for styles are placed in the `Telegram/SourceFiles/styles/` directory with a `style_` prefix (e.g., `styles/style_widgets.h` for `ui/widgets/widgets.style`). You include them like `#include "styles/style_widgets.h"`.
|
||||
|
||||
Generated C++ types correspond to the `.style` types: `style::color`, `style::font`, `style::margins` (used for both `margin:` and `padding:` fields), `style::icon`, `style::size`, `style::point`, `style::align`, and `int` or `bool` for simple types.
|
||||
|
||||
## Style Usage in Code
|
||||
|
||||
Styles are applied in C++ code by referencing the generated `st::...` objects and their members.
|
||||
|
||||
```cpp
|
||||
// Example: Including the generated style header
|
||||
#include "styles/style_widgets.h" // For styles defined in ui/widgets/widgets.style
|
||||
|
||||
// ... inside some UI class code ...
|
||||
|
||||
// Accessing members of a generated style struct
|
||||
int height = st::primaryButton.height; // Accessing the 'height' field (pixels -> int)
|
||||
const style::icon &icon = st::primaryButton.icon; // Accessing the 'icon' field (st::myComplexIcon)
|
||||
style::margins padding = st::primaryButton.textPadding; // Accessing 'textPadding'
|
||||
style::color bgColor = st::primaryButton.backgroundColor; // Accessing the color (st::activeButtonColor)
|
||||
|
||||
// Applying styles (conceptual examples)
|
||||
myButton->setIcon(st::primaryButton.icon);
|
||||
myButton->setHeight(st::primaryButton.height);
|
||||
myButton->setPadding(st::primaryButton.textPadding);
|
||||
myButton->setBackgroundColor(st::primaryButton.backgroundColor);
|
||||
|
||||
// Using styles directly in painting
|
||||
void MyWidget::paintEvent(QPaintEvent *e) {
|
||||
Painter p(this);
|
||||
p.fillRect(rect(), st::chatInput.backgroundColor); // Use color from chatInput style
|
||||
|
||||
// Border painting requires width and color
|
||||
int borderWidth = st::chatInput.border; // Access border width (pixels -> int)
|
||||
style::color borderColor = st::chatInput.borderFg; // Access border color
|
||||
if (borderWidth > 0) {
|
||||
p.setPen(QPen(borderColor, borderWidth));
|
||||
// Adjust rect for pen width if needed before drawing
|
||||
p.drawRect(rect().adjusted(borderWidth / 2, borderWidth / 2, -borderWidth / 2, -borderWidth / 2));
|
||||
}
|
||||
|
||||
// Access padding (style::margins)
|
||||
style::margins inputPadding = st::chatInput.padding;
|
||||
// ... use inputPadding.top(), inputPadding.left() etc. for content layout ...
|
||||
}
|
||||
```
|
||||
|
||||
**Key Points:**
|
||||
|
||||
* Styles are defined in `.style` files next to their corresponding C++ source files.
|
||||
* `using "path/to/other.style";` includes definitions from other style files.
|
||||
* Named colors are defined centrally in `ui/colors.palette`.
|
||||
* `.style` syntax supports built-in types (like `pixels`, `color`, `margins`, `point`, `size`, `align`, `font`, `double`), custom structure definitions (`Name { field: type; ... }`), variable definitions (`name: value;`), and inheritance (`child: Name(parent) { ... }`).
|
||||
* Values must match the expected type (e.g., fields declared as `margins` type, like `margin:` or `padding:`, require `margins(...)` syntax). Borders are typically set via separate `border: pixels;` and `borderFg: color;` fields.
|
||||
* Icons are defined inline using `name: icon{{ "path_stem", color }};` or `name: icon{ { "path1", c1 }, ... };` syntax, with optional path modifiers.
|
||||
* Code generation creates `struct` definitions in the `style` namespace for custom types and objects/structs in the `st` namespace for defined variables/groups.
|
||||
* Generated headers are in `styles/` with a `style_` prefix and must be included.
|
||||
* Access style properties via the generated `st::` objects (e.g., `st::primaryButton.height`, `st::chatInput.backgroundColor`).
|
||||
2
.cursorignore
Normal file
@@ -0,0 +1,2 @@
|
||||
# Add directories or file patterns to ignore during indexing (e.g. foo/ or *.csv)
|
||||
Telegram/ThirdParty/
|
||||
@@ -5,11 +5,9 @@
|
||||
"vscode": {
|
||||
"settings": {
|
||||
"C_Cpp.intelliSenseEngine": "disabled",
|
||||
"clangd.arguments": [
|
||||
"--compile-commands-dir=${workspaceFolder}/out"
|
||||
],
|
||||
"cmake.generator": "Ninja Multi-Config",
|
||||
"cmake.buildDirectory": "${workspaceFolder}/out"
|
||||
"cmake.buildDirectory": "${workspaceFolder}/out",
|
||||
"cmake.copyCompileCommands": "${workspaceFolder}/compile_commands.json"
|
||||
},
|
||||
"extensions": [
|
||||
"ms-vscode.cpptools-extension-pack",
|
||||
|
||||
8
.github/workflows/docker.yml
vendored
@@ -5,15 +5,12 @@ on:
|
||||
paths:
|
||||
- '.github/workflows/docker.yml'
|
||||
- 'Telegram/build/docker/centos_env/**'
|
||||
pull_request:
|
||||
paths:
|
||||
- '.github/workflows/docker.yml'
|
||||
- 'Telegram/build/docker/centos_env/**'
|
||||
|
||||
jobs:
|
||||
docker:
|
||||
name: Ubuntu
|
||||
runs-on: ubuntu-latest
|
||||
if: github.ref_name == github.event.repository.default_branch
|
||||
|
||||
env:
|
||||
IMAGE_TAG: ghcr.io/${{ github.repository }}/centos_env:latest
|
||||
@@ -32,6 +29,8 @@ jobs:
|
||||
|
||||
- name: Free up some disk space.
|
||||
uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be
|
||||
with:
|
||||
tool-cache: true
|
||||
|
||||
- name: Docker image build.
|
||||
run: |
|
||||
@@ -40,5 +39,4 @@ jobs:
|
||||
DEBUG= LTO= poetry run gen_dockerfile | DOCKER_BUILDKIT=1 docker build -t $IMAGE_TAG -
|
||||
|
||||
- name: Push the Docker image.
|
||||
if: ${{ github.ref_name == github.event.repository.default_branch }}
|
||||
run: docker push $IMAGE_TAG
|
||||
|
||||
67
.github/workflows/linux.yml
vendored
@@ -12,6 +12,7 @@ on:
|
||||
- '!.github/workflows/linux.yml'
|
||||
- 'snap/**'
|
||||
- 'Telegram/build/**'
|
||||
- '!Telegram/build/docker/centos_env/**'
|
||||
- 'Telegram/Resources/uwp/**'
|
||||
- 'Telegram/Resources/winrc/**'
|
||||
- 'Telegram/SourceFiles/platform/win/**'
|
||||
@@ -30,6 +31,7 @@ on:
|
||||
- '!.github/workflows/linux.yml'
|
||||
- 'snap/**'
|
||||
- 'Telegram/build/**'
|
||||
- '!Telegram/build/docker/centos_env/**'
|
||||
- 'Telegram/Resources/uwp/**'
|
||||
- 'Telegram/Resources/winrc/**'
|
||||
- 'Telegram/SourceFiles/platform/win/**'
|
||||
@@ -52,27 +54,56 @@ jobs:
|
||||
|
||||
env:
|
||||
UPLOAD_ARTIFACT: "true"
|
||||
ONLY_CACHE: "false"
|
||||
IMAGE_TAG: tdesktop:centos_env
|
||||
|
||||
steps:
|
||||
- name: Get repository name.
|
||||
run: echo "REPO_NAME=${GITHUB_REPOSITORY##*/}" >> $GITHUB_ENV
|
||||
|
||||
- name: Clone.
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
path: ${{ env.REPO_NAME }}
|
||||
|
||||
- name: First set up.
|
||||
run: |
|
||||
echo "${{ secrets.GITHUB_TOKEN }}" | docker login ghcr.io -u $ --password-stdin
|
||||
docker pull ghcr.io/$GITHUB_REPOSITORY/centos_env
|
||||
docker tag ghcr.io/$GITHUB_REPOSITORY/centos_env tdesktop:centos_env
|
||||
sudo apt update
|
||||
curl -sSL https://install.python-poetry.org | python3 -
|
||||
cd Telegram/build/docker/centos_env
|
||||
poetry install
|
||||
DOCKERFILE=$(DEBUG= LTO= poetry run gen_dockerfile)
|
||||
echo "$DOCKERFILE" > Dockerfile
|
||||
|
||||
- name: Free up some disk space.
|
||||
uses: jlumbroso/free-disk-space@54081f138730dfa15788a46383842cd2f914a1be
|
||||
with:
|
||||
tool-cache: true
|
||||
|
||||
- name: Set up Docker Buildx.
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Libraries cache.
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ${{ runner.temp }}/.buildx-cache
|
||||
key: ${{ runner.OS }}-libs-${{ hashFiles('Telegram/build/docker/centos_env/**') }}
|
||||
restore-keys: ${{ runner.OS }}-libs-
|
||||
|
||||
- name: Libraries.
|
||||
uses: docker/build-push-action@v6
|
||||
with:
|
||||
context: Telegram/build/docker/centos_env
|
||||
load: ${{ env.ONLY_CACHE == 'false' }}
|
||||
tags: ${{ env.IMAGE_TAG }}
|
||||
cache-from: type=local,src=${{ runner.temp }}/.buildx-cache
|
||||
cache-to: type=local,dest=${{ runner.temp }}/.buildx-cache-new,mode=max
|
||||
|
||||
- name: Move cache.
|
||||
run: |
|
||||
rm -rf ${{ runner.temp }}/.buildx-cache
|
||||
mv ${{ runner.temp }}/.buildx-cache{-new,}
|
||||
|
||||
- name: Telegram Desktop build.
|
||||
if: env.ONLY_CACHE == 'false'
|
||||
run: |
|
||||
cd $REPO_NAME
|
||||
|
||||
DEFINE=""
|
||||
if [ -n "${{ matrix.defines }}" ]; then
|
||||
DEFINE="-D ${{ matrix.defines }}=ON"
|
||||
@@ -86,21 +117,21 @@ jobs:
|
||||
-u $(id -u) \
|
||||
-v $PWD:/usr/src/tdesktop \
|
||||
-e CONFIG=Debug \
|
||||
tdesktop:centos_env \
|
||||
$IMAGE_TAG \
|
||||
/usr/src/tdesktop/Telegram/build/docker/centos_env/build.sh \
|
||||
-D CMAKE_C_FLAGS_DEBUG="" \
|
||||
-D CMAKE_CXX_FLAGS_DEBUG="" \
|
||||
-D CMAKE_C_FLAGS="-Werror" \
|
||||
-D CMAKE_CXX_FLAGS="-Werror" \
|
||||
-D CMAKE_EXE_LINKER_FLAGS="-s" \
|
||||
-D CMAKE_CONFIGURATION_TYPES=Debug \
|
||||
-D CMAKE_C_FLAGS_DEBUG="-O0" \
|
||||
-D CMAKE_CXX_FLAGS_DEBUG="-O0" \
|
||||
-D CMAKE_COMPILE_WARNING_AS_ERROR=ON \
|
||||
-D TDESKTOP_API_TEST=ON \
|
||||
-D DESKTOP_APP_DISABLE_AUTOUPDATE=OFF \
|
||||
-D DESKTOP_APP_DISABLE_CRASH_REPORTS=OFF \
|
||||
$DEFINE
|
||||
|
||||
- name: Check.
|
||||
if: env.ONLY_CACHE == 'false'
|
||||
run: |
|
||||
filePath="$REPO_NAME/out/Debug/Telegram"
|
||||
filePath="out/Debug/Telegram"
|
||||
if test -f "$filePath"; then
|
||||
echo "Build successfully done! :)"
|
||||
|
||||
@@ -114,7 +145,7 @@ jobs:
|
||||
- name: Move artifact.
|
||||
if: env.UPLOAD_ARTIFACT == 'true'
|
||||
run: |
|
||||
cd $REPO_NAME/out/Debug
|
||||
cd out/Debug
|
||||
mkdir artifact
|
||||
mv {Telegram,Updater} artifact/
|
||||
- uses: actions/upload-artifact@v4
|
||||
@@ -122,4 +153,4 @@ jobs:
|
||||
name: Upload artifact.
|
||||
with:
|
||||
name: ${{ env.ARTIFACT_NAME }}
|
||||
path: ${{ env.REPO_NAME }}/out/Debug/artifact/
|
||||
path: out/Debug/artifact/
|
||||
|
||||
9
.github/workflows/mac.yml
vendored
@@ -114,18 +114,15 @@ jobs:
|
||||
fi
|
||||
|
||||
./configure.sh \
|
||||
-D CMAKE_C_FLAGS="-Werror" \
|
||||
-D CMAKE_CXX_FLAGS="-Werror" \
|
||||
-D CMAKE_CONFIGURATION_TYPES=Debug \
|
||||
-D CMAKE_COMPILE_WARNING_AS_ERROR=ON \
|
||||
-D CMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED=NO \
|
||||
-D TDESKTOP_API_TEST=ON \
|
||||
-D DESKTOP_APP_DISABLE_AUTOUPDATE=OFF \
|
||||
-D DESKTOP_APP_DISABLE_CRASH_REPORTS=OFF \
|
||||
$DEFINE
|
||||
|
||||
cd ../out
|
||||
|
||||
xcoderun='xcodebuild build -project Telegram.xcodeproj -scheme Telegram -destination "platform=macOS,arch=x86_64" -configuration Debug'
|
||||
bash -c "$xcoderun" || bash -c "$xcoderun" || bash -c "$xcoderun"
|
||||
cmake --build ../out --config Debug --parallel
|
||||
|
||||
- name: Move artifact.
|
||||
if: env.UPLOAD_ARTIFACT == 'true'
|
||||
|
||||
33
.github/workflows/mac_packaged.yml
vendored
@@ -69,7 +69,7 @@ jobs:
|
||||
run: |
|
||||
brew update
|
||||
brew upgrade || true
|
||||
brew install ada-url autoconf automake boost cmake ffmpeg libtool openal-soft openh264 openssl opus ninja pkg-config python qt yasm xz
|
||||
brew install ada-url autoconf automake boost cmake ffmpeg jpeg-xl libavif libheif libtool openal-soft openh264 openssl opus ninja pkg-config python qt yasm xz
|
||||
sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
|
||||
|
||||
xcodebuild -version > CACHE_KEY.txt
|
||||
@@ -118,10 +118,38 @@ jobs:
|
||||
|
||||
cmake --build build --parallel
|
||||
|
||||
- name: TDE2E cache.
|
||||
id: cache-tde2e
|
||||
uses: actions/cache@v4
|
||||
with:
|
||||
path: ${{ env.LibrariesPath }}/tde2e
|
||||
key: ${{ runner.OS }}-tde2e-${{ env.CACHE_KEY }}
|
||||
- name: TDE2E.
|
||||
if: steps.cache-tde2e.outputs.cache-hit != 'true'
|
||||
run: |
|
||||
cd $LibrariesPath
|
||||
|
||||
git init tde2e
|
||||
cd tde2e
|
||||
git remote add origin $GIT/tdlib/td.git
|
||||
git fetch --depth=1 origin 51743dfd01dff6179e2d8f7095729caa4e2222e9
|
||||
git reset --hard FETCH_HEAD
|
||||
|
||||
cmake -Bbuild -GNinja . \
|
||||
-DCMAKE_BUILD_TYPE=Debug \
|
||||
-DCMAKE_INSTALL_PREFIX=$PWD/build/prefix \
|
||||
-DCMAKE_C_FLAGS_DEBUG="" \
|
||||
-DCMAKE_CXX_FLAGS_DEBUG="" \
|
||||
-DTD_E2E_ONLY=ON
|
||||
|
||||
cmake --build build --parallel
|
||||
cmake --install build
|
||||
|
||||
- name: Telegram Desktop build.
|
||||
if: env.ONLY_CACHE == 'false'
|
||||
env:
|
||||
tg_owt_DIR: ${{ env.LibrariesPath }}/tg_owt/build
|
||||
tde2e_DIR: ${{ env.LibrariesPath }}/tde2e/build/prefix
|
||||
run: |
|
||||
cd $REPO_NAME
|
||||
|
||||
@@ -138,10 +166,7 @@ jobs:
|
||||
-DCMAKE_BUILD_TYPE=Debug \
|
||||
-DCMAKE_C_FLAGS_DEBUG="" \
|
||||
-DCMAKE_CXX_FLAGS_DEBUG="" \
|
||||
-DCMAKE_EXE_LINKER_FLAGS="-s" \
|
||||
-DCMAKE_FIND_FRAMEWORK=LAST \
|
||||
-DTDESKTOP_API_TEST=ON \
|
||||
-DDESKTOP_APP_USE_PACKAGED_LAZY=ON \
|
||||
$DEFINE
|
||||
|
||||
cmake --build build --parallel
|
||||
|
||||
6
.github/workflows/win.yml
vendored
@@ -177,11 +177,11 @@ jobs:
|
||||
%TDESKTOP_BUILD_GENERATOR% ^
|
||||
%TDESKTOP_BUILD_ARCH% ^
|
||||
%TDESKTOP_BUILD_API% ^
|
||||
-D CMAKE_C_FLAGS="/WX" ^
|
||||
-D CMAKE_CXX_FLAGS="/WX" ^
|
||||
-D CMAKE_CONFIGURATION_TYPES=Debug ^
|
||||
-D CMAKE_COMPILE_WARNING_AS_ERROR=ON ^
|
||||
-D CMAKE_MSVC_DEBUG_INFORMATION_FORMAT= ^
|
||||
-D DESKTOP_APP_DISABLE_AUTOUPDATE=OFF ^
|
||||
-D DESKTOP_APP_DISABLE_CRASH_REPORTS=OFF ^
|
||||
-D DESKTOP_APP_NO_PDB=ON ^
|
||||
%TDESKTOP_BUILD_DEFINE%
|
||||
|
||||
cmake --build ..\out --config Debug --parallel
|
||||
|
||||
1
.gitignore
vendored
@@ -20,6 +20,7 @@ ipch/
|
||||
.vs/
|
||||
.vscode/
|
||||
.cache/
|
||||
compile_commands.json
|
||||
|
||||
/Telegram/log.txt
|
||||
/Telegram/data
|
||||
|
||||
6
.gitmodules
vendored
@@ -1,6 +1,3 @@
|
||||
[submodule "Telegram/ThirdParty/libtgvoip"]
|
||||
path = Telegram/ThirdParty/libtgvoip
|
||||
url = https://github.com/telegramdesktop/libtgvoip
|
||||
[submodule "Telegram/ThirdParty/GSL"]
|
||||
path = Telegram/ThirdParty/GSL
|
||||
url = https://github.com/Microsoft/GSL.git
|
||||
@@ -76,9 +73,6 @@
|
||||
[submodule "Telegram/lib_webview"]
|
||||
path = Telegram/lib_webview
|
||||
url = https://github.com/desktop-app/lib_webview.git
|
||||
[submodule "Telegram/ThirdParty/jemalloc"]
|
||||
path = Telegram/ThirdParty/jemalloc
|
||||
url = https://github.com/jemalloc/jemalloc
|
||||
[submodule "Telegram/ThirdParty/dispatch"]
|
||||
path = Telegram/ThirdParty/dispatch
|
||||
url = https://github.com/apple/swift-corelibs-libdispatch
|
||||
|
||||
@@ -4,15 +4,7 @@
|
||||
# For license and copyright information please follow this link:
|
||||
# https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
|
||||
if (APPLE)
|
||||
# target_precompile_headers with COMPILE_LANGUAGE restriction.
|
||||
cmake_minimum_required(VERSION 3.23)
|
||||
else()
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
endif()
|
||||
if (POLICY CMP0149)
|
||||
cmake_policy(SET CMP0149 NEW)
|
||||
endif()
|
||||
cmake_minimum_required(VERSION 3.25...3.31)
|
||||
|
||||
set_property(GLOBAL PROPERTY USE_FOLDERS ON)
|
||||
|
||||
@@ -20,19 +12,17 @@ include(cmake/validate_special_target.cmake)
|
||||
include(cmake/version.cmake)
|
||||
desktop_app_parse_version(Telegram/build/version)
|
||||
|
||||
set(project_langs C CXX)
|
||||
if (APPLE)
|
||||
list(APPEND project_langs OBJC OBJCXX)
|
||||
elseif (LINUX)
|
||||
list(APPEND project_langs ASM)
|
||||
endif()
|
||||
|
||||
project(Telegram
|
||||
LANGUAGES ${project_langs}
|
||||
LANGUAGES C CXX
|
||||
VERSION ${desktop_app_version_cmake}
|
||||
DESCRIPTION "Official Telegram Desktop messenger"
|
||||
HOMEPAGE_URL "https://desktop.telegram.org"
|
||||
)
|
||||
|
||||
if (APPLE)
|
||||
enable_language(OBJC OBJCXX)
|
||||
endif()
|
||||
|
||||
set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT Telegram)
|
||||
|
||||
get_filename_component(third_party_loc "Telegram/ThirdParty" REALPATH)
|
||||
@@ -47,9 +37,7 @@ include(cmake/variables.cmake)
|
||||
include(cmake/nice_target_sources.cmake)
|
||||
include(cmake/target_compile_options_if_exists.cmake)
|
||||
include(cmake/target_link_frameworks.cmake)
|
||||
include(cmake/target_link_optional_libraries.cmake)
|
||||
include(cmake/target_link_options_if_exists.cmake)
|
||||
include(cmake/target_link_static_libraries.cmake)
|
||||
include(cmake/init_target.cmake)
|
||||
include(cmake/generate_target.cmake)
|
||||
include(cmake/nuget.cmake)
|
||||
|
||||
@@ -26,7 +26,6 @@ get_filename_component(res_loc Resources REALPATH)
|
||||
include(cmake/telegram_options.cmake)
|
||||
include(cmake/lib_ffmpeg.cmake)
|
||||
include(cmake/lib_stripe.cmake)
|
||||
include(cmake/lib_tgvoip.cmake)
|
||||
include(cmake/lib_tgcalls.cmake)
|
||||
include(cmake/lib_prisma.cmake)
|
||||
include(cmake/td_export.cmake)
|
||||
@@ -34,6 +33,7 @@ include(cmake/td_iv.cmake)
|
||||
include(cmake/td_lang.cmake)
|
||||
include(cmake/td_mtproto.cmake)
|
||||
include(cmake/td_scheme.cmake)
|
||||
include(cmake/td_tde2e.cmake)
|
||||
include(cmake/td_ui.cmake)
|
||||
include(cmake/generate_appdata_changelog.cmake)
|
||||
|
||||
@@ -47,17 +47,13 @@ if (WIN32)
|
||||
platform/win/windows_quiethours.idl
|
||||
platform/win/windows_toastactivator.idl
|
||||
)
|
||||
|
||||
nuget_add_winrt(Telegram)
|
||||
endif()
|
||||
|
||||
set_target_properties(Telegram PROPERTIES AUTOMOC ON)
|
||||
|
||||
target_link_libraries(Telegram
|
||||
PRIVATE
|
||||
tdesktop::lib_tgcalls_legacy
|
||||
tdesktop::lib_tgcalls
|
||||
tdesktop::lib_tgvoip
|
||||
|
||||
# Order in this list defines the order of include paths in command line.
|
||||
# We need to place desktop-app::external_minizip this early to have its
|
||||
@@ -71,6 +67,7 @@ PRIVATE
|
||||
tdesktop::td_lang
|
||||
tdesktop::td_mtproto
|
||||
tdesktop::td_scheme
|
||||
tdesktop::td_tde2e
|
||||
tdesktop::td_ui
|
||||
desktop-app::lib_webrtc
|
||||
desktop-app::lib_base
|
||||
@@ -128,6 +125,8 @@ PRIVATE
|
||||
api/api_confirm_phone.h
|
||||
api/api_credits.cpp
|
||||
api/api_credits.h
|
||||
api/api_credits_history_entry.cpp
|
||||
api/api_credits_history_entry.h
|
||||
api/api_earn.cpp
|
||||
api/api_earn.h
|
||||
api/api_editing.cpp
|
||||
@@ -149,6 +148,8 @@ PRIVATE
|
||||
api/api_peer_colors.h
|
||||
api/api_peer_photo.cpp
|
||||
api/api_peer_photo.h
|
||||
api/api_peer_search.cpp
|
||||
api/api_peer_search.h
|
||||
api/api_polls.cpp
|
||||
api/api_polls.h
|
||||
api/api_premium.cpp
|
||||
@@ -175,8 +176,12 @@ PRIVATE
|
||||
api/api_statistics_data_deserialize.h
|
||||
api/api_statistics_sender.cpp
|
||||
api/api_statistics_sender.h
|
||||
api/api_suggest_post.cpp
|
||||
api/api_suggest_post.h
|
||||
api/api_text_entities.cpp
|
||||
api/api_text_entities.h
|
||||
api/api_todo_lists.cpp
|
||||
api/api_todo_lists.h
|
||||
api/api_toggling_media.cpp
|
||||
api/api_toggling_media.h
|
||||
api/api_transcribes.cpp
|
||||
@@ -213,8 +218,8 @@ PRIVATE
|
||||
boxes/peers/edit_contact_box.h
|
||||
boxes/peers/edit_forum_topic_box.cpp
|
||||
boxes/peers/edit_forum_topic_box.h
|
||||
boxes/peers/edit_linked_chat_box.cpp
|
||||
boxes/peers/edit_linked_chat_box.h
|
||||
boxes/peers/edit_discussion_link_box.cpp
|
||||
boxes/peers/edit_discussion_link_box.h
|
||||
boxes/peers/edit_members_visible.cpp
|
||||
boxes/peers/edit_members_visible.h
|
||||
boxes/peers/edit_participant_box.cpp
|
||||
@@ -280,6 +285,8 @@ PRIVATE
|
||||
boxes/edit_caption_box.h
|
||||
boxes/edit_privacy_box.cpp
|
||||
boxes/edit_privacy_box.h
|
||||
boxes/edit_todo_list_box.cpp
|
||||
boxes/edit_todo_list_box.h
|
||||
boxes/gift_credits_box.cpp
|
||||
boxes/gift_credits_box.h
|
||||
boxes/gift_premium_box.cpp
|
||||
@@ -394,6 +401,8 @@ PRIVATE
|
||||
calls/calls_video_bubble.h
|
||||
calls/calls_video_incoming.cpp
|
||||
calls/calls_video_incoming.h
|
||||
calls/calls_window.cpp
|
||||
calls/calls_window.h
|
||||
chat_helpers/compose/compose_features.h
|
||||
chat_helpers/compose/compose_show.cpp
|
||||
chat_helpers/compose/compose_show.h
|
||||
@@ -443,6 +452,8 @@ PRIVATE
|
||||
chat_helpers/ttl_media_layer_widget.h
|
||||
core/application.cpp
|
||||
core/application.h
|
||||
core/bank_card_click_handler.cpp
|
||||
core/bank_card_click_handler.h
|
||||
core/base_integration.cpp
|
||||
core/base_integration.h
|
||||
core/changelogs.cpp
|
||||
@@ -459,6 +470,7 @@ PRIVATE
|
||||
core/crash_report_window.h
|
||||
core/crash_reports.cpp
|
||||
core/crash_reports.h
|
||||
core/credits_amount.h
|
||||
core/deadlock_detector.h
|
||||
core/file_utilities.cpp
|
||||
core/file_utilities.h
|
||||
@@ -472,7 +484,6 @@ PRIVATE
|
||||
core/sandbox.h
|
||||
core/shortcuts.cpp
|
||||
core/shortcuts.h
|
||||
core/stars_amount.h
|
||||
core/ui_integration.cpp
|
||||
core/ui_integration.h
|
||||
core/update_checker.cpp
|
||||
@@ -496,8 +507,12 @@ PRIVATE
|
||||
data/components/factchecks.h
|
||||
data/components/location_pickers.cpp
|
||||
data/components/location_pickers.h
|
||||
data/components/promo_suggestions.cpp
|
||||
data/components/promo_suggestions.h
|
||||
data/components/recent_peers.cpp
|
||||
data/components/recent_peers.h
|
||||
data/components/recent_shared_media_gifts.cpp
|
||||
data/components/recent_shared_media_gifts.h
|
||||
data/components/scheduled_messages.cpp
|
||||
data/components/scheduled_messages.h
|
||||
data/components/sponsored_messages.cpp
|
||||
@@ -642,6 +657,8 @@ PRIVATE
|
||||
data/data_streaming.h
|
||||
data/data_thread.cpp
|
||||
data/data_thread.h
|
||||
data/data_todo_list.cpp
|
||||
data/data_todo_list.h
|
||||
data/data_types.cpp
|
||||
data/data_types.h
|
||||
data/data_unread_value.cpp
|
||||
@@ -682,12 +699,16 @@ PRIVATE
|
||||
dialogs/dialogs_main_list.h
|
||||
dialogs/dialogs_pinned_list.cpp
|
||||
dialogs/dialogs_pinned_list.h
|
||||
dialogs/dialogs_quick_action.cpp
|
||||
dialogs/dialogs_quick_action.h
|
||||
dialogs/dialogs_row.cpp
|
||||
dialogs/dialogs_row.h
|
||||
dialogs/dialogs_search_from_controllers.cpp
|
||||
dialogs/dialogs_search_from_controllers.h
|
||||
dialogs/dialogs_search_tags.cpp
|
||||
dialogs/dialogs_search_tags.h
|
||||
dialogs/dialogs_top_bar_suggestion.cpp
|
||||
dialogs/dialogs_top_bar_suggestion.h
|
||||
dialogs/dialogs_widget.cpp
|
||||
dialogs/dialogs_widget.h
|
||||
editor/color_picker.cpp
|
||||
@@ -738,6 +759,8 @@ PRIVATE
|
||||
history/view/controls/history_view_draft_options.h
|
||||
history/view/controls/history_view_forward_panel.cpp
|
||||
history/view/controls/history_view_forward_panel.h
|
||||
history/view/controls/history_view_suggest_options.cpp
|
||||
history/view/controls/history_view_suggest_options.h
|
||||
history/view/controls/history_view_ttl_button.cpp
|
||||
history/view/controls/history_view_ttl_button.h
|
||||
history/view/controls/history_view_voice_record_bar.cpp
|
||||
@@ -799,8 +822,12 @@ PRIVATE
|
||||
history/view/media/history_view_sticker_player_abstract.h
|
||||
history/view/media/history_view_story_mention.cpp
|
||||
history/view/media/history_view_story_mention.h
|
||||
history/view/media/history_view_suggest_decision.cpp
|
||||
history/view/media/history_view_suggest_decision.h
|
||||
history/view/media/history_view_theme_document.cpp
|
||||
history/view/media/history_view_theme_document.h
|
||||
history/view/media/history_view_todo_list.cpp
|
||||
history/view/media/history_view_todo_list.h
|
||||
history/view/media/history_view_unique_gift.cpp
|
||||
history/view/media/history_view_unique_gift.h
|
||||
history/view/media/history_view_userpic_suggestion.cpp
|
||||
@@ -825,6 +852,8 @@ PRIVATE
|
||||
history/view/history_view_bottom_info.h
|
||||
history/view/history_view_chat_preview.cpp
|
||||
history/view/history_view_chat_preview.h
|
||||
history/view/history_view_chat_section.cpp
|
||||
history/view/history_view_chat_section.h
|
||||
history/view/history_view_contact_status.cpp
|
||||
history/view/history_view_contact_status.h
|
||||
history/view/history_view_context_menu.cpp
|
||||
@@ -859,8 +888,6 @@ PRIVATE
|
||||
history/view/history_view_pinned_tracker.h
|
||||
history/view/history_view_quick_action.cpp
|
||||
history/view/history_view_quick_action.h
|
||||
history/view/history_view_replies_section.cpp
|
||||
history/view/history_view_replies_section.h
|
||||
history/view/history_view_reply.cpp
|
||||
history/view/history_view_reply.h
|
||||
history/view/history_view_requests_bar.cpp
|
||||
@@ -877,8 +904,8 @@ PRIVATE
|
||||
history/view/history_view_sponsored_click_handler.h
|
||||
history/view/history_view_sticker_toast.cpp
|
||||
history/view/history_view_sticker_toast.h
|
||||
history/view/history_view_sublist_section.cpp
|
||||
history/view/history_view_sublist_section.h
|
||||
history/view/history_view_subsection_tabs.cpp
|
||||
history/view/history_view_subsection_tabs.h
|
||||
history/view/history_view_text_helper.cpp
|
||||
history/view/history_view_text_helper.h
|
||||
history/view/history_view_transcribe_button.cpp
|
||||
@@ -919,6 +946,8 @@ PRIVATE
|
||||
history/history_unread_things.h
|
||||
history/history_view_highlight_manager.cpp
|
||||
history/history_view_highlight_manager.h
|
||||
history/history_view_swipe_back_session.cpp
|
||||
history/history_view_swipe_back_session.h
|
||||
history/history_widget.cpp
|
||||
history/history_widget.h
|
||||
info/bot/earn/info_bot_earn_list.cpp
|
||||
@@ -1073,6 +1102,8 @@ PRIVATE
|
||||
inline_bots/inline_bot_result.h
|
||||
inline_bots/inline_bot_send_data.cpp
|
||||
inline_bots/inline_bot_send_data.h
|
||||
inline_bots/inline_bot_storage.cpp
|
||||
inline_bots/inline_bot_storage.h
|
||||
inline_bots/inline_results_inner.cpp
|
||||
inline_bots/inline_results_inner.h
|
||||
inline_bots/inline_results_widget.cpp
|
||||
@@ -1421,12 +1452,18 @@ PRIVATE
|
||||
settings/cloud_password/settings_cloud_password_hint.h
|
||||
settings/cloud_password/settings_cloud_password_input.cpp
|
||||
settings/cloud_password/settings_cloud_password_input.h
|
||||
settings/cloud_password/settings_cloud_password_login_email.cpp
|
||||
settings/cloud_password/settings_cloud_password_login_email.h
|
||||
settings/cloud_password/settings_cloud_password_login_email_confirm.cpp
|
||||
settings/cloud_password/settings_cloud_password_login_email_confirm.h
|
||||
settings/cloud_password/settings_cloud_password_manage.cpp
|
||||
settings/cloud_password/settings_cloud_password_manage.h
|
||||
settings/cloud_password/settings_cloud_password_start.cpp
|
||||
settings/cloud_password/settings_cloud_password_start.h
|
||||
settings/cloud_password/settings_cloud_password_step.cpp
|
||||
settings/cloud_password/settings_cloud_password_step.h
|
||||
settings/cloud_password/settings_cloud_password_validate_icon.cpp
|
||||
settings/cloud_password/settings_cloud_password_validate_icon.h
|
||||
settings/settings_active_sessions.cpp
|
||||
settings/settings_active_sessions.h
|
||||
settings/settings_advanced.cpp
|
||||
@@ -1532,6 +1569,8 @@ PRIVATE
|
||||
support/support_preload.h
|
||||
support/support_templates.cpp
|
||||
support/support_templates.h
|
||||
tde2e/tde2e_integration.cpp
|
||||
tde2e/tde2e_integration.h
|
||||
ui/boxes/edit_invite_link_session.cpp
|
||||
ui/boxes/edit_invite_link_session.h
|
||||
ui/boxes/peer_qr_box.cpp
|
||||
@@ -1726,6 +1765,10 @@ if (WIN32)
|
||||
# COMMENT
|
||||
# $<IF:${release},"Appending compatibility manifest.","Finalizing build.">
|
||||
# )
|
||||
|
||||
if (QT_VERSION LESS 6)
|
||||
target_link_libraries(Telegram PRIVATE desktop-app::win_directx_helper)
|
||||
endif()
|
||||
elseif (APPLE)
|
||||
if (NOT DESKTOP_APP_USE_PACKAGED)
|
||||
target_link_libraries(Telegram PRIVATE desktop-app::external_iconv)
|
||||
@@ -1839,11 +1882,7 @@ else()
|
||||
set(bundle_identifier "com.tdesktop.Telegram")
|
||||
endif()
|
||||
set(bundle_entitlements "Telegram.entitlements")
|
||||
if (LINUX AND DESKTOP_APP_USE_PACKAGED)
|
||||
set(output_name "telegram-desktop")
|
||||
else()
|
||||
set(output_name "Telegram")
|
||||
endif()
|
||||
set(output_name "Telegram")
|
||||
endif()
|
||||
|
||||
if (CMAKE_GENERATOR STREQUAL Xcode)
|
||||
@@ -1885,8 +1924,9 @@ PRIVATE
|
||||
G_LOG_DOMAIN="Telegram"
|
||||
)
|
||||
|
||||
get_property(is_multi_config GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
|
||||
if (APPLE
|
||||
OR "${CMAKE_GENERATOR}" STREQUAL "Ninja Multi-Config"
|
||||
OR is_multi_config
|
||||
OR NOT CMAKE_EXECUTABLE_SUFFIX STREQUAL ""
|
||||
OR NOT "${output_name}" STREQUAL "Telegram")
|
||||
set(output_folder ${CMAKE_BINARY_DIR})
|
||||
@@ -1909,6 +1949,7 @@ if (MSVC)
|
||||
/DELAYLOAD:user32.dll
|
||||
/DELAYLOAD:gdi32.dll
|
||||
/DELAYLOAD:advapi32.dll
|
||||
/DELAYLOAD:avrt.dll
|
||||
/DELAYLOAD:shell32.dll
|
||||
/DELAYLOAD:ole32.dll
|
||||
/DELAYLOAD:oleaut32.dll
|
||||
@@ -2037,6 +2078,10 @@ if (NOT DESKTOP_APP_DISABLE_AUTOUPDATE AND NOT build_macstore AND NOT build_wins
|
||||
desktop-app::external_openssl
|
||||
)
|
||||
|
||||
if (DESKTOP_APP_USE_PACKAGED)
|
||||
target_compile_definitions(Packer PRIVATE PACKER_USE_PACKAGED)
|
||||
endif()
|
||||
|
||||
set_target_properties(Packer PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${output_folder})
|
||||
endif()
|
||||
elseif (build_winstore)
|
||||
@@ -2061,14 +2106,16 @@ if (LINUX AND DESKTOP_APP_USE_PACKAGED)
|
||||
configure_file("../lib/xdg/org.telegram.desktop.metainfo.xml" "${CMAKE_CURRENT_BINARY_DIR}/org.telegram.desktop.metainfo.xml" @ONLY)
|
||||
generate_appdata_changelog(Telegram "${CMAKE_SOURCE_DIR}/changelog.txt" "${CMAKE_CURRENT_BINARY_DIR}/org.telegram.desktop.metainfo.xml")
|
||||
install(TARGETS Telegram RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}" BUNDLE DESTINATION "${CMAKE_INSTALL_BINDIR}")
|
||||
install(FILES "Resources/art/icon16.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/16x16/apps" RENAME "telegram.png")
|
||||
install(FILES "Resources/art/icon32.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/32x32/apps" RENAME "telegram.png")
|
||||
install(FILES "Resources/art/icon48.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/48x48/apps" RENAME "telegram.png")
|
||||
install(FILES "Resources/art/icon64.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/64x64/apps" RENAME "telegram.png")
|
||||
install(FILES "Resources/art/icon128.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/128x128/apps" RENAME "telegram.png")
|
||||
install(FILES "Resources/art/icon256.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/256x256/apps" RENAME "telegram.png")
|
||||
install(FILES "Resources/art/icon512.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/512x512/apps" RENAME "telegram.png")
|
||||
install(FILES "Resources/icons/tray_monochrome.svg" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/symbolic/apps" RENAME "telegram-symbolic.svg")
|
||||
install(FILES "Resources/art/icon16.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/16x16/apps" RENAME "org.telegram.desktop.png")
|
||||
install(FILES "Resources/art/icon32.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/32x32/apps" RENAME "org.telegram.desktop.png")
|
||||
install(FILES "Resources/art/icon48.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/48x48/apps" RENAME "org.telegram.desktop.png")
|
||||
install(FILES "Resources/art/icon64.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/64x64/apps" RENAME "org.telegram.desktop.png")
|
||||
install(FILES "Resources/art/icon128.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/128x128/apps" RENAME "org.telegram.desktop.png")
|
||||
install(FILES "Resources/art/icon256.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/256x256/apps" RENAME "org.telegram.desktop.png")
|
||||
install(FILES "Resources/art/icon512.png" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/512x512/apps" RENAME "org.telegram.desktop.png")
|
||||
install(FILES "Resources/icons/tray_monochrome.svg" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/symbolic/apps" RENAME "org.telegram.desktop-symbolic.svg")
|
||||
install(FILES "Resources/icons/tray_monochrome_attention.svg" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/symbolic/apps" RENAME "org.telegram.desktop-attention-symbolic.svg")
|
||||
install(FILES "Resources/icons/tray_monochrome_mute.svg" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/symbolic/apps" RENAME "org.telegram.desktop-mute-symbolic.svg")
|
||||
install(FILES "../lib/xdg/org.telegram.desktop.desktop" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications")
|
||||
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/org.telegram.desktop.service" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/dbus-1/services")
|
||||
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/org.telegram.desktop.metainfo.xml" DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/metainfo")
|
||||
|
||||
BIN
Telegram/Resources/animations/cloud_password/validate.tgs
Normal file
BIN
Telegram/Resources/animations/diamond.tgs
Normal file
BIN
Telegram/Resources/animations/edit_peers/direct_messages.tgs
Normal file
BIN
Telegram/Resources/animations/edit_peers/topics.tgs
Normal file
BIN
Telegram/Resources/animations/edit_peers/topics_list.tgs
Normal file
BIN
Telegram/Resources/animations/edit_peers/topics_tabs.tgs
Normal file
BIN
Telegram/Resources/animations/media_forbidden.tgs
Normal file
BIN
Telegram/Resources/animations/swipe_action/archive.tgs
Normal file
BIN
Telegram/Resources/animations/swipe_action/delete.tgs
Normal file
BIN
Telegram/Resources/animations/swipe_action/disabled.tgs
Normal file
BIN
Telegram/Resources/animations/swipe_action/mute.tgs
Normal file
BIN
Telegram/Resources/animations/swipe_action/pin.tgs
Normal file
BIN
Telegram/Resources/animations/swipe_action/read.tgs
Normal file
BIN
Telegram/Resources/animations/swipe_action/unarchive.tgs
Normal file
BIN
Telegram/Resources/animations/swipe_action/unmute.tgs
Normal file
BIN
Telegram/Resources/animations/swipe_action/unpin.tgs
Normal file
BIN
Telegram/Resources/animations/swipe_action/unread.tgs
Normal file
BIN
Telegram/Resources/icons/calls/call_group.png
Normal file
|
After Width: | Height: | Size: 721 B |
BIN
Telegram/Resources/icons/calls/call_group@2x.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
Telegram/Resources/icons/calls/call_group@3x.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
Telegram/Resources/icons/calls/calls_add_people.png
Normal file
|
After Width: | Height: | Size: 529 B |
BIN
Telegram/Resources/icons/calls/calls_add_people@2x.png
Normal file
|
After Width: | Height: | Size: 956 B |
BIN
Telegram/Resources/icons/calls/calls_add_people@3x.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
Telegram/Resources/icons/calls/group_call_logo.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
Telegram/Resources/icons/calls/group_call_logo@2x.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
Telegram/Resources/icons/calls/group_call_logo@3x.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
BIN
Telegram/Resources/icons/chat/input_gift.png
Normal file
|
After Width: | Height: | Size: 679 B |
BIN
Telegram/Resources/icons/chat/input_gift@2x.png
Normal file
|
After Width: | Height: | Size: 1.1 KiB |
BIN
Telegram/Resources/icons/chat/input_gift@3x.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
8
Telegram/Resources/icons/chat/input_paid.svg
Normal file
@@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="40px" height="40px" viewBox="0 0 40 40" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<title>Icon / Input / input_paid</title>
|
||||
<g id="Icon-/-Input-/-input_paid" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<path d="M20,9.8 C25.6299826,9.8 30.2,14.2730045 30.2,19.7983329 C30.2,25.3236612 25.6299826,29.7966657 20,29.7966657 C18.7457032,29.7966657 17.522531,29.57429 16.3765194,29.1472418 L16.049,29.018 L15.8675895,29.1274403 L15.6273764,29.2612632 C14.545782,29.8404011 13.0955737,30.1473058 11.2731839,30.1996583 C10.8153842,30.2127839 10.4336239,29.8523042 10.4204985,29.3945045 C10.4177264,29.2978179 10.4318913,29.2013918 10.4663408,29.0979123 C10.9468917,27.7307176 11.2958938,26.5818971 11.5130707,25.6565167 L11.566,25.42 L11.5361505,25.3785138 C10.4824637,23.8473989 9.87852612,22.0565089 9.80714989,20.1756532 L9.8,19.7983329 C9.8,14.2730045 14.3700174,9.8 20,9.8 Z M20,11.2 C15.1365724,11.2 11.2,15.0530063 11.2,19.7983329 C11.2,21.6384229 11.7922255,23.3893508 12.8759186,24.8453165 L13.0610907,25.0940992 L13.001223,25.3983974 C12.8243697,26.2973155 12.5137714,27.4099145 12.0719423,28.73207 L12.064,28.754 L12.2244984,28.7405395 C13.2682683,28.6413859 14.1190062,28.4334572 14.7754263,28.1231964 L14.9665215,28.0270547 C15.164827,27.9208723 15.3780604,27.7932923 15.605736,27.6441968 L15.9287098,27.4326945 L16.2799121,27.5930136 C17.4341359,28.1199012 18.6962936,28.3966657 20,28.3966657 C24.8634276,28.3966657 28.8,24.5436594 28.8,19.7983329 C28.8,15.0530063 24.8634276,11.2 20,11.2 Z" id="Shape---" fill="#FFFFFF" fill-rule="nonzero"></path>
|
||||
<path d="M20.2258661,25.6815247 C20.5071894,25.6815247 20.874026,25.4574745 20.874026,25.0631159 L20.874026,24.4093038 C22.5557139,24.2186972 23.4454545,23.1802196 23.4454545,21.6685117 C23.4454545,20.3671283 22.7015108,19.5784112 21.1573587,19.2234884 L19.8882782,18.9211469 C19.0943214,18.7371128 18.7067205,18.3558996 18.7067205,17.7972249 C18.7067205,17.1268153 19.2568638,16.6404397 20.1195884,16.6404397 C20.8197708,16.6404397 21.3073978,16.8902001 21.8512894,17.5277465 C22.126361,17.8300881 22.3389164,17.941823 22.6264913,17.941823 C22.9765824,17.941823 23.2454024,17.68549 23.2454024,17.3042767 C23.2454024,16.9362087 23.0390987,16.5352774 22.6890076,16.1737821 C22.2263871,15.713697 21.7022327,15.4113555 20.9207792,15.3061932 L20.9207792,14.6509738 C20.9207792,14.2631879 20.5009377,13.9363049 20.2133629,13.9363049 C19.9320396,13.9363049 19.5493506,14.2566152 19.5493506,14.6509738 L19.5493506,15.2864752 C17.930179,15.4442187 17.0312842,16.4629784 17.0312842,17.9221051 C17.0312842,19.1971979 17.7752279,20.0450688 19.2005991,20.3802736 L20.4696796,20.6891878 C21.3949206,20.9192303 21.7762699,21.2610078 21.7762699,21.8394004 C21.7762699,22.5886817 21.219875,23.061912 20.2258661,23.061912 C19.4819224,23.061912 18.8630112,22.766143 18.3003647,22.1285967 C17.9815316,21.7933919 17.8064861,21.7210928 17.5689242,21.7210928 C17.1875749,21.7210928 16.9,21.9774259 16.9,22.417793 C16.9,22.8055789 17.1125554,23.2065101 17.4939047,23.5548602 C17.9940349,24.0346632 18.7115432,24.3238594 19.5805195,24.4093038 L19.5805195,25.0565432 C19.5805195,25.4509018 19.9382912,25.6815247 20.2258661,25.6815247 Z" id="Path" fill="#FFFFFF" fill-rule="nonzero"></path>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.3 KiB |
BIN
Telegram/Resources/icons/chat/large_messages.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
Telegram/Resources/icons/chat/large_messages@2x.png
Normal file
|
After Width: | Height: | Size: 2.2 KiB |
BIN
Telegram/Resources/icons/chat/large_messages@3x.png
Normal file
|
After Width: | Height: | Size: 3.4 KiB |
7
Telegram/Resources/icons/chat/paid_approve.svg
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<title>Icon / Filled / paid_approve</title>
|
||||
<g id="Icon-/-Filled-/-paid_approve" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<path d="M12,4.5 C16.14,4.5 19.5,7.86 19.5,12 C19.5,16.14 16.14,19.5 12,19.5 C7.86,19.5 4.5,16.14 4.5,12 C4.5,7.86 7.86,4.5 12,4.5 Z M15.7577636,9.89127556 C15.4992394,9.62810439 15.0763217,9.62433727 14.8131506,9.88286145 L10.7479688,13.8761719 L9.18684944,12.3424898 C8.92367827,12.0839656 8.50076063,12.0877327 8.24223645,12.3509039 C7.98371227,12.6140751 7.98747939,13.0369927 8.25065056,13.2955169 L10.204967,15.2153247 C10.5064723,15.5115061 10.9896874,15.5115061 11.2911927,15.2153247 L15.7493494,10.8358886 C16.0125206,10.5773644 16.0162877,10.1544467 15.7577636,9.89127556 Z" id="Shape" fill="#FFFFFF" fill-rule="nonzero"></path>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 999 B |
7
Telegram/Resources/icons/chat/paid_decline.svg
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<title>Icon / Filled / paid_decline</title>
|
||||
<g id="Icon-/-Filled-/-paid_decline" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<path d="M12,4.5 C16.1421356,4.5 19.5,7.85786438 19.5,12 C19.5,16.1421356 16.1421356,19.5 12,19.5 C7.85786438,19.5 4.5,16.1421356 4.5,12 C4.5,7.85786438 7.85786438,4.5 12,4.5 Z M9.73375908,8.63964245 C9.43162712,8.33751049 8.94177442,8.33751049 8.63964245,8.63964245 L8.59853606,8.68404063 C8.33819559,8.98800138 8.35189772,9.44601435 8.63964245,9.73375908 L10.9059783,12 L8.63964245,14.2662409 C8.33751049,14.5683729 8.33751049,15.0582256 8.63964245,15.3603575 L8.68404063,15.4014639 C8.98800138,15.6618044 9.44601435,15.6481023 9.73375908,15.3603575 L12,13.0936701 L14.2662409,15.3603575 C14.5683729,15.6624895 15.0582256,15.6624895 15.3603575,15.3603575 L15.4014639,15.3159594 C15.6618044,15.0119986 15.6481023,14.5539856 15.3603575,14.2662409 L13.0936701,12 L15.3603575,9.73375908 C15.6624895,9.43162712 15.6624895,8.94177442 15.3603575,8.63964245 L15.3159594,8.59853606 C15.0119986,8.33819559 14.5539856,8.35189772 14.2662409,8.63964245 L12,10.9059783 L9.73375908,8.63964245 Z" id="Shape" fill="#FFFFFF"></path>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.3 KiB |
7
Telegram/Resources/icons/chat/paid_edit.svg
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<title>Icon / Filled / paid_edit</title>
|
||||
<g id="Icon-/-Filled-/-paid_edit" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<path d="M13.5029106,7.64699152 C13.6056531,7.5472623 13.7697888,7.549705 13.869518,7.65244745 L16.2610253,10.1162122 C16.3593492,10.2175069 16.3585592,10.3788499 16.259248,10.4791768 L7.97687653,18.8462593 C7.87948817,18.9446437 7.74680196,19 7.6083679,19 L5.51851849,19 C5.23214864,19 5,18.7678513 5,18.4814815 L5,16.3683223 C5,16.2308422 5.05459809,16.0989896 5.15178971,16.0017551 L13.5029106,7.64699152 Z M16.0299869,5.19856593 C16.3408365,4.91998643 16.8161619,4.93645109 17.1069903,5.23587194 L18.7801411,6.95845528 C19.073802,7.26079221 19.0732123,7.74202152 18.7788114,8.04363789 L17.6449122,9.20518682 C17.5421105,9.3048549 17.3779763,9.30231456 17.2783082,9.19951281 L14.8031149,6.64621027 C14.707554,6.53957983 14.7165277,6.3756714 14.8231582,6.28011055 L16.0299869,5.19856593 Z" id="Shape" fill="#FFFFFF"></path>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
BIN
Telegram/Resources/icons/menu/hourglass.png
Normal file
|
After Width: | Height: | Size: 630 B |
BIN
Telegram/Resources/icons/menu/hourglass@2x.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
Telegram/Resources/icons/menu/hourglass@3x.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
Telegram/Resources/icons/menu/order_date.png
Normal file
|
After Width: | Height: | Size: 585 B |
BIN
Telegram/Resources/icons/menu/order_date@2x.png
Normal file
|
After Width: | Height: | Size: 1015 B |
BIN
Telegram/Resources/icons/menu/order_date@3x.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
Telegram/Resources/icons/menu/order_number.png
Normal file
|
After Width: | Height: | Size: 680 B |
BIN
Telegram/Resources/icons/menu/order_number@2x.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
Telegram/Resources/icons/menu/order_number@3x.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
Telegram/Resources/icons/menu/order_price.png
Normal file
|
After Width: | Height: | Size: 813 B |
BIN
Telegram/Resources/icons/menu/order_price@2x.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
Telegram/Resources/icons/menu/order_price@3x.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
Telegram/Resources/icons/menu/tag_sell.png
Normal file
|
After Width: | Height: | Size: 377 B |
BIN
Telegram/Resources/icons/menu/tag_sell@2x.png
Normal file
|
After Width: | Height: | Size: 675 B |
BIN
Telegram/Resources/icons/menu/tag_sell@3x.png
Normal file
|
After Width: | Height: | Size: 930 B |
BIN
Telegram/Resources/icons/settings/earn.png
Normal file
|
After Width: | Height: | Size: 889 B |
BIN
Telegram/Resources/icons/settings/earn@2x.png
Normal file
|
After Width: | Height: | Size: 1.7 KiB |
BIN
Telegram/Resources/icons/settings/earn@3x.png
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
BIN
Telegram/Resources/icons/settings/gift.png
Normal file
|
After Width: | Height: | Size: 574 B |
BIN
Telegram/Resources/icons/settings/gift@2x.png
Normal file
|
After Width: | Height: | Size: 1016 B |
BIN
Telegram/Resources/icons/settings/gift@3x.png
Normal file
|
After Width: | Height: | Size: 1.3 KiB |
BIN
Telegram/Resources/icons/settings/mini_gift.png
Normal file
|
After Width: | Height: | Size: 472 B |
BIN
Telegram/Resources/icons/settings/mini_gift@2x.png
Normal file
|
After Width: | Height: | Size: 748 B |
BIN
Telegram/Resources/icons/settings/mini_gift@3x.png
Normal file
|
After Width: | Height: | Size: 1.0 KiB |
12
Telegram/Resources/icons/settings/mini_gift_order_date.svg
Normal file
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="48px" height="48px" viewBox="0 0 48 48" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<title>Mini / mini_gift_sorting2</title>
|
||||
<g id="Mini-/-mini_gift_sorting2" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<path d="M39.7913043,28.3413043 C40.9234881,28.3413043 41.8413043,29.2591206 41.8413043,30.3913043 L41.8413043,45 C41.8413043,46.1321837 40.9234881,47.05 39.7913043,47.05 C38.6591206,47.05 37.7413043,46.1321837 37.7413043,45 L37.7413043,30.3913043 C37.7413043,29.2591206 38.6591206,28.3413043 39.7913043,28.3413043 Z" id="Path" fill="#FFFFFF" fill-rule="nonzero"></path>
|
||||
<path d="M32.1330398,38.0495689 C32.9336146,38.8501437 34.2316028,38.8501437 35.0321776,38.0495689 L39.7906087,33.291 L44.5504311,38.0495689 C45.3088704,38.8080082 46.5137416,38.847926 47.3191738,38.1693225 L47.4495689,38.0495689 C48.2501437,37.2489941 48.2501437,35.9510059 47.4495689,35.1504311 L41.7573686,29.4582308 C40.6715413,28.3724035 38.9110674,28.3724035 37.8252401,29.4582308 L32.1330398,35.1504311 C31.332465,35.9510059 31.332465,37.2489941 32.1330398,38.0495689 Z" id="Path" fill="#FFFFFF" fill-rule="nonzero"></path>
|
||||
<path d="M36.5217391,5.3326087 C40.4153466,5.3326087 43.5717391,8.48900121 43.5717391,12.3826087 L43.5717391,21.7217391 C43.5717391,22.8539229 42.6539229,23.7717391 41.5217391,23.7717391 C40.3895554,23.7717391 39.4717391,22.8539229 39.4717391,21.7217391 L39.4717391,12.3826087 C39.4717391,10.7533687 38.1509791,9.4326087 36.5217391,9.4326087 L10,9.4326087 C8.37075999,9.4326087 7.05,10.7533687 7.05,12.3826087 L7.05,35.9826087 C7.05,37.6118487 8.37075999,38.9326087 10,38.9326087 L27.373913,38.9326087 C28.5060968,38.9326087 29.423913,39.850425 29.423913,40.9826087 C29.423913,42.1147924 28.5060968,43.0326087 27.373913,43.0326087 L10,43.0326087 C6.10639251,43.0326087 2.95,39.8762162 2.95,35.9826087 L2.95,12.3826087 C2.95,8.48900121 6.10639251,5.3326087 10,5.3326087 L36.5217391,5.3326087 Z" id="Path" fill="#FFFFFF" fill-rule="nonzero"></path>
|
||||
<polygon id="Path" fill="#FFFFFF" fill-rule="nonzero" points="6.09565217 20.3891304 40.426087 20.3891304 40.426087 16.2891304 6.09565217 16.2891304"></polygon>
|
||||
<path d="M11.8434783,0.95 C12.975662,0.95 13.8934783,1.86781626 13.8934783,3 L13.8934783,6.65217391 C13.8934783,7.78435765 12.975662,8.70217391 11.8434783,8.70217391 C10.7112945,8.70217391 9.79347826,7.78435765 9.79347826,6.65217391 L9.79347826,3 C9.79347826,1.86781626 10.7112945,0.95 11.8434783,0.95 Z" id="Path" fill="#FFFFFF" fill-rule="nonzero"></path>
|
||||
<path d="M34.6782609,0.95 C35.8104446,0.95 36.7282609,1.86781626 36.7282609,3 L36.7282609,6.65217391 C36.7282609,7.78435765 35.8104446,8.70217391 34.6782609,8.70217391 C33.5460771,8.70217391 32.6282609,7.78435765 32.6282609,6.65217391 L32.6282609,3 C32.6282609,1.86781626 33.5460771,0.95 34.6782609,0.95 Z" id="Path" fill="#FFFFFF" fill-rule="nonzero"></path>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.0 KiB |
12
Telegram/Resources/icons/settings/mini_gift_order_number.svg
Normal file
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="48px" height="48px" viewBox="0 0 48 48" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<title>Mini / mini_gift_sorting3</title>
|
||||
<g id="Mini-/-mini_gift_sorting3" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<path d="M34.4778761,13.749192 C35.6376741,13.749192 36.5778761,14.689394 36.5778761,15.849192 C36.5778761,17.00899 35.6376741,17.949192 34.4778761,17.949192 L7.57258674,17.949192 C6.41278876,17.949192 5.47258674,17.00899 5.47258674,15.849192 C5.47258674,14.689394 6.41278876,13.749192 7.57258674,13.749192 L34.4778761,13.749192 Z" id="Path" fill="#FFFFFF" fill-rule="nonzero"></path>
|
||||
<path d="M30.923367,27.509546 C32.083165,27.509546 33.023367,28.4497481 33.023367,29.609546 C33.023367,30.769344 32.083165,31.709546 30.923367,31.709546 L4,31.709546 C2.84020203,31.709546 1.9,30.769344 1.9,29.609546 C1.9,28.4497481 2.84020203,27.509546 4,27.509546 L30.923367,27.509546 Z" id="Path" fill="#FFFFFF" fill-rule="nonzero"></path>
|
||||
<path d="M14.7584617,4.53380965 C15.0159315,3.40295129 16.1413939,2.69492999 17.2722522,2.9523998 C18.4031106,3.20986962 19.1111319,4.33533198 18.8536621,5.46619035 L10.9056841,40.3752813 C10.6482143,41.5061396 9.52275197,42.2141609 8.39189361,41.9566911 C7.26103524,41.6992213 6.55301394,40.5737589 6.81048375,39.4429006 L14.7584617,4.53380965 Z" id="Path" fill="#FFFFFF" fill-rule="nonzero"></path>
|
||||
<path d="M28.1811642,4.55038432 C28.4294801,3.41748072 29.5491797,2.70038069 30.6820833,2.94869657 C31.8149869,3.19701246 32.532087,4.31671208 32.2837711,5.44961568 L24.6322095,40.3587066 C24.3838936,41.4916102 23.264194,42.2087102 22.1312904,41.9603943 C20.9983868,41.7120785 20.2812868,40.5923788 20.5296027,39.4594752 L28.1811642,4.55038432 Z" id="Path" fill="#FFFFFF" fill-rule="nonzero"></path>
|
||||
<path d="M39.7913043,28.3413043 C40.9234881,28.3413043 41.8413043,29.2591206 41.8413043,30.3913043 L41.8413043,45 C41.8413043,46.1321837 40.9234881,47.05 39.7913043,47.05 C38.6591206,47.05 37.7413043,46.1321837 37.7413043,45 L37.7413043,30.3913043 C37.7413043,29.2591206 38.6591206,28.3413043 39.7913043,28.3413043 Z" id="Path" fill="#FFFFFF" fill-rule="nonzero"></path>
|
||||
<path d="M32.1330398,38.0495689 C32.9336146,38.8501437 34.2316028,38.8501437 35.0321776,38.0495689 L39.7906087,33.291 L44.5504311,38.0495689 C45.3088704,38.8080082 46.5137416,38.847926 47.3191738,38.1693225 L47.4495689,38.0495689 C48.2501437,37.2489941 48.2501437,35.9510059 47.4495689,35.1504311 L41.7573686,29.4582308 C40.6715413,28.3724035 38.9110674,28.3724035 37.8252401,29.4582308 L32.1330398,35.1504311 C31.332465,35.9510059 31.332465,37.2489941 32.1330398,38.0495689 Z" id="Path" fill="#FFFFFF" fill-rule="nonzero"></path>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.8 KiB |
10
Telegram/Resources/icons/settings/mini_gift_order_price.svg
Normal file
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="48px" height="48px" viewBox="0 0 48 48" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<title>Mini / mini_gift_sorting1</title>
|
||||
<g id="Mini-/-mini_gift_sorting1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<path d="M23.4380165,1.95 C35.3025073,1.95 44.9260331,11.510317 44.9260331,23.3103448 C44.9260331,23.5919731 44.9205389,23.8730129 44.9095753,24.1533571 C44.8653322,25.2846761 43.9123508,26.1659251 42.7810319,26.121682 C41.6497129,26.0774389 40.7684638,25.1244576 40.812707,23.9931386 C40.8215831,23.7661706 40.8260331,23.5385471 40.8260331,23.3103448 C40.8260331,13.7807547 33.0441659,6.05 23.4380165,6.05 C13.8318671,6.05 6.05,13.7807547 6.05,23.3103448 C6.05,32.839935 13.8318671,40.5706897 23.4380165,40.5706897 C25.2657432,40.5706897 27.0529516,40.2914087 28.7555206,39.7492213 C29.8343232,39.4056738 30.9873658,40.0017158 31.3309133,41.0805185 C31.6744608,42.1593211 31.0784187,43.3123637 29.9996161,43.6559112 C27.8959061,44.3258431 25.6891219,44.6706897 23.4380165,44.6706897 C11.5735257,44.6706897 1.95,35.1103726 1.95,23.3103448 C1.95,11.510317 11.5735257,1.95 23.4380165,1.95 Z" id="Path" fill="#FFFFFF" fill-rule="nonzero"></path>
|
||||
<path d="M39.7913043,28.3413043 C40.9234881,28.3413043 41.8413043,29.2591206 41.8413043,30.3913043 L41.8413043,45 C41.8413043,46.1321837 40.9234881,47.05 39.7913043,47.05 C38.6591206,47.05 37.7413043,46.1321837 37.7413043,45 L37.7413043,30.3913043 C37.7413043,29.2591206 38.6591206,28.3413043 39.7913043,28.3413043 Z" id="Path" fill="#FFFFFF" fill-rule="nonzero"></path>
|
||||
<path d="M32.1330398,38.0495689 C32.9336146,38.8501437 34.2316028,38.8501437 35.0321776,38.0495689 L39.7906087,33.291 L44.5504311,38.0495689 C45.3088704,38.8080082 46.5137416,38.847926 47.3191738,38.1693225 L47.4495689,38.0495689 C48.2501437,37.2489941 48.2501437,35.9510059 47.4495689,35.1504311 L41.7573686,29.4582308 C40.6715413,28.3724035 38.9110674,28.3724035 37.8252401,29.4582308 L32.1330398,35.1504311 C31.332465,35.9510059 31.332465,37.2489941 32.1330398,38.0495689 Z" id="Path" fill="#FFFFFF" fill-rule="nonzero"></path>
|
||||
<path d="M23.8366211,35.9195313 C24.4958008,35.9195313 25.281738,35.5533203 25.281738,34.6744141 L25.281738,33.5025391 C29.2221677,33.0777344 31.4831055,30.7632813 31.4831055,27.3941406 C31.4831055,24.49375 29.7399414,22.7359375 26.1217773,21.9449219 L23.1481445,21.2710938 C21.287793,20.8609375 20.3795898,20.0113281 20.3795898,18.7662109 C20.3795898,17.2720703 21.6686523,16.1880859 23.6901367,16.1880859 C25.3307617,16.1880859 26.4733398,16.7447266 27.7477539,18.165625 C28.3922852,18.8394531 28.890332,19.0884766 29.5641602,19.0884766 C30.3844727,19.0884766 31.0143555,18.5171875 31.0143555,17.6675781 C31.0143555,16.8472656 30.530957,15.9537109 29.7106445,15.1480469 C28.6266602,14.1226563 27.2006837,13.4488281 25.369629,13.2144531 L25.369629,11.9986328 C25.369629,11.134375 24.5836914,10.7681641 23.9098633,10.7681641 C23.2506836,10.7681641 22.464746,11.1197266 22.464746,11.9986328 L22.464746,13.1705078 C18.6708007,13.5220703 16.4538086,15.7925781 16.4538086,19.0445313 C16.4538086,21.8863281 18.1969727,23.7759766 21.5368164,24.5230469 L24.5104492,25.2115234 C26.678418,25.7242188 27.5719727,26.4859375 27.5719727,27.775 C27.5719727,29.4449219 26.2682617,30.4996094 23.9391602,30.4996094 C22.1959961,30.4996094 20.7458008,29.8404297 19.4274414,28.4195313 C18.6803711,27.6724609 18.2702148,27.5113281 17.7135742,27.5113281 C16.8200195,27.5113281 16.1461914,28.0826172 16.1461914,29.0640625 C16.1461914,29.9283203 16.6442383,30.821875 17.537793,31.5982422 C18.709668,32.6675781 20.3407222,33.3267578 22.376855,33.5171875 L22.376855,34.6744141 C22.376855,35.5533203 23.162793,35.9195313 23.8366211,35.9195313 Z" id="Path" fill="#FFFFFF" fill-rule="nonzero"></path>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.8 KiB |
7
Telegram/Resources/icons/settings/premium/checklist.svg
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<title>Icon / Filled / checklist</title>
|
||||
<g id="Icon-/-Filled-/-checklist" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<path d="M12,4 C16.416,4 20,7.584 20,12 C20,16.416 16.416,20 12,20 C7.584,20 4,16.416 4,12 C4,7.584 7.584,4 12,4 Z M16.4818432,9.54348643 C16.1872637,9.22288416 15.7053635,9.21829494 15.4054889,9.53323613 L10.7733532,14.3979954 L8.99451107,12.5296222 C8.69463652,12.2146811 8.21273632,12.2192703 7.91815685,12.5398725 C7.62357737,12.8604748 7.62786989,13.3756846 7.92774444,13.6906258 L10.1546212,16.0293878 C10.4981762,16.3902041 11.0487833,16.3902041 11.3923383,16.0293878 L16.4722556,10.6942397 C16.7721301,10.3792985 16.7764226,9.8640887 16.4818432,9.54348643 Z" id="Shape" fill="#FFFFFF" fill-rule="nonzero"></path>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 975 B |
7
Telegram/Resources/icons/tray_monochrome_attention.svg
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g id="plane" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<path d="M1.3311718,6.36592184 C5.3576954,4.67244493 8.04267511,3.5560013 9.38611094,3.01659096 C13.2218932,1.47646481 14.0189359,1.2089284 14.5384372,1.2 C14.6526967,1.19815119 14.9081723,1.22548649 15.0736587,1.35511219 C15.2133922,1.4645656 15.2518384,1.61242159 15.2702362,1.71619544 C15.288634,1.81996929 15.3115436,2.05636876 15.2933322,2.24108442 C15.0854698,4.34939964 14.1860526,9.46572464 13.7284802,11.8270738 C13.5348641,12.8262491 13.1536281,13.1612675 12.7845475,13.1940535 C11.9824498,13.265305 11.3733733,12.6823476 10.5965026,12.190753 C9.3808532,11.4215044 8.69408865,10.9426448 7.51409044,10.1920004 C6.15039834,9.32450079 7.03442319,8.84770795 7.81158733,8.06849502 C8.01497489,7.86457129 11.5490353,4.7615061 11.6174372,4.48000946 C11.625992,4.44480359 11.6339313,4.31357282 11.5531696,4.24427815 C11.472408,4.17498349 11.3532107,4.19867957 11.2671947,4.21752527 C11.1452695,4.24423848 9.20325394,5.48334063 5.44114787,7.93483171 C4.88991321,8.30022994 4.39062196,8.47826423 3.94327414,8.46893456 C3.45010907,8.45864936 2.50145729,8.19975808 1.79623221,7.97846422 C0.931244952,7.70703829 0.243770289,7.56353344 0.303633888,7.10256824 C0.334814555,6.86246904 0.677327192,6.61692024 1.3311718,6.36592184 Z" id="Path-3" fill="#FFFFFF"></path>
|
||||
</g>
|
||||
<circle class="error" fill="#f23c34" cx="3.9" cy="12.7" r="2.2"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.6 KiB |
7
Telegram/Resources/icons/tray_monochrome_mute.svg
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g id="plane" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<path d="M1.3311718,6.36592184 C5.3576954,4.67244493 8.04267511,3.5560013 9.38611094,3.01659096 C13.2218932,1.47646481 14.0189359,1.2089284 14.5384372,1.2 C14.6526967,1.19815119 14.9081723,1.22548649 15.0736587,1.35511219 C15.2133922,1.4645656 15.2518384,1.61242159 15.2702362,1.71619544 C15.288634,1.81996929 15.3115436,2.05636876 15.2933322,2.24108442 C15.0854698,4.34939964 14.1860526,9.46572464 13.7284802,11.8270738 C13.5348641,12.8262491 13.1536281,13.1612675 12.7845475,13.1940535 C11.9824498,13.265305 11.3733733,12.6823476 10.5965026,12.190753 C9.3808532,11.4215044 8.69408865,10.9426448 7.51409044,10.1920004 C6.15039834,9.32450079 7.03442319,8.84770795 7.81158733,8.06849502 C8.01497489,7.86457129 11.5490353,4.7615061 11.6174372,4.48000946 C11.625992,4.44480359 11.6339313,4.31357282 11.5531696,4.24427815 C11.472408,4.17498349 11.3532107,4.19867957 11.2671947,4.21752527 C11.1452695,4.24423848 9.20325394,5.48334063 5.44114787,7.93483171 C4.88991321,8.30022994 4.39062196,8.47826423 3.94327414,8.46893456 C3.45010907,8.45864936 2.50145729,8.19975808 1.79623221,7.97846422 C0.931244952,7.70703829 0.243770289,7.56353344 0.303633888,7.10256824 C0.334814555,6.86246904 0.677327192,6.61692024 1.3311718,6.36592184 Z" id="Path-3" fill="#FFFFFF"></path>
|
||||
</g>
|
||||
<circle fill="#888888" cx="3.9" cy="12.7" r="2.2"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.6 KiB |
@@ -16,7 +16,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"cloud_lng_passport_in_ar" = "Arabic";
|
||||
"cloud_lng_passport_in_az" = "Azerbaijani";
|
||||
"cloud_lng_passport_in_bg" = "Bulgarian";
|
||||
"cloud_lng_passport_in_bn" = "Bangla";
|
||||
"cloud_lng_passport_in_bn" = "Bengali";
|
||||
"cloud_lng_passport_in_cs" = "Czech";
|
||||
"cloud_lng_passport_in_da" = "Danish";
|
||||
"cloud_lng_passport_in_de" = "German";
|
||||
@@ -64,7 +64,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"cloud_lng_translate_to_ar" = "Arabic";
|
||||
"cloud_lng_translate_to_az" = "Azerbaijani";
|
||||
"cloud_lng_translate_to_bg" = "Bulgarian";
|
||||
// "cloud_lng_translate_to_bn" = "Bangla";
|
||||
// "cloud_lng_translate_to_bn" = "Bengali";
|
||||
"cloud_lng_translate_to_cs" = "Czech";
|
||||
"cloud_lng_translate_to_da" = "Danish";
|
||||
"cloud_lng_translate_to_de" = "German";
|
||||
@@ -109,50 +109,116 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"cloud_lng_translate_to_uz" = "Uzbek";
|
||||
"cloud_lng_translate_to_vi" = "Vietnamese";
|
||||
|
||||
"cloud_lng_language_af" = "Afrikaans";
|
||||
"cloud_lng_language_am" = "Amharic";
|
||||
"cloud_lng_language_ar" = "Arabic";
|
||||
"cloud_lng_language_az" = "Azerbaijani";
|
||||
"cloud_lng_language_be" = "Belarusian";
|
||||
"cloud_lng_language_bg" = "Bulgarian";
|
||||
// "cloud_lng_language_bn" = "Bangla";
|
||||
"cloud_lng_language_bn" = "Bengali";
|
||||
"cloud_lng_language_bs" = "Bosnian";
|
||||
"cloud_lng_language_ca" = "Catalan";
|
||||
// "cloud_lng_language_ceb" = "Cebuano";
|
||||
"cloud_lng_language_co" = "Corsican";
|
||||
"cloud_lng_language_cs" = "Czech";
|
||||
"cloud_lng_language_cy" = "Welsh";
|
||||
"cloud_lng_language_da" = "Danish";
|
||||
"cloud_lng_language_de" = "German";
|
||||
// "cloud_lng_language_dv" = "Divehi";
|
||||
// "cloud_lng_language_dz" = "Dzongkha";
|
||||
"cloud_lng_language_dv" = "Divehi";
|
||||
"cloud_lng_language_dz" = "Dzongkha";
|
||||
"cloud_lng_language_el" = "Greek";
|
||||
"cloud_lng_language_en" = "English";
|
||||
"cloud_lng_language_eo" = "Esperanto";
|
||||
"cloud_lng_language_es" = "Spanish";
|
||||
"cloud_lng_language_et" = "Estonian";
|
||||
"cloud_lng_language_eu" = "Basque";
|
||||
"cloud_lng_language_fa" = "Persian";
|
||||
"cloud_lng_language_fi" = "Finnish";
|
||||
"cloud_lng_language_fr" = "French";
|
||||
"cloud_lng_language_fy" = "Frisian";
|
||||
"cloud_lng_language_ga" = "Irish";
|
||||
"cloud_lng_language_gd" = "Scots Gaelic";
|
||||
"cloud_lng_language_gl" = "Galician";
|
||||
"cloud_lng_language_gu" = "Gujarati";
|
||||
"cloud_lng_language_ha" = "Hausa";
|
||||
"cloud_lng_language_haw" = "Hawaiian";
|
||||
"cloud_lng_language_he" = "Hebrew";
|
||||
"cloud_lng_language_hi" = "Hindi";
|
||||
// "cloud_lng_language_hmn" = "Hmong";
|
||||
"cloud_lng_language_hr" = "Croatian";
|
||||
"cloud_lng_language_ht" = "Haitian Creole";
|
||||
"cloud_lng_language_hu" = "Hungarian";
|
||||
"cloud_lng_language_hy" = "Armenian";
|
||||
"cloud_lng_language_id" = "Indonesian";
|
||||
"cloud_lng_language_ig" = "Igbo";
|
||||
"cloud_lng_language_is" = "Icelandic";
|
||||
"cloud_lng_language_it" = "Italian";
|
||||
"cloud_lng_language_iw" = "Hebrew (Obsolete code)";
|
||||
"cloud_lng_language_ja" = "Japanese";
|
||||
"cloud_lng_language_jv" = "Javanese";
|
||||
"cloud_lng_language_ka" = "Georgian";
|
||||
// "cloud_lng_language_km" = "Khmer";
|
||||
"cloud_lng_language_kk" = "Kazakh";
|
||||
"cloud_lng_language_km" = "Khmer";
|
||||
"cloud_lng_language_kn" = "Kannada";
|
||||
"cloud_lng_language_ko" = "Korean";
|
||||
"cloud_lng_language_ku" = "Kurdish";
|
||||
"cloud_lng_language_ky" = "Kyrgyz";
|
||||
"cloud_lng_language_la" = "Latin";
|
||||
"cloud_lng_language_lb" = "Luxembourgish";
|
||||
"cloud_lng_language_lo" = "Lao";
|
||||
"cloud_lng_language_lt" = "Lithuanian";
|
||||
"cloud_lng_language_lv" = "Latvian";
|
||||
"cloud_lng_language_mg" = "Malagasy";
|
||||
"cloud_lng_language_mi" = "Maori";
|
||||
"cloud_lng_language_mk" = "Macedonian";
|
||||
"cloud_lng_language_ml" = "Malayalam";
|
||||
"cloud_lng_language_mn" = "Mongolian";
|
||||
"cloud_lng_language_mr" = "Marathi";
|
||||
"cloud_lng_language_ms" = "Malay";
|
||||
"cloud_lng_language_mt" = "Maltese";
|
||||
"cloud_lng_language_my" = "Burmese";
|
||||
"cloud_lng_language_ne" = "Nepali";
|
||||
"cloud_lng_language_nl" = "Dutch";
|
||||
"cloud_lng_language_no" = "Norwegian";
|
||||
"cloud_lng_language_ny" = "Nyanja";
|
||||
"cloud_lng_language_or" = "Odia (Oriya)";
|
||||
"cloud_lng_language_pa" = "Punjabi";
|
||||
"cloud_lng_language_pl" = "Polish";
|
||||
"cloud_lng_language_ps" = "Pashto";
|
||||
"cloud_lng_language_pt" = "Portuguese";
|
||||
"cloud_lng_language_ro" = "Romanian";
|
||||
"cloud_lng_language_ru" = "Russian";
|
||||
"cloud_lng_language_rw" = "Kinyarwanda";
|
||||
"cloud_lng_language_sd" = "Sindhi";
|
||||
"cloud_lng_language_si" = "Sinhala";
|
||||
"cloud_lng_language_sk" = "Slovak";
|
||||
"cloud_lng_language_sl" = "Slovenian";
|
||||
"cloud_lng_language_sm" = "Samoan";
|
||||
"cloud_lng_language_sn" = "Shona";
|
||||
"cloud_lng_language_so" = "Somali";
|
||||
"cloud_lng_language_sq" = "Albanian";
|
||||
"cloud_lng_language_sr" = "Serbian";
|
||||
"cloud_lng_language_st" = "Sesotho";
|
||||
"cloud_lng_language_su" = "Sundanese";
|
||||
"cloud_lng_language_sv" = "Swedish";
|
||||
"cloud_lng_language_sw" = "Swahili";
|
||||
"cloud_lng_language_ta" = "Tamil";
|
||||
"cloud_lng_language_te" = "Telugu";
|
||||
"cloud_lng_language_tg" = "Tajik";
|
||||
"cloud_lng_language_th" = "Thai";
|
||||
"cloud_lng_language_tk" = "Turkmen";
|
||||
"cloud_lng_language_tl" = "Tagalog";
|
||||
"cloud_lng_language_tr" = "Turkish";
|
||||
"cloud_lng_language_tt" = "Tatar";
|
||||
"cloud_lng_language_ug" = "Uyghur";
|
||||
"cloud_lng_language_uk" = "Ukrainian";
|
||||
"cloud_lng_language_ur" = "Urdu";
|
||||
"cloud_lng_language_uz" = "Uzbek";
|
||||
"cloud_lng_language_vi" = "Vietnamese";
|
||||
"cloud_lng_language_xh" = "Xhosa";
|
||||
"cloud_lng_language_yi" = "Yiddish";
|
||||
"cloud_lng_language_yo" = "Yoruba";
|
||||
"cloud_lng_language_zh" = "Chinese";
|
||||
// "cloud_lng_language_zh-CN" = "Chinese (Simplified)";
|
||||
// "cloud_lng_language_zh-TW" = "Chinese (Traditional)";
|
||||
"cloud_lng_language_zu" = "Zulu";
|
||||
|
||||
@@ -164,11 +164,13 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_chat_status_members_online" = "{members_count}, {online_count}";
|
||||
"lng_chat_status_subscribers#one" = "{count} subscriber";
|
||||
"lng_chat_status_subscribers#other" = "{count} subscribers";
|
||||
"lng_chat_status_direct" = "Direct messages";
|
||||
|
||||
"lng_channel_status" = "channel";
|
||||
"lng_group_status" = "group";
|
||||
"lng_scam_badge" = "SCAM";
|
||||
"lng_fake_badge" = "FAKE";
|
||||
"lng_direct_badge" = "DIRECT";
|
||||
|
||||
"lng_remember" = "Remember this choice";
|
||||
|
||||
@@ -681,6 +683,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_shortcuts_archive_chat" = "Archive chat";
|
||||
"lng_shortcuts_media_fullscreen" = "Toggle video fullscreen";
|
||||
"lng_shortcuts_show_chat_menu" = "Show chat menu";
|
||||
"lng_shortcuts_show_chat_preview" = "Show chat preview";
|
||||
|
||||
"lng_settings_chat_reactions_title" = "Quick Reaction";
|
||||
"lng_settings_chat_reactions_subtitle" = "Choose your favorite reaction";
|
||||
@@ -835,6 +838,19 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_settings_disconnect" = "Disconnect";
|
||||
"lng_settings_connected_title" = "Connected websites";
|
||||
|
||||
"lng_settings_suggestion_phone_number_title" = "Is {phone} still your number?";
|
||||
"lng_settings_suggestion_phone_number_about" = "Keep your number up to date to ensure you can always log into Telegram. {link}";
|
||||
"lng_settings_suggestion_phone_number_about_link" = "https://telegram.org/faq#q-i-have-a-new-phone-number-what-do-i-do";
|
||||
"lng_settings_suggestion_phone_number_change" = "Please change your phone number in the official Telegram app on your phone as soon as possible. {emoji}";
|
||||
"lng_settings_suggestion_password_title" = "Your password";
|
||||
"lng_settings_suggestion_password_about" = "Your account is protected by 2-Step Veritifaction. Do you still remember your password?";
|
||||
"lng_settings_suggestion_password_yes" = "Yes, definitely";
|
||||
"lng_settings_suggestion_password_no" = "Not sure";
|
||||
"lng_settings_suggestion_password_step_input_title" = "Enter your password";
|
||||
"lng_settings_suggestion_password_step_input_about" = "Do you still remember your password?";
|
||||
"lng_settings_suggestion_password_step_finish_title" = "Perfect!";
|
||||
"lng_settings_suggestion_password_step_finish_about" = "You still remember your password.";
|
||||
|
||||
"lng_settings_power_menu" = "Battery and Animations";
|
||||
"lng_settings_power_title" = "Power Usage";
|
||||
"lng_settings_power_subtitle" = "Power saving options";
|
||||
@@ -881,6 +897,18 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_settings_cloud_password_email_confirm" = "Confirm and Finish";
|
||||
"lng_settings_cloud_password_reset_in" = "You can reset your password in {duration}.";
|
||||
|
||||
"lng_settings_cloud_login_email_section_title" = "Login Email";
|
||||
"lng_settings_cloud_login_email_box_about" = "This email address will be used every time you log in to your Telegram account from a new device.";
|
||||
"lng_settings_cloud_login_email_box_ok" = "Change email";
|
||||
"lng_settings_cloud_login_email_title" = "Enter New Email";
|
||||
"lng_settings_cloud_login_email_placeholder" = "Enter Login Email";
|
||||
"lng_settings_cloud_login_email_about" = "You will receive Telegram login codes via email and not SMS. Please enter an email address to which you have access.";
|
||||
"lng_settings_cloud_login_email_confirm" = "Confirm";
|
||||
"lng_settings_cloud_login_email_code_title" = "Check Your New Email";
|
||||
"lng_settings_cloud_login_email_code_about" = "Please enter the code we have sent to your new email {email}";
|
||||
"lng_settings_cloud_login_email_success" = "Your email has been changed.";
|
||||
"lng_settings_error_email_not_alowed" = "Sorry, this email is not allowed";
|
||||
|
||||
"lng_settings_ttl_title" = "Auto-Delete Messages";
|
||||
"lng_settings_ttl_about" = "Automatically delete messages for everyone after a period of time in all new chats you start.";
|
||||
"lng_settings_ttl_after" = "After {after_duration}";
|
||||
@@ -1134,6 +1162,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_proxy_menu_delete" = "Delete";
|
||||
"lng_proxy_menu_restore" = "Restore";
|
||||
"lng_proxy_edit_share" = "Share";
|
||||
"lng_proxy_edit_share_qr_box_title" = "Share proxy with QR code";
|
||||
"lng_proxy_edit_share_list_button" = "Share Proxy List";
|
||||
"lng_proxy_edit_share_list_toast" = "Proxy List copied to clipboard.";
|
||||
"lng_proxy_address_label" = "Socket address";
|
||||
"lng_proxy_credentials_optional" = "Credentials (optional)";
|
||||
"lng_proxy_credentials" = "Credentials";
|
||||
@@ -1172,6 +1203,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_settings_faq_link" = "https://telegram.org/faq#general-questions";
|
||||
"lng_settings_features" = "Telegram Features";
|
||||
"lng_settings_credits" = "My Stars";
|
||||
"lng_settings_currency" = "My TON";
|
||||
"lng_settings_logout" = "Log out";
|
||||
"lng_sure_logout" = "Are you sure you want to log out?";
|
||||
|
||||
@@ -1179,6 +1211,33 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_settings_restart_now" = "Restart";
|
||||
"lng_settings_restart_later" = "Later";
|
||||
|
||||
"lng_settings_quick_dialog_action_title" = "Chat list quick action";
|
||||
"lng_settings_quick_dialog_action_about" = "Choose the action you want to perform when you middle-click or swipe left in the chat list.";
|
||||
"lng_settings_quick_dialog_action_both" = "Swipe left and Middle-click";
|
||||
"lng_settings_quick_dialog_action_swipe" = "Swipe left";
|
||||
"lng_settings_quick_dialog_action_mute" = "Mute";
|
||||
"lng_settings_quick_dialog_action_unmute" = "Unmute";
|
||||
"lng_settings_quick_dialog_action_pin" = "Pin";
|
||||
"lng_settings_quick_dialog_action_unpin" = "Unpin";
|
||||
"lng_settings_quick_dialog_action_read" = "Read";
|
||||
"lng_settings_quick_dialog_action_unread" = "Unread";
|
||||
"lng_settings_quick_dialog_action_archive" = "Archive";
|
||||
"lng_settings_quick_dialog_action_unarchive" = "Unarchive";
|
||||
"lng_settings_quick_dialog_action_delete" = "Delete";
|
||||
"lng_settings_quick_dialog_action_disabled" = "Change folder";
|
||||
|
||||
"lng_quick_dialog_action_toast_mute_success" = "Notifications for this chat have been muted.";
|
||||
"lng_quick_dialog_action_toast_unmute_success" = "Notifications enabled for this chat.";
|
||||
"lng_quick_dialog_action_toast_pin_success" = "The chat has been pinned.";
|
||||
"lng_quick_dialog_action_toast_unpin_success" = "The chat has been unpinned.";
|
||||
"lng_quick_dialog_action_toast_read_success" = "The chat has been marked as read.";
|
||||
"lng_quick_dialog_action_toast_unread_success" = "The chat has been marked as unread.";
|
||||
"lng_quick_dialog_action_toast_archive_success" = "The chat has been archived.";
|
||||
"lng_quick_dialog_action_toast_unarchive_success" = "The chat has been unarchived.";
|
||||
|
||||
"lng_settings_generic_subscribe" = "Subscribe to {link} to use this setting.";
|
||||
"lng_settings_generic_subscribe_link" = "Telegram Premium";
|
||||
|
||||
"lng_sessions_header" = "This device";
|
||||
"lng_sessions_other_header" = "Active Devices";
|
||||
"lng_sessions_other_desc" = "You can log in to Telegram from other mobile, tablet and desktop devices, using the same phone number. All your data will be instantly synchronized.";
|
||||
@@ -1294,6 +1353,16 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_edit_privacy_gifts_always_title" = "Always allow";
|
||||
"lng_edit_privacy_gifts_never_title" = "Never allow";
|
||||
|
||||
"lng_edit_privacy_gifts_types" = "Accepted Gift Types";
|
||||
"lng_edit_privacy_gifts_premium" = "Premium Subscriptions";
|
||||
"lng_edit_privacy_gifts_unlimited" = "Unlimited";
|
||||
"lng_edit_privacy_gifts_limited" = "Limited-Edition";
|
||||
"lng_edit_privacy_gifts_unique" = "Unique";
|
||||
"lng_edit_privacy_gifts_types_about" = "Choose the types of gifts that you accept.";
|
||||
"lng_edit_privacy_gifts_show_icon" = "Show Gift Icon in Chats";
|
||||
"lng_edit_privacy_gifts_show_icon_about" = "Display the {emoji}Gift icon in the message input field for both participants in all chats.";
|
||||
"lng_edit_privacy_gifts_restricted" = "This user doesn't accept gifts.";
|
||||
|
||||
"lng_edit_privacy_calls_title" = "Calls";
|
||||
"lng_edit_privacy_calls_header" = "Who can call me";
|
||||
"lng_edit_privacy_calls_always_empty" = "Always allow";
|
||||
@@ -1426,6 +1495,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_profile_hide_participants_about" = "Switch this on to hide the list of members in this group. Admins will remain visible.";
|
||||
"lng_profile_view_channel" = "View Channel";
|
||||
"lng_profile_view_discussion" = "View discussion";
|
||||
"lng_profile_direct_messages" = "Direct messages";
|
||||
"lng_profile_join_channel" = "Join Channel";
|
||||
"lng_profile_join_group" = "Join Group";
|
||||
"lng_profile_apply_to_join_group" = "Apply to Join Group";
|
||||
@@ -1823,6 +1893,14 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_manage_linked_channel_posted" = "All new posts from this channel are forwarded to the group.";
|
||||
"lng_manage_discussion_group_warning" = "\"Chat history for new members\" will be switched to **Visible**.";
|
||||
|
||||
"lng_manage_monoforum" = "Direct Messages";
|
||||
"lng_manage_monoforum_off" = "Off";
|
||||
"lng_manage_monoforum_free" = "Free";
|
||||
"lng_manage_monoforum_allow" = "Allow Channel Messages";
|
||||
"lng_manage_monoforum_price" = "Price for each message";
|
||||
"lng_manage_monoforum_about" = "Allow users to send messages to your channel, with the option to charge a fee for each message.";
|
||||
"lng_manage_monoforum_price_about" = "Your channel will receive {percent} of the selected fee ({amount}) for each incoming message.";
|
||||
|
||||
"lng_manage_history_visibility_title" = "Chat history for new members";
|
||||
"lng_manage_history_visibility_shown" = "Visible";
|
||||
"lng_manage_history_visibility_shown_about" = "New members will see messages that were sent before they joined.";
|
||||
@@ -2006,6 +2084,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_action_changed_title" = "{from} changed group name to «{title}»";
|
||||
"lng_action_changed_title_channel" = "Channel name was changed to «{title}»";
|
||||
"lng_action_created_chat" = "{from} created the group «{title}»";
|
||||
"lng_action_created_monoforum" = "Direct messages were enabled in this channel.";
|
||||
"lng_action_ttl_changed" = "{from} set messages to auto-delete in {duration}";
|
||||
"lng_action_ttl_changed_you" = "You set messages to auto-delete in {duration}";
|
||||
"lng_action_ttl_changed_channel" = "Messages in this channel will be automatically deleted after {duration}";
|
||||
@@ -2113,6 +2192,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_action_gift_premium_months#other" = "{count} Months Premium";
|
||||
"lng_action_gift_premium_about" = "Subscription for exclusive Telegram features.";
|
||||
"lng_action_gift_refunded" = "This gift was downgraded because a request to refund the payment related to this gift was made, and the money was returned.";
|
||||
"lng_action_gift_got_ton" = "Use TON to suggest posts to channels.";
|
||||
"lng_action_suggested_photo_me" = "You suggested this photo for {user}'s Telegram profile.";
|
||||
"lng_action_suggested_photo" = "{user} suggests this photo for your Telegram profile.";
|
||||
"lng_action_suggested_photo_button" = "View Photo";
|
||||
@@ -2173,9 +2253,40 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_action_paid_message_some#other" = "send {count} messages";
|
||||
"lng_action_paid_message_got#one" = "You received {count} Star from {name}";
|
||||
"lng_action_paid_message_got#other" = "You received {count} Stars from {name}";
|
||||
"lng_action_paid_message_refund#one" = "{from} refunded {count} Star to you";
|
||||
"lng_action_paid_message_refund#other" = "{from} refunded {count} Stars to you";
|
||||
"lng_action_paid_message_refund_self#one" = "You refunded {count} Star to {name}";
|
||||
"lng_action_paid_message_refund_self#other" = "You refunded {count} Stars to {name}";
|
||||
"lng_action_message_price_free" = "Messages are now free in this group.";
|
||||
"lng_action_message_price_paid#one" = "Messages now cost {count} Star each in this group.";
|
||||
"lng_action_message_price_paid#other" = "Messages now cost {count} Stars each in this group.";
|
||||
"lng_action_direct_messages_enabled" = "Channel enabled Direct Messages.";
|
||||
"lng_action_direct_messages_paid#one" = "Channel allows Direct Messages for {count} Star each.";
|
||||
"lng_action_direct_messages_paid#other" = "Channel allows Direct Messages for {count} Stars each.";
|
||||
"lng_action_direct_messages_disabled" = "Channel disabled Direct Messages.";
|
||||
"lng_action_todo_marked_done" = "{from} marked {tasks} as done.";
|
||||
"lng_action_todo_marked_done_self" = "You marked {tasks} as done.";
|
||||
"lng_action_todo_marked_not_done" = "{from} marked {tasks} as not done.";
|
||||
"lng_action_todo_marked_not_done_self" = "You marked {tasks} as not done.";
|
||||
"lng_action_todo_added" = "{from} added {tasks} to the list.";
|
||||
"lng_action_todo_added_self" = "You added {tasks} to the list.";
|
||||
"lng_action_todo_tasks_fallback#one" = "task";
|
||||
"lng_action_todo_tasks_fallback#other" = "{count} tasks";
|
||||
"lng_action_todo_tasks_and_one" = "{tasks}, {task}";
|
||||
"lng_action_todo_tasks_and_last" = "{tasks} and {task}";
|
||||
"lng_action_suggest_success_stars#one" = "{from} has received {count} Star for publishing post.";
|
||||
"lng_action_suggest_success_stars#other" = "{from} has received {count} Stars for publishing post.";
|
||||
"lng_action_suggest_success_ton#one" = "{from} has received {count} TON for publishing post.";
|
||||
"lng_action_suggest_success_ton#other" = "{from} has received {count} TON for publishing post.";
|
||||
"lng_action_suggest_refund_user" = "User refunded the Stars so that post was deleted.";
|
||||
"lng_action_suggest_refund_admin" = "Admin deleted the post early so that the price was refunded to the user.";
|
||||
"lng_action_post_rejected" = "The post was rejected.";
|
||||
"lng_action_not_enough_funds" = "Transaction failed.";
|
||||
"lng_you_paid_stars#one" = "You paid {count} Star.";
|
||||
"lng_you_paid_stars#other" = "You paid {count} Stars.";
|
||||
|
||||
"lng_you_joined_group" = "You joined this group";
|
||||
|
||||
"lng_similar_channels_title" = "Similar channels";
|
||||
"lng_similar_channels_view_all" = "View all";
|
||||
"lng_similar_channels_more" = "More Channels";
|
||||
@@ -2192,6 +2303,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_peer_gifts_title" = "Gifts";
|
||||
"lng_peer_gifts_about" = "These gifts were sent to {user} by other users.";
|
||||
"lng_peer_gifts_about_mine" = "These gifts were sent to you by other users. Click on a gift to convert it to Stars or change its privacy settings.";
|
||||
"lng_peer_gifts_empty_search" = "No matching gifts";
|
||||
"lng_peer_gifts_view_all" = "View All Gifts";
|
||||
"lng_peer_gifts_notify" = "Notify About New Gifts";
|
||||
"lng_peer_gifts_notify_enabled" = "You will receive a message from Telegram when your channel receives a gift.";
|
||||
"lng_peer_gifts_filter_by_value" = "Sort by Value";
|
||||
@@ -2536,6 +2649,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_premium_summary_about_effects" = "Add over 500 animated effects to private messages.";
|
||||
"lng_premium_summary_subtitle_filter_tags" = "Tag Your Chats";
|
||||
"lng_premium_summary_about_filter_tags" = "Display folder names for each chat in the chat list.";
|
||||
"lng_premium_summary_subtitle_todo_lists" = "Checklists";
|
||||
"lng_premium_summary_about_todo_lists" = "Plan, assign, and complete tasks - seamlessly and efficiently.";
|
||||
"lng_premium_summary_bottom_subtitle" = "About Telegram Premium";
|
||||
"lng_premium_summary_bottom_about" = "While the free version of Telegram already gives its users more than any other messaging application, **Telegram Premium** pushes its capabilities even further.\n\n**Telegram Premium** is a paid option, because most Premium Features require additional expenses from Telegram to third parties such as data center providers and server manufacturers. Contributions from **Telegram Premium** users allow us to cover such costs and also help Telegram stay free for everyone.";
|
||||
"lng_premium_summary_button" = "Subscribe for {cost} per month";
|
||||
@@ -2666,6 +2781,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
|
||||
"lng_credits_summary_title" = "Telegram Stars";
|
||||
"lng_credits_summary_about" = "Buy Stars to unlock content and services in miniapps on Telegram.";
|
||||
"lng_credits_currency_summary_title" = "TON Balance";
|
||||
"lng_credits_currency_summary_about" = "Offer TON to submit post suggestions to channels on Telegram.";
|
||||
"lng_credits_currency_summary_subtitle" = "You can withdraw your TON using Fragment.";
|
||||
"lng_credits_currency_summary_in_button" = "Top-up via Fragment";
|
||||
"lng_credits_currency_summary_in_subtitle" = "You can top-up your TON balance via Fragment.";
|
||||
"lng_credits_summary_options_subtitle" = "Choose package";
|
||||
"lng_credits_summary_options_credits#one" = "{count} Star";
|
||||
"lng_credits_summary_options_credits#other" = "{count} Stars";
|
||||
@@ -2689,8 +2809,14 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_credits_premium_gift_duration" = "Duration";
|
||||
"lng_credits_more_options" = "More Options";
|
||||
"lng_credits_balance_me" = "your balance";
|
||||
"lng_credits_buy_button" = "Buy More Stars";
|
||||
"lng_credits_balance_me_count" = "Your balance: {emoji} {amount}";
|
||||
"lng_credits_buy_button" = "Top Up Balance";
|
||||
"lng_credits_topup_button" = "{emoji} Top Up Balance";
|
||||
"lng_credits_buy_button_short" = "Top Up";
|
||||
"lng_credits_stats_button_short" = "Stats";
|
||||
"lng_credits_stats_button" = "View Statistics";
|
||||
"lng_credits_gift_button" = "Gift Stars to Friends";
|
||||
"lng_credits_earn_button" = "Earn Stars from Mini Apps";
|
||||
"lng_credits_box_out_title" = "Confirm Your Purchase";
|
||||
"lng_credits_box_out_sure#one" = "Do you want to buy **\"{text}\"** in **{bot}** for **{count} Star**?";
|
||||
"lng_credits_box_out_sure#other" = "Do you want to buy **\"{text}\"** in **{bot}** for **{count} Stars**?";
|
||||
@@ -2744,6 +2870,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_credits_box_history_entry_gift_examples" = "Examples";
|
||||
"lng_credits_box_history_entry_ads" = "Ads Platform";
|
||||
"lng_credits_box_history_entry_premium_bot" = "Stars Top-Up";
|
||||
"lng_credits_box_history_entry_currency_in" = "TON Top-Up";
|
||||
"lng_credits_box_history_entry_api" = "Paid Broadcast";
|
||||
"lng_credits_box_history_entry_floodskip_about#one" = "{count} Message";
|
||||
"lng_credits_box_history_entry_floodskip_about#other" = "{count} Messages";
|
||||
@@ -2764,6 +2891,11 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_credits_box_history_entry_reaction_name" = "Star Reaction";
|
||||
"lng_credits_box_history_entry_subscription" = "Monthly subscription fee";
|
||||
"lng_credits_box_history_entry_gift_upgrade" = "Collectible Upgrade";
|
||||
"lng_credits_box_history_entry_gift_sold" = "Gift Sale";
|
||||
"lng_credits_box_history_entry_gift_bought" = "Gift Purchase";
|
||||
"lng_credits_box_history_entry_gift_sold_to" = "To";
|
||||
"lng_credits_box_history_entry_gift_full_price" = "Full Price";
|
||||
"lng_credits_box_history_entry_gift_bought_from" = "From";
|
||||
|
||||
"lng_credits_subscription_section" = "My subscriptions";
|
||||
"lng_credits_box_subscription_title" = "Subscription";
|
||||
@@ -2802,6 +2934,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_credits_small_balance_star_gift" = "Buy **Stars** to send gifts to {user} and other contacts.";
|
||||
"lng_credits_small_balance_for_message" = "Buy **Stars** to send messages to {user}.";
|
||||
"lng_credits_small_balance_for_messages" = "Buy **Stars** to send messages.";
|
||||
"lng_credits_small_balance_for_suggest" = "Buy **Stars** to suggest post to {channel}.";
|
||||
"lng_credits_small_balance_fallback" = "Buy **Stars** to unlock content and services on Telegram.";
|
||||
"lng_credits_purchase_blocked" = "Sorry, you can't purchase this item with Telegram Stars.";
|
||||
"lng_credits_enough" = "You have enough stars at the moment. {link}";
|
||||
@@ -2906,8 +3039,34 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_chatbots_include_button" = "Select Chats";
|
||||
"lng_chatbots_exclude_about" = "Select chats or entire chat categories which the bot will not have access to.";
|
||||
"lng_chatbots_permissions_title" = "Bot permissions";
|
||||
"lng_chatbots_warning_title" = "Warning";
|
||||
"lng_chatbots_warning_both_text" = "The bot {bot} will be able to **manage your gifts and stars**, including giving them away to other users.";
|
||||
"lng_chatbots_warning_gifts_text" = "The bot {bot} will be able to **manage your gifts**, including giving them away to other users.";
|
||||
"lng_chatbots_warning_stars_text" = "The bot {bot} will be able to **transfer your stars**.";
|
||||
"lng_chatbots_warning_username_text" = "The bot {bot} will be able to **set and remove usernames** for your account, which may result in the loss of your current username.";
|
||||
|
||||
"lng_chatbots_manage_messages" = "Manage Messages";
|
||||
"lng_chatbots_read" = "Read Messages";
|
||||
"lng_chatbots_reply" = "Reply to Messages";
|
||||
"lng_chatbots_reply_about" = "The bot can only reply on your behalf in chats that were active during the last 24h.";
|
||||
"lng_chatbots_mark_as_read" = "Mark Messages as Read";
|
||||
"lng_chatbots_delete_sent" = "Delete Sent Messages";
|
||||
"lng_chatbots_delete_received" = "Delete Received Messages";
|
||||
|
||||
"lng_chatbots_manage_profile" = "Manage Profile";
|
||||
"lng_chatbots_edit_name" = "Edit Name";
|
||||
"lng_chatbots_edit_bio" = "Edit Bio";
|
||||
"lng_chatbots_edit_userpic" = "Edit Profile Picture";
|
||||
"lng_chatbots_edit_username" = "Edit Username";
|
||||
|
||||
"lng_chatbots_manage_gifts" = "Manage Gifts and Stars";
|
||||
"lng_chatbots_view_gifts" = "View Gifts";
|
||||
"lng_chatbots_sell_gifts" = "Sell Gifts";
|
||||
"lng_chatbots_gift_settings" = "Change Gift Settings";
|
||||
"lng_chatbots_transfer_gifts" = "Transfer and Upgrade Gifts";
|
||||
"lng_chatbots_transfer_stars" = "Transfer Stars";
|
||||
|
||||
"lng_chatbots_manage_stories" = "Manage Stories";
|
||||
|
||||
"lng_chatbots_remove" = "Remove Bot";
|
||||
"lng_chatbots_not_found" = "Chatbot not found.";
|
||||
"lng_chatbots_not_supported" = "This bot doesn't support Telegram Business yet.";
|
||||
@@ -3075,6 +3234,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_boost_group_ask" = "Ask your **Premium** members to boost your group with this link:";
|
||||
//"lng_boost_group_gifting" = "Boost your group by gifting your members Telegram Premium. {link}";
|
||||
|
||||
"lng_boost_channel_title_autotranslate" = "Autotranslation of Messages";
|
||||
"lng_boost_channel_needs_level_autotranslate#one" = "Your channel needs to reach **Level {count}** to enable autotranslation of messages.";
|
||||
"lng_boost_channel_needs_level_autotranslate#other" = "Your channel needs to reach **Level {count}** to enable autotranslation of messages.";
|
||||
|
||||
"lng_feature_stories#one" = "**{count}** Story Per Day";
|
||||
"lng_feature_stories#other" = "**{count}** Stories Per Day";
|
||||
"lng_feature_reactions#one" = "**{count}** Custom Reaction";
|
||||
@@ -3093,6 +3256,14 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_feature_custom_background_group" = "Custom Group Background";
|
||||
"lng_feature_custom_emoji_pack" = "Custom Emoji Pack";
|
||||
"lng_feature_transcribe" = "Voice-to-Text Conversion";
|
||||
"lng_feature_autotranslate" = "Autotranslation of Messages";
|
||||
|
||||
"lng_edit_topics_enable" = "Enable Topics";
|
||||
"lng_edit_topics_about" = "The group chat will be divided into topics created by admins or users.";
|
||||
"lng_edit_topics_layout" = "Topics layout";
|
||||
"lng_edit_topics_layout_about" = "Choose how topics appear for all members.";
|
||||
"lng_edit_topics_tabs" = "Tabs";
|
||||
"lng_edit_topics_list" = "List";
|
||||
|
||||
"lng_giveaway_new_title" = "Boosts via Gifts";
|
||||
"lng_giveaway_new_about" = "Get more boosts for your channel by gifting Premium to your subscribers.";
|
||||
@@ -3330,6 +3501,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_gift_stars_incoming" = "Use Stars to unlock content and services on Telegram.";
|
||||
"lng_gift_until" = "Until";
|
||||
|
||||
"lng_gift_ton_amount#one" = "{count} TON";
|
||||
"lng_gift_ton_amount#other" = "{count} TON";
|
||||
|
||||
"lng_gift_premium_or_stars" = "Gift Premium or Stars";
|
||||
"lng_gift_premium_subtitle" = "Gift Premium";
|
||||
"lng_gift_premium_about" = "Give {name} access to exclusive features with Telegram Premium. {features}";
|
||||
@@ -3341,9 +3515,13 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_gift_stars_link" = "What are Stars >";
|
||||
"lng_gift_stars_limited" = "limited";
|
||||
"lng_gift_stars_sold_out" = "sold out";
|
||||
"lng_gift_stars_resale" = "resale";
|
||||
"lng_gift_stars_on_sale" = "on sale";
|
||||
"lng_gift_stars_tabs_all" = "All Gifts";
|
||||
"lng_gift_stars_tabs_my" = "My Gifts";
|
||||
"lng_gift_stars_tabs_limited" = "Limited";
|
||||
"lng_gift_stars_tabs_in_stock" = "In Stock";
|
||||
"lng_gift_stars_tabs_resale" = "Resale";
|
||||
"lng_gift_send_title" = "Send a Gift";
|
||||
"lng_gift_send_message" = "Enter Message";
|
||||
"lng_gift_send_anonymous" = "Hide My Name";
|
||||
@@ -3365,13 +3543,20 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_gift_send_limited_left#other" = "{count} left";
|
||||
"lng_gift_send_button" = "Send a Gift for {cost}";
|
||||
"lng_gift_send_button_self" = "Buy a Gift for {cost}";
|
||||
"lng_gift_buy_resale_title" = "Buy {name}";
|
||||
"lng_gift_buy_resale_button" = "Buy for {cost}";
|
||||
"lng_gift_buy_resale_confirm" = "Do you want to buy {name} for {price} and gift it to {user}?";
|
||||
"lng_gift_buy_resale_confirm_self" = "Do you want to buy {name} for {price}?";
|
||||
"lng_gift_buy_price_change_title" = "Price change!";
|
||||
"lng_gift_buy_price_change_text" = "This gift price was changed and now is {price}. Do you still want to buy?";
|
||||
"lng_gift_sent_title" = "Gift Sent!";
|
||||
"lng_gift_sent_resale_done" = "{user} has been notified about your gift.";
|
||||
"lng_gift_sent_resale_done_self" = "{gift} is now yours.";
|
||||
"lng_gift_sent_about#one" = "You spent **{count}** Star from your balance.";
|
||||
"lng_gift_sent_about#other" = "You spent **{count}** Stars from your balance.";
|
||||
"lng_gift_limited_of_one" = "unique";
|
||||
"lng_gift_limited_of_count" = "1 of {amount}";
|
||||
"lng_gift_collectible_tag" = "gift";
|
||||
"lng_gift_price_unique" = "Unique";
|
||||
"lng_gift_view_unpack" = "Unpack";
|
||||
"lng_gift_anonymous_hint" = "Only you can see the sender's name.";
|
||||
"lng_gift_anonymous_hint_channel" = "Only admins of this channel can see the sender's name.";
|
||||
@@ -3387,6 +3572,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_gift_show_on_channel" = "Display in channel's Gifts";
|
||||
"lng_gift_availability" = "Availability";
|
||||
"lng_gift_from_hidden" = "Hidden User";
|
||||
"lng_gift_subtitle_birthdays" = "Birthdays";
|
||||
"lng_gift_list_birthday_status_today" = "{emoji} Birthday today";
|
||||
"lng_gift_list_birthday_status_yesterday" = "Birthday yesterday";
|
||||
"lng_gift_list_birthday_status_tomorrow" = "Birthday tomorrow";
|
||||
"lng_gift_self_status" = "buy yourself a gift";
|
||||
"lng_gift_self_title" = "Buy a Gift";
|
||||
"lng_gift_self_about" = "Buy yourself a gift to display on your page or reserve for later.\n\nLimited-edition gifts upgraded to collectibles can be gifted to others later.";
|
||||
@@ -3428,7 +3617,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_gift_display_done_channel" = "The gift is now shown in channel's Gifts.";
|
||||
"lng_gift_display_done_hide" = "The gift is now hidden from your profile page.";
|
||||
"lng_gift_display_done_hide_channel" = "The gift is now hidden from channel's Gifts.";
|
||||
"lng_gift_pinned_done_title" = "{gift} pinned";
|
||||
"lng_gift_pinned_done" = "The gift will always be shown on top.";
|
||||
"lng_gift_pinned_done_replaced" = "replacing {gift}";
|
||||
"lng_gift_got_stars#one" = "You got **{count} Star** for this gift.";
|
||||
"lng_gift_got_stars#other" = "You got **{count} Stars** for this gift.";
|
||||
"lng_gift_channel_got#one" = "Channel got **{count} Star** for this gift.";
|
||||
@@ -3487,6 +3678,23 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_gift_transfer_button_for" = "Transfer for {price}";
|
||||
"lng_gift_transfer_wear" = "Wear";
|
||||
"lng_gift_transfer_take_off" = "Take Off";
|
||||
"lng_gift_transfer_sell" = "Sell";
|
||||
"lng_gift_transfer_update" = "Change Price";
|
||||
"lng_gift_transfer_unlist" = "Unlist";
|
||||
"lng_gift_sell_unlist_title" = "Unlist {name}";
|
||||
"lng_gift_sell_unlist_sure" = "Are you sure you want to unlist your gift?";
|
||||
"lng_gift_sell_title" = "Price in Stars";
|
||||
"lng_gift_sell_placeholder" = "Enter price in Stars";
|
||||
"lng_gift_sell_about" = "You will receive {percent} of the selected amount.";
|
||||
"lng_gift_sell_amount#one" = "You will receive **{count}** Star.";
|
||||
"lng_gift_sell_amount#other" = "You will receive **{count}** Stars.";
|
||||
"lng_gift_sell_min_price#one" = "Minimum price is {count} Star.";
|
||||
"lng_gift_sell_min_price#other" = "Minimum price is {count} Stars.";
|
||||
"lng_gift_sell_put" = "Put for Sale";
|
||||
"lng_gift_sell_update" = "Update the Price";
|
||||
"lng_gift_sell_toast" = "{name} is now for sale!";
|
||||
"lng_gift_sell_updated" = "Sale price for {name} was updated.";
|
||||
"lng_gift_sell_removed" = "{name} is removed from sale.";
|
||||
"lng_gift_menu_show" = "Show";
|
||||
"lng_gift_menu_hide" = "Hide";
|
||||
"lng_gift_wear_title" = "Wear {name}";
|
||||
@@ -3501,6 +3709,29 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_gift_wear_subscribe" = "Subscribe to {link} to wear collectibles.";
|
||||
"lng_gift_wear_start_toast" = "You put on {name}";
|
||||
"lng_gift_wear_end_toast" = "You took off {name}";
|
||||
"lng_gift_many_pinned_title" = "Too Many Pinned Gifts";
|
||||
"lng_gift_many_pinned_choose" = "Select a gift to unpin below";
|
||||
"lng_gift_resale_price" = "Price";
|
||||
"lng_gift_resale_number" = "Number";
|
||||
"lng_gift_resale_date" = "Date";
|
||||
"lng_gift_resale_count#one" = "{count} gift in resale";
|
||||
"lng_gift_resale_count#other" = "{count} gifts in resale";
|
||||
"lng_gift_resale_sort_price" = "Sort by Price";
|
||||
"lng_gift_resale_sort_date" = "Sort by Date";
|
||||
"lng_gift_resale_sort_number" = "Sort by Number";
|
||||
"lng_gift_resale_filter_all" = "Select All";
|
||||
"lng_gift_resale_model" = "Model";
|
||||
"lng_gift_resale_models#one" = "{count} Model";
|
||||
"lng_gift_resale_models#other" = "{count} Models";
|
||||
"lng_gift_resale_backdrop" = "Backdrop";
|
||||
"lng_gift_resale_backdrops#one" = "{count} Backdrop";
|
||||
"lng_gift_resale_backdrops#other" = "{count} Backdrops";
|
||||
"lng_gift_resale_symbol" = "Symbol";
|
||||
"lng_gift_resale_symbols#one" = "{count} Symbol";
|
||||
"lng_gift_resale_symbols#other" = "{count} Symbols";
|
||||
"lng_gift_resale_early" = "You will be able to resell this gift in {duration}.";
|
||||
"lng_gift_transfer_early" = "You will be able to transfer this gift in {duration}.";
|
||||
"lng_gift_resale_transfer_early_title" = "Try Later";
|
||||
|
||||
"lng_accounts_limit_title" = "Limit Reached";
|
||||
"lng_accounts_limit1#one" = "You have reached the limit of **{count}** connected account.";
|
||||
@@ -3599,6 +3830,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_in_dlg_sticker_emoji" = "{emoji} Sticker";
|
||||
"lng_in_dlg_poll" = "Poll";
|
||||
"lng_in_dlg_story" = "Story";
|
||||
"lng_in_dlg_todo_list" = "Checklist";
|
||||
"lng_in_dlg_story_expired" = "Expired story";
|
||||
"lng_in_dlg_media_count#one" = "{count} media";
|
||||
"lng_in_dlg_media_count#other" = "{count} media";
|
||||
@@ -3616,6 +3848,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_restrict_users" = "Restrict users";
|
||||
"lng_delete_all_from_user" = "Delete all from {user}";
|
||||
"lng_delete_all_from_users" = "Delete all from users";
|
||||
"lng_restrict_user#one" = "Restrict user";
|
||||
"lng_restrict_user#other" = "Restrict users";
|
||||
"lng_restrict_user_part" = "Partially restrict this user {emoji}";
|
||||
"lng_restrict_users_part" = "Partially restrict users {emoji}";
|
||||
"lng_restrict_user_full" = "Fully ban this user {emoji}";
|
||||
@@ -3686,7 +3920,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_send_anonymous_ph" = "Send anonymously...";
|
||||
"lng_story_reply_ph" = "Reply privately...";
|
||||
"lng_story_comment_ph" = "Comment story...";
|
||||
"lng_message_paid_ph" = "Message for {amount}";
|
||||
"lng_message_stars_ph#one" = "Message for {count} Star";
|
||||
"lng_message_stars_ph#other" = "Message for {count} Stars";
|
||||
"lng_send_text_no" = "Text not allowed.";
|
||||
"lng_send_text_no_about" = "The admins of this group only allow sending {types}.";
|
||||
"lng_send_text_type_and_last" = "{types} and {last}";
|
||||
@@ -3793,6 +4028,28 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_dialogs_skip_archive_in_search" = "Skip results from archive";
|
||||
"lng_dialogs_show_archive_in_search" = "With results from archive";
|
||||
|
||||
"lng_dialogs_suggestions_birthday_title" = "Add your birthday! 🎂";
|
||||
"lng_dialogs_suggestions_birthday_about" = "Let your contacts know when you’re celebrating.";
|
||||
"lng_dialogs_suggestions_birthday_contact_title" = "It’s {text}'s **birthday** today! 🎂";
|
||||
"lng_dialogs_suggestions_birthday_contact_about" = "Send them a Gift.";
|
||||
"lng_dialogs_suggestions_birthday_contacts_title#one" = "{count} contact have **birthdays** today! 🎂";
|
||||
"lng_dialogs_suggestions_birthday_contacts_title#other" = "{count} contacts have **birthdays** today! 🎂";
|
||||
"lng_dialogs_suggestions_birthday_contacts_about" = "Send them a Gift.";
|
||||
"lng_dialogs_suggestions_birthday_contact_dismiss" = "You can send a Gift later in Settings";
|
||||
"lng_dialogs_suggestions_premium_annual_title" = "Telegram Premium with a {text} discount";
|
||||
"lng_dialogs_suggestions_premium_annual_about" = "Sign up for the annual payment plan for Telegram Premium now to get the discount.";
|
||||
"lng_dialogs_suggestions_premium_upgrade_title" = "Telegram Premium with a {text} discount";
|
||||
"lng_dialogs_suggestions_premium_upgrade_about" = "Upgrade to the annual payment plan for Telegram Premium now to get the discount.";
|
||||
"lng_dialogs_suggestions_premium_restore_title" = "Get Premium back with up to {text} off";
|
||||
"lng_dialogs_suggestions_premium_restore_about" = "Your Telegram Premium has recently expired. Tap here to extend it.";
|
||||
"lng_dialogs_suggestions_premium_grace_title" = "⚠️ Your Premium subscription is expiring!";
|
||||
"lng_dialogs_suggestions_premium_grace_about" = "Don’t lose access to exclusive features.";
|
||||
"lng_dialogs_suggestions_userpics_title" = "Add your photo! 📸";
|
||||
"lng_dialogs_suggestions_userpics_about" = "Help your friends spot you easily.";
|
||||
"lng_dialogs_suggestions_credits_sub_low_title#one" = "{emoji} {count} Star needed for {channels}";
|
||||
"lng_dialogs_suggestions_credits_sub_low_title#other" = "{emoji} {count} Stars needed for {channels}";
|
||||
"lng_dialogs_suggestions_credits_sub_low_about" = "Insufficient funds to cover your subscription.";
|
||||
|
||||
"lng_about_random" = "Send a {emoji} emoji to any chat to try your luck.";
|
||||
"lng_about_random_send" = "Send";
|
||||
|
||||
@@ -4003,6 +4260,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_context_edit_msg" = "Edit";
|
||||
"lng_context_add_factcheck" = "Add Fact Check";
|
||||
"lng_context_edit_factcheck" = "Edit Fact Check";
|
||||
"lng_context_add_offer" = "Add Offer";
|
||||
"lng_context_forward_msg" = "Forward";
|
||||
"lng_context_send_now_msg" = "Send Now";
|
||||
"lng_context_reschedule" = "Reschedule";
|
||||
@@ -4014,6 +4272,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_context_pin_msg" = "Pin";
|
||||
"lng_context_unpin_msg" = "Unpin";
|
||||
"lng_context_cancel_upload" = "Cancel Upload";
|
||||
"lng_context_upload_edit_caption" = "Edit Caption";
|
||||
"lng_context_copy_selected" = "Copy Selected Text";
|
||||
"lng_context_copy_selected_items" = "Copy Selected as Text";
|
||||
"lng_context_forward_selected" = "Forward Selected";
|
||||
@@ -4037,6 +4296,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_context_seen_reacted#other" = "{count} Reacted";
|
||||
"lng_context_seen_reacted_none" = "Nobody Reacted";
|
||||
"lng_context_seen_reacted_all" = "Show All Reactions";
|
||||
"lng_context_sent_by" = "Sent by {user}";
|
||||
"lng_context_set_as_quick" = "Set As Quick";
|
||||
"lng_context_filter_by_tag" = "Filter by Tag";
|
||||
"lng_context_tag_add_name" = "Add Name";
|
||||
@@ -4130,6 +4390,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_sensitive_toast" = "You can update the visibility of sensitive media in **Settings > Chat Settings > Sensitive content**";
|
||||
|
||||
"lng_translate_show_original" = "Show Original";
|
||||
"lng_translate_return_original" = "View Original ({language})";
|
||||
"lng_translate_bar_to" = "Translate to {name}";
|
||||
"lng_translate_bar_to_other" = "Translate to {name}";
|
||||
"lng_translate_menu_to" = "Translate To";
|
||||
@@ -4183,6 +4444,113 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_preview_reply_to" = "Reply to {name}";
|
||||
"lng_preview_reply_to_quote" = "Reply to quote from {name}";
|
||||
|
||||
"lng_suggest_bar_title" = "Suggest a Post Below";
|
||||
"lng_suggest_bar_text" = "Click to offer a price for publishing.";
|
||||
"lng_suggest_bar_priced" = "{amount} for publishing anytime.";
|
||||
"lng_suggest_bar_dated" = "Publish on {date}";
|
||||
"lng_suggest_options_title" = "Suggest a Message";
|
||||
"lng_suggest_options_change" = "Suggest Changes";
|
||||
"lng_suggest_options_stars_offer" = "Offer Stars";
|
||||
"lng_suggest_options_stars_request" = "Request Stars";
|
||||
"lng_suggest_options_stars_price" = "Enter Price in Stars";
|
||||
"lng_suggest_options_stars_price_about" = "Choose how many Stars to pay to publish this message.";
|
||||
"lng_suggest_options_ton_offer" = "Offer TON";
|
||||
"lng_suggest_options_ton_request" = "Request TON";
|
||||
"lng_suggest_options_ton_price" = "Enter Price in TON";
|
||||
"lng_suggest_options_ton_price_about" = "Choose how many TON to pay to publish this message.";
|
||||
"lng_suggest_options_date" = "Time";
|
||||
"lng_suggest_options_date_any" = "Anytime";
|
||||
"lng_suggest_options_date_publish" = "Publish";
|
||||
"lng_suggest_options_date_now" = "Publish Now";
|
||||
"lng_suggest_options_date_about" = "Select the date and time you want the message to be published. The post will remain available for at least 24 hours from this date.";
|
||||
"lng_suggest_options_you_get_stars#one" = "You will receive {count} Star ({percent}) for publishing this post.";
|
||||
"lng_suggest_options_you_get_stars#other" = "You will receive {count} Stars ({percent}) for publishing this post.";
|
||||
"lng_suggest_options_you_get_ton#one" = "You will receive {count} TON ({percent}) for publishing this post.";
|
||||
"lng_suggest_options_you_get_ton#other" = "You will receive {count} TON ({percent}) for publishing this post.";
|
||||
"lng_suggest_options_stars_warning" = "Transactions in **Stars** may be reversed by the payment provider within **21** days. Only accept Stars from people you trust.";
|
||||
"lng_suggest_options_offer" = "Offer {amount}";
|
||||
"lng_suggest_options_offer_free" = "Offer for Free";
|
||||
"lng_suggest_options_update" = "Update Terms";
|
||||
"lng_suggest_options_update_date" = "Update Time";
|
||||
|
||||
"lng_suggest_action_decline" = "Decline";
|
||||
"lng_suggest_action_accept" = "Accept";
|
||||
"lng_suggest_action_change" = "Suggest Changes";
|
||||
"lng_suggest_action_your" = "You suggest to post this message.";
|
||||
"lng_suggest_action_his" = "{from} suggests to post this message.";
|
||||
"lng_suggest_action_price_label" = "Price";
|
||||
"lng_suggest_action_price_free" = "Free";
|
||||
"lng_suggest_action_time_label" = "Time";
|
||||
"lng_suggest_action_time_any" = "Anytime";
|
||||
"lng_suggest_action_agreement" = "Agreement reached!";
|
||||
"lng_suggest_action_agree_date" = "The post will be automatically published on {channel} {date}.";
|
||||
"lng_suggest_action_your_charged_stars#one" = "You have been charged **{count} Star**.";
|
||||
"lng_suggest_action_your_charged_stars#other" = "You have been charged **{count} Stars**.";
|
||||
"lng_suggest_action_your_charged_ton#one" = "You have been charged **{count} TON**.";
|
||||
"lng_suggest_action_your_charged_ton#other" = "You have been charged **{count} TON**.";
|
||||
"lng_suggest_action_his_charged_stars#one" = "{from} has been charged **{count} Star**.";
|
||||
"lng_suggest_action_his_charged_stars#other" = "{from} has been charged **{count} Stars**.";
|
||||
"lng_suggest_action_his_charged_ton#one" = "{from} has been charged **{count} TON**.";
|
||||
"lng_suggest_action_his_charged_ton#other" = "{from} has been charged **{count} TON**.";
|
||||
"lng_suggest_action_agree_receive_stars" = "{channel} will receive the Stars once the post has been live for 24 hours.";
|
||||
"lng_suggest_action_agree_receive_ton" = "{channel} will receive TON once the post has been live for 24 hours.";
|
||||
"lng_suggest_action_agree_removed_stars" = "If {channel} removes the post before it has been live for 24 hours, the Stars will be refunded.";
|
||||
"lng_suggest_action_agree_removed_ton" = "If {channel} removes the post before it has been live for 24 hours, TON will be refunded.";
|
||||
"lng_suggest_action_your_not_enough_stars" = "**Transaction failed** because you didn't have enough Stars.";
|
||||
"lng_suggest_action_your_not_enough_ton" = "**Transaction failed** because you didn't have enough TON.";
|
||||
"lng_suggest_action_his_not_enough_stars" = "**Transaction failed** because the user didn't have enough Stars.";
|
||||
"lng_suggest_action_his_not_enough_ton" = "**Transaction failed** because the user didn't have enough TON.";
|
||||
"lng_suggest_action_declined" = "{from} rejected the message.";
|
||||
"lng_suggest_action_declined_reason" = "{from} rejected the message with the comment.";
|
||||
"lng_suggest_change_price" = "{from} suggests a new price for the message.";
|
||||
"lng_suggest_change_time" = "{from} suggests a new time for the message.";
|
||||
"lng_suggest_change_price_time" = "{from} suggests a new price and time for the message.";
|
||||
"lng_suggest_change_content" = "{from} suggests changes for the message.";
|
||||
"lng_suggest_change_price_label" = "New Price";
|
||||
"lng_suggest_change_time_label" = "New Time";
|
||||
"lng_suggest_change_text_label" = "Check the suggested message below";
|
||||
"lng_suggest_menu_edit_message" = "Edit Message";
|
||||
"lng_suggest_menu_edit_price" = "Edit Price";
|
||||
"lng_suggest_menu_edit_time" = "Edit Time";
|
||||
"lng_suggest_decline_title" = "Decline";
|
||||
"lng_suggest_decline_text" = "Do you want to decline publishing this post from {from}?";
|
||||
"lng_suggest_decline_text_to" = "Do you want to decline publishing this post to {channel}?";
|
||||
"lng_suggest_decline_reason" = "Add a reason (optional)";
|
||||
"lng_suggest_accept_title" = "Accept Terms";
|
||||
"lng_suggest_accept_text" = "Do you want to publish this post from {from}?";
|
||||
"lng_suggest_accept_text_to" = "Do you want to publish this post to {channel}?";
|
||||
"lng_suggest_accept_receive_stars#one" = "{channel} will receive **{count} Star** ({percent}) for publishing {date}.";
|
||||
"lng_suggest_accept_receive_stars#other" = "{channel} will receive **{count} Stars** ({percent}) for publishing {date}.";
|
||||
"lng_suggest_accept_receive_ton#one" = "{channel} will receive **{count} TON** ({percent}) for publishing {date}.";
|
||||
"lng_suggest_accept_receive_ton#other" = "{channel} will receive **{count} TON** ({percent}) for publishing {date}.";
|
||||
"lng_suggest_accept_receive_now_stars#one" = "{channel} will receive **{count} Star** ({percent}) for publishing right now.";
|
||||
"lng_suggest_accept_receive_now_stars#other" = "{channel} will receive **{count} Stars** ({percent}) for publishing right now.";
|
||||
"lng_suggest_accept_receive_now_ton#one" = "{channel} will receive **{count} TON** ({percent}) for publishing right now.";
|
||||
"lng_suggest_accept_receive_now_ton#other" = "{channel} will receive **{count} TON** ({percent}) for publishing right now.";
|
||||
"lng_suggest_accept_receive_if" = "It must remain visible for at least **24** hours after publication.";
|
||||
"lng_suggest_accept_pay_stars#one" = "You will pay **{count} Star** for publishing {date}.";
|
||||
"lng_suggest_accept_pay_stars#other" = "You will pay **{count} Stars** for publishing {date}.";
|
||||
"lng_suggest_accept_pay_ton#one" = "You will pay **{count} TON** for publishing {date}.";
|
||||
"lng_suggest_accept_pay_ton#other" = "You will pay **{count} TON** for publishing {date}.";
|
||||
"lng_suggest_accept_pay_now_stars#one" = "You will pay **{count} Star** for publishing right now.";
|
||||
"lng_suggest_accept_pay_now_stars#other" = "You will pay **{count} Stars** for publishing right now.";
|
||||
"lng_suggest_accept_pay_now_ton#one" = "You will pay **{count} TON** for publishing right now.";
|
||||
"lng_suggest_accept_pay_now_ton#other" = "You will pay **{count} TON** for publishing right now.";
|
||||
"lng_suggest_accept_send" = "Publish";
|
||||
"lng_suggest_stars_amount#one" = "{count} Star";
|
||||
"lng_suggest_stars_amount#other" = "{count} Stars";
|
||||
"lng_suggest_ton_amount#one" = "{count} TON";
|
||||
"lng_suggest_ton_amount#other" = "{count} TON";
|
||||
"lng_suggest_warn_title_stars" = "Stars will be lost";
|
||||
"lng_suggest_warn_title_ton" = "TON will be lost";
|
||||
"lng_suggest_warn_text_stars" = "You won't receive **Stars** for the post if you delete it now. The post must remain visible for at least **24 hours** after it was published.";
|
||||
"lng_suggest_warn_text_ton" = "You won't receive **TON** for the post if you delete it now. The post must remain visible for at least **24 hours** after it was published.";
|
||||
"lng_suggest_warn_delete_anyway" = "Delete Anyway";
|
||||
"lng_suggest_low_ton_title" = "{amount} TON Needed";
|
||||
"lng_suggest_low_ton_text" = "You can add funds to your balance via the third-party platform Fragment.";
|
||||
"lng_suggest_low_ton_fragment" = "Add Funds via Fragment";
|
||||
"lng_suggest_low_ton_fragment_url" = "https://fragment.com/ads/topup";
|
||||
|
||||
"lng_reply_in_another_title" = "Reply in...";
|
||||
"lng_reply_in_another_chat" = "Reply in Another Chat";
|
||||
"lng_reply_in_author" = "Message author";
|
||||
@@ -4237,6 +4605,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_edit_contact_title" = "Edit contact";
|
||||
"lng_edit_channel_title" = "Edit channel";
|
||||
"lng_edit_bot_title" = "Edit bot";
|
||||
"lng_edit_autotranslate" = "Auto-translate messages";
|
||||
"lng_edit_sign_messages" = "Sign messages";
|
||||
"lng_edit_sign_messages_about" = "Add names of admins to the messages they post.";
|
||||
"lng_edit_sign_profiles" = "Show authors' profiles";
|
||||
@@ -4331,6 +4700,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_search_filter_private" = "Private chats";
|
||||
"lng_search_filter_group" = "Group chats";
|
||||
"lng_search_filter_channel" = "Channels";
|
||||
"lng_search_sponsored_button" = "Ad ⋮";
|
||||
|
||||
"lng_media_save_progress" = "{ready} of {total} {mb}";
|
||||
"lng_mediaview_save_as" = "Save As...";
|
||||
@@ -4544,6 +4914,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_call_status_failed" = "failed to connect";
|
||||
"lng_call_status_ringing" = "ringing...";
|
||||
"lng_call_status_busy" = "line busy";
|
||||
"lng_call_status_group_invite" = "Telegram Group Call";
|
||||
"lng_call_status_sure" = "Click on the Camera icon if you want to start a video call.";
|
||||
"lng_call_fingerprint_tooltip" = "If the emoji on {user}'s screen are the same, this call is 100% secure";
|
||||
|
||||
@@ -4553,6 +4924,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_call_error_camera_not_started" = "You can switch to video call once you're connected.";
|
||||
"lng_call_error_camera_outdated" = "{user}'s app does not support video calls. They need to update their app before you can call them.";
|
||||
"lng_call_error_audio_io" = "There seems to be a problem with your sound card. Please make sure that your computer's speakers and microphone are working and try again.";
|
||||
"lng_call_error_add_not_started" = "You can add more people once you're connected.";
|
||||
|
||||
"lng_call_bar_hangup" = "End call";
|
||||
"lng_call_leave_to_other_sure" = "End your active call and join this video chat?";
|
||||
@@ -4571,16 +4943,22 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
|
||||
"lng_call_outgoing" = "Outgoing call";
|
||||
"lng_call_video_outgoing" = "Outgoing video call";
|
||||
"lng_call_group_outgoing" = "Outgoing group call";
|
||||
"lng_call_incoming" = "Incoming call";
|
||||
"lng_call_video_incoming" = "Incoming video call";
|
||||
"lng_call_group_incoming" = "Incoming group call";
|
||||
"lng_call_missed" = "Missed call";
|
||||
"lng_call_video_missed" = "Missed video call";
|
||||
"lng_call_group_missed" = "Missed group call";
|
||||
"lng_call_cancelled" = "Canceled call";
|
||||
"lng_call_video_cancelled" = "Canceled video call";
|
||||
"lng_call_declined" = "Declined call";
|
||||
"lng_call_video_declined" = "Declined video call";
|
||||
"lng_call_group_declined" = "Declined group call";
|
||||
"lng_call_duration_info" = "{time}, {duration}";
|
||||
"lng_call_type_and_duration" = "{type} ({duration})";
|
||||
"lng_call_invitation" = "Group call invitation";
|
||||
"lng_call_ongoing" = "Ongoing group call";
|
||||
|
||||
"lng_call_rate_label" = "Please rate the quality of your call";
|
||||
"lng_call_rate_comment" = "Comment (optional)";
|
||||
@@ -4589,6 +4967,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_call_start_video" = "Start Video";
|
||||
"lng_call_stop_video" = "Stop Video";
|
||||
"lng_call_screencast" = "Screencast";
|
||||
"lng_call_add_people" = "Add People";
|
||||
"lng_call_end_call" = "End Call";
|
||||
"lng_call_mute_audio" = "Mute";
|
||||
"lng_call_unmute_audio" = "Unmute";
|
||||
@@ -4620,8 +4999,10 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_group_call_connecting" = "Connecting...";
|
||||
"lng_group_call_leave" = "Leave";
|
||||
"lng_group_call_leave_title" = "Leave video chat";
|
||||
"lng_group_call_leave_title_call" = "Leave group call";
|
||||
"lng_group_call_leave_title_channel" = "Leave live stream";
|
||||
"lng_group_call_leave_sure" = "Do you want to leave this video chat?";
|
||||
"lng_group_call_leave_sure_call" = "Do you want to leave this group call?";
|
||||
"lng_group_call_leave_sure_channel" = "Are you sure you want to leave this live stream?";
|
||||
"lng_group_call_close" = "Close";
|
||||
"lng_group_call_close_sure" = "Video chat is scheduled. You can abort it or just close this panel.";
|
||||
@@ -4651,15 +5032,20 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_group_call_also_end_channel" = "End live stream";
|
||||
"lng_group_call_settings_title" = "Settings";
|
||||
"lng_group_call_invite" = "Invite Members";
|
||||
"lng_group_call_invite_conf" = "Add People";
|
||||
"lng_group_call_invited_status" = "invited";
|
||||
"lng_group_call_calling_status" = "calling...";
|
||||
"lng_group_call_blockchain_only_status" = "listening";
|
||||
"lng_group_call_muted_by_me_status" = "muted for you";
|
||||
"lng_group_call_invite_title" = "Invite members";
|
||||
"lng_group_call_invite_button" = "Invite";
|
||||
"lng_group_call_confcall_add" = "Call";
|
||||
"lng_group_call_add_to_group_one" = "{user} isn't a member of «{group}». Add them to the group?";
|
||||
"lng_group_call_add_to_group_some" = "Some of those users aren't members of «{group}». Add them to the group?";
|
||||
"lng_group_call_add_to_group_all" = "Those users aren't members of «{group}». Add them to the group?";
|
||||
"lng_group_call_invite_members" = "Group members";
|
||||
"lng_group_call_invite_search_results" = "Search results";
|
||||
"lng_group_call_invite_limit" = "This is currently the maximum allowed number of participants.";
|
||||
"lng_group_call_new_muted" = "Mute new participants";
|
||||
"lng_group_call_speakers" = "Speakers";
|
||||
"lng_group_call_microphone" = "Microphone";
|
||||
@@ -4698,6 +5084,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_group_call_context_pin_screen" = "Pin screencast";
|
||||
"lng_group_call_context_unpin_screen" = "Unpin screencast";
|
||||
"lng_group_call_context_remove" = "Remove";
|
||||
"lng_group_call_context_cancel_invite" = "Discard invite";
|
||||
"lng_group_call_context_stop_ringing" = "Stop calling";
|
||||
"lng_group_call_context_ban_from_call" = "Ban from call";
|
||||
"lng_group_call_remove_channel" = "Remove {channel} from the video chat and ban them?";
|
||||
"lng_group_call_remove_channel_from_channel" = "Remove {channel} from the live stream?";
|
||||
"lng_group_call_mac_access" = "Telegram Desktop does not have access to system wide keyboard input required for Push to Talk.";
|
||||
@@ -4806,6 +5195,54 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_group_call_rtmp_viewers#one" = "{count} viewer";
|
||||
"lng_group_call_rtmp_viewers#other" = "{count} viewers";
|
||||
|
||||
"lng_confcall_join_title" = "Group Call";
|
||||
"lng_confcall_join_text" = "You are invited to join a Telegram Call.";
|
||||
"lng_confcall_join_text_inviter" = "{user} is inviting you to join a Telegram Call.";
|
||||
"lng_confcall_already_joined_one" = "{user} already joined this call.";
|
||||
"lng_confcall_already_joined_two" = "{user} and {other} already joined this call.";
|
||||
"lng_confcall_already_joined_three" = "{user}, {other} and {third} already joined this call.";
|
||||
"lng_confcall_already_joined_many#one" = "{user}, {other} and **{count}** other person already joined this call.";
|
||||
"lng_confcall_already_joined_many#other" = "{user}, {other} and **{count}** other people already joined this call.";
|
||||
"lng_confcall_join_button" = "Join Group Call";
|
||||
"lng_confcall_create_call" = "Start New Call";
|
||||
"lng_confcall_create_call_description#one" = "You can add up to {count} participant to a call.";
|
||||
"lng_confcall_create_call_description#other" = "You can add up to {count} participants to a call.";
|
||||
"lng_confcall_create_title" = "New Call";
|
||||
"lng_confcall_create_link" = "Create Call Link";
|
||||
"lng_confcall_create_link_description" = "You can create a link that will allow your friends on Telegram to join the call.";
|
||||
"lng_confcall_link_revoke" = "Revoke link";
|
||||
"lng_confcall_link_revoked_title" = "Link Revoked";
|
||||
"lng_confcall_link_inactive" = "This link is no longer active.";
|
||||
"lng_confcall_link_revoked_text" = "A new link has been generated.";
|
||||
"lng_confcall_link_title" = "Call Link";
|
||||
"lng_confcall_link_about" = "Anyone on Telegram can join your call by following the link below.";
|
||||
"lng_confcall_link_or" = "or";
|
||||
"lng_confcall_link_join" = "Be the first to join the call and add people from there. {link}";
|
||||
"lng_confcall_link_join_link" = "Open call {arrow}";
|
||||
"lng_confcall_inactive_title" = "Start Group Call";
|
||||
"lng_confcall_inactive_about" = "This call is no longer active.\nYou can start a new one.";
|
||||
"lng_confcall_invite_done_user" = "You're calling {user} to join.";
|
||||
"lng_confcall_invite_done_many#one" = "You're calling **{count} person** to join.";
|
||||
"lng_confcall_invite_done_many#other" = "You're calling **{count} people** to join.";
|
||||
"lng_confcall_invite_already_user" = "{user} is already in the call.";
|
||||
"lng_confcall_invite_already_many#one" = "**{count} person** is already in the call.";
|
||||
"lng_confcall_invite_already_many#other" = "**{count} people** are already in the call.";
|
||||
"lng_confcall_invite_privacy_user" = "You cannot call {user} because of their privacy settings.";
|
||||
"lng_confcall_invite_privacy_many#one" = "You cannot call **{count} person** because of their privacy settings.";
|
||||
"lng_confcall_invite_privacy_many#other" = "You cannot call **{count} people** because of their privacy settings.";
|
||||
"lng_confcall_invite_fail_user" = "Couldn't call {user} to join.";
|
||||
"lng_confcall_invite_fail_many#one" = "Couldn't call **{count} person** to join.";
|
||||
"lng_confcall_invite_fail_many#other" = "Couldn't call **{count} people** to join.";
|
||||
"lng_confcall_invite_kicked_user" = "{user} was banned from the call.";
|
||||
"lng_confcall_invite_kicked_many#one" = "**{count} person** was removed from the call.";
|
||||
"lng_confcall_invite_kicked_many#other" = "**{count} people** were removed from the call.";
|
||||
"lng_confcall_not_accessible" = "This call is no longer accessible.";
|
||||
"lng_confcall_participants_limit" = "This call reached the participants limit.";
|
||||
"lng_confcall_sure_remove" = "Remove {user} from the call?";
|
||||
"lng_confcall_e2e_badge" = "End-to-End Encrypted";
|
||||
"lng_confcall_e2e_badge_small" = "E2E Encrypted";
|
||||
"lng_confcall_e2e_about" = "These four emoji represent the call's encryption key. They must match for all participants and change when someone joins or leaves.";
|
||||
|
||||
"lng_no_mic_permission" = "Telegram needs microphone access so that you can make calls and record voice messages.";
|
||||
|
||||
"lng_player_message_today" = "today at {time}";
|
||||
@@ -4906,6 +5343,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_rights_channel_edit_stories" = "Edit stories of others";
|
||||
"lng_rights_channel_delete_stories" = "Delete stories of others";
|
||||
"lng_rights_channel_manage_calls" = "Manage live streams";
|
||||
"lng_rights_channel_manage_direct" = "Manage direct messages";
|
||||
"lng_rights_group_info" = "Change group info";
|
||||
"lng_rights_group_ban" = "Ban users";
|
||||
"lng_rights_group_invite_link" = "Invite users via link";
|
||||
@@ -4998,6 +5436,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_restricted_send_polls_all" = "Sorry, sending polls is not allowed in this group.";
|
||||
|
||||
"lng_restricted_send_public_polls" = "Sorry, polls with visible votes can't be forwarded to channels.";
|
||||
"lng_restricted_send_todo_lists" = "Sorry, Checklists can't be forwarded to channels.";
|
||||
"lng_restricted_send_paid_media" = "Sorry, paid media can't be sent to this channel.";
|
||||
|
||||
"lng_restricted_send_voice_messages" = "{user} doesn't accept voice messages.";
|
||||
@@ -5012,6 +5451,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_send_non_premium_message_toast" = "**{user}** only accepts messages from contacts and {link} subscribers.";
|
||||
"lng_send_non_premium_message_toast_link" = "Telegram Premium";
|
||||
|
||||
"lng_send_charges_stars_channel" = "{channel} charges {amount} per message to its admin.";
|
||||
"lng_send_free_channel" = "Send a direct message to the administrator of {channel}.";
|
||||
"lng_send_charges_stars_text" = "{user} charges {amount} for each message.";
|
||||
"lng_send_charges_stars_go" = "Buy Stars";
|
||||
|
||||
@@ -5025,10 +5466,13 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_admin_log_filter_all_actions" = "All actions";
|
||||
"lng_admin_log_filter_actions_type_subtitle" = "Filter actions by type";
|
||||
"lng_admin_log_filter_actions_member_section" = "Members And Admins";
|
||||
"lng_admin_log_filter_actions_subscriber_section" = "Subscribers And Admins";
|
||||
"lng_admin_log_filter_restrictions" = "New restrictions";
|
||||
"lng_admin_log_filter_admins_new" = "Admin rights";
|
||||
"lng_admin_log_filter_members_new" = "New members";
|
||||
"lng_admin_log_filter_subscribers_new" = "New subscribers";
|
||||
"lng_admin_log_filter_actions_settings_section" = "Group Settings";
|
||||
"lng_admin_log_filter_actions_channel_settings_section" = "Channel Settings";
|
||||
"lng_admin_log_filter_info_group" = "Group info";
|
||||
"lng_admin_log_filter_info_channel" = "Channel info";
|
||||
"lng_admin_log_filter_actions_messages_section" = "Messages";
|
||||
@@ -5039,6 +5483,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_admin_log_filter_voice_chats_channel" = "Live stream";
|
||||
"lng_admin_log_filter_invite_links" = "Invite links";
|
||||
"lng_admin_log_filter_members_removed" = "Members leaving";
|
||||
"lng_admin_log_filter_subscribers_removed" = "Subscribers leaving";
|
||||
"lng_admin_log_filter_topics" = "Topics";
|
||||
"lng_admin_log_filter_sub_extend" = "Subscription Renewals";
|
||||
"lng_admin_log_filter_all_admins" = "All users and admins";
|
||||
@@ -5149,6 +5594,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_admin_log_participant_volume_channel" = "{from} changed live stream volume for {user} to {percent}";
|
||||
"lng_admin_log_antispam_enabled" = "{from} enabled aggressive anti-spam";
|
||||
"lng_admin_log_antispam_disabled" = "{from} disabled aggressive anti-spam";
|
||||
"lng_admin_log_autotranslate_enabled" = "{from} enabled automatic translation";
|
||||
"lng_admin_log_autotranslate_disabled" = "{from} disabled automatic translation";
|
||||
"lng_admin_log_change_color" = "{from} changed channel color from {previous} to {color}";
|
||||
"lng_admin_log_set_background_emoji" = "{from} set channel background emoji to {emoji}";
|
||||
"lng_admin_log_change_background_emoji" = "{from} changed channel background emoji from {previous} to {emoji}";
|
||||
@@ -5221,6 +5668,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_admin_log_admin_create_topics" = "Create topics";
|
||||
"lng_admin_log_admin_manage_calls" = "Manage video chats";
|
||||
"lng_admin_log_admin_manage_calls_channel" = "Manage live streams";
|
||||
"lng_admin_log_admin_manage_direct" = "Manage direct messages";
|
||||
"lng_admin_log_admin_add_admins" = "Add new admins";
|
||||
"lng_admin_log_subscription_extend" = "{name} renewed subscription until {date}";
|
||||
|
||||
@@ -5520,6 +5968,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_polls_stop" = "Stop poll";
|
||||
"lng_polls_stop_warning" = "If you stop this poll now, nobody will be able to vote in it anymore. This action cannot be undone.";
|
||||
"lng_polls_stop_sure" = "Stop";
|
||||
"lng_polls_menu_item" = "Poll";
|
||||
"lng_polls_create" = "Create poll";
|
||||
"lng_polls_create_title" = "New poll";
|
||||
"lng_polls_create_question" = "Question";
|
||||
@@ -5548,6 +5997,35 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_polls_show_more#other" = "Show more ({count})";
|
||||
"lng_polls_votes_collapse" = "Collapse";
|
||||
|
||||
"lng_todo_title" = "Checklist";
|
||||
"lng_todo_title_group" = "Group Checklist";
|
||||
"lng_todo_completed#one" = "{count} of {total} completed";
|
||||
"lng_todo_completed#other" = "{count} of {total} completed";
|
||||
"lng_todo_completed_none" = "None of {total} completed";
|
||||
"lng_todo_menu_item" = "Checklist";
|
||||
"lng_todo_create" = "Create Checklist";
|
||||
"lng_todo_create_title" = "New Checklist";
|
||||
"lng_todo_create_title_placeholder" = "Title";
|
||||
"lng_todo_create_list" = "Tasks List";
|
||||
"lng_todo_create_list_add" = "Add a task...";
|
||||
"lng_todo_create_limit#one" = "You can add {count} more task.";
|
||||
"lng_todo_create_limit#other" = "You can add {count} more tasks.";
|
||||
"lng_todo_create_maximum" = "You have added the maximum number of tasks.";
|
||||
"lng_todo_create_settings" = "Settings";
|
||||
"lng_todo_create_allow_add" = "Allow Others to Add Tasks";
|
||||
"lng_todo_create_allow_mark" = "Allow Others to Mark As Done";
|
||||
"lng_todo_create_button" = "Create";
|
||||
"lng_todo_choose_title" = "Please enter a title.";
|
||||
"lng_todo_choose_tasks" = "Please enter at least one task.";
|
||||
|
||||
"lng_todo_add_title" = "Add Tasks";
|
||||
"lng_todo_create_premium" = "Only subscribers of {link} can create Checklists.";
|
||||
"lng_todo_add_premium" = "Only subscribers of {link} can add tasks.";
|
||||
"lng_todo_mark_premium" = "Only subscribers of {link} can mark tasks as done.";
|
||||
"lng_todo_premium_link" = "Telegram Premium";
|
||||
"lng_todo_mark_restricted" = "{user} has restricted others from marking tasks as done.";
|
||||
"lng_todo_mark_forwarded" = "You can't change forwarded checklists.";
|
||||
|
||||
"lng_outdated_title" = "PLEASE UPDATE YOUR OPERATING SYSTEM.";
|
||||
"lng_outdated_title_bits" = "PLEASE SWITCH TO A 64-BIT OPERATING SYSTEM.";
|
||||
"lng_outdated_soon" = "Otherwise, Telegram Desktop will stop updating on {date}.";
|
||||
@@ -5732,6 +6210,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_view_button_stickerset" = "View stickers";
|
||||
"lng_view_button_emojipack" = "View emoji";
|
||||
"lng_view_button_collectible" = "View collectible";
|
||||
"lng_view_button_call" = "Join call";
|
||||
|
||||
"lng_sponsored_hide_ads" = "Hide";
|
||||
"lng_sponsored_title" = "What are sponsored messages?";
|
||||
@@ -5745,6 +6224,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_sponsored_revenued_info1_title" = "Respect Your Privacy";
|
||||
"lng_sponsored_revenued_info1_description" = "Ads on Telegram do not use your personal information and are based on the channel in which you see them.";
|
||||
"lng_sponsored_revenued_info1_bot_description" = "Ads on Telegram do not use your personal information and are based on the mini app in which you see them.";
|
||||
"lng_sponsored_revenued_info1_search_description" = "Ads on Telegram do not use your personal information and are based on the search query you entered.";
|
||||
"lng_sponsored_revenued_info2_title" = "Help the Channel Creator";
|
||||
"lng_sponsored_revenued_info2_bot_title" = "Help the Bot Developer";
|
||||
"lng_sponsored_revenued_info2_description" = "50% of the revenue from Telegram Ads goes to the owner of the channel where they are displayed.";
|
||||
@@ -5753,9 +6233,12 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_sponsored_revenued_info3_description#one" = "You can turn off ads by subscribing to {link}, and Level {count} channels can remove them for their subscribers.";
|
||||
"lng_sponsored_revenued_info3_description#other" = "You can turn off ads by subscribing to {link}, and Level {count} channels can remove them for their subscribers.";
|
||||
"lng_sponsored_revenued_info3_bot_description" = "You can turn off ads in mini apps by subscribing to {link}.";
|
||||
"lng_sponsored_revenued_info3_search_description" = "You can turn off ads by subscribing to Telegram Premium. {link}";
|
||||
"lng_sponsored_revenued_info3_search_link" = "Subscribe {arrow}";
|
||||
"lng_sponsored_revenued_footer_title" = "Can I Launch an Ad?";
|
||||
"lng_sponsored_revenued_footer_description" = "Anyone can create an ad to display in this channel — with minimal budgets. Check out the **Telegram Ad Platform** for details. {link}";
|
||||
"lng_sponsored_revenued_footer_bot_description" = "Anyone can create an ad to display in this bot — with minimal budgets. Check out the **Telegram Ad Platform** for details. {link}";
|
||||
"lng_sponsored_revenued_footer_search_description" = "Anyone can create an ad to display in search results for any query. Check out the **Telegram Ad Platform** for details. {link}";
|
||||
"lng_sponsored_top_bar_hide" = "remove";
|
||||
|
||||
"lng_telegram_features_url" = "https://t.me/TelegramTips";
|
||||
@@ -5807,6 +6290,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_forum_messages#other" = "{count} messages";
|
||||
"lng_forum_show_topics_list" = "Show Topics List";
|
||||
|
||||
"lng_monoforum_choose_to_reply" = "Choose a message to reply.";
|
||||
|
||||
"lng_request_peer_requirements" = "Requirements";
|
||||
"lng_request_peer_rights" = "You must have these admin rights: {rights}.";
|
||||
"lng_request_peer_rights_and" = "{rights} and {last}";
|
||||
@@ -5853,6 +6338,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_request_channel_delete_messages" = "delete messages";
|
||||
"lng_request_channel_add_subscribers" = "add subscribers";
|
||||
"lng_request_channel_manage_livestreams" = "manage live streams";
|
||||
"lng_request_channel_manage_direct" = "manage direct messages";
|
||||
"lng_request_channel_add_admins" = "add new admins";
|
||||
"lng_request_channel_create" = "Create a New Channel for This";
|
||||
|
||||
@@ -6119,6 +6605,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_bot_earn_chart_revenue" = "Revenue";
|
||||
"lng_bot_earn_overview_title" = "Proceeds overview";
|
||||
"lng_bot_earn_available" = "Available balance";
|
||||
"lng_bot_earn_reward" = "Total balance";
|
||||
"lng_bot_earn_total" = "Total lifetime proceeds";
|
||||
"lng_bot_earn_balance_title" = "Available balance";
|
||||
"lng_bot_earn_balance_about" = "Stars from your total balance can be used for ads or withdrawn as rewards 21 days after they are earned.";
|
||||
@@ -6129,7 +6616,9 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_bot_earn_balance_button_locked" = "Withdraw";
|
||||
"lng_bot_earn_balance_button_buy_ads" = "Buy Ads";
|
||||
"lng_bot_earn_learn_credits_out_about" = "You can withdraw Stars using Fragment, or use Stars to advertise your bot. {link}";
|
||||
"lng_self_earn_learn_credits_out_about" = "You can withdraw from 10 Stars using Fragment. {link}";
|
||||
"lng_bot_earn_out_ph" = "Enter amount to withdraw";
|
||||
"lng_bot_earn_out_ph_max" = "Enter amount to withdraw (max. {amount})";
|
||||
"lng_bot_earn_balance_password_title" = "Two-step verification";
|
||||
"lng_bot_earn_balance_password_description" = "Please enter your password to collect.";
|
||||
"lng_bot_earn_credits_out_minimal" = "You cannot withdraw less than {link}.";
|
||||
@@ -6241,6 +6730,22 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_qr_box_transparent_background" = "Transparent Background";
|
||||
"lng_qr_box_font_size" = "Font size";
|
||||
|
||||
"lng_frozen_bar_title" = "Your account is frozen!";
|
||||
"lng_frozen_bar_text" = "Click to view details {arrow}";
|
||||
"lng_frozen_restrict_title" = "Your account is frozen";
|
||||
"lng_frozen_restrict_text" = "Click to view details";
|
||||
"lng_frozen_title" = "Your Account is Frozen";
|
||||
"lng_frozen_subtitle1" = "Violation of Terms";
|
||||
"lng_frozen_text1" = "Your account was frozen for breaking Telegram's Terms and Conditions.";
|
||||
"lng_frozen_subtitle2" = "Read-Only Mode";
|
||||
"lng_frozen_text2" = "You can access your account but can't send messages or take actions.";
|
||||
"lng_frozen_subtitle3" = "Appeal Before Deactivation";
|
||||
"lng_frozen_text3" = "Appeal via {link} before {date}, or your account will be deleted.";
|
||||
"lng_frozen_appeal_button" = "Submit an Appeal";
|
||||
|
||||
"lng_context_bank_card_copy" = "Copy Card Number";
|
||||
"lng_context_bank_card_copied" = "Card number copied to clipboard.";
|
||||
|
||||
// Wnd specific
|
||||
|
||||
"lng_wnd_choose_program_menu" = "Choose Default Program...";
|
||||
@@ -6295,6 +6800,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
"lng_mac_menu_new_channel" = "New Channel";
|
||||
"lng_mac_menu_show" = "Show Telegram";
|
||||
"lng_mac_menu_emoji_and_symbols" = "Emoji & Symbols";
|
||||
"lng_mac_menu_fullscreen" = "Toggle Full Screen";
|
||||
|
||||
"lng_mac_menu_player_pause" = "Pause";
|
||||
"lng_mac_menu_player_resume" = "Resume";
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
<RCC>
|
||||
<qresource prefix="/animations">
|
||||
<file alias="blocked_peers_empty.tgs">../../animations/blocked_peers_empty.tgs</file>
|
||||
<file alias="change_number.tgs">../../animations/change_number.tgs</file>
|
||||
<file alias="filters.tgs">../../animations/filters.tgs</file>
|
||||
<file alias="cloud_filters.tgs">../../animations/cloud_filters.tgs</file>
|
||||
<file alias="local_passcode_enter.tgs">../../animations/local_passcode_enter.tgs</file>
|
||||
@@ -8,6 +9,7 @@
|
||||
<file alias="cloud_password/password_input.tgs">../../animations/cloud_password/password_input.tgs</file>
|
||||
<file alias="cloud_password/hint.tgs">../../animations/cloud_password/hint.tgs</file>
|
||||
<file alias="cloud_password/email.tgs">../../animations/cloud_password/email.tgs</file>
|
||||
<file alias="cloud_password/validate.tgs">../../animations/cloud_password/validate.tgs</file>
|
||||
<file alias="ttl.tgs">../../animations/ttl.tgs</file>
|
||||
<file alias="discussion.tgs">../../animations/discussion.tgs</file>
|
||||
<file alias="stats.tgs">../../animations/stats.tgs</file>
|
||||
@@ -24,12 +26,18 @@
|
||||
<file alias="hours.tgs">../../animations/hours.tgs</file>
|
||||
<file alias="phone.tgs">../../animations/phone.tgs</file>
|
||||
<file alias="chat_link.tgs">../../animations/chat_link.tgs</file>
|
||||
<file alias="diamond.tgs">../../animations/diamond.tgs</file>
|
||||
<file alias="collectible_username.tgs">../../animations/collectible_username.tgs</file>
|
||||
<file alias="collectible_phone.tgs">../../animations/collectible_phone.tgs</file>
|
||||
<file alias="search.tgs">../../animations/search.tgs</file>
|
||||
<file alias="noresults.tgs">../../animations/noresults.tgs</file>
|
||||
<file alias="hello_status.tgs">../../animations/hello_status.tgs</file>
|
||||
<file alias="starref_link.tgs">../../animations/starref_link.tgs</file>
|
||||
<file alias="media_forbidden.tgs">../../animations/media_forbidden.tgs</file>
|
||||
<file alias="topics.tgs">../../animations/edit_peers/topics.tgs</file>
|
||||
<file alias="topics_tabs.tgs">../../animations/edit_peers/topics_tabs.tgs</file>
|
||||
<file alias="topics_list.tgs">../../animations/edit_peers/topics_list.tgs</file>
|
||||
<file alias="direct_messages.tgs">../../animations/edit_peers/direct_messages.tgs</file>
|
||||
|
||||
<file alias="dice_idle.tgs">../../animations/dice/dice_idle.tgs</file>
|
||||
<file alias="dart_idle.tgs">../../animations/dice/dart_idle.tgs</file>
|
||||
@@ -49,5 +57,16 @@
|
||||
<file alias="star_reaction_effect1.tgs">../../animations/star_reaction/effect1.tgs</file>
|
||||
<file alias="star_reaction_effect2.tgs">../../animations/star_reaction/effect2.tgs</file>
|
||||
<file alias="star_reaction_effect3.tgs">../../animations/star_reaction/effect3.tgs</file>
|
||||
|
||||
<file alias="swipe_archive.tgs">../../animations/swipe_action/archive.tgs</file>
|
||||
<file alias="swipe_unarchive.tgs">../../animations/swipe_action/unarchive.tgs</file>
|
||||
<file alias="swipe_delete.tgs">../../animations/swipe_action/delete.tgs</file>
|
||||
<file alias="swipe_disabled.tgs">../../animations/swipe_action/disabled.tgs</file>
|
||||
<file alias="swipe_mute.tgs">../../animations/swipe_action/mute.tgs</file>
|
||||
<file alias="swipe_unmute.tgs">../../animations/swipe_action/unmute.tgs</file>
|
||||
<file alias="swipe_pin.tgs">../../animations/swipe_action/pin.tgs</file>
|
||||
<file alias="swipe_unpin.tgs">../../animations/swipe_action/unpin.tgs</file>
|
||||
<file alias="swipe_read.tgs">../../animations/swipe_action/read.tgs</file>
|
||||
<file alias="swipe_unread.tgs">../../animations/swipe_action/unread.tgs</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
||||
@@ -24,6 +24,8 @@
|
||||
<file alias="icons/settings/star.svg">../../icons/settings/star.svg</file>
|
||||
<file alias="icons/settings/starmini.svg">../../icons/settings/starmini.svg</file>
|
||||
<file alias="icons/tray/monochrome.svg">../../icons/tray_monochrome.svg</file>
|
||||
<file alias="icons/tray/monochrome_attention.svg">../../icons/tray_monochrome_attention.svg</file>
|
||||
<file alias="icons/tray/monochrome_mute.svg">../../icons/tray_monochrome_mute.svg</file>
|
||||
<file alias="topic_icons/blue.svg">../../art/topic_icons/blue.svg</file>
|
||||
<file alias="topic_icons/yellow.svg">../../art/topic_icons/yellow.svg</file>
|
||||
<file alias="topic_icons/violet.svg">../../art/topic_icons/violet.svg</file>
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
<Identity Name="TelegramMessengerLLP.TelegramDesktop"
|
||||
ProcessorArchitecture="ARCHITECTURE"
|
||||
Publisher="CN=536BC709-8EE1-4478-AF22-F0F0F26FF64A"
|
||||
Version="5.12.2.0" />
|
||||
Version="5.16.2.0" />
|
||||
<Properties>
|
||||
<DisplayName>Telegram Desktop</DisplayName>
|
||||
<PublisherDisplayName>Telegram Messenger LLP</PublisherDisplayName>
|
||||
|
||||
@@ -44,8 +44,8 @@ IDI_ICON1 ICON "..\\art\\icon256.ico"
|
||||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 5,12,2,0
|
||||
PRODUCTVERSION 5,12,2,0
|
||||
FILEVERSION 5,16,2,0
|
||||
PRODUCTVERSION 5,16,2,0
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
@@ -62,10 +62,10 @@ BEGIN
|
||||
BEGIN
|
||||
VALUE "CompanyName", "Telegram FZ-LLC"
|
||||
VALUE "FileDescription", "Telegram Desktop"
|
||||
VALUE "FileVersion", "5.12.2.0"
|
||||
VALUE "FileVersion", "5.16.2.0"
|
||||
VALUE "LegalCopyright", "Copyright (C) 2014-2025"
|
||||
VALUE "ProductName", "Telegram Desktop"
|
||||
VALUE "ProductVersion", "5.12.2.0"
|
||||
VALUE "ProductVersion", "5.16.2.0"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
|
||||
@@ -35,8 +35,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
|
||||
//
|
||||
|
||||
VS_VERSION_INFO VERSIONINFO
|
||||
FILEVERSION 5,12,2,0
|
||||
PRODUCTVERSION 5,12,2,0
|
||||
FILEVERSION 5,16,2,0
|
||||
PRODUCTVERSION 5,16,2,0
|
||||
FILEFLAGSMASK 0x3fL
|
||||
#ifdef _DEBUG
|
||||
FILEFLAGS 0x1L
|
||||
@@ -53,10 +53,10 @@ BEGIN
|
||||
BEGIN
|
||||
VALUE "CompanyName", "Telegram FZ-LLC"
|
||||
VALUE "FileDescription", "Telegram Desktop Updater"
|
||||
VALUE "FileVersion", "5.12.2.0"
|
||||
VALUE "FileVersion", "5.16.2.0"
|
||||
VALUE "LegalCopyright", "Copyright (C) 2014-2025"
|
||||
VALUE "ProductName", "Telegram Desktop"
|
||||
VALUE "ProductVersion", "5.12.2.0"
|
||||
VALUE "ProductVersion", "5.16.2.0"
|
||||
END
|
||||
END
|
||||
BLOCK "VarFileInfo"
|
||||
|
||||
@@ -283,7 +283,7 @@ int main(int argc, char *argv[])
|
||||
cout << "Compression start, size: " << resultSize << "\n";
|
||||
|
||||
QByteArray compressed, resultCheck;
|
||||
#if defined Q_OS_WIN && !defined TDESKTOP_USE_PACKAGED // use Lzma SDK for win
|
||||
#if defined Q_OS_WIN && !defined PACKER_USE_PACKAGED // use Lzma SDK for win
|
||||
const int32 hSigLen = 128, hShaLen = 20, hPropsLen = LZMA_PROPS_SIZE, hOriginalSizeLen = sizeof(int32), hSize = hSigLen + hShaLen + hPropsLen + hOriginalSizeLen; // header
|
||||
|
||||
compressed.resize(hSize + resultSize + 1024 * 1024); // rsa signature + sha1 + lzma props + max compressed size
|
||||
|
||||
@@ -27,7 +27,7 @@ extern "C" {
|
||||
#include <openssl/evp.h>
|
||||
} // extern "C"
|
||||
|
||||
#if defined Q_OS_WIN && !defined TDESKTOP_USE_PACKAGED // use Lzma SDK for win
|
||||
#if defined Q_OS_WIN && !defined PACKER_USE_PACKAGED // use Lzma SDK for win
|
||||
#include <LzmaLib.h>
|
||||
#else
|
||||
#include <lzma.h>
|
||||
|
||||
@@ -5,6 +5,7 @@ the official desktop application for the Telegram messaging service.
|
||||
For license and copyright information please follow this link:
|
||||
https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
*/
|
||||
#define _GLIBCXX_USE_CXX11_ABI 0
|
||||
#include <cstdio>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
@@ -10,6 +10,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
#include "apiwrap.h"
|
||||
#include "api/api_cloud_password.h"
|
||||
#include "api/api_send_progress.h"
|
||||
#include "api/api_suggest_post.h"
|
||||
#include "boxes/share_box.h"
|
||||
#include "boxes/passcode_box.h"
|
||||
#include "boxes/url_auth_box.h"
|
||||
@@ -399,10 +400,12 @@ void ActivateBotCommand(ClickHandlerContext context, int row, int column) {
|
||||
}
|
||||
}
|
||||
const auto replyTo = FullReplyTo();
|
||||
const auto suggest = SuggestPostOptions();
|
||||
Window::PeerMenuCreatePoll(
|
||||
controller,
|
||||
item->history()->peer,
|
||||
replyTo,
|
||||
suggest,
|
||||
chosen,
|
||||
disabled);
|
||||
} break;
|
||||
@@ -519,6 +522,27 @@ void ActivateBotCommand(ClickHandlerContext context, int row, int column) {
|
||||
controller->showToast(tr::lng_text_copied(tr::now));
|
||||
}
|
||||
} break;
|
||||
|
||||
case ButtonType::SuggestAccept: {
|
||||
Api::AcceptClickHandler(item)->onClick(ClickContext{
|
||||
Qt::LeftButton,
|
||||
QVariant::fromValue(context),
|
||||
});
|
||||
} break;
|
||||
|
||||
case ButtonType::SuggestDecline: {
|
||||
Api::DeclineClickHandler(item)->onClick(ClickContext{
|
||||
Qt::LeftButton,
|
||||
QVariant::fromValue(context),
|
||||
});
|
||||
} break;
|
||||
|
||||
case ButtonType::SuggestChange: {
|
||||
Api::SuggestChangesClickHandler(item)->onClick(ClickContext{
|
||||
Qt::LeftButton,
|
||||
QVariant::fromValue(context),
|
||||
});
|
||||
} break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -256,6 +256,7 @@ void ConfirmSubscriptionBox(
|
||||
{
|
||||
const auto balance = Settings::AddBalanceWidget(
|
||||
content,
|
||||
session,
|
||||
session->credits().balanceValue(),
|
||||
true);
|
||||
session->credits().load(true);
|
||||
@@ -436,6 +437,12 @@ void CheckChatInvite(
|
||||
}
|
||||
});
|
||||
}, [=](const MTP::Error &error) {
|
||||
if (MTP::IsFloodError(error)) {
|
||||
if (const auto strong = weak.get()) {
|
||||
strong->show(Ui::MakeInformBox(tr::lng_flood_error()));
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (error.code() != 400) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -14,7 +14,7 @@ class ChannelData;
|
||||
|
||||
namespace Info::Profile {
|
||||
class Badge;
|
||||
enum class BadgeType;
|
||||
enum class BadgeType : uchar;
|
||||
} // namespace Info::Profile
|
||||
|
||||
namespace Main {
|
||||
|
||||
@@ -494,8 +494,15 @@ void ChatParticipants::requestBots(not_null<ChannelData*> channel) {
|
||||
LOG(("API Error: "
|
||||
"channels.channelParticipantsNotModified received!"));
|
||||
});
|
||||
}).fail([=] {
|
||||
}).fail([=](const MTP::Error &error) {
|
||||
_botsRequests.remove(channel);
|
||||
if (error.type() == u"CHANNEL_MONOFORUM_UNSUPPORTED"_q) {
|
||||
channel->mgInfo->bots.clear();
|
||||
channel->mgInfo->botStatus = -1;
|
||||
channel->session().changes().peerUpdated(
|
||||
channel,
|
||||
Data::PeerUpdate::Flag::FullInfo);
|
||||
}
|
||||
}).send();
|
||||
|
||||
_botsRequests[channel] = requestId;
|
||||
@@ -648,10 +655,7 @@ void ChatParticipants::Restrict(
|
||||
channel->session().api().request(MTPchannels_EditBanned(
|
||||
channel->inputChannel,
|
||||
participant->input,
|
||||
MTP_chatBannedRights(
|
||||
MTP_flags(MTPDchatBannedRights::Flags::from_raw(
|
||||
uint32(newRights.flags))),
|
||||
MTP_int(newRights.until))
|
||||
RestrictionsToMTP(newRights)
|
||||
)).done([=](const MTPUpdates &result) {
|
||||
channel->session().api().applyUpdates(result);
|
||||
channel->applyEditBanned(participant, oldRights, newRights);
|
||||
@@ -756,10 +760,7 @@ void ChatParticipants::kick(
|
||||
const auto requestId = _api.request(MTPchannels_EditBanned(
|
||||
channel->inputChannel,
|
||||
participant->input,
|
||||
MTP_chatBannedRights(
|
||||
MTP_flags(
|
||||
MTPDchatBannedRights::Flags::from_raw(uint32(rights.flags))),
|
||||
MTP_int(rights.until))
|
||||
RestrictionsToMTP(rights)
|
||||
)).done([=](const MTPUpdates &result) {
|
||||
channel->session().api().applyUpdates(result);
|
||||
|
||||
|
||||
@@ -544,4 +544,38 @@ auto CloudPassword::checkRecoveryEmailAddressCode(const QString &code)
|
||||
};
|
||||
}
|
||||
|
||||
void RequestLoginEmailCode(
|
||||
MTP::Sender &api,
|
||||
const QString &sendToEmail,
|
||||
Fn<void(int length, const QString &pattern)> done,
|
||||
Fn<void(const QString &error)> fail) {
|
||||
api.request(MTPaccount_SendVerifyEmailCode(
|
||||
MTP_emailVerifyPurposeLoginChange(),
|
||||
MTP_string(sendToEmail)
|
||||
)).done([=](const MTPaccount_SentEmailCode &result) {
|
||||
done(result.data().vlength().v, qs(result.data().vemail_pattern()));
|
||||
}).fail([=](const MTP::Error &error) {
|
||||
fail(error.type());
|
||||
}).send();
|
||||
}
|
||||
|
||||
void VerifyLoginEmail(
|
||||
MTP::Sender &api,
|
||||
const QString &code,
|
||||
Fn<void()> done,
|
||||
Fn<void(const QString &error)> fail) {
|
||||
api.request(MTPaccount_VerifyEmail(
|
||||
MTP_emailVerifyPurposeLoginChange(),
|
||||
MTP_emailVerificationCode(MTP_string(code))
|
||||
)).done([=](const MTPaccount_EmailVerified &result) {
|
||||
result.match([=](const MTPDaccount_emailVerified &data) {
|
||||
done();
|
||||
}, [=](const MTPDaccount_emailVerifiedLogin &data) {
|
||||
fail(QString());
|
||||
});
|
||||
}).fail([=](const MTP::Error &error) {
|
||||
fail(error.type());
|
||||
}).send();
|
||||
}
|
||||
|
||||
} // namespace Api
|
||||
|
||||
@@ -70,4 +70,15 @@ private:
|
||||
|
||||
};
|
||||
|
||||
void RequestLoginEmailCode(
|
||||
MTP::Sender &api,
|
||||
const QString &sendToEmail,
|
||||
Fn<void(int length, const QString &pattern)> done,
|
||||
Fn<void(const QString &error)> fail);
|
||||
void VerifyLoginEmail(
|
||||
MTP::Sender &api,
|
||||
const QString &code,
|
||||
Fn<void()> done,
|
||||
Fn<void(const QString &error)> fail);
|
||||
|
||||
} // namespace Api
|
||||
|
||||
@@ -14,6 +14,17 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
|
||||
|
||||
namespace Api {
|
||||
|
||||
MTPSuggestedPost SuggestToMTP(SuggestPostOptions suggest) {
|
||||
using Flag = MTPDsuggestedPost::Flag;
|
||||
return suggest.exists
|
||||
? MTP_suggestedPost(
|
||||
MTP_flags((suggest.date ? Flag::f_schedule_date : Flag())
|
||||
| (suggest.price().empty() ? Flag() : Flag::f_price)),
|
||||
StarsAmountToTL(suggest.price()),
|
||||
MTP_int(suggest.date))
|
||||
: MTPSuggestedPost();
|
||||
}
|
||||
|
||||
SendAction::SendAction(
|
||||
not_null<Data::Thread*> thread,
|
||||
SendOptions options)
|
||||
|
||||
@@ -19,6 +19,8 @@ namespace Api {
|
||||
|
||||
inline constexpr auto kScheduledUntilOnlineTimestamp = TimeId(0x7FFFFFFE);
|
||||
|
||||
[[nodiscard]] MTPSuggestedPost SuggestToMTP(SuggestPostOptions suggest);
|
||||
|
||||
struct SendOptions {
|
||||
uint64 price = 0;
|
||||
PeerData *sendAs = nullptr;
|
||||
@@ -31,6 +33,7 @@ struct SendOptions {
|
||||
bool invertCaption = false;
|
||||
bool hideViaBot = false;
|
||||
crl::time ttlSeconds = 0;
|
||||
SuggestPostOptions suggest;
|
||||
|
||||
friend inline bool operator==(
|
||||
const SendOptions &,
|
||||
|
||||
@@ -150,6 +150,9 @@ void ConfirmPhone::resolve(
|
||||
}, [](const MTPDauth_sentCodeSuccess &) {
|
||||
LOG(("API Error: Unexpected auth.sentCodeSuccess "
|
||||
"(Api::ConfirmPhone)."));
|
||||
}, [](const MTPDauth_sentCodePaymentRequired &) {
|
||||
LOG(("API Error: Unexpected auth.sentCodePaymentRequired "
|
||||
"(Api::ConfirmPhone)."));
|
||||
});
|
||||
}).fail([=](const MTP::Error &error) {
|
||||
_sendRequestId = 0;
|
||||
|
||||