Compare commits

..

410 Commits

Author SHA1 Message Date
Grishka
b91840fb95 Another attempt to fix ZoomPanView crash 2023-10-01 07:16:21 +03:00
Grishka
fc10fbffb0 Clear fragment stack instead of restarting activity
grishka/appkit#13
2023-09-30 21:53:02 +03:00
Grishka
a00afd5d7f Same crash fix in 2 more places ugh 2023-09-29 03:20:58 +03:00
Grishka
9a41a2d6fb Merge branch 'l10n_master' 2023-09-28 20:14:21 +03:00
Grishka
2cd98a6620 More crash fixes 2023-09-28 20:11:43 +03:00
Grishka
283b56be5b Finally fix the mysterious RecyclerView crash 2023-09-28 19:56:25 +03:00
Eugen Rochko
6d56771aba New translations strings.xml (Galician) 2023-09-28 16:51:59 +02:00
Grishka
1724d8a532 Probably fix #703 2023-09-27 19:50:59 +03:00
Eugen Rochko
b4cdf35d36 New translations strings.xml (Russian) 2023-09-25 23:39:42 +02:00
Eugen Rochko
cad0ad7a59 New translations strings.xml (Ukrainian) 2023-09-25 22:25:17 +02:00
Grishka
ca60003c39 Fix #682 2023-09-25 23:11:10 +03:00
Grishka
0f030e0bac Fix #683 2023-09-25 23:07:34 +03:00
Grishka
6d4f212a18 Probably need to set this too 2023-09-25 23:00:15 +03:00
Grishka
183b39bc24 Specify LED color for notifications
closes #695
2023-09-25 22:58:08 +03:00
Grishka
27ad0c6fcf Crash fixes 2023-09-25 22:52:51 +03:00
Grishka
b5f661f1af I forgot to increment the version code 2023-09-25 19:25:59 +03:00
Grishka
0015f3f0bf Merge branch 'l10n_master' 2023-09-25 19:22:38 +03:00
Eugen Rochko
c5d0fdd645 New translations strings.xml (Turkish) 2023-09-25 18:20:56 +02:00
Grishka
2d09ad44fb Merge branch 'l10n_master' 2023-09-25 19:18:24 +03:00
Eugen Rochko
667fffd124 New translations strings.xml (Chinese Traditional) 2023-09-25 18:18:22 +02:00
Eugen Rochko
699233d8c7 New translations strings.xml (Filipino) 2023-09-25 18:18:05 +02:00
Grishka
56aabdc4a6 Fix empty view text style
closes #701
2023-09-25 19:12:04 +03:00
Grishka
443e2c7a6f Add a tool to detect invalid formatting in localized strings 2023-09-25 18:51:49 +03:00
Eugen Rochko
985b0f6e63 New translations strings.xml (Filipino) 2023-09-25 17:49:57 +02:00
Grishka
cc86edf276 Fix #700 2023-09-25 17:18:42 +03:00
Grishka
4071b9342d Update appkit 2023-09-25 17:13:59 +03:00
Eugen Rochko
f71d1bc5d3 New translations strings.xml (Greek) 2023-09-24 23:27:13 +02:00
Eugen Rochko
6bcdbaba34 New translations strings.xml (Turkish) 2023-09-24 08:49:38 +02:00
Eugen Rochko
a2beead3a5 New translations strings.xml (Chinese Simplified) 2023-09-23 18:34:38 +02:00
Eugen Rochko
e7a25e353d New translations strings.xml (Japanese) 2023-09-23 14:15:37 +02:00
Eugen Rochko
af04a01130 New translations strings.xml (Japanese) 2023-09-23 13:16:04 +02:00
Grishka
fe1cfa1d7b Fix indexable setting 2023-09-22 21:33:21 +03:00
Eugen Rochko
b248797bb0 New translations strings.xml (Russian) 2023-09-22 20:28:14 +02:00
Grishka
f24eba08d3 Fix custom emojis in names setting 2023-09-22 21:27:30 +03:00
Eugen Rochko
0e89559a47 New translations strings.xml (Slovenian) 2023-09-22 19:30:53 +02:00
Eugen Rochko
d02a72e079 New translations strings.xml (Japanese) 2023-09-22 13:01:51 +02:00
Eugen Rochko
3be57d1b0b New translations strings.xml (Japanese) 2023-09-22 11:08:13 +02:00
Eugen Rochko
bed550e97c New translations strings.xml (Russian) 2023-09-22 09:19:11 +02:00
Eugen Rochko
7e2619ea75 New translations strings.xml (Italian) 2023-09-22 01:48:10 +02:00
Eugen Rochko
4b22f1d3a7 New translations strings.xml (Thai) 2023-09-21 21:39:59 +02:00
Eugen Rochko
9dcc7e293f New translations strings.xml (Icelandic) 2023-09-21 15:39:27 +02:00
Eugen Rochko
6a68cf5e41 New translations strings.xml (Persian) 2023-09-21 13:13:31 +02:00
Grishka
29297be4a3 Merge branch 'l10n_master' 2023-09-20 22:43:16 +03:00
Eugen Rochko
90b87529e0 New translations strings.xml (Swedish) 2023-09-20 21:16:11 +02:00
Grishka
39af05524d Privacy settings 2023-09-20 21:44:28 +03:00
Grishka
e3fb2cd03c Scroll profile tab views to top when tab is reselected 2023-09-20 14:47:25 +03:00
Gregory K
90f84d628a Merge pull request #694 from LucasGGamerM/mastodon-android
fix(compose): fix photoPicker not popping up when there is less than 2 spaces available for media
2023-09-20 14:10:26 +03:00
LucasGGamerM
b89e0b5c5a fix(compose): fix photoPicker not popping up when there is less than 2 spaces available for media 2023-09-20 07:55:23 -03:00
Eugen Rochko
aac89c354c New translations full_description.txt (Thai) 2023-09-18 20:35:41 +02:00
Eugen Rochko
a032f9af10 New translations strings.xml (French) 2023-09-18 20:34:32 +02:00
Eugen Rochko
642aaec6da New translations strings.xml (Persian) 2023-09-17 14:08:04 +02:00
Eugen Rochko
ff667d6aed New translations strings.xml (Persian) 2023-09-17 12:27:57 +02:00
Eugen Rochko
5e98496ea6 New translations strings.xml (Vietnamese) 2023-09-17 10:39:46 +02:00
Eugen Rochko
972fe1d15b New translations strings.xml (Italian) 2023-09-17 10:39:45 +02:00
Eugen Rochko
26eaa36faa New translations strings.xml (Finnish) 2023-09-17 10:39:44 +02:00
Grishka
c517f41595 Paginate search results 2023-09-17 11:20:12 +03:00
Grishka
56a6d7243f Crash fixes 2023-09-17 10:49:13 +03:00
Grishka
18e43dfc22 Crash fix 2023-09-17 10:32:59 +03:00
Grishka
816f6370ef Fix #690 2023-09-17 10:26:27 +03:00
Eugen Rochko
ebc2b2e59d New translations strings.xml (Arabic) 2023-09-15 11:51:46 +02:00
Eugen Rochko
c9a796dbfe New translations strings.xml (Arabic) 2023-09-15 10:16:56 +02:00
Eugen Rochko
1ba185ea9c New translations strings.xml (Vietnamese) 2023-09-15 03:45:44 +02:00
Eugen Rochko
a78be8bc1d New translations strings.xml (Chinese Traditional) 2023-09-14 12:55:27 +02:00
Eugen Rochko
abfb497577 New translations strings.xml (Chinese Traditional) 2023-09-14 11:17:24 +02:00
Eugen Rochko
a10b184508 New translations full_description.txt (Finnish) 2023-09-13 21:32:19 +02:00
Eugen Rochko
f0ea6660e6 New translations strings.xml (Finnish) 2023-09-13 21:32:18 +02:00
Eugen Rochko
a829f25d56 New translations strings.xml (Thai) 2023-09-13 20:36:48 +02:00
Eugen Rochko
deff3dd8e0 New translations strings.xml (Finnish) 2023-09-13 20:36:47 +02:00
Eugen Rochko
6c5fb5ea09 New translations strings.xml (Dutch) 2023-09-12 12:25:35 +02:00
Eugen Rochko
afe0c9e0db New translations strings.xml (Dutch) 2023-09-12 10:19:31 +02:00
Eugen Rochko
1f2213042f New translations strings.xml (Urdu (India)) 2023-09-12 06:51:43 +02:00
Eugen Rochko
5edd2466f9 New translations strings.xml (Kabyle) 2023-09-12 06:51:42 +02:00
Eugen Rochko
f3b3a1a577 New translations strings.xml (Igbo) 2023-09-12 06:51:41 +02:00
Eugen Rochko
068619b815 New translations strings.xml (Occitan) 2023-09-12 06:51:40 +02:00
Eugen Rochko
f121e94979 New translations strings.xml (Scottish Gaelic) 2023-09-12 06:51:39 +02:00
Eugen Rochko
b5b52529d4 New translations strings.xml (Sinhala) 2023-09-12 06:51:38 +02:00
Eugen Rochko
876bf73454 New translations strings.xml (Bosnian) 2023-09-12 06:51:37 +02:00
Eugen Rochko
522dbf6e4a New translations strings.xml (Filipino) 2023-09-12 06:51:36 +02:00
Eugen Rochko
ae685095ba New translations strings.xml (Burmese) 2023-09-12 06:51:35 +02:00
Eugen Rochko
30d5fe2f12 New translations strings.xml (Hindi) 2023-09-12 06:51:34 +02:00
Eugen Rochko
2bf27c561c New translations strings.xml (Croatian) 2023-09-12 06:51:33 +02:00
Eugen Rochko
bbdc72323d New translations strings.xml (Thai) 2023-09-12 06:51:31 +02:00
Eugen Rochko
6e335930f3 New translations strings.xml (Bengali) 2023-09-12 06:51:31 +02:00
Eugen Rochko
9b309939da New translations strings.xml (Persian) 2023-09-12 06:51:30 +02:00
Eugen Rochko
faf2e5115d New translations strings.xml (Indonesian) 2023-09-12 06:51:28 +02:00
Eugen Rochko
dc5d9412c8 New translations strings.xml (Portuguese, Brazilian) 2023-09-12 06:51:27 +02:00
Eugen Rochko
fc0680d66f New translations strings.xml (Icelandic) 2023-09-12 06:51:26 +02:00
Eugen Rochko
56c9a5433f New translations strings.xml (Galician) 2023-09-12 06:51:25 +02:00
Eugen Rochko
60e473ee55 New translations strings.xml (Vietnamese) 2023-09-12 06:51:24 +02:00
Eugen Rochko
ae34ecd5c3 New translations strings.xml (Chinese Traditional) 2023-09-12 06:51:23 +02:00
Eugen Rochko
fd1caa8729 New translations strings.xml (Chinese Simplified) 2023-09-12 06:51:22 +02:00
Eugen Rochko
1182e5c60c New translations strings.xml (Ukrainian) 2023-09-12 06:51:21 +02:00
Eugen Rochko
d99d515dfa New translations strings.xml (Turkish) 2023-09-12 06:51:20 +02:00
Eugen Rochko
70a15e7d9c New translations strings.xml (Swedish) 2023-09-12 06:51:19 +02:00
Eugen Rochko
1691382369 New translations strings.xml (Slovenian) 2023-09-12 06:51:18 +02:00
Eugen Rochko
b7da9c6d51 New translations strings.xml (Russian) 2023-09-12 06:51:17 +02:00
Eugen Rochko
3426538dca New translations strings.xml (Portuguese) 2023-09-12 06:51:16 +02:00
Eugen Rochko
63de2b200b New translations strings.xml (Polish) 2023-09-12 06:51:15 +02:00
Eugen Rochko
ff1ee766dc New translations strings.xml (Norwegian) 2023-09-12 06:51:14 +02:00
Eugen Rochko
f033411adf New translations strings.xml (Dutch) 2023-09-12 06:51:13 +02:00
Eugen Rochko
a738eaf8c0 New translations strings.xml (Korean) 2023-09-12 06:51:12 +02:00
Eugen Rochko
5074aadd6e New translations strings.xml (Japanese) 2023-09-12 06:51:11 +02:00
Eugen Rochko
0854961470 New translations strings.xml (Italian) 2023-09-12 06:51:10 +02:00
Eugen Rochko
227b077935 New translations strings.xml (Armenian) 2023-09-12 06:51:09 +02:00
Eugen Rochko
1e4358290a New translations strings.xml (Hungarian) 2023-09-12 06:51:08 +02:00
Eugen Rochko
925169eb31 New translations strings.xml (Hebrew) 2023-09-12 06:51:07 +02:00
Eugen Rochko
e1abeb9252 New translations strings.xml (Irish) 2023-09-12 06:51:07 +02:00
Eugen Rochko
cbe0add211 New translations strings.xml (Finnish) 2023-09-12 06:51:06 +02:00
Eugen Rochko
299b524d62 New translations strings.xml (Basque) 2023-09-12 06:51:05 +02:00
Eugen Rochko
31c094e696 New translations strings.xml (Greek) 2023-09-12 06:51:04 +02:00
Eugen Rochko
a8038a2863 New translations strings.xml (German) 2023-09-12 06:51:02 +02:00
Eugen Rochko
29933bb916 New translations strings.xml (Danish) 2023-09-12 06:51:01 +02:00
Eugen Rochko
5ec0c078d8 New translations strings.xml (Czech) 2023-09-12 06:51:00 +02:00
Eugen Rochko
e6287f1ff2 New translations strings.xml (Catalan) 2023-09-12 06:50:59 +02:00
Eugen Rochko
be9caf8905 New translations strings.xml (Belarusian) 2023-09-12 06:50:58 +02:00
Eugen Rochko
f375142084 New translations strings.xml (Arabic) 2023-09-12 06:50:57 +02:00
Eugen Rochko
fd3668d520 New translations strings.xml (Spanish) 2023-09-12 06:50:56 +02:00
Eugen Rochko
d5e03e9d9e New translations strings.xml (French) 2023-09-12 06:50:55 +02:00
Eugen Rochko
d62f094919 New translations strings.xml (Romanian) 2023-09-12 06:50:54 +02:00
Grishka
6d84f28600 Hashtag following
closes #684, closes #233
2023-09-12 07:49:14 +03:00
Grishka
209e603f2c oops 2023-09-12 06:05:45 +03:00
Grishka
1b4dc01c74 Post translation
closes #267, closes #671, closes #502
2023-09-12 06:00:40 +03:00
Grishka
645af12c3f Merge branch 'l10n_master' 2023-09-12 02:32:38 +03:00
Grishka
fadc42d72b New version 2023-09-12 02:32:23 +03:00
Eugen Rochko
fc831e7d42 New translations strings.xml (Portuguese, Brazilian) 2023-09-11 22:36:20 +02:00
Eugen Rochko
2998ee9145 New translations strings.xml (Finnish) 2023-09-11 20:09:41 +02:00
Eugen Rochko
971c4e5879 New translations strings.xml (Finnish) 2023-09-11 19:00:28 +02:00
Eugen Rochko
b396ee7987 New translations strings.xml (Indonesian) 2023-09-10 15:07:27 +02:00
Eugen Rochko
0f803cd4fa New translations strings.xml (Finnish) 2023-09-09 20:30:25 +02:00
Eugen Rochko
167a14b8db New translations strings.xml (Finnish) 2023-09-09 19:29:29 +02:00
Eugen Rochko
81cbc2d10c New translations strings.xml (Ukrainian) 2023-09-09 15:40:28 +02:00
Eugen Rochko
9bd8aff99b New translations strings.xml (Finnish) 2023-09-09 12:08:15 +02:00
Eugen Rochko
a770828165 New translations strings.xml (Finnish) 2023-09-09 11:09:40 +02:00
Eugen Rochko
ab457035ff New translations strings.xml (Finnish) 2023-09-09 08:34:27 +02:00
Grishka
f886e4c1d2 Fix #658, fix #620 2023-09-09 03:39:27 +03:00
Eugen Rochko
be73c9e81c New translations strings.xml (Basque) 2023-09-07 02:28:42 +02:00
Eugen Rochko
1c2183bf1a New translations strings.xml (Slovenian) 2023-09-06 22:29:03 +02:00
Gregory K
1789d90dc3 Merge pull request #685 from LucasGGamerM/mastodon-android
fix(editing-alt-text): fix small oversight on editing existing attachments without alt text
2023-09-06 01:42:41 +03:00
LucasGGamerM
57306ff7fe fix(editing-alt-text): fix small oversight on editing existing attachments without alt text
This makes the implementation hopefully bug free
2023-09-05 19:37:12 -03:00
Eugen Rochko
f0eb6573f4 New translations strings.xml (Portuguese, Brazilian) 2023-09-04 08:10:24 +02:00
Eugen Rochko
e7f5dd3357 New translations strings.xml (Bengali) 2023-09-04 07:10:06 +02:00
Eugen Rochko
8101bb9ea1 New translations strings.xml (Portuguese, Brazilian) 2023-09-04 07:10:05 +02:00
Eugen Rochko
228fdc8ffe New translations strings.xml (Swedish) 2023-09-03 11:26:37 +02:00
Eugen Rochko
e9df125cde New translations strings.xml (Swedish) 2023-09-01 16:10:32 +02:00
Gregory K
16ef577a7a Merge pull request #678 from LucasGGamerM/mastodon-android
fix: fix alt texts not being able to be edited
2023-08-31 20:31:39 +03:00
LucasGGamerM
734b3bced6 fix: fix alt texts not being able to be edited
fixes #70 cc: @sk22
2023-08-31 14:18:32 -03:00
Gregory K
5f6f3c94c9 Merge pull request #677 from tinsukE/gap-local-filter
When loading gap posts, apply filters before building display items.
2023-08-31 15:06:07 +03:00
Angelo Suzuki
09ba42a974 When loading gap posts, apply filters before building display items.
This will make sure that items that are filtered out don't show up on the interface.
Fixes #675
2023-08-31 14:01:58 +02:00
Eugen Rochko
d76e823489 New translations strings.xml (Italian) 2023-08-29 11:52:38 +02:00
Eugen Rochko
900b204bb0 New translations strings.xml (Portuguese, Brazilian) 2023-08-27 16:51:00 +02:00
Eugen Rochko
17d679901a New translations strings.xml (Japanese) 2023-08-27 15:42:52 +02:00
Eugen Rochko
d8036779f8 New translations strings.xml (Japanese) 2023-08-27 14:46:15 +02:00
Eugen Rochko
3f6bda28b3 New translations strings.xml (Vietnamese) 2023-08-26 17:43:48 +02:00
Eugen Rochko
c0b4f4dd79 New translations strings.xml (Vietnamese) 2023-08-26 16:06:27 +02:00
Eugen Rochko
f36aee44c6 New translations strings.xml (Scottish Gaelic) 2023-08-25 09:54:23 +02:00
Eugen Rochko
cd24526a9d New translations strings.xml (Swedish) 2023-08-24 17:48:37 +02:00
Eugen Rochko
a345ac1390 New translations strings.xml (Icelandic) 2023-08-24 17:48:36 +02:00
Eugen Rochko
3d987b8e1d New translations strings.xml (Thai) 2023-08-23 21:39:07 +02:00
Eugen Rochko
57043912e0 New translations strings.xml (Chinese Traditional) 2023-08-23 19:16:40 +02:00
Eugen Rochko
00aef5ea6b New translations full_description.txt (Arabic) 2023-08-23 13:02:31 +02:00
Eugen Rochko
369b69668c New translations strings.xml (Arabic) 2023-08-23 13:02:29 +02:00
Eugen Rochko
65245f4560 New translations strings.xml (Arabic) 2023-08-23 09:39:50 +02:00
Eugen Rochko
4d4fdc97d4 New translations strings.xml (French) 2023-08-23 09:39:49 +02:00
Eugen Rochko
c96577891c New translations strings.xml (Scottish Gaelic) 2023-08-23 07:00:18 +02:00
Eugen Rochko
f48b2fc9cb New translations strings.xml (Thai) 2023-08-23 07:00:13 +02:00
Eugen Rochko
2fca2580ed New translations strings.xml (Bengali) 2023-08-23 07:00:12 +02:00
Eugen Rochko
7adc1da361 New translations strings.xml (Persian) 2023-08-23 07:00:11 +02:00
Eugen Rochko
6dc24dde43 New translations strings.xml (Indonesian) 2023-08-23 07:00:10 +02:00
Eugen Rochko
4929e0e6ec New translations strings.xml (Portuguese, Brazilian) 2023-08-23 07:00:09 +02:00
Eugen Rochko
16a8b8ed71 New translations strings.xml (Icelandic) 2023-08-23 07:00:08 +02:00
Eugen Rochko
ad1412817e New translations strings.xml (Galician) 2023-08-23 07:00:07 +02:00
Eugen Rochko
d9e6bb3bea New translations strings.xml (Vietnamese) 2023-08-23 07:00:06 +02:00
Eugen Rochko
8970404638 New translations strings.xml (Chinese Traditional) 2023-08-23 07:00:05 +02:00
Eugen Rochko
2a2241d7f9 New translations strings.xml (Chinese Simplified) 2023-08-23 07:00:04 +02:00
Eugen Rochko
db1a47e8eb New translations strings.xml (Ukrainian) 2023-08-23 07:00:03 +02:00
Eugen Rochko
3e57061cef New translations strings.xml (Turkish) 2023-08-23 07:00:02 +02:00
Eugen Rochko
cd200f8450 New translations strings.xml (Slovenian) 2023-08-23 07:00:00 +02:00
Eugen Rochko
782013079f New translations strings.xml (Russian) 2023-08-23 06:59:59 +02:00
Eugen Rochko
e5db8acd66 New translations strings.xml (Polish) 2023-08-23 06:59:57 +02:00
Eugen Rochko
1a6a8019c8 New translations strings.xml (Norwegian) 2023-08-23 06:59:57 +02:00
Eugen Rochko
e935eef29f New translations strings.xml (Dutch) 2023-08-23 06:59:56 +02:00
Eugen Rochko
381defda51 New translations strings.xml (Japanese) 2023-08-23 06:59:54 +02:00
Eugen Rochko
02ae80c204 New translations strings.xml (Italian) 2023-08-23 06:59:53 +02:00
Eugen Rochko
82214b30e8 New translations strings.xml (Armenian) 2023-08-23 06:59:52 +02:00
Eugen Rochko
33a1f48602 New translations strings.xml (Greek) 2023-08-23 06:59:48 +02:00
Eugen Rochko
aee845e5cc New translations strings.xml (German) 2023-08-23 06:59:47 +02:00
Eugen Rochko
cd780f6006 New translations strings.xml (Danish) 2023-08-23 06:59:46 +02:00
Eugen Rochko
d4741fefa0 New translations strings.xml (Czech) 2023-08-23 06:59:46 +02:00
Eugen Rochko
7e1e8a2616 New translations strings.xml (Belarusian) 2023-08-23 06:59:44 +02:00
Eugen Rochko
d73c05cdfc New translations strings.xml (Arabic) 2023-08-23 06:59:43 +02:00
Eugen Rochko
78323023cb New translations strings.xml (Spanish) 2023-08-23 06:59:42 +02:00
Eugen Rochko
2cf084c98f New translations strings.xml (French) 2023-08-23 06:59:41 +02:00
Grishka
e5bdeba1d7 Fix strings 2023-08-23 00:44:40 +03:00
Grishka
8d7db7774f Merge branch 'l10n_master' 2023-08-23 00:40:45 +03:00
Grishka
78d22c670c Fix reporting 2023-08-23 00:40:38 +03:00
Eugen Rochko
0a679109f5 New translations strings.xml (Arabic) 2023-08-22 17:14:41 +02:00
Eugen Rochko
e843142b7e New translations strings.xml (Arabic) 2023-08-22 13:15:25 +02:00
Eugen Rochko
72e728f655 New translations strings.xml (French) 2023-08-22 13:15:23 +02:00
Eugen Rochko
ef56792f56 New translations strings.xml (Arabic) 2023-08-22 11:39:27 +02:00
Eugen Rochko
504a6959e8 New translations strings.xml (French) 2023-08-22 11:39:25 +02:00
Eugen Rochko
b8e3060887 New translations strings.xml (Arabic) 2023-08-21 21:00:00 +02:00
Eugen Rochko
1aa1ede421 New translations strings.xml (Arabic) 2023-08-21 20:03:05 +02:00
Eugen Rochko
480dba7629 New translations strings.xml (Arabic) 2023-08-21 19:05:39 +02:00
Eugen Rochko
9b9c66a149 New translations strings.xml (Arabic) 2023-08-21 17:43:00 +02:00
Eugen Rochko
0f5eb923ee New translations strings.xml (Arabic) 2023-08-21 16:13:06 +02:00
Eugen Rochko
90ed28e7a0 New translations strings.xml (French) 2023-08-20 17:34:05 +01:00
Eugen Rochko
d2b45c1c84 New translations strings.xml (Swedish) 2023-08-20 12:43:05 +01:00
Eugen Rochko
a119ba5f80 New translations strings.xml (Danish) 2023-08-19 17:08:25 +01:00
Eugen Rochko
8c1191a08f New translations strings.xml (Danish) 2023-08-19 16:09:27 +01:00
Eugen Rochko
4275d596e6 New translations strings.xml (Thai) 2023-08-19 12:46:09 +01:00
Eugen Rochko
cc83f2baf3 New translations strings.xml (Danish) 2023-08-18 01:51:02 +01:00
Eugen Rochko
728496b831 New translations strings.xml (Danish) 2023-08-18 00:06:12 +01:00
Eugen Rochko
bbc99162c6 New translations strings.xml (Danish) 2023-08-17 16:47:55 +01:00
Eugen Rochko
eed3af9e3e New translations strings.xml (Arabic) 2023-08-16 22:54:50 +02:00
Eugen Rochko
50187ff376 New translations strings.xml (Arabic) 2023-08-16 21:48:52 +02:00
Eugen Rochko
5f30919fb4 New translations strings.xml (Arabic) 2023-08-16 18:38:58 +02:00
Eugen Rochko
14c3cfac85 New translations strings.xml (French) 2023-08-16 15:50:45 +02:00
Eugen Rochko
e978f02765 New translations strings.xml (French) 2023-08-16 14:09:02 +02:00
Eugen Rochko
8d877c480f New translations strings.xml (French) 2023-08-16 12:20:32 +02:00
Eugen Rochko
c53efee9a1 New translations strings.xml (Thai) 2023-08-15 22:47:32 +02:00
Eugen Rochko
148c461e86 New translations strings.xml (Danish) 2023-08-15 16:40:55 +02:00
Eugen Rochko
fcadb9883d New translations strings.xml (Danish) 2023-08-15 14:59:58 +02:00
Eugen Rochko
bb6491e10a New translations full_description.txt (Danish) 2023-08-15 14:59:57 +02:00
Eugen Rochko
6248ccf376 New translations full_description.txt (Danish) 2023-08-15 13:53:21 +02:00
Eugen Rochko
c9e08f36fa New translations full_description.txt (Danish) 2023-08-15 03:19:07 +02:00
Eugen Rochko
10b95d753b New translations full_description.txt (Danish) 2023-08-15 02:15:33 +02:00
Eugen Rochko
c3989083cf New translations strings.xml (Portuguese) 2023-08-14 15:33:01 +02:00
Eugen Rochko
01db585094 New translations strings.xml (Basque) 2023-08-14 01:42:56 +02:00
Eugen Rochko
cc67cb330c New translations full_description.txt (Basque) 2023-08-14 00:10:18 +02:00
Eugen Rochko
52ed3c5a04 New translations strings.xml (Basque) 2023-08-14 00:10:17 +02:00
Eugen Rochko
5976f6230a New translations strings.xml (Chinese Simplified) 2023-08-13 18:58:06 +02:00
Eugen Rochko
3553f03a95 New translations strings.xml (Slovenian) 2023-08-13 11:06:06 +02:00
Eugen Rochko
d6e2d889c3 New translations strings.xml (Slovenian) 2023-08-12 16:02:40 +02:00
Eugen Rochko
a777b3b450 New translations strings.xml (Slovenian) 2023-08-12 14:07:49 +02:00
Eugen Rochko
9957efbea0 New translations strings.xml (Norwegian) 2023-08-12 01:06:29 +02:00
Eugen Rochko
22e7b9730f New translations strings.xml (Vietnamese) 2023-08-11 17:50:37 +02:00
Eugen Rochko
91470b8509 New translations strings.xml (Vietnamese) 2023-08-11 16:21:15 +02:00
Eugen Rochko
c9d5327328 New translations strings.xml (Russian) 2023-08-11 12:41:37 +02:00
Eugen Rochko
1aa61b72e5 New translations strings.xml (Russian) 2023-08-11 10:45:11 +02:00
Eugen Rochko
3ca5edc3fc New translations strings.xml (Russian) 2023-08-11 09:19:15 +02:00
Eugen Rochko
a092ebaeb3 New translations strings.xml (Russian) 2023-08-11 08:03:02 +02:00
Eugen Rochko
5b9e84c255 New translations strings.xml (Russian) 2023-08-11 07:07:00 +02:00
Eugen Rochko
9c058b926f New translations strings.xml (Russian) 2023-08-10 12:30:16 +02:00
Eugen Rochko
4f2d2ae6e8 New translations strings.xml (Russian) 2023-08-10 11:10:22 +02:00
Eugen Rochko
75aa26a018 New translations strings.xml (Russian) 2023-08-09 14:50:26 +02:00
Eugen Rochko
0f795254e5 New translations strings.xml (Russian) 2023-08-09 13:28:03 +02:00
Eugen Rochko
33592f0a83 New translations strings.xml (Swedish) 2023-08-07 12:43:38 +02:00
Eugen Rochko
d6fd01eaca New translations strings.xml (Swedish) 2023-08-07 10:56:51 +02:00
Eugen Rochko
ee6e0ff26c New translations strings.xml (Russian) 2023-08-04 19:26:18 +02:00
Eugen Rochko
4d9574bf38 New translations strings.xml (Russian) 2023-08-04 17:51:30 +02:00
Eugen Rochko
813be9a2be New translations strings.xml (Russian) 2023-08-04 16:30:43 +02:00
Eugen Rochko
cc76ebfafb New translations strings.xml (Russian) 2023-08-04 14:58:02 +02:00
Eugen Rochko
7989ee0243 New translations strings.xml (Russian) 2023-08-04 13:58:08 +02:00
Eugen Rochko
3aa1997cfd New translations strings.xml (Russian) 2023-08-04 12:51:54 +02:00
Grishka
c3da15552e Merge branch 'l10n_master' 2023-08-03 17:22:04 +03:00
Grishka
a014fe9443 Fix media layout with unknown sizes 2023-08-03 17:21:40 +03:00
Eugen Rochko
92551d4ca3 New translations strings.xml (Portuguese, Brazilian) 2023-08-03 03:27:17 +02:00
Eugen Rochko
8010858e85 New translations strings.xml (Portuguese, Brazilian) 2023-08-03 02:26:22 +02:00
Eugen Rochko
4efb4875b0 New translations strings.xml (Swedish) 2023-08-02 09:16:24 +02:00
Eugen Rochko
c5d041e46d New translations strings.xml (Portuguese, Brazilian) 2023-08-01 23:11:09 +02:00
Eugen Rochko
53c2223aae New translations strings.xml (Portuguese, Brazilian) 2023-08-01 21:25:07 +02:00
Eugen Rochko
25034ac0ae New translations strings.xml (Portuguese, Brazilian) 2023-08-01 01:41:52 +02:00
Eugen Rochko
ac9de72b75 New translations strings.xml (Portuguese, Brazilian) 2023-08-01 00:42:41 +02:00
Eugen Rochko
1f48ad93f2 New translations strings.xml (Portuguese, Brazilian) 2023-07-31 23:46:36 +02:00
Eugen Rochko
38f7f7aa00 New translations strings.xml (Czech) 2023-07-31 14:32:20 +02:00
Eugen Rochko
fe8175c63a New translations strings.xml (French) 2023-07-30 19:39:54 +02:00
Eugen Rochko
2d9e01bbc1 New translations strings.xml (French) 2023-07-30 18:44:39 +02:00
Eugen Rochko
022a227b08 New translations strings.xml (Turkish) 2023-07-28 00:29:16 +02:00
Eugen Rochko
a2228259f1 New translations full_description.txt (Turkish) 2023-07-27 23:33:53 +02:00
Eugen Rochko
a61af7c56f New translations strings.xml (Turkish) 2023-07-27 23:33:52 +02:00
Eugen Rochko
5d6a646976 New translations strings.xml (French) 2023-07-27 23:33:51 +02:00
Eugen Rochko
628d0d7492 New translations strings.xml (French) 2023-07-27 22:05:11 +02:00
Eugen Rochko
b76c8745ec New translations strings.xml (Norwegian) 2023-07-25 22:57:26 +02:00
Eugen Rochko
51e67bc441 New translations strings.xml (Norwegian) 2023-07-25 21:52:29 +02:00
Gregory K
8887f75b70 Merge pull request #655 from nilathedragon/patch-1
Do not assume languages array will contain entries
2023-07-25 19:12:56 +03:00
Nila
9436a838c0 Do not assume languages array will contain entries 2023-07-25 17:28:41 +02:00
Eugen Rochko
ef120fa36f New translations strings.xml (Swedish) 2023-07-25 00:55:54 +02:00
Eugen Rochko
8c6385e2c5 New translations strings.xml (Swedish) 2023-07-24 23:57:42 +02:00
Eugen Rochko
0bd85d9905 New translations strings.xml (Persian) 2023-07-24 13:40:53 +02:00
Eugen Rochko
ce0dab7b28 New translations strings.xml (Czech) 2023-07-24 09:55:45 +02:00
Eugen Rochko
ddcc5670ce New translations strings.xml (Bengali) 2023-07-22 17:48:06 +02:00
Eugen Rochko
86afa184e2 New translations strings.xml (Bengali) 2023-07-22 16:26:35 +02:00
Eugen Rochko
77f341f139 New translations strings.xml (German) 2023-07-22 12:27:40 +02:00
Eugen Rochko
918b5d99c2 New translations strings.xml (Swedish) 2023-07-21 22:09:32 +02:00
Eugen Rochko
7a098d6eff New translations strings.xml (Swedish) 2023-07-21 21:06:04 +02:00
Eugen Rochko
71f81283f5 New translations strings.xml (Polish) 2023-07-20 13:51:45 +02:00
Eugen Rochko
058c7c3c33 New translations strings.xml (Danish) 2023-07-20 10:31:41 +02:00
Eugen Rochko
870e33879b New translations strings.xml (Indonesian) 2023-07-19 07:48:32 +02:00
Eugen Rochko
3ca82bdfc5 New translations strings.xml (Japanese) 2023-07-19 05:08:28 +02:00
Eugen Rochko
4721bad286 New translations short_description.txt (Armenian) 2023-07-18 16:30:06 +02:00
Eugen Rochko
f040cf2f07 New translations full_description.txt (Armenian) 2023-07-18 16:30:05 +02:00
Eugen Rochko
8d50717c90 New translations strings.xml (Armenian) 2023-07-18 16:30:04 +02:00
Eugen Rochko
2512ad3c95 New translations strings.xml (Armenian) 2023-07-18 14:49:00 +02:00
Eugen Rochko
bc7e007634 New translations strings.xml (Swedish) 2023-07-18 12:03:42 +02:00
Eugen Rochko
1f3c87e0c7 New translations strings.xml (Swedish) 2023-07-18 10:31:42 +02:00
Grishka
4bb255e0bb Fix #619 2023-07-17 20:25:08 +03:00
Eugen Rochko
73e08faee9 New translations strings.xml (Persian) 2023-07-13 20:45:58 +02:00
Eugen Rochko
02dc7711e4 New translations strings.xml (Persian) 2023-07-13 19:38:29 +02:00
Eugen Rochko
67b4d80e5b New translations strings.xml (Spanish) 2023-07-13 16:08:11 +02:00
Eugen Rochko
5168d2bb39 New translations strings.xml (Spanish) 2023-07-13 14:59:49 +02:00
Eugen Rochko
57190a75bf New translations strings.xml (Indonesian) 2023-07-13 11:54:32 +02:00
Eugen Rochko
f10e865895 New translations strings.xml (Indonesian) 2023-07-13 10:48:50 +02:00
Grishka
91b4dc412b Merge branch 'l10n_master' 2023-07-13 05:59:52 +03:00
Eugen Rochko
c896fd8df8 New translations strings.xml (Persian) 2023-07-10 20:31:28 +02:00
Eugen Rochko
72cd987284 New translations strings.xml (Persian) 2023-07-10 19:33:53 +02:00
Eugen Rochko
d868d05080 New translations strings.xml (Persian) 2023-07-10 18:35:13 +02:00
Eugen Rochko
9dfb039a69 New translations strings.xml (Persian) 2023-07-10 17:14:05 +02:00
Eugen Rochko
f2920e877b New translations strings.xml (Persian) 2023-07-10 14:23:55 +02:00
Eugen Rochko
ecb0b3f9d7 New translations strings.xml (Persian) 2023-07-10 13:27:29 +02:00
Eugen Rochko
67c128be69 New translations strings.xml (Persian) 2023-07-09 20:48:43 +02:00
Eugen Rochko
1ecbbc2d4b New translations strings.xml (Ukrainian) 2023-07-09 19:53:27 +02:00
Eugen Rochko
82c481b014 New translations strings.xml (Persian) 2023-07-09 19:53:26 +02:00
Eugen Rochko
e7da6d7897 New translations full_description.txt (Ukrainian) 2023-07-09 18:55:26 +02:00
Eugen Rochko
e9f1e3038b New translations strings.xml (Ukrainian) 2023-07-09 18:55:25 +02:00
Eugen Rochko
a591096819 New translations strings.xml (Ukrainian) 2023-07-09 17:59:09 +02:00
Eugen Rochko
f1ef60475f New translations strings.xml (Ukrainian) 2023-07-09 14:35:38 +02:00
Eugen Rochko
ce75bb3984 New translations strings.xml (Russian) 2023-07-08 15:46:20 +02:00
Eugen Rochko
d59235e04c New translations strings.xml (Ukrainian) 2023-07-08 13:47:53 +02:00
Eugen Rochko
42f8f7e58f New translations strings.xml (Ukrainian) 2023-07-08 12:50:49 +02:00
Eugen Rochko
f9cbc9ae27 New translations strings.xml (Ukrainian) 2023-07-08 11:54:51 +02:00
Eugen Rochko
a50d6599bf New translations strings.xml (Ukrainian) 2023-07-08 10:56:13 +02:00
Eugen Rochko
cc578b496e New translations strings.xml (Vietnamese) 2023-07-08 09:39:17 +02:00
Eugen Rochko
662944d246 New translations strings.xml (Ukrainian) 2023-07-08 09:39:16 +02:00
Eugen Rochko
42810df4a5 New translations full_description.txt (Ukrainian) 2023-07-08 08:40:55 +02:00
Eugen Rochko
c3a058d2e1 New translations strings.xml (Vietnamese) 2023-07-08 08:40:54 +02:00
Eugen Rochko
ce5d835ae5 New translations strings.xml (Ukrainian) 2023-07-08 08:40:53 +02:00
Eugen Rochko
60dd561729 New translations strings.xml (Vietnamese) 2023-07-08 07:25:45 +02:00
Eugen Rochko
08c9f9ad7d New translations strings.xml (Russian) 2023-07-08 03:34:48 +02:00
Eugen Rochko
d47907906d New translations strings.xml (Ukrainian) 2023-07-07 23:24:33 +02:00
Eugen Rochko
935f0f6e05 New translations strings.xml (Ukrainian) 2023-07-07 22:27:12 +02:00
Eugen Rochko
ac0b21d574 New translations strings.xml (Ukrainian) 2023-07-07 21:27:12 +02:00
Eugen Rochko
9b5d05369f New translations strings.xml (Ukrainian) 2023-07-07 20:30:29 +02:00
Eugen Rochko
489f9f5e59 New translations strings.xml (Ukrainian) 2023-07-07 19:30:49 +02:00
Eugen Rochko
e62f7c23c9 New translations full_description.txt (Ukrainian) 2023-07-07 18:29:20 +02:00
Eugen Rochko
91ed7d49b5 New translations strings.xml (Ukrainian) 2023-07-07 18:29:19 +02:00
Eugen Rochko
c9e9abd811 New translations strings.xml (Ukrainian) 2023-07-07 17:11:15 +02:00
Eugen Rochko
b1e5023f62 New translations strings.xml (Ukrainian) 2023-07-07 16:10:53 +02:00
Eugen Rochko
604690b3f5 New translations strings.xml (Japanese) 2023-07-07 11:50:09 +02:00
Eugen Rochko
13ada6ecc6 New translations strings.xml (French) 2023-07-07 10:47:28 +02:00
Eugen Rochko
b897eb913e New translations short_description.txt (Turkish) 2023-07-06 22:08:52 +02:00
Eugen Rochko
c25602a650 New translations full_description.txt (Turkish) 2023-07-06 22:08:51 +02:00
Eugen Rochko
2defc9af3f New translations strings.xml (Turkish) 2023-07-06 22:08:50 +02:00
Eugen Rochko
446525389b New translations strings.xml (Turkish) 2023-07-06 21:11:01 +02:00
Eugen Rochko
756b30d04f New translations strings.xml (Turkish) 2023-07-06 20:15:49 +02:00
Eugen Rochko
51ec842815 New translations strings.xml (German) 2023-07-06 20:15:48 +02:00
Eugen Rochko
c38822849e New translations strings.xml (German) 2023-07-06 19:01:48 +02:00
Eugen Rochko
3c69201f67 New translations strings.xml (Chinese Simplified) 2023-07-06 19:01:46 +02:00
Eugen Rochko
ed9d701406 New translations strings.xml (Turkish) 2023-07-06 17:29:14 +02:00
Eugen Rochko
e70c5aa2e9 New translations strings.xml (Chinese Simplified) 2023-07-06 17:29:13 +02:00
Eugen Rochko
0c4589b257 New translations strings.xml (Turkish) 2023-07-06 15:04:45 +02:00
Eugen Rochko
84d08392fb New translations strings.xml (Turkish) 2023-07-06 14:03:25 +02:00
Eugen Rochko
8ff117308d New translations strings.xml (Turkish) 2023-07-06 13:06:03 +02:00
Eugen Rochko
b6c703adbc New translations strings.xml (Bengali) 2023-07-05 18:26:29 +02:00
Eugen Rochko
22e6934de5 New translations strings.xml (Scottish Gaelic) 2023-07-05 17:21:45 +02:00
Eugen Rochko
1b8a1d69ac New translations strings.xml (Bengali) 2023-07-05 17:21:43 +02:00
Eugen Rochko
b6ae83937b New translations strings.xml (Turkish) 2023-07-05 16:09:20 +02:00
Eugen Rochko
7115556663 New translations strings.xml (Turkish) 2023-07-05 15:08:07 +02:00
Eugen Rochko
cb3296661e New translations strings.xml (French) 2023-07-05 09:09:16 +02:00
Eugen Rochko
6dd20a6df9 New translations strings.xml (French) 2023-07-05 07:58:16 +02:00
Eugen Rochko
71c1d0e59a New translations strings.xml (French) 2023-07-04 21:49:47 +02:00
Eugen Rochko
2b275e1ff7 New translations strings.xml (Japanese) 2023-07-04 15:23:25 +02:00
Eugen Rochko
a7fcae1033 New translations strings.xml (Greek) 2023-07-04 11:27:42 +02:00
Grishka
19bd189b33 🤔 2023-07-04 02:53:48 +03:00
Grishka
2d5089c047 Crash fix 2023-07-04 02:51:50 +03:00
Grishka
be7469bd54 Merge branch 'l10n_master' 2023-07-04 01:36:27 +03:00
Grishka
146d8daa6e Add editorconfig
So that PRs like #625 don't happen again
2023-07-04 01:05:55 +03:00
Eugen Rochko
f3928d9e09 New translations strings.xml (Scottish Gaelic) 2023-07-03 19:38:09 +02:00
Eugen Rochko
d4090d459d New translations strings.xml (Greek) 2023-07-03 17:49:55 +02:00
Eugen Rochko
7dd7554c08 New translations strings.xml (Icelandic) 2023-07-03 15:01:45 +02:00
Eugen Rochko
9de9a1d97d New translations strings.xml (Icelandic) 2023-07-03 13:53:20 +02:00
Eugen Rochko
04ee366fbe New translations strings.xml (Icelandic) 2023-07-03 12:41:02 +02:00
Eugen Rochko
c8784150fc New translations strings.xml (Icelandic) 2023-07-03 11:41:40 +02:00
Eugen Rochko
7b7bccb37a New translations full_description.txt (Japanese) 2023-07-03 10:26:59 +02:00
Eugen Rochko
84e2636bca New translations strings.xml (Japanese) 2023-07-03 10:26:58 +02:00
Eugen Rochko
dc73613b56 New translations strings.xml (Japanese) 2023-07-03 09:22:45 +02:00
Eugen Rochko
fd8868ef4d New translations strings.xml (Japanese) 2023-07-03 08:20:20 +02:00
Eugen Rochko
127df0b8e0 New translations strings.xml (Japanese) 2023-07-03 07:24:53 +02:00
Eugen Rochko
c2989df902 New translations strings.xml (Japanese) 2023-07-03 06:27:42 +02:00
Eugen Rochko
3f9ee99b69 New translations strings.xml (Japanese) 2023-07-03 05:11:26 +02:00
Eugen Rochko
7204c4e804 New translations strings.xml (Greek) 2023-07-02 23:45:59 +02:00
Eugen Rochko
f1131cf8e7 New translations strings.xml (Belarusian) 2023-07-02 23:45:58 +02:00
Eugen Rochko
5b9a8beb07 New translations strings.xml (Belarusian) 2023-07-02 22:43:38 +02:00
Eugen Rochko
9e18e35c66 New translations strings.xml (Turkish) 2023-07-02 21:45:11 +02:00
Eugen Rochko
9db3dfa955 New translations strings.xml (Polish) 2023-07-02 21:45:11 +02:00
Eugen Rochko
4a3e56d300 New translations strings.xml (Polish) 2023-07-02 20:27:01 +02:00
Eugen Rochko
3bb4125c50 New translations strings.xml (Japanese) 2023-07-02 19:31:37 +02:00
Eugen Rochko
ce58883618 New translations strings.xml (Japanese) 2023-07-02 18:03:47 +02:00
Grishka
e7d3c60bac Remove unused code that caused a crash for some users ¯\_(ツ)_/¯ 2023-07-02 18:52:46 +03:00
Eugen Rochko
08e90139ad New translations strings.xml (Japanese) 2023-07-02 16:35:17 +02:00
Eugen Rochko
0d4dc34453 New translations strings.xml (Chinese Simplified) 2023-07-02 16:35:16 +02:00
Grishka
fe142c4626 Pass the system timezone to server when signing up 2023-07-02 16:35:19 +03:00
Grishka
d8dfa6017d Make the default server configurable 2023-07-02 16:22:32 +03:00
Eugen Rochko
b7a5d4296b New translations strings.xml (Greek) 2023-07-02 11:19:25 +02:00
Grishka
85d4c1fc24 A bunch of crash fixes 2023-07-02 12:03:21 +03:00
Grishka
66489d79be Fix #611 2023-07-02 11:04:20 +03:00
Grishka
30a66a26c6 Minor fixes 2023-07-02 10:50:01 +03:00
Grishka
fbc3081e68 Fix #615 2023-07-02 09:54:53 +03:00
Eugen Rochko
7a66c94907 New translations full_description.txt (Chinese Simplified) 2023-07-02 06:12:35 +02:00
Eugen Rochko
4e38bc5769 New translations strings.xml (Chinese Simplified) 2023-07-02 06:12:34 +02:00
Eugen Rochko
0dc428dbd6 New translations full_description.txt (Chinese Simplified) 2023-07-02 04:57:11 +02:00
Eugen Rochko
6ac7fc94ea New translations full_description.txt (Indonesian) 2023-07-02 01:46:05 +02:00
Eugen Rochko
af28ed1783 New translations strings.xml (Thai) 2023-07-01 15:02:48 +02:00
Eugen Rochko
00daf084f2 New translations strings.xml (Italian) 2023-07-01 15:02:47 +02:00
Eugen Rochko
5518848e28 New translations strings.xml (Thai) 2023-07-01 13:40:15 +02:00
Eugen Rochko
6ded856b2f New translations strings.xml (Thai) 2023-07-01 12:30:46 +02:00
Eugen Rochko
d302f5132e New translations strings.xml (Italian) 2023-07-01 12:30:44 +02:00
Eugen Rochko
012e29ee3a New translations strings.xml (Greek) 2023-07-01 12:30:43 +02:00
Eugen Rochko
dbe9579d7f New translations strings.xml (Italian) 2023-07-01 11:28:20 +02:00
Eugen Rochko
c8d0221d9b New translations strings.xml (Greek) 2023-07-01 11:28:19 +02:00
Eugen Rochko
885c663d93 New translations strings.xml (Greek) 2023-07-01 10:06:44 +02:00
142 changed files with 8238 additions and 722 deletions

View File

@@ -2,7 +2,7 @@
اِنضم إلَى مُجتَمع وأنشئ مِلَفَّكَ التَّعريفِيّ. ابحث عن أشخاص رائعين، تابعهم واقرأ منشوراتهم في خطٍّ زمني خالٍ من الإعلانات. عبِّر عَن نَفسِكَ باِستخدام رُموزٍ تَعبيرِيَّةٍ مُخصَّصَة، أو صُوَر، أو صُوَرٍ مُتحَرِّكَة، أو مَقاطِعٍ مَرئِّيَة أو مَقاطِعٍ صَوتِيَّةٍ فِي مَنشوراتٍ ذَاتُ خَمسِمائَة حَرف. رُدّ على سَلاسِلِ المَنشوراتِ، وأعِد تَدوينَ مَنشُوراتِ أيِّ شَخصٍ لِمُشارَكَةِ الأُمُورِ الرَّائِعَة. اِبحَث عَن حِساباتٍ جَديدَةٍ لِمُتابَعَتِها، وَعَن وُسُومٍ شَائِعَةٍ لِتَوسيعِ شَبَكَتِك.
ماستودون مبني بتركيز على الأمان والخصوصيَّة. حدِّد ما إذا أردتَ مُشارَكَةَ مَنشُوراتِكَ مَعَ مُتابِعيك، أو الأشخاصِ الَّذينَ أشَرتَ إليهِم فَقَط أو العالَمَ بأسرِه. تتيح لك تحذيرات المحتوى إخفاء المنشورات التي تحتوي على مواد حساسة أو محفِّزَة حتى تكون مستعد للتفاعل مع محتواها. لكل مجتمع إرشاداته الخاصة ومشرفيه الخاصين للحفاظ على أمان أعضائه، كما تُساعد أدوات الحظر والإبلاغ القوية في منع إساءة الاستخدام.
ماستدون مبني بتركيزٍ على الأمان والخصوصيَّة. حدِّد ما إذا أردتَ مُشارَكَةَ مَنشُوراتِكَ مَعَ مُتابِعيك، أو الأشخاصِ الَّذينَ أشَرتَ إليهِم فَقَط أو العالَمَ بأسرِه. تتيح لك تحذيرات المحتوى إخفاء المنشورات التي تحتوي على مواد حساسة أو محفِّزَة حتى تكون مستعد للتفاعل مع محتواها. لكل مجتمع إرشاداته الخاصة ومشرفيه الخاصين للحفاظ على أمان أعضائه، كما تُساعد أدوات الحظر والإبلاغ القوية في منع إساءة الاستخدام.
مَزيدٌ مِنَ المَزايَا:

View File

@@ -1,16 +1,16 @@
Mastodon er det største decentraliserede sociale netværk på internettet. I stedet for et enkelt website, er det et netværk af millioner af brugere i uafhængige fællesskaber som alle sammen kan interagere med hinanden. Uanset hvad du interesserer dig for, kan du møde engagerede mennesker som skriver om det på Mastodon!
Mastodon er det største decentraliserede sociale netværk på internet. Frem for ét enkelt website, er det i stedet et netværk af millioner af brugere i uafhængige fællesskaber, som alle kan interagere med hinanden. Uanset interessesfære, kan man møde engagerede personer, som skriver herom på Mastodon!
Find et fællesskab og opret din profil. Find og følg fascinerende mennesker og læs deres indlæg i en reklamefri, kronologisk tidslinje. Udtryk dig selv med emojis, billeder, GIFs, videoer og lyd i indlæg på op til 500 tegn. Svar på tråde og del alt det gode ved at booste indlæg fra andre. Find nye brugere at følge og aktuelle hashtags dit netværk udvides.
Find et fællesskab og opret din profil. Find og følg fascinerende folk og læs deres indlæg i en reklamefri, kronologisk tidslinje. Udtryk dig selv med tilpassede emojis, billeder, GIF'er, videoer og lyd i 500-tegns indlæg. Svar på tråde og genpost indlæg fra enhver for dele alt det gode. Find nye konti at følge, og populære hashtags, for at udvide dit netværk.
Mastodon er bygget med fokus på privatliv og sikkerhed. Beslut om dine indlæg skal deles med dine følgere, bare dem du nævner eller hele verden. Indholdsadvarsler giver dig mulighed for at gemme indlæg med sensitivt eller triggende indhold indtil du er klar til at læse dem. Hvert fællesskab har sine egne regler og moderatorer som holder øje og sikrer medlemmerne mod spam og trolde. De har robuste blokerings- og rapporteringsredskaber til deres rådighed.
Mastodon er bygget med fokus på fortrolighed og sikkerhed. Afgør, hvorvidt dine indlæg skal deles med Følgere, blot dem du nævner eller hele verden. Indholdsadvarsler muliggør at skjule indlæg med sensitivt eller udløsende indhold, indtil du er klar til at læse dem. Hvert fællesskab har deres egne retningslinjer og moderatorer til at holde deres medlemmer sikre, og robuste blokerings- og anmeldelsesværktøjer hjælper med at forhindre misbrug.
Flere funktioner:
• Mørk Mode: Læs indlæg i lys, mørk eller ægte sort tilstand
• Afstemninger: Spørg tilhængere om deres mening og stemme
• Udforsk: Populære hashtags og konti er et tryk væk
• Notifikationer: Få besked om nye følgere, svar og boosts
• Deling: Send direkte til Mastodon fra en hvilken som app
• Nuttethedsfaktor: Vores maskot er en yndig elefant, og du vil se dem dukke op fra tid til anden
• Mørk tilstand: Læs indlæg i lys, mørk eller ægte sort tilstand
• Afstemninger: Spørg Følgere om deres mening og stemme
• Udforsk: Populære hashtags og konti er ét tryk væk
• Notifikationer: Få besked om nye Følgere, svar og genpostninger
• Deling: Post direkte til Mastodon fra enhver apps delingsfunktion
• Nuttethed: Vores maskot er en yndig elefant, som du vil se dukke op fra tid til anden
Mastodon er en registreret nonprofit og udvikling understøttes direkte af dine donationer. Der er ingen reklame, ingen indtægtsgenerering og ingen risikovillig kapital, og sådan forbliver det.
Mastodon er en registreret nonprofit, hvis udvikling direkte understøttes af dine donationer. Der er ingen annoncering, ingen indtægtsgenerering og ingen risikovillig kapital, og intentionen er, at det forbliver sådan.

View File

@@ -1,6 +1,6 @@
Mastodon Interneteko sare sozial deszentralizatu handiena da. Webgune bakar bat izan ordez, beren artean elkarreragin dezaketen komunitate independenteetako milioika erabiltzailek osatutako sarea da. Zure interesak direnak direla ere, jende interesgarria aurkituko duzu Mastodonen!
Batu komunitate batera eta sortu zure profila. Find and follow fascinating folks and read their posts in an ad-free, chronological timeline. Adierazi nahi duzuna 500 karaktereko bidalketetan emoji pertsonalizatuak, irudiak, GIFak, bideoak eta audioak erabiliz. Erantzun edozeinen hariak eta eman bultzada bidalketei edukiak partekatzeko. Bilatu jarraitzeko kontu berriak eta traolen joerak zure sarea zabaltzeko.
Batu komunitate batera eta sortu zure profila. Bilatu eta jarraitu jende zoragarria eta irakurri beren bidalketak, publizitaterik gabeko denbora-lerro kronologikoan. Adierazi nahi duzuna 500 karaktereko bidalketetan emoji pertsonalizatuak, irudiak, GIFak, bideoak eta audioak erabiliz. Erantzun edozeinen hariak eta eman bultzada bidalketei edukiak partekatzeko. Bilatu jarraitzeko kontu berriak eta traolen joerak zure sarea zabaltzeko.
Mastodon pribatutasunean eta segurtasunean arreta jarriz eraikia dago. Erabaki zure bidalketak norekin partekatu: zure jarraitzaileekin, aipatzen dituzunekin edo mundu osoarekin. Edukiaren abisuek aukera ematen dute eduki sentibera edo zuregan eragina izan dezaketen bidalketak zuk erabaki arte ezkutatzeko. Komunitate bakoitzak bere gidalerro eta moderatzaileak ditu, bertako kideak seguru mantentzeko. Baita blokeatzeko eta salatzeko tresna sendoak ere abusuak galarazteko.

View File

@@ -1,6 +1,6 @@
Mastodon on internetin suurin hajautettu sosiaalinen verkosto. Yhden verkkopalvelun sijaan, se on miljoonien itsenäisissä yhteisöissä olevien käyttäjien verkosto, jotka voivat olla vuorovaikutuksessa toistensa kanssa saumattomasti. Riippumatta siitä, mistä olet kiinnostunut, voit tavata intohimoisia ihmisiä, jotka julkaisevat aiheesta Mastodonissa!
Mastodon on internetin suurin hajautettu sosiaalinen verkosto. Yhden verkkopalvelun sijaan, se on miljoonien itsenäisissä yhteisöissä olevien käyttäjien verkosto, jotka voivat olla vuorovaikutuksessa toistensa kanssa saumattomasti. Riippumatta siitä, mistä olet kiinnostunut, voit tavata samanmielisiä ihmisiä, jotka julkaisevat aiheesta Mastodonissa!
Liity yhteisöön ja luo itsellesi tili. Find and follow fascinating folks and read their posts in an ad-free, chronological timeline. Ilmaise itseäsi mukautetuilla emojeilla, kuvilla, videoilla ja audiolla 500 merkin pituisissa julkaisuissa. Vastaa viestiketjuihin ja edelleen jaa julkaisuja keneltä tahansa, jakaaksesi hienoja juttuja. Löydä uusia tilejä seurattavaksi ja trendaavia hashtageja laajentaaksesi verkostoasi.
Liity yhteisöön ja luo itsellesi tili. Löydä ja seuraa kiehtovia ihmisiä ja lue heidän julkaisunsa ilman mainoksia, kronologisella aikajanalla. Ilmaise itseäsi mukautetuilla emojeilla, kuvilla, videoilla ja audiolla 500 merkin pituisissa julkaisuissa. Vastaa viestiketjuihin ja edelleen jaa julkaisuja keneltä tahansa, jakaaksesi hienoja juttuja. Löydä uusia tilejä seurattavaksi ja suosittuja aihetunnisteita laajentaaksesi verkostoasi.
Mastodon on rakennettu keskittyen yksityisyyteen ja turvallisuuteen. Päätä, jaetaanko julkaisusi seuraajille, vain mainitsemillesi ihmisille vai koko maailmalle. Sisältövaroitusten avulla, voit piilottaa julkaisut, jotka sisältävät arkaluontoista tai laukaisevaa materiaalia, kunnes olet valmis käsittelemään niitä. Jokaisella yhteisöllä on omat ohjeistonsa ja valvojansa, jotka pitävät jäsenensä turvassa, ja tehokkaat esto- ja ilmiantotyökalut auttavat torjumaan väärinkäytöksiä.
@@ -8,8 +8,8 @@ Lisää ominaisuuksia:
• Tumma tila: Lue julkaisut vaaleassa, tummassa tai mustan tummassa tilassa
• Kyselyt: Kysy seuraajilta heidän mielipidettään ja laske äänet
• Tutustu: Trendaavat hashtagit ja tilit ovat vain napsautuksen päässä
• Ilmoitukset: Saat ilmoituksen uusista seuraajista, vastauksista ja edelleen jaoista
• Tutustu: Suositut aihetunnisteet ja tilit ovat vain napsautuksen päässä
• Ilmoitukset: Saat ilmoituksen uusista seuraajista, vastauksista ja tehostuksista
• Jakaminen: Julkaise suoraan Mastodoniin minkä tahansa sovelluksen jakovalikon kautta
• Suloisuus: Maskottimme on ihastuttava mastodontti ja näet sen ajoittain

View File

@@ -1,16 +1,16 @@
Մաստոդոնը համացանցի ամենամեծ ապակենտրոնացված սոցցանցն է։ Instead of a single website, its a network of millions of users in independent communities that can all interact with one another, seamlessly. No matter what youre into, you can meet passionate people posting about it on Mastodon!
Մաստոդոնը համացանցի ամենամեծ ապակենտրոնացված սոցցանցն է։ Այն մի կայք չէ, այլ իրար հետ կապակցված անկախ համայնքների միլիոնավոր օգտատերերից կազմված ցանց։ No matter what youre into, you can meet passionate people posting about it on Mastodon!
Join a community and create your profile. Find and follow fascinating folks and read their posts in an ad-free, chronological timeline. Express yourself with custom emoji, images, GIFs, videos, and audio in 500-character posts. Reply to threads and reblog posts from anyone to share great stuff. Find new accounts to follow and trending hashtags to expand your network.
Միացեք համայնքին և ստեղծեք հաշիվ։ Find and follow fascinating folks and read their posts in an ad-free, chronological timeline. Express yourself with custom emoji, images, GIFs, videos, and audio in 500-character posts. Reply to threads and reblog posts from anyone to share great stuff. Find new accounts to follow and trending hashtags to expand your network.
Mastodon is built with a focus on privacy and safety. Decide whether your posts are shared with your followers, just the people you mention, or the whole world. Content warnings let you hide posts containing sensitive or triggering material until you're ready to engage with them. Each community has its own guidelines and moderators to keep its members safe, and robust blocking and reporting tools help prevent abuse.
Mastodon is built with a focus on privacy and safety. Decide whether your posts are shared with your followers, just the people you mention, or the whole world. Զգայուն կամ հրահրող թեմաներով գրառումները կարելի է թաքցնել նախազգուշացումներով։ Each community has its own guidelines and moderators to keep its members safe, and robust blocking and reporting tools help prevent abuse.
Ավելին՝
• Մուգ տարբերակ՝ կարդացեք գրառումներ մուգ, բաց կամ իսկական սև տարբերակներում
• Հարցումներ՝ իմացեք ձեր հետևորդների կարծիքը և հաշվեք քվեները
• Հարցումներ՝ իմացեք ձեր հետևորդների կարծիքը և հաշվեք ձայները
• Explore: Trending hashtags and accounts are a tap away
• Notifications: Get notified about new follows, replies, and reblogs
• Sharing: Post directly to Mastodon from any share sheet in any app
• Cuteness: Our mascot is an adorable elephant, and you'll see them pop up from time to time
Mastodon is a registered nonprofit and development is supported directly by your donations. Theres no advertising, no monetization, and no venture capital, and we plan to keep it that way.
Մաստոդոնը գրանցված շահույթ չհետապնդող կազմակերպություն է, և աջակցվում է ձեր նվիրաբերություններով։ Theres no advertising, no monetization, and no venture capital, and we plan to keep it that way.

View File

@@ -1 +1 @@
Decentralized social network
Ապակենտրոնացված սոցիալական ցանց

View File

@@ -1,6 +1,6 @@
Mastodon adalah jejaring sosial terdesentralisasi terbesar di internet. Daripada sebuah satu situs web, ini adalah jaringan dari jutaan pengguna dalam komunitas tersendiri yang dapat berinteraksi antar sesama, tanpa masalah. Tanpa memedulikan apa yang Anda minat, Anda dapat bertemu orang-orang yang mengirimkan apa yang mereka minat di Mastodon!
Mastodon dalah jaringan sosial terdesentralisasi terbesar di internet. Bukan hanya satu situs web, ini adalah jaringan dari jutaan pengguna dalam komunitas tersendiri yang dapat saling interaksi antar sesama, tanpa batasan. Apapun yang kamu minati, kamu dapat bertemu orang-orang baru yang mengirimkan apa yang mereka minati di Mastodon!
Bergabung sebuah komunitas dan buat profil Anda. Temukan dan ikuti orang-orang yang menarik dan baca postingan mereka dalam lini masa yang kronologis dan bebas iklan. Ekspresikan diri Anda dengan emoji kustom, gambar, GIF, video, dan audio dalam kiriman dengan batasan 500 karakter. Balas ke utasan dan bagikan kiriman dari siapa pun ke pengikut Anda untuk membagikan hal-hal yang keren. Temukan akun baru untuk diikuti dan tagar yang sedang tren untuk memperluas jejaring Anda.
Bergabunglah dalam sebuah komunitas dan buat profil kalian. Temukan dan ikuti orang-orang yang menarik dan baca postingan mereka dalam linimasa yang kronologis serta bebas iklan. Ekspresikan diri Anda dengan emoji kustom, gambar, GIF, video, dan audio dalam kiriman dengan batasan 500 karakter. Balas ke utasan dan bagikan kiriman dari siapa pun ke pengikut Anda untuk membagikan hal-hal yang keren. Temukan akun baru untuk diikuti dan tagar yang sedang tren untuk memperluas jejaring Anda.
Mastodon dibuat dengan fokus pada privasi dan keamanan. Tentukan apakah kiriman Anda dibagikan kepada pengikut, hanya orang yang disebut, atau seluruh dunia. Peringatan konten memungkinkan Anda untuk menyembunyikan kiriman yang berisi material sensitif atau memicu sampai Anda siap untuk terlibat dengan mereka. Setiap komunitas memiliki pedoman dan moderator sendiri-sendiri untuk menjaga anggotanya aman, dan alat pemblokiran dan pelaporan yang kokoh membantu mencegah pelecehan.

View File

@@ -1,16 +1,16 @@
Mastodonは、インターネット上で最大の分散型ソーシャルネットワークです。 Mastodonは単一のウェブサイトではなく、それぞれ独立したコミュニティに参加している何百万人ものユーザーによって構成されたネットワークなのです。ユーザーたちはその中で、誰もがお互いとシームレスにやり取りできます。 あなたの興味関心がどんな分野にあっても、きっとMastodonのどこかで同じ情熱を投稿している仲間がいることでしょう。
Mastodon は、インターネット上で最大の分散型ソーシャルネットワークです。 Mastodon は単一のウェブサイトではなく、それぞれ独立したコミュニティに参加している何百万人ものユーザーによって構成されたネットワークなのです。ユーザーたちはその中で、誰もがお互いとシームレスにやり取りできます。 あなたの興味関心がどんな分野にあっても、きっと Mastodon のどこかで同じ情熱を投稿している仲間がいることでしょう。
まずはコミュニティに参加して、自分のプロフィールを作成しましょう。 魅力的なユーザーを見つけたら、フォローしてタイムラインで投稿を見てみましょう。タイムラインに広告は出てきません。順番も時系列順です。 そして、500文字まで使える投稿で自分を表現してみましょう。カスタム絵文字や画像、GIF、動画、音声も使用できます。 スレッドに返事したり、他の誰かの面白い投稿をブーストして共有したりすることもできます。 興味のあるアカウントとホットなハッシュタグをどんどん見つけて、あなた自身のネットワークを広げていきましょう。
まずはコミュニティに参加して、自分のプロフィールを作成しましょう。 魅力的なユーザーを見つけたら、フォローしてタイムラインで投稿を見てみましょう。タイムラインに広告は出てきません。順番も時系列順です。 そして、500 文字まで使える投稿で自分を表現してみましょう。カスタム絵文字や画像、GIF、動画、音声も使用できます。 スレッドに返事したり、他の誰かの面白い投稿をブーストして共有したりすることもできます。 興味のあるアカウントとホットなハッシュタグをどんどん見つけて、あなた自身のネットワークを広げていきましょう。
Mastondonはプライバシーと安全性を重視しています。 自分の投稿をフォロワーだけに限定公開にするのか、メンションした特定のユーザーだけに共有するのか、全世界に放流するのか、自由に決められます。 また、入力中の投稿について「ちょっとセンシティブな内容だな」と思ったら、閲覧注意機能で内容を伏せることで、見たくない人に配慮した投稿が作成できます。 そして、各コミュニティにはそれぞれのガイドラインと管理者・モデレーターが存在し、コミュニティメンバーの安全を守っています。強力なブロック・通報機能も、不正利用の防止をお手伝いします。
Mastondon はプライバシーと安全性を重視しています。 自分の投稿をフォロワーだけに限定公開にするのか、メンションした特定のユーザーだけに共有するのか、全世界に放流するのか、自由に決められます。 また、入力中の投稿について「ちょっとセンシティブな内容だな」と思ったら、閲覧注意機能で内容を伏せることで、見たくない人に配慮した投稿が作成できます。 そして、各コミュニティにはそれぞれのガイドラインと管理者・モデレーターが存在し、コミュニティメンバーの安全を守っています。強力なブロック・通報機能も、不正利用の防止をお手伝いします。
その他の機能
その他の機能:
• ダークモード対応:ライトモードだけでなく、ダークモードや「真っ黒」モードで投稿を閲覧
投票機能:フォロワーたちの意見を投票形式で集計
• 探索話題のハッシュタグやアカウントに1タップでアクセス
• 通知設定:新しいフォローやリプライ、ブーストがあった時に通知
• 共有どのアプリからでも「共有」メニューを通じてMastodonへ直接投稿
• 癒しMastodonが誇る象のマスコットかわいいが、画面にお邪魔したり、しなかったり
• ダークモード: ライトモードだけでなく、ダークモードや「真っ黒」モードで投稿を閲覧
アンケート: フォロワーたちの意見を投票形式で集計
• 探索: 話題のハッシュタグやアカウントに 1 タップでアクセス
• 通知: 新しいフォローやリプライ、ブーストがあった時に通知
• 共有: どのアプリからでも「共有」メニューを通じて Mastodon へ直接投稿
• 癒し: Mastodon が誇る象のマスコット(かわいい)が、画面にお邪魔したり、しなかったり
Mastodonは公認の非営利アプリです。開発は全てユーザーの寄付から成り立っています。 広告なし、アフィリエイトなし、第三者組織による出資なし。今でも、そしてこれからもそんなアプリであり続けるために、我々は日々努力し続けています。
Mastodon は公認の非営利アプリです。開発は全てユーザーの寄付から成り立っています。 広告なし、アフィリエイトなし、第三者組織による出資なし。今でも、そしてこれからもそんなアプリであり続けるために、我々は日々努力し続けています。

View File

@@ -1,4 +1,4 @@
Mastodon เป็นเครือข่ายสังคมแบบกระจายศูนย์ที่ใหญ่ที่สุดบนอินเทอร์เน็ต ซึ่งไม่ได้เป็นเว็บไซต์เดียว แต่เป็นเครือข่ายของผู้ใช้หลายล้านคนในชุมชนอิสระที่ทุกคนสามารถโต้ตอบซึ่งกันและกันได้แบบไร้รอยต่อ ไม่ว่าคุณจะชอบอะไร คุณก็พบคนที่ชื่นชอบเหมือนกันโพสต์เกี่ยวกับสิ่งที่คุณชอบได้บน Mastodon! ซึ่งไม่ได้เป็นเว็บไซต์เดียว แต่เป็นเครือข่ายของผู้ใช้หลายล้านคนในชุมชนอิสระที่ทุกคนสามารถโต้ตอบซึ่งกันและกันได้แบบไร้รอยต่อ ไม่ว่าคุณจะชอบอะไร คุณก็พบคนที่ชื่นชอบเหมือนกันโพสต์เกี่ยวกับสิ่งที่คุณชอบได้บน Mastodon!
Mastodon เป็นเครือข่ายสังคมแบบกระจายศูนย์ที่ใหญ่ที่สุดบนอินเทอร์เน็ต ซึ่งไม่ได้เป็นเว็บไซต์เดียว แต่เป็นเครือข่ายของผู้ใช้หลายล้านคนในชุมชนอิสระที่ทุกคนสามารถโต้ตอบซึ่งกันและกันได้แบบไร้รอยต่อ ไม่ว่าคุณจะชอบอะไร คุณก็พบคนที่ชื่นชอบเหมือนกันโพสต์เกี่ยวกับสิ่งที่คุณชอบได้บน Mastodon!
เข้าร่วมชุมชนและสร้างโปรไฟล์ ค้นหาและติดตามผู้คนที่น่าสนใจและอ่านโพสต์ของเขาในเส้นเวลาที่ไม่มีโฆษณาและเรียงตามลำดับเวลา แสดงความรู้สึกของตัวคุณเองด้วยอีโมจิที่กำหนดเอง รูปภาพ GIF วิดีโอ และเสียงในโพสต์ 500 ตัวอักษร ตอบกลับและดันโพสต์จากคนอื่น ๆ เพื่อแชร์สิ่งดี ๆ และค้นหาบัญชีใหม่ ๆ ที่จะติดตามและแฮชแท็กที่เป็นที่นิยมเพื่อขยายเครือข่ายของคุณ
@@ -13,4 +13,4 @@ Mastodon สร้างขึ้นโดยเน้นความเป็
• การแชร์: โพสต์ลง Mastodon ได้โดยตรงจากแอปอื่น ๆ ที่อยู่ในเครื่อง
• ความน่ารัก: มาสคอตของเราเป็นช้างน่ารัก และคุณจะเห็นมันโผล่ออกมาเป็นระยะ ๆ
Mastodon เป็นองค์กรไม่แสวงหาผลกำไรที่จดทะเบียนแล้ว และการพัฒนาได้รับการสนับสนุนจากเงินบริจาคของคุณโดยตรง ดังนั้นจึงไม่มีโฆษณา ไม่มีการทำกำไร และไม่มีการร่วมลงทุน และเรามีแผนจะทำให้เป็นอย่างนี้ต่อไป ดังนั้นจึงไม่มีโฆษณา ไม่มีการทำกำไร และไม่มีการร่วมลงทุน และเรามีแผนจะทำให้เป็นอย่างนี้ต่อไป
Mastodon เป็นองค์กรไม่แสวงหาผลกำไรที่จดทะเบียนแล้ว และการพัฒนาได้รับการสนับสนุนจากเงินบริจาคของคุณโดยตรง ดังนั้นจึงไม่มีโฆษณา ไม่มีการทำกำไร และไม่มีการร่วมลงทุน และเรามีแผนจะทำให้เป็นอย่างนี้ต่อไป

View File

@@ -1,16 +1,16 @@
Mastodon, internetteki merkezi olmayan en büyük sosyal ağdır. Tek bir web siteye bağlı kalmaksızın, milyonlarca kullanıcının bağımsız olarak birbiri ile kolayca etkileşebileceği bir ağdır. Hangi konuyla ilgili olduğun önemli değil, Mastodon'da onunla ilgili gönderi paylaşan tutkulu insanlarla tanışabilirsin!
Mastodon, internetteki merkezi olmayan en büyük sosyal ağdır. Tek bir web siteye bağlı kalmaksızın, milyonlarca kullanıcının bağımsız olarak birbiri ile kolayca etkileşebileceği bir ağdır. Hangi konuyla ilgili olduğunuz önemli değil, Mastodon'da onunla ilgili gönderi paylaşan tutkulu insanlarla tanışabilirsiniz!
Bir topluluğa katıl ve profilini oluştur. Olağanüstü kişileri bul ve takip et; gönderilerini reklamsız ve kronolojik bir akışta oku. Gönderilerinde 500 karakter sınırlamasıyla kendini emojiler, görseller, GIFler, videolar ve sesler ile ifade et. Harika içerikler paylaşmak için başlıklara yanıt yaz, insanların gönderilerini yeniden paylaş. Ağınızı genişletmek için takip edilecek yeni hesaplar ve hashtagler bul.
Bir topluluğa katılın ve profilinizi oluşturun. Olağanüstü kişileri bulun ve takip edin; gönderilerini reklamsız ve kronolojik bir zaman çizelgesinde okuyun. Gönderilerinizde şimdilik 500 karakter sınırlamasıyla kendinizi emojiler, görseller, GIFler, videolar ve sesler ile ifade edin. Harika içerikler paylaşmak için başlıklara yanıt yazın, insanların gönderilerini yineleyin. Ağınızı genişletmek için takip edilecek yeni hesaplar ve hashtagler bulun.
Mastodon gizlilik ve güvenlik odaklı yapılmıştır. Her postunuz için takipçilerinizle mi, bahsettiğiniz kişilerle mi ya da tüm dünyayla mı paylaşılacağına karar verin. Gönderi uyarıları, hassas ve tetikleyici olabilecek içerikleri kişi görmeyi hazır olana kadar gizler. Her topluluk, üyelerini güvende tutmak için kendi kurallarına ve moderatörlerine; istismarı önlemek için de güçlü engelleme ve bildirme araçlarına sahiptir.
Mastodon, mahremiyet ve güvenliğe odaklanılarak inşa edilmiştir. Gönderilerinizi takipçilerinizle mi, sadece bahsettiğiniz kişilerle mi yoksa tüm dünyayla mı paylaşılacağına karar verin. İçerik uyarıları, hassas veya tetikleyici materyal içeren gönderileri, siz onlarla etkileşim kurmaya hazır olana kadar gizlemenize olanak tanır. Her topluluk, üyelerini güvende tutmak için kendi kurallarına ve moderatörlerine; istismarı önlemek için de güçlü engelleme ve bildirme araçlarına sahiptir.
Diğer özellikler:
• Koyu Mod: Gönderileri aydınlık, karanlık ya da gerçek karanlık modunda okuyabilirsin
• Anketler: Takipçilerine görüşlerini sor ve oylarını gör
• Keşfet: Trend hashtagler ve hesaplar bir tık uzağında
• Bildirimler: Yeni takipçilerden, yanıtlardan ve yeniden paylaşımlardan haberin olsun
• Paylaşım: Doğrudan Mastodon'a herhangi bir tipte gönderi paylaş
• Sevimlilik: Maskotumuz şirin bir fil ve onu uygulamada zaman zaman göreceksin
• Karanlık Mod: Gönderileri aydınlık, karanlık ya da gerçek karanlık modunda okuyabilirsin
• Anketler: Takipçilere fikirlerini sorun ve oylarını görün
• Keşfet: Öne çıkan etiketlerler ve hesaplar bir tık uzağınızda
• Bildirimler: Yeni takipçilerden, yanıtlardan ve yeniden paylaşımlardan haberiniz olsun
• Paylaşım: Doğrudan Mastodon'a herhangi bir türde gönderi paylaş
• Sevimlilik: Maskotumuz şirin bir fil ve onu uygulamada zaman zaman göreceksiniz
Mastodon kar amacı gütmeyen bir kuruluştur ve geliştirilmesi doğrudan bağışlarınızla sağlanmaktadır. Reklam, para kazanma amacı, risk sermayesi yoktur ve bunu böyle tutmayı planlıyoruz.
Mastodon kar amacı gütmeyen bir kuruluştur ve geliştirilmesi doğrudan bağışlarınızla sağlanmaktadır. Reklam yok, para kazanma güdüsü yok, risk sermayesi yok ve bu şekilde devam etmeyi planlıyoruz.

View File

@@ -1 +1 @@
Merkezsizleştirilmiş sosyal ağ
Merkezi olmayan sosyal ağ

View File

@@ -1,16 +1,16 @@
Mastodon — найбільша децентралізована соціальна мережа в інтернеті. Замість одного сайту це мережа мільйонів користувачів у незалежних спільнотах, які можуть взаємодіяти один з одним. Незалежно від того, чим ви займаєтеся, ви можете зустріти захоплених людей, які пишуть про це на Mastodon!
Mastodon — найбільша децентралізована соціальна мережа в інтернеті. Це не один сайт, а мережа з мільйонів користувачів у незалежних спільнотах, які взаємодіють одна з одною. Незалежно від того, чим ви займаєтеся, ви можете зустріти людей зі спільними інтересами, які пишуть про це на Mastodon!
Приєднуйтесь до спільноти і створіть свій профіль. Знайдіть і підпишіться на цікавих людей і читайте пости у вільний від реклами стрічці. Виразіть себе за допомогою користувацьких емоджі, зображень, GIF, відео й аудіо з 500-символьними постами. Відповідайте на теми й робіть репости постів від будь-кого, щоб ділитися гарними матеріалами. Знаходьте нові облікові записи, щоб підписатися і популярні хештеги для розширення вашої мережі.
Приєднуйтесь до спільноти та створіть свій профіль. Знайдіть і підпишіться на цікавих людей та читайте дописи у вільний від реклами стрічці. Виразіть себе за допомогою користувацьких емоджі, зображень, GIF, відео й аудіо у дописах, обмеженими 500 символами. Відповідайте на теми та поширюйте дописи від будь-кого, щоб ділитися цікавим. Знаходьте нових користувачів, щоб підписатися та слідкуйте за популярними хештегами, щоб розширити свій кругозір.
Mastodon будується з акцентом на конфіденційність та безпеці. Вирішіть, чи будуть ваші пости тільки для підписників, або для людей, яких ви згадали, чи для цілого світу. Попередження щодо вмісту дозволяють приховати публікації, що містять конфіденційний або провокаційний матеріал, доки ви не будете готові до нього. Кожна спільнота має свої правила і модераторів, щоб залишити учасників в безпеці, а також надійне блокування та інструменти для скарг, щоб запобігти зловживання.
Mastodon будується з акцентом на конфіденційність та безпеку. Вирішіть, чи будуть ваші дописи доступні лише підписникам, або для людей, яких ви згадали, чи взагалі для всіх. Попередження про вміст дозволяють приховати дописи, що містять чутливі або провокаційні матеріали, доки ви не будете готові взаємодіяти з ними. Кожна спільнота має власні правила та модераторів, які забезпечують безпеку учасників, а надійні інструменти блокування та система скарг допомагають запобігти зловживанням.
Більше можливостей:
• Темна Тема: Читайте у світлій, темній, або справжній чорній темі
• Опитування: запитуйте думку підписникіна та підраховуйте голоси
Досліджуйте: Популярні Хештеги й Користувачі за одним дотиком
• Сповіщення: отримуйте сповіщення про нових підписників, відповіді та репости
Діліться: Публікуйте безпосередньо в Mastodon з будь-якого меню "поділитися" в будь-якому додатку
Привабливість: Нашим талісманом є чарівний слон, і ви побачите, як він з'являється час від часу
• Темна тема: Читайте дописи у світлому, темному або повністю чорному режимі
• Опитування: Запитайте у підписників їхню думку та підраховуйте голоси
Досліджуйте: Популярні хештеги та користувачі на відстані одного дотику
• Сповіщення: Отримуйте сповіщення про нові підписки, відповіді та поширення
Діліться: Публікуйте безпосередньо в Mastodon через будь-яке меню "поділитися" у будь-якому додатку
Миле: Наш талісман - чарівне слоненя, яке час від часу ви помічатимете
Mastodon є зареєстрованою некомерційною організацією і розробка підтримується безпосередньо вашими пожертвуваннями. Тут немає реклами, монетизації та венчурного капіталу, і плануємо так тримати.
Mastodon є зареєстрованою некомерційною організацією і розробка підтримується безпосередньо вашими пожертвуваннями. Тут немає реклами, монетизації та венчурного капіталу. І ми плануємо, що так буде й надалі.

View File

@@ -1,16 +1,16 @@
Mastodon 是互联网上最大的去中心化社交网络。 它不是一个网站,而是由独立社区节点及其数以百万计的用户组成的网络,所有这些用户都能够无缝地相互交流。 无论你进入哪一个节点,你都可以与所有在 Mastodon 的人之间进行交流。 它不是一个网站,而是由独立社区节点及其数以百万计的用户组成的网络,所有这些用户都能够无缝地相互交流。 无论你进入哪一个节点,你都可以与所有在 Mastodon 的人之间进行交流。
Mastodon 是互联网上最大的去中心化社交网络。 它不是一个网站,而是由独立社区节点及其数以百万计的用户组成的网络,所有这些用户都能够无缝地相互交流。 无论你关注什么话题,你都能在 Mastodon 上找到兴趣相投的人进行交流。
加入一个社区节点并创建你的账户。 Find and follow fascinating folks and read their posts in an ad-free, chronological timeline. 用自定义表情、图像、GIF、视频和音频 500 个字符的帖子里写下你的想法。 回复转发其他人的帖子来共同分享美好的事物。 寻找新的账户以及热门话题来拓展你的网络。
加入一个社区节点并创建你的账户。 查找、关注有趣的同好,无广告、无时间线干扰地阅读他们的帖子。 借助自定义 emoji、图像、GIF、视频和音频,在最多 500 字的帖文中表达自我。 通过回复转发其他人的帖文来分享美好的事物。 通过准寻新账户并关注热门话题标签来扩展你的社交网络。
Mastodon 以隐私和安全为首要目标。 自由选择你的帖子是分享给关注者,或是你提到的人,亦或是整个世界。 内容警告允许让你隐藏可能剧透的内容,让其他人在交互之前做好充分准备。 每个社区都有自己的规则和管理员,让其用户保持安全。通过强有力的屏蔽和举报工具防止滥用。
Mastodon 以隐私和安全为首要目标。 你可以自主决定帖文的分享分享对象,可以是你的关注者、你提到的人或是整个世界。 在你做好充足的互动准备之前,内容警告可以隐藏包含敏感或刺激内容的帖文。 每个社区都有自己的规则和管理员来保证其成员安全,同时还有强力的屏蔽和举报工具来避免滥用。
更多功能:
• 暗色模式:浅色、深色纯黑模式下进行阅读
• 暗色模式:浅色、深色纯黑模式下阅读帖文
• 投票:询问关注者的意见并统计他们的投票
• 探索:热门的话题及账号
• 通知:获得新关注、回复和转发的通知
• 探索:热门的话题标签及账号只有一触之遥
• 通知:获关注、回复和转发相关的通知提醒
• 分享:从其他应用中的分享菜单中直接发布到 Mastodon
• 吉祥物:你会不时地看到我们可爱的长毛象
Mastodon 是一个注册非营利开发项目,直接由您的捐赠支持。 没有广告没有商业化,也没有风险资本,我们计划保持这种方式。 没有广告,没有商业化,也没有风险资本,我们计划保持这种方式。
Mastodon 是一个直接由用户捐赠支持、已注册非营利开发项目。 没有广告没有商业化,也没有风险资本,并且我们也计划保持这种方式。

279
mastodon/.editorconfig Normal file
View File

@@ -0,0 +1,279 @@
root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = tab
insert_final_newline = false
max_line_length = 300
tab_width = 4
ij_continuation_indent_size = 8
ij_formatter_off_tag = @formatter:off
ij_formatter_on_tag = @formatter:on
ij_formatter_tags_enabled = false
ij_smart_tabs = false
ij_visual_guides = none
ij_wrap_on_typing = false
[*.java]
ij_java_align_consecutive_assignments = false
ij_java_align_consecutive_variable_declarations = false
ij_java_align_group_field_declarations = false
ij_java_align_multiline_annotation_parameters = false
ij_java_align_multiline_array_initializer_expression = false
ij_java_align_multiline_assignment = false
ij_java_align_multiline_binary_operation = false
ij_java_align_multiline_chained_methods = false
ij_java_align_multiline_extends_list = false
ij_java_align_multiline_for = true
ij_java_align_multiline_method_parentheses = false
ij_java_align_multiline_parameters = true
ij_java_align_multiline_parameters_in_calls = false
ij_java_align_multiline_parenthesized_expression = false
ij_java_align_multiline_records = true
ij_java_align_multiline_resources = true
ij_java_align_multiline_ternary_operation = false
ij_java_align_multiline_text_blocks = false
ij_java_align_multiline_throws_list = false
ij_java_align_subsequent_simple_methods = false
ij_java_align_throws_keyword = false
ij_java_align_types_in_multi_catch = true
ij_java_annotation_parameter_wrap = off
ij_java_array_initializer_new_line_after_left_brace = false
ij_java_array_initializer_right_brace_on_new_line = false
ij_java_array_initializer_wrap = off
ij_java_assert_statement_colon_on_next_line = false
ij_java_assert_statement_wrap = off
ij_java_assignment_wrap = off
ij_java_binary_operation_sign_on_next_line = false
ij_java_binary_operation_wrap = off
ij_java_blank_lines_after_anonymous_class_header = 0
ij_java_blank_lines_after_class_header = 0
ij_java_blank_lines_after_imports = 1
ij_java_blank_lines_after_package = 1
ij_java_blank_lines_around_class = 1
ij_java_blank_lines_around_field = 0
ij_java_blank_lines_around_field_in_interface = 0
ij_java_blank_lines_around_initializer = 1
ij_java_blank_lines_around_method = 1
ij_java_blank_lines_around_method_in_interface = 1
ij_java_blank_lines_before_class_end = 0
ij_java_blank_lines_before_imports = 1
ij_java_blank_lines_before_method_body = 0
ij_java_blank_lines_before_package = 0
ij_java_block_brace_style = end_of_line
ij_java_block_comment_add_space = false
ij_java_block_comment_at_first_column = true
ij_java_builder_methods = none
ij_java_call_parameters_new_line_after_left_paren = false
ij_java_call_parameters_right_paren_on_new_line = false
ij_java_call_parameters_wrap = off
ij_java_case_statement_on_separate_line = true
ij_java_catch_on_new_line = false
ij_java_class_annotation_wrap = split_into_lines
ij_java_class_brace_style = end_of_line
ij_java_class_count_to_use_import_on_demand = 99
ij_java_class_names_in_javadoc = 1
ij_java_do_not_indent_top_level_class_members = false
ij_java_do_not_wrap_after_single_annotation = false
ij_java_do_not_wrap_after_single_annotation_in_parameter = false
ij_java_do_while_brace_force = never
ij_java_doc_add_blank_line_after_description = true
ij_java_doc_add_blank_line_after_param_comments = false
ij_java_doc_add_blank_line_after_return = false
ij_java_doc_add_p_tag_on_empty_lines = true
ij_java_doc_align_exception_comments = true
ij_java_doc_align_param_comments = true
ij_java_doc_do_not_wrap_if_one_line = false
ij_java_doc_enable_formatting = true
ij_java_doc_enable_leading_asterisks = true
ij_java_doc_indent_on_continuation = false
ij_java_doc_keep_empty_lines = true
ij_java_doc_keep_empty_parameter_tag = true
ij_java_doc_keep_empty_return_tag = true
ij_java_doc_keep_empty_throws_tag = true
ij_java_doc_keep_invalid_tags = true
ij_java_doc_param_description_on_new_line = false
ij_java_doc_preserve_line_breaks = false
ij_java_doc_use_throws_not_exception_tag = true
ij_java_else_on_new_line = false
ij_java_enum_constants_wrap = off
ij_java_extends_keyword_wrap = off
ij_java_extends_list_wrap = off
ij_java_field_annotation_wrap = split_into_lines
ij_java_finally_on_new_line = false
ij_java_for_brace_force = never
ij_java_for_statement_new_line_after_left_paren = false
ij_java_for_statement_right_paren_on_new_line = false
ij_java_for_statement_wrap = off
ij_java_generate_final_locals = false
ij_java_generate_final_parameters = false
ij_java_if_brace_force = never
ij_java_imports_layout = android.**,|,com.**,|,junit.**,|,net.**,|,org.**,|,java.**,|,javax.**,|,*,|,$*,|
ij_java_indent_case_from_switch = true
ij_java_insert_inner_class_imports = false
ij_java_insert_override_annotation = true
ij_java_keep_blank_lines_before_right_brace = 2
ij_java_keep_blank_lines_between_package_declaration_and_header = 2
ij_java_keep_blank_lines_in_code = 2
ij_java_keep_blank_lines_in_declarations = 2
ij_java_keep_builder_methods_indents = false
ij_java_keep_control_statement_in_one_line = true
ij_java_keep_first_column_comment = true
ij_java_keep_indents_on_empty_lines = false
ij_java_keep_line_breaks = true
ij_java_keep_multiple_expressions_in_one_line = false
ij_java_keep_simple_blocks_in_one_line = false
ij_java_keep_simple_classes_in_one_line = false
ij_java_keep_simple_lambdas_in_one_line = false
ij_java_keep_simple_methods_in_one_line = false
ij_java_label_indent_absolute = false
ij_java_label_indent_size = 0
ij_java_lambda_brace_style = end_of_line
ij_java_layout_static_imports_separately = true
ij_java_line_comment_add_space = false
ij_java_line_comment_add_space_on_reformat = false
ij_java_line_comment_at_first_column = true
ij_java_method_annotation_wrap = split_into_lines
ij_java_method_brace_style = end_of_line
ij_java_method_call_chain_wrap = off
ij_java_method_parameters_new_line_after_left_paren = false
ij_java_method_parameters_right_paren_on_new_line = false
ij_java_method_parameters_wrap = off
ij_java_modifier_list_wrap = false
ij_java_multi_catch_types_wrap = normal
ij_java_names_count_to_use_import_on_demand = 99
ij_java_new_line_after_lparen_in_annotation = false
ij_java_new_line_after_lparen_in_record_header = false
ij_java_parameter_annotation_wrap = off
ij_java_parentheses_expression_new_line_after_left_paren = false
ij_java_parentheses_expression_right_paren_on_new_line = false
ij_java_place_assignment_sign_on_next_line = false
ij_java_prefer_longer_names = true
ij_java_prefer_parameters_wrap = false
ij_java_record_components_wrap = normal
ij_java_repeat_synchronized = true
ij_java_replace_instanceof_and_cast = false
ij_java_replace_null_check = true
ij_java_replace_sum_lambda_with_method_ref = true
ij_java_resource_list_new_line_after_left_paren = false
ij_java_resource_list_right_paren_on_new_line = false
ij_java_resource_list_wrap = off
ij_java_rparen_on_new_line_in_annotation = false
ij_java_rparen_on_new_line_in_record_header = false
ij_java_space_after_closing_angle_bracket_in_type_argument = false
ij_java_space_after_colon = true
ij_java_space_after_comma = true
ij_java_space_after_comma_in_type_arguments = true
ij_java_space_after_for_semicolon = true
ij_java_space_after_quest = true
ij_java_space_after_type_cast = true
ij_java_space_before_annotation_array_initializer_left_brace = false
ij_java_space_before_annotation_parameter_list = false
ij_java_space_before_array_initializer_left_brace = false
ij_java_space_before_catch_keyword = false
ij_java_space_before_catch_left_brace = false
ij_java_space_before_catch_parentheses = false
ij_java_space_before_class_left_brace = false
ij_java_space_before_colon = true
ij_java_space_before_colon_in_foreach = true
ij_java_space_before_comma = false
ij_java_space_before_do_left_brace = false
ij_java_space_before_else_keyword = false
ij_java_space_before_else_left_brace = false
ij_java_space_before_finally_keyword = false
ij_java_space_before_finally_left_brace = false
ij_java_space_before_for_left_brace = false
ij_java_space_before_for_parentheses = false
ij_java_space_before_for_semicolon = false
ij_java_space_before_if_left_brace = false
ij_java_space_before_if_parentheses = false
ij_java_space_before_method_call_parentheses = false
ij_java_space_before_method_left_brace = false
ij_java_space_before_method_parentheses = false
ij_java_space_before_opening_angle_bracket_in_type_parameter = false
ij_java_space_before_quest = true
ij_java_space_before_switch_left_brace = false
ij_java_space_before_switch_parentheses = false
ij_java_space_before_synchronized_left_brace = false
ij_java_space_before_synchronized_parentheses = false
ij_java_space_before_try_left_brace = false
ij_java_space_before_try_parentheses = false
ij_java_space_before_type_parameter_list = false
ij_java_space_before_while_keyword = false
ij_java_space_before_while_left_brace = false
ij_java_space_before_while_parentheses = false
ij_java_space_inside_one_line_enum_braces = false
ij_java_space_within_empty_array_initializer_braces = false
ij_java_space_within_empty_method_call_parentheses = false
ij_java_space_within_empty_method_parentheses = false
ij_java_spaces_around_additive_operators = false
ij_java_spaces_around_annotation_eq = true
ij_java_spaces_around_assignment_operators = false
ij_java_spaces_around_bitwise_operators = false
ij_java_spaces_around_equality_operators = false
ij_java_spaces_around_lambda_arrow = false
ij_java_spaces_around_logical_operators = true
ij_java_spaces_around_method_ref_dbl_colon = false
ij_java_spaces_around_multiplicative_operators = false
ij_java_spaces_around_relational_operators = false
ij_java_spaces_around_shift_operators = false
ij_java_spaces_around_type_bounds_in_type_parameters = true
ij_java_spaces_around_unary_operator = false
ij_java_spaces_within_angle_brackets = false
ij_java_spaces_within_annotation_parentheses = false
ij_java_spaces_within_array_initializer_braces = false
ij_java_spaces_within_braces = false
ij_java_spaces_within_brackets = false
ij_java_spaces_within_cast_parentheses = false
ij_java_spaces_within_catch_parentheses = false
ij_java_spaces_within_for_parentheses = false
ij_java_spaces_within_if_parentheses = false
ij_java_spaces_within_method_call_parentheses = false
ij_java_spaces_within_method_parentheses = false
ij_java_spaces_within_parentheses = false
ij_java_spaces_within_record_header = false
ij_java_spaces_within_switch_parentheses = false
ij_java_spaces_within_synchronized_parentheses = false
ij_java_spaces_within_try_parentheses = false
ij_java_spaces_within_while_parentheses = false
ij_java_special_else_if_treatment = true
ij_java_subclass_name_suffix = Impl
ij_java_ternary_operation_signs_on_next_line = false
ij_java_ternary_operation_wrap = off
ij_java_test_name_suffix = Test
ij_java_throws_keyword_wrap = off
ij_java_throws_list_wrap = off
ij_java_use_external_annotations = false
ij_java_use_fq_class_names = false
ij_java_use_relative_indents = false
ij_java_use_single_class_imports = true
ij_java_variable_annotation_wrap = off
ij_java_visibility = public
ij_java_while_brace_force = never
ij_java_while_on_new_line = false
ij_java_wrap_comments = false
ij_java_wrap_first_method_in_call_chain = false
ij_java_wrap_long_lines = false
[{*.ant,*.fxml,*.jhm,*.jnlp,*.jrxml,*.rng,*.tld,*.wsdl,*.xml,*.xsd,*.xsl,*.xslt,*.xul}]
ij_continuation_indent_size = 4
ij_xml_align_attributes = false
ij_xml_align_text = false
ij_xml_attribute_wrap = normal
ij_xml_block_comment_add_space = false
ij_xml_block_comment_at_first_column = true
ij_xml_keep_blank_lines = 2
ij_xml_keep_indents_on_empty_lines = false
ij_xml_keep_line_breaks = false
ij_xml_keep_line_breaks_in_text = true
ij_xml_keep_whitespaces = false
ij_xml_keep_whitespaces_around_cdata = preserve
ij_xml_keep_whitespaces_inside_cdata = false
ij_xml_line_comment_at_first_column = true
ij_xml_space_after_tag_name = false
ij_xml_space_around_equals_in_attribute = false
ij_xml_space_inside_empty_tag = true
ij_xml_text_wrap = normal
ij_xml_use_custom_settings = true

View File

@@ -9,8 +9,8 @@ android {
applicationId "org.joinmastodon.android"
minSdk 23
targetSdk 33
versionCode 60
versionName "2.0.0"
versionCode 71
versionName "2.1.5"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
resConfigs "ar-rSA", "be-rBY", "bn-rBD", "bs-rBA", "ca-rES", "cs-rCZ", "da-rDK", "de-rDE", "el-rGR", "es-rES", "eu-rES", "fa-rIR", "fi-rFI", "fil-rPH", "fr-rFR", "ga-rIE", "gd-rGB", "gl-rES", "hi-rIN", "hr-rHR", "hu-rHU", "hy-rAM", "ig-rNG", "in-rID", "is-rIS", "it-rIT", "iw-rIL", "ja-rJP", "kab", "ko-rKR", "my-rMM", "nl-rNL", "no-rNO", "oc-rFR", "pl-rPL", "pt-rBR", "pt-rPT", "ro-rRO", "ru-rRU", "si-rLK", "sl-rSI", "sv-rSE", "th-rTH", "tr-rTR", "uk-rUA", "ur-rIN", "vi-rVN", "zh-rCN", "zh-rTW"
}
@@ -76,7 +76,7 @@ dependencies {
implementation 'me.grishka.litex:viewpager:1.0.0'
implementation 'me.grishka.litex:viewpager2:1.0.0'
implementation 'me.grishka.litex:palette:1.0.0'
implementation 'me.grishka.appkit:appkit:1.2.8'
implementation 'me.grishka.appkit:appkit:1.2.13'
implementation 'com.google.code.gson:gson:2.8.9'
implementation 'org.jsoup:jsoup:1.14.3'
implementation 'com.squareup:otto:1.3.8'

View File

@@ -42,40 +42,7 @@ public class MainActivity extends FragmentStackActivity{
super.onCreate(savedInstanceState);
if(savedInstanceState==null){
if(AccountSessionManager.getInstance().getLoggedInAccounts().isEmpty()){
showFragmentClearingBackStack(new SplashFragment());
}else{
AccountSessionManager.getInstance().maybeUpdateLocalInfo();
AccountSession session;
Bundle args=new Bundle();
Intent intent=getIntent();
if(intent.getBooleanExtra("fromNotification", false)){
String accountID=intent.getStringExtra("accountID");
try{
session=AccountSessionManager.getInstance().getAccount(accountID);
if(!intent.hasExtra("notification"))
args.putString("tab", "notifications");
}catch(IllegalStateException x){
session=AccountSessionManager.getInstance().getLastActiveAccount();
}
}else{
session=AccountSessionManager.getInstance().getLastActiveAccount();
}
args.putString("account", session.getID());
Fragment fragment=session.activated ? new HomeFragment() : new AccountActivationFragment();
fragment.setArguments(args);
showFragmentClearingBackStack(fragment);
if(intent.getBooleanExtra("fromNotification", false) && intent.hasExtra("notification")){
Notification notification=Parcels.unwrap(intent.getParcelableExtra("notification"));
showFragmentForNotification(notification, session.getID());
}else if(intent.getBooleanExtra("compose", false)){
showCompose();
}else if(Intent.ACTION_VIEW.equals(intent.getAction())){
handleURL(intent.getData(), null);
}else{
maybeRequestNotificationsPermission();
}
}
restartHomeFragment();
}
if(BuildConfig.BUILD_TYPE.startsWith("appcenter")){
@@ -136,7 +103,7 @@ public class MainActivity extends FragmentStackActivity{
}
public void openSearchQuery(String q, String accountID, int progressText, boolean fromSearch){
new GetSearchResults(q, null, true)
new GetSearchResults(q, null, true, null, 0, 0)
.setCallback(new Callback<>(){
@Override
public void onSuccess(SearchResults result){
@@ -200,4 +167,41 @@ public class MainActivity extends FragmentStackActivity{
requestPermissions(new String[]{Manifest.permission.POST_NOTIFICATIONS}, 100);
}
}
public void restartHomeFragment(){
if(AccountSessionManager.getInstance().getLoggedInAccounts().isEmpty()){
showFragmentClearingBackStack(new SplashFragment());
}else{
AccountSessionManager.getInstance().maybeUpdateLocalInfo();
AccountSession session;
Bundle args=new Bundle();
Intent intent=getIntent();
if(intent.getBooleanExtra("fromNotification", false)){
String accountID=intent.getStringExtra("accountID");
try{
session=AccountSessionManager.getInstance().getAccount(accountID);
if(!intent.hasExtra("notification"))
args.putString("tab", "notifications");
}catch(IllegalStateException x){
session=AccountSessionManager.getInstance().getLastActiveAccount();
}
}else{
session=AccountSessionManager.getInstance().getLastActiveAccount();
}
args.putString("account", session.getID());
Fragment fragment=session.activated ? new HomeFragment() : new AccountActivationFragment();
fragment.setArguments(args);
showFragmentClearingBackStack(fragment);
if(intent.getBooleanExtra("fromNotification", false) && intent.hasExtra("notification")){
Notification notification=Parcels.unwrap(intent.getParcelableExtra("notification"));
showFragmentForNotification(notification, session.getID());
}else if(intent.getBooleanExtra("compose", false)){
showCompose();
}else if(Intent.ACTION_VIEW.equals(intent.getAction())){
handleURL(intent.getData(), null);
}else{
maybeRequestNotificationsPermission();
}
}
}
}

View File

@@ -118,6 +118,8 @@ public class PushNotificationReceiver extends BroadcastReceiver{
List<NotificationChannel> channels=Arrays.stream(PushNotification.Type.values())
.map(type->{
NotificationChannel channel=new NotificationChannel(accountID+"_"+type, context.getString(type.localizedName), NotificationManager.IMPORTANCE_DEFAULT);
channel.setLightColor(context.getColor(R.color.primary_700));
channel.enableLights(true);
channel.setGroup(accountID);
return channel;
})
@@ -147,6 +149,7 @@ public class PushNotificationReceiver extends BroadcastReceiver{
.setShowWhen(true)
.setCategory(Notification.CATEGORY_SOCIAL)
.setAutoCancel(true)
.setLights(context.getColor(R.color.primary_700), 500, 1000)
.setColor(context.getColor(R.color.primary_700));
if(avatar!=null){
builder.setLargeIcon(UiUtils.getBitmapFromDrawable(avatar));

View File

@@ -24,6 +24,7 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@@ -86,6 +87,9 @@ public class MastodonAPIController{
synchronized(req){
req.okhttpCall=call;
}
if(req.timeout>0){
call.timeout().timeout(req.timeout, TimeUnit.MILLISECONDS);
}
if(BuildConfig.DEBUG)
Log.d(TAG, "["+(session==null ? "no-auth" : session.getID())+"] Sending request: "+hreq);

View File

@@ -45,6 +45,7 @@ public abstract class MastodonAPIRequest<T> extends APIRequest<T>{
Token token;
boolean canceled;
Map<String, String> headers;
long timeout;
private ProgressDialog progressDialog;
protected boolean removeUnsupportedItems;
@@ -127,6 +128,10 @@ public abstract class MastodonAPIRequest<T> extends APIRequest<T>{
headers.put(key, value);
}
protected void setTimeout(long timeout){
this.timeout=timeout;
}
protected String getPathPrefix(){
return "/api/v1";
}

View File

@@ -87,7 +87,6 @@ public class PushSubscriptionManager{
private String accountID;
private PrivateKey privateKey;
private PublicKey publicKey;
private PublicKey serverKey;
private byte[] authKey;
public PushSubscriptionManager(String accountID){
@@ -162,10 +161,6 @@ public class PushSubscriptionManager{
@Override
public void onSuccess(PushSubscription result){
MastodonAPIController.runInBackground(()->{
result.serverKey=result.serverKey.replace('/','_');
result.serverKey=result.serverKey.replace('+','-');
serverKey=deserializeRawPublicKey(Base64.decode(result.serverKey, Base64.URL_SAFE));
AccountSession session=AccountSessionManager.getInstance().tryGetAccount(accountID);
if(session==null)
return;

View File

@@ -4,21 +4,22 @@ import org.joinmastodon.android.api.MastodonAPIRequest;
import org.joinmastodon.android.model.Token;
public class RegisterAccount extends MastodonAPIRequest<Token>{
public RegisterAccount(String username, String email, String password, String locale, String reason){
public RegisterAccount(String username, String email, String password, String locale, String reason, String timezone){
super(HttpMethod.POST, "/accounts", Token.class);
setRequestBody(new Body(username, email, password, locale, reason));
setRequestBody(new Body(username, email, password, locale, reason, timezone));
}
private static class Body{
public String username, email, password, locale, reason;
public String username, email, password, locale, reason, timeZone;
public boolean agreement=true;
public Body(String username, String email, String password, String locale, String reason){
public Body(String username, String email, String password, String locale, String reason, String timeZone){
this.username=username;
this.email=email;
this.password=password;
this.locale=locale;
this.reason=reason;
this.timeZone=timeZone;
}
}
}

View File

@@ -6,18 +6,19 @@ import org.joinmastodon.android.model.Preferences;
import org.joinmastodon.android.model.StatusPrivacy;
public class UpdateAccountCredentialsPreferences extends MastodonAPIRequest<Account>{
public UpdateAccountCredentialsPreferences(Preferences preferences, Boolean locked, Boolean discoverable){
public UpdateAccountCredentialsPreferences(Preferences preferences, Boolean locked, Boolean discoverable, Boolean indexable){
super(HttpMethod.PATCH, "/accounts/update_credentials", Account.class);
setRequestBody(new Request(locked, discoverable, new RequestSource(preferences.postingDefaultVisibility, preferences.postingDefaultLanguage)));
setRequestBody(new Request(locked, discoverable, indexable, new RequestSource(preferences.postingDefaultVisibility, preferences.postingDefaultLanguage)));
}
private static class Request{
public Boolean locked, discoverable;
public Boolean locked, discoverable, indexable;
public RequestSource source;
public Request(Boolean locked, Boolean discoverable, RequestSource source){
public Request(Boolean locked, Boolean discoverable, Boolean indexable, RequestSource source){
this.locked=locked;
this.discoverable=discoverable;
this.indexable=indexable;
this.source=source;
}
}

View File

@@ -0,0 +1,22 @@
package org.joinmastodon.android.api.requests.catalog;
import android.net.Uri;
import com.google.gson.reflect.TypeToken;
import org.joinmastodon.android.api.MastodonAPIRequest;
import org.joinmastodon.android.model.catalog.CatalogDefaultInstance;
import java.util.List;
public class GetCatalogDefaultInstances extends MastodonAPIRequest<List<CatalogDefaultInstance>>{
public GetCatalogDefaultInstances(){
super(HttpMethod.GET, null, new TypeToken<>(){});
setTimeout(500);
}
@Override
public Uri getURL(){
return Uri.parse("https://api.joinmastodon.org/default-servers");
}
}

View File

@@ -6,6 +6,9 @@ import org.joinmastodon.android.model.FilterContext;
import java.util.EnumSet;
import java.util.List;
import androidx.annotation.Keep;
@Keep
class FilterRequest{
public String title;
public EnumSet<FilterContext> context;

View File

@@ -4,13 +4,19 @@ import org.joinmastodon.android.api.MastodonAPIRequest;
import org.joinmastodon.android.model.SearchResults;
public class GetSearchResults extends MastodonAPIRequest<SearchResults>{
public GetSearchResults(String query, Type type, boolean resolve){
public GetSearchResults(String query, Type type, boolean resolve, String maxID, int offset, int count){
super(HttpMethod.GET, "/search", SearchResults.class);
addQueryParameter("q", query);
if(type!=null)
addQueryParameter("type", type.name().toLowerCase());
if(resolve)
addQueryParameter("resolve", "true");
if(maxID!=null)
addQueryParameter("max_id", maxID);
if(offset>0)
addQueryParameter("offset", String.valueOf(offset));
if(count>0)
addQueryParameter("limit", String.valueOf(count));
}
public GetSearchResults limit(int limit){

View File

@@ -17,6 +17,7 @@ public class CreateStatus extends MastodonAPIRequest<Status>{
public static class Request{
public String status;
public List<MediaAttribute> mediaAttributes;
public List<String> mediaIds;
public Poll poll;
public String inReplyToId;
@@ -32,5 +33,17 @@ public class CreateStatus extends MastodonAPIRequest<Status>{
public boolean multiple;
public boolean hideTotals;
}
public static class MediaAttribute{
public String id;
public String description;
public String focus;
public MediaAttribute(String id, String description, String focus){
this.id=id;
this.description=description;
this.focus=focus;
}
}
}
}

View File

@@ -0,0 +1,13 @@
package org.joinmastodon.android.api.requests.statuses;
import org.joinmastodon.android.api.MastodonAPIRequest;
import org.joinmastodon.android.model.Translation;
import java.util.Map;
public class TranslateStatus extends MastodonAPIRequest<Translation>{
public TranslateStatus(String id, String lang){
super(HttpMethod.POST, "/statuses/"+id+"/translate", Translation.class);
setRequestBody(Map.of("lang", lang));
}
}

View File

@@ -0,0 +1,10 @@
package org.joinmastodon.android.api.requests.tags;
import org.joinmastodon.android.api.MastodonAPIRequest;
import org.joinmastodon.android.model.Hashtag;
public class GetTag extends MastodonAPIRequest<Hashtag>{
public GetTag(String tag){
super(HttpMethod.GET, "/tags/"+tag, Hashtag.class);
}
}

View File

@@ -0,0 +1,11 @@
package org.joinmastodon.android.api.requests.tags;
import org.joinmastodon.android.api.MastodonAPIRequest;
import org.joinmastodon.android.model.Hashtag;
public class SetTagFollowed extends MastodonAPIRequest<Hashtag>{
public SetTagFollowed(String tag, boolean followed){
super(HttpMethod.POST, "/tags/"+tag+(followed ? "/follow" : "/unfollow"), Hashtag.class);
setRequestBody(new Object());
}
}

View File

@@ -195,7 +195,7 @@ public class AccountSession{
public void savePreferencesIfPending(){
if(preferencesNeedSaving){
new UpdateAccountCredentialsPreferences(preferences, null, null)
new UpdateAccountCredentialsPreferences(preferences, null, self.discoverable, self.source.indexable)
.setCallback(new Callback<>(){
@Override
public void onSuccess(Account result){
@@ -261,4 +261,8 @@ public class AccountSession{
return false;
});
}
public void updateAccountInfo(){
AccountSessionManager.getInstance().updateSessionLocalInfo(this);
}
}

View File

@@ -279,7 +279,7 @@ public class AccountSessionManager{
}
}
private void updateSessionLocalInfo(AccountSession session){
/*package*/ void updateSessionLocalInfo(AccountSession session){
new GetOwnAccount()
.setCallback(new Callback<>(){
@Override

View File

@@ -17,13 +17,16 @@ import org.joinmastodon.android.E;
import org.joinmastodon.android.R;
import org.joinmastodon.android.api.requests.accounts.GetAccountRelationships;
import org.joinmastodon.android.api.requests.polls.SubmitPollVote;
import org.joinmastodon.android.api.requests.statuses.TranslateStatus;
import org.joinmastodon.android.events.PollUpdatedEvent;
import org.joinmastodon.android.model.Account;
import org.joinmastodon.android.model.DisplayItemsParent;
import org.joinmastodon.android.model.Poll;
import org.joinmastodon.android.model.Relationship;
import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.model.Translation;
import org.joinmastodon.android.ui.BetterItemAnimator;
import org.joinmastodon.android.ui.M3AlertDialogBuilder;
import org.joinmastodon.android.ui.displayitems.AccountStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.ExtendedFooterStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.GapStatusDisplayItem;
@@ -33,6 +36,7 @@ import org.joinmastodon.android.ui.displayitems.PollFooterStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.PollOptionStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.SpoilerStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.StatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.TextStatusDisplayItem;
import org.joinmastodon.android.ui.photoviewer.PhotoViewer;
import org.joinmastodon.android.ui.photoviewer.PhotoViewerHost;
import org.joinmastodon.android.ui.utils.MediaAttachmentViewController;
@@ -43,6 +47,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
@@ -560,6 +565,61 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
return attachmentViewsPool;
}
public void togglePostTranslation(Status status, String itemID){
switch(status.translationState){
case LOADING -> {
return;
}
case SHOWN -> {
status.translationState=Status.TranslationState.HIDDEN;
}
case HIDDEN -> {
if(status.translation!=null){
status.translationState=Status.TranslationState.SHOWN;
}else{
status.translationState=Status.TranslationState.LOADING;
new TranslateStatus(status.getContentStatus().id, Locale.getDefault().getLanguage())
.setCallback(new Callback<>(){
@Override
public void onSuccess(Translation result){
if(getActivity()==null)
return;
status.translation=result;
status.translationState=Status.TranslationState.SHOWN;
TextStatusDisplayItem.Holder text=findHolderOfType(itemID, TextStatusDisplayItem.Holder.class);
if(text!=null){
text.updateTranslation(true);
imgLoader.bindViewHolder((ImageLoaderRecyclerAdapter) list.getAdapter(), text, text.getAbsoluteAdapterPosition());
}
}
@Override
public void onError(ErrorResponse error){
if(getActivity()==null)
return;
status.translationState=Status.TranslationState.HIDDEN;
TextStatusDisplayItem.Holder text=findHolderOfType(itemID, TextStatusDisplayItem.Holder.class);
if(text!=null){
text.updateTranslation(true);
}
new M3AlertDialogBuilder(getActivity())
.setTitle(R.string.error)
.setMessage(R.string.translation_failed)
.setPositiveButton(R.string.ok, null)
.show();
}
})
.exec(accountID);
}
}
}
TextStatusDisplayItem.Holder text=findHolderOfType(itemID, TextStatusDisplayItem.Holder.class);
if(text!=null){
text.updateTranslation(true);
imgLoader.bindViewHolder((ImageLoaderRecyclerAdapter) list.getAdapter(), text, text.getAbsoluteAdapterPosition());
}
}
public void rebuildAllDisplayItems(){
displayItems.clear();
for(T item:data){

View File

@@ -109,7 +109,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
private static final Pattern MENTION_PATTERN=Pattern.compile("(^|[^\\/\\w])@(([a-z0-9_]+)@[a-z0-9\\.\\-]+[a-z0-9]+)", Pattern.CASE_INSENSITIVE);
// from https://github.com/mastodon/mastodon-ios/blob/main/Mastodon/Helper/MastodonRegex.swift
private static final Pattern AUTO_COMPLETE_PATTERN=Pattern.compile("(?<!\\w)(?:@([a-zA-Z0-9_]+)(@[a-zA-Z0-9_.-]+)?|#([^\\s.]+)|:([a-zA-Z0-9_]+))");
private static final Pattern AUTO_COMPLETE_PATTERN=Pattern.compile("(?<!\\w)(?:@([a-z0-9_]+)(@[a-z0-9_\\.\\-]*)?|#([^\\s.]+)|:([a-z0-9_]+))", Pattern.CASE_INSENSITIVE);
private static final Pattern HIGHLIGHT_PATTERN=Pattern.compile("(?<!\\w)(?:@([a-zA-Z0-9_]+)(@[a-zA-Z0-9_.-]+)?|#([^\\s.]+))");
@SuppressLint("NewApi") // this class actually exists on 6.0
@@ -252,7 +252,8 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
selfAvatar=view.findViewById(R.id.avatar);
HtmlParser.setTextWithCustomEmoji(selfName, self.displayName, self.emojis);
selfUsername.setText('@'+self.username+'@'+instanceDomain);
ViewImageLoader.load(selfAvatar, null, new UrlImageLoaderRequest(self.avatar));
if(self.avatar!=null)
ViewImageLoader.load(selfAvatar, null, new UrlImageLoaderRequest(self.avatar));
ViewOutlineProvider roundCornersOutline=new ViewOutlineProvider(){
@Override
public void getOutline(View view, Outline outline){
@@ -451,7 +452,6 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
char prevChar=spanStart>0 ? editable.charAt(spanStart-1) : ' ';
if(!matcher.find() || !Character.isWhitespace(prevChar)){ // invalid mention, remove
editable.removeSpan(span);
continue;
}else if(matcher.end()+spanStart<spanEnd){ // mention with something at the end, move the end offset
editable.setSpan(span, spanStart, spanStart+matcher.end(), Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
}
@@ -547,7 +547,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
@Override
public boolean onOptionsItemSelected(MenuItem item){
if(item.getItemId()==R.id.publish){
if(GlobalUserPreferences.altTextReminders)
if(GlobalUserPreferences.altTextReminders && editingStatus==null)
checkAltTextsAndPublish();
else
publish();
@@ -691,6 +691,9 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
req.visibility=statusVisibility;
if(!mediaViewController.isEmpty()){
req.mediaIds=mediaViewController.getAttachmentIDs();
if(editingStatus != null){
req.mediaAttributes=mediaViewController.getAttachmentAttributes();
}
}
if(replyTo!=null){
req.inReplyToId=replyTo.id;
@@ -836,7 +839,8 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
boolean usePhotoPicker=UiUtils.isPhotoPickerAvailable();
if(usePhotoPicker){
intent=new Intent(MediaStore.ACTION_PICK_IMAGES);
intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, mediaViewController.getMaxAttachments()-mediaViewController.getMediaAttachmentsCount());
if(mediaViewController.getMaxAttachments()-mediaViewController.getMediaAttachmentsCount()>1)
intent.putExtra(MediaStore.EXTRA_PICK_IMAGES_MAX, mediaViewController.getMaxAttachments()-mediaViewController.getMediaAttachmentsCount());
}else{
intent=new Intent(Intent.ACTION_GET_CONTENT);
intent.addCategory(Intent.CATEGORY_OPENABLE);
@@ -961,6 +965,8 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
}
private void updateVisibilityIcon(){
if(getActivity()==null)
return;
if(statusVisibility==null){ // TODO find out why this happens
statusVisibility=StatusPrivacy.PUBLIC;
}

View File

@@ -15,6 +15,7 @@ import org.parceler.Parcels;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
import androidx.recyclerview.widget.RecyclerView;
@@ -44,7 +45,7 @@ public class FeaturedHashtagsListFragment extends BaseStatusListFragment<Hashtag
@Override
public void onItemClick(String id){
UiUtils.openHashtagTimeline(getActivity(), accountID, id);
UiUtils.openHashtagTimeline(getActivity(), accountID, Objects.requireNonNull(findItemOfType(id, HashtagStatusDisplayItem.class)).tag);
}
@Override

View File

@@ -1,24 +1,52 @@
package org.joinmastodon.android.fragments;
import android.app.Activity;
import android.content.res.TypedArray;
import android.os.Bundle;
import android.text.SpannableStringBuilder;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.ProgressBar;
import android.widget.TextView;
import org.joinmastodon.android.R;
import org.joinmastodon.android.api.MastodonErrorResponse;
import org.joinmastodon.android.api.requests.tags.GetTag;
import org.joinmastodon.android.api.requests.tags.SetTagFollowed;
import org.joinmastodon.android.api.requests.timelines.GetHashtagTimeline;
import org.joinmastodon.android.model.Hashtag;
import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.ui.text.SpacerSpan;
import org.joinmastodon.android.ui.views.ProgressBarButton;
import org.parceler.Parcels;
import java.util.List;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import me.grishka.appkit.Nav;
import me.grishka.appkit.api.Callback;
import me.grishka.appkit.api.ErrorResponse;
import me.grishka.appkit.api.SimpleCallback;
import me.grishka.appkit.utils.CubicBezierInterpolator;
import me.grishka.appkit.utils.MergeRecyclerAdapter;
import me.grishka.appkit.utils.SingleViewRecyclerAdapter;
import me.grishka.appkit.utils.V;
public class HashtagTimelineFragment extends StatusListFragment{
private String hashtag;
private Hashtag hashtag;
private String hashtagName;
private ImageButton fab;
private TextView headerTitle, headerSubtitle;
private ProgressBarButton followButton;
private ProgressBar followProgress;
private MenuItem followMenuItem;
private boolean followRequestRunning;
private boolean toolbarContentVisible;
public HashtagTimelineFragment(){
setListLayoutId(R.layout.recycler_fragment_with_fab);
@@ -27,13 +55,19 @@ public class HashtagTimelineFragment extends StatusListFragment{
@Override
public void onAttach(Activity activity){
super.onAttach(activity);
hashtag=getArguments().getString("hashtag");
setTitle('#'+hashtag);
if(getArguments().containsKey("hashtag")){
hashtag=Parcels.unwrap(getArguments().getParcelable("hashtag"));
hashtagName=hashtag.name;
}else{
hashtagName=getArguments().getString("hashtagName");
}
setTitle('#'+hashtagName);
setHasOptionsMenu(true);
}
@Override
protected void doLoadData(int offset, int count){
currentRequest=new GetHashtagTimeline(hashtag, offset==0 ? null : getMaxID(), null, count)
currentRequest=new GetHashtagTimeline(hashtagName, offset==0 ? null : getMaxID(), null, count)
.setCallback(new SimpleCallback<>(this){
@Override
public void onSuccess(List<Status> result){
@@ -50,17 +84,39 @@ public class HashtagTimelineFragment extends StatusListFragment{
loadData();
}
@Override
public void loadData(){
reloadTag();
super.loadData();
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState){
super.onViewCreated(view, savedInstanceState);
fab=view.findViewById(R.id.fab);
fab.setOnClickListener(this::onFabClick);
list.addOnScrollListener(new RecyclerView.OnScrollListener(){
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy){
View topChild=recyclerView.getChildAt(0);
int firstChildPos=recyclerView.getChildAdapterPosition(topChild);
float newAlpha=firstChildPos>0 ? 1f : Math.min(1f, -topChild.getTop()/(float)headerTitle.getHeight());
toolbarTitleView.setAlpha(newAlpha);
boolean newToolbarVisibility=newAlpha>0.5f;
if(newToolbarVisibility!=toolbarContentVisible){
toolbarContentVisible=newToolbarVisibility;
if(followMenuItem!=null)
followMenuItem.setVisible(toolbarContentVisible);
}
}
});
}
private void onFabClick(View v){
Bundle args=new Bundle();
args.putString("account", accountID);
args.putString("prefilledText", '#'+hashtag+' ');
args.putString("prefilledText", '#'+hashtagName+' ');
Nav.go(getActivity(), ComposeFragment.class, args);
}
@@ -68,4 +124,150 @@ public class HashtagTimelineFragment extends StatusListFragment{
protected void onSetFabBottomInset(int inset){
((ViewGroup.MarginLayoutParams) fab.getLayoutParams()).bottomMargin=V.dp(16)+inset;
}
@Override
protected RecyclerView.Adapter getAdapter(){
View header=getActivity().getLayoutInflater().inflate(R.layout.header_hashtag_timeline, list, false);
headerTitle=header.findViewById(R.id.title);
headerSubtitle=header.findViewById(R.id.subtitle);
followButton=header.findViewById(R.id.profile_action_btn);
followProgress=header.findViewById(R.id.action_progress);
headerTitle.setText("#"+hashtagName);
followButton.setVisibility(View.GONE);
followButton.setOnClickListener(v->{
if(hashtag==null)
return;
setFollowed(!hashtag.following);
});
updateHeader();
MergeRecyclerAdapter mergeAdapter=new MergeRecyclerAdapter();
mergeAdapter.addAdapter(new SingleViewRecyclerAdapter(header));
mergeAdapter.addAdapter(super.getAdapter());
return mergeAdapter;
}
@Override
protected int getMainAdapterOffset(){
return 1;
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater){
followMenuItem=menu.add(getString(hashtag!=null && hashtag.following ? R.string.unfollow_user : R.string.follow_user, "#"+hashtagName));
followMenuItem.setVisible(toolbarContentVisible);
}
@Override
public boolean onOptionsItemSelected(MenuItem item){
if(hashtag!=null){
setFollowed(!hashtag.following);
}
return true;
}
@Override
protected void onUpdateToolbar(){
super.onUpdateToolbar();
toolbarTitleView.setAlpha(toolbarContentVisible ? 1f : 0f);
if(followMenuItem!=null)
followMenuItem.setVisible(toolbarContentVisible);
}
private void updateHeader(){
if(hashtag==null)
return;
if(hashtag.history!=null && !hashtag.history.isEmpty()){
int weekPosts=hashtag.history.stream().mapToInt(h->h.uses).sum();
int todayPosts=hashtag.history.get(0).uses;
int numAccounts=hashtag.history.stream().mapToInt(h->h.accounts).sum();
int hSpace=V.dp(8);
SpannableStringBuilder ssb=new SpannableStringBuilder();
ssb.append(getResources().getQuantityString(R.plurals.x_posts, weekPosts, weekPosts));
ssb.append(" ", new SpacerSpan(hSpace, 0), 0);
ssb.append('·');
ssb.append(" ", new SpacerSpan(hSpace, 0), 0);
ssb.append(getResources().getQuantityString(R.plurals.x_participants, numAccounts, numAccounts));
ssb.append(" ", new SpacerSpan(hSpace, 0), 0);
ssb.append('·');
ssb.append(" ", new SpacerSpan(hSpace, 0), 0);
ssb.append(getResources().getQuantityString(R.plurals.x_posts_today, todayPosts, todayPosts));
headerSubtitle.setText(ssb);
}
int styleRes;
followButton.setVisibility(View.VISIBLE);
if(hashtag.following){
followButton.setText(R.string.button_following);
styleRes=R.style.Widget_Mastodon_M3_Button_Tonal;
}else{
followButton.setText(R.string.button_follow);
styleRes=R.style.Widget_Mastodon_M3_Button_Filled;
}
TypedArray ta=followButton.getContext().obtainStyledAttributes(styleRes, new int[]{android.R.attr.background});
followButton.setBackground(ta.getDrawable(0));
ta.recycle();
ta=followButton.getContext().obtainStyledAttributes(styleRes, new int[]{android.R.attr.textColor});
followButton.setTextColor(ta.getColorStateList(0));
followProgress.setIndeterminateTintList(ta.getColorStateList(0));
ta.recycle();
followButton.setTextVisible(true);
followProgress.setVisibility(View.GONE);
if(followMenuItem!=null){
followMenuItem.setTitle(getString(hashtag.following ? R.string.unfollow_user : R.string.follow_user, "#"+hashtagName));
}
}
private void reloadTag(){
new GetTag(hashtagName)
.setCallback(new Callback<>(){
@Override
public void onSuccess(Hashtag result){
hashtag=result;
updateHeader();
}
@Override
public void onError(ErrorResponse error){
}
})
.exec(accountID);
}
private void setFollowed(boolean followed){
if(followRequestRunning)
return;
followButton.setTextVisible(false);
followProgress.setVisibility(View.VISIBLE);
followRequestRunning=true;
new SetTagFollowed(hashtagName, followed)
.setCallback(new Callback<>(){
@Override
public void onSuccess(Hashtag result){
if(getActivity()==null)
return;
hashtag=result;
updateHeader();
followRequestRunning=false;
}
@Override
public void onError(ErrorResponse error){
if(getActivity()==null)
return;
if(error instanceof MastodonErrorResponse er && "Duplicate record".equals(er.error)){
hashtag.following=true;
}else{
error.showToast(getActivity());
}
updateHeader();
followRequestRunning=false;
}
})
.exec(accountID);
}
}

View File

@@ -150,6 +150,7 @@ public class HomeFragment extends AppKitFragment implements OnBackPressedListene
});
}
}
tabBar.selectTab(currentTab);
return content;
}

View File

@@ -270,6 +270,7 @@ public class HomeTimelineFragment extends StatusListFragment{
}else{
result=result.subList(0, endIndex);
}
AccountSessionManager.get(accountID).filterStatuses(result, FilterContext.HOME);
List<StatusDisplayItem> targetList=displayItems.subList(gapPos, gapPos+1);
targetList.clear();
List<Status> insertedPosts=data.subList(gapPostIndex+1, gapPostIndex+1);
@@ -279,7 +280,6 @@ public class HomeTimelineFragment extends StatusListFragment{
targetList.addAll(buildDisplayItems(s));
insertedPosts.add(s);
}
AccountSessionManager.get(accountID).filterStatuses(insertedPosts, FilterContext.HOME);
if(targetList.isEmpty()){
// oops. We didn't add new posts, but at least we know there are none.
adapter.notifyItemRemoved(getMainAdapterOffset()+gapPos);

View File

@@ -349,7 +349,7 @@ public class NotificationsListFragment extends BaseStatusListFragment<Notificati
}
private void updateMarkAllReadButton(){
markAllReadItem.setEnabled(!data.isEmpty() && !realUnreadMarker.equals(data.get(0).id));
markAllReadItem.setEnabled(!data.isEmpty() && realUnreadMarker!=null && !realUnreadMarker.equals(data.get(0).id));
}
@Override

View File

@@ -52,6 +52,7 @@ public class ProfileAboutFragment extends Fragment implements WindowInsetsAwareF
private boolean isInEditMode;
private ItemTouchHelper dragHelper=new ItemTouchHelper(new ReorderCallback());
private ListImageLoaderWrapper imgLoader;
private boolean editDirty;
public void setFields(List<AccountField> fields){
this.fields=fields;
@@ -83,12 +84,17 @@ public class ProfileAboutFragment extends Fragment implements WindowInsetsAwareF
fields=editableFields;
adapter.notifyDataSetChanged();
dragHelper.attachToRecyclerView(list);
editDirty=false;
}
public List<AccountField> getFields(){
return fields;
}
public boolean isEditDirty(){
return editDirty;
}
@Override
public void onApplyWindowInsets(WindowInsets insets){
if(Build.VERSION.SDK_INT>=29 && insets.getTappableElementInsets().bottom==0){
@@ -209,6 +215,7 @@ public class ProfileAboutFragment extends Fragment implements WindowInsetsAwareF
private class EditableAboutViewHolder extends BaseViewHolder{
private final EditText title;
private final EditText value;
private boolean ignoreTextChange;
public EditableAboutViewHolder(){
super(R.layout.onboarding_profile_field);
@@ -218,16 +225,26 @@ public class ProfileAboutFragment extends Fragment implements WindowInsetsAwareF
dragHelper.startDrag(this);
return true;
});
title.addTextChangedListener(new SimpleTextWatcher(e->item.name=e.toString()));
value.addTextChangedListener(new SimpleTextWatcher(e->item.value=e.toString()));
title.addTextChangedListener(new SimpleTextWatcher(e->{
item.name=e.toString();
if(!ignoreTextChange)
editDirty=true;
}));
value.addTextChangedListener(new SimpleTextWatcher(e->{
item.value=e.toString();
if(!ignoreTextChange)
editDirty=true;
}));
findViewById(R.id.delete).setOnClickListener(this::onRemoveRowClick);
}
@Override
public void onBind(AccountField item){
super.onBind(item);
ignoreTextChange=true;
title.setText(item.name);
value.setText(item.value);
ignoreTextChange=false;
}
private void onRemoveRowClick(View v){

View File

@@ -93,7 +93,7 @@ public class ProfileFeaturedFragment extends BaseStatusListFragment<SearchResult
args.putParcelable("profileAccount", Parcels.wrap(res.account));
Nav.go(getActivity(), ProfileFragment.class, args);
}
case HASHTAG -> UiUtils.openHashtagTimeline(getActivity(), accountID, res.hashtag.name);
case HASHTAG -> UiUtils.openHashtagTimeline(getActivity(), accountID, res.hashtag);
case STATUS -> {
Status status=res.status.getContentStatus();
Bundle args=new Bundle();

View File

@@ -67,6 +67,7 @@ import org.joinmastodon.android.ui.tabs.TabLayout;
import org.joinmastodon.android.ui.tabs.TabLayoutMediator;
import org.joinmastodon.android.ui.text.CustomEmojiSpan;
import org.joinmastodon.android.ui.text.HtmlParser;
import org.joinmastodon.android.ui.utils.SimpleTextWatcher;
import org.joinmastodon.android.ui.utils.UiUtils;
import org.joinmastodon.android.ui.views.CoverImageView;
import org.joinmastodon.android.ui.views.CustomDrawingOrderLinearLayout;
@@ -134,7 +135,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
private boolean isOwnProfile;
private ArrayList<AccountField> fields=new ArrayList<>();
private boolean isInEditMode;
private boolean isInEditMode, editDirty;
private Uri editNewAvatar, editNewCover;
private String profileAccountID;
private boolean refreshing;
@@ -147,6 +148,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
private boolean tabBarIsAtTop;
private Animator tabBarColorAnim;
private MenuItem editSaveMenuItem;
private boolean savingEdits;
@Override
public void onCreate(Bundle savedInstanceState){
@@ -243,15 +245,23 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
tabbar.setTabTextColors(UiUtils.getThemeColor(getActivity(), R.attr.colorM3OnSurfaceVariant), UiUtils.getThemeColor(getActivity(), R.attr.colorM3Primary));
tabbar.setTabTextSize(V.dp(14));
tabLayoutMediator=new TabLayoutMediator(tabbar, pager, new TabLayoutMediator.TabConfigurationStrategy(){
tabLayoutMediator=new TabLayoutMediator(tabbar, pager, (tab, position)->tab.setText(switch(position){
case 0 -> R.string.profile_featured;
case 1 -> R.string.profile_timeline;
case 2 -> R.string.profile_about;
default -> throw new IllegalStateException();
}));
tabbar.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener(){
@Override
public void onConfigureTab(@NonNull TabLayout.Tab tab, int position){
tab.setText(switch(position){
case 0 -> R.string.profile_featured;
case 1 -> R.string.profile_timeline;
case 2 -> R.string.profile_about;
default -> throw new IllegalStateException();
});
public void onTabSelected(TabLayout.Tab tab){}
@Override
public void onTabUnselected(TabLayout.Tab tab){}
@Override
public void onTabReselected(TabLayout.Tab tab){
if(getFragmentForPage(tab.getPosition()) instanceof ScrollableToTop stt)
stt.scrollToTop();
}
});
@@ -268,6 +278,12 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
refreshLayout.setOnRefreshListener(this);
fab.setOnClickListener(this::onFabClick);
if(savedInstanceState!=null){
featuredFragment=(ProfileFeaturedFragment) getChildFragmentManager().getFragment(savedInstanceState, "featured");
timelineFragment=(AccountTimelineFragment) getChildFragmentManager().getFragment(savedInstanceState, "timeline");
aboutFragment=(ProfileAboutFragment) getChildFragmentManager().getFragment(savedInstanceState, "about");
}
if(loaded){
bindHeaderView();
dataLoaded();
@@ -304,6 +320,9 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
refreshLayout.setProgressBackgroundColorSchemeColor(UiUtils.alphaBlendColors(colorBackground, colorPrimary, 0.11f));
refreshLayout.setColorSchemeColors(colorPrimary);
nameEdit.addTextChangedListener(new SimpleTextWatcher(e->editDirty=true));
bioEdit.addTextChangedListener(new SimpleTextWatcher(e->editDirty=true));
return sizeWrapper;
}
@@ -349,15 +368,19 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
public void dataLoaded(){
if(getActivity()==null)
return;
Bundle args=new Bundle();
args.putString("account", accountID);
args.putParcelable("profileAccount", Parcels.wrap(account));
args.putBoolean("__is_tab", true);
args.putBoolean("noAutoLoad", true);
if(featuredFragment==null){
featuredFragment=new ProfileFeaturedFragment();
Bundle args=new Bundle();
args.putString("account", accountID);
args.putParcelable("profileAccount", Parcels.wrap(account));
args.putBoolean("__is_tab", true);
args.putBoolean("noAutoLoad", true);
featuredFragment.setArguments(args);
}
if(timelineFragment==null){
timelineFragment=AccountTimelineFragment.newInstance(accountID, account, true);
}
if(aboutFragment==null){
aboutFragment=new ProfileAboutFragment();
aboutFragment.setFields(fields);
}
@@ -423,6 +446,19 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
});
}
@Override
public void onSaveInstanceState(Bundle outState){
super.onSaveInstanceState(outState);
if(featuredFragment==null)
return;
if(featuredFragment.isAdded())
getChildFragmentManager().putFragment(outState, "featured", featuredFragment);
if(timelineFragment.isAdded())
getChildFragmentManager().putFragment(outState, "timeline", timelineFragment);
if(aboutFragment.isAdded())
getChildFragmentManager().putFragment(outState, "about", aboutFragment);
}
@Override
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
@@ -813,6 +849,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
aboutFragment.enterEditMode(account.source.fields);
refreshLayout.setEnabled(false);
editDirty=false;
}
private void exitEditMode(){
@@ -861,10 +898,12 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
if(!isInEditMode)
throw new IllegalStateException();
setActionProgressVisible(true);
savingEdits=true;
new UpdateAccountCredentials(nameEdit.getText().toString(), bioEdit.getText().toString(), editNewAvatar, editNewCover, aboutFragment.getFields())
.setCallback(new Callback<>(){
@Override
public void onSuccess(Account result){
savingEdits=false;
account=result;
AccountSessionManager.getInstance().updateAccountInfo(accountID, account);
exitEditMode();
@@ -873,6 +912,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
@Override
public void onError(ErrorResponse error){
savingEdits=false;
error.showToast(getActivity());
setActionProgressVisible(false);
}
@@ -896,11 +936,17 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
@Override
public boolean onBackPressed(){
if(isInEditMode){
new M3AlertDialogBuilder(getActivity())
.setTitle(R.string.discard_changes)
.setPositiveButton(R.string.discard, (dlg, btn)->exitEditMode())
.setNegativeButton(R.string.cancel, null)
.show();
if(savingEdits)
return true;
if(editDirty || aboutFragment.isEditDirty()){
new M3AlertDialogBuilder(getActivity())
.setTitle(R.string.discard_changes)
.setPositiveButton(R.string.discard, (dlg, btn)->exitEditMode())
.setNegativeButton(R.string.cancel, null)
.show();
}else{
exitEditMode();
}
return true;
}
return false;
@@ -961,9 +1007,11 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
if(requestCode==AVATAR_RESULT){
editNewAvatar=data.getData();
ViewImageLoader.loadWithoutAnimation(avatar, null, new UrlImageLoaderRequest(editNewAvatar, V.dp(100), V.dp(100)));
editDirty=true;
}else if(requestCode==COVER_RESULT){
editNewCover=data.getData();
ViewImageLoader.loadWithoutAnimation(cover, null, new UrlImageLoaderRequest(editNewCover, V.dp(1000), V.dp(1000)));
editDirty=true;
}
}
}
@@ -996,9 +1044,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
@NonNull
@Override
public SimpleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){
FrameLayout view=tabViews[viewType];
((ViewGroup)view.getParent()).removeView(view);
view.setVisibility(View.VISIBLE);
FrameLayout view=new FrameLayout(parent.getContext());
view.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
return new SimpleViewHolder(view);
}
@@ -1006,8 +1052,13 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
@Override
public void onBindViewHolder(@NonNull SimpleViewHolder holder, int position){
Fragment fragment=getFragmentForPage(position);
FrameLayout fragmentView=tabViews[position];
fragmentView.setVisibility(View.VISIBLE);
if(fragmentView.getParent() instanceof ViewGroup parent)
parent.removeView(fragmentView);
((FrameLayout)holder.itemView).addView(fragmentView);
if(!fragment.isAdded()){
getChildFragmentManager().beginTransaction().add(holder.itemView.getId(), fragment).commit();
getChildFragmentManager().beginTransaction().add(fragmentView.getId(), fragment).commit();
holder.itemView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener(){
@Override
public boolean onPreDraw(){

View File

@@ -7,20 +7,27 @@ import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.WindowInsets;
import android.widget.Button;
import android.widget.ProgressBar;
import org.joinmastodon.android.MastodonApp;
import org.joinmastodon.android.R;
import org.joinmastodon.android.api.requests.catalog.GetCatalogDefaultInstances;
import org.joinmastodon.android.api.requests.instance.GetInstance;
import org.joinmastodon.android.fragments.onboarding.InstanceCatalogSignupFragment;
import org.joinmastodon.android.fragments.onboarding.InstanceChooserLoginFragment;
import org.joinmastodon.android.fragments.onboarding.InstanceRulesFragment;
import org.joinmastodon.android.model.Instance;
import org.joinmastodon.android.model.catalog.CatalogDefaultInstance;
import org.joinmastodon.android.ui.InterpolatingMotionEffect;
import org.joinmastodon.android.ui.M3AlertDialogBuilder;
import org.joinmastodon.android.ui.utils.UiUtils;
import org.joinmastodon.android.ui.views.ProgressBarButton;
import org.joinmastodon.android.ui.views.SizeListenerFrameLayout;
import org.parceler.Parcels;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
import androidx.annotation.Nullable;
import me.grishka.appkit.Nav;
import me.grishka.appkit.api.Callback;
@@ -37,11 +44,16 @@ public class SplashFragment extends AppKitFragment{
private View artContainer, blueFill, greenFill;
private InterpolatingMotionEffect motionEffect;
private View artClouds, artPlaneElephant, artRightHill, artLeftHill, artCenterHill;
private ProgressBarButton defaultServerButton;
private ProgressBar defaultServerProgress;
private String chosenDefaultServer=DEFAULT_SERVER;
private boolean loadingDefaultServer;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
motionEffect=new InterpolatingMotionEffect(MastodonApp.context);
loadAndChooseDefaultServer();
}
@Nullable
@@ -50,9 +62,14 @@ public class SplashFragment extends AppKitFragment{
contentView=(SizeListenerFrameLayout) inflater.inflate(R.layout.fragment_splash, container, false);
contentView.findViewById(R.id.btn_get_started).setOnClickListener(this::onButtonClick);
contentView.findViewById(R.id.btn_log_in).setOnClickListener(this::onButtonClick);
Button joinDefault=contentView.findViewById(R.id.btn_join_default_server);
joinDefault.setText(getString(R.string.join_default_server, DEFAULT_SERVER));
joinDefault.setOnClickListener(this::onJoinDefaultServerClick);
defaultServerButton=contentView.findViewById(R.id.btn_join_default_server);
defaultServerButton.setText(getString(R.string.join_default_server, chosenDefaultServer));
defaultServerButton.setOnClickListener(this::onJoinDefaultServerClick);
defaultServerProgress=contentView.findViewById(R.id.action_progress);
if(loadingDefaultServer){
defaultServerButton.setTextVisible(false);
defaultServerProgress.setVisibility(View.VISIBLE);
}
contentView.findViewById(R.id.btn_learn_more).setOnClickListener(this::onLearnMoreClick);
artClouds=contentView.findViewById(R.id.art_clouds);
@@ -96,12 +113,22 @@ public class SplashFragment extends AppKitFragment{
}
private void onJoinDefaultServerClick(View v){
if(loadingDefaultServer)
return;
new GetInstance()
.setCallback(new Callback<>(){
@Override
public void onSuccess(Instance result){
if(getActivity()==null)
return;
if(!result.registrations){
new M3AlertDialogBuilder(getActivity())
.setTitle(R.string.error)
.setMessage(R.string.instance_signup_closed)
.setPositiveButton(R.string.ok, null)
.show();
return;
}
Bundle args=new Bundle();
args.putParcelable("instance", Parcels.wrap(result));
Nav.go(getActivity(), InstanceRulesFragment.class, args);
@@ -115,7 +142,7 @@ public class SplashFragment extends AppKitFragment{
}
})
.wrapProgress(getActivity(), R.string.loading_instance, true)
.execNoAuth(DEFAULT_SERVER);
.execNoAuth(chosenDefaultServer);
}
private void onLearnMoreClick(View v){
@@ -168,4 +195,54 @@ public class SplashFragment extends AppKitFragment{
super.onHidden();
motionEffect.deactivate();
}
private void loadAndChooseDefaultServer(){
loadingDefaultServer=true;
new GetCatalogDefaultInstances()
.setCallback(new Callback<>(){
@Override
public void onSuccess(List<CatalogDefaultInstance> result){
if(result.isEmpty()){
setChosenDefaultServer(DEFAULT_SERVER);
return;
}
float sum=0f;
for(CatalogDefaultInstance inst:result){
sum+=inst.weight;
}
if(sum<=0)
sum=1f;
for(CatalogDefaultInstance inst:result){
inst.weight/=sum;
}
float rand=ThreadLocalRandom.current().nextFloat();
float prev=0f;
for(CatalogDefaultInstance inst:result){
if(rand>=prev && rand<prev+inst.weight){
setChosenDefaultServer(inst.domain);
return;
}
prev+=inst.weight;
}
// Just in case something didn't add up
setChosenDefaultServer(result.get(result.size()-1).domain);
}
@Override
public void onError(ErrorResponse error){
setChosenDefaultServer(DEFAULT_SERVER);
}
})
.execNoAuth("");
}
private void setChosenDefaultServer(String domain){
chosenDefaultServer=domain;
loadingDefaultServer=false;
if(defaultServerButton!=null && getActivity()!=null){
defaultServerButton.setTextVisible(true);
defaultServerProgress.setVisibility(View.GONE);
defaultServerButton.setText(getString(R.string.join_default_server, chosenDefaultServer));
}
}
}

View File

@@ -17,6 +17,7 @@ import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.model.StatusContext;
import org.joinmastodon.android.ui.displayitems.ExtendedFooterStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.FooterStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.SpoilerStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.StatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.TextStatusDisplayItem;
import org.joinmastodon.android.ui.text.HtmlParser;
@@ -61,6 +62,12 @@ public class ThreadFragment extends StatusListFragment{
text.textSelectable=true;
else if(item instanceof FooterStatusDisplayItem footer)
footer.hideCounts=true;
else if(item instanceof SpoilerStatusDisplayItem spoiler){
for(StatusDisplayItem subItem:spoiler.contentItems){
if(subItem instanceof TextStatusDisplayItem text)
text.textSelectable=true;
}
}
}
items.add(new ExtendedFooterStatusDisplayItem(s.id, this, s.getContentStatus()));
}

View File

@@ -47,7 +47,7 @@ public class ComposeAccountSearchFragment extends BaseAccountListFragment{
@Override
protected void doLoadData(int offset, int count){
refreshing=true;
currentRequest=new GetSearchResults(currentQuery, GetSearchResults.Type.ACCOUNTS, false)
currentRequest=new GetSearchResults(currentQuery, GetSearchResults.Type.ACCOUNTS, false, null, 0, 0)
.setCallback(new SimpleCallback<>(this){
@Override
public void onSuccess(SearchResults result){

View File

@@ -280,15 +280,19 @@ public class DiscoverFragment extends AppKitFragment implements ScrollableToTop,
@NonNull
@Override
public SimpleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){
FrameLayout view=tabViews[viewType];
((ViewGroup)view.getParent()).removeView(view);
view.setVisibility(View.VISIBLE);
FrameLayout view=new FrameLayout(parent.getContext());
view.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
return new SimpleViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull SimpleViewHolder holder, int position){}
public void onBindViewHolder(@NonNull SimpleViewHolder holder, int position){
FrameLayout view=tabViews[position];
if(view.getParent() instanceof ViewGroup parent)
parent.removeView(view);
view.setVisibility(View.VISIBLE);
((FrameLayout)holder.itemView).addView(view, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
}
@Override
public int getItemCount(){

View File

@@ -3,7 +3,6 @@ package org.joinmastodon.android.fragments.discover;
import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import org.joinmastodon.android.R;
@@ -20,7 +19,6 @@ import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.ui.displayitems.AccountStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.HashtagStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.StatusDisplayItem;
import org.joinmastodon.android.ui.tabs.TabLayout;
import org.joinmastodon.android.ui.utils.UiUtils;
import org.parceler.Parcels;
@@ -28,13 +26,12 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.EnumSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import me.grishka.appkit.Nav;
import me.grishka.appkit.api.Callback;
import me.grishka.appkit.api.ErrorResponse;
import me.grishka.appkit.utils.V;
public class SearchFragment extends BaseStatusListFragment<SearchResult>{
private String currentQuery;
@@ -94,7 +91,7 @@ public class SearchFragment extends BaseStatusListFragment<SearchResult>{
args.putParcelable("profileAccount", Parcels.wrap(res.account));
Nav.go(getActivity(), ProfileFragment.class, args);
}
case HASHTAG -> UiUtils.openHashtagTimeline(getActivity(), accountID, res.hashtag.name);
case HASHTAG -> UiUtils.openHashtagTimeline(getActivity(), accountID, res.hashtag);
case STATUS -> {
Status status=res.status.getContentStatus();
Bundle args=new Bundle();
@@ -110,7 +107,7 @@ public class SearchFragment extends BaseStatusListFragment<SearchResult>{
}
@Override
protected void doLoadData(int offset, int count){
protected void doLoadData(int _offset, int count){
GetSearchResults.Type type;
if(currentFilter.size()==1){
type=switch(currentFilter.iterator().next()){
@@ -125,7 +122,21 @@ public class SearchFragment extends BaseStatusListFragment<SearchResult>{
dataLoaded();
return;
}
currentRequest=new GetSearchResults(currentQuery, type, true)
String maxID=null;
// TODO server-side bug
/*int offset=0;
if(_offset>0){
if(type==GetSearchResults.Type.STATUSES){
if(!preloadedData.isEmpty())
maxID=preloadedData.get(preloadedData.size()-1).status.id;
else if(!data.isEmpty())
maxID=data.get(data.size()-1).status.id;
}else{
offset=_offset;
}
}*/
int offset=_offset;
currentRequest=new GetSearchResults(currentQuery, type, type==null, maxID, offset, type==null ? 0 : count)
.setCallback(new Callback<>(){
@Override
public void onSuccess(SearchResults result){
@@ -139,12 +150,15 @@ public class SearchFragment extends BaseStatusListFragment<SearchResult>{
results.add(new SearchResult(tag));
}
if(result.statuses!=null){
for(Status status:result.statuses)
results.add(new SearchResult(status));
Set<String> alreadyLoadedStatuses=data.stream().filter(r->r.type==SearchResult.Type.STATUS).map(r->r.status.id).collect(Collectors.toSet());
for(Status status:result.statuses){
if(!alreadyLoadedStatuses.contains(status.id))
results.add(new SearchResult(status));
}
}
prevDisplayItems=new ArrayList<>(displayItems);
unfilteredResults=results;
onDataLoaded(filterSearchResults(results), false);
onDataLoaded(filterSearchResults(results), type!=null && !results.isEmpty());
}
@Override

View File

@@ -43,9 +43,7 @@ import org.joinmastodon.android.ui.viewholders.AccountViewHolder;
import org.joinmastodon.android.ui.viewholders.SimpleListItemViewHolder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.function.Function;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -121,7 +119,7 @@ public class SearchQueryFragment extends MastodonRecyclerFragment<SearchResultVi
recentsHeader.setVisible(!data.isEmpty());
});
}else{
currentRequest=new GetSearchResults(currentQuery, null, false)
currentRequest=new GetSearchResults(currentQuery, null, false, null, 0, 0)
.limit(2)
.setCallback(new SimpleCallback<>(this){
@Override
@@ -279,7 +277,7 @@ public class SearchQueryFragment extends MastodonRecyclerFragment<SearchResultVi
@Override
protected void onShown(){
super.onShown();
getActivity().getSystemService(InputMethodManager.class).showSoftInput(getActivity().getCurrentFocus(), 0);
getActivity().getSystemService(InputMethodManager.class).showSoftInput(searchViewHelper.getSearchEdit(), 0);
}
@Override
@@ -377,7 +375,7 @@ public class SearchQueryFragment extends MastodonRecyclerFragment<SearchResultVi
}
private void openHashtag(SearchResult res){
UiUtils.openHashtagTimeline(getActivity(), accountID, res.hashtag.name);
UiUtils.openHashtagTimeline(getActivity(), accountID, res.hashtag);
AccountSessionManager.getInstance().getAccount(accountID).getCacheController().putRecentSearch(res);
}
@@ -386,6 +384,8 @@ public class SearchQueryFragment extends MastodonRecyclerFragment<SearchResultVi
}
private void onSearchViewEnter(){
if(TextUtils.isEmpty(currentQuery) || currentQuery.trim().isEmpty())
return;
deliverResult(currentQuery, null);
}

View File

@@ -105,7 +105,7 @@ public class TrendingHashtagsFragment extends BaseRecyclerFragment<Hashtag> impl
@Override
public void onClick(){
UiUtils.openHashtagTimeline(getActivity(), accountID, item.name);
UiUtils.openHashtagTimeline(getActivity(), accountID, item);
}
}
}

View File

@@ -47,6 +47,7 @@ public class AccountActivationFragment extends ToolbarFragment{
private APIRequest currentRequest;
private Runnable resendTimer=this::updateResendTimer;
private long lastResendTime;
private boolean visible;
@Override
public void onCreate(Bundle savedInstanceState){
@@ -111,12 +112,14 @@ public class AccountActivationFragment extends ToolbarFragment{
@Override
protected void onShown(){
super.onShown();
visible=true;
tryGetAccount();
}
@Override
protected void onHidden(){
super.onHidden();
visible=false;
if(currentRequest!=null){
currentRequest.cancel();
currentRequest=null;
@@ -162,9 +165,7 @@ public class AccountActivationFragment extends ToolbarFragment{
private void tryGetAccount(){
if(AccountSessionManager.getInstance().tryGetAccount(accountID)==null){
uiHandler.removeCallbacks(pollRunnable);
getActivity().finish();
Intent intent=new Intent(getActivity(), MainActivity.class);
startActivity(intent);
((MainActivity)getActivity()).restartHomeFragment();
return;
}
currentRequest=new GetOwnAccount()
@@ -229,6 +230,8 @@ public class AccountActivationFragment extends ToolbarFragment{
}
private void proceed(){
if(!visible)
return;
Bundle args=new Bundle();
args.putString("account", accountID);
// Nav.goClearingStack(getActivity(), HomeFragment.class, args);

View File

@@ -228,7 +228,7 @@ abstract class InstanceCatalogFragment extends BaseRecyclerFragment<CatalogInsta
}
loadingInstanceDomain=null;
showInstanceInfoLoadError(domain, error);
if(fakeInstance!=null){
if(fakeInstance!=null && getActivity()!=null){
fakeInstance.description=getString(R.string.error);
if(filteredData.size()>0 && filteredData.get(0)==fakeInstance){
if(list.findViewHolderForAdapterPosition(1) instanceof BindableViewHolder<?> ivh){

View File

@@ -45,6 +45,7 @@ import org.jsoup.nodes.TextNode;
import org.jsoup.select.NodeVisitor;
import org.parceler.Parcels;
import java.time.ZoneId;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
@@ -189,7 +190,7 @@ public class SignupFragment extends ToolbarFragment{
edit.setError(null);
}
errorFields.clear();
new RegisterAccount(username, email, password.getText().toString(), getResources().getConfiguration().locale.getLanguage(), reason.getText().toString())
new RegisterAccount(username, email, password.getText().toString(), getResources().getConfiguration().locale.getLanguage(), reason.getText().toString(), ZoneId.systemDefault().getId())
.setCallback(new Callback<>(){
@Override
public void onSuccess(Token result){
@@ -270,7 +271,7 @@ public class SignupFragment extends ToolbarFragment{
@Override
public void tail(Node node, int depth){
if(node instanceof Element){
ssb.setSpan(new LinkSpan("", SignupFragment.this::onGoBackLinkClick, LinkSpan.Type.CUSTOM, null), spanStart, ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ssb.setSpan(new LinkSpan("", SignupFragment.this::onGoBackLinkClick, LinkSpan.Type.CUSTOM, null, null), spanStart, ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ssb.setSpan(new TypefaceSpan("sans-serif-medium"), spanStart, ssb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}

View File

@@ -100,7 +100,6 @@ public class ReportAddPostsChoiceFragment extends StatusListFragment{
selectedIDs.remove(id);
else
selectedIDs.add(id);
btn.setEnabled(!selectedIDs.isEmpty());
CheckableHeaderStatusDisplayItem.Holder holder=findHolderOfType(id, CheckableHeaderStatusDisplayItem.Holder.class);
if(holder!=null)
holder.rebind();
@@ -110,7 +109,6 @@ public class ReportAddPostsChoiceFragment extends StatusListFragment{
public void onViewCreated(View view, Bundle savedInstanceState){
super.onViewCreated(view, savedInstanceState);
btn=view.findViewById(R.id.btn_next);
btn.setEnabled(!selectedIDs.isEmpty());
btn.setOnClickListener(this::onButtonClick);
buttonBar=view.findViewById(R.id.button_bar);

View File

@@ -52,6 +52,7 @@ public class SettingsMainFragment extends BaseSettingsFragment<Void>{
onDataLoaded(List.of(
new ListItem<>(R.string.settings_behavior, 0, R.drawable.ic_settings_24px, this::onBehaviorClick),
new ListItem<>(R.string.settings_display, 0, R.drawable.ic_style_24px, this::onDisplayClick),
new ListItem<>(R.string.settings_privacy, 0, R.drawable.ic_privacy_tip_24px, this::onPrivacyClick),
new ListItem<>(R.string.settings_filters, 0, R.drawable.ic_filter_alt_24px, this::onFiltersClick),
new ListItem<>(R.string.settings_notifications, 0, R.drawable.ic_notifications_24px, this::onNotificationsClick),
new ListItem<>(AccountSessionManager.get(accountID).domain, getString(R.string.settings_server_explanation), R.drawable.ic_dns_24px, this::onServerClick),
@@ -63,7 +64,9 @@ public class SettingsMainFragment extends BaseSettingsFragment<Void>{
data.add(0, new ListItem<>("Debug settings", null, R.drawable.ic_settings_24px, ()->Nav.go(getActivity(), SettingsDebugFragment.class, makeFragmentArgs()), null, 0, true));
}
AccountSessionManager.get(accountID).reloadPreferences(null);
AccountSession session=AccountSessionManager.get(accountID);
session.reloadPreferences(null);
session.updateAccountInfo();
E.register(this);
}
@@ -127,6 +130,10 @@ public class SettingsMainFragment extends BaseSettingsFragment<Void>{
Nav.go(getActivity(), SettingsDisplayFragment.class, makeFragmentArgs());
}
private void onPrivacyClick(){
Nav.go(getActivity(), SettingsPrivacyFragment.class, makeFragmentArgs());
}
private void onFiltersClick(){
Nav.go(getActivity(), SettingsFiltersFragment.class, makeFragmentArgs());
}
@@ -149,9 +156,7 @@ public class SettingsMainFragment extends BaseSettingsFragment<Void>{
.setMessage(getString(R.string.confirm_log_out, session.getFullUsername()))
.setPositiveButton(R.string.log_out, (dialog, which)->AccountSessionManager.get(accountID).logOut(getActivity(), ()->{
loggedOut=true;
getActivity().finish();
Intent intent=new Intent(getActivity(), MainActivity.class);
startActivity(intent);
((MainActivity)getActivity()).restartHomeFragment();
}))
.setNegativeButton(R.string.cancel, null)
.show();

View File

@@ -0,0 +1,41 @@
package org.joinmastodon.android.fragments.settings;
import android.os.Bundle;
import org.joinmastodon.android.R;
import org.joinmastodon.android.api.session.AccountSessionManager;
import org.joinmastodon.android.model.Account;
import org.joinmastodon.android.model.viewmodel.CheckableListItem;
import java.util.List;
public class SettingsPrivacyFragment extends BaseSettingsFragment<Void>{
private CheckableListItem<Void> discoverableItem, indexableItem;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setTitle(R.string.settings_privacy);
Account self=AccountSessionManager.get(accountID).self;
onDataLoaded(List.of(
discoverableItem=new CheckableListItem<>(R.string.settings_discoverable, 0, CheckableListItem.Style.SWITCH, self.discoverable, R.drawable.ic_thumbs_up_down_24px, ()->toggleCheckableItem(discoverableItem)),
indexableItem=new CheckableListItem<>(R.string.settings_indexable, 0, CheckableListItem.Style.SWITCH, self.source.indexable!=null ? self.source.indexable : true, R.drawable.ic_search_24px, ()->toggleCheckableItem(indexableItem))
));
if(self.source.indexable==null)
indexableItem.isEnabled=false;
}
@Override
protected void doLoadData(int offset, int count){}
@Override
public void onPause(){
super.onPause();
Account self=AccountSessionManager.get(accountID).self;
if(self.discoverable!=discoverableItem.checked || (self.source.indexable!=null && self.source.indexable!=indexableItem.checked)){
self.discoverable=discoverableItem.checked;
self.source.indexable=indexableItem.checked;
AccountSessionManager.get(accountID).savePreferencesLater();
}
}
}

View File

@@ -146,18 +146,21 @@ public class SettingsServerFragment extends AppKitFragment{
@NonNull
@Override
public SimpleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){
FrameLayout view=tabViews[viewType];
((ViewGroup)view.getParent()).removeView(view);
view.setVisibility(View.VISIBLE);
FrameLayout view=new FrameLayout(parent.getContext());
view.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
return new SimpleViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull SimpleViewHolder holder, int position){
FrameLayout view=tabViews[position];
if(view.getParent() instanceof ViewGroup parent)
parent.removeView(view);
view.setVisibility(View.VISIBLE);
((FrameLayout)holder.itemView).addView(view, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
Fragment fragment=getFragmentForPage(position);
if(!fragment.isAdded()){
getChildFragmentManager().beginTransaction().add(holder.itemView.getId(), fragment).commit();
getChildFragmentManager().beginTransaction().add(view.getId(), fragment).commit();
holder.itemView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener(){
@Override
public boolean onPreDraw(){

View File

@@ -132,6 +132,7 @@ public class Account extends BaseModel{
* When a timed mute will expire, if applicable.
*/
public Instant muteExpiresAt;
public boolean noindex;
@Override
@@ -191,6 +192,7 @@ public class Account extends BaseModel{
", source="+source+
", suspended="+suspended+
", muteExpiresAt="+muteExpiresAt+
", noindex="+noindex+
'}';
}
}

View File

@@ -45,26 +45,26 @@ public class Attachment extends BaseModel{
public int getWidth(){
if(meta==null)
return 1920;
return 0;
if(meta.width>0)
return meta.width;
if(meta.original!=null && meta.original.width>0)
return meta.original.width;
if(meta.small!=null && meta.small.width>0)
return meta.small.width;
return 1920;
return 0;
}
public int getHeight(){
if(meta==null)
return 1080;
return 0;
if(meta.height>0)
return meta.height;
if(meta.original!=null && meta.original.height>0)
return meta.original.height;
if(meta.small!=null && meta.small.height>0)
return meta.small.height;
return 1080;
return 0;
}
public double getDuration(){

View File

@@ -13,6 +13,7 @@ public class Hashtag extends BaseModel implements DisplayItemsParent{
public String url;
public List<History> history;
public int statusesCount;
public boolean following;
@Override
public String toString(){
@@ -21,6 +22,7 @@ public class Hashtag extends BaseModel implements DisplayItemsParent{
", url='"+url+'\''+
", history="+history+
", statusesCount="+statusesCount+
", following="+following+
'}';
}
@@ -28,4 +30,19 @@ public class Hashtag extends BaseModel implements DisplayItemsParent{
public String getID(){
return name;
}
@Override
public boolean equals(Object o){
if(this==o) return true;
if(o==null || getClass()!=o.getClass()) return false;
Hashtag hashtag=(Hashtag) o;
return name.equals(hashtag.name);
}
@Override
public int hashCode(){
return name.hashCode();
}
}

View File

@@ -117,7 +117,7 @@ public class Instance extends BaseModel{
ci.domain=uri;
ci.normalizedDomain=IDN.toUnicode(uri);
ci.description=Html.fromHtml(shortDescription).toString().trim();
if(languages!=null){
if(languages!=null&&languages.size()>0){
ci.language=languages.get(0);
ci.languages=languages;
}else{

View File

@@ -20,4 +20,22 @@ public class Mention extends BaseModel{
", url='"+url+'\''+
'}';
}
@Override
public boolean equals(Object o){
if(this==o) return true;
if(o==null || getClass()!=o.getClass()) return false;
Mention mention=(Mention) o;
if(!id.equals(mention.id)) return false;
return url.equals(mention.url);
}
@Override
public int hashCode(){
int result=id.hashCode();
result=31*result+url.hashCode();
return result;
}
}

View File

@@ -37,6 +37,8 @@ public class Source extends BaseModel{
* The number of pending follow requests.
*/
public int followRequestCount;
public Boolean indexable;
public boolean hideCollections;
@Override
public void postprocess() throws ObjectValidationException{
@@ -54,6 +56,8 @@ public class Source extends BaseModel{
", sensitive="+sensitive+
", language='"+language+'\''+
", followRequestCount="+followRequestCount+
", indexable="+indexable+
", hideCollections="+hideCollections+
'}';
}
}

View File

@@ -1,5 +1,7 @@
package org.joinmastodon.android.model;
import android.text.TextUtils;
import org.joinmastodon.android.api.ObjectValidationException;
import org.joinmastodon.android.api.RequiredField;
import org.joinmastodon.android.events.StatusCountersUpdatedEvent;
@@ -8,6 +10,8 @@ import org.parceler.Parcel;
import java.time.Instant;
import java.util.List;
import java.util.Locale;
import java.util.Objects;
import androidx.annotation.NonNull;
@@ -61,6 +65,8 @@ public class Status extends BaseModel implements DisplayItemsParent{
public transient boolean spoilerRevealed;
public transient boolean hasGapAfter;
private transient String strippedText;
public transient TranslationState translationState=TranslationState.HIDDEN;
public transient Translation translation;
public Status(){}
@@ -161,6 +167,18 @@ public class Status extends BaseModel implements DisplayItemsParent{
public Status clone(){
Status copy=(Status) super.clone();
copy.spoilerRevealed=false;
copy.translationState=TranslationState.HIDDEN;
return copy;
}
public boolean isEligibleForTranslation(){
return !TextUtils.isEmpty(content) && !TextUtils.isEmpty(language) && !Objects.equals(Locale.getDefault().getLanguage(), language)
&& (visibility==StatusPrivacy.PUBLIC || visibility==StatusPrivacy.UNLISTED);
}
public enum TranslationState{
HIDDEN,
SHOWN,
LOADING
}
}

View File

@@ -0,0 +1,10 @@
package org.joinmastodon.android.model;
import org.joinmastodon.android.api.AllFieldsAreRequired;
@AllFieldsAreRequired
public class Translation extends BaseModel{
public String content;
public String detectedSourceLanguage;
public String provider;
}

View File

@@ -0,0 +1,10 @@
package org.joinmastodon.android.model.catalog;
import org.joinmastodon.android.api.AllFieldsAreRequired;
import org.joinmastodon.android.model.BaseModel;
@AllFieldsAreRequired
public class CatalogDefaultInstance extends BaseModel{
public String domain;
public float weight;
}

View File

@@ -8,6 +8,7 @@ import android.graphics.drawable.Animatable;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.os.Build;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowInsets;
@@ -36,6 +37,7 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.StringRes;
import androidx.recyclerview.widget.LinearLayoutManager;
import me.grishka.appkit.FragmentStackActivity;
import me.grishka.appkit.Nav;
import me.grishka.appkit.api.Callback;
import me.grishka.appkit.api.ErrorResponse;
@@ -113,9 +115,7 @@ public class AccountSwitcherSheet extends BottomSheet{
private void logOut(String accountID){
AccountSessionManager.get(accountID).logOut(activity, ()->{
dismiss();
activity.finish();
Intent intent=new Intent(activity, MainActivity.class);
activity.startActivity(intent);
((MainActivity)activity).restartHomeFragment();
});
}
@@ -248,16 +248,17 @@ public class AccountSwitcherSheet extends BottomSheet{
@Override
public void onClick(){
dismiss();
if(AccountSessionManager.getInstance().getLastActiveAccountID().equals(item.getID())){
dismiss();
if(fragment!=null){
fragment.setCurrentTab(R.id.tab_profile);
}
return;
}
AccountSessionManager.getInstance().setLastActiveAccountID(item.getID());
activity.finish();
activity.startActivity(new Intent(activity, MainActivity.class));
if(AccountSessionManager.getInstance().tryGetAccount(item.getID())!=null){
AccountSessionManager.getInstance().setLastActiveAccountID(item.getID());
((MainActivity)activity).restartHomeFragment();
}
}
@Override

View File

@@ -126,4 +126,8 @@ public class SearchViewHelper{
public View getDivider(){
return divider;
}
public EditText getSearchEdit(){
return searchEdit;
}
}

View File

@@ -41,6 +41,7 @@ import org.parceler.Parcels;
import java.time.Instant;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import androidx.annotation.LayoutRes;
import me.grishka.appkit.Nav;
@@ -195,6 +196,8 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
AccountSessionManager.getInstance().getAccount(item.accountID).getStatusInteractionController().setBookmarked(item.status, !item.status.bookmarked);
}else if(id==R.id.share){
UiUtils.openSystemShareSheet(activity, item.status.url);
}else if(id==R.id.translate){
item.parentFragment.togglePostTranslation(item.status, item.parentID);
}
return true;
});
@@ -280,9 +283,20 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
}
private void updateOptionsMenu(){
if(item.parentFragment.getActivity()==null)
return;
Account account=item.user;
Menu menu=optionsMenu.getMenu();
boolean isOwnPost=AccountSessionManager.getInstance().isSelf(item.parentFragment.getAccountID(), account);
boolean canTranslate=item.status!=null && item.status.getContentStatus().isEligibleForTranslation();
MenuItem translate=menu.findItem(R.id.translate);
translate.setVisible(canTranslate);
if(canTranslate){
if(item.status.translationState==Status.TranslationState.SHOWN)
translate.setTitle(R.string.translation_show_original);
else
translate.setTitle(item.parentFragment.getString(R.string.translate_post, Locale.forLanguageTag(item.status.getContentStatus().language).getDisplayLanguage()));
}
menu.findItem(R.id.edit).setVisible(item.status!=null && isOwnPost);
menu.findItem(R.id.delete).setVisible(item.status!=null && isOwnPost);
menu.findItem(R.id.open_in_browser).setVisible(item.status!=null);

View File

@@ -8,6 +8,7 @@ import android.view.ViewGroup;
import android.widget.TextView;
import org.joinmastodon.android.R;
import org.joinmastodon.android.api.session.AccountSessionManager;
import org.joinmastodon.android.fragments.BaseStatusListFragment;
import org.joinmastodon.android.model.Emoji;
import org.joinmastodon.android.ui.text.HtmlParser;
@@ -29,7 +30,8 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{
public ReblogOrReplyLineStatusDisplayItem(String parentID, BaseStatusListFragment parentFragment, CharSequence text, List<Emoji> emojis, @DrawableRes int icon){
super(parentID, parentFragment);
SpannableStringBuilder ssb=new SpannableStringBuilder(text);
HtmlParser.parseCustomEmoji(ssb, emojis);
if(AccountSessionManager.get(parentFragment.getAccountID()).getLocalPreferences().customEmojiInNames)
HtmlParser.parseCustomEmoji(ssb, emojis);
this.text=ssb;
emojiHelper.setText(ssb);
this.icon=icon;

View File

@@ -3,15 +3,24 @@ package org.joinmastodon.android.ui.displayitems;
import android.app.Activity;
import android.graphics.drawable.Animatable;
import android.graphics.drawable.Drawable;
import android.text.SpannableStringBuilder;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewStub;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import org.joinmastodon.android.R;
import org.joinmastodon.android.fragments.BaseStatusListFragment;
import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.ui.text.HtmlParser;
import org.joinmastodon.android.ui.utils.CustomEmojiHelper;
import org.joinmastodon.android.ui.utils.UiUtils;
import org.joinmastodon.android.ui.views.LinkedTextView;
import java.util.Locale;
import me.grishka.appkit.imageloader.ImageLoaderViewHolder;
import me.grishka.appkit.imageloader.MovieDrawable;
import me.grishka.appkit.imageloader.requests.ImageLoaderRequest;
@@ -20,6 +29,8 @@ import me.grishka.appkit.utils.V;
public class TextStatusDisplayItem extends StatusDisplayItem{
private CharSequence text;
private CustomEmojiHelper emojiHelper=new CustomEmojiHelper();
private CharSequence translatedText;
private CustomEmojiHelper translationEmojiHelper=new CustomEmojiHelper();
public boolean textSelectable;
public boolean reduceTopPadding;
public final Status status;
@@ -38,30 +49,54 @@ public class TextStatusDisplayItem extends StatusDisplayItem{
@Override
public int getImageCount(){
return emojiHelper.getImageCount();
return getCurrentEmojiHelper().getImageCount();
}
@Override
public ImageLoaderRequest getImageRequest(int index){
return emojiHelper.getImageRequest(index);
return getCurrentEmojiHelper().getImageRequest(index);
}
public void setTranslatedText(String text){
Status statusForContent=status.getContentStatus();
translatedText=HtmlParser.parse(text, statusForContent.emojis, statusForContent.mentions, statusForContent.tags, parentFragment.getAccountID());
translationEmojiHelper.setText(translatedText);
}
private CustomEmojiHelper getCurrentEmojiHelper(){
return status.translationState==Status.TranslationState.SHOWN ? translationEmojiHelper : emojiHelper;
}
public static class Holder extends StatusDisplayItem.Holder<TextStatusDisplayItem> implements ImageLoaderViewHolder{
private final LinkedTextView text;
private final ViewStub translationFooterStub;
private View translationFooter;
private TextView translationInfo;
private Button translationShowOriginal;
private ProgressBar translationProgress;
public Holder(Activity activity, ViewGroup parent){
super(activity, R.layout.display_item_text, parent);
text=findViewById(R.id.text);
translationFooterStub=findViewById(R.id.translation_info);
}
@Override
public void onBind(TextStatusDisplayItem item){
text.setText(item.text);
if(item.status.translationState==Status.TranslationState.SHOWN){
if(item.translatedText==null){
item.setTranslatedText(item.status.translation.content);
}
text.setText(item.translatedText);
}else{
text.setText(item.text);
}
text.setTextIsSelectable(item.textSelectable);
text.setInvalidateOnEveryFrame(false);
itemView.setClickable(false);
text.setPadding(text.getPaddingLeft(), item.reduceTopPadding ? V.dp(8) : V.dp(16), text.getPaddingRight(), text.getPaddingBottom());
text.setTextColor(UiUtils.getThemeColor(text.getContext(), item.inset ? R.attr.colorM3OnSurfaceVariant : R.attr.colorM3OnSurface));
updateTranslation(false);
}
@Override
@@ -84,5 +119,43 @@ public class TextStatusDisplayItem extends StatusDisplayItem{
private CustomEmojiHelper getEmojiHelper(){
return item.emojiHelper;
}
public void updateTranslation(boolean updateText){
if(item.status==null)
return;
if(item.status.translationState==Status.TranslationState.HIDDEN){
if(translationFooter!=null)
translationFooter.setVisibility(View.GONE);
if(updateText){
text.setText(item.text);
}
}else{
if(translationFooter==null){
translationFooter=translationFooterStub.inflate();
translationInfo=findViewById(R.id.translation_info_text);
translationShowOriginal=findViewById(R.id.translation_show_original);
translationProgress=findViewById(R.id.translation_progress);
translationShowOriginal.setOnClickListener(v->item.parentFragment.togglePostTranslation(item.status, item.parentID));
}else{
translationFooter.setVisibility(View.VISIBLE);
}
if(item.status.translationState==Status.TranslationState.SHOWN){
translationProgress.setVisibility(View.GONE);
translationInfo.setVisibility(View.VISIBLE);
translationShowOriginal.setVisibility(View.VISIBLE);
translationInfo.setText(translationInfo.getContext().getString(R.string.post_translated, Locale.forLanguageTag(item.status.translation.detectedSourceLanguage).getDisplayLanguage(), item.status.translation.provider));
if(updateText){
if(item.translatedText==null){
item.setTranslatedText(item.status.translation.content);
}
text.setText(item.translatedText);
}
}else{ // LOADING
translationProgress.setVisibility(View.VISIBLE);
translationInfo.setVisibility(View.INVISIBLE);
translationShowOriginal.setVisibility(View.INVISIBLE);
}
}
}
}
}

View File

@@ -99,11 +99,15 @@ public class BlurhashCrossfadeDrawable extends Drawable{
@Override
public int getIntrinsicWidth(){
if(width==0)
return imageDrawable==null ? 1920 : imageDrawable.getIntrinsicWidth();
return width;
}
@Override
public int getIntrinsicHeight(){
if(height==0)
return imageDrawable==null ? 1080 : imageDrawable.getIntrinsicHeight();
return height;
}

View File

@@ -859,6 +859,8 @@ public class PhotoViewer implements ZoomPanView.Listener{
@Override
public void onVideoSizeChanged(MediaPlayer mp, int width, int height){
if(width<=0 || height<=0)
return;
FrameLayout.LayoutParams params=(FrameLayout.LayoutParams) wrap.getLayoutParams();
params.width=width;
params.height=height;

View File

@@ -119,6 +119,11 @@ public class ZoomPanView extends FrameLayout implements ScaleGestureDetector.OnS
int width=right-left;
int height=bottom-top;
if(width==0 || height==0 || child.getWidth()==0 || child.getWidth()==0){
matrix.reset();
return;
}
float scale=Math.min(width/(float)child.getWidth(), height/(float)child.getHeight());
minScale=scale;
maxScale=Math.max(3f, height/(float)child.getHeight());
@@ -306,8 +311,6 @@ public class ZoomPanView extends FrameLayout implements ScaleGestureDetector.OnS
}, 1f).setMinimumVisibleChange(DynamicAnimation.MIN_VISIBLE_CHANGE_ALPHA));
}
}else{
if(animatingTransition)
Log.w(TAG, "updateViewTransform: ", new Throwable().fillInStackTrace());
child.setScaleX(matrixValues[Matrix.MSCALE_X]);
child.setScaleY(matrixValues[Matrix.MSCALE_Y]);
child.setTranslationX(matrixValues[Matrix.MTRANS_X]);

View File

@@ -81,9 +81,10 @@ public class HtmlParser{
}
}
Map<String, String> idsByUrl=mentions.stream().collect(Collectors.toMap(m->m.url, m->m.id));
Map<String, String> idsByUrl=mentions.stream().distinct().collect(Collectors.toMap(m->m.url, m->m.id));
// Hashtags in remote posts have remote URLs, these have local URLs so they don't match.
// Map<String, String> tagsByUrl=tags.stream().collect(Collectors.toMap(t->t.url, t->t.name));
Map<String, Hashtag> tagsByTag=tags.stream().distinct().collect(Collectors.toMap(t->t.name.toLowerCase(), Function.identity()));
final SpannableStringBuilder ssb=new SpannableStringBuilder();
Jsoup.parseBodyFragment(source).body().traverse(new NodeVisitor(){
@@ -96,6 +97,7 @@ public class HtmlParser{
}else if(node instanceof Element el){
switch(el.nodeName()){
case "a" -> {
Object linkObject=null;
String href=el.attr("href");
LinkSpan.Type linkType;
if(el.hasClass("hashtag")){
@@ -103,6 +105,7 @@ public class HtmlParser{
if(text.startsWith("#")){
linkType=LinkSpan.Type.HASHTAG;
href=text.substring(1);
linkObject=tagsByTag.get(text.substring(1).toLowerCase());
}else{
linkType=LinkSpan.Type.URL;
}
@@ -117,7 +120,7 @@ public class HtmlParser{
}else{
linkType=LinkSpan.Type.URL;
}
openSpans.add(new SpanInfo(new LinkSpan(href, null, linkType, accountID), ssb.length(), el));
openSpans.add(new SpanInfo(new LinkSpan(href, null, linkType, accountID, linkObject), ssb.length(), el));
}
case "br" -> ssb.append('\n');
case "span" -> {
@@ -213,7 +216,7 @@ public class HtmlParser{
String url=matcher.group(3);
if(TextUtils.isEmpty(matcher.group(4)))
url="http://"+url;
ssb.setSpan(new LinkSpan(url, null, LinkSpan.Type.URL, null), matcher.start(3), matcher.end(3), 0);
ssb.setSpan(new LinkSpan(url, null, LinkSpan.Type.URL, null, null), matcher.start(3), matcher.end(3), 0);
}while(matcher.find()); // Find more URLs
return ssb;
}

View File

@@ -4,6 +4,7 @@ import android.content.Context;
import android.text.TextPaint;
import android.text.style.CharacterStyle;
import org.joinmastodon.android.model.Hashtag;
import org.joinmastodon.android.ui.utils.UiUtils;
public class LinkSpan extends CharacterStyle {
@@ -13,12 +14,14 @@ public class LinkSpan extends CharacterStyle {
private String link;
private Type type;
private String accountID;
private Object linkObject;
public LinkSpan(String link, OnLinkClickListener listener, Type type, String accountID){
public LinkSpan(String link, OnLinkClickListener listener, Type type, String accountID, Object linkObject){
this.listener=listener;
this.link=link;
this.type=type;
this.accountID=accountID;
this.linkObject=linkObject;
}
public int getColor(){
@@ -35,7 +38,12 @@ public class LinkSpan extends CharacterStyle {
switch(getType()){
case URL -> UiUtils.openURL(context, accountID, link);
case MENTION -> UiUtils.openProfileByID(context, accountID, link);
case HASHTAG -> UiUtils.openHashtagTimeline(context, accountID, link);
case HASHTAG -> {
if(linkObject instanceof Hashtag ht)
UiUtils.openHashtagTimeline(context, accountID, ht);
else
UiUtils.openHashtagTimeline(context, accountID, link);
}
case CUSTOM -> listener.onLinkClick(this);
}
}

View File

@@ -61,6 +61,7 @@ import org.joinmastodon.android.fragments.ProfileFragment;
import org.joinmastodon.android.fragments.ThreadFragment;
import org.joinmastodon.android.model.Account;
import org.joinmastodon.android.model.Emoji;
import org.joinmastodon.android.model.Hashtag;
import org.joinmastodon.android.model.Relationship;
import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.ui.M3AlertDialogBuilder;
@@ -342,10 +343,17 @@ public class UiUtils{
Nav.go((Activity)context, ProfileFragment.class, args);
}
public static void openHashtagTimeline(Context context, String accountID, Hashtag hashtag){
Bundle args=new Bundle();
args.putString("account", accountID);
args.putParcelable("hashtag", Parcels.wrap(hashtag));
Nav.go((Activity)context, HashtagTimelineFragment.class, args);
}
public static void openHashtagTimeline(Context context, String accountID, String hashtag){
Bundle args=new Bundle();
args.putString("account", accountID);
args.putString("hashtag", hashtag);
args.putString("hashtagName", hashtag);
Nav.go((Activity)context, HashtagTimelineFragment.class, args);
}

View File

@@ -15,15 +15,12 @@ import android.widget.TextView;
import org.joinmastodon.android.R;
import org.joinmastodon.android.api.requests.search.GetSearchResults;
import org.joinmastodon.android.api.session.AccountSessionManager;
import org.joinmastodon.android.model.Account;
import org.joinmastodon.android.model.Emoji;
import org.joinmastodon.android.model.Hashtag;
import org.joinmastodon.android.model.SearchResults;
import org.joinmastodon.android.model.viewmodel.AccountViewModel;
import org.joinmastodon.android.ui.BetterItemAnimator;
import org.joinmastodon.android.ui.OutlineProviders;
import org.joinmastodon.android.ui.text.HtmlParser;
import org.joinmastodon.android.ui.utils.CustomEmojiHelper;
import org.joinmastodon.android.ui.utils.HideableSingleViewRecyclerAdapter;
import org.joinmastodon.android.ui.utils.UiUtils;
import org.joinmastodon.android.ui.views.FilterChipView;
@@ -96,6 +93,24 @@ public class ComposeAutocompleteViewController{
outRect.right=V.dp(8);
}
});
// Set empty adapter to prevent NPEs
list.setAdapter(new RecyclerView.Adapter<>(){
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){
throw new UnsupportedOperationException();
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position){
}
@Override
public int getItemCount(){
return 0;
}
});
contentView.addView(list, new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
emptyButton=new FilterChipView(activity);
@@ -222,11 +237,13 @@ public class ComposeAutocompleteViewController{
}
private void doSearchUsers(){
currentRequest=new GetSearchResults(lastText, GetSearchResults.Type.ACCOUNTS, false)
currentRequest=new GetSearchResults(lastText, GetSearchResults.Type.ACCOUNTS, false, null, 0, 0)
.setCallback(new Callback<>(){
@Override
public void onSuccess(SearchResults result){
currentRequest=null;
if(mode!=Mode.USERS)
return;
List<AccountViewModel> oldList=users;
users=result.accounts.stream().map(a->new AccountViewModel(a, accountID)).collect(Collectors.toList());
if(isLoading){
@@ -256,7 +273,7 @@ public class ComposeAutocompleteViewController{
}
private void doSearchHashtags(){
currentRequest=new GetSearchResults(lastText, GetSearchResults.Type.HASHTAGS, false)
currentRequest=new GetSearchResults(lastText, GetSearchResults.Type.HASHTAGS, false, null, 0, 0)
.setCallback(new Callback<>(){
@Override
public void onSuccess(SearchResults result){

View File

@@ -27,10 +27,14 @@ import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.joinmastodon.android.MastodonApp;
import org.joinmastodon.android.R;
import org.joinmastodon.android.api.MastodonAPIController;
import org.joinmastodon.android.api.ProgressListener;
import org.joinmastodon.android.api.requests.statuses.CreateStatus;
import org.joinmastodon.android.api.requests.statuses.GetAttachmentByID;
import org.joinmastodon.android.api.requests.statuses.UpdateAttachment;
import org.joinmastodon.android.api.requests.statuses.UploadAttachment;
@@ -47,8 +51,11 @@ import org.parceler.Parcel;
import org.parceler.Parcels;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
import java.util.Locale;
import java.util.Objects;
import java.util.function.Consumer;
@@ -540,6 +547,14 @@ public class ComposeMediaViewController{
public List<String> getAttachmentIDs(){
return attachments.stream().map(a->a.serverAttachment.id).collect(Collectors.toList());
}
public List<CreateStatus.Request.MediaAttribute> getAttachmentAttributes(){
List<CreateStatus.Request.MediaAttribute> mediaAttributes = new ArrayList<>();
for (DraftMediaAttachment att:attachments){
mediaAttributes.add(new CreateStatus.Request.MediaAttribute(att.serverAttachment.id, att.description, null));
}
return mediaAttributes;
}
public boolean isEmpty(){
return attachments.isEmpty();
@@ -560,7 +575,7 @@ public class ComposeMediaViewController{
public boolean areAllAttachmentsImages(){
for(DraftMediaAttachment att:attachments){
if(!att.mimeType.startsWith("image/"))
if((att.mimeType==null && att.serverAttachment.type==Attachment.Type.IMAGE) || (att.mimeType!=null && !att.mimeType.startsWith("image/")))
return false;
}
return true;
@@ -582,7 +597,7 @@ public class ComposeMediaViewController{
public void saveAltTextsBeforePublishing(Runnable onSuccess, Consumer<ErrorResponse> onError){
ArrayList<UpdateAttachment> updateAltTextRequests=new ArrayList<>();
for(DraftMediaAttachment att:attachments){
if(!att.descriptionSaved){
if(!att.descriptionSaved && (fragment.editingStatus==null || !fragment.editingStatus.mediaAttachments.contains(att.serverAttachment))){
UpdateAttachment req=new UpdateAttachment(att.serverAttachment.id, att.description);
req.setCallback(new Callback<>(){
@Override

View File

@@ -74,9 +74,9 @@ public class ComposePollViewController{
pollWrap=view.findViewById(R.id.poll_wrap);
Instance instance=fragment.instance;
if(instance.configuration!=null && instance.configuration.polls!=null && instance.configuration.polls.maxOptions>0)
if(instance!=null && instance.configuration!=null && instance.configuration.polls!=null && instance.configuration.polls.maxOptions>0)
maxPollOptions=instance.configuration.polls.maxOptions;
if(instance.configuration!=null && instance.configuration.polls!=null && instance.configuration.polls.maxCharactersPerOption>0)
if(instance!=null && instance.configuration!=null && instance.configuration.polls!=null && instance.configuration.polls.maxCharactersPerOption>0)
maxPollOptionLength=instance.configuration.polls.maxCharactersPerOption;
pollOptionsView=pollWrap.findViewById(R.id.poll_options);

View File

@@ -18,7 +18,7 @@ public class MediaGridLayout extends ViewGroup{
public static final int MAX_WIDTH=400; // dp
private static final int GAP=2; // dp
private PhotoLayoutHelper.TiledLayoutResult tiledLayout;
private int[] columnStarts=new int[10], columnEnds=new int[10], rowStarts=new int[10], rowEnds=new int[10];
private int[] columnStarts, columnEnds, rowStarts, rowEnds;
public MediaGridLayout(Context context){
this(context, null);
@@ -45,6 +45,14 @@ public class MediaGridLayout extends ViewGroup{
width=Math.round(width*(tiledLayout.width/(float)PhotoLayoutHelper.MAX_WIDTH));
}
if(rowStarts==null || rowStarts.length<tiledLayout.rowSizes.length){
rowStarts=new int[tiledLayout.rowSizes.length];
rowEnds=new int[tiledLayout.rowSizes.length];
}
if(columnStarts==null || columnStarts.length<tiledLayout.columnSizes.length){
columnStarts=new int[tiledLayout.columnSizes.length];
columnEnds=new int[tiledLayout.columnSizes.length];
}
int offset=0;
for(int i=0;i<tiledLayout.columnSizes.length;i++){
columnStarts[i]=offset;
@@ -77,7 +85,7 @@ public class MediaGridLayout extends ViewGroup{
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b){
if(tiledLayout==null)
if(tiledLayout==null || rowStarts==null)
return;
int maxWidth=V.dp(MAX_WIDTH);

View File

@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M11,17H13V11H11ZM12,9Q12.425,9 12.713,8.712Q13,8.425 13,8Q13,7.575 12.713,7.287Q12.425,7 12,7Q11.575,7 11.288,7.287Q11,7.575 11,8Q11,8.425 11.288,8.712Q11.575,9 12,9ZM12,22Q8.525,21.125 6.263,18.012Q4,14.9 4,11.1V5L12,2L20,5V11.1Q20,14.9 17.738,18.012Q15.475,21.125 12,22ZM12,19.9Q14.6,19.075 16.3,16.6Q18,14.125 18,11.1V6.375L12,4.125L6,6.375V11.1Q6,14.125 7.7,16.6Q9.4,19.075 12,19.9ZM12,12Q12,12 12,12Q12,12 12,12Q12,12 12,12Q12,12 12,12Z"/>
</vector>

View File

@@ -0,0 +1,9 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="@android:color/white"
android:pathData="M2,14Q1.175,14 0.588,13.412Q0,12.825 0,12V6Q0,5.7 0.125,5.425Q0.25,5.15 0.45,4.95L5.4,0L6.15,0.75Q6.3,0.9 6.4,1.137Q6.5,1.375 6.5,1.6V1.8L5.8,5H11Q11.425,5 11.713,5.287Q12,5.575 12,6V7.25Q12,7.4 11.975,7.537Q11.95,7.675 11.9,7.8L9.65,13.1Q9.475,13.525 9.088,13.762Q8.7,14 8.25,14ZM7.95,12 L10,7.15V7Q10,7 10,7Q10,7 10,7H3.35L3.95,4.3L2,6.2V12Q2,12 2,12Q2,12 2,12ZM18.6,24 L17.85,23.25Q17.7,23.1 17.6,22.863Q17.5,22.625 17.5,22.4V22.2L18.2,19H13Q12.575,19 12.288,18.712Q12,18.425 12,18V16.75Q12,16.6 12.025,16.462Q12.05,16.325 12.1,16.2L14.35,10.9Q14.55,10.475 14.925,10.238Q15.3,10 15.75,10H22Q22.825,10 23.413,10.587Q24,11.175 24,12V18Q24,18.3 23.888,18.562Q23.775,18.825 23.55,19.05ZM16.05,12 L14,16.85V17Q14,17 14,17Q14,17 14,17H20.65L20.05,19.7L22,17.8V12Q22,12 22,12Q22,12 22,12ZM2,12V6.2V7Q2,7 2,7Q2,7 2,7V7.15V12Q2,12 2,12Q2,12 2,12ZM22,12V17.8V17Q22,17 22,17Q22,17 22,17V16.85V12Q22,12 22,12Q22,12 22,12Z"/>
</vector>

View File

@@ -1,8 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
android:orientation="vertical">
<org.joinmastodon.android.ui.views.LinkedTextView
android:id="@+id/text"
@@ -16,4 +17,10 @@
android:paddingBottom="8dp"
android:textAppearance="@style/m3_body_large"/>
</FrameLayout>
<ViewStub
android:id="@+id/translation_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout="@layout/footer_text_translation"/>
</LinearLayout>

View File

@@ -0,0 +1,44 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ProgressBar
android:id="@+id/translation_progress"
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center"
style="?android:progressBarStyleSmall"/>
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="16dp"
android:paddingVertical="8dp"
android:clipToPadding="false"
android:baselineAligned="false"
android:gravity="center_vertical">
<TextView
android:id="@+id/translation_info_text"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textAppearance="@style/m3_body_small"
android:textColor="?colorM3Secondary"
tools:text="Translated from Japanese using DeepL.com"/>
<Button
android:id="@+id/translation_show_original"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
style="@style/Widget.Mastodon.M3.Button.Text"
android:paddingHorizontal="8dp"
android:layout_marginEnd="-8dp"
android:text="@string/translation_show_original"/>
</LinearLayout>
</FrameLayout>

View File

@@ -88,6 +88,7 @@
android:paddingRight="16dp"
android:textAppearance="@style/m3_body_large"
android:gravity="center_vertical"
android:textColor="?colorM3OnSurface"
tools:text="\@mastodon.social"/>
</org.joinmastodon.android.ui.views.FloatingHintEditTextLayout>

View File

@@ -84,14 +84,17 @@
android:layout_below="@id/cover"
android:layout_alignParentEnd="true"
android:layout_marginTop="16dp"
android:layout_marginEnd="16dp">
android:layout_marginHorizontal="16dp"
android:paddingStart="120dp">
<org.joinmastodon.android.ui.views.ProgressBarButton
android:id="@+id/profile_action_btn"
style="@style/Widget.Mastodon.M3.Button.Filled"
android:layout_width="156dp"
android:layout_width="wrap_content"
android:layout_height="40dp"
tools:text="Edit Profile" />
style="@style/Widget.Mastodon.M3.Button.Filled"
android:minWidth="156dp"
android:paddingHorizontal="16dp"
tools:text="@string/save_changes" />
<ProgressBar
android:id="@+id/action_progress"

View File

@@ -104,14 +104,32 @@
android:layout_height="0px"
android:layout_weight="1"/>
<Button
android:id="@+id/btn_join_default_server"
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
style="@style/Widget.Mastodon.M3.Button.Filled"
tools:text="@string/join_default_server"/>
android:layout_height="wrap_content">
<org.joinmastodon.android.ui.views.ProgressBarButton
android:id="@+id/btn_join_default_server"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
style="@style/Widget.Mastodon.M3.Button.Filled"
tools:text="@string/join_default_server"/>
<ProgressBar
android:id="@+id/action_progress"
style="?android:progressBarStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:elevation="10dp"
android:indeterminate="true"
android:outlineProvider="none"
android:indeterminateTint="#FFF"
android:visibility="gone" />
</FrameLayout>
<Button
android:id="@+id/btn_get_started"

View File

@@ -0,0 +1,62 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="16dp"
android:paddingBottom="8dp">
<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toStartOf="@id/follow_btn_wrap"
android:layout_marginEnd="8dp"
android:textAppearance="@style/m3_headline_small"
android:textColor="?colorM3OnSurface"
android:maxLines="4"
android:ellipsize="end"
android:minHeight="36dp"
android:gravity="center_vertical"
tools:text="#CatsOfMastodonButLong"/>
<FrameLayout
android:id="@+id/follow_btn_wrap"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignTop="@id/title"
android:layout_alignBottom="@id/title"
android:layout_alignParentEnd="true">
<org.joinmastodon.android.ui.views.ProgressBarButton
android:id="@+id/profile_action_btn"
android:layout_width="wrap_content"
android:layout_height="36dp"
android:layout_gravity="center"
style="@style/Widget.Mastodon.M3.Button.Filled"
android:paddingHorizontal="16dp"
tools:text="@string/button_follow" />
<ProgressBar
android:id="@+id/action_progress"
style="?android:progressBarStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:elevation="10dp"
android:indeterminate="true"
android:outlineProvider="none"
android:visibility="gone" />
</FrameLayout>
<TextView
android:id="@+id/subtitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/title"
android:layout_marginTop="8dp"
android:textAppearance="@style/m3_label_large"
android:textColor="?colorM3OnSurfaceVariant"
tools:text="123 posts"/>
</RelativeLayout>

View File

@@ -12,6 +12,7 @@
android:textAppearance="@style/m3_body_large"
android:paddingStart="56dp"
android:paddingEnd="24dp"
android:textColor="?colorM3OnSurface"
android:text="@string/login_subtitle"/>
<org.joinmastodon.android.ui.views.FloatingHintEditTextLayout

View File

@@ -29,6 +29,7 @@
android:layout_height="wrap_content"
android:layout_gravity="top"
android:textAppearance="@style/m3_body_large"
android:textColor="?colorM3OnSurface"
tools:text="No discrimination, including (but not limited to) racism, sexism, homophobia or transphobia."/>
</LinearLayout>

View File

@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<group android:id="@+id/menu_group1">
<!-- TODO translate -->
<item android:id="@+id/translate" android:title="@string/translate_post"/>
<item android:id="@+id/bookmark" android:title="@string/add_bookmark"/>
<item android:id="@+id/share" android:title="@string/button_share"/>
<item android:id="@+id/open_in_browser" android:title="@string/open_in_browser"/>

View File

@@ -4,11 +4,18 @@
<string name="next">التالي</string>
<string name="loading_instance">جارٍ جلب معلومات الخادم…</string>
<string name="error">خطأ</string>
<string name="not_a_mastodon_instance">لا يبدو أنّ %s كخادم ماستدون.</string>
<string name="ok">حسنًا</string>
<string name="preparing_auth">جَارٍ الإعدَادُ لِلمُصادَقَة…</string>
<string name="finishing_auth">يُنهي المصادقة…</string>
<string name="user_boosted">قام %s بإعادة نشر</string>
<string name="in_reply_to">ردًا على %s</string>
<string name="notifications">الإشعارات</string>
<string name="user_followed_you">%s بَدَأ بِمُتابَعَتِك</string>
<string name="user_sent_follow_request">%s أرسَلَ طَلَبًا لِمُتابَعَتِك</string>
<string name="user_favorited">%s أعجَبه منشورك</string>
<string name="notification_boosted">قام %s بإعادة نشر منشورك</string>
<string name="poll_ended">الاطلاع على نتائج استطلاع الرأي الذي صوّت فيه</string>
<string name="share_toot_title">شارك</string>
<string name="settings">الإعدادات</string>
<string name="publish">انشر</string>
@@ -37,7 +44,8 @@
<string name="profile_about">حَول</string>
<string name="button_follow">تابِع</string>
<string name="button_following">مُتابَع</string>
<string name="edit_profile">حرّر الملف الشخصي</string>
<string name="edit_profile">تعديل الملف الشخصي</string>
<string name="share_user">شارك الصفحة الشخصية</string>
<string name="mute_user">كَتمُ %s</string>
<string name="unmute_user">إلغاء الكَتم عن @%s</string>
<string name="block_user">حَظرُ %s</string>
@@ -117,8 +125,16 @@
<item quantity="many">تبقى %d يومًا</item>
<item quantity="other">تبقى %d يوم</item>
</plurals>
<string name="poll_closed">انتهى</string>
<string name="confirm_mute_title">اكتم الحساب</string>
<plurals name="x_votes">
<item quantity="zero">%,d صوت</item>
<item quantity="one">%,d صوت واحد</item>
<item quantity="two">صوتين</item>
<item quantity="few">%,d أصوات</item>
<item quantity="many">%,d صوتا</item>
<item quantity="other">%,d صوتا</item>
</plurals>
<string name="poll_closed">مغلق</string>
<string name="confirm_mute_title">كتم الحساب</string>
<string name="confirm_mute">أكّد كتم %s</string>
<string name="do_mute">اكتم</string>
<string name="confirm_unmute_title">ارفع الكتم عن الحساب</string>
@@ -135,17 +151,20 @@
<string name="button_blocked">محجوب</string>
<string name="action_vote">صَوّت</string>
<string name="delete">احذف</string>
<string name="confirm_delete_title">احذف المنشور</string>
<string name="confirm_delete">أمتأكد من حذف هذا المنشور؟</string>
<string name="deleting">يحذف…</string>
<string name="notification_channel_audio_player">تشغيل الصوت</string>
<string name="play">شغّل</string>
<string name="pause">ألبث</string>
<string name="log_out">الخروج</string>
<string name="add_account">أضف حساباً</string>
<string name="search_hint">ابحث</string>
<string name="hashtags">وُسُوم</string>
<string name="news">الأخبار</string>
<string name="for_you">لأجلك</string>
<string name="mentions">الذِكر</string>
<string name="all_notifications">كلها</string>
<string name="mentions">الإشارات</string>
<plurals name="x_people_talking">
<item quantity="zero">لا أحد يتحدث</item>
<item quantity="one">شخص واحد يتحدث</item>
@@ -155,11 +174,16 @@
<item quantity="other">%d شخص يتحدثون</item>
</plurals>
<string name="report_title">بلّغ عن %s</string>
<string name="report_choose_reason">ما المُشكِلَةُ فِي هَذَا المَنشُور؟</string>
<string name="report_choose_reason_account">ما المُشكِلَة مَعَ %s؟</string>
<string name="report_choose_reason_subtitle">اختر أفضل تطابق</string>
<string name="report_reason_personal">لا يعجبني</string>
<string name="report_reason_personal_subtitle">ألا ترغب برؤيته</string>
<string name="report_reason_spam">إنه غير مرغوب فيه</string>
<string name="report_reason_spam_subtitle">روابط خبيثة أو تفاعل كاذب أو ردود متكررة</string>
<string name="report_reason_violation">ينتهك قواعد الخادم</string>
<string name="report_reason_violation_subtitle">تعلم أنه ينتهك قواعد محددة</string>
<string name="report_reason_violation_subtitle">أنت مُدرك لانتهاكه قواعد مُحَدَّدَة</string>
<string name="report_reason_other">إنَّهُ شَيءٌ آخَر</string>
<string name="report_reason_other_subtitle">لا تندرج هذه المشكلة ضمن فئات أخرى</string>
<string name="report_choose_rule">ما هي القواعد المنتهكة؟</string>
<string name="report_choose_rule_subtitle">اختر كل ما ينطبق</string>
@@ -168,8 +192,14 @@
<string name="report_comment_title">هل لديك شيء آخر لتخبرنا به؟</string>
<string name="report_comment_hint">تعليقات إضافية</string>
<string name="sending_report">يرسل البلاغ…</string>
<string name="report_sent_title">شُكرًا لَكَ على الإبلاغ، سَوفَ نتحرى عن الأمر.</string>
<string name="report_sent_subtitle">في أثناء مراجعتنا للبلاغ، يمكنك اتخاذ إجراء ضد %s:</string>
<string name="unfollow_user">ألغ متابعة %s</string>
<string name="unfollow">ألغ المتابعة</string>
<string name="mute_user_explain">لن ترى مشاركاتهم. لكن لا يزال بإمكانهم متابعتك ورؤية مشاركاتك ولن يعرفوا أنه تم كتم صوتها.</string>
<string name="block_user_explain">لن ترى مشاركاتهم. ولن يتمكنوا من رؤية مشاركاتك أو متابعتك. سيكونون قادرين على معرفة أنهم محظورون.</string>
<string name="report_personal_title">لا تريد أن ترى هذا؟</string>
<string name="report_personal_subtitle">فيما يلي خياراتك للتحكم بما يُعرَض عليك في ماستدون:</string>
<string name="back">العودة</string>
<string name="search_communities">اسم الخادم أو عنوان URL</string>
<string name="instance_rules_title">قواعد الخادم</string>
@@ -196,23 +226,39 @@
<string name="category_tech">تقني</string>
<string name="confirm_email_title">تحقق من صندوق الوارد الخاص بك</string>
<!-- %s is the email address -->
<string name="confirm_email_subtitle">اضغط على الرابط الذي أرسلناه إليك للتحقق من %s. سننتظر هنا.</string>
<string name="confirm_email_didnt_get">ألم تحصل على رابط؟</string>
<string name="resend">أعد الإرسال</string>
<string name="open_email_app">افتح تطبيق البريد الإلكتروني</string>
<string name="resent_email">أُرسلت رسالة التأكيد</string>
<string name="compose_hint">عَبِّر عَمَّ يَجُولُ فِي ذِهنِك</string>
<string name="content_warning">تحذير من المحتوى</string>
<string name="save">احفظ</string>
<string name="add_alt_text">أضف نصًا بديلًا</string>
<string name="visibility_public">علني</string>
<string name="visibility_followers_only">للمُتابِعينَ فقط</string>
<string name="visibility_private">للمشار إليهم فقط</string>
<string name="recent_searches">الحديثة</string>
<string name="skip">تخطى</string>
<string name="notification_type_follow">متابعُون جُدُد</string>
<string name="notification_type_favorite">المفضلة</string>
<string name="notification_type_mention">الذِكر</string>
<string name="notification_type_reblog">المعاد نشرها</string>
<string name="notification_type_mention">الإشارات</string>
<string name="notification_type_poll">استطلاع رأي</string>
<string name="choose_account">اختر حسابًا</string>
<string name="err_not_logged_in">يرجى تسجيل الدخول إلى حساب ماستدون أولًا</string>
<plurals name="cant_add_more_than_x_attachments">
<item quantity="zero">لا يمكن إرفاق أكثر من ملف واحد</item>
<item quantity="one">لا يمكن إرفاق أكثر من ملف واحد</item>
<item quantity="two">لا يمكنك إرفاق أكثر من %d ملفين</item>
<item quantity="few">لا يمكن إرفاق أكثر من %d ملفات</item>
<item quantity="many">لا يمكن إرفاق أكثر من %d ملفات</item>
<item quantity="other">لا يمكن إرفاق أكثر من %d ملف</item>
</plurals>
<string name="media_attachment_unsupported_type">نوع الملف %s غير مدعوم</string>
<string name="media_attachment_too_big">الملف %1$s يتجاوز حدّ %2$s مب</string>
<string name="settings_theme">المظهر</string>
<string name="theme_auto">استخدام مظهر الجهاز</string>
<string name="theme_light">فاتح</string>
<string name="theme_dark">داكن</string>
<string name="settings_behavior">السلوك</string>
@@ -225,9 +271,13 @@
<string name="settings_clear_cache">امسح التخزين المؤقت للوسائط</string>
<string name="settings_app_version">تطبيق ماستدون لأندرويد نسخة %1$s (%2$d)</string>
<string name="media_cache_cleared">مُسح التخزين المؤقت للوسائط</string>
<string name="confirm_log_out">تسجيل الخروج من %s؟</string>
<string name="sensitive_content_explain">وصف المؤلف هذه الوسائط بأنها حساسة.</string>
<string name="avatar_description">انتقل إلى الصفحة الشخصية لـ %s</string>
<string name="more_options">مزيد من الخيارات</string>
<string name="new_post">منشور جديد</string>
<string name="button_reply">ردّ</string>
<string name="button_reblog">إعادة النشر</string>
<string name="button_favorite">فضّل</string>
<string name="button_share">شارك</string>
<string name="media_no_description">وسائط بدون وصف</string>
@@ -239,7 +289,11 @@
<string name="media_viewer">عارض الوسائط</string>
<string name="follow_user">تابع %s</string>
<string name="unfollowed_user">ألغ متابعة %s</string>
<string name="followed_user">أنت تتابع الآن %s</string>
<string name="following_user_requested">طَلَبَ %s مُتابَعتك</string>
<string name="open_in_browser">افتح في المتصفح</string>
<string name="hide_boosts_from_user">أخفِ المعاد نشرها مِن %s</string>
<string name="show_boosts_from_user">أظهر ما أعاد %s نشرَه</string>
<string name="signup_reason">لماذا تريد الانضمام؟</string>
<string name="signup_reason_note">هذا سوف يساعدنا في مراجعة تطبيقك.</string>
<string name="clear">امسح</string>
@@ -253,7 +307,13 @@
<string name="error_saving_file">خطأ أثناء حفظ الملف</string>
<string name="file_saved">حُفظ الملف</string>
<string name="downloading">ينزّل…</string>
<string name="no_app_to_handle_action">لا يوجد تطبيق لمعالجة هذا الإجراء</string>
<string name="local_timeline">المحلي</string>
<string name="trending_posts_info_banner">هذه هي المشاركات التي تكتسب شعبية عبر ماستدون.</string>
<string name="trending_links_info_banner">هذه هي القصص الإخبارية التي يُتحدّث عنها على ماستدون.</string>
<!-- %s is the server domain -->
<string name="local_timeline_info_banner">هذه هي جميع المشاركات من جميع المستخدمين في الخادم الخاص بك (%s).</string>
<string name="recommended_accounts_info_banner">قد تعجبك هذه الحسابات استنادا إلى حسابات أخرى تتابعها.</string>
<string name="see_new_posts">استعرض المنشورات الجديدة</string>
<string name="load_missing_posts">حمّل المَنشورات المَفقودَة</string>
<string name="follow_back">رُدّ المتابعة</string>
@@ -285,6 +345,14 @@
<item quantity="many">%,d تفضيلًا</item>
<item quantity="other">%,d تفضيل</item>
</plurals>
<plurals name="x_reblogs">
<item quantity="zero">لم يُعد نشره</item>
<item quantity="one">إعادة نشر واحدة</item>
<item quantity="two">أعيد نشره مرّتان</item>
<item quantity="few">أعيد نشره %,d مرات</item>
<item quantity="many">أعيد نشره %,d مرات</item>
<item quantity="other">أعيد نشره %,d مرات</item>
</plurals>
<string name="timestamp_via_app">%1$s عبر %2$s</string>
<string name="time_now">الآن</string>
<string name="edit_history">تاريخ التعديل</string>
@@ -294,7 +362,7 @@
<item quantity="zero">منذ %d ثانية</item>
<item quantity="one">منذ ثانية</item>
<item quantity="two">منذ ثانيتان</item>
<item quantity="few">%d ثواني</item>
<item quantity="few">%d ثوانٍ</item>
<item quantity="many">منذ %d ثانية</item>
<item quantity="other">%d ثواني مضت</item>
</plurals>
@@ -347,6 +415,7 @@
<string name="login_title">مرحبا بك مجددًا</string>
<string name="login_subtitle">قم بتسجيل الدخول باستخدام الخادم حيث قمتَ بإنشاء حسابك فيه.</string>
<string name="server_url">رابط الخادم</string>
<string name="signup_random_server_explain">سوف نختار خادماً بناءً على لغتك إذا قمت بالمتابعة دون إجراء إختيار.</string>
<string name="server_filter_any_language">أي لغة</string>
<string name="server_filter_instant_signup">تسجيل فوري</string>
<string name="server_filter_manual_review">مراجعة يدوية</string>
@@ -359,6 +428,7 @@
<string name="server_filter_region_oceania">أوقيانوسيا</string>
<string name="not_accepting_new_members">لا يقبل استقبال أعضاء جدد</string>
<string name="category_special_interests">المصالح الخاصة</string>
<string name="signup_passwords_dont_match">كلمات المرور غير متطابقة</string>
<string name="pick_server_for_me">اختر لي</string>
<string name="profile_add_row">إضافة صف</string>
<string name="profile_setup">إعداد الملف الشخصي</string>
@@ -367,21 +437,279 @@
<string name="popular_on_mastodon">مشهور على ماستدون</string>
<string name="follow_all">اتبع الكل</string>
<string name="server_rules_disagree">لا أوافق</string>
<string name="privacy_policy_explanation">بالمختصر: نحن لا نجمع أو نعالج أي شيء.</string>
<!-- %s is server domain -->
<string name="server_policy_disagree">لا أوافق %s</string>
<string name="profile_bio">نبذة عنك</string>
<!-- Shown in a progress dialog when you tap "follow all" -->
<string name="sending_follows">متابعة المستخدمين…</string>
<!-- %1$s is server domain, %2$s is email domain. You can reorder these placeholders to fit your language better. -->
<string name="signup_email_domain_blocked">%1$s لا يسمح بالاشتراكات من %2$s. جرب خادما واحدا أو &lt;a&gt;اختر خادما مختلفا&lt;/a&gt;.</string>
<string name="spoiler_show">إظهاره على أي حال</string>
<string name="spoiler_hide">إعادة الإخفاء</string>
<string name="poll_multiple_choice">اختر واحدا أو أكثر</string>
<string name="save_changes">حفظ التغييرات</string>
<string name="profile_featured">المميزة</string>
<string name="profile_timeline">الخيط</string>
<string name="view_all">عرض الكل</string>
<string name="profile_endorsed_accounts">الحسابات</string>
<string name="verified_link">رابط متحقق منه</string>
<string name="show">إظهار</string>
<string name="hide">إخفاء</string>
<string name="join_default_server">الانضمام إلى %s</string>
<string name="pick_server">اختر خادما آخر</string>
<string name="signup_or_login">أو</string>
<string name="learn_more">تعلم المزيد</string>
<string name="welcome_to_mastodon">أهلًا بك على ماستدون</string>
<string name="welcome_paragraph1">ماستدون شبكة اجتماعية لامركزية، بمعنى أنه ليس هناك شركة واحدة تتحكم فيها. وهي تتألف من العديد من الخوادم التي تدار بشكل مستقل، وجميعها متصلة معا.</string>
<string name="what_are_servers">ما هي الخوادم؟</string>
<string name="welcome_paragraph2">تتم استضافة كل حساب ماستدون على خادم - ولكل خادم قيمه وقواعده ومسؤوليه الخاصين. مهما اخترت أي خادم، يمكنك متابعة الأشخاص والتفاعل معهم على أي خادم آخر.</string>
<string name="opening_link">رابط الافتتاح…</string>
<string name="link_not_supported">هذا الرابط غير مدعوم في التطبيق</string>
<string name="log_out_all_accounts">تسجيل الخروج من جميع الحسابات</string>
<string name="confirm_log_out_all_accounts">أتريد تسجيل الخروج من جميع الحسابات؟</string>
<string name="retry">حاول مجددًا</string>
<string name="post_failed">أخفق في الإرسال</string>
<!-- %s is formatted file size ("467 KB image") -->
<string name="attachment_description_image">صورة %s</string>
<string name="attachment_description_video">فيديو %s</string>
<string name="attachment_description_audio">مقطع صوتي %s</string>
<string name="attachment_description_unknown">ملف %s</string>
<string name="attachment_type_image">صورة</string>
<string name="attachment_type_video">فيديو</string>
<string name="attachment_type_audio">مقطع صوتي</string>
<string name="attachment_type_gif">GIF</string>
<string name="attachment_type_unknown">ملف</string>
<string name="attachment_x_percent_uploaded">%d%% تم الرفع</string>
<string name="add_poll_option">إضافة خيار للاستطلاع</string>
<string name="poll_length">مدة الاستطلاع</string>
<string name="poll_style">النوع</string>
<string name="compose_poll_single_choice">اختر واحدا</string>
<string name="compose_poll_multiple_choice">خيارات متعددة</string>
<string name="delete_poll_option">حذف خيار من الاستطلاع</string>
<string name="poll_style_title">نمط الاستطلاع</string>
<string name="alt_text">نص بديل</string>
<string name="help">المساعدة</string>
<string name="what_is_alt_text">ما هو النص البديل؟</string>
<string name="alt_text_help">يوفر النص البديل أوصافا للصور للأشخاص الذين يعانون من إعاقات بصرية أو اتصالات ذات نطاق ترددي منخفض أو أولئك الذين يبحثون عن سياق إضافي.\n\nيمكنك تحسين إمكانية الوصول والفهم للجميع من خلال كتابة نص بديل واضح وموجز وموضوعي.\n\n التقاط العناصر المهمة\n<ul><li>تلخيص النص في الصور</li>\n<li>استخدام بنية الجملة العادية</li>\n<li>تجنب المعلومات الزائدة</li>\n<li>التركيز على الاتجاهات والنتائج الرئيسية في العناصر المرئية المعقدة (مثل الرسوم البيانية أو الخرائط)</li><li></li></ul></string>
<string name="edit_post">تعديل المنشور</string>
<string name="no_verified_link">لم يتم التحقق من الرابط</string>
<string name="compose_autocomplete_emoji_empty">تصفح الرموز التعبيرية</string>
<string name="compose_autocomplete_users_empty">العثور على الأشخاص الذين تبحث عنهم</string>
<string name="no_search_results">تعذر العثور على أي نتائج لمصطلحات البحث هذه</string>
<string name="language">اللغة</string>
<string name="language_default">الافتراضية</string>
<string name="language_system">النظام</string>
<string name="language_detecting">اكتشاف اللغة</string>
<string name="language_cant_detect">تعذر اكتشاف اللغة</string>
<string name="language_detected">الكشف عن</string>
<string name="media_hidden">وسائط مخفية</string>
<string name="post_hidden">منشور مخفي</string>
<string name="report_title_post">الإبلاغ عن المنشور</string>
<string name="forward_report_explanation">الحساب من خادم آخر. هل تودّ إرسال نسخة مجهولة المصدر من هذا التقرير هناك أيضا؟</string>
<!-- %s is the server domain -->
<string name="forward_report_to_server">تحويله إلى %s</string>
<!-- Shown on the "stamp" on the screen that appears after you report a post/user. Please keep the translation short, preferably a single word -->
<string name="reported">تم الإبلاغ عنه</string>
<string name="report_unfollow_explanation">لعدم رؤية مشاركاتهم في خلاصة ملخصك بعد الآن، ألغِ متابعتهم.</string>
<string name="muted_user">كتم %s</string>
<string name="report_sent_already_blocked">لقد حظرت هذا المستخدم من قبل، لذلك لا يوجد شيء آخر عليك القيام به خلال مراجعة بلاغك.</string>
<string name="report_personal_already_blocked">لقد قمت بالفعل بحظر هذا المستخدم، لذلك لا يوجد شيء آخر عليك القيام به.\n\nشكرا للمساعدة في الحفاظ على ماستدون مكانا آمنا للجميع!</string>
<string name="blocked_user">حظر %s</string>
<string name="mark_all_notifications_read">اعتبار الكل كمقروء</string>
<string name="settings_display">الشاشة</string>
<string name="settings_filters">عوامل التصفية</string>
<string name="settings_server_explanation">نظرة عامة وقواعد ومشرفين</string>
<!-- %s is the app name (Mastodon, key app_name). I made it a placeholder so everything Just Works™ with forks -->
<string name="about_app">عن %s</string>
<string name="default_post_language">اللغة الافتراضية للمنشور</string>
<string name="settings_alt_text_reminders">إضافة تذكير بالنصوص البديلة</string>
<string name="settings_confirm_unfollow">السؤال قبل إلغاء متابعة شخص ما</string>
<string name="settings_confirm_boost">اسأل قبل إعادة النشر</string>
<string name="settings_confirm_delete_post">السؤال قبل حذف المشاركات</string>
<string name="pause_all_notifications">إيقاف الكل</string>
<string name="pause_notifications_off">إيقاف</string>
<string name="notifications_policy_anyone">أيا كان</string>
<string name="notifications_policy_followed">الأشخاص الذين تتابعهم</string>
<string name="notifications_policy_follower">الأشخاص الذين تتابعهم</string>
<string name="notifications_policy_no_one">لا أحد</string>
<string name="settings_notifications_policy">تلقي الإشعارات من</string>
<string name="notification_type_mentions_and_replies">الإشارات والردود</string>
<string name="pause_all_notifications_title">إيقاف جميع الإشعارات مؤقتًا</string>
<plurals name="x_weeks">
<item quantity="zero">%d أسبوع</item>
<item quantity="one">أسبوع واحد</item>
<item quantity="two">أسبوعان</item>
<item quantity="few">%d أسابيع</item>
<item quantity="many">%d أسبوعًا</item>
<item quantity="other">%d أسابيع</item>
</plurals>
<!-- %1$s is the date (may be relative, e.g. "today" or "yesterday"), %2$s is the time. You can reorder these placeholders if that works better for your language -->
<string name="date_at_time">%1$s في %2$s</string>
<string name="today">اليوم</string>
<string name="yesterday">أمس</string>
<string name="tomorrow">غدًا</string>
<!-- %s is the timestamp ("tomorrow at 12:34") -->
<string name="pause_notifications_ends">ينتهي %s</string>
<!-- %s is the timestamp ("tomorrow at 12:34") -->
<string name="pause_notifications_banner">سيتم استئناف الإشعارات %s.</string>
<string name="resume_notifications_now">استأنف الآن</string>
<string name="open_system_notification_settings">الانتقال إلى إعدادات الإشعارات</string>
<string name="about_server">عن</string>
<string name="server_rules">القواعد</string>
<string name="server_administrator">المدير</string>
<string name="send_email_to_server_admin">للاتصال بالمدير</string>
<string name="notifications_disabled_in_system">شغل الإشعارات من إعدادات جهازك لرؤية التحديثات من أي مكان.</string>
<string name="settings_even_more">المزيد من الإعدادات</string>
<string name="settings_show_cws">إظهار تحذيرات المحتوى</string>
<string name="settings_hide_sensitive_media">فلرتة الوسائط التي تم وضع علامة عليها على أنها حساسة</string>
<string name="settings_show_interaction_counts">عدد التفاعل مع المنشورات</string>
<string name="settings_show_emoji_in_names">رموز تعبيرية مخصصة في أسماء العرض</string>
<plurals name="in_x_seconds">
<item quantity="zero">في %d ثانية</item>
<item quantity="one">في ثانية واحدة</item>
<item quantity="two">في ثانيتين</item>
<item quantity="few">في %d ثوانٍ</item>
<item quantity="many">في %d ثانية</item>
<item quantity="other">في %d ثوان</item>
</plurals>
<plurals name="in_x_minutes">
<item quantity="zero">في %d دقيقة</item>
<item quantity="one">في دقيقة واحدة</item>
<item quantity="two">في دقيقتين</item>
<item quantity="few">في %d دقائق</item>
<item quantity="many">في %d دقيقة</item>
<item quantity="other">في %d دقائق</item>
</plurals>
<plurals name="in_x_hours">
<item quantity="zero">في %d ساعة</item>
<item quantity="one">خلال ساعة واحدة</item>
<item quantity="two">خلال ساعتان</item>
<item quantity="few">خلال %d ساعات</item>
<item quantity="many">خلال %d ساعة</item>
<item quantity="other">خلال %d ساعات</item>
</plurals>
<plurals name="x_hours_ago">
<item quantity="zero">منذ %d ساعات</item>
<item quantity="one">منذ ساعة واحدة</item>
<item quantity="two">منذ ساعتان</item>
<item quantity="few">منذ %d ساعات</item>
<item quantity="many">منذ %d ساعة</item>
<item quantity="other">منذ %d ساعات</item>
</plurals>
<string name="alt_text_reminder_title">تفتقد الوسائط إلى نص بديل</string>
<plurals name="alt_text_reminder_x_images">
<item quantity="zero">%s من صورك يفتقر إلى نص بديل. أتردد النشر على أي حال؟</item>
<item quantity="one">%s من صورك يفتقر إلى نص بديل. أتردد النشر على أي حال؟</item>
<item quantity="two">%s من صورك يفتقر إلى نص بديل. أتردد النشر على أي حال؟</item>
<item quantity="few">%s من صورك يفتقر إلى نص بديل. أتردد النشر على أي حال؟</item>
<item quantity="many">%s من صورك يفتقر إلى نص بديل. أتردد النشر على أي حال؟</item>
<item quantity="other">%s من صورك يفتقر إلى نص بديل. أتردد النشر على أي حال؟</item>
</plurals>
<plurals name="alt_text_reminder_x_attachments">
<item quantity="zero">%s من مرفقات الوسائط الخاصة بك يفتقر لنص بديل. نشر على أي حال؟</item>
<item quantity="one">%s من مرفقات الوسائط الخاصة بك يفتقر لنص بديل. نشر على أي حال؟</item>
<item quantity="two">%s من مرفقات الوسائط الخاصة بك يفتقر لنص بديل. نشر على أي حال؟</item>
<item quantity="few">%s من مرفقات الوسائط الخاصة بك يفتقر لنص بديل. نشر على أي حال؟</item>
<item quantity="many">%s من مرفقات الوسائط الخاصة بك يفتقر لنص بديل. نشر على أي حال؟</item>
<item quantity="other">%s من مرفقات الوسائط الخاصة بك يفتقر لنص بديل. نشر على أي حال؟</item>
</plurals>
<string name="count_one">واحد</string>
<string name="count_two">اثنان</string>
<string name="count_three">ثلاثة</string>
<string name="count_four">أربعة</string>
<string name="alt_text_reminder_post_anyway">مَنشور</string>
<!-- %s is the username -->
<string name="unfollow_confirmation">أتريد إلغاء متابعة %s؟</string>
<string name="filter_active">نشِط</string>
<string name="filter_inactive">خامل</string>
<string name="settings_add_filter">إضافة عامل تصفية</string>
<string name="settings_edit_filter">تعديل عامل التصفية</string>
<string name="settings_filter_duration">المدة</string>
<string name="settings_filter_muted_words">الكلمات المحظورة</string>
<string name="settings_filter_context">كتم الصوت من</string>
<string name="settings_filter_show_cw">عرض مع تحذير المحتوى</string>
<string name="settings_filter_show_cw_explanation">الاستمرار في عرض المشاركات التي تطابق هذا الفلتر، ولكن خلف تحذير حول المحتوى</string>
<string name="settings_delete_filter">حذف عامل التصفية</string>
<string name="filter_duration_forever">إلى الأبد</string>
<!-- %s is the timestamp ("tomorrow at 12:34") -->
<string name="settings_filter_ends">ينتهي %s</string>
<plurals name="settings_x_muted_words">
<item quantity="zero">%d كلمة أو عبارة مكتومة</item>
<item quantity="one">%d كلمة أو عبارة مكتومة</item>
<item quantity="two">%d كلمتان أو عبارتان مكتومتان</item>
<item quantity="few">%d كلمة أو عبارة مكتومة</item>
<item quantity="many">%d كلمة أو عبارة مكتومة</item>
<item quantity="other">%d كلمة أو عبارة مكتومة</item>
</plurals>
<string name="selection_2_options">%1$s و %2$s</string>
<string name="selection_3_options">%1$s و %2$s و %3$s</string>
<string name="selection_4_or_more">%1$s, %2$s, و %3$d والمزيد</string>
<string name="filter_context_home_lists">الخيط الزمني الرئيسي والقوائم</string>
<string name="filter_context_notifications">الإشعارات</string>
<string name="filter_context_public_timelines">الخيوط الزمنية العامة</string>
<string name="filter_context_threads_replies">سلاسل المحادثات والردود</string>
<string name="filter_context_profiles">الصفحات التعريفية</string>
<string name="settings_filter_title">العنوان</string>
<string name="settings_delete_filter_title">حذف عامل التصفية \"%s\"؟</string>
<string name="settings_delete_filter_confirmation">سيتم حذف هذا الفلتر من حسابك على جميع الأجهزة.</string>
<string name="add_muted_word">إضافة كلمة مكتومة</string>
<string name="edit_muted_word">تحرير كلمة مكتومة</string>
<string name="add">إضافة</string>
<string name="filter_word_or_phrase">كلمة أو عبارة</string>
<string name="filter_add_word_help">الكلمات غير حساسة لحالة الأحرف وتتطابق مع الكلمات الكاملة فقط.\n\nإذا قمت بتصفية الكلمة الرئيسية \"Apple\" ، فستخفي المشاركات التي تحتوي على \"apple\" أو \"aPpLe\" ولكن ليس \"pineapple.\"</string>
<string name="settings_delete_filter_word">حذف الكلمة \"%s\"؟</string>
<string name="enter_selection_mode">اختر</string>
<string name="select_all">اختيار الكل</string>
<string name="settings_filter_duration_title">مدة التصفية</string>
<string name="filter_duration_custom">مخصص</string>
<plurals name="settings_delete_x_filter_words">
<item quantity="zero">حذف %d كلمات؟</item>
<item quantity="one">حذف كلمة واحدة؟</item>
<item quantity="two">حذف كلمتان؟</item>
<item quantity="few">حذف %d كلمات؟</item>
<item quantity="many">حذف %d كلمة؟</item>
<item quantity="other">حذف %d كلمات؟</item>
</plurals>
<plurals name="x_items_selected">
<item quantity="zero">تم تحديد %d</item>
<item quantity="one">تم تحديد %d</item>
<item quantity="two">%d تم تحديدها</item>
<item quantity="few">%d تم تحديدها</item>
<item quantity="many">%d تم تحديدها</item>
<item quantity="other">%d تم تحديدها</item>
</plurals>
<string name="required_form_field_blank">لا يمكن أن يكون فارغاً</string>
<string name="filter_word_already_in_list">موجود بالفعل في القائمة</string>
<string name="app_update_ready">تحديث التطبيق جاهز</string>
<string name="app_update_version">الإصدار %s</string>
<string name="downloading_update">جارٍ التنزيل (%d%%)</string>
<!-- Shown like a content warning, %s is the name of the filter -->
<string name="post_matches_filter_x">تطابق عامل التصفية \"%s\"</string>
<string name="search_mastodon">البحث في ماستدون</string>
<string name="clear_all">امسح الكل</string>
<string name="search_open_url">فتح الرابط التشعبي في ماستدون</string>
<string name="posts_matching_hashtag">منشورات تحتوي على “%s”</string>
<string name="search_go_to_account">الانتقال إلى %s</string>
<string name="posts_matching_string">منشورات تحتوي على “%s”</string>
<string name="accounts_matching_string">أشخاص لديهم \"%s\"</string>
<!-- Shown in the post header. Please keep it short -->
<string name="time_seconds_ago_short">مُنذُ %dثا</string>
<string name="time_minutes_ago_short">مُنذُ %dد</string>
<string name="time_hours_ago_short">مُنذُ %dسا</string>
<string name="time_days_ago_short">مُنذُ %d أيام</string>
<!-- %s is the name of the post language -->
<string name="translate_post">تُرجِم مِن %s</string>
<!-- %1$s is the language, %2$s is the name of the translation service -->
<string name="post_translated">مُترجَم مِن %1$s باستخدام %2$s</string>
<string name="translation_show_original">إظهار الأصل</string>
<string name="translation_failed">فشِلَت الترجَمة. قد لم يتمكّن مدير الخادم من تفعيل الترجمات على هذا الخادم أو أنّ هذا الخادم يُشغِّل نسخة قديمة من ماستدون حيث الترجمات غير مدعومة بعد.</string>
<plurals name="x_participants">
<item quantity="zero">لا مُشارِك</item>
<item quantity="one">مشارِك واحد</item>
<item quantity="two">مشاركَيْنِ</item>
<item quantity="few">مشاركين</item>
<item quantity="many">مُشارِكًا</item>
<item quantity="other">مُشارك</item>
</plurals>
</resources>

View File

@@ -4,11 +4,17 @@
<string name="next">Далей</string>
<string name="loading_instance">Атрыманне інфармацыі аб серверы…</string>
<string name="error">Памылка</string>
<string name="not_a_mastodon_instance">Здаецца, %s не з\'яўляецца серверам Mastodon.</string>
<string name="ok">Добра</string>
<string name="preparing_auth">Падрыхтоўка да аўтэнтыфікацыі…</string>
<string name="finishing_auth">Завяршэнне аўтэнтыфікацыі…</string>
<string name="user_boosted">%s пашырыў(-ла)</string>
<string name="in_reply_to">У адказ %s</string>
<string name="notifications">Апавяшчэнні</string>
<string name="user_followed_you">%s падпісаўся на вас</string>
<string name="user_sent_follow_request">%s адправіў вам запыт на падпіску</string>
<string name="user_favorited">%s упадабаў ваш допіс</string>
<string name="notification_boosted">%s пашырыў ваш допіс</string>
<string name="share_toot_title">Абагуліць</string>
<string name="settings">Налады</string>
<string name="publish">Апублікаваць</string>
@@ -34,6 +40,7 @@
<string name="button_follow">Падпісацца</string>
<string name="button_following">Вы падпісаны</string>
<string name="edit_profile">Рэдагаваць профіль</string>
<string name="share_user">Падзяліцца профілем</string>
<string name="mute_user">Ігнараваць %s</string>
<string name="unmute_user">Не ігнараваць %s</string>
<string name="block_user">Заблакіраваць %s</string>
@@ -97,6 +104,12 @@
<item quantity="many">%d дзён засталося</item>
<item quantity="other">%d дзён засталося</item>
</plurals>
<plurals name="x_votes">
<item quantity="one">%,d голас</item>
<item quantity="few">%,d галасы</item>
<item quantity="many">%,d галасоў</item>
<item quantity="other">%,d голаса</item>
</plurals>
<string name="poll_closed">Завершана</string>
<string name="confirm_mute_title">Ігнараваць уліковы запіс</string>
<string name="confirm_mute">Ігнараваць %s?</string>
@@ -115,16 +128,19 @@
<string name="button_blocked">Заблакіраваны</string>
<string name="action_vote">Прагаласаваць</string>
<string name="delete">Выдаліць</string>
<string name="confirm_delete_title">Выдаліць допіс</string>
<string name="confirm_delete">Вы ўпэўненыя, што хочаце выдаліць гэты допіс?</string>
<string name="deleting">Выдаленне…</string>
<string name="notification_channel_audio_player">Прайграванне аўдыя</string>
<string name="play">Прайграць</string>
<string name="pause">Прыпыніць</string>
<string name="log_out">Выйсці</string>
<string name="add_account">Дадаць уліковы запіс</string>
<string name="search_hint">Пошук</string>
<string name="hashtags">Хэштэгі</string>
<string name="news">Навіны</string>
<string name="for_you">Для вас</string>
<string name="all_notifications">Усе</string>
<string name="mentions">Згадванні</string>
<plurals name="x_people_talking">
<item quantity="one">%d чалавек размаўляе</item>
@@ -133,11 +149,16 @@
<item quantity="other">%d чалавек размаўляе</item>
</plurals>
<string name="report_title">Паскардзіцца на %s</string>
<string name="report_choose_reason">Што не так з гэтым допісам?</string>
<string name="report_choose_reason_account">Што не так з %s?</string>
<string name="report_choose_reason_subtitle">Выберыце найлепшы варыянт</string>
<string name="report_reason_personal">Мне не падабаецца</string>
<string name="report_reason_personal_subtitle">Гэта не тое, што вы хочаце бачыць</string>
<string name="report_reason_spam">Гэта спам</string>
<string name="report_reason_spam_subtitle">Шкодныя спасылкі, фальшывыя ўзаемадзеянні або адказы, што паўтараюцца</string>
<string name="report_reason_violation">Гэта парушае правілы сервера</string>
<string name="report_reason_violation_subtitle">Вам вядома, што гэта парушае пэўныя правілы</string>
<string name="report_reason_other">Гэта нешта іншае</string>
<string name="report_reason_other_subtitle">Гэта праблема не падпадае ні пад адну з катэгорыі</string>
<string name="report_choose_rule">Якія правілы былі парушаны?</string>
<string name="report_choose_rule_subtitle">Абярыце ўсе варыянты, што падыходзяць</string>
@@ -146,8 +167,14 @@
<string name="report_comment_title">Што-небудзь яшчэ, што мы павінны ведаць?</string>
<string name="report_comment_hint">Дадатковыя каментарыі</string>
<string name="sending_report">Адпраўка скаргі…</string>
<string name="report_sent_title">Дзякуй за вашу скаргу, мы яе разгледзім.</string>
<string name="report_sent_subtitle">Пакуль мы разглядаем яе, вы можаце прыняць меры супраць %s:</string>
<string name="unfollow_user">Адпісацца ад %s</string>
<string name="unfollow">Адпісацца</string>
<string name="mute_user_explain">Вы не будзеце бачыць допісы гэтага карыстальніка. Ён усё яшчэ зможа сачыць за вамі і бачыць вашы допісы, не ведаючы, што яго ігнаруюць.</string>
<string name="block_user_explain">Вы перастанеце бачыць допісы гэтага карыстальніка. Ён не зможа сачыць за вамі і бачыць вашы допісы. Ён зможа зразумець, што яго заблакіравалі.</string>
<string name="report_personal_title">Не хочаце бачыць гэта?</string>
<string name="report_personal_subtitle">Вось вашыя варыянты кантролю над тым, што вы бачыце в Mastodon:</string>
<string name="back">Назад</string>
<string name="search_communities">Назва сервера або URL</string>
<string name="instance_rules_title">Правілы сервера</string>
@@ -174,23 +201,30 @@
<string name="category_tech">Тэхналогіі</string>
<string name="confirm_email_title">Праверце паштовую скрыню</string>
<!-- %s is the email address -->
<string name="confirm_email_subtitle">Націсніце на спасылку, якую мы адправілі, каб спраўдзіць %s. Мы вас пачакаем тут.</string>
<string name="confirm_email_didnt_get">Не атрымалі спасылку?</string>
<string name="resend">Адправіць паўторна</string>
<string name="open_email_app">Адкрыць праграму для пошты</string>
<string name="resent_email">Электронны ліст з пацвярджэннем адпраўлены</string>
<string name="compose_hint">Напішыце тое, аб чым думаеце</string>
<string name="content_warning">Папярэджанне аб змесціве</string>
<string name="save">Захаваць</string>
<string name="add_alt_text">Дадаць альтэрнатыўны тэкст</string>
<string name="visibility_public">Публічны</string>
<string name="visibility_followers_only">Толькі для падпісчыкаў</string>
<string name="visibility_private">Толькі людзі, якіх згадалі</string>
<string name="recent_searches">Нядаўняе</string>
<string name="skip">Прапусціць</string>
<string name="notification_type_follow">Новыя падпісчыкі</string>
<string name="notification_type_favorite">Абраныя</string>
<string name="notification_type_reblog">Пашырэнні</string>
<string name="notification_type_mention">Згадванні</string>
<string name="notification_type_poll">Апытанні</string>
<string name="choose_account">Выберыце ўліковы запіс</string>
<string name="err_not_logged_in">Спачатку ўвайдзіце ў Mastodon</string>
<string name="media_attachment_unsupported_type">Тып файла %s не падтрымліваецца</string>
<string name="media_attachment_too_big">Памер файла %1$s перавышае абмежаванне ў %2$s МБ</string>
<string name="settings_theme">Знешні выгляд</string>
<string name="theme_light">Светлая</string>
<string name="theme_dark">Цёмная</string>
<string name="settings_behavior">Паводзіны</string>
@@ -203,9 +237,11 @@
<string name="settings_clear_cache">Ачысціць кэш медыя</string>
<string name="settings_app_version">Mastodon для Android v%1$s (%2$d)</string>
<string name="media_cache_cleared">Кэш медыя ачышчаны</string>
<string name="avatar_description">Перайсці да профілю %s</string>
<string name="more_options">Больш опцый</string>
<string name="new_post">Новы допіс</string>
<string name="button_reply">Адказаць</string>
<string name="button_reblog">Пашырыць</string>
<string name="button_favorite">Абранае</string>
<string name="button_share">Абагуліць</string>
<string name="media_no_description">Медыя без апісання</string>
@@ -217,8 +253,11 @@
<string name="media_viewer">Праграма для прагляду медыя</string>
<string name="follow_user">Падпісацца на %s</string>
<string name="unfollowed_user">Адпісацца ад %s</string>
<string name="followed_user">Цяпер вы падпісаны на %s</string>
<string name="following_user_requested">Запытана падпісацца на %s</string>
<string name="open_in_browser">Адкрыць у браўзеры</string>
<string name="hide_boosts_from_user">Схаваць пашырэнні ад %s</string>
<string name="show_boosts_from_user">Паказаць пашырэнні ад @%s</string>
<string name="signup_reason">Чаму вы хочаце далучыцца?</string>
<string name="signup_reason_note">Гэта дапаможа нам разгледзець вашу заяўку.</string>
<string name="clear">Ачысціць</string>
@@ -232,6 +271,7 @@
<string name="error_saving_file">Памылка пры захаванні файла</string>
<string name="file_saved">Файл захаваны</string>
<string name="downloading">Спампоўванне…</string>
<string name="local_timeline">Лакальнае</string>
<!-- %s is the server domain -->
<string name="see_new_posts">Паказаць новыя допісы</string>
<string name="load_missing_posts">Загрузіць адсутныя допісы</string>
@@ -258,6 +298,12 @@
<item quantity="many">%,d абраных</item>
<item quantity="other">%,d абраных</item>
</plurals>
<plurals name="x_reblogs">
<item quantity="one">%,d пашырэнне</item>
<item quantity="few">%,d пашырэнні</item>
<item quantity="many">%,d пашырэнняў</item>
<item quantity="other">%,d пашырэння</item>
</plurals>
<string name="timestamp_via_app">%1$s праз %2$s</string>
<string name="time_now">толькі што</string>
<string name="edit_history">Гісторыя рэдагавання</string>
@@ -328,6 +374,7 @@
<string name="server_filter_region_oceania">Акіянія</string>
<string name="not_accepting_new_members">Не прымае новых удзельнікаў</string>
<string name="category_special_interests">Асаблівыя інтарэсы</string>
<string name="signup_passwords_dont_match">Паролі не супадаюць</string>
<string name="pick_server_for_me">Падбяры для мяне</string>
<string name="profile_add_row">Дадаць радок</string>
<string name="profile_setup">Налады профілю</string>
@@ -336,21 +383,150 @@
<string name="popular_on_mastodon">Папулярна на Mastodon</string>
<string name="follow_all">Падпісацца на ўсіх</string>
<string name="server_rules_disagree">Не згодны</string>
<string name="privacy_policy_explanation">Мы нічога не збіраем і не апрацоўваем.</string>
<!-- %s is server domain -->
<string name="server_policy_disagree">Не згодны з %s</string>
<string name="profile_bio">Пра мяне</string>
<!-- Shown in a progress dialog when you tap "follow all" -->
<string name="sending_follows">Падпісваемся…</string>
<!-- %1$s is server domain, %2$s is email domain. You can reorder these placeholders to fit your language better. -->
<string name="spoiler_show">Усё адно паказаць</string>
<string name="save_changes">Захаваць змены</string>
<string name="profile_featured">Рэкамендаванае</string>
<string name="view_all">Праглядзець усё</string>
<string name="profile_endorsed_accounts">Уліковыя запісы</string>
<string name="show">Паказаць</string>
<string name="hide">Схаваць</string>
<string name="join_default_server">Далучыцца да %s</string>
<string name="pick_server">Выбраць іншы сервер</string>
<string name="signup_or_login">або</string>
<string name="learn_more">Даведацца больш</string>
<string name="welcome_to_mastodon">Вітаем у Mastodon</string>
<string name="welcome_paragraph1">Mastodon - гэта дэцэнтралізаваная сацыяльная сетка, што азначае, што ні адна кампанія не кантралюе яе. Яна складаецца з мноства незалежна працуючых сервераў, злучаных разам.</string>
<string name="what_are_servers">Што такое серверы?</string>
<string name="retry">Паўтарыць</string>
<!-- %s is formatted file size ("467 KB image") -->
<string name="attachment_type_video">Відэа</string>
<string name="attachment_type_gif">GIF</string>
<string name="attachment_type_unknown">Файл</string>
<string name="poll_style">Стыль</string>
<string name="help">Даведка</string>
<string name="edit_post">Рэдагаваць допіс</string>
<string name="no_verified_link">Няма спраўджанай спасылкі</string>
<string name="language">Мова</string>
<string name="language_default">Перадвызначана</string>
<string name="language_system">Сістэма</string>
<string name="media_hidden">Медыя схавана</string>
<string name="post_hidden">Допіс схаваны</string>
<string name="report_title_post">Паскардзіцца на допіс</string>
<!-- %s is the server domain -->
<!-- Shown on the "stamp" on the screen that appears after you report a post/user. Please keep the translation short, preferably a single word -->
<string name="settings_display">Адлюстраванне</string>
<string name="settings_filters">Фільтры</string>
<!-- %s is the app name (Mastodon, key app_name). I made it a placeholder so everything Just Works™ with forks -->
<string name="about_app">Аб %s</string>
<string name="settings_confirm_boost">Пытаць перад пашырэннем</string>
<string name="pause_all_notifications">Прыпыніць усе</string>
<string name="notifications_policy_anyone">Кожны</string>
<string name="notifications_policy_no_one">Ніхто</string>
<string name="settings_notifications_policy">Атрымліваць апавяшчэнні ад</string>
<string name="notification_type_mentions_and_replies">Згадванні і адказы</string>
<string name="pause_all_notifications_title">Прыпыніць усе апавяшчэнні</string>
<plurals name="x_weeks">
<item quantity="one">%d тыдзень</item>
<item quantity="few">%d тыдні</item>
<item quantity="many">%d тыдняў</item>
<item quantity="other">%d тыдні</item>
</plurals>
<!-- %1$s is the date (may be relative, e.g. "today" or "yesterday"), %2$s is the time. You can reorder these placeholders if that works better for your language -->
<string name="date_at_time">%1$s а %2$s</string>
<string name="today">сёння</string>
<string name="yesterday">учора</string>
<string name="tomorrow">заўтра</string>
<!-- %s is the timestamp ("tomorrow at 12:34") -->
<string name="pause_notifications_ends">Скончыцца %s</string>
<!-- %s is the timestamp ("tomorrow at 12:34") -->
<string name="about_server">Пра сервер</string>
<string name="server_rules">Правілы</string>
<string name="server_administrator">Адміністратар</string>
<plurals name="in_x_seconds">
<item quantity="one">праз %d секунду</item>
<item quantity="few">праз %d секунды</item>
<item quantity="many">праз %d секунд</item>
<item quantity="other">праз %d секунды</item>
</plurals>
<plurals name="in_x_minutes">
<item quantity="one">праз %d хвіліну</item>
<item quantity="few">праз %d хвіліны</item>
<item quantity="many">праз %d хвілін</item>
<item quantity="other">праз %d хвіліны</item>
</plurals>
<plurals name="in_x_hours">
<item quantity="one">праз %d гадзіну</item>
<item quantity="few">праз %d гадзіны</item>
<item quantity="many">праз %d гадзін</item>
<item quantity="other">праз %d гадзіны</item>
</plurals>
<plurals name="x_hours_ago">
<item quantity="one">%d гадзіна таму</item>
<item quantity="few">%d гадзіны таму</item>
<item quantity="many">%d гадзін таму</item>
<item quantity="other">%d гадзіны таму</item>
</plurals>
<string name="count_one">Адзін</string>
<string name="count_two">Два</string>
<string name="count_three">Тры</string>
<string name="count_four">Чатыры</string>
<string name="alt_text_reminder_post_anyway">Допіс</string>
<!-- %s is the username -->
<string name="filter_active">Актыўны</string>
<string name="filter_inactive">Неактыўны</string>
<string name="settings_add_filter">Дадаць фільтр</string>
<string name="settings_edit_filter">Рэдагаваць фільтр</string>
<string name="settings_filter_duration">Працягласць</string>
<string name="settings_filter_muted_words">Ігнараваныя словы</string>
<string name="settings_delete_filter">Выдаліць фільтр</string>
<string name="filter_duration_forever">Назаўсёды</string>
<!-- %s is the timestamp ("tomorrow at 12:34") -->
<string name="settings_filter_ends">Скончыцца %s</string>
<string name="selection_2_options">%1$s і %2$s</string>
<string name="selection_3_options">%1$s, %2$s і %3$s</string>
<string name="filter_context_notifications">Апавяшчэнні</string>
<string name="filter_context_public_timelines">Публічныя стужкі</string>
<string name="filter_context_profiles">Профілі</string>
<string name="settings_filter_title">Загаловак</string>
<string name="settings_delete_filter_title">Выдаліць фільтр \"%s\"?</string>
<string name="add">Дадаць</string>
<string name="filter_word_or_phrase">Слова або фраза</string>
<string name="settings_delete_filter_word">Выдаліць слова \"%s\"?</string>
<string name="enter_selection_mode">Выбраць</string>
<string name="select_all">Выбраць усё</string>
<string name="settings_filter_duration_title">Працягласць фільтра</string>
<plurals name="settings_delete_x_filter_words">
<item quantity="one">Выдаліць %d слова?</item>
<item quantity="few">Выдаліць %d словы?</item>
<item quantity="many">Выдаліць %d словаў?</item>
<item quantity="other">Выдаліць %d слова?</item>
</plurals>
<string name="required_form_field_blank">Не можа быць пустым</string>
<string name="filter_word_already_in_list">Ужо ў спісе</string>
<string name="app_update_ready">Абнаўленне праграмы гатова</string>
<string name="app_update_version">Версія %s</string>
<string name="downloading_update">Спампаванне (%d%%)</string>
<!-- Shown like a content warning, %s is the name of the filter -->
<string name="post_matches_filter_x">Адпавядае фільтру \"%s\"</string>
<string name="search_mastodon">Пошук у Mastodon</string>
<string name="clear_all">Ачысціць усё</string>
<string name="search_open_url">Адкрыць спасылку ў Mastodon</string>
<string name="posts_matching_hashtag">Допісы з “%s“</string>
<string name="search_go_to_account">Перайсці да %s</string>
<string name="posts_matching_string">Допісы з “%s“</string>
<string name="accounts_matching_string">Людзі з \"%s\"</string>
<!-- Shown in the post header. Please keep it short -->
<string name="time_seconds_ago_short">%d с таму</string>
<string name="time_minutes_ago_short">%d хв таму</string>
<string name="time_hours_ago_short">%d г таму</string>
<string name="time_days_ago_short">%d дз таму</string>
<!-- %s is the name of the post language -->
<!-- %1$s is the language, %2$s is the name of the translation service -->
</resources>

View File

@@ -2,13 +2,17 @@
<resources>
<string name="log_in">লগ ইন করুন</string>
<string name="next">এরপর</string>
<string name="loading_instance">সার্ভারের তথ্য পুনরূদ্ধার করা হচ্ছে…</string>
<string name="error">কোনো ত্রুটি ঘটেছে</string>
<string name="ok">ঠিক আছে</string>
<string name="preparing_auth">প্রমাণীকরণের জন্য প্রস্তুত হচ্ছে...</string>
<string name="in_reply_to">%s কে উত্তর দিন</string>
<string name="notifications">নোটিফিকেশন</string>
<string name="user_followed_you">%s আপনাকে ফলো করেছেন</string>
<string name="user_sent_follow_request">%s আপনাকে ফলো করার অনুরোধ পাঠিয়েছেন</string>
<string name="share_toot_title">শেয়ার করুন</string>
<string name="settings">সেটিংস</string>
<string name="discard">বাতিল করুন</string>
<string name="cancel">বাতিল করুন</string>
<plurals name="followers">
<item quantity="one">জন ফলোয়ার</item>
@@ -62,6 +66,10 @@
<item quantity="one">%d দিন বাকি</item>
<item quantity="other">%d দিন বাকি</item>
</plurals>
<plurals name="x_votes">
<item quantity="one">%,d ভোট</item>
<item quantity="other">%,d ভোট</item>
</plurals>
<string name="poll_closed">বন্ধ</string>
<string name="confirm_mute_title">অ্যাকাউন্টটি মিউট করুন</string>
<string name="do_mute">মিউট করুন</string>
@@ -92,7 +100,19 @@
<item quantity="one">%d জন ব্যক্তি বলছেন</item>
<item quantity="other">%d jon ব্যক্তিরা বলছেন</item>
</plurals>
<string name="report_title">%s -এর নামে অভিযোগ করুন</string>
<string name="report_choose_reason">এই পোস্টে ভুল কি?</string>
<string name="report_reason_personal">আমার এটি ভালো লাগছে না</string>
<string name="report_reason_spam">এটি স্প্যাম</string>
<string name="report_reason_violation">এটি সার্ভারের নিয়ম ভাঙছে</string>
<string name="report_reason_other">এটি অন্য কিছু</string>
<string name="report_choose_rule">কোন নিয়মটা ভেঙেছে?</string>
<string name="sending_report">রিপোর্ট পাঠানো হচ্ছে…</string>
<string name="report_sent_title">রিপোর্ট করার জন্য আপনাকে ধন্যবাদ, আমরা এটি শীঘ্রই দেখব.</string>
<string name="report_sent_subtitle">আমরা যতক্ষণে আপনার রিপোর্ট পুনর্বিবেচনা করছি, আপনি %s এর বিরুদ্ধে ব্যবস্থা নিতে পারেন:</string>
<string name="unfollow_user">%s -কে আনফলো করুন</string>
<string name="unfollow">আনফলো করুন</string>
<string name="report_personal_title">আপনি এটি আর দেখতে চান না?</string>
<string name="back">ফিরে যান</string>
<string name="search_communities">সার্ভারের নাম বা লিঙ্ক</string>
<string name="instance_rules_title">সার্ভারের নিয়মাবলী</string>
@@ -102,9 +122,63 @@
<string name="email">ই-মেইল</string>
<string name="password">পাসওয়ার্ড</string>
<string name="confirm_password">পাসওয়ার্ড নিশ্চিত করুন</string>
<string name="category_lgbt">LGBT</string>
<string name="category_music">সঙ্গীত</string>
<string name="category_regional">আঞ্চলিক</string>
<string name="category_tech">তথ্য-প্রযুক্তি</string>
<string name="confirm_email_title">আপনার ইনবক্স দেখুন</string>
<!-- %s is the email address -->
<string name="open_email_app">ই-মেইল অ্যাপ খুলুন</string>
<string name="resent_email">নিশ্চিতকরনের ই-মেইল পাঠানো হয়েছে</string>
<string name="visibility_followers_only">ফলোয়ারদের জন্য</string>
<string name="notification_type_follow">নতুন ফলোয়াররা</string>
<string name="err_not_logged_in">Mastodon-এ প্রথমে লগ ইন করুন</string>
<plurals name="cant_add_more_than_x_attachments">
<item quantity="one">আপনি %d -এর বেশি মিডিয়া/ফাইল যোগ করতে পারবেন না</item>
<item quantity="other">আপনি %d -এর বেশি মিডিয়া/ফাইল যোগ করতে পারবেন না</item>
</plurals>
<string name="media_attachment_too_big">%1$s ফাইল %2$s MB-র ফাইলের সাইজ সীমা ছড়িয়ে যাচ্ছে</string>
<string name="theme_light">লাইট</string>
<string name="theme_dark">ডার্ক</string>
<string name="settings_notifications">নোটিফিকেশনগুলো</string>
<string name="settings_contribute">Mastodon-কে সাহায্য করুন</string>
<string name="new_post">নতুন পোস্ট</string>
<string name="button_reply">উত্তর দিন</string>
<string name="button_favorite">প্রিয়</string>
<string name="button_share">শেয়ার করুন</string>
<string name="media_no_description">কোনো বিবরণ ছাড়া ফাইল/মিডিয়া</string>
<string name="follow_user">%s-কে ফলো করুন</string>
<string name="unfollowed_user">%s-কে আনফলো করেছেন</string>
<string name="followed_user">আপনি এখন %s-কে ফলো করছেন</string>
<string name="following_user_requested">%s-কে ফলো করার জন্য অনুরোধ করা হয়েছে</string>
<string name="open_in_browser">ব্রাউজারে খুলুন</string>
<string name="signup_reason">আপনি কেন যুক্ত হতে চান?</string>
<string name="signup_reason_note">এটি আমাদেরকে আপনার আবেদন পুনর্বিবেচনা ও পর্যালোচনা করতে সাহায্য করবে.</string>
<string name="profile_picture">প্রোফাইলের ছবি</string>
<string name="download">ডাউনলোড করুন</string>
<string name="permission_required">অনুমতি প্রয়োজন</string>
<string name="storage_permission_to_download">এই ফাইলটি সেভ করতে অ্যাপটির আপনার স্টোরেজ অ্যাক্সেসের অনুমতি প্রয়োজন.</string>
<string name="open_settings">সেটিংস খুলুন</string>
<string name="error_saving_file">ফাইল সেভ করতে ত্রুটি দেখা দিচ্ছে</string>
<string name="file_saved">ফাইল সেভ হয়েছে</string>
<string name="downloading">ডাউনলোড হচ্ছে…</string>
<!-- %s is the server domain -->
<string name="button_follow_pending">বাকি আছে</string>
<string name="follows_you">আপনাকে ফলো করছেন</string>
<!-- translators: %,d is a valid placeholder, it formats the number with locale-dependent grouping separators -->
<plurals name="x_followers">
<item quantity="one">%,d জন ফলোয়ার</item>
<item quantity="other">%,d জন ফলোয়ার</item>
</plurals>
<string name="time_just_now">এইমাত্র</string>
<plurals name="x_seconds_ago">
<item quantity="one">%d সেকেন্ড আগে</item>
<item quantity="other">%d সেকেন্ড আগে</item>
</plurals>
<plurals name="x_minutes_ago">
<item quantity="one">%d মিনিট আগে</item>
<item quantity="other">%d মিনিট আগে</item>
</plurals>
<!-- %s is version like 1.2.3 -->
<!-- %s is version like 1.2.3 -->
<!-- %s is file size -->
@@ -114,7 +188,6 @@
<string name="welcome_to_mastodon">Mastodon - এ আপনাকে স্বাগত জানাই</string>
<string name="welcome_paragraph1">Mastodon হল একটি বিকেন্দ্রীভূত সামাজিক নেটওয়ার্ক, যার মানে কোনো একক কোম্পানি এটিকে নিয়ন্ত্রণ করে না। এটি অনেকগুলি স্বাধীনভাবে চালিত সার্ভারের সমন্বয়ে গঠিত, যেখানে সব সার্ভারগুলি একসাথে সংযুক্ত৷</string>
<string name="what_are_servers">সার্ভার কি?</string>
<string name="welcome_paragraph2"><![CDATA[প্রতিটি Mastodon অ্যাকাউন্টকে একটি সার্ভারে হোস্ট করা হয় — প্রত্যেকটির নিজস্ব মান, নিয়ম এবং প্রশাসক (অ্যাডমিন) রয়েছে। আপনি যে কোনো সার্ভারই বেছে নিন না কেন তা বিবেচ্য নয়, আপনি যেকোনো সার্ভারের লোকেদের সাথে যোগাযোগ করতে এবং তাদের ফলো করতে পারেন।]]></string>
<!-- %s is formatted file size ("467 KB image") -->
<!-- %s is the server domain -->
<!-- Shown on the "stamp" on the screen that appears after you report a post/user. Please keep the translation short, preferably a single word -->
@@ -126,4 +199,6 @@
<!-- %s is the timestamp ("tomorrow at 12:34") -->
<!-- Shown like a content warning, %s is the name of the filter -->
<!-- Shown in the post header. Please keep it short -->
<!-- %s is the name of the post language -->
<!-- %1$s is the language, %2$s is the name of the translation service -->
</resources>

View File

@@ -182,4 +182,6 @@
<!-- %s is the timestamp ("tomorrow at 12:34") -->
<!-- Shown like a content warning, %s is the name of the filter -->
<!-- Shown in the post header. Please keep it short -->
<!-- %s is the name of the post language -->
<!-- %1$s is the language, %2$s is the name of the translation service -->
</resources>

View File

@@ -293,4 +293,6 @@
<!-- %s is the timestamp ("tomorrow at 12:34") -->
<!-- Shown like a content warning, %s is the name of the filter -->
<!-- Shown in the post header. Please keep it short -->
<!-- %s is the name of the post language -->
<!-- %1$s is the language, %2$s is the name of the translation service -->
</resources>

View File

@@ -105,6 +105,12 @@
<item quantity="many">Zbývá %d dní</item>
<item quantity="other">Zbývá %d dní</item>
</plurals>
<plurals name="x_votes">
<item quantity="one">%,d hlas</item>
<item quantity="few">%,d hlasující</item>
<item quantity="many">%,d hlasujících</item>
<item quantity="other">%,d hlasů</item>
</plurals>
<string name="poll_closed">Uzavřeno</string>
<string name="confirm_mute_title">Skrýt účet</string>
<string name="confirm_mute">Potvrdit skrytí %s</string>
@@ -217,6 +223,12 @@
<string name="notification_type_poll">Ankety</string>
<string name="choose_account">Vybrat účet</string>
<string name="err_not_logged_in">Nejprve se přihlaste do Mastodonu</string>
<plurals name="cant_add_more_than_x_attachments">
<item quantity="one">Nelze přidat více než %d multimediální přílohu</item>
<item quantity="few">Nelze přidat více než %d multimediální přílohy</item>
<item quantity="many">Nelze přidat více než %d multimediálních příloh</item>
<item quantity="other">Nelze přidat více než %d multimediálních příloh</item>
</plurals>
<string name="media_attachment_unsupported_type">Soubor %s nepatří mezi podporované typy</string>
<string name="media_attachment_too_big">Soubor %1$s překračuje limit velikosti %2$s MB</string>
<string name="settings_theme">Vzhled</string>
@@ -301,6 +313,12 @@
<item quantity="many">%,d oblíbení</item>
<item quantity="other">%,d oblíbení</item>
</plurals>
<plurals name="x_reblogs">
<item quantity="one">%,d boost</item>
<item quantity="few">%,d boosty</item>
<item quantity="many">%,d boostů</item>
<item quantity="other">%,d boostů</item>
</plurals>
<string name="timestamp_via_app">%1$s přes %2$s</string>
<string name="time_now">teď</string>
<string name="edit_history">Historie úprav</string>
@@ -407,7 +425,6 @@
<string name="welcome_to_mastodon">Vítejte na Mastodonu</string>
<string name="welcome_paragraph1">Mastodon je decentralizovaná sociální síť, což znamená, že ji neovládá žádná jednotlivá společnost. Skládá se z mnoha nezávisle spravovaných serverů, všechny jsou propojeny dohromady.</string>
<string name="what_are_servers">Co jsou to servery?</string>
<string name="welcome_paragraph2"><![CDATA[Každý účet Mastodon je hostován na serveru - každý s vlastními hodnotami, pravidly a správci. Bez ohledu na to, který si vyberete, můžete sledovat a komunikovat s lidmi na jakémkoliv serveru.]]></string>
<string name="opening_link">Odkaz se otevírá…</string>
<string name="link_not_supported">Tento odkaz není v aplikaci podporovaný</string>
<string name="log_out_all_accounts">Odhlásit se ze všech účtů</string>
@@ -480,6 +497,12 @@
<string name="settings_notifications_policy">Dostávat oznámení od</string>
<string name="notification_type_mentions_and_replies">Zmínění a odpovědi</string>
<string name="pause_all_notifications_title">Pozastavit všechna oznámení</string>
<plurals name="x_weeks">
<item quantity="one">%d týden</item>
<item quantity="few">%d týdny</item>
<item quantity="many">%d týdnů</item>
<item quantity="other">%d týdnů</item>
</plurals>
<!-- %1$s is the date (may be relative, e.g. "today" or "yesterday"), %2$s is the time. You can reorder these placeholders if that works better for your language -->
<string name="date_at_time">%1$s v %2$s</string>
<string name="today">dnes</string>
@@ -501,7 +524,43 @@
<string name="settings_hide_sensitive_media">Zakrýt média označená jako citlivá</string>
<string name="settings_show_interaction_counts">Počet interakcí příspěvku</string>
<string name="settings_show_emoji_in_names">Vlastní emoji v zobrazených jménech</string>
<plurals name="in_x_seconds">
<item quantity="one">za %d vteřinu</item>
<item quantity="few">za %d vteřiny</item>
<item quantity="many">za %d vteřin</item>
<item quantity="other">za %d vteřin</item>
</plurals>
<plurals name="in_x_minutes">
<item quantity="one">za %d minutu</item>
<item quantity="few">za %d minuty</item>
<item quantity="many">za %d minut</item>
<item quantity="other">za %d minut</item>
</plurals>
<plurals name="in_x_hours">
<item quantity="one">za %d hodinu</item>
<item quantity="few">za %d hodiny</item>
<item quantity="many">za %d hodin</item>
<item quantity="other">za %d hodin</item>
</plurals>
<plurals name="x_hours_ago">
<item quantity="one">před %d hodinou</item>
<item quantity="few">před %d hodinami</item>
<item quantity="many">před %d hodinami</item>
<item quantity="other">před %d hodinami</item>
</plurals>
<string name="alt_text_reminder_title">Média nemají alternativní text</string>
<plurals name="alt_text_reminder_x_images">
<item quantity="one">%s z vašich obrázků nemá alternativní text. Přesto odeslat?</item>
<item quantity="few">%s z vašich obrázků nemají alternativní text. Přesto odeslat?</item>
<item quantity="many">%s z vašich obrázků nemá alternativní text. Přesto odeslat?</item>
<item quantity="other">%s z vašich obrázků nemá alternativní text. Přesto odeslat?</item>
</plurals>
<plurals name="alt_text_reminder_x_attachments">
<item quantity="one">%s z vašich multimediálních příloh nemá alternativní text. Přesto odeslat?</item>
<item quantity="few">%s z vašich multimediálních příloh nemají alternativní text. Přesto odeslat?</item>
<item quantity="many">%s z vašich multimediálních příloh nemá alternativní text. Přesto odeslat?</item>
<item quantity="other">%s z vašich multimediálních příloh nemá alternativní text. Přesto odeslat?</item>
</plurals>
<string name="count_one">Jeden</string>
<string name="count_two">Dva</string>
<string name="count_three">Tři</string>
@@ -522,6 +581,12 @@
<string name="filter_duration_forever">Napořád</string>
<!-- %s is the timestamp ("tomorrow at 12:34") -->
<string name="settings_filter_ends">Končí %s</string>
<plurals name="settings_x_muted_words">
<item quantity="one">%d ztišené slovo nebo fráze</item>
<item quantity="few">%d ztišená slova nebo fráze</item>
<item quantity="many">%d ztišených slov nebo frází</item>
<item quantity="other">%d ztišených slov nebo fráze</item>
</plurals>
<string name="selection_2_options">%1$s a %2$s</string>
<string name="selection_3_options">%1$s, %2$s a %3$s</string>
<string name="selection_4_or_more">%1$s, %2$s a %3$d další</string>
@@ -543,6 +608,18 @@
<string name="select_all">Vybrat vše</string>
<string name="settings_filter_duration_title">Doba použití filtru</string>
<string name="filter_duration_custom">Vlastní</string>
<plurals name="settings_delete_x_filter_words">
<item quantity="one">Smazat %d slovo?</item>
<item quantity="few">Smazat %d slova?</item>
<item quantity="many">Smazat %d slov?</item>
<item quantity="other">Smazat %d slov?</item>
</plurals>
<plurals name="x_items_selected">
<item quantity="one">%d vybráno</item>
<item quantity="few">%d vybrány</item>
<item quantity="many">%d vybraných</item>
<item quantity="other">%d vybraných</item>
</plurals>
<string name="required_form_field_blank">Nemůže být prázdné</string>
<string name="filter_word_already_in_list">Již v seznamu</string>
<string name="app_update_ready">Je připravena aktualizace aplikace</string>
@@ -562,4 +639,6 @@
<string name="time_minutes_ago_short">Před %dm</string>
<string name="time_hours_ago_short">Před %dh</string>
<string name="time_days_ago_short">Před %dd</string>
<!-- %s is the name of the post language -->
<!-- %1$s is the language, %2$s is the name of the translation service -->
</resources>

View File

@@ -4,18 +4,24 @@
<string name="next">Næste</string>
<string name="loading_instance">Henter serverinfo…</string>
<string name="error">Fejl</string>
<string name="ok">Ok</string>
<string name="not_a_mastodon_instance">%s lader ikke til at være en Mastodon-server.</string>
<string name="ok">OK</string>
<string name="preparing_auth">Forbereder godkendelse…</string>
<string name="finishing_auth">Afslutter godkendelse…</string>
<string name="user_boosted">%s fremhævede</string>
<string name="in_reply_to">Som svar til %s</string>
<string name="notifications">Meddelelser</string>
<string name="notifications">Notifikationer</string>
<string name="user_followed_you">%s begyndte at følge dig</string>
<string name="user_sent_follow_request">%s har sendt dig en følgeanmodning</string>
<string name="user_favorited">%s favoritmarkerede dit indlæg</string>
<string name="notification_boosted">%s boostede dit indlæg</string>
<string name="poll_ended">Se resultaterne af en afstemning, hvori du deltog</string>
<string name="share_toot_title">Del</string>
<string name="settings">Indstillinger</string>
<string name="publish">Offentliggør</string>
<string name="publish">Publicér</string>
<string name="discard_draft">Kassér kladde?</string>
<string name="discard">Kassér</string>
<string name="cancel">Fortryd</string>
<string name="cancel">Afbryd</string>
<plurals name="followers">
<item quantity="one">følger</item>
<item quantity="other">følgere</item>
@@ -31,13 +37,14 @@
<string name="button_follow">Følg</string>
<string name="button_following">Følger</string>
<string name="edit_profile">Redigér profil</string>
<string name="mute_user">Skjul %s (mute)</string>
<string name="unmute_user">Vis %s igen (unmute)</string>
<string name="block_user">Bloker %s</string>
<string name="unblock_user">Fjern blokering af %s</string>
<string name="report_user">Indberet %s</string>
<string name="block_domain">Bloker %s</string>
<string name="unblock_domain">Fjern blokering af %s</string>
<string name="share_user">Del profil</string>
<string name="mute_user">Gør tavs %s</string>
<string name="unmute_user">Vis %s igen</string>
<string name="block_user">Blokér %s</string>
<string name="unblock_user">Afblokér %s</string>
<string name="report_user">Anmeld %s</string>
<string name="block_domain">Blokér %s</string>
<string name="unblock_domain">Afblokér %s</string>
<plurals name="x_posts">
<item quantity="one">%,d indlæg</item>
<item quantity="other">%,d indlæg</item>
@@ -45,7 +52,7 @@
<string name="profile_joined">Tilmeldt</string>
<string name="done">Udført</string>
<string name="loading">Indlæser…</string>
<string name="field_label">Mærkat</string>
<string name="field_label">Etiket</string>
<string name="field_content">Indhold</string>
<string name="saving">Gemmer…</string>
<string name="post_from_user">Indlæg fra %s</string>
@@ -78,66 +85,84 @@
<item quantity="one">%d dag tilbage</item>
<item quantity="other">%d dage tilbage</item>
</plurals>
<plurals name="x_votes">
<item quantity="one">%,d stemme</item>
<item quantity="other">%,d stemmer</item>
</plurals>
<string name="poll_closed">Lukket</string>
<string name="confirm_mute_title">Skjul konto</string>
<string name="confirm_mute">Bekræft at du vil skjule %s</string>
<string name="do_mute">Skjul (mute)</string>
<string name="confirm_unmute_title">Vis bruger igen (unmute)</string>
<string name="confirm_unmute">Bekræft at du vil se %s igen</string>
<string name="do_unmute">Vis igen (unmute)</string>
<string name="confirm_block_title">Bloker bruger</string>
<string name="confirm_block_domain_title">Bloker domæne</string>
<string name="confirm_block">Bekræft at du vil blokere %s</string>
<string name="do_block">Bloker</string>
<string name="confirm_unblock_title">Fjern blokering af bruger</string>
<string name="confirm_unblock_domain_title">Fjern blokering af domæne</string>
<string name="confirm_unblock">Bekræft at du vil fjerne blokering af %s</string>
<string name="do_unblock">Fjern blokering</string>
<string name="confirm_mute_title">Tavsgør konto</string>
<string name="confirm_mute">Bekræft tavsgørelse af %s</string>
<string name="do_mute">Tavsgør</string>
<string name="confirm_unmute_title">Vis konto igen</string>
<string name="confirm_unmute">Bekræft, at %s ikke længere er tavsgjort</string>
<string name="do_unmute">Ophæv tavsgørelse</string>
<string name="confirm_block_title">Blokér konto</string>
<string name="confirm_block_domain_title">Blokér domæne</string>
<string name="confirm_block">Bekræft blokering af %s</string>
<string name="do_block">Blokér</string>
<string name="confirm_unblock_title">Afblokér konto</string>
<string name="confirm_unblock_domain_title">Afblokér domæne</string>
<string name="confirm_unblock">Bekræft afblokeringen af %s</string>
<string name="do_unblock">Afblokér</string>
<string name="button_blocked">Blokeret</string>
<string name="action_vote">Stem</string>
<string name="delete">Slet</string>
<string name="confirm_delete">Er du sikker på, at du vil slette dette indlæg?</string>
<string name="confirm_delete_title">Slet indlæg</string>
<string name="confirm_delete">Sikker på, at dette indlæg skal slettes?</string>
<string name="deleting">Sletter…</string>
<string name="notification_channel_audio_player">Afspilning af lyd</string>
<string name="notification_channel_audio_player">Lydafspilning</string>
<string name="play">Afspil</string>
<string name="pause">Sæt på pause</string>
<string name="pause">Pausér</string>
<string name="log_out">Log ud</string>
<string name="add_account">Tilføj konto</string>
<string name="search_hint">Søg</string>
<string name="hashtags">Hashtags</string>
<string name="news">Nyheder</string>
<string name="for_you">Til dig</string>
<string name="all_notifications">Alt</string>
<string name="mentions">Omtaler</string>
<plurals name="x_people_talking">
<item quantity="one">%d person deltager</item>
<item quantity="other">%d personer deltager</item>
<item quantity="one">%d person taler</item>
<item quantity="other">%d personer taler</item>
</plurals>
<string name="report_title">Indberet %s</string>
<string name="report_choose_reason_subtitle">Vælg en passende grund</string>
<string name="report_title">Anmeld %s</string>
<string name="report_choose_reason">Hvad er der galt med dette indlæg?</string>
<string name="report_choose_reason_account">Hvad er der galt med %s?</string>
<string name="report_choose_reason_subtitle">Vælg bedste match</string>
<string name="report_reason_personal">Bryder mig ikke om det</string>
<string name="report_reason_personal_subtitle">Det er ikke noget, man ønsker at se</string>
<string name="report_reason_spam_subtitle">Ondsindede links, falske interaktioner, eller gentagne svar</string>
<string name="report_reason_violation">Det overtræder serverreglerne</string>
<string name="report_reason_violation_subtitle">Du kender til specifikke regler som det er i strid med</string>
<string name="report_reason_other_subtitle">Problemet passer ikke ind i andre kategorier</string>
<string name="report_reason_spam">Det er spam</string>
<string name="report_reason_spam_subtitle">Ondsindede links, falske interaktioner eller gentagne svar</string>
<string name="report_reason_violation">Det overtræder serverregler</string>
<string name="report_reason_violation_subtitle">Du er bekendt med, at det overtræder bestemte regler</string>
<string name="report_reason_other">Drejer sig om noget andet</string>
<string name="report_reason_other_subtitle">Ingen kategori modsvarer problematikken</string>
<string name="report_choose_rule">Hvilke regler overtrædes?</string>
<string name="report_choose_rule_subtitle">Vælg alle relevante</string>
<string name="report_choose_posts">Er der indlæg, som kan bekræfte denne anmeldelse?</string>
<string name="report_choose_posts">Er der indlæg, som understøtter denne anmeldelse?</string>
<string name="report_choose_posts_subtitle">Vælg alle relevante</string>
<string name="report_comment_title">Er der andet, vi bør vide?</string>
<string name="report_comment_hint">Yderligere kommentarer</string>
<string name="sending_report">Sender rapport…</string>
<string name="sending_report">Indsender rapport…</string>
<string name="report_sent_title">Tak for anmeldelsen. Vi vil se nærmere på dette.</string>
<string name="report_sent_subtitle">Mens vi gennemgår anmeldelsen, kan du tage skridt mod %s:</string>
<string name="unfollow_user">Følg ikke længere %s</string>
<string name="unfollow">Følg ikke længere</string>
<string name="back">Tilbage</string>
<string name="search_communities">Server-navn eller URL</string>
<string name="mute_user_explain">Du vil ikke se indlæg fra vedkommende, der dog stadig kan se dine indlæg og følge dig, men ikke være bekendt med tavsgørelsen.</string>
<string name="block_user_explain">Du vil ikke se indlæg fra vedkommende, der hverken kan se dine indlæg eller følge dig, men vil være bekendt med blokeringen.</string>
<string name="report_personal_title">Ønsker du ikke at se dette?</string>
<string name="report_personal_subtitle">Her er mulighederne for at styre, hvad du ser på Mastodon:</string>
<string name="back">Retur</string>
<string name="search_communities">Servernavn eller -URL</string>
<string name="instance_rules_title">Serverregler</string>
<string name="instance_rules_subtitle">Ved at fortsætte accepterer du at følge følgende regler, der er vedtaget og håndhævet af %ss moderatorer.</string>
<string name="instance_rules_subtitle">Ved at fortsætte accepterer du at overholde flg. regler, som angivet og håndhævet af %s moderatorerne.</string>
<string name="signup_title">Opret konto</string>
<string name="display_name">Navn</string>
<string name="username">Brugernavn</string>
<string name="email">Email</string>
<string name="email">E-mail</string>
<string name="password">Adgangskode</string>
<string name="confirm_password">Bekræft adgangskode</string>
<string name="password_note">Inkluder store bogstaver, specialtegn og tal for at gøre din adgangskode stærkere.</string>
<string name="password_note">Benyt majuskler, specialtegn og tal for at øge adgangskodens styrke.</string>
<string name="category_academia">Forskning og højere uddannelser</string>
<string name="category_activism">Aktivisme</string>
<string name="category_all">Alt</string>
@@ -153,41 +178,55 @@
<string name="category_tech">Teknologi</string>
<string name="confirm_email_title">Tjek din indbakke</string>
<!-- %s is the email address -->
<string name="confirm_email_subtitle">Tryk på det modtage link for at bekræfte %s. Vi venter her så længe.</string>
<string name="confirm_email_didnt_get">Modtog intet link?</string>
<string name="resend">Send igen</string>
<string name="open_email_app">Åben email-app</string>
<string name="resent_email">Bekræftelses-email sendt</string>
<string name="open_email_app">Åbn e-mail app</string>
<string name="resent_email">Bekræftelsesmail sendt</string>
<string name="compose_hint">Angiv eller indsæt, hvad du tænker på</string>
<string name="content_warning">Indholdsadvarsel</string>
<string name="save">Gem</string>
<string name="add_alt_text">Tilføj alternativ tekst</string>
<string name="visibility_public">Offentlig</string>
<string name="visibility_followers_only">Kun følgere</string>
<string name="skip">Spring over</string>
<string name="notification_type_follow">Nye følgere</string>
<string name="visibility_followers_only">Kun Følgere</string>
<string name="visibility_private">Kun nævnte personer</string>
<string name="recent_searches">Nylige</string>
<string name="skip">Overspring</string>
<string name="notification_type_follow">Nye Følgere</string>
<string name="notification_type_favorite">Favoritmarkeringer</string>
<string name="notification_type_reblog">Fremhævninger</string>
<string name="notification_type_mention">Omtaler</string>
<string name="notification_type_poll">Afstemninger</string>
<string name="choose_account">Vælg konto</string>
<string name="err_not_logged_in">Log venligst ind på Mastodon først</string>
<string name="media_attachment_unsupported_type">Filen %s er af en type der ikke understøttes</string>
<string name="media_attachment_too_big">Størrelsen på filen %1$s overskrider grænsen på %2$s MB</string>
<string name="err_not_logged_in">Log ind på Mastodon først</string>
<plurals name="cant_add_more_than_x_attachments">
<item quantity="one">Maks. %d medievedhæftning kan tilføjes</item>
<item quantity="other">Maks. %d medievedhæftninger kan tilføjes</item>
</plurals>
<string name="media_attachment_unsupported_type">Filen %s er af en uunderstøttet type</string>
<string name="media_attachment_too_big">Filen %1$s overskrider begrænsningen på %2$s MB</string>
<string name="settings_theme">Udseende</string>
<string name="theme_auto">Brug enhedens indstillinger for udseende</string>
<string name="theme_light">Lys</string>
<string name="theme_dark">Mørk</string>
<string name="settings_behavior">Opførsel</string>
<string name="settings_gif">Spil animerede avatarer og emoji</string>
<string name="settings_behavior">Adfærd</string>
<string name="settings_gif">Afspil animerede avatarer og emojier</string>
<string name="settings_custom_tabs">Benyt in-app browser</string>
<string name="settings_notifications">Meddelelser</string>
<string name="settings_notifications">Notifikationer</string>
<string name="settings_contribute">Bidrag til Mastodon</string>
<string name="settings_tos">Vilkår og Betingelser</string>
<string name="settings_privacy_policy">Privatlivspolitik</string>
<string name="settings_tos">Tjenestevilkår</string>
<string name="settings_privacy_policy">Fortrolighedspolitik</string>
<string name="settings_clear_cache">Ryd mediecache</string>
<string name="settings_app_version">Mastodon til Android v%1$s (%2$d)</string>
<string name="media_cache_cleared">Mediecache ryddet</string>
<string name="confirm_log_out">Log ud af %s?</string>
<string name="sensitive_content_explain">Forfatteren markerede dette medie som sensitivt.</string>
<string name="avatar_description">Gå til %ss profil</string>
<string name="more_options">Flere muligheder</string>
<string name="new_post">Nyt indlæg</string>
<string name="button_reply">Svar</string>
<string name="button_reblog">Fremhæv</string>
<string name="button_favorite">Favorit</string>
<string name="button_favorite">Gør til favorit</string>
<string name="button_share">Del</string>
<string name="media_no_description">Medier uden beskrivelse</string>
<string name="add_media">Tilføj medier</string>
@@ -198,6 +237,7 @@
<string name="media_viewer">Mediefremviser</string>
<string name="follow_user">Følg %s</string>
<string name="unfollowed_user">Følg ikke længere %s</string>
<string name="followed_user">Du følger nu %s</string>
<string name="following_user_requested">Anmodede om at følge %s</string>
<string name="open_in_browser">Åbn i browser</string>
<string name="hide_boosts_from_user">Skjul fremhævninger fra %s</string>
@@ -207,7 +247,7 @@
<string name="clear">Ryd</string>
<string name="profile_header">Overskriftsbillede</string>
<string name="profile_picture">Profilbillede</string>
<string name="reorder">Omarranger</string>
<string name="reorder">Omarrangér</string>
<string name="download">Download</string>
<string name="permission_required">Tilladelse kræves</string>
<string name="storage_permission_to_download">Appen skal have adgang til din lagerplads for at gemme denne fil.</string>
@@ -215,7 +255,13 @@
<string name="error_saving_file">Fejl under lagring af fil</string>
<string name="file_saved">Fil gemt</string>
<string name="downloading">Downloader…</string>
<string name="no_app_to_handle_action">Ingen app til at håndtere denne handling</string>
<string name="local_timeline">Lokalt</string>
<string name="trending_posts_info_banner">Her er de indlæg, som vinder indpas på tværs af Mastodon.</string>
<string name="trending_links_info_banner">Her er de nyheder, der bliver talt om på Mastodon.</string>
<!-- %s is the server domain -->
<string name="local_timeline_info_banner">Disse er alle indlæg fra alle brugere på din server (%s).</string>
<string name="recommended_accounts_info_banner">Baseret på andre, du følger, vil du måske synes om disse konti.</string>
<string name="see_new_posts">Se nye indlæg</string>
<string name="load_missing_posts">Indlæs manglende indlæg</string>
<string name="follow_back">Følg Tilbage</string>
@@ -236,14 +282,14 @@
<item quantity="other">%,d favoritmarkeringer</item>
</plurals>
<plurals name="x_reblogs">
<item quantity="one">%,d indlæg</item>
<item quantity="other">%,d indlæg</item>
<item quantity="one">%,d fremhævning</item>
<item quantity="other">%,d fremhævninger</item>
</plurals>
<string name="timestamp_via_app">%1$s via %2$s</string>
<string name="time_now">nu</string>
<string name="edit_history">Rediger historik</string>
<string name="last_edit_at_x">Senest ændret: %s</string>
<string name="time_just_now">lige nu</string>
<string name="time_just_now">netop nu</string>
<plurals name="x_seconds_ago">
<item quantity="one">%d sekund siden</item>
<item quantity="other">%d sekunder siden</item>
@@ -252,11 +298,11 @@
<item quantity="one">%d minut siden</item>
<item quantity="other">%d minutter siden</item>
</plurals>
<string name="edited_timestamp">redigerede %s</string>
<string name="edited_timestamp">redigeret %s</string>
<string name="edit_original_post">Oprindeligt indlæg</string>
<string name="edit_text_edited">Tekst redigeret</string>
<string name="edit_spoiler_added">Indholdsadvarsel tilføjet</string>
<string name="edit_spoiler_edited">Indholdsadvarsel tilføjet</string>
<string name="edit_spoiler_edited">Indholdsadvarsel redigeret</string>
<string name="edit_spoiler_removed">Indholdsadvarsel fjernet</string>
<string name="edit_poll_added">Afstemning tilføjet</string>
<string name="edit_poll_edited">Afstemning redigeret</string>
@@ -264,11 +310,11 @@
<string name="edit_media_added">Medier tilføjet</string>
<string name="edit_media_removed">Medier fjernet</string>
<string name="edit_media_reordered">Medie omarrangeret</string>
<string name="edit_marked_sensitive">Marker som følsom</string>
<string name="edit_marked_not_sensitive">Markeret ikke følsom</string>
<string name="edit_marked_sensitive">Markeret sensitivt</string>
<string name="edit_marked_not_sensitive">Markeret ikke-sensitivt</string>
<string name="edit_multiple_changed">Indlæg redigeret</string>
<string name="edit">Rediger</string>
<string name="discard_changes">Fortryd ændringer?</string>
<string name="edit">Redigér</string>
<string name="discard_changes">Kassér ændringer?</string>
<string name="upload_failed">Upload mislykkedes</string>
<string name="file_size_bytes">%d bytes</string>
<string name="file_size_kb">%.2f KB</string>
@@ -279,20 +325,21 @@
<!-- %s is version like 1.2.3 -->
<!-- %s is file size -->
<string name="download_update">Download (%s)</string>
<string name="install_update">Installer</string>
<string name="privacy_policy_title">Dit privatliv</string>
<string name="privacy_policy_subtitle">Selvom Mastodon-appen ikke indsamler data, kan den server du tilmelder dig gennem, have en anden politik.\n\nHvis du er uenig i politikken for %s, kan du gå tilbage og vælge en anden server.</string>
<string name="install_update">Installér</string>
<string name="privacy_policy_title">Din fortrolighed</string>
<string name="privacy_policy_subtitle">Selvom Mastodon-appen ikke indsamler data, kan serveren, via hvilken man tilmelder sig, have en anden politik.\n\nEr man uenig i politikken for %s, kan man gå tilbage og vælge en anden server.</string>
<string name="i_agree">Jeg accepterer</string>
<string name="empty_list">Denne liste er tom</string>
<string name="instance_signup_closed">Denne server er ikke åben for nye tilmeldinger.</string>
<string name="instance_signup_closed">Denne server accepterer ikke nye tilmeldinger.</string>
<string name="text_copied">Kopieret til udklipsholderen</string>
<string name="add_bookmark">Bogmærk</string>
<string name="remove_bookmark">Fjern bogmærke</string>
<string name="bookmarks">Bogmærker</string>
<string name="your_favorites">Dine Favoritter</string>
<string name="login_title">Velkommen tilbage</string>
<string name="login_subtitle">Log ind med serveren hvor du oprettede din bruger.</string>
<string name="login_subtitle">Log ind med serveren, på hvilken din konto blev oprettet.</string>
<string name="server_url">Server-URL</string>
<string name="signup_random_server_explain">En server baseret på dit sprog vælges, hvis du fortsætter uden selv at vælge.</string>
<string name="server_filter_any_language">Hvilket som helst sprog</string>
<string name="server_filter_instant_signup">Øjeblikkelig tilmelding</string>
<string name="server_filter_manual_review">Manuel evaluering</string>
@@ -305,6 +352,7 @@
<string name="server_filter_region_oceania">Oceania</string>
<string name="not_accepting_new_members">Ikke åben for nye medlemmer</string>
<string name="category_special_interests">Særlige Interesser</string>
<string name="signup_passwords_dont_match">Adgangskoder matcher ikke</string>
<string name="pick_server_for_me">Vælg for mig</string>
<string name="profile_add_row">Tilføj række</string>
<string name="profile_setup">Profilopsætning</string>
@@ -313,12 +361,14 @@
<string name="popular_on_mastodon">Populært på Mastodon</string>
<string name="follow_all">Følg alle</string>
<string name="server_rules_disagree">Ikke enig</string>
<string name="privacy_policy_explanation">TL;DR: Vi indsamler eller behandler ikke noget.</string>
<!-- %s is server domain -->
<string name="server_policy_disagree">Uenig med %s</string>
<string name="profile_bio">Biografi</string>
<!-- Shown in a progress dialog when you tap "follow all" -->
<string name="sending_follows">Følger brugere …</string>
<!-- %1$s is server domain, %2$s is email domain. You can reorder these placeholders to fit your language better. -->
<string name="signup_email_domain_blocked">%1$s tillader ikke tilmeldinger fra %2$s. Prøv en anden eller &lt;a&gt;vælg en anden server&lt;/a&gt;.</string>
<string name="spoiler_show">Vis alligevel</string>
<string name="spoiler_hide">Genskjul</string>
<string name="poll_multiple_choice">Vælg en eller flere</string>
@@ -331,21 +381,128 @@
<string name="show">Vis</string>
<string name="hide">Skjul</string>
<string name="join_default_server">Tilmeld dig %s</string>
<string name="pick_server">Vælg en anden server</string>
<string name="signup_or_login">eller</string>
<string name="learn_more">Få mere at vide</string>
<string name="welcome_to_mastodon">Velkommen til Mastodon</string>
<string name="welcome_paragraph1">Mastodon er et decentraliseret socialt netværk, hvilket betyder at ingen enkelt virksomhed styrer det. Det består af mange uafhængige servere, alle forbundet sammen.</string>
<string name="what_are_servers">Hvad er servere?</string>
<string name="welcome_paragraph2"><![CDATA[Alle Mastodon-konti har plads på en server. Hver server har sine egne værdier, regler og administratorer. Ligegyldigt hvilken server du vælger, kan du følge og interagere med folk på alle andre servere.]]></string>
<string name="opening_link">Åbner link…</string>
<string name="link_not_supported">Linket er ikke understøttet i appen</string>
<string name="log_out_all_accounts">Log ud af alle konti</string>
<string name="confirm_log_out_all_accounts">Log ud af alle konti?</string>
<string name="retry">Forsøg igen</string>
<string name="post_failed">Mislykkedes at indsende indlæg</string>
<!-- %s is formatted file size ("467 KB image") -->
<string name="attachment_description_image">%s billede</string>
<string name="attachment_description_video">%s video</string>
<string name="attachment_description_audio">%s lyd</string>
<string name="attachment_description_unknown">%s fil</string>
<string name="attachment_type_image">Billede</string>
<string name="attachment_type_video">Video</string>
<string name="attachment_type_audio">Lyd</string>
<string name="attachment_type_gif">GIF</string>
<string name="attachment_type_unknown">Fil</string>
<string name="attachment_x_percent_uploaded">%d%% uploadet</string>
<string name="add_poll_option">Tilføj afstemningsmulighed</string>
<string name="poll_length">Afstemningslængde</string>
<string name="poll_style">Stil</string>
<string name="compose_poll_single_choice">Vælg én</string>
<string name="compose_poll_multiple_choice">Multivalg</string>
<string name="delete_poll_option">Slet afstemningsvalg</string>
<string name="poll_style_title">Afstemningsstil</string>
<string name="alt_text">Alt text</string>
<string name="help">Hjælp</string>
<string name="what_is_alt_text">Hvad er alt tekst?</string>
<string name="alt_text_help">Alt tekst vil sige billedbeskrivelser til personer med synshandikap, forbindelser med lav båndbredde eller dem, som søger ekstra kontekst.\n\nMan kan forbedre tilgængelighed og forståelse for alle ved at skrive klar, kortfattet og objektiv alt-tekst.\n\n<ul><li>Fang vigtige elementer</li>\n<li>Opsummér tekst i billeder</li>\n<li>Brug regulær sætningsstruktur</li>\n<li>Undgå overflødig information</li>\n<li>Fokus på tendenser og vigtige fund i kompleks grafik (såsom diagrammer/kort)</li></ul></string>
<string name="edit_post">Redigere opslag</string>
<string name="no_verified_link">Intet bekræftet link</string>
<string name="compose_autocomplete_emoji_empty">Gennemse emoji</string>
<string name="compose_autocomplete_users_empty">Find den, man leder efter</string>
<string name="no_search_results">Ingen resultater for disse søgeord</string>
<string name="language">Sprog</string>
<string name="language_default">Standard</string>
<string name="language_system">System</string>
<string name="language_detecting">Detektere sprog</string>
<string name="language_cant_detect">Kan ikke detektere sprog</string>
<string name="language_detected">Detekteret</string>
<string name="media_hidden">Medie skjult</string>
<string name="post_hidden">Indlæg skjult</string>
<string name="report_title_post">Anmeld indlæg</string>
<string name="forward_report_explanation">Kontoen er fra en anden server. Send også en anonymiseret kopi af anmeldelsen dertil?</string>
<!-- %s is the server domain -->
<string name="forward_report_to_server">Videresend til %s</string>
<!-- Shown on the "stamp" on the screen that appears after you report a post/user. Please keep the translation short, preferably a single word -->
<string name="reported">Anmeldt</string>
<string name="report_unfollow_explanation">For ikke længere at se vedkommendes indlæg i hjemmefeedet, ophør med at følge.</string>
<string name="muted_user">Tavsgjorde %s</string>
<!-- %s is the app name (Mastodon, key app_name). I made it a placeholder so everything Just Works™ with forks -->
<!-- %1$s is the date (may be relative, e.g. "today" or "yesterday"), %2$s is the time. You can reorder these placeholders if that works better for your language -->
<!-- %s is the timestamp ("tomorrow at 12:34") -->
<!-- %s is the timestamp ("tomorrow at 12:34") -->
<string name="count_three">Tre</string>
<string name="count_four">Fire</string>
<string name="alt_text_reminder_post_anyway">Indlæg</string>
<!-- %s is the username -->
<string name="unfollow_confirmation">Følg ikke længere %s?</string>
<string name="filter_active">Aktiv</string>
<string name="filter_inactive">Inaktiv</string>
<string name="settings_add_filter">Tilføj filter</string>
<string name="settings_edit_filter">Redigér filter</string>
<string name="settings_filter_duration">Varighed</string>
<string name="settings_filter_muted_words">Tavsgjorte (skjulte) ord</string>
<string name="settings_filter_context">Tavsgør fra</string>
<string name="settings_filter_show_cw">Vis med indholdsadvarsel</string>
<string name="settings_filter_show_cw_explanation">Viser stadig indlæg matchende dette filter, men bag en indholdsadvarsel</string>
<string name="settings_delete_filter">Slet filter</string>
<string name="filter_duration_forever">For evigt</string>
<!-- %s is the timestamp ("tomorrow at 12:34") -->
<string name="settings_filter_ends">Slutter %s</string>
<plurals name="settings_x_muted_words">
<item quantity="one">%d tavsgjort (skjult) ord/sætning</item>
<item quantity="other">%d tavsgjorte (skjulte) ord/sætninger</item>
</plurals>
<string name="selection_2_options">%1$s og %2$s</string>
<string name="selection_3_options">%1$s, %2$s og %3$s</string>
<string name="selection_4_or_more">%1$s, %2$s og %3$d flere</string>
<string name="filter_context_home_lists">Hjem og lister</string>
<string name="filter_context_notifications">Notifikationer</string>
<string name="filter_context_public_timelines">Offentlige tidslinjer</string>
<string name="filter_context_threads_replies">Tråde og svar</string>
<string name="filter_context_profiles">Profiler</string>
<string name="settings_filter_title">Titel</string>
<string name="settings_delete_filter_title">Slet filter “%s”?</string>
<string name="settings_delete_filter_confirmation">Dette filter slettes fra din konto på alle enheder.</string>
<string name="add_muted_word">Tilføj tavsgjort (skjult) ord</string>
<string name="edit_muted_word">Redigér tavsgjort (skjult) ord</string>
<string name="add">Tilføj</string>
<string name="filter_word_or_phrase">Ord/sætning</string>
<string name="filter_add_word_help">Ord er versalfølsomme og matcher kun fulde ord.\n\nFiltreres nøgleordet “Apple,” vil det skjule indlæg indeholdende “apple” eller “aPpLe”, men ikke “pineapple”.</string>
<string name="settings_delete_filter_word">Slet ordet “%s”?</string>
<string name="enter_selection_mode">Vælg</string>
<string name="select_all">Vælg alle</string>
<string name="settings_filter_duration_title">Filtervarighed</string>
<string name="filter_duration_custom">Tilpasset</string>
<plurals name="settings_delete_x_filter_words">
<item quantity="one">Slet %d ord?</item>
<item quantity="other">Slet %d ord?</item>
</plurals>
<plurals name="x_items_selected">
<item quantity="one">%d valgt</item>
<item quantity="other">%d valgt</item>
</plurals>
<string name="required_form_field_blank">Obligatorisk felt</string>
<string name="filter_word_already_in_list">Allerede på listen</string>
<string name="app_update_ready">App-opdatering klar</string>
<string name="app_update_version">Version %s</string>
<string name="downloading_update">Downloader (%d%%)</string>
<!-- Shown like a content warning, %s is the name of the filter -->
<string name="post_matches_filter_x">Matcher filter “%s”</string>
<string name="search_mastodon">Søg i Mastodon</string>
<string name="clear_all">Ryd alle</string>
<string name="search_open_url">Åbn URL i Mastodon</string>
<string name="posts_matching_hashtag">Indlæg med “%s”</string>
<!-- Shown in the post header. Please keep it short -->
<!-- %s is the name of the post language -->
<!-- %1$s is the language, %2$s is the name of the translation service -->
</resources>

View File

@@ -4,12 +4,18 @@
<string name="next">Weiter</string>
<string name="loading_instance">Server-Informationen werden abgerufen …</string>
<string name="error">Fehler</string>
<string name="not_a_mastodon_instance">%s scheint kein Mastodon-Server zu sein.</string>
<string name="ok">OK</string>
<string name="preparing_auth">Authentifizierung wird vorbereitet </string>
<string name="finishing_auth">Authentifizierung wird abgeschlossen …</string>
<string name="user_boosted">%s hat geteilt</string>
<string name="finishing_auth">Authentisierung wird abgeschlossen …</string>
<string name="user_boosted">%s teilte</string>
<string name="in_reply_to">Als Antwort auf %s</string>
<string name="notifications">Benachrichtigungen</string>
<string name="user_followed_you">%s folgt dir jetzt</string>
<string name="user_sent_follow_request">%s hat dir eine Folgeanfrage gesendet</string>
<string name="user_favorited">%s favorisierte deinen Beitrag</string>
<string name="notification_boosted">%s teilte deinen Beitrag</string>
<string name="poll_ended">Sieh dir die Ergebnisse einer Umfrage an, in der du abgestimmt hast</string>
<string name="share_toot_title">Teilen</string>
<string name="settings">Einstellungen</string>
<string name="publish">Veröffentlichen</string>
@@ -31,13 +37,14 @@
<string name="button_follow">Folgen</string>
<string name="button_following">Folge ich</string>
<string name="edit_profile">Profil bearbeiten</string>
<string name="share_user">Profil teilen</string>
<string name="mute_user">%s stummschalten</string>
<string name="unmute_user">%s nicht mehr stummschalten</string>
<string name="block_user">%s sperren</string>
<string name="unblock_user">%s entsperren</string>
<string name="report_user">%s melden</string>
<string name="block_domain">%s sperren</string>
<string name="unblock_domain">%s nicht mehr sperren</string>
<string name="block_domain">%s blockieren</string>
<string name="unblock_domain">%s nicht mehr blockieren</string>
<plurals name="x_posts">
<item quantity="one">%,d Beitrag</item>
<item quantity="other">%,d Beiträge</item>
@@ -78,6 +85,10 @@
<item quantity="one">noch %d Tag</item>
<item quantity="other">noch %d Tage</item>
</plurals>
<plurals name="x_votes">
<item quantity="one">%,d Stimme</item>
<item quantity="other">%,d Stimmen</item>
</plurals>
<string name="poll_closed">Beendet</string>
<string name="confirm_mute_title">Konto stummschalten</string>
<string name="confirm_mute">Bestätigen, um %s stummzuschalten</string>
@@ -87,36 +98,44 @@
<string name="do_unmute">Nicht mehr stummschalten</string>
<string name="confirm_block_title">Konto sperren</string>
<string name="confirm_block_domain_title">Domain sperren</string>
<string name="confirm_block">Bestätigen, um %s zu sperren</string>
<string name="confirm_block">Bestätigen, um %s zu blockieren</string>
<string name="do_block">Sperren</string>
<string name="confirm_unblock_title">Konto nicht mehr sperren</string>
<string name="confirm_unblock_domain_title">Domain nicht mehr blockieren</string>
<string name="confirm_unblock">Bestätigen, um Sperre von %s aufzuheben</string>
<string name="do_unblock">Sperre aufheben</string>
<string name="confirm_unblock">Bestätigen, um %s nicht mehr zu blockieren</string>
<string name="do_unblock">Nicht mehr blockieren</string>
<string name="button_blocked">Blockiert</string>
<string name="action_vote">Abstimmen</string>
<string name="delete">Löschen</string>
<string name="confirm_delete_title">Beitrag löschen</string>
<string name="confirm_delete">Bist du dir sicher, dass du diesen Beitrag löschen möchtest?</string>
<string name="deleting">Wird gelöscht…</string>
<string name="notification_channel_audio_player">Audiowiedergabe</string>
<string name="play">Abspielen</string>
<string name="pause">Pausieren</string>
<string name="log_out">Abmelden</string>
<string name="add_account">Konto hinzufügen</string>
<string name="search_hint">Suchen</string>
<string name="hashtags">Hashtags</string>
<string name="news">Nachrichten</string>
<string name="for_you">Vorschläge</string>
<string name="all_notifications">Alles</string>
<string name="mentions">Erwähnungen</string>
<plurals name="x_people_talking">
<item quantity="one">%d Person redet darüber</item>
<item quantity="other">%d Personen reden darüber</item>
</plurals>
<string name="report_title">%s melden</string>
<string name="report_choose_reason">Was stimmt mit diesem Beitrag nicht?</string>
<string name="report_choose_reason_account">Was stimmt mit %s nicht?</string>
<string name="report_choose_reason_subtitle">Bitte das Bestmögliche auswählen</string>
<string name="report_reason_personal">Mir gefällt das nicht</string>
<string name="report_reason_personal_subtitle">Das ist nichts, was du sehen möchtest</string>
<string name="report_reason_spam">Das ist Spam</string>
<string name="report_reason_spam_subtitle">Bösartige Links, vorgetäuschtes Verhalten oder wiederholtes Antworten</string>
<string name="report_reason_violation">Es verstößt gegen Serverregeln</string>
<string name="report_reason_violation_subtitle">Du bist dir bewusst, dass dies gegen die Serverregeln verstößt</string>
<string name="report_reason_other">Das ist was anderes</string>
<string name="report_reason_other_subtitle">Der Vorfall passt zu keiner dieser Kategorien</string>
<string name="report_choose_rule">Gegen welche Regeln wird verstoßen?</string>
<string name="report_choose_rule_subtitle">Alles Zutreffende auswählen</string>
@@ -124,9 +143,15 @@
<string name="report_choose_posts_subtitle">Alles Zutreffende auswählen</string>
<string name="report_comment_title">Gibt es weitere Anmerkungen, von denen wir wissen sollten?</string>
<string name="report_comment_hint">Ergänzende Hinweise</string>
<string name="sending_report">Meldung wird verschickt …</string>
<string name="sending_report">Meldung wird gesendet …</string>
<string name="report_sent_title">Danke für deine Meldung, wir werden uns damit beschäftigen.</string>
<string name="report_sent_subtitle">Während wir den Vorfall überprüfen, kannst du gegen %s weitere Maßnahmen ergreifen:</string>
<string name="unfollow_user">%s entfolgen</string>
<string name="unfollow">Entfolgen</string>
<string name="mute_user_explain">Du wirst die Beiträge vom Konto nicht mehr sehen. Das Konto kann dir immer noch folgen, und die Person hinter dem Konto wird deine Beiträge sehen können und nicht wissen, dass du sie stummgeschaltet hast.</string>
<string name="block_user_explain">Dir wird es nicht länger möglich sein, die Beiträge dieses Konto zu sehen. Das blockierte Profil wird nicht mehr in der Lage sein, deine Beiträge zu sehen oder dir zu folgen. Die Person hinter dem Konto wird mitbekommen, dass du ihr Konto blockiert hast.</string>
<string name="report_personal_title">Du willst das nicht mehr sehen?</string>
<string name="report_personal_subtitle">Das sind deine Möglichkeiten zu bestimmen, was du auf Mastodon sehen möchtest:</string>
<string name="back">Zurück</string>
<string name="search_communities">Servername oder -adresse</string>
<string name="instance_rules_title">Server-Regeln</string>
@@ -153,14 +178,19 @@
<string name="category_tech">Technik</string>
<string name="confirm_email_title">Überprüfe deinen Posteingang</string>
<!-- %s is the email address -->
<string name="confirm_email_subtitle">Bitte klicke auf den Link, den wir an %s geschickt haben, um dich zu verifizieren. Wir warten bis dahin einfach hier.</string>
<string name="confirm_email_didnt_get">Kein Link angekommen?</string>
<string name="resend">Erneut abschicken</string>
<string name="open_email_app">E-Mail-App öffnen</string>
<string name="resent_email">Bestätigung per E-Mail zugeschickt</string>
<string name="compose_hint">Tippe oder füge ein, was dir am Herzen liegt</string>
<string name="content_warning">Inhaltswarnung</string>
<string name="save">Speichern</string>
<string name="add_alt_text">Bildbeschreibung hinzufügen</string>
<string name="visibility_public">Öffentlich</string>
<string name="visibility_followers_only">Nur Follower</string>
<string name="visibility_private">Nur erwähnte Profile</string>
<string name="recent_searches">Verlauf</string>
<string name="skip">Überspringen</string>
<string name="notification_type_follow">Neue Follower</string>
<string name="notification_type_favorite">Favoriten</string>
@@ -169,8 +199,14 @@
<string name="notification_type_poll">Umfragen</string>
<string name="choose_account">Konto auswählen</string>
<string name="err_not_logged_in">Bitte zuerst in Mastodon anmelden</string>
<plurals name="cant_add_more_than_x_attachments">
<item quantity="one">Du kannst nicht mehr als %d Mediendatei anhängen</item>
<item quantity="other">Du kannst nicht mehr als %d Mediendateien anhängen</item>
</plurals>
<string name="media_attachment_unsupported_type">Dateityp von %s wird nicht unterstützt</string>
<string name="media_attachment_too_big">Datei %1$s überschreitet die maximale Größe von %2$s MB</string>
<string name="settings_theme">Erscheinungsbild</string>
<string name="theme_auto">Einstellungen des Geräts übernehmen</string>
<string name="theme_light">Hell</string>
<string name="theme_dark">Dunkel</string>
<string name="settings_behavior">Verhalten</string>
@@ -183,6 +219,9 @@
<string name="settings_clear_cache">Medien-Cache leeren</string>
<string name="settings_app_version">Mastodon für Android v%1$s (%2$d)</string>
<string name="media_cache_cleared">Medien-Cache geleert</string>
<string name="confirm_log_out">Von %s abmelden?</string>
<string name="sensitive_content_explain">Autor*in hat den Inhalt mit einer Inhaltswarnung versehen.</string>
<string name="avatar_description">Profil von %s aufrufen</string>
<string name="more_options">Weitere Einstellungen</string>
<string name="new_post">Neuer Beitrag</string>
<string name="button_reply">Antworten</string>
@@ -198,9 +237,10 @@
<string name="media_viewer">Medienanzeige</string>
<string name="follow_user">%s folgen</string>
<string name="unfollowed_user">%s entfolgt</string>
<string name="followed_user">Du folgst nun %s</string>
<string name="following_user_requested">Deine Follower-Anfrage an %s wurde gesendet</string>
<string name="open_in_browser">Im Browser öffnen</string>
<string name="hide_boosts_from_user">Geteilte Beiträge von %s verstecken</string>
<string name="hide_boosts_from_user">Geteilte Beiträge von %s ausblenden</string>
<string name="show_boosts_from_user">Geteilte Beiträge von %s anzeigen</string>
<string name="signup_reason">Warum möchtest du beitreten?</string>
<string name="signup_reason_note">Das erleichtert uns die Prüfung deiner Anmeldung.</string>
@@ -210,12 +250,18 @@
<string name="reorder">Neu sortieren</string>
<string name="download">Herunterladen</string>
<string name="permission_required">Berechtigung erforderlich</string>
<string name="storage_permission_to_download">Die App benötigt Zugriff auf den Speicher deines Gerätes, um diese Datei zu speichern.</string>
<string name="storage_permission_to_download">Die App benötigt Zugriff auf den Speicher deines Geräts, um diese Datei zu speichern.</string>
<string name="open_settings">Einstellungen öffnen</string>
<string name="error_saving_file">Fehler beim Speichern der Datei</string>
<string name="file_saved">Datei gespeichert</string>
<string name="downloading">wird heruntergeladen </string>
<string name="no_app_to_handle_action">Es gibt keine App, um diese Aktion auszuführen</string>
<string name="local_timeline">Lokal</string>
<string name="trending_posts_info_banner">Dies sind Beiträge, die auf deinem Mastodon-Server gerade angesagt sind.</string>
<string name="trending_links_info_banner">Dies sind die Nachrichten, über die auf Mastodon gesprochen wird.</string>
<!-- %s is the server domain -->
<string name="local_timeline_info_banner">Dies sind alle Beiträge von allen Benutzern auf deinem Server (%s).</string>
<string name="recommended_accounts_info_banner">Dir könnten diese Konten gefallen, basierend auf Leuten, denen du folgst.</string>
<string name="see_new_posts">Neue Beiträge anzeigen</string>
<string name="load_missing_posts">Weitere Beiträge laden</string>
<string name="follow_back">Zurückfolgen</string>
@@ -232,8 +278,8 @@
<item quantity="other">%,d folge ich</item>
</plurals>
<plurals name="x_favorites">
<item quantity="one">%,d × favorisiert</item>
<item quantity="other">%,d × favorisiert</item>
<item quantity="one">einmal favorisiert</item>
<item quantity="other">%,d-mal favorisiert</item>
</plurals>
<plurals name="x_reblogs">
<item quantity="one">%,d geteilter Beitrag</item>
@@ -286,13 +332,14 @@
<string name="empty_list">Diese Liste ist leer</string>
<string name="instance_signup_closed">Dieser Server akzeptiert keine neuen Registrierungen.</string>
<string name="text_copied">In die Zwischenablage kopiert</string>
<string name="add_bookmark">Lesezeichen hinzufügen</string>
<string name="add_bookmark">Lesezeichen setzen</string>
<string name="remove_bookmark">Lesezeichen entfernen</string>
<string name="bookmarks">Lesezeichen</string>
<string name="your_favorites">Deine Favoriten</string>
<string name="login_title">Willkommen zurück</string>
<string name="login_subtitle">Melde dich mit dem Server an, auf dem du dein Konto erstellt hast.</string>
<string name="server_url">Serveradresse</string>
<string name="signup_random_server_explain">Wenn du fortfährst, ohne eine Auswahl zu treffen, wird ein Server auf der Grundlage deiner Sprache ausgewählt.</string>
<string name="server_filter_any_language">Alle Sprachen</string>
<string name="server_filter_instant_signup">Schnellregistrierung</string>
<string name="server_filter_manual_review">Manuelle Überprüfung</string>
@@ -305,6 +352,7 @@
<string name="server_filter_region_oceania">Ozeanien</string>
<string name="not_accepting_new_members">Keine Aufnahme neuer Mitglieder</string>
<string name="category_special_interests">Besondere Interessen</string>
<string name="signup_passwords_dont_match">Passwörter stimmen nicht überein</string>
<string name="pick_server_for_me">Wähle für mich aus</string>
<string name="profile_add_row">Zeile hinzufügen</string>
<string name="profile_setup">Profil einrichten</string>
@@ -313,12 +361,14 @@
<string name="popular_on_mastodon">Beliebt auf Mastodon</string>
<string name="follow_all">Allen folgen</string>
<string name="server_rules_disagree">Ablehnen</string>
<string name="privacy_policy_explanation">TL;DR: Wir sammeln oder verarbeiten nichts.</string>
<!-- %s is server domain -->
<string name="server_policy_disagree">%s nicht zustimmen</string>
<string name="profile_bio">Über mich</string>
<!-- Shown in a progress dialog when you tap "follow all" -->
<string name="sending_follows">Benutzer*innen wird gefolgt …</string>
<!-- %1$s is server domain, %2$s is email domain. You can reorder these placeholders to fit your language better. -->
<string name="signup_email_domain_blocked">%1$s lässt keine Anmeldungen von %2$s zu. Versuche eine andere E-Mailadresse oder &lt;a&gt;wähle einen anderen Server&lt;/a&gt;.</string>
<string name="spoiler_show">Trotzdem anzeigen</string>
<string name="spoiler_hide">Wieder verstecken</string>
<string name="poll_multiple_choice">Wähle ein/e oder mehrere aus</string>
@@ -337,16 +387,200 @@
<string name="welcome_to_mastodon">Willkommen auf Mastodon</string>
<string name="welcome_paragraph1">Mastodon ist ein dezentrales, soziales Netzwerk. Das bedeutet, dass es nicht von einem einzigen Unternehmen kontrolliert wird. Das Netzwerk besteht aus unabhängig voneinander betriebenen Servern, die miteinander verbunden sind.</string>
<string name="what_are_servers">Was sind Server?</string>
<string name="welcome_paragraph2"><![CDATA[Jedes Mastodon-Konto wird auf einem Server gehostet. Jeder Server hat dabei seine eigenen Werte, Regeln und Administrator*innen. Aber egal, für welchen Server Du Dich entscheidest: Du kannst mit Leuten von anderen Servern interagieren und ihnen folgen.]]></string>
<string name="opening_link">Link wird geöffnet…</string>
<string name="link_not_supported">Dieser Link wird in der App nicht unterstützt</string>
<string name="log_out_all_accounts">Von allen Konten abmelden</string>
<string name="confirm_log_out_all_accounts">Von allen Konten abmelden?</string>
<string name="retry">Erneut versuchen</string>
<string name="post_failed">Senden des Beitrags fehlgeschlagen</string>
<!-- %s is formatted file size ("467 KB image") -->
<string name="attachment_description_image">%s Bild</string>
<string name="attachment_description_video">%s Video</string>
<string name="attachment_description_audio">%s Audiodatei</string>
<string name="attachment_description_unknown">%s Datei</string>
<string name="attachment_type_image">Bild</string>
<string name="attachment_type_video">Video</string>
<string name="attachment_type_audio">Audiodatei</string>
<string name="attachment_type_gif">GIF</string>
<string name="attachment_type_unknown">Datei</string>
<string name="attachment_x_percent_uploaded">%d%% hochgeladen</string>
<string name="add_poll_option">Umfrageoption hinzufügen</string>
<string name="poll_length">Umfragelänge</string>
<string name="poll_style">Stil</string>
<string name="compose_poll_single_choice">Wähle eins</string>
<string name="compose_poll_multiple_choice">Multiple Choice</string>
<string name="delete_poll_option">Umfrageoption löschen</string>
<string name="poll_style_title">Umfragestil</string>
<string name="alt_text">Alt-Text</string>
<string name="help">Hilfe</string>
<string name="what_is_alt_text">Was ist Alt-Text?</string>
<string name="alt_text_help">Alt Text bietet Bildbeschreibungen für Personen mit Sehbehinderungen, Verbindungen mit niedriger Bandbreite oder solche, die einen zusätzlichen Kontext suchen.\n\nDu kannst die Zugänglichkeit und das Verständnis für alle verbessern, indem du klaren, präzisen und objektiven Alt-Text schreibst.\n\n<ul><li>Wichtige Elemente erfassen</li>\n<li>Zusammenfassung des Textes in Bildern</li>\n<li>Reguläre Satzstrukturen nutzen</li>\n<li>Vermeide redundante Informationen</li>\n<li>Fokussiere dich auf Trends und Schlüsselfeststellungen in komplexen Darstellungen (wie Diagramme oder Karten)</li></ul></string>
<string name="edit_post">Beitrag bearbeiten</string>
<string name="no_verified_link">Kein bestätigter Link</string>
<string name="compose_autocomplete_emoji_empty">Emoji durchsuchen</string>
<string name="compose_autocomplete_users_empty">Finde das, wonach du suchst</string>
<string name="no_search_results">Nichts zu diesen Suchbegriffen gefunden</string>
<string name="language">Sprache</string>
<string name="language_default">Standard</string>
<string name="language_system">System</string>
<string name="language_detecting">Sprache erkennen</string>
<string name="language_cant_detect">Sprache nicht erkannt</string>
<string name="language_detected">Erkannt</string>
<string name="media_hidden">Medien versteckt</string>
<string name="post_hidden">Beitrag ausgeblendet</string>
<string name="report_title_post">Beitrag melden</string>
<string name="forward_report_explanation">Dieses Konto gehört zu einem anderen Server. Soll eine anonymisierte Kopie der Meldung auch dorthin geschickt werden?</string>
<!-- %s is the server domain -->
<string name="forward_report_to_server">Weiterleiten an %s</string>
<!-- Shown on the "stamp" on the screen that appears after you report a post/user. Please keep the translation short, preferably a single word -->
<string name="reported">Gemeldet</string>
<string name="report_unfollow_explanation">Damit du die Beiträge nicht mehr auf deiner Startseite findest, solltest du dieser Person entfolgen.</string>
<string name="muted_user">%s stummgeschaltet</string>
<string name="report_sent_already_blocked">Du hast diesen Benutzer bereits blockiert, sodass du nichts anderes tun musst, während wir deine Meldung überprüfen.</string>
<string name="report_personal_already_blocked">Du hast diesen Benutzer bereits geblockt, also musst du nichts anderes tun.\n\nDanke, dass du Mastodon geholfen hast, ein noch sicherer Ort für alle zu werden!</string>
<string name="blocked_user">%s blockiert</string>
<string name="mark_all_notifications_read">Alle als gelesen markieren</string>
<string name="settings_display">Darstellung</string>
<string name="settings_filters">Filter</string>
<string name="settings_server_explanation">Übersicht, Regeln, Moderatoren</string>
<!-- %s is the app name (Mastodon, key app_name). I made it a placeholder so everything Just Works™ with forks -->
<string name="about_app">Über %s</string>
<string name="default_post_language">Standard-Beitragssprache</string>
<string name="settings_alt_text_reminders">Erinnerung für Alt-Text anzeigen</string>
<string name="settings_confirm_unfollow">Fragen bevor du jemanden entfolgst</string>
<string name="settings_confirm_boost">Fragen bevor ein Beitrag geteilt wird</string>
<string name="settings_confirm_delete_post">Fragen bevor ein Beitrag gelöscht wird</string>
<string name="pause_all_notifications">Alle pausieren</string>
<string name="pause_notifications_off">Aus</string>
<string name="notifications_policy_anyone">Jeder</string>
<string name="notifications_policy_followed">Leute, die dir folgen</string>
<string name="notifications_policy_follower">Leute, denen ich folge</string>
<string name="notifications_policy_no_one">Niemandem</string>
<string name="settings_notifications_policy">Erhalte Benachrichtigungen von</string>
<string name="notification_type_mentions_and_replies">Erwähnungen und Antworten</string>
<string name="pause_all_notifications_title">Alle Benachrichtigungen pausieren</string>
<plurals name="x_weeks">
<item quantity="one">%d Woche</item>
<item quantity="other">%d Wochen</item>
</plurals>
<!-- %1$s is the date (may be relative, e.g. "today" or "yesterday"), %2$s is the time. You can reorder these placeholders if that works better for your language -->
<string name="date_at_time">%1$s am %2$s</string>
<string name="today">heute</string>
<string name="yesterday">gestern</string>
<string name="tomorrow">morgen</string>
<!-- %s is the timestamp ("tomorrow at 12:34") -->
<string name="pause_notifications_ends">Endet %s</string>
<!-- %s is the timestamp ("tomorrow at 12:34") -->
<string name="pause_notifications_banner">Benachrichtigungen werden %s fortgesetzt.</string>
<string name="resume_notifications_now">Jetzt fortsetzen</string>
<string name="open_system_notification_settings">Gehe zu Benachrichtigungseinstellungen</string>
<string name="about_server">Über</string>
<string name="server_rules">Regeln</string>
<string name="server_administrator">Administrator*in</string>
<string name="send_email_to_server_admin">Administrator anschreiben</string>
<string name="notifications_disabled_in_system">Schalte Benachrichtigungen in den Geräteeinstellungen ein, um Aktualisierungen von überall zu sehen.</string>
<string name="settings_even_more">Viel mehr Einstellungen</string>
<string name="settings_show_cws">Inhaltswarnung anzeigen</string>
<string name="settings_hide_sensitive_media">Medien mit Inhaltswarnung ausblenden</string>
<string name="settings_show_interaction_counts">Anzahl der Post-Interaktionen</string>
<string name="settings_show_emoji_in_names">Benutzerdefinierte Emoji in Anzeigenamen</string>
<plurals name="in_x_seconds">
<item quantity="one">in %d Sekunde</item>
<item quantity="other">in %d Sekunden</item>
</plurals>
<plurals name="in_x_minutes">
<item quantity="one">in %d Minute</item>
<item quantity="other">in %d Minuten</item>
</plurals>
<plurals name="in_x_hours">
<item quantity="one">in %d Stunde</item>
<item quantity="other">in %d Stunden</item>
</plurals>
<plurals name="x_hours_ago">
<item quantity="one">vor %d Stunde</item>
<item quantity="other">vor %d Stunden</item>
</plurals>
<string name="alt_text_reminder_title">Vor fehlendem Alt-Text warnen</string>
<plurals name="alt_text_reminder_x_images">
<item quantity="one">%s deiner Bilder fehlt der Alt-Text. Wirklich senden?</item>
<item quantity="other">%s deiner Bilder fehlt der Alt-Text. Wirklich senden?</item>
</plurals>
<plurals name="alt_text_reminder_x_attachments">
<item quantity="one">%s deiner Medienanhänge fehlt der Alt-Text. Wirklich senden?</item>
<item quantity="other">%s deiner Medienanhänge fehlt der Alt-Text. Wirklich senden?</item>
</plurals>
<string name="count_one">Eins</string>
<string name="count_two">Zwei</string>
<string name="count_three">Drei</string>
<string name="count_four">Vier</string>
<string name="alt_text_reminder_post_anyway">Senden</string>
<!-- %s is the username -->
<string name="unfollow_confirmation">%s entfolgen?</string>
<string name="filter_active">Aktiv</string>
<string name="filter_inactive">Inaktiv</string>
<string name="settings_add_filter">Filter hinzufügen</string>
<string name="settings_edit_filter">Filter bearbeiten</string>
<string name="settings_filter_duration">Dauer</string>
<string name="settings_filter_muted_words">Stummgeschaltete Wörter</string>
<string name="settings_filter_context">Stumm von</string>
<string name="settings_filter_show_cw">Inhaltswarnung anzeigen</string>
<string name="settings_filter_show_cw_explanation">Beiträge anzeigen, die zu diesem Filter passen, aber hinter einer Inhaltswarnung</string>
<string name="settings_delete_filter">Filter löschen</string>
<string name="filter_duration_forever">Für immer</string>
<!-- %s is the timestamp ("tomorrow at 12:34") -->
<string name="settings_filter_ends">Endet %s</string>
<plurals name="settings_x_muted_words">
<item quantity="one">%d stummgeschaltetes Wort oder Phrase</item>
<item quantity="other">%d stummgeschaltete Wörter oder Phrasen</item>
</plurals>
<string name="selection_2_options">%1$s und %2$s</string>
<string name="selection_3_options">%1$s, %2$s, und %3$s</string>
<string name="selection_4_or_more">%1$s, %2$s und %3$d mehr</string>
<string name="filter_context_home_lists">Startseite &amp; Listen</string>
<string name="filter_context_notifications">Mitteilungen</string>
<string name="filter_context_public_timelines">Öffentliche Timelines</string>
<string name="filter_context_threads_replies">Threads &amp; Beiträge</string>
<string name="filter_context_profiles">Profile</string>
<string name="settings_filter_title">Titel</string>
<string name="settings_delete_filter_title">Filter \"%s\" löschen?</string>
<string name="settings_delete_filter_confirmation">Dieser Filter wird von deinem Konto auf all deinen Geräten gelöscht.</string>
<string name="add_muted_word">Stummgeschaltetes Wort hinzufügen</string>
<string name="edit_muted_word">Stummgeschaltetes Wort bearbeiten</string>
<string name="add">Hinzufügen</string>
<string name="filter_word_or_phrase">Wort oder Phrase</string>
<string name="filter_add_word_help">Bei diesen Wörtern ist die Groß- und Kleinschreibung egal und es werden nur vollständige Wörter überprüft.\n\nWenn du das Stichwort „Apfel“ filterst, wird es Beiträge verstecken, die „apfel“ oder „aPfel“ enthalten, aber nicht „Anapapfel.“</string>
<string name="settings_delete_filter_word">Wort \"%s\" löschen?</string>
<string name="enter_selection_mode">Auswählen</string>
<string name="select_all">Alles auswählen</string>
<string name="settings_filter_duration_title">Filterdauer</string>
<string name="filter_duration_custom">Benutzerdefiniert</string>
<plurals name="settings_delete_x_filter_words">
<item quantity="one">Wort %d löschen?</item>
<item quantity="other">Wörter %d löschen?</item>
</plurals>
<plurals name="x_items_selected">
<item quantity="one">%d ausgewählt</item>
<item quantity="other">%d ausgewählt</item>
</plurals>
<string name="required_form_field_blank">Kann nicht leer sein</string>
<string name="filter_word_already_in_list">Bereits in der Liste</string>
<string name="app_update_ready">App-Update bereit</string>
<string name="app_update_version">Version %s</string>
<string name="downloading_update">Wird heruntergeladen (%d%%)</string>
<!-- Shown like a content warning, %s is the name of the filter -->
<string name="post_matches_filter_x">Hinter Filter für \"%s\"</string>
<string name="search_mastodon">Mastodon durchsuchen</string>
<string name="clear_all">Alles löschen</string>
<string name="search_open_url">URL in Mastodon öffnen</string>
<string name="posts_matching_hashtag">Beiträge mit \"%s\"</string>
<string name="search_go_to_account">Gehe zu %s</string>
<string name="posts_matching_string">Beiträge mit \"%s\"</string>
<string name="accounts_matching_string">Personen mit \"%s\"</string>
<!-- Shown in the post header. Please keep it short -->
<string name="time_seconds_ago_short">vor %d Sekunden</string>
<string name="time_minutes_ago_short">vor %d Minuten</string>
<string name="time_hours_ago_short">vor %d Stunden</string>
<string name="time_days_ago_short">vor %d Tagen</string>
<!-- %s is the name of the post language -->
<!-- %1$s is the language, %2$s is the name of the translation service -->
</resources>

View File

@@ -4,12 +4,18 @@
<string name="next">Επόμενο</string>
<string name="loading_instance">Ανάκτηση πληροφοριών διακομιστή…</string>
<string name="error">Σφάλμα</string>
<string name="not_a_mastodon_instance">Το %s δε φαίνεται να είναι διακομιστής Mastodon.</string>
<string name="ok">ΟΚ</string>
<string name="preparing_auth">Προετοιμασία για έλεγχο ταυτότητας…</string>
<string name="finishing_auth">Ολοκλήρωση ταυτοποίησης…</string>
<string name="user_boosted">Ο χρήστης %s ενίσχυσε</string>
<string name="in_reply_to">Σε απάντηση στο %s</string>
<string name="notifications">Ειδοποιήσεις</string>
<string name="user_followed_you">%s σε ακολούθησε</string>
<string name="user_sent_follow_request">%s σού έστειλε ένα αίτημα ακολούθησης</string>
<string name="user_favorited">%s σημείωσε ως αγαπημένη την ανάρτησή σου</string>
<string name="notification_boosted">%s ενίσχυσε την ανάρτηση σου</string>
<string name="poll_ended">Δες τα αποτελέσματα μιας δημοσκόπησης στην οποία ψήφισες</string>
<string name="share_toot_title">Κοινοποίηση</string>
<string name="settings">Ρυθμίσεις</string>
<string name="publish">Δημοσίευση</string>
@@ -22,7 +28,7 @@
</plurals>
<plurals name="following">
<item quantity="one">ακολουθεί</item>
<item quantity="other">ακολουθούν</item>
<item quantity="other">ακολουθεί</item>
</plurals>
<string name="posts">Αναρτήσεις</string>
<string name="posts_and_replies">Αναρτήσεις και Απαντήσεις</string>
@@ -31,6 +37,7 @@
<string name="button_follow">Ακολούθησε</string>
<string name="button_following">Ακολουθείς</string>
<string name="edit_profile">Επεξεργασία Προφίλ</string>
<string name="share_user">Κοινοποίηση προφίλ</string>
<string name="mute_user">Σίγαση %s</string>
<string name="unmute_user">Κατάργηση σίγασης %s</string>
<string name="block_user">Αποκλεισμός %s</string>
@@ -78,6 +85,10 @@
<item quantity="one">Απομένει %d ημέρα</item>
<item quantity="other">απομένουν %d ημέρες</item>
</plurals>
<plurals name="x_votes">
<item quantity="one">%,d ψήφος</item>
<item quantity="other">%,d ψήφοι</item>
</plurals>
<string name="poll_closed">Κλειστό</string>
<string name="confirm_mute_title">Σίγαση Λογαριασμού</string>
<string name="confirm_mute">Επιβεβαίωσε για σίγαση %s</string>
@@ -96,27 +107,35 @@
<string name="button_blocked">Αποκλείστηκε</string>
<string name="action_vote">Ψήφισε</string>
<string name="delete">Διαγραφή</string>
<string name="confirm_delete_title">Διαγραφή ανάρτησης</string>
<string name="confirm_delete">Είσαι βέβαιος ότι θες να διαγράψεις την ανάρτηση;</string>
<string name="deleting">Διαγραφή…</string>
<string name="notification_channel_audio_player">Αναπαραγωγή ήχου</string>
<string name="play">Αναπαραγωγή</string>
<string name="pause">Παύση</string>
<string name="log_out">Αποσύνδεση</string>
<string name="add_account">Προσθήκη λογαριασμού</string>
<string name="search_hint">Αναζήτηση</string>
<string name="hashtags">Ετικέτες</string>
<string name="news">Ειδήσεις</string>
<string name="for_you">Για σένα</string>
<string name="all_notifications">Όλες</string>
<string name="mentions">Επισημάνσεις</string>
<plurals name="x_people_talking">
<item quantity="one">%d άτομο μιλάει</item>
<item quantity="other">%d άτομα μιλάνε</item>
</plurals>
<string name="report_title">Αναφορά %s</string>
<string name="report_choose_reason">Τι πάει στραβά με αυτή την ανάρτηση;</string>
<string name="report_choose_reason_account">Τι πάει στραβά με τον/την %s;</string>
<string name="report_choose_reason_subtitle">Διάλεξε την καλύτερη αντιστοίχιση</string>
<string name="report_reason_personal">Δεν μου αρέσει</string>
<string name="report_reason_personal_subtitle">Δεν είναι κάτι που θα ήθελες να δεις</string>
<string name="report_reason_spam">Είναι σπαμ</string>
<string name="report_reason_spam_subtitle">Κακόβουλοι σύνδεσμοι, πλαστή αλληλεπίδραση ή επαναλαμβανόμενες απαντήσεις</string>
<string name="report_reason_violation">Παραβαίνει τους κανόνες του διακομιστή</string>
<string name="report_reason_violation_subtitle">Γνωρίζεις ότι παραβιάζει συγκεκριμένους κανόνες</string>
<string name="report_reason_other">Κάτι άλλο</string>
<string name="report_reason_other_subtitle">Το ζήτημα δεν ταιριάζει σε άλλες κατηγορίες</string>
<string name="report_choose_rule">Ποιοι κανόνες παραβιάζονται;</string>
<string name="report_choose_rule_subtitle">Επίλεξε όλα όσα ισχύουν</string>
@@ -125,8 +144,14 @@
<string name="report_comment_title">Υπάρχει κάτι άλλο που πρέπει να γνωρίζουμε;</string>
<string name="report_comment_hint">Επιπρόσθετα σχόλια</string>
<string name="sending_report">Αποστολή αναφοράς…</string>
<string name="report_sent_title">Σε ευχαριστούμε για την αναφορά, θα το διερευνήσουμε.</string>
<string name="report_sent_subtitle">Ενώ το εξετάζουμε, μπορείς να δράσεις εναντίον του %s:</string>
<string name="unfollow_user">Κατάργηση ακολούθησης του %s</string>
<string name="unfollow">Άρση ακολούθησης</string>
<string name="mute_user_explain">Δεν θα βλέπεις τις αναρτήσεις του. Εκείνος μπορεί ακόμα να σε ακολουθεί και να βλέπει τις αναρτήσεις σου χωρίς να γνωρίζει ότι είναι σε σίγαση.</string>
<string name="block_user_explain">Δε θα βλέπεις τις αναρτήσεις του. Δε θα μπορεί να δει τις αναρτήσεις σου ή να σε ακολουθήσει. Θα μπορεί να δει ότι έχει αποκλειστεί.</string>
<string name="report_personal_title">Δε θες να το βλέπεις;</string>
<string name="report_personal_subtitle">Αυτές είναι οι επιλογές σου για να ελέγχεις τί βλέπεις στο Mastodon:</string>
<string name="back">Πίσω</string>
<string name="search_communities">Όνομα διακομιστή ή διεύθυνση URL</string>
<string name="instance_rules_title">Κανόνες Διακομιστή</string>
@@ -153,14 +178,19 @@
<string name="category_tech">Τεχνολογία</string>
<string name="confirm_email_title">Έλεγξε τα Εισερχόμενα σου</string>
<!-- %s is the email address -->
<string name="confirm_email_subtitle">Πάτησε το σύνδεσμο που σού στείλαμε για να επαληθεύσεις το %s. Θα σε περιμένουμε εδώ.</string>
<string name="confirm_email_didnt_get">Δεν έλαβες τον σύνδεσμο;</string>
<string name="resend">Επαναποστολή</string>
<string name="open_email_app">Άνοιγμα εφαρμογής email</string>
<string name="resent_email">Το email επιβεβαίωσης εστάλη</string>
<string name="compose_hint">Πληκτρολόγησε ή επικόλλησε τί έχεις στο μυαλό σου</string>
<string name="content_warning">Προειδοποίηση περιεχομένου</string>
<string name="save">Αποθήκευση</string>
<string name="add_alt_text">Προσθήκη εναλλακτικού κειμένου</string>
<string name="visibility_public">Δημόσιο</string>
<string name="visibility_followers_only">Μόνο ακόλουθοι</string>
<string name="visibility_private">Μόνο άτομα που επισημαίνω</string>
<string name="recent_searches">Πρόσφατα</string>
<string name="skip">Παράλειψη</string>
<string name="notification_type_follow">Νέοι ακόλουθοι</string>
<string name="notification_type_favorite">Αγαπημένα</string>
@@ -169,8 +199,14 @@
<string name="notification_type_poll">Δημοσκοπήσεις</string>
<string name="choose_account">Επιλογή λογαριασμού</string>
<string name="err_not_logged_in">Παρακαλώ συνδέσου πρώτα στο Mastodon</string>
<plurals name="cant_add_more_than_x_attachments">
<item quantity="one">Δεν μπορείς να προσθέσεις περισσότερα από %d συνημμένο πολυμέσων</item>
<item quantity="other">Δεν μπορείς να προσθέσεις περισσότερα από %d συνημμένα πολυμέσων</item>
</plurals>
<string name="media_attachment_unsupported_type">Το αρχείο %s είναι μη υποστηριζόμενου τύπου</string>
<string name="media_attachment_too_big">Το αρχείο %1$s υπερβαίνει το όριο μεγέθους των %2$s MB</string>
<string name="settings_theme">Εμφάνιση</string>
<string name="theme_auto">Χρήση εμφάνισης συσκευής</string>
<string name="theme_light">Φωτεινό</string>
<string name="theme_dark">Σκοτεινό</string>
<string name="settings_behavior">Συμπεριφορά</string>
@@ -183,6 +219,9 @@
<string name="settings_clear_cache">Εκκαθάριση προσωρινής μνήμης πολυμέσων</string>
<string name="settings_app_version">Mastodon για Android v%1$s (%2$d)</string>
<string name="media_cache_cleared">Η προσωρινή μνήμη πολυμέσων καθαρίστηκε</string>
<string name="confirm_log_out">Αποσύνδεση από %s;</string>
<string name="sensitive_content_explain">Ο συντάκτης επισήμανε αυτό το πολυμέσο ως ευαίσθητο.</string>
<string name="avatar_description">Μετάβαση στο προφίλ του %s</string>
<string name="more_options">Περισσότερες επιλογές</string>
<string name="new_post">Νέα ανάρτηση</string>
<string name="button_reply">Απάντηση</string>
@@ -198,6 +237,7 @@
<string name="media_viewer">Αναπαραγωγέας πολυμέσων</string>
<string name="follow_user">Ακολούθησε %s</string>
<string name="unfollowed_user">Κατάργηση ακολούθησης του %s</string>
<string name="followed_user">Ακολουθείς πλέον τον/την %s</string>
<string name="following_user_requested">Έγινε αίτημα ακολούθησης του/της %s</string>
<string name="open_in_browser">Άνοιξε στον περιηγητή</string>
<string name="hide_boosts_from_user">Απόκρυψη ενισχύσεων από @%s</string>
@@ -215,7 +255,13 @@
<string name="error_saving_file">Σφάλμα αποθήκευσης αρχείου</string>
<string name="file_saved">Το αρχείο αποθηκεύτηκε</string>
<string name="downloading">Λήψη…</string>
<string name="no_app_to_handle_action">Δεν υπάρχει εφαρμογή για να χειριστεί αυτήν την ενέργεια</string>
<string name="local_timeline">Τοπική</string>
<string name="trending_posts_info_banner">Αναρτήσεις που κερδίζουν την προσοχή σε όλο το Mastodon.</string>
<string name="trending_links_info_banner">Οι ειδήσεις που συζητούνται στο Mastodon.</string>
<!-- %s is the server domain -->
<string name="local_timeline_info_banner">Αυτές είναι όλες οι αναρτήσεις από όλους τους χρήστες στο διακομιστή σου (%s).</string>
<string name="recommended_accounts_info_banner">Μπορεί να σου αρέσουν αυτοί οι λογαριασμοί με βάση άλλους που ακολουθείς.</string>
<string name="see_new_posts">Δες νέες αναρτήσεις</string>
<string name="load_missing_posts">Φόρτωση αναρτήσεων που λείπουν</string>
<string name="follow_back">Ακολούθησε και εσύ</string>
@@ -252,7 +298,7 @@
<item quantity="one">%d λεπτό πριν</item>
<item quantity="other">%d λεπτά πριν</item>
</plurals>
<string name="edited_timestamp">επεξεργάστηκε στις %s</string>
<string name="edited_timestamp">επεξεργάστηκε %s</string>
<string name="edit_original_post">Αρχική ανάρτηση</string>
<string name="edit_text_edited">Το κείμενο επεξεργάστηκε</string>
<string name="edit_spoiler_added">Προστέθηκε προειδοποίηση περιεχομένου</string>
@@ -293,6 +339,7 @@
<string name="login_title">Καλώς Ήρθες Ξανά</string>
<string name="login_subtitle">Συνδέσου με τον διακομιστή όπου δημιούργησες τον λογαριασμό σου.</string>
<string name="server_url">URL διακομιστή</string>
<string name="signup_random_server_explain">Θα επιλέξουμε έναν διακομιστή με βάση τη γλώσσα σου αν συνεχίσεις χωρίς να κάνεις κάποια επιλογή.</string>
<string name="server_filter_any_language">Οποιαδήποτε Γλώσσα</string>
<string name="server_filter_instant_signup">Άμεση Εγγραφή</string>
<string name="server_filter_manual_review">Χειροκίνητη Αξιολόγηση</string>
@@ -305,6 +352,7 @@
<string name="server_filter_region_oceania">Oceania</string>
<string name="not_accepting_new_members">Δεν δέχεται νέα μέλη</string>
<string name="category_special_interests">Ειδικά Ενδιαφέροντα</string>
<string name="signup_passwords_dont_match">Οι κωδικοί πρόσβασης δεν ταιριάζουν</string>
<string name="pick_server_for_me">Διάλεξε για μένα</string>
<string name="profile_add_row">Προσθήκη γραμμής</string>
<string name="profile_setup">Ρύθμιση προφίλ</string>
@@ -313,12 +361,14 @@
<string name="popular_on_mastodon">Δημοφιλή στο Mastodon</string>
<string name="follow_all">Ακολούθησε όλους</string>
<string name="server_rules_disagree">Διαφωνώ</string>
<string name="privacy_policy_explanation">Σύνοψη: Δεν συλλέγουμε ή επεξεργαζόμαστε τίποτα.</string>
<!-- %s is server domain -->
<string name="server_policy_disagree">Διαφωνώ με %s</string>
<string name="profile_bio">Βιογραφικό</string>
<!-- Shown in a progress dialog when you tap "follow all" -->
<string name="sending_follows">Ακολούθηση χρηστών…</string>
<!-- %1$s is server domain, %2$s is email domain. You can reorder these placeholders to fit your language better. -->
<string name="signup_email_domain_blocked">Ο %1$s δεν επιτρέπει εγγραφές από τον %2$s. Δοκίμασε κάποιον άλλο ή &lt;a&gt; διάλεξε έναν διαφορετικό διακομιστή&lt;/a&gt;.</string>
<string name="spoiler_show">Εμφάνιση ούτως ή άλλως</string>
<string name="spoiler_hide">Απόκρυψη ξανά</string>
<string name="poll_multiple_choice">Επίλεξε ένα ή περισσότερα</string>
@@ -337,16 +387,216 @@
<string name="welcome_to_mastodon">Καλώς ήρθες στο Mastodon</string>
<string name="welcome_paragraph1">Το Mastodon είναι ένα αποκεντρωμένο κοινωνικό δίκτυο που σημαίνει ότι καμία εταιρεία δεν το ελέγχει. Αποτελείται από πολλούς ανεξάρτητους διακομιστές, όλοι συνδεδεμένοι μαζί.</string>
<string name="what_are_servers">Τι είναι οι διακομιστές;</string>
<string name="welcome_paragraph2"><![CDATA[Κάθε λογαριασμός Mastodon φιλοξενείται σε ένα διακομιστή - ο καθένας με τις δικές του αξίες, κανόνες και διαχειριστές. Ανεξάρτητα από το ποιον μπορεί να επιλέξεις, μπορείς να ακολουθήσεις και να αλληλεπιδράσεις με άτομα από οποιονδήποτε διακομιστή.]]></string>
<string name="welcome_paragraph2">Κάθε λογαριασμός Mastodon φιλοξενείται σε ένα διακομιστή - ο καθένας με τις δικές του αξίες, κανόνες &amp; διαχειριστές. Ανεξάρτητα από το ποιον μπορεί να επιλέξεις, μπορείς να ακολουθήσεις και να αλληλεπιδράσεις με άτομα από οποιονδήποτε διακομιστή.</string>
<string name="opening_link">Άνοιγμα συνδέσμου…</string>
<string name="link_not_supported">Αυτός ο σύνδεσμος δεν υποστηρίζεται στην εφαρμογή</string>
<string name="log_out_all_accounts">Αποσύνδεση από όλους τους λογαριασμούς</string>
<string name="confirm_log_out_all_accounts">Αποσύνδεση από όλους τους λογαριασμούς;</string>
<string name="retry">Επανάληψη</string>
<string name="post_failed">Αποτυχία αποστολής ανάρτησης</string>
<!-- %s is formatted file size ("467 KB image") -->
<string name="attachment_description_image">%s εικόνα</string>
<string name="attachment_description_video">%s βίντεο</string>
<string name="attachment_description_audio">%s ήχος</string>
<string name="attachment_description_unknown">%s αρχείο</string>
<string name="attachment_type_image">Εικόνα</string>
<string name="attachment_type_video">Βίντεο</string>
<string name="attachment_type_audio">Ήχος</string>
<string name="attachment_type_gif">GIF</string>
<string name="attachment_type_unknown">Αρχείο</string>
<string name="attachment_x_percent_uploaded">%d%% μεταφορτώθηκε</string>
<string name="add_poll_option">Προσθήκη επιλογής δημοσκόπησης</string>
<string name="poll_length">Μήκος δημοσκόπησης</string>
<string name="poll_style">Στυλ</string>
<string name="compose_poll_single_choice">Διάλεξε ένα</string>
<string name="compose_poll_multiple_choice">Πολλαπλής επιλογής</string>
<string name="delete_poll_option">Διαγραφή επιλογής δημοσκόπησης</string>
<string name="poll_style_title">Στυλ δημοσκόπησης</string>
<string name="alt_text">Εναλλακτικό κείμενο</string>
<string name="help">Βοήθεια</string>
<string name="what_is_alt_text">Τι είναι το εναλλακτικό κείμενο;</string>
<string name="alt_text_help">Το εναλλακτικό κείμενο παρέχει περιγραφές εικόνας για άτομα με προβλήματα όρασης, συνδέσεις χαμηλής ταχύτητας ή για άτομα που αναζητούν επιπλέον περιεχόμενο.\n\nΜπορείς να βελτιώσεις την προσβασιμότητα και την κατανόηση για όλους, γράφοντας σαφές, συνοπτικό και αντικειμενικό εναλλακτικό κείμενο.\n\n<ul><li>Κατέγραψε σημαντικά στοιχεία</li>\n<li>Συνόψισε κείμενο σε εικόνες</li>\n<li>Χρησιμοποίησε δομή κανονικής πρότασης</li>\n<li>Απέφυγε περιττές πληροφορίες</li>\n<li>Εστίασε στις τάσεις και τα βασικά ευρήματα σε σύνθετα οπτικά στοιχεία (όπως διαγράμματα ή χάρτες)</li></ul></string>
<string name="edit_post">Επεξεργασία ανάρτησης</string>
<string name="no_verified_link">Χωρίς επαληθευμένο σύνδεσμο</string>
<string name="compose_autocomplete_emoji_empty">Περιήγηση emoji</string>
<string name="compose_autocomplete_users_empty">Βρες αυτόν που ψάχνεις</string>
<string name="no_search_results">Δεν βρέθηκε τίποτα με αυτούς τους όρους αναζήτησης</string>
<string name="language">Γλώσσα</string>
<string name="language_default">Προεπιλογή</string>
<string name="language_system">Σύστημα</string>
<string name="language_detecting">Ανίχνευση γλώσσας</string>
<string name="language_cant_detect">Αδυναμία εντοπισμού γλώσσας</string>
<string name="language_detected">Εντοπίστηκε</string>
<string name="media_hidden">Κρυμμένο πολυμέσο</string>
<string name="post_hidden">Κρυφή ανάρτηση</string>
<string name="report_title_post">Αναφορά ανάρτησης</string>
<string name="forward_report_explanation">Ο λογαριασμός είναι από διαφορετικό διακομιστή. Να σταλεί ανώνυμο αντίγραφο της αναφοράς και εκεί;</string>
<!-- %s is the server domain -->
<string name="forward_report_to_server">Προώθηση σε %s</string>
<!-- Shown on the "stamp" on the screen that appears after you report a post/user. Please keep the translation short, preferably a single word -->
<string name="reported">Αναφέρθηκε</string>
<string name="report_unfollow_explanation">Για να μην βλέπεις τις αναρτήσεις του στην αρχική σου ροή πια, μην τον ακολουθείς.</string>
<string name="muted_user">Έγινε σίγαση %s</string>
<string name="report_sent_already_blocked">Έχεις ήδη αποκλείσει αυτόν τον χρήστη, οπότε δεν υπάρχει τίποτα άλλο που πρέπει να κάνεις όσο εξετάζουμε την αναφορά σου.</string>
<string name="report_personal_already_blocked">Έχεις ήδη αποκλείσει αυτόν τον χρήστη, οπότε δεν υπάρχει τίποτα άλλο που πρέπει να κάνεις.\n\nΕυχαριστούμε που βοηθάς να παραμείνει το Mastodon ένα ασφαλές μέρος για όλους!</string>
<string name="blocked_user">Αποκλείστηκε %s</string>
<string name="mark_all_notifications_read">Σήμανση όλων ως αναγνωσμένα</string>
<string name="settings_display">Εμφάνιση</string>
<string name="settings_filters">Φίλτρα</string>
<string name="settings_server_explanation">Επισκόπηση, κανόνες, συντονιστές</string>
<!-- %s is the app name (Mastodon, key app_name). I made it a placeholder so everything Just Works™ with forks -->
<string name="about_app">Σχετικά με το %s</string>
<string name="default_post_language">Προεπιλεγμένη γλώσσα ανάρτησης</string>
<string name="settings_alt_text_reminders">Προσθήκη υπενθυμίσεων για εναλλακτικό κείμενο</string>
<string name="settings_confirm_unfollow">Ερώτηση πριν την κατάργηση ακολούθησης κάποιου</string>
<string name="settings_confirm_boost">Ερώτηση πριν την ενίσχυση</string>
<string name="settings_confirm_delete_post">Ερώτηση πριν τη διαγραφή αναρτήσεων</string>
<string name="pause_all_notifications">Παύση όλων</string>
<string name="pause_notifications_off">Ανενεργό</string>
<string name="notifications_policy_anyone">Οποιοσδήποτε</string>
<string name="notifications_policy_followed">Άτομα που σε ακολουθούν</string>
<string name="notifications_policy_follower">Άτομα που ακολουθείς</string>
<string name="notifications_policy_no_one">Κανείς</string>
<string name="settings_notifications_policy">Λήψη ειδοποιήσεων από</string>
<string name="notification_type_mentions_and_replies">Επισημάνσεις και απαντήσεις</string>
<string name="pause_all_notifications_title">Παύση όλων των ειδοποιήσεων</string>
<plurals name="x_weeks">
<item quantity="one">%d εβδομάδα</item>
<item quantity="other">%d εβδομάδες</item>
</plurals>
<!-- %1$s is the date (may be relative, e.g. "today" or "yesterday"), %2$s is the time. You can reorder these placeholders if that works better for your language -->
<string name="date_at_time">%1$s στις %2$s</string>
<string name="today">σήμερα</string>
<string name="yesterday">χθες</string>
<string name="tomorrow">αύριο</string>
<!-- %s is the timestamp ("tomorrow at 12:34") -->
<string name="pause_notifications_ends">Μέχρι %s</string>
<!-- %s is the timestamp ("tomorrow at 12:34") -->
<string name="pause_notifications_banner">Οι ειδοποιήσεις θα επανέλθουν %s.</string>
<string name="resume_notifications_now">Συνέχιση τώρα</string>
<string name="open_system_notification_settings">Μετάβαση στις ρυθμίσεις ειδοποιήσεων</string>
<string name="about_server">Σχετικά</string>
<string name="server_rules">Κανόνες</string>
<string name="server_administrator">Διαχειριστής</string>
<string name="send_email_to_server_admin">Στείλε μήνυμα σε διαχειριστή</string>
<string name="notifications_disabled_in_system">Ενεργοποίησε τις ειδοποιήσεις από τις ρυθμίσεις της συσκευής σου για να δεις ενημερώσεις από οπουδήποτε.</string>
<string name="settings_even_more">Ακόμη περισσότερες ρυθμίσεις</string>
<string name="settings_show_cws">Εμφάνιση προειδοποιήσεων περιεχομένου</string>
<string name="settings_hide_sensitive_media">Κάλυψη μέσων που χαρακτηρίζονται ως ευαίσθητα</string>
<string name="settings_show_interaction_counts">Αριθμός αλληλεπιδράσεων ανάρτησης</string>
<string name="settings_show_emoji_in_names">Προσαρμοσμένα emoji στα εμφανιζόμενα ονόματα</string>
<plurals name="in_x_seconds">
<item quantity="one">σε %d δευτερόλεπτο</item>
<item quantity="other">σε %d δευτερόλεπτα</item>
</plurals>
<plurals name="in_x_minutes">
<item quantity="one">σε %d λεπτό</item>
<item quantity="other">σε %d λεπτά</item>
</plurals>
<plurals name="in_x_hours">
<item quantity="one">σε %d ώρα</item>
<item quantity="other">σε %d ώρες</item>
</plurals>
<plurals name="x_hours_ago">
<item quantity="one">%d ώρα πριν</item>
<item quantity="other">%d ώρες πριν</item>
</plurals>
<string name="alt_text_reminder_title">Το πολυμέσο δεν έχει εναλλακτικό κείμενο</string>
<plurals name="alt_text_reminder_x_images">
<item quantity="one">%s εκ των εικόνων σου δεν έχει εναλλακτικό κείμενο. Ανάρτηση ούτως ή άλλως;</item>
<item quantity="other">%s εκ των εικόνων σου δεν έχει εναλλακτικό κείμενο. Ανάρτηση ούτως ή άλλως;</item>
</plurals>
<plurals name="alt_text_reminder_x_attachments">
<item quantity="one">%s εκ των συνημμένων πολυμέσων σου δεν έχει εναλλακτικό κείμενο. Ανάρτηση ούτως ή άλλως;</item>
<item quantity="other">%s εκ των συνημμένων πολυμέσων σου δεν έχουν εναλλακτικό κείμενο. Ανάρτηση ούτως ή άλλως;</item>
</plurals>
<string name="count_one">Ένα</string>
<string name="count_two">Δύο</string>
<string name="count_three">Τρία</string>
<string name="count_four">Τέσσερα</string>
<string name="alt_text_reminder_post_anyway">Ανάρτηση</string>
<!-- %s is the username -->
<string name="unfollow_confirmation">Άρση ακολούθησης του %s;</string>
<string name="filter_active">Ενεργός</string>
<string name="filter_inactive">Ανενεργός</string>
<string name="settings_add_filter">Προσθήκη φίλτρου</string>
<string name="settings_edit_filter">Επεξεργασία φίλτρου</string>
<string name="settings_filter_duration">Διάρκεια</string>
<string name="settings_filter_muted_words">Αποσιωπημένες λέξεις</string>
<string name="settings_filter_context">Σίγαση από</string>
<string name="settings_filter_show_cw">Εμφάνιση με προειδοποίηση περιεχομένου</string>
<string name="settings_filter_show_cw_explanation">Να εμφανίζονται και πάλι οι αναρτήσεις που ταιριάζουν με αυτό το φίλτρο, αλλά πίσω από μια προειδοποίηση περιεχομένου</string>
<string name="settings_delete_filter">Διαγραφή φίλτρου</string>
<string name="filter_duration_forever">Για πάντα</string>
<!-- %s is the timestamp ("tomorrow at 12:34") -->
<string name="settings_filter_ends">Μέχρι %s</string>
<plurals name="settings_x_muted_words">
<item quantity="one">%d λέξη ή φράση σε σίγαση</item>
<item quantity="other">%d λέξεις ή φράσεις σε σίγαση</item>
</plurals>
<string name="selection_2_options">%1$s και %2$s</string>
<string name="selection_3_options">%1$s, %2$s και %3$s</string>
<string name="selection_4_or_more">%1$s, %2$s και %3$d ακόμη</string>
<string name="filter_context_home_lists">Αρχική &amp; λίστες</string>
<string name="filter_context_notifications">Ειδοποιήσεις</string>
<string name="filter_context_public_timelines">Δημόσιες ροές</string>
<string name="filter_context_threads_replies">Νήματα &amp; απαντήσεις</string>
<string name="filter_context_profiles">Προφίλ</string>
<string name="settings_filter_title">Τίτλος</string>
<string name="settings_delete_filter_title">Διαγραφή φίλτρου “%s”;</string>
<string name="settings_delete_filter_confirmation">Αυτό το φίλτρο θα διαγραφεί από το λογαριασμό σου σε όλες σου τις συσκευές.</string>
<string name="add_muted_word">Προσθήκη λέξης σε σίγαση</string>
<string name="edit_muted_word">Επεξεργασία λέξης σε σίγαση</string>
<string name="add">Προσθήκη</string>
<string name="filter_word_or_phrase">Λέξη ή φράση</string>
<string name="filter_add_word_help">Οι λέξεις είναι case insensitive και ταιριάζουν μόνο με πλήρεις λέξεις.\n\nΑν φιλτράρετε τη λέξη-κλειδί “Apple,” θα κρύψει δημοσιεύσεις που περιέχουν “apple” ή “aPpLe” αλλά όχι “pinapple”</string>
<string name="settings_delete_filter_word">Διαγραφή λέξης “%s”;</string>
<string name="enter_selection_mode">Επιλογή</string>
<string name="select_all">Επιλογή όλων</string>
<string name="settings_filter_duration_title">Διάρκεια φίλτρου</string>
<string name="filter_duration_custom">Προσαρμοσμένο</string>
<plurals name="settings_delete_x_filter_words">
<item quantity="one">Διαγραφή %d λέξης;</item>
<item quantity="other">Διαγραφή %d λέξεων;</item>
</plurals>
<plurals name="x_items_selected">
<item quantity="one">%d επιλεγμένο</item>
<item quantity="other">%d επιλεγμένα</item>
</plurals>
<string name="required_form_field_blank">Δε μπορεί να είναι κενό</string>
<string name="filter_word_already_in_list">Ήδη στη λίστα</string>
<string name="app_update_ready">Η ενημέρωση εφαρμογής είναι έτοιμη</string>
<string name="app_update_version">Έκδοση %s</string>
<string name="downloading_update">Λήψη (%d%%)</string>
<!-- Shown like a content warning, %s is the name of the filter -->
<string name="post_matches_filter_x">Ταιριάζει με το φίλτρο “%s”</string>
<string name="search_mastodon">Αναζήτηση στο Mastodon</string>
<string name="clear_all">Εκκαθάριση όλων</string>
<string name="search_open_url">Άνοιγμα διεύθυνσης URL στο Mastodon</string>
<string name="posts_matching_hashtag">Αναρτήσεις με “%s”</string>
<string name="search_go_to_account">Μετάβαση σε %s</string>
<string name="posts_matching_string">Αναρτήσεις με “%s”</string>
<string name="accounts_matching_string">Άτομα με «%s»</string>
<!-- Shown in the post header. Please keep it short -->
<string name="time_seconds_ago_short">%dδ πριν</string>
<string name="time_minutes_ago_short">%dλ πριν</string>
<string name="time_hours_ago_short">%dώ πριν</string>
<string name="time_days_ago_short">%dημ πριν</string>
<!-- %s is the name of the post language -->
<string name="translate_post">Μετάφραση από %s</string>
<!-- %1$s is the language, %2$s is the name of the translation service -->
<string name="post_translated">Μεταφράστηκε από %1$s χρησιμοποιώντας %2$s</string>
<string name="translation_show_original">Εμφάνιση αρχικού</string>
<string name="translation_failed">Η μετάφραση απέτυχε. Ίσως ο διαχειριστής δεν έχει ενεργοποιήσει μεταφράσεις σε αυτόν τον διακομιστή ή αυτός ο διακομιστής εκτελεί μια παλαιότερη έκδοση του Mastodon όπου οι μεταφράσεις δεν υποστηρίζονται ακόμα.</string>
<string name="settings_privacy">Ιδιωτικότητα και προσιτότητα</string>
<string name="settings_discoverable">Παροχή προφίλ και δημοσιεύσεων σε αλγορίθμους ανακάλυψης</string>
<string name="settings_indexable">Συμπερίληψη δημόσιων αναρτήσεων στα αποτελέσματα αναζήτησης</string>
<plurals name="x_participants">
<item quantity="one">%,d συμμετέχων</item>
<item quantity="other">%,d συμμετέχοντες</item>
</plurals>
<plurals name="x_posts_today">
<item quantity="one">%,d ανάρτηση σήμερα</item>
<item quantity="other">%,d αναρτήσεις σήμερα</item>
</plurals>
</resources>

View File

@@ -4,12 +4,18 @@
<string name="next">Siguiente</string>
<string name="loading_instance">Recuperando información del servidor…</string>
<string name="error">Error</string>
<string name="not_a_mastodon_instance">%s no parece ser un servidor de Mastodon.</string>
<string name="ok">Aceptar</string>
<string name="preparing_auth">Preparando para autenticación…</string>
<string name="finishing_auth">Finalizando autenticación…</string>
<string name="user_boosted">%s retooteó</string>
<string name="in_reply_to">En respuesta a %s</string>
<string name="notifications">Notificaciones</string>
<string name="user_followed_you">%s te ha seguido</string>
<string name="user_sent_follow_request">%s te envió una solicitud de seguimiento</string>
<string name="user_favorited">%s ha marcado tu publicación como favorita</string>
<string name="notification_boosted">%s ha impulsado tu publicación</string>
<string name="poll_ended">Ver los resultados de una encuesta en la que votaste</string>
<string name="share_toot_title">Compartir</string>
<string name="settings">Ajustes</string>
<string name="publish">Publicar</string>
@@ -31,6 +37,7 @@
<string name="button_follow">Seguir</string>
<string name="button_following">Siguiendo</string>
<string name="edit_profile">Editar perfil</string>
<string name="share_user">Compartir perfil</string>
<string name="mute_user">Silenciar a %s</string>
<string name="unmute_user">Dejar de silenciar a %s</string>
<string name="block_user">Bloquear a %s</string>
@@ -78,6 +85,10 @@
<item quantity="one">%d día restante</item>
<item quantity="other">%d días restantes</item>
</plurals>
<plurals name="x_votes">
<item quantity="one">%,d voto</item>
<item quantity="other">%,d votos</item>
</plurals>
<string name="poll_closed">Cerrado</string>
<string name="confirm_mute_title">Silenciar cuenta</string>
<string name="confirm_mute">Confirmar para silenciar a %s</string>
@@ -96,27 +107,35 @@
<string name="button_blocked">Bloqueado</string>
<string name="action_vote">Votar</string>
<string name="delete">Eliminar</string>
<string name="confirm_delete_title">Eliminar publicación</string>
<string name="confirm_delete">¿Confirma que quiere eliminar esta publicación?</string>
<string name="deleting">Eliminando…</string>
<string name="notification_channel_audio_player">Reproducción de audio</string>
<string name="play">Reproducir</string>
<string name="pause">Pausar</string>
<string name="log_out">Cerrar sesión</string>
<string name="add_account">Añadir cuenta</string>
<string name="search_hint">Buscar</string>
<string name="hashtags">Etiquetas</string>
<string name="news">Noticias</string>
<string name="for_you">Para ti</string>
<string name="all_notifications">Todo</string>
<string name="mentions">Menciones</string>
<plurals name="x_people_talking">
<item quantity="one">%d persona está hablando</item>
<item quantity="other">%d personas están hablando</item>
</plurals>
<string name="report_title">Denunciar a %s</string>
<string name="report_choose_reason">¿Qué hay de malo en esta publicación?</string>
<string name="report_choose_reason_account">¿Qué hay de malo con %s?</string>
<string name="report_choose_reason_subtitle">Seleccione la mejor opción</string>
<string name="report_reason_personal">No me gusta</string>
<string name="report_reason_personal_subtitle">No es algo que quieras ver</string>
<string name="report_reason_spam">Es spam</string>
<string name="report_reason_spam_subtitle">Enlaces maliciosos, interacciones falsas o respuestas repetitivas</string>
<string name="report_reason_violation">Viola las reglas del servidor</string>
<string name="report_reason_violation_subtitle">Eres consciente de que infringe normas específicas</string>
<string name="report_reason_other">Es otra cosa</string>
<string name="report_reason_other_subtitle">El problema no encaja en otras categorías</string>
<string name="report_choose_rule">¿Qué normas se están violando?</string>
<string name="report_choose_rule_subtitle">Selecciona todos los que correspondan</string>
@@ -125,8 +144,14 @@
<string name="report_comment_title">¿Hay algo más que deberíamos saber?</string>
<string name="report_comment_hint">Comentarios adicionales</string>
<string name="sending_report">Enviando denuncia…</string>
<string name="report_sent_title">Gracias por reportar, lo revisaremos.</string>
<string name="report_sent_subtitle">Mientras revisamos esto, puedes tomar medidas contra %s:</string>
<string name="unfollow_user">Dejar de seguir a %s</string>
<string name="unfollow">Dejar de seguir</string>
<string name="mute_user_explain">No verás sus mensajes. Todavía pueden seguirte y ver tus mensajes y no sabrán que están silenciados.</string>
<string name="block_user_explain">No verás sus mensajes. No podrán ver tus publicaciones ni seguirte. Podrán decir que están bloqueados.</string>
<string name="report_personal_title">¿No quiere ver esto?</string>
<string name="report_personal_subtitle">Aquí están tus opciones para controlar lo que ves en Mastodon:</string>
<string name="back">Atrás</string>
<string name="search_communities">Nombre del servidor o URL</string>
<string name="instance_rules_title">Reglas del servidor</string>
@@ -153,14 +178,19 @@
<string name="category_tech">Tecnología</string>
<string name="confirm_email_title">Revisa tu bandeja de entrada</string>
<!-- %s is the email address -->
<string name="confirm_email_subtitle">Pulsa el enlace que te hemos enviado para verificar %s. Esperaremos aquí mismo.</string>
<string name="confirm_email_didnt_get">¿No recibiste un enlace?</string>
<string name="resend">Reenviar</string>
<string name="open_email_app">Abrir aplicación de email</string>
<string name="resent_email">Correo de confirmación enviado</string>
<string name="compose_hint">Escribe o pega lo que tengas en mente</string>
<string name="content_warning">Advertencia de contenido</string>
<string name="save">Guardar</string>
<string name="add_alt_text">Añadir texto alternativo</string>
<string name="visibility_public">Público</string>
<string name="visibility_followers_only">Sólo seguidores</string>
<string name="visibility_private">Solo personas mencionadas</string>
<string name="recent_searches">Recientes</string>
<string name="skip">Saltar</string>
<string name="notification_type_follow">Nuevos seguidores</string>
<string name="notification_type_favorite">Favoritos</string>
@@ -169,8 +199,14 @@
<string name="notification_type_poll">Encuestas</string>
<string name="choose_account">Elegir cuenta</string>
<string name="err_not_logged_in">Por favor inicie sesión primero en Mastodon</string>
<plurals name="cant_add_more_than_x_attachments">
<item quantity="one">No puede añadir más de %d archivo adjunto</item>
<item quantity="other">No puede añadir más de %d archivos adjuntos</item>
</plurals>
<string name="media_attachment_unsupported_type">El archivo %s es de un tipo no compatible</string>
<string name="media_attachment_too_big">El archivo %1$s supera el límite de tamaño de %2$s MB</string>
<string name="settings_theme">Apariencia</string>
<string name="theme_auto">Usar apariencia del dispositivo</string>
<string name="theme_light">Claro</string>
<string name="theme_dark">Oscuro</string>
<string name="settings_behavior">Comportamiento</string>
@@ -183,6 +219,9 @@
<string name="settings_clear_cache">Limpiar caché multimedia</string>
<string name="settings_app_version">Mastodon para Android -%1$s (%2$d)</string>
<string name="media_cache_cleared">Caché multimedia borrada</string>
<string name="confirm_log_out">¿Cerrar sesión de %s?</string>
<string name="sensitive_content_explain">El autor ha marcado este medio como sensible.</string>
<string name="avatar_description">Ir al perfil de %s</string>
<string name="more_options">Más opciones</string>
<string name="new_post">Nuevo post</string>
<string name="button_reply">Responder</string>
@@ -198,6 +237,7 @@
<string name="media_viewer">Visor de medios</string>
<string name="follow_user">Seguir a %s</string>
<string name="unfollowed_user">No sigues a %s</string>
<string name="followed_user">Ahora estás siguiendo a %s</string>
<string name="following_user_requested">%s solicitó seguirte</string>
<string name="open_in_browser">Abrir en el navegador</string>
<string name="hide_boosts_from_user">Ocultar retoots de %s</string>
@@ -215,7 +255,13 @@
<string name="error_saving_file">Error al guardar el archivo</string>
<string name="file_saved">Archivo guardado</string>
<string name="downloading">Descargando…</string>
<string name="no_app_to_handle_action">No hay ninguna aplicación para manejar esta acción</string>
<string name="local_timeline">Local</string>
<string name="trending_posts_info_banner">Estas son las publicaciones que están ganando tracción a través de Mastodon.</string>
<string name="trending_links_info_banner">Estas son las noticias de las que se habla en Mastodon.</string>
<!-- %s is the server domain -->
<string name="local_timeline_info_banner">Estos son todos los mensajes de todos los usuarios de tu servidor (%s).</string>
<string name="recommended_accounts_info_banner">Es posible que te gusten estas cuentas basadas en otras que sigues.</string>
<string name="see_new_posts">Ver nuevas publicaciones</string>
<string name="load_missing_posts">Cargar publicaciones faltantes</string>
<string name="follow_back">Seguir de vuelta</string>
@@ -293,6 +339,7 @@
<string name="login_title">Qué bueno verle de nuevo</string>
<string name="login_subtitle">Inicie sesión con el servidor donde creó su cuenta.</string>
<string name="server_url">URL del servidor</string>
<string name="signup_random_server_explain">Seleccionaremos un servidor basado en tu idioma si continúas sin hacer una selección.</string>
<string name="server_filter_any_language">Cualquier idioma</string>
<string name="server_filter_instant_signup">Registro instantáneo</string>
<string name="server_filter_manual_review">Revisión manual</string>
@@ -305,6 +352,7 @@
<string name="server_filter_region_oceania">Oceanía</string>
<string name="not_accepting_new_members">No se aceptan nuevos miembros</string>
<string name="category_special_interests">Intereses especiales</string>
<string name="signup_passwords_dont_match">Las contraseñas no coinciden</string>
<string name="pick_server_for_me">Elegir por mí</string>
<string name="profile_add_row">Añadir fila</string>
<string name="profile_setup">Configuración del perfil</string>
@@ -313,12 +361,14 @@
<string name="popular_on_mastodon">Popular en Mastodon</string>
<string name="follow_all">Seguir a todos</string>
<string name="server_rules_disagree">En desacuerdo</string>
<string name="privacy_policy_explanation">Resumen: No recogemos ni procesamos nada.</string>
<!-- %s is server domain -->
<string name="server_policy_disagree">En desacuerdo con %s</string>
<string name="profile_bio">Biografía</string>
<!-- Shown in a progress dialog when you tap "follow all" -->
<string name="sending_follows">Siguiendo usuarios…</string>
<!-- %1$s is server domain, %2$s is email domain. You can reorder these placeholders to fit your language better. -->
<string name="signup_email_domain_blocked">%1$s no permite registros de %2$s. Prueba uno diferente o &lt;a&gt;elige un servidor diferente&lt;/a&gt;.</string>
<string name="spoiler_show">Mostrar de todos modos</string>
<string name="spoiler_hide">Volver a ocultar</string>
<string name="poll_multiple_choice">Escoge una o más</string>
@@ -337,16 +387,192 @@
<string name="welcome_to_mastodon">Bienvenido/da a Mastodon</string>
<string name="welcome_paragraph1">Mastodon es una red social descentralizada, lo que significa que no la controla una sola compañía. Está formada por muchos servidores independientes, todos juntos conectados.</string>
<string name="what_are_servers">¿Qué son los servidores?</string>
<string name="welcome_paragraph2"><![CDATA[Cada cuenta de Mastodon está alojada en un servidor — cada uno con sus propios valores, reglas y administradores. No importa cual elijas, puede seguir e interactuar con personas en cualquier servidor.]]></string>
<string name="opening_link">Abriendo enlace…</string>
<string name="link_not_supported">Este enlace no es compatible con la aplicación</string>
<string name="log_out_all_accounts">Cerrar sesión en todas las cuentas</string>
<string name="confirm_log_out_all_accounts">¿Cerrar sesión de todas las cuentas?</string>
<string name="retry">Reintentar</string>
<string name="post_failed">Error al enviar la publicación</string>
<!-- %s is formatted file size ("467 KB image") -->
<string name="attachment_description_image">Imagen %s</string>
<string name="attachment_description_video">Vídeo %s</string>
<string name="attachment_description_audio">Audio %s</string>
<string name="attachment_description_unknown">Archivo %s</string>
<string name="attachment_type_image">Imagen</string>
<string name="attachment_type_video">Vídeo</string>
<string name="attachment_type_audio">Audio</string>
<string name="attachment_type_gif">GIF</string>
<string name="attachment_type_unknown">Archivo</string>
<string name="attachment_x_percent_uploaded">%d%% subido</string>
<string name="add_poll_option">Añadir opción de encuesta</string>
<string name="poll_length">Longitud de la encuesta</string>
<string name="poll_style">Estilo</string>
<string name="compose_poll_single_choice">Elige uno</string>
<string name="compose_poll_multiple_choice">Múltiples opciones</string>
<string name="delete_poll_option">Borrar opción de encuesta</string>
<string name="poll_style_title">Estilo de encuesta</string>
<string name="alt_text">Texto alternativo</string>
<string name="help">Ayuda</string>
<string name="what_is_alt_text">¿Qué es el texto alternativo?</string>
<string name="edit_post">Editar publicación</string>
<string name="no_verified_link">Enlace no verificado</string>
<string name="compose_autocomplete_emoji_empty">Explorar emojis</string>
<string name="compose_autocomplete_users_empty">Encuentra quién estás buscando</string>
<string name="no_search_results">No se pudo encontrar nada para estos términos de búsqueda</string>
<string name="language">Idioma</string>
<string name="language_default">Predeterminado</string>
<string name="language_system">Sistema</string>
<string name="language_detecting">Detectando idioma</string>
<string name="language_cant_detect">No se puede detectar el idioma</string>
<string name="language_detected">Detectado</string>
<string name="media_hidden">Medios ocultos</string>
<string name="post_hidden">Publicación ocultada</string>
<string name="report_title_post">Reportar publicación</string>
<string name="forward_report_explanation">La cuenta es de otro servidor. ¿Enviar también una copia anónima de este informe?</string>
<!-- %s is the server domain -->
<string name="forward_report_to_server">Reenviar a %s</string>
<!-- Shown on the "stamp" on the screen that appears after you report a post/user. Please keep the translation short, preferably a single word -->
<string name="reported">Reportado</string>
<string name="muted_user">Silenciado %s</string>
<string name="report_sent_already_blocked">Ya has bloqueado a este usuario, así que no tienes nada más que hacer mientras revisamos tu informe.</string>
<string name="report_personal_already_blocked">Ya has bloqueado a este usuario, así que no tienes nada más que hacer.\n\n¡Gracias por ayudar a mantener Mastodon un lugar seguro para todos!</string>
<string name="blocked_user">Bloqueado %s</string>
<string name="mark_all_notifications_read">Marcar todo como leído</string>
<string name="settings_display">Visualización</string>
<string name="settings_filters">Filtros</string>
<string name="settings_server_explanation">Resumen, reglas, moderadores</string>
<!-- %s is the app name (Mastodon, key app_name). I made it a placeholder so everything Just Works™ with forks -->
<string name="about_app">Acerca de %s</string>
<string name="default_post_language">Idioma predeterminado de la publicación</string>
<string name="settings_alt_text_reminders">Añadir recordatorios de texto alt</string>
<string name="settings_confirm_unfollow">Preguntar antes de dejar de seguir a alguien</string>
<string name="settings_confirm_boost">Preguntar antes de impulsar</string>
<string name="settings_confirm_delete_post">Preguntar antes de eliminar mensajes</string>
<string name="pause_all_notifications">Pausar todo</string>
<string name="pause_notifications_off">Apagado</string>
<string name="notifications_policy_anyone">Cualquiera</string>
<string name="notifications_policy_followed">Personas que te siguen</string>
<string name="notifications_policy_follower">Personas que sigues</string>
<string name="notifications_policy_no_one">Nadie</string>
<string name="settings_notifications_policy">Recibir notificaciones de</string>
<string name="notification_type_mentions_and_replies">Menciones y respuestas</string>
<string name="pause_all_notifications_title">Pausar todas las notificaciones</string>
<plurals name="x_weeks">
<item quantity="one">%d semana</item>
<item quantity="other">%d semanas</item>
</plurals>
<!-- %1$s is the date (may be relative, e.g. "today" or "yesterday"), %2$s is the time. You can reorder these placeholders if that works better for your language -->
<string name="date_at_time">%1$s en %2$s</string>
<string name="today">hoy</string>
<string name="yesterday">ayer</string>
<string name="tomorrow">mañana</string>
<!-- %s is the timestamp ("tomorrow at 12:34") -->
<string name="pause_notifications_ends">Termina %s</string>
<!-- %s is the timestamp ("tomorrow at 12:34") -->
<string name="pause_notifications_banner">Las notificaciones se reanudarán %s.</string>
<string name="resume_notifications_now">Reanudar ahora</string>
<string name="open_system_notification_settings">Ir a la configuración de notificaciones</string>
<string name="about_server">Acerca de</string>
<string name="server_rules">Reglas</string>
<string name="server_administrator">Administrador</string>
<string name="notifications_disabled_in_system">Active las notificaciones desde la configuración de su dispositivo para ver actualizaciones desde cualquier lugar.</string>
<string name="settings_even_more">Aún más ajustes</string>
<string name="settings_show_cws">Mostrar advertencias de contenido</string>
<plurals name="in_x_seconds">
<item quantity="one">en %d segundo</item>
<item quantity="other">en %d segundos</item>
</plurals>
<plurals name="in_x_minutes">
<item quantity="one">en %d minuto</item>
<item quantity="other">en %d minutos</item>
</plurals>
<plurals name="in_x_hours">
<item quantity="one">en %d hora</item>
<item quantity="other">en %d horas</item>
</plurals>
<plurals name="x_hours_ago">
<item quantity="one">hace %d hora</item>
<item quantity="other">hace %d horas</item>
</plurals>
<string name="alt_text_reminder_title">Falta el texto alt de los medios</string>
<plurals name="alt_text_reminder_x_images">
<item quantity="one">%s de tus imágenes no tiene texto alternativo. ¿Publicar de todos modos?</item>
<item quantity="other">%s de tus imágenes no tienen texto alternativo. ¿Publicar de todos modos?</item>
</plurals>
<plurals name="alt_text_reminder_x_attachments">
<item quantity="one">%s de tus archivos adjuntos multimedia carece de texto alternativo. ¿Publicar de todos modos?</item>
<item quantity="other">%s de tus archivos adjuntos no tienen texto alternativo. ¿Publicar de todos modos?</item>
</plurals>
<string name="count_one">Uno</string>
<string name="count_two">Dos</string>
<string name="count_three">Tres</string>
<string name="count_four">Cuatro</string>
<string name="alt_text_reminder_post_anyway">Publicar</string>
<!-- %s is the username -->
<string name="unfollow_confirmation">¿Dejar de seguir a %s?</string>
<string name="filter_active">Activo</string>
<string name="filter_inactive">Inactivo</string>
<string name="settings_add_filter">Añadir filtro</string>
<string name="settings_edit_filter">Editar filtro</string>
<string name="settings_filter_duration">Duración</string>
<string name="settings_filter_muted_words">Palabras silenciadas</string>
<string name="settings_filter_context">Silenciar de</string>
<string name="settings_filter_show_cw">Mostrar con advertencia de contenido</string>
<string name="settings_filter_show_cw_explanation">Sigue mostrando mensajes que coinciden con este filtro, pero detrás de una advertencia de contenido</string>
<string name="settings_delete_filter">Eliminar filtro</string>
<string name="filter_duration_forever">Siempre</string>
<!-- %s is the timestamp ("tomorrow at 12:34") -->
<string name="settings_filter_ends">Termina %s</string>
<plurals name="settings_x_muted_words">
<item quantity="one">%d palabra o frase silenciada</item>
<item quantity="other">%d palabras o frases silenciadas</item>
</plurals>
<string name="selection_2_options">%1$s y %2$s</string>
<string name="selection_3_options">%1$s, %2$s, y %3$s</string>
<string name="selection_4_or_more">%1$s, %2$s, y %3$d más</string>
<string name="filter_context_home_lists">Inicio y listas</string>
<string name="filter_context_notifications">Notificaciones</string>
<string name="filter_context_threads_replies">Hilos y respuestas</string>
<string name="filter_context_profiles">Profiles</string>
<string name="settings_filter_title">Título</string>
<string name="settings_delete_filter_title">¿Eliminar filtro “%s”?</string>
<string name="settings_delete_filter_confirmation">Este filtro se eliminará de su cuenta en todos sus dispositivos.</string>
<string name="add_muted_word">Añadir palabra silenciada</string>
<string name="edit_muted_word">Editar palabra silenciada</string>
<string name="add">Añadir</string>
<string name="filter_word_or_phrase">Palabra o frase</string>
<string name="settings_delete_filter_word">¿Eliminar palabra “%s”?</string>
<string name="enter_selection_mode">Seleccionar</string>
<string name="select_all">Seleccionar todo</string>
<string name="settings_filter_duration_title">Duración del filtro</string>
<string name="filter_duration_custom">Personalizado</string>
<plurals name="settings_delete_x_filter_words">
<item quantity="one">¿Eliminar palabra %d?</item>
<item quantity="other">¿Eliminar palabras %d?</item>
</plurals>
<plurals name="x_items_selected">
<item quantity="one">%d seleccionado</item>
<item quantity="other">%d seleccionados</item>
</plurals>
<string name="required_form_field_blank">No puede estar en blanco</string>
<string name="filter_word_already_in_list">Ya está en la lista</string>
<string name="app_update_ready">Actualización de aplicación lista</string>
<string name="app_update_version">Versión %s</string>
<string name="downloading_update">Descargando (%d%%)</string>
<!-- Shown like a content warning, %s is the name of the filter -->
<string name="post_matches_filter_x">Coincide con el filtro “%s”</string>
<string name="search_mastodon">Buscar en Mastodon</string>
<string name="clear_all">Limpiar todo</string>
<string name="search_open_url">Abrir URL en Mastodon</string>
<string name="posts_matching_hashtag">Publicaciones con “%s”</string>
<string name="search_go_to_account">Ir a %s</string>
<string name="posts_matching_string">Publicaciones con “%s”</string>
<string name="accounts_matching_string">Personas con “%s”</string>
<!-- Shown in the post header. Please keep it short -->
<string name="time_seconds_ago_short">hace %ds</string>
<string name="time_minutes_ago_short">hace %dm</string>
<string name="time_hours_ago_short">hace %dh</string>
<string name="time_days_ago_short">hace %dd</string>
<!-- %s is the name of the post language -->
<!-- %1$s is the language, %2$s is the name of the translation service -->
</resources>

Some files were not shown because too many files have changed in this diff Show More