Compare commits

...

705 Commits

Author SHA1 Message Date
sk
bf9afba590 bump version 2023-03-17 02:31:23 +01:00
sk
b667afc7cd some barebones calckey compatibility
re: sk22#429
2023-03-17 02:30:21 +01:00
sk
21b0736842 fix null pointer exception
closes sk22#442
2023-03-17 01:28:38 +01:00
sk
8bd3c7cc28 fix crash when navigating while sending
fix sk22#446
2023-03-17 01:23:14 +01:00
sk
4db90b87f4 compare status lang to device locale
re: sk22#458
2023-03-17 01:06:43 +01:00
sk
46fd0be0eb Merge remote-tracking branch 'upstream/l10n_master' 2023-03-17 00:56:38 +01:00
sk
05a966869b Merge remote-tracking branch 'weblate/main' 2023-03-17 00:52:26 +01:00
sk
6fef51fcbb measure text manually
hopefully fix sk22#422
2023-03-17 00:51:22 +01:00
sk
d5b6c02b22 content descriptions for compact reblog/reply line 2023-03-16 19:55:56 +01:00
sk
6cd722dbef improve pre draw listener 2023-03-16 19:22:58 +01:00
sk
8dfc1ecae8 reply part before reblog part 2023-03-16 19:14:28 +01:00
sk
fdca799a5f add todo 2023-03-16 18:49:40 +01:00
sk22
def79e591b Translated using Weblate (German)
Currently translated at 96.7% (268 of 277 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/de/
2023-03-16 00:19:12 +00:00
ihor_ck
093a27970d Translated using Weblate (Ukrainian)
Currently translated at 100.0% (263 of 263 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/uk/
2023-03-16 00:19:12 +00:00
McKris
9a1e33a776 Translated using Weblate (Polish)
Currently translated at 100.0% (263 of 263 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/pl/
2023-03-16 00:19:12 +00:00
Linerly
a4a206eae6 Translated using Weblate (Indonesian)
Currently translated at 100.0% (263 of 263 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/id/
2023-03-16 00:19:12 +00:00
Espasant3
21ee5fc2bf Translated using Weblate (Galician)
Currently translated at 100.0% (263 of 263 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/gl/
2023-03-16 00:19:12 +00:00
Choukajohn
7df72e6bc6 Translated using Weblate (French)
Currently translated at 100.0% (263 of 263 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/fr/
2023-03-16 00:19:12 +00:00
gallegonovato
9ceea8de99 Translated using Weblate (Spanish)
Currently translated at 100.0% (263 of 263 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/es/
2023-03-16 00:19:12 +00:00
sk22
79d48a12a9 Translated using Weblate (German)
Currently translated at 100.0% (263 of 263 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/de/
2023-03-16 00:19:12 +00:00
ling0412
473d3a5196 Translated using Weblate (Chinese (Simplified))
Currently translated at 87.5% (14 of 16 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/zh_Hans/
2023-03-16 00:19:12 +00:00
Oliebol
43717634f6 Translated using Weblate (Dutch)
Currently translated at 95.8% (251 of 262 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/nl/
2023-03-16 00:19:11 +00:00
Andrewblasco
6ba8555adf Translated using Weblate (Spanish)
Currently translated at 100.0% (262 of 262 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/es/
2023-03-16 00:19:11 +00:00
AiOO
722ad8c53e Translated using Weblate (Korean)
Currently translated at 100.0% (16 of 16 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/ko/
2023-03-16 00:19:11 +00:00
AiOO
b0b497ed46 Translated using Weblate (Korean)
Currently translated at 100.0% (262 of 262 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/ko/
2023-03-16 00:19:11 +00:00
Espasant3
6c881eccd2 Translated using Weblate (Galician)
Currently translated at 100.0% (16 of 16 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/gl/
2023-03-16 00:19:11 +00:00
gicorada
94b92bd7c1 Translated using Weblate (Italian)
Currently translated at 100.0% (16 of 16 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/it/
2023-03-16 00:19:11 +00:00
gicorada
676b195aee Translated using Weblate (Italian)
Currently translated at 100.0% (262 of 262 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/it/
2023-03-16 00:19:11 +00:00
a_mento
4591731cdc Translated using Weblate (Basque)
Currently translated at 100.0% (262 of 262 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/eu/
2023-03-16 00:19:11 +00:00
Espasant3
fc5eeae9e7 Translated using Weblate (Galician)
Currently translated at 93.7% (15 of 16 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/gl/
2023-03-16 00:19:11 +00:00
ihor_ck
aaa88c45f7 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (16 of 16 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/uk/
2023-03-16 00:19:11 +00:00
McKris
5d91e8030c Translated using Weblate (Polish)
Currently translated at 100.0% (16 of 16 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/pl/
2023-03-16 00:19:11 +00:00
gallegonovato
c9be188d19 Translated using Weblate (Spanish)
Currently translated at 100.0% (16 of 16 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/es/
2023-03-16 00:19:11 +00:00
Linerly
ecc8daa8f1 Translated using Weblate (Indonesian)
Currently translated at 100.0% (16 of 16 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/id/
2023-03-16 00:19:11 +00:00
ihor_ck
5bbe11bf45 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (262 of 262 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/uk/
2023-03-16 00:19:11 +00:00
McKris
e52170abea Translated using Weblate (Polish)
Currently translated at 100.0% (262 of 262 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/pl/
2023-03-16 00:19:11 +00:00
Linerly
0f87fc7924 Translated using Weblate (Indonesian)
Currently translated at 100.0% (262 of 262 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/id/
2023-03-16 00:19:11 +00:00
Espasant3
cc7c4fc95f Translated using Weblate (Galician)
Currently translated at 99.6% (261 of 262 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/gl/
2023-03-16 00:19:11 +00:00
Choukajohn
4a2dcdf701 Translated using Weblate (French)
Currently translated at 100.0% (262 of 262 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/fr/
2023-03-16 00:19:11 +00:00
gallegonovato
ede47af962 Translated using Weblate (Spanish)
Currently translated at 100.0% (262 of 262 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/es/
2023-03-16 00:19:11 +00:00
sk
70e4cb2286 change inline reply notification 2023-03-16 01:18:46 +01:00
sk
c5e8460516 change notification action names 2023-03-16 01:02:33 +01:00
Jacoco
f852dac1e5 Improvements for Pleroma/Akkoma (#445)
* Reply Visibility on Plemora

* Sort statuses in thread

* Get default visibility and language from account if preferences fail

* Fix for Mentions tab in notifications on Pleroma

* Mark status as sensitive if not already when spoilertext is present

* Integrating Pleroma quoting for new posts

* move string to strings_sk

* use null instead of empty string

* change string

* fix crash due to null value

* update string

---------

Co-authored-by: sk <sk22@mailbox.org>
2023-03-16 00:49:11 +01:00
sk
374626cb32 Merge branch 'main' into pr/FineFindus/449 2023-03-15 23:42:02 +01:00
sk
aefa0b89ae Merge branch 'main' into pr/FineFindus/439 2023-03-15 23:38:33 +01:00
sk
9cc8b2668c fix show thread not working for reposts 2023-03-15 23:31:51 +01:00
sk
94b862a3ff improve reblog/reply line render 2023-03-15 23:27:43 +01:00
sk
f71bb6b78c use pre draw listener instead of post
hopefully fixes sk22#422
2023-03-15 22:36:30 +01:00
sk
499ac8f727 improve compact reply/reblog header 2023-03-15 22:30:57 +01:00
sk
938ae97cac remove click handler for reply line 2023-03-15 21:26:41 +01:00
sk
e2193e8e3c reply line below, compact above 2023-03-15 21:24:25 +01:00
sk
16f907c91f show thread reply line 2023-03-15 19:23:20 +01:00
sk
584700225c reply line below avatar 2023-03-15 17:36:07 +01:00
sk
bad72985cb bump version 2023-03-15 12:49:09 +01:00
sk
56b24420d1 add local-only string 2023-03-14 15:37:06 +01:00
sk
92beac8dff fuck it, indented header line
closes #448
2023-03-14 15:34:05 +01:00
sk
ed1fdba9a5 Merge remote-tracking branch 'upstream/master' 2023-03-14 15:01:30 +01:00
sk
5e194e3079 display both reply and reblog
re: sk22#448
2023-03-14 14:59:11 +01:00
sk
27c2791d6c add reblogged account to known accounts 2023-03-14 14:58:21 +01:00
Grishka
d6bcc9c156 Fix button color 2023-03-14 07:31:01 +03:00
sk
4c85fd4387 use custom string for anonymous reply 2023-03-13 20:06:05 +01:00
sk
80d529d503 display reply header for unknown original poster
re: mastodon#342
2023-03-13 20:00:56 +01:00
sk
c5a19a2334 fix duplicate notification status header 2023-03-13 19:29:40 +01:00
sk
16857bebd9 add tooltip
closes sk22#436
2023-03-13 19:05:22 +01:00
sk
1c340b7c66 fix extra text padding in compose 2023-03-13 18:56:06 +01:00
sk
7d9d8f0aae Merge remote-tracking branch 'upstream/master' 2023-03-13 18:52:52 +01:00
sk
21fc35230c Merge remote-tracking branch 'upstream/master' 2023-03-13 18:51:26 +01:00
Grishka
fc67c82040 Fix #544 2023-03-13 20:46:29 +03:00
Eugen Rochko
a9b828001c New translations strings.xml (Burmese) 2023-03-13 15:08:41 +01:00
Eugen Rochko
be050abf7e New translations strings.xml (Burmese) 2023-03-13 14:01:13 +01:00
Eugen Rochko
2d071ca252 New translations strings.xml (Burmese) 2023-03-13 12:53:22 +01:00
Eugen Rochko
abf94e1e70 New translations strings.xml (Burmese) 2023-03-13 10:01:18 +01:00
Eugen Rochko
2991c7421c New translations strings.xml (Burmese) 2023-03-13 08:59:13 +01:00
Eugen Rochko
834f84f995 New translations strings.xml (Burmese) 2023-03-13 07:58:41 +01:00
Eugen Rochko
6bf713c96c New translations strings.xml (Polish) 2023-03-13 00:35:08 +01:00
Eugen Rochko
72b16be297 New translations strings.xml (Swedish) 2023-03-12 21:53:57 +01:00
Eugen Rochko
0c7f27b3ac New translations strings.xml (Swedish) 2023-03-12 20:47:06 +01:00
Eugen Rochko
ca101748eb New translations strings.xml (Belarusian) 2023-03-11 23:37:17 +01:00
Eugen Rochko
3584c123d6 New translations strings.xml (Belarusian) 2023-03-11 22:33:13 +01:00
Eugen Rochko
a2fd4be339 New translations title.txt (Urdu (India)) 2023-03-11 14:05:49 +01:00
Eugen Rochko
656364db60 New translations short_description.txt (Urdu (India)) 2023-03-11 14:05:48 +01:00
Eugen Rochko
884347da12 New translations full_description.txt (Urdu (India)) 2023-03-11 14:05:47 +01:00
Eugen Rochko
675c49a922 New translations strings.xml (Urdu (India)) 2023-03-11 14:05:46 +01:00
FineFindus
4d04741fe0 feat(welcome): use URI InputType (#454) 2023-03-11 13:01:11 +01:00
FineFindus
5c7fe9dcb5 fix: disable group divider on EMUI (#453)
Fixes an issues, where the forth menu item does not show up, when the divider is enabled on EMUI devices
2023-03-11 13:00:36 +01:00
Eugen Rochko
a3146d6cdd New translations full_description.txt (Belarusian) 2023-03-11 09:12:18 +01:00
Eugen Rochko
d769f757ed New translations full_description.txt (Belarusian) 2023-03-11 08:04:43 +01:00
Eugen Rochko
654e3eb36b New translations strings.xml (Japanese) 2023-03-09 23:29:35 +01:00
Eugen Rochko
f62ba685d1 New translations strings.xml (Japanese) 2023-03-09 14:07:24 +01:00
Grishka
c3aa3af650 Fix #540 2023-03-08 22:46:24 +03:00
Eugen Rochko
8cc5678b38 New translations strings.xml (Japanese) 2023-03-08 11:02:08 +01:00
Eugen Rochko
592eb2d589 New translations strings.xml (Japanese) 2023-03-08 02:55:58 +01:00
Eugen Rochko
0bf31de1f1 New translations strings.xml (Japanese) 2023-03-06 21:23:36 +01:00
Eugen Rochko
7fd32cab3d New translations strings.xml (Japanese) 2023-03-06 19:38:06 +01:00
Grishka
4a695b2a83 Use a single display item for the image attachment grid 2023-03-06 02:25:13 +03:00
Grishka
a8ba50e762 Merge branch 'dev_clickable_links_hold_to_copy' 2023-03-05 22:33:35 +03:00
Grishka
f79fc66578 Fix 2023-03-05 22:33:18 +03:00
Eugen Rochko
0c63b99e6c New translations strings.xml (Japanese) 2023-03-05 02:15:44 +01:00
Eugen Rochko
5881f5fa05 New translations strings.xml (Japanese) 2023-03-05 01:20:11 +01:00
FineFindus
5e8ede6ab8 style(notifications-actions/reply): clean-up 2023-03-04 13:18:22 +01:00
FineFindus
1124bab96b style(notifications-actions/reply): clean-up 2023-03-04 13:16:27 +01:00
FineFindus
cbcdf09bfe Merge branch 'feat/notification-actions' 2023-03-04 13:16:17 +01:00
Eugen Rochko
575ca6251c New translations strings.xml (Arabic) 2023-03-03 20:35:51 +01:00
Eugen Rochko
9c83a5aaeb New translations strings.xml (Portuguese, Brazilian) 2023-03-02 15:21:36 +01:00
Eugen Rochko
bc3e46eae1 New translations strings.xml (Portuguese, Brazilian) 2023-03-02 14:20:26 +01:00
FineFindus
6756b36e87 style(notifications/action): fix whitespaces 2023-03-01 21:02:09 +01:00
FineFindus
36808e4e8e fix(notifications/action): remove unused string 2023-03-01 21:02:09 +01:00
FineFindus
1c38570609 fix(notifications/action): remove notification after tapping action 2023-03-01 21:02:09 +01:00
FineFindus
2dc6deb93a fix(notifications/action): use radom request code
Fixes the issue with pendingIntents overwriting each other. Probability of equal same request code should be near 0 with 2^32 ints available
2023-03-01 21:02:09 +01:00
FineFindus
0b58d19811 feat(notifications/action): remove notfication after action 2023-03-01 21:02:09 +01:00
FineFindus
50362d630b feat(notifications/action): add unboost action 2023-03-01 21:02:08 +01:00
FineFindus
bfcd67cbaf feat(notifications/action): only show actions if necessary 2023-03-01 21:02:08 +01:00
FineFindus
ea190c0597 feat(notifications/action): use string titles 2023-03-01 21:02:08 +01:00
FineFindus
e68160800d feat(notifications/action): add boost action 2023-03-01 21:02:08 +01:00
FineFindus
73481f4a1f Merge branch 'feat/notification-actions' 2023-03-01 20:59:54 +01:00
Eugen Rochko
0303e59fc1 New translations strings.xml (Bengali) 2023-02-28 16:38:40 +01:00
Eugen Rochko
0c0d36da62 New translations strings.xml (Bengali) 2023-02-28 13:32:43 +01:00
Eugen Rochko
e7e0b8841c New translations strings.xml (Bengali) 2023-02-28 12:21:52 +01:00
Eugen Rochko
79d9abe7f7 New translations full_description.txt (Turkish) 2023-02-27 17:26:40 +01:00
Eugen Rochko
684fbc0050 New translations strings.xml (Turkish) 2023-02-27 17:26:39 +01:00
Eugen Rochko
03973d41be New translations strings.xml (Turkish) 2023-02-27 16:25:31 +01:00
Eugen Rochko
06c533bf5a New translations full_description.txt (Japanese) 2023-02-27 08:35:37 +01:00
Eugen Rochko
cc64a20e53 New translations full_description.txt (Japanese) 2023-02-27 07:28:37 +01:00
Torge Rosendahl
4144639b75 docu 2023-02-26 13:59:39 -05:00
Eugen Rochko
d633b6f1d4 New translations strings.xml (Bengali) 2023-02-25 16:06:21 +01:00
Eugen Rochko
7b68baef0d New translations strings.xml (Bengali) 2023-02-25 13:06:26 +01:00
Eugen Rochko
fb5ef921f7 New translations strings.xml (Spanish) 2023-02-24 21:22:35 +01:00
Eugen Rochko
da44e50679 New translations strings.xml (Spanish) 2023-02-24 19:50:53 +01:00
Eugen Rochko
93d89f93b2 New translations strings.xml (Bengali) 2023-02-24 09:17:38 +01:00
Eugen Rochko
cce64f9a76 New translations strings.xml (Bengali) 2023-02-24 08:19:59 +01:00
Eugen Rochko
afb396acd8 New translations strings.xml (Chinese Traditional) 2023-02-22 18:07:34 +01:00
Eugen Rochko
0943908173 New translations strings.xml (Kabyle) 2023-02-20 08:34:11 +01:00
Eugen Rochko
b018788cd1 New translations strings.xml (Galician) 2023-02-19 22:35:48 +01:00
Eugen Rochko
4a315e73eb New translations strings.xml (Galician) 2023-02-19 21:34:24 +01:00
FineFindus
d0a9ba041d fix(fab): completly hide 2023-02-17 22:21:56 +01:00
sk22
7ea42c8403 Translated using Weblate (German)
Currently translated at 100.0% (16 of 16 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/de/
2023-02-17 12:30:41 +00:00
sk22
af9b527f35 Translated using Weblate (German)
Currently translated at 100.0% (262 of 262 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/de/
2023-02-17 12:30:40 +00:00
Espasant3
df58cdd86e Translated using Weblate (Galician)
Currently translated at 100.0% (15 of 15 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/gl/
2023-02-17 12:27:57 +00:00
ihor_ck
507fcea646 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (15 of 15 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/uk/
2023-02-17 12:27:57 +00:00
McKris
5cd1e88da9 Translated using Weblate (Polish)
Currently translated at 100.0% (15 of 15 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/pl/
2023-02-17 12:27:57 +00:00
AiOO
e2293899f0 Translated using Weblate (Korean)
Currently translated at 100.0% (15 of 15 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/ko/
2023-02-17 12:27:57 +00:00
gallegonovato
1c743ee3a6 Translated using Weblate (Spanish)
Currently translated at 100.0% (15 of 15 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/es/
2023-02-17 12:27:57 +00:00
ihor_ck
daf4c69df4 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (259 of 259 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/uk/
2023-02-17 12:27:57 +00:00
McKris
14d3add7b3 Translated using Weblate (Polish)
Currently translated at 100.0% (259 of 259 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/pl/
2023-02-17 12:27:57 +00:00
Espasant3
7e3193a708 Translated using Weblate (Galician)
Currently translated at 100.0% (259 of 259 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/gl/
2023-02-17 12:27:57 +00:00
gallegonovato
545aa16cd3 Translated using Weblate (Spanish)
Currently translated at 100.0% (259 of 259 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/es/
2023-02-17 12:27:57 +00:00
poesty
4dcf32d13a Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (259 of 259 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/zh_Hans/
2023-02-17 12:27:57 +00:00
AiOO
e0aba23e80 Translated using Weblate (Korean)
Currently translated at 100.0% (259 of 259 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/ko/
2023-02-17 12:27:57 +00:00
sk
b19ae9bb10 bump version 2023-02-17 13:27:41 +01:00
sk22
d20f8669e8 Auto-hide FAB on scroll (#435)
* feat(composeButton): hide fab on scroll
* feat(composeButton): hide when scrolling in profile fragment
* refactor(compose-fab): show fab after small scroll distance
* refactor(compose-fab): code cleanup
* feat(composeButton): hide when scrolling in profile
* fix: duplicate fab var
* feat(fab): show when scrolled to top
* add option to turn it off

---------

Co-authored-by: FineFindus <63370021+FineFindus@users.noreply.github.com>
2023-02-17 13:20:22 +01:00
sk
1567e5aba4 Merge remote-tracking branch 'upstream/master' 2023-02-17 12:45:36 +01:00
Eugen Rochko
b01ef6d5a7 New translations short_description.txt (Russian) 2023-02-17 10:01:43 +01:00
Eugen Rochko
604e581139 New translations full_description.txt (Russian) 2023-02-17 10:01:42 +01:00
Eugen Rochko
082f697b40 New translations strings.xml (Russian) 2023-02-17 10:01:41 +01:00
sk
6b9b6710cf enable remote-following accounts
closes sk22#431
2023-02-16 19:44:39 +01:00
sk
b07858a66d don't crash when language array empty 2023-02-16 17:04:56 +01:00
sk
c05d0b600e default role color if not provided
fixes sk22#430
2023-02-16 16:42:47 +01:00
Torge Rosendahl
0a8d73dc0b cleanup, resolved some warnings 2023-02-15 20:19:10 -05:00
Torge Rosendahl
fd99f3caa1 changed url longclick implementation to GestureListener 2023-02-15 20:16:20 -05:00
Torge Rosendahl
794c4e5227 removed longClickHandler and moved to view itself 2023-02-15 19:54:08 -05:00
Torge Rosendahl
f5df8225d1 whitespace corrections 2023-02-15 18:20:02 -05:00
Torge Rosendahl
42c6446125 refactoring: moved runnable and made it private, added copy toast localization. 2023-02-15 18:04:52 -05:00
Torge Rosendahl
e3486ebf7c added clickable link type switch for copy, to not copy hashtags and user IDs 2023-02-15 18:00:45 -05:00
Torge Rosendahl
c0115f068c implemented copy service 2023-02-15 17:40:43 -05:00
Torge Rosendahl
41682d1147 added press-and-hold listener to ClickableLinks 2023-02-15 17:30:31 -05:00
Eugen Rochko
8c61660cfc New translations strings.xml (Arabic) 2023-02-15 15:17:22 +01:00
Eugen Rochko
d6933be3cd New translations strings.xml (Arabic) 2023-02-15 13:12:38 +01:00
Eugen Rochko
ca6cfd2b91 New translations strings.xml (French) 2023-02-14 20:11:52 +01:00
Eugen Rochko
20960bdd57 New translations strings.xml (Belarusian) 2023-02-14 14:14:56 +01:00
Grishka
dd582c4bee Update locales & bump version 2023-02-14 03:57:49 +03:00
Grishka
3a0d314af0 Merge branch 'l10n_master' 2023-02-14 03:49:36 +03:00
sk
a00ca599c1 add newline 2023-02-13 17:58:27 +01:00
Choukajohn
263b5b10b6 Translated using Weblate (French)
Currently translated at 100.0% (259 of 259 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/fr/
2023-02-13 16:50:55 +00:00
sk22
1068fa3120 Translated using Weblate (German)
Currently translated at 100.0% (15 of 15 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/de/
2023-02-13 16:50:55 +00:00
sk22
569f288c00 Translated using Weblate (German)
Currently translated at 100.0% (259 of 259 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/de/
2023-02-13 16:50:54 +00:00
sk
dfd94511a5 bump version 2023-02-13 17:47:39 +01:00
sk
2271f336b0 Merge remote-tracking branch 'upstream/l10n_master' 2023-02-13 17:37:40 +01:00
Espasant3
4486feee76 Translated using Weblate (Galician)
Currently translated at 100.0% (259 of 259 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/gl/
2023-02-13 16:30:34 +00:00
ca
baaff2573c Translated using Weblate (Catalan)
Currently translated at 97.6% (253 of 259 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/ca/
2023-02-13 16:30:34 +00:00
sk
b9c3b23757 Merge remote-tracking branch 'weblate/main' 2023-02-13 17:30:04 +01:00
sk
0c1fd22253 Merge remote-tracking branch 'upstream' 2023-02-13 17:26:26 +01:00
sk
466c489b4d get edit image drawable with theme
closes sk22#401
2023-02-13 17:07:27 +01:00
sk
625f715e26 clarify spectator mode name 2023-02-13 16:57:18 +01:00
sk
61caec4060 fix wrong icon
closes sk22#421
2023-02-13 16:53:26 +01:00
sk
df233eb1e2 fix headers not filtered in notifications list 2023-02-13 16:51:55 +01:00
sk
78225c482f fix overlapping text
closes sk22#428
2023-02-13 16:32:52 +01:00
sk
c55703f0ba fix layout inconsistency
closes sk22#427
2023-02-13 16:28:51 +01:00
Eugen Rochko
3b26dd44a0 New translations strings.xml (Arabic) 2023-02-13 09:09:52 +01:00
HudobniVolk
2a1386a87a Translated using Weblate (Slovenian)
Currently translated at 71.4% (10 of 14 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/sl/
2023-02-12 16:56:42 +00:00
AiOO
fb32430f96 Translated using Weblate (Korean)
Currently translated at 100.0% (14 of 14 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/ko/
2023-02-12 16:56:42 +00:00
ihor_ck
2288c53adc Translated using Weblate (Ukrainian)
Currently translated at 100.0% (259 of 259 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/uk/
2023-02-12 16:56:41 +00:00
HudobniVolk
84b7b67045 Translated using Weblate (Slovenian)
Currently translated at 100.0% (259 of 259 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/sl/
2023-02-12 16:56:41 +00:00
edxkl
d233f039a3 Translated using Weblate (Portuguese (Brazil))
Currently translated at 95.7% (248 of 259 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/pt_BR/
2023-02-12 16:56:41 +00:00
Choukajohn
8b01955a18 Translated using Weblate (French)
Currently translated at 100.0% (259 of 259 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/fr/
2023-02-12 16:56:41 +00:00
gallegonovato
427aa1722d Translated using Weblate (Spanish)
Currently translated at 100.0% (259 of 259 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/es/
2023-02-12 16:56:41 +00:00
ling0412
2a7eb09998 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (259 of 259 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/zh_Hans/
2023-02-12 16:56:41 +00:00
AiOO
f2f48fce79 Translated using Weblate (Korean)
Currently translated at 100.0% (259 of 259 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/ko/
2023-02-12 16:56:41 +00:00
Grishka
634408b8cb Minor onboarding tweaks 2023-02-12 14:25:03 +03:00
Grishka
f050e3f22d Fix #500 2023-02-12 04:03:09 +03:00
Grishka
8e9531b718 Fix #528 2023-02-12 03:58:24 +03:00
HudobniVolk
00457c1edb Translated using Weblate (Slovenian)
Currently translated at 57.1% (8 of 14 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/sl/
2023-02-11 13:13:09 +00:00
Andrewblasco
aa14986fcc Translated using Weblate (Spanish)
Currently translated at 100.0% (14 of 14 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/es/
2023-02-11 13:13:09 +00:00
HudobniVolk
1493cd9034 Translated using Weblate (Slovenian)
Currently translated at 100.0% (258 of 258 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/sl/
2023-02-11 13:13:09 +00:00
edxkl
b2b295ee5b Translated using Weblate (Portuguese (Brazil))
Currently translated at 95.3% (246 of 258 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/pt_BR/
2023-02-11 13:13:08 +00:00
Andrewblasco
58847f80fd Translated using Weblate (Spanish)
Currently translated at 100.0% (258 of 258 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/es/
2023-02-11 13:13:08 +00:00
Eyre_S
ed9db7b5fd Translated using Weblate (Chinese (Traditional))
Currently translated at 14.2% (2 of 14 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/zh_Hant/
2023-02-11 13:13:08 +00:00
edxkl
433a7c6b7a Translated using Weblate (Portuguese (Brazil))
Currently translated at 92.8% (13 of 14 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/pt_BR/
2023-02-11 13:13:08 +00:00
Eyre_S
7692f587ef Translated using Weblate (Chinese (Traditional))
Currently translated at 23.2% (60 of 258 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/zh_Hant/
2023-02-11 13:13:08 +00:00
ihor_ck
67583150b2 Translated using Weblate (Ukrainian)
Currently translated at 100.0% (258 of 258 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/uk/
2023-02-11 13:13:08 +00:00
McKris
ed49422f76 Translated using Weblate (Polish)
Currently translated at 100.0% (258 of 258 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/pl/
2023-02-11 13:13:08 +00:00
Oliebol
63078aaa3e Translated using Weblate (Dutch)
Currently translated at 96.1% (248 of 258 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/nl/
2023-02-11 13:13:08 +00:00
Espasant3
9246c43ffe Translated using Weblate (Galician)
Currently translated at 100.0% (258 of 258 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/gl/
2023-02-11 13:13:08 +00:00
Choukajohn
15f02863c0 Translated using Weblate (French)
Currently translated at 100.0% (258 of 258 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/fr/
2023-02-11 13:13:08 +00:00
poesty
be1921879d Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (258 of 258 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/zh_Hans/
2023-02-11 13:13:08 +00:00
ling0412
61b43e0112 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (258 of 258 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/zh_Hans/
2023-02-11 13:13:08 +00:00
nkufideal
b25b482630 Translated using Weblate (Belarusian)
Currently translated at 7.1% (18 of 251 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/be/
2023-02-11 13:13:08 +00:00
AiOO
1d44875a65 Translated using Weblate (Korean)
Currently translated at 98.0% (246 of 251 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/ko/
2023-02-11 13:13:08 +00:00
edxkl
0dc5004898 Translated using Weblate (Portuguese (Brazil))
Currently translated at 96.0% (241 of 251 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/pt_BR/
2023-02-11 13:13:08 +00:00
Andrewblasco
0df86e315b Translated using Weblate (Spanish)
Currently translated at 100.0% (251 of 251 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/es/
2023-02-11 13:13:08 +00:00
tygyh
31d3fa77de Translated using Weblate (Swedish)
Currently translated at 71.4% (10 of 14 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/sv/
2023-02-11 13:13:08 +00:00
sandboiii
ec74b18c1a Translated using Weblate (Russian)
Currently translated at 100.0% (251 of 251 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/ru/
2023-02-11 13:13:08 +00:00
poesty
de36c31f45 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (251 of 251 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/zh_Hans/
2023-02-11 13:13:08 +00:00
HudobniVolk
43bcf0008e Translated using Weblate (Slovenian)
Currently translated at 42.8% (6 of 14 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/sl/
2023-02-11 13:13:08 +00:00
sheepnik
ac64087018 Translated using Weblate (Welsh)
Currently translated at 100.0% (14 of 14 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/cy/
2023-02-11 13:13:08 +00:00
sheepnik
af77865a46 Translated using Weblate (Welsh)
Currently translated at 100.0% (251 of 251 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/cy/
2023-02-11 13:13:08 +00:00
ling0412
51a4a41147 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (14 of 14 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/zh_Hans/
2023-02-11 13:13:08 +00:00
HudobniVolk
987474462d Translated using Weblate (Slovenian)
Currently translated at 100.0% (251 of 251 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/sl/
2023-02-11 13:13:08 +00:00
Oliebol
c34ab79c6c Translated using Weblate (Dutch)
Currently translated at 96.8% (243 of 251 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/nl/
2023-02-11 13:13:08 +00:00
ling0412
8bac664a34 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (251 of 251 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/zh_Hans/
2023-02-11 13:13:08 +00:00
poesty
d77647c354 Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (251 of 251 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/zh_Hans/
2023-02-11 13:13:08 +00:00
sheepnik
e8ef6ef2c7 Translated using Weblate (Welsh)
Currently translated at 91.6% (230 of 251 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/cy/
2023-02-11 13:13:08 +00:00
ca
a87cf640dd Translated using Weblate (Catalan)
Currently translated at 100.0% (14 of 14 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/ca/
2023-02-11 13:13:08 +00:00
Daudix_UFO
bcb69f1f47 Translated using Weblate (Russian)
Currently translated at 89.6% (225 of 251 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/ru/
2023-02-11 13:13:08 +00:00
Mannivu
0bdcc9057b Translated using Weblate (Italian)
Currently translated at 100.0% (251 of 251 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/it/
2023-02-11 13:13:08 +00:00
ghose
f92977fddf Translated using Weblate (Galician)
Currently translated at 100.0% (251 of 251 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/gl/
2023-02-11 13:13:08 +00:00
Tribela
230a59266d Translated using Weblate (Korean)
Currently translated at 93.6% (235 of 251 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/ko/
2023-02-11 13:13:08 +00:00
ca
d97f3ed5c8 Translated using Weblate (Catalan)
Currently translated at 98.0% (246 of 251 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/ca/
2023-02-11 13:13:08 +00:00
Linerly
aae2cd2b65 Translated using Weblate (Indonesian)
Currently translated at 100.0% (14 of 14 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/id/
2023-02-11 13:13:08 +00:00
Linerly
8b8763bffc Translated using Weblate (Indonesian)
Currently translated at 100.0% (251 of 251 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/id/
2023-02-11 13:13:08 +00:00
McKris
35758e720d Translated using Weblate (Polish)
Currently translated at 100.0% (14 of 14 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/pl/
2023-02-11 13:13:08 +00:00
McKris
fa48c80ab1 Translated using Weblate (Polish)
Currently translated at 100.0% (251 of 251 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/pl/
2023-02-11 13:13:08 +00:00
ihor_ck
1621dbc67a Translated using Weblate (Ukrainian)
Currently translated at 100.0% (14 of 14 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/uk/
2023-02-11 13:13:08 +00:00
Andrewblasco
4ece7b883f Translated using Weblate (Spanish)
Currently translated at 100.0% (14 of 14 strings)

Translation: Megalodon/metadata
Translate-URL: https://translate.codeberg.org/projects/megalodon/metadata/es/
2023-02-11 13:13:07 +00:00
ihor_ck
66a5b749fe Translated using Weblate (Ukrainian)
Currently translated at 100.0% (251 of 251 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/uk/
2023-02-11 13:13:07 +00:00
Andrewblasco
49a80767a7 Translated using Weblate (Spanish)
Currently translated at 100.0% (251 of 251 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/es/
2023-02-11 13:13:07 +00:00
Choukajohn
7683b464f3 Translated using Weblate (French)
Currently translated at 100.0% (251 of 251 strings)

Translation: Megalodon/values
Translate-URL: https://translate.codeberg.org/projects/megalodon/values/fr/
2023-02-11 13:13:07 +00:00
Grishka
64fbbb2f07 Minor onboarding stuff 2023-02-10 21:09:06 +03:00
Eugen Rochko
9003f690d1 New translations strings.xml (French) 2023-02-10 14:16:02 +01:00
Eugen Rochko
8ffaca61bd New translations strings.xml (Portuguese, Brazilian) 2023-02-08 22:57:10 +01:00
Eugen Rochko
f6c3b10c2b New translations strings.xml (Portuguese, Brazilian) 2023-02-08 20:46:53 +01:00
Eugen Rochko
d68a3a6ef5 New translations strings.xml (Polish) 2023-02-05 18:37:14 +01:00
Eugen Rochko
4475bd039a New translations strings.xml (Hungarian) 2023-02-05 10:32:04 +01:00
Eugen Rochko
98dc7d0524 New translations strings.xml (Hungarian) 2023-02-05 09:17:45 +01:00
Eugen Rochko
65948030a6 New translations strings.xml (Russian) 2023-02-04 14:07:29 +01:00
Eugen Rochko
89edfaaa6d New translations strings.xml (Russian) 2023-02-04 13:11:55 +01:00
Eugen Rochko
10372804e4 New translations strings.xml (Thai) 2023-02-04 09:10:51 +01:00
Eugen Rochko
d1dd7d203b New translations strings.xml (German) 2023-02-03 18:47:42 +01:00
Eugen Rochko
c6aed0b52e New translations strings.xml (French) 2023-02-03 16:09:58 +01:00
Eugen Rochko
5f902d25a9 New translations strings.xml (Basque) 2023-02-03 12:29:06 +01:00
Eugen Rochko
c43bed665d New translations strings.xml (Catalan) 2023-02-03 12:29:05 +01:00
Eugen Rochko
d70a2ae5b3 New translations strings.xml (Russian) 2023-02-03 10:03:24 +01:00
Eugen Rochko
1fdf36b4d8 New translations strings.xml (Portuguese, Brazilian) 2023-02-03 09:05:37 +01:00
Eugen Rochko
5d1cd0f4f6 New translations strings.xml (Vietnamese) 2023-02-02 07:01:44 +01:00
Eugen Rochko
3505460372 New translations strings.xml (Chinese Traditional) 2023-02-01 03:56:06 +01:00
Eugen Rochko
eeb91e867e New translations strings.xml (Chinese Traditional) 2023-02-01 02:54:48 +01:00
Eugen Rochko
c87062ee31 New translations strings.xml (Slovenian) 2023-01-31 21:33:54 +01:00
Eugen Rochko
fb66fa1c6f New translations strings.xml (Italian) 2023-01-31 20:07:33 +01:00
Eugen Rochko
f80af9f5bf New translations strings.xml (Italian) 2023-01-31 18:30:56 +01:00
Eugen Rochko
85157ffe25 New translations strings.xml (Thai) 2023-01-31 17:27:18 +01:00
Eugen Rochko
59f95159b7 New translations strings.xml (German) 2023-01-31 13:41:46 +01:00
Eugen Rochko
703dbd4c8a New translations strings.xml (Portuguese, Brazilian) 2023-01-31 07:47:05 +01:00
Eugen Rochko
1e75f9f1c2 New translations strings.xml (Dutch) 2023-01-30 23:35:25 +01:00
Eugen Rochko
d0860333a9 New translations strings.xml (Dutch) 2023-01-30 22:36:37 +01:00
Eugen Rochko
64b3951c25 New translations strings.xml (German) 2023-01-30 18:52:51 +01:00
Eugen Rochko
e89e6cc3f5 New translations strings.xml (Icelandic) 2023-01-30 11:40:53 +01:00
Eugen Rochko
3c2985fa6e New translations strings.xml (Icelandic) 2023-01-30 10:39:01 +01:00
Eugen Rochko
bee01429f2 New translations full_description.txt (Portuguese, Brazilian) 2023-01-30 05:41:59 +01:00
Eugen Rochko
a96431cc00 New translations strings.xml (Portuguese, Brazilian) 2023-01-30 05:41:58 +01:00
Eugen Rochko
bf9e6f54cf New translations strings.xml (Portuguese, Brazilian) 2023-01-30 04:35:45 +01:00
Eugen Rochko
63084857a3 New translations strings.xml (Kabyle) 2023-01-30 00:02:18 +01:00
Eugen Rochko
d8b7038972 New translations strings.xml (Occitan) 2023-01-30 00:02:18 +01:00
Eugen Rochko
976e71db25 New translations strings.xml (Scottish Gaelic) 2023-01-30 00:02:17 +01:00
Eugen Rochko
2b59c2c080 New translations strings.xml (Sinhala) 2023-01-30 00:02:16 +01:00
Eugen Rochko
5929b0c6b9 New translations strings.xml (Bosnian) 2023-01-30 00:02:15 +01:00
Eugen Rochko
e160a05411 New translations strings.xml (Filipino) 2023-01-30 00:02:14 +01:00
Eugen Rochko
78d8f075a9 New translations strings.xml (Burmese) 2023-01-30 00:02:13 +01:00
Eugen Rochko
3784873cad New translations strings.xml (Hindi) 2023-01-30 00:02:12 +01:00
Eugen Rochko
528f8aaead New translations strings.xml (Croatian) 2023-01-30 00:02:11 +01:00
Eugen Rochko
4ba9f1ecaf New translations strings.xml (Thai) 2023-01-30 00:02:10 +01:00
Eugen Rochko
697a666545 New translations strings.xml (Bengali) 2023-01-30 00:02:09 +01:00
Eugen Rochko
0ee6798424 New translations strings.xml (Persian) 2023-01-30 00:02:08 +01:00
Eugen Rochko
9a95deb346 New translations strings.xml (Indonesian) 2023-01-30 00:02:07 +01:00
Eugen Rochko
0155ef2675 New translations strings.xml (Icelandic) 2023-01-30 00:02:06 +01:00
Eugen Rochko
858195f813 New translations strings.xml (Vietnamese) 2023-01-30 00:02:06 +01:00
Eugen Rochko
b681c7dfeb New translations strings.xml (Chinese Traditional) 2023-01-30 00:02:05 +01:00
Eugen Rochko
b89f931ffd New translations strings.xml (Galician) 2023-01-30 00:02:04 +01:00
Eugen Rochko
1658e56729 New translations strings.xml (Igbo) 2023-01-30 00:02:03 +01:00
Eugen Rochko
2b7d8292ed New translations strings.xml (Portuguese, Brazilian) 2023-01-30 00:02:02 +01:00
Eugen Rochko
494abdfeee New translations strings.xml (Chinese Simplified) 2023-01-30 00:02:01 +01:00
Eugen Rochko
426f3fe95b New translations strings.xml (Ukrainian) 2023-01-30 00:02:00 +01:00
Eugen Rochko
b7a96778b8 New translations strings.xml (Swedish) 2023-01-30 00:01:59 +01:00
Eugen Rochko
125cd525bf New translations strings.xml (Slovenian) 2023-01-30 00:01:58 +01:00
Eugen Rochko
ed281a4619 New translations strings.xml (Russian) 2023-01-30 00:01:58 +01:00
Eugen Rochko
f418a5a2c4 New translations strings.xml (Portuguese) 2023-01-30 00:01:57 +01:00
Eugen Rochko
6d8971df64 New translations strings.xml (Dutch) 2023-01-30 00:01:56 +01:00
Eugen Rochko
8dd3343906 New translations strings.xml (Korean) 2023-01-30 00:01:55 +01:00
Eugen Rochko
f65fc9299a New translations strings.xml (Japanese) 2023-01-30 00:01:54 +01:00
Eugen Rochko
ac00889001 New translations strings.xml (Italian) 2023-01-30 00:01:53 +01:00
Eugen Rochko
7af0a3f351 New translations strings.xml (Armenian) 2023-01-30 00:01:52 +01:00
Eugen Rochko
2734f88206 New translations strings.xml (Hebrew) 2023-01-30 00:01:51 +01:00
Eugen Rochko
c6cd8ca14b New translations strings.xml (Irish) 2023-01-30 00:01:50 +01:00
Eugen Rochko
2fd61f738f New translations strings.xml (Finnish) 2023-01-30 00:01:50 +01:00
Eugen Rochko
d3575b60fe New translations strings.xml (Basque) 2023-01-30 00:01:49 +01:00
Eugen Rochko
dce8808d62 New translations strings.xml (Greek) 2023-01-30 00:01:48 +01:00
Eugen Rochko
db97dadb25 New translations strings.xml (German) 2023-01-30 00:01:47 +01:00
Eugen Rochko
34116d9914 New translations strings.xml (Danish) 2023-01-30 00:01:46 +01:00
Eugen Rochko
bc676e6eb3 New translations strings.xml (Catalan) 2023-01-30 00:01:45 +01:00
Eugen Rochko
ef2cb31b6c New translations strings.xml (Arabic) 2023-01-30 00:01:44 +01:00
Eugen Rochko
c45dc96316 New translations strings.xml (French) 2023-01-30 00:01:43 +01:00
Eugen Rochko
f9b34b53c1 New translations strings.xml (Romanian) 2023-01-30 00:01:42 +01:00
Eugen Rochko
e128e144b1 New translations strings.xml (Turkish) 2023-01-30 00:01:41 +01:00
Eugen Rochko
c68ed6088f New translations strings.xml (Spanish) 2023-01-30 00:01:40 +01:00
Eugen Rochko
b66ad0e6f5 New translations strings.xml (Polish) 2023-01-30 00:01:39 +01:00
Eugen Rochko
02a470bd7d New translations strings.xml (Belarusian) 2023-01-30 00:01:39 +01:00
Eugen Rochko
9407bd9e86 New translations strings.xml (Hungarian) 2023-01-30 00:01:38 +01:00
Eugen Rochko
825adda664 New translations strings.xml (Czech) 2023-01-30 00:01:37 +01:00
Eugen Rochko
0a22c14eec New translations strings.xml (Norwegian) 2023-01-30 00:01:35 +01:00
Eugen Rochko
5452da6a65 New translations strings.xml (German) 2023-01-29 22:55:32 +01:00
Eugen Rochko
ffb321e36f New translations strings.xml (German) 2023-01-29 21:52:09 +01:00
Eugen Rochko
eaecff52c9 New translations strings.xml (Portuguese, Brazilian) 2023-01-29 21:52:08 +01:00
Eugen Rochko
b141a9ac74 New translations strings.xml (Portuguese, Brazilian) 2023-01-29 18:37:47 +01:00
Eugen Rochko
a890f21ace New translations strings.xml (Polish) 2023-01-28 23:17:50 +01:00
Eugen Rochko
4e72e5c234 New translations strings.xml (Polish) 2023-01-28 22:19:28 +01:00
Eugen Rochko
1def56057a New translations strings.xml (Vietnamese) 2023-01-28 15:42:21 +01:00
Eugen Rochko
d99f6c7167 New translations strings.xml (Vietnamese) 2023-01-28 14:39:22 +01:00
Eugen Rochko
0d5d169e5f New translations strings.xml (Korean) 2023-01-28 01:46:35 +01:00
Eugen Rochko
90e55c1043 New translations strings.xml (Korean) 2023-01-28 00:36:07 +01:00
Eugen Rochko
780c5c345c New translations strings.xml (Spanish) 2023-01-27 17:31:12 +01:00
Eugen Rochko
c2bc0a4055 New translations strings.xml (Dutch) 2023-01-27 14:07:08 +01:00
Eugen Rochko
8032de4595 New translations strings.xml (Ukrainian) 2023-01-26 19:50:28 +01:00
Eugen Rochko
bd3f5018ed New translations strings.xml (Ukrainian) 2023-01-26 18:48:15 +01:00
Eugen Rochko
91c4e5e51f New translations strings.xml (Thai) 2023-01-26 14:50:19 +01:00
Eugen Rochko
ca1cb668f3 New translations strings.xml (Chinese Traditional) 2023-01-26 06:12:30 +01:00
Eugen Rochko
a12ca697ed New translations strings.xml (Arabic) 2023-01-26 06:12:29 +01:00
Eugen Rochko
3ccb629a4e New translations strings.xml (Kabyle) 2023-01-25 23:45:26 +01:00
Eugen Rochko
4db041c28f New translations strings.xml (Occitan) 2023-01-25 23:45:25 +01:00
Eugen Rochko
bdcf4a5438 New translations strings.xml (Scottish Gaelic) 2023-01-25 23:45:24 +01:00
Eugen Rochko
c042050295 New translations strings.xml (Sinhala) 2023-01-25 23:45:23 +01:00
Eugen Rochko
f87a87aba1 New translations strings.xml (Bosnian) 2023-01-25 23:45:22 +01:00
Eugen Rochko
b3a88c4a7c New translations strings.xml (Filipino) 2023-01-25 23:45:21 +01:00
Eugen Rochko
9729663cb4 New translations strings.xml (Burmese) 2023-01-25 23:45:20 +01:00
Eugen Rochko
f66e6197d3 New translations strings.xml (Hindi) 2023-01-25 23:45:19 +01:00
Eugen Rochko
4ff940030d New translations strings.xml (Croatian) 2023-01-25 23:45:18 +01:00
Eugen Rochko
da8b88dfc6 New translations strings.xml (Thai) 2023-01-25 23:45:17 +01:00
Eugen Rochko
ed13b1074d New translations strings.xml (Bengali) 2023-01-25 23:45:16 +01:00
Eugen Rochko
c5e985f6a4 New translations strings.xml (Persian) 2023-01-25 23:45:15 +01:00
Eugen Rochko
160bb4e272 New translations strings.xml (Indonesian) 2023-01-25 23:45:14 +01:00
Eugen Rochko
f89a3e644a New translations strings.xml (Icelandic) 2023-01-25 23:45:13 +01:00
Eugen Rochko
4cfd0db899 New translations strings.xml (Vietnamese) 2023-01-25 23:45:12 +01:00
Eugen Rochko
c6cb992b92 New translations strings.xml (Chinese Traditional) 2023-01-25 23:45:11 +01:00
Eugen Rochko
1b3ea6cdbe New translations strings.xml (Chinese Simplified) 2023-01-25 23:45:10 +01:00
Eugen Rochko
79323e392b New translations strings.xml (Ukrainian) 2023-01-25 23:45:08 +01:00
Eugen Rochko
c6c985c1db New translations strings.xml (Swedish) 2023-01-25 23:45:07 +01:00
Eugen Rochko
8988b22a52 New translations strings.xml (Slovenian) 2023-01-25 23:45:06 +01:00
Eugen Rochko
692ede503c New translations strings.xml (Russian) 2023-01-25 23:45:05 +01:00
Eugen Rochko
3be04343b8 New translations strings.xml (Portuguese) 2023-01-25 23:45:04 +01:00
Eugen Rochko
521157315b New translations strings.xml (Dutch) 2023-01-25 23:45:03 +01:00
Eugen Rochko
b4d7b34767 New translations strings.xml (Korean) 2023-01-25 23:45:02 +01:00
Eugen Rochko
f912e90691 New translations strings.xml (Japanese) 2023-01-25 23:45:01 +01:00
Eugen Rochko
61ff2ce7e4 New translations strings.xml (Italian) 2023-01-25 23:45:00 +01:00
Eugen Rochko
0316ec340a New translations strings.xml (Armenian) 2023-01-25 23:44:59 +01:00
Eugen Rochko
3975e8c280 New translations strings.xml (Hebrew) 2023-01-25 23:44:58 +01:00
Eugen Rochko
37c40e4a8d New translations strings.xml (Irish) 2023-01-25 23:44:57 +01:00
Eugen Rochko
7dc691deae New translations strings.xml (Finnish) 2023-01-25 23:44:56 +01:00
Eugen Rochko
ab5dfe6f62 New translations strings.xml (Basque) 2023-01-25 23:44:55 +01:00
Eugen Rochko
b445e6f79f New translations strings.xml (Greek) 2023-01-25 23:44:54 +01:00
Eugen Rochko
5f0cd72303 New translations strings.xml (German) 2023-01-25 23:44:53 +01:00
Eugen Rochko
53dfa08300 New translations strings.xml (Danish) 2023-01-25 23:44:53 +01:00
Eugen Rochko
321c23c52e New translations strings.xml (Catalan) 2023-01-25 23:44:51 +01:00
Eugen Rochko
dd6cb4af74 New translations strings.xml (Arabic) 2023-01-25 23:44:50 +01:00
Eugen Rochko
54b6aaec09 New translations strings.xml (French) 2023-01-25 23:44:50 +01:00
Eugen Rochko
624d21d18b New translations strings.xml (Romanian) 2023-01-25 23:44:49 +01:00
Eugen Rochko
5c27155507 New translations strings.xml (Galician) 2023-01-25 23:44:48 +01:00
Eugen Rochko
35552cfbef New translations strings.xml (Turkish) 2023-01-25 23:44:46 +01:00
Eugen Rochko
31bbeef24e New translations strings.xml (Spanish) 2023-01-25 23:44:46 +01:00
Eugen Rochko
5ee42c0294 New translations strings.xml (Igbo) 2023-01-25 23:44:45 +01:00
Eugen Rochko
3d08f768f8 New translations strings.xml (Polish) 2023-01-25 23:44:44 +01:00
Eugen Rochko
603e3d7d65 New translations strings.xml (Belarusian) 2023-01-25 23:44:43 +01:00
Eugen Rochko
eb8f71aa31 New translations strings.xml (Portuguese, Brazilian) 2023-01-25 23:44:42 +01:00
Eugen Rochko
c7b5b41128 New translations strings.xml (Hungarian) 2023-01-25 23:44:41 +01:00
Eugen Rochko
98dbff38ff New translations strings.xml (Czech) 2023-01-25 23:44:40 +01:00
Eugen Rochko
d9317f6eb1 New translations strings.xml (Norwegian) 2023-01-25 23:44:39 +01:00
Eugen Rochko
4b5dff8742 New translations short_description.txt (Danish) 2023-01-25 22:14:11 +01:00
Eugen Rochko
2256ef6232 New translations full_description.txt (Danish) 2023-01-25 22:14:10 +01:00
Eugen Rochko
182bc09023 New translations strings.xml (Danish) 2023-01-25 22:14:09 +01:00
Eugen Rochko
a60e5040ea New translations strings.xml (Portuguese, Brazilian) 2023-01-25 22:14:08 +01:00
Eugen Rochko
c2a6e17fa5 New translations strings.xml (Thai) 2023-01-25 21:08:37 +01:00
Eugen Rochko
85931e2a65 New translations strings.xml (Portuguese, Brazilian) 2023-01-25 21:08:36 +01:00
Eugen Rochko
da94cd801b New translations strings.xml (Thai) 2023-01-25 18:24:53 +01:00
Eugen Rochko
594570f9a1 New translations strings.xml (Italian) 2023-01-25 10:10:05 +01:00
Eugen Rochko
548a14ab60 New translations strings.xml (Chinese Traditional) 2023-01-25 05:20:29 +01:00
Eugen Rochko
40016332ff New translations strings.xml (Chinese Traditional) 2023-01-25 04:16:16 +01:00
Eugen Rochko
2b9746232b New translations strings.xml (Kabyle) 2023-01-24 21:53:35 +01:00
Eugen Rochko
1fe31e9262 New translations strings.xml (Occitan) 2023-01-24 21:53:34 +01:00
Eugen Rochko
b2a152a728 New translations strings.xml (Scottish Gaelic) 2023-01-24 21:53:33 +01:00
Eugen Rochko
f93d9a0c35 New translations strings.xml (Sinhala) 2023-01-24 21:53:31 +01:00
Eugen Rochko
af9d9c3f48 New translations strings.xml (Bosnian) 2023-01-24 21:53:30 +01:00
Eugen Rochko
5cae41a500 New translations strings.xml (Filipino) 2023-01-24 21:53:29 +01:00
Eugen Rochko
d6c560e015 New translations strings.xml (Burmese) 2023-01-24 21:53:28 +01:00
Eugen Rochko
a2679a3841 New translations strings.xml (Hindi) 2023-01-24 21:53:27 +01:00
Eugen Rochko
d826e0172b New translations strings.xml (Croatian) 2023-01-24 21:53:26 +01:00
Eugen Rochko
f593f5eb58 New translations strings.xml (Thai) 2023-01-24 21:53:25 +01:00
Eugen Rochko
d29565af9c New translations strings.xml (Bengali) 2023-01-24 21:53:24 +01:00
Eugen Rochko
7c3cef32ed New translations strings.xml (Persian) 2023-01-24 21:53:23 +01:00
Eugen Rochko
2c15796108 New translations strings.xml (Indonesian) 2023-01-24 21:53:22 +01:00
Eugen Rochko
553a3ef7e1 New translations strings.xml (Icelandic) 2023-01-24 21:53:21 +01:00
Eugen Rochko
a7dfb671ce New translations strings.xml (Vietnamese) 2023-01-24 21:53:20 +01:00
Eugen Rochko
929218d74c New translations strings.xml (Chinese Traditional) 2023-01-24 21:53:19 +01:00
Eugen Rochko
a5ec9695df New translations strings.xml (Chinese Simplified) 2023-01-24 21:53:18 +01:00
Eugen Rochko
2784828a93 New translations strings.xml (Ukrainian) 2023-01-24 21:53:16 +01:00
Eugen Rochko
84657e9529 New translations strings.xml (Swedish) 2023-01-24 21:53:15 +01:00
Eugen Rochko
110375462e New translations strings.xml (Slovenian) 2023-01-24 21:53:14 +01:00
Eugen Rochko
09e385633e New translations strings.xml (Russian) 2023-01-24 21:53:14 +01:00
Eugen Rochko
f7410a510f New translations strings.xml (Portuguese) 2023-01-24 21:53:13 +01:00
Eugen Rochko
20511fd39d New translations strings.xml (Dutch) 2023-01-24 21:53:12 +01:00
Eugen Rochko
dbacbe0341 New translations strings.xml (Korean) 2023-01-24 21:53:11 +01:00
Eugen Rochko
bd8da39a19 New translations strings.xml (Japanese) 2023-01-24 21:53:09 +01:00
Eugen Rochko
675a353494 New translations strings.xml (Italian) 2023-01-24 21:53:08 +01:00
Eugen Rochko
7b23ca1c96 New translations strings.xml (Armenian) 2023-01-24 21:53:08 +01:00
Eugen Rochko
61e8c6f435 New translations strings.xml (Hebrew) 2023-01-24 21:53:07 +01:00
Eugen Rochko
a41b8dbb01 New translations strings.xml (Irish) 2023-01-24 21:53:06 +01:00
Eugen Rochko
fe525f9242 New translations strings.xml (Finnish) 2023-01-24 21:53:05 +01:00
Eugen Rochko
7cbae9c0a9 New translations strings.xml (Basque) 2023-01-24 21:53:04 +01:00
Eugen Rochko
93ac0a103f New translations strings.xml (Greek) 2023-01-24 21:53:03 +01:00
Eugen Rochko
3b11787984 New translations strings.xml (German) 2023-01-24 21:53:02 +01:00
Eugen Rochko
7b6fcaf3db New translations strings.xml (Danish) 2023-01-24 21:53:00 +01:00
Eugen Rochko
11b838f394 New translations strings.xml (Catalan) 2023-01-24 21:52:59 +01:00
Eugen Rochko
38bd5eb68e New translations strings.xml (Arabic) 2023-01-24 21:52:58 +01:00
Eugen Rochko
1dc8d66b3f New translations strings.xml (French) 2023-01-24 21:52:57 +01:00
Eugen Rochko
9f64e56923 New translations strings.xml (Romanian) 2023-01-24 21:52:56 +01:00
Eugen Rochko
a9e84678b3 New translations strings.xml (Galician) 2023-01-24 21:52:55 +01:00
Eugen Rochko
d7c5c0074d New translations strings.xml (Turkish) 2023-01-24 21:52:54 +01:00
Eugen Rochko
97e148f4c8 New translations strings.xml (Spanish) 2023-01-24 21:52:53 +01:00
Eugen Rochko
e83bd039b3 New translations strings.xml (Igbo) 2023-01-24 21:52:52 +01:00
Eugen Rochko
a30d288b13 New translations strings.xml (Polish) 2023-01-24 21:52:51 +01:00
Eugen Rochko
ded14711ac New translations strings.xml (Belarusian) 2023-01-24 21:52:50 +01:00
Eugen Rochko
cece9d4aa1 New translations strings.xml (Portuguese, Brazilian) 2023-01-24 21:52:49 +01:00
Eugen Rochko
f7f56c7a9b New translations strings.xml (Hungarian) 2023-01-24 21:52:48 +01:00
Eugen Rochko
613a9de40e New translations strings.xml (Czech) 2023-01-24 21:52:47 +01:00
Eugen Rochko
9ed8ad1382 New translations strings.xml (Norwegian) 2023-01-24 21:52:46 +01:00
Eugen Rochko
7498118800 New translations strings.xml (Belarusian) 2023-01-23 13:24:17 +01:00
Eugen Rochko
b894827607 New translations strings.xml (Belarusian) 2023-01-23 12:18:10 +01:00
Eugen Rochko
8788fb0b27 New translations full_description.txt (Galician) 2023-01-19 06:28:17 +01:00
Eugen Rochko
62d4c62888 New translations strings.xml (Galician) 2023-01-19 06:28:15 +01:00
Eugen Rochko
572d092f88 New translations strings.xml (Galician) 2023-01-19 05:18:11 +01:00
Eugen Rochko
2ff771391c New translations strings.xml (Turkish) 2023-01-17 21:00:59 +01:00
Eugen Rochko
087e55277c New translations strings.xml (Spanish) 2023-01-17 14:46:10 +01:00
Eugen Rochko
a2d45fbbc5 New translations full_description.txt (Spanish) 2023-01-17 13:50:33 +01:00
Eugen Rochko
59262fe345 New translations full_description.txt (Belarusian) 2023-01-17 08:34:46 +01:00
Eugen Rochko
ffc36f7346 New translations short_description.txt (Belarusian) 2023-01-16 16:05:34 +01:00
Eugen Rochko
549ace65f5 New translations full_description.txt (Belarusian) 2023-01-16 16:05:33 +01:00
Eugen Rochko
c76bec2298 New translations strings.xml (Belarusian) 2023-01-16 16:05:32 +01:00
Eugen Rochko
290e47386e New translations strings.xml (Belarusian) 2023-01-16 14:43:34 +01:00
Eugen Rochko
3d96475c21 New translations strings.xml (Belarusian) 2023-01-16 12:54:15 +01:00
Eugen Rochko
b62fe06187 New translations strings.xml (Belarusian) 2023-01-16 11:49:53 +01:00
Eugen Rochko
c0dc2b8392 New translations strings.xml (Belarusian) 2023-01-16 09:21:59 +01:00
Eugen Rochko
e777bbb215 New translations strings.xml (Belarusian) 2023-01-16 08:16:21 +01:00
Eugen Rochko
014f9f4d99 New translations strings.xml (Belarusian) 2023-01-15 22:22:23 +01:00
Eugen Rochko
86bfd3d09f New translations strings.xml (Igbo) 2023-01-15 14:40:38 +01:00
Eugen Rochko
21d6f6da4c New translations title.txt (Igbo) 2023-01-15 13:36:28 +01:00
Eugen Rochko
f826e0ceef New translations short_description.txt (Igbo) 2023-01-15 13:36:28 +01:00
Eugen Rochko
458ad0f51a New translations full_description.txt (Igbo) 2023-01-15 13:36:27 +01:00
Eugen Rochko
9a0ff42ec2 New translations strings.xml (Igbo) 2023-01-15 13:36:26 +01:00
Eugen Rochko
18dae448ec New translations full_description.txt (Portuguese) 2023-01-14 14:57:31 +01:00
Eugen Rochko
fc36a8cc8f New translations full_description.txt (Portuguese) 2023-01-14 13:59:38 +01:00
Eugen Rochko
a390df2b9e New translations full_description.txt (Polish) 2023-01-14 07:31:44 +01:00
Eugen Rochko
6f61d3f0e3 New translations strings.xml (Polish) 2023-01-14 07:31:43 +01:00
Eugen Rochko
3a4e8ebdf4 New translations strings.xml (Polish) 2023-01-14 06:36:08 +01:00
Eugen Rochko
537242b277 New translations strings.xml (Czech) 2023-01-13 17:24:51 +01:00
Eugen Rochko
97eece59ea New translations strings.xml (Belarusian) 2023-01-13 15:29:36 +01:00
Eugen Rochko
fc88d42e50 New translations strings.xml (Belarusian) 2023-01-13 14:21:42 +01:00
Eugen Rochko
ec74712e55 New translations strings.xml (Belarusian) 2023-01-13 11:50:08 +01:00
Eugen Rochko
12e1ccf439 New translations strings.xml (Belarusian) 2023-01-13 10:53:08 +01:00
Eugen Rochko
24b8d5ce7c New translations strings.xml (Belarusian) 2023-01-13 07:50:35 +01:00
Eugen Rochko
46c9c83b63 New translations strings.xml (Belarusian) 2023-01-13 06:47:00 +01:00
Eugen Rochko
526a9fec03 New translations strings.xml (Belarusian) 2023-01-13 05:47:47 +01:00
Eugen Rochko
ca20f3b906 New translations strings.xml (Portuguese, Brazilian) 2023-01-13 01:19:33 +01:00
Eugen Rochko
af8c8a6248 New translations strings.xml (Portuguese, Brazilian) 2023-01-12 22:31:03 +01:00
Eugen Rochko
2940e5d3d8 New translations strings.xml (Portuguese, Brazilian) 2023-01-12 03:45:12 +01:00
Eugen Rochko
c98b001c9f New translations strings.xml (Portuguese, Brazilian) 2023-01-12 02:45:05 +01:00
Eugen Rochko
1fc1c95d6e New translations full_description.txt (Czech) 2023-01-11 12:16:25 +01:00
Eugen Rochko
e4d0c4eda5 New translations strings.xml (Czech) 2023-01-11 12:16:23 +01:00
Eugen Rochko
801d11c8e6 New translations short_description.txt (Norwegian) 2023-01-11 11:15:30 +01:00
Eugen Rochko
8143374929 New translations full_description.txt (Norwegian) 2023-01-11 11:15:29 +01:00
Eugen Rochko
df2ff9f874 New translations strings.xml (Norwegian) 2023-01-11 11:15:28 +01:00
Eugen Rochko
4bac852d37 New translations strings.xml (Norwegian) 2023-01-11 08:30:29 +01:00
Eugen Rochko
862a173392 New translations title.txt (Norwegian) 2023-01-07 17:43:49 +01:00
Eugen Rochko
bd47b31c65 New translations short_description.txt (Norwegian) 2023-01-07 17:43:48 +01:00
Eugen Rochko
aefb7f2e23 New translations full_description.txt (Norwegian) 2023-01-07 17:43:48 +01:00
Eugen Rochko
e509b8afa4 New translations strings.xml (Norwegian) 2023-01-07 17:43:47 +01:00
Eugen Rochko
7b94f7258f New translations title.txt (Danish) 2023-01-07 17:43:46 +01:00
Eugen Rochko
8d81efae4e New translations short_description.txt (Danish) 2023-01-07 17:43:45 +01:00
Eugen Rochko
5b0b80277c New translations full_description.txt (Danish) 2023-01-07 17:43:44 +01:00
Eugen Rochko
60293d5a65 New translations strings.xml (Danish) 2023-01-07 17:43:43 +01:00
Eugen Rochko
09b4aff9f5 New translations strings.xml (Filipino) 2023-01-06 11:31:21 +01:00
Eugen Rochko
7326cbeb14 New translations strings.xml (Burmese) 2023-01-06 10:13:45 +01:00
Eugen Rochko
91bd3fa4ea New translations full_description.txt (Burmese) 2023-01-06 09:04:21 +01:00
Eugen Rochko
3cc6a9905e New translations strings.xml (Burmese) 2023-01-06 09:04:20 +01:00
Eugen Rochko
f01bfcd372 New translations full_description.txt (Burmese) 2023-01-06 06:45:57 +01:00
Eugen Rochko
81b4365a14 New translations full_description.txt (Swedish) 2023-01-03 12:40:32 +01:00
Eugen Rochko
7ab28a6db6 New translations strings.xml (Swedish) 2023-01-03 12:40:31 +01:00
Eugen Rochko
3bb548cf22 New translations full_description.txt (Burmese) 2023-01-03 08:43:34 +01:00
Eugen Rochko
ba788d1b34 New translations full_description.txt (Burmese) 2023-01-03 07:13:43 +01:00
Eugen Rochko
f51b01bcd9 New translations short_description.txt (Burmese) 2023-01-03 06:17:54 +01:00
Eugen Rochko
361c97a9df New translations full_description.txt (Burmese) 2023-01-03 06:17:53 +01:00
Eugen Rochko
f34153e601 New translations title.txt (Burmese) 2023-01-02 22:49:11 +01:00
Eugen Rochko
67240acb48 New translations short_description.txt (Burmese) 2023-01-02 22:49:11 +01:00
Eugen Rochko
4395dbfa7c New translations full_description.txt (Burmese) 2023-01-02 22:49:10 +01:00
Eugen Rochko
48b0207636 New translations strings.xml (Burmese) 2023-01-02 22:49:09 +01:00
Eugen Rochko
f7b8ed519c New translations strings.xml (Filipino) 2023-01-02 20:56:03 +01:00
Eugen Rochko
eba88f2c0a New translations strings.xml (Filipino) 2023-01-02 20:00:36 +01:00
Eugen Rochko
8d95355727 New translations short_description.txt (Filipino) 2023-01-01 17:18:41 +01:00
Eugen Rochko
e05a67c4ab New translations full_description.txt (Filipino) 2023-01-01 17:18:40 +01:00
Eugen Rochko
5db91627a1 New translations strings.xml (Filipino) 2023-01-01 17:18:39 +01:00
Eugen Rochko
7e473aa8a8 New translations strings.xml (Filipino) 2023-01-01 16:17:30 +01:00
Eugen Rochko
1e1edd698d New translations strings.xml (Vietnamese) 2023-01-01 09:16:11 +01:00
Eugen Rochko
aa42a0a4c4 New translations strings.xml (Filipino) 2022-12-29 06:02:04 +01:00
Eugen Rochko
ad61596f66 New translations strings.xml (Filipino) 2022-12-29 05:04:36 +01:00
Eugen Rochko
bd518b3038 New translations strings.xml (Filipino) 2022-12-28 14:31:07 +01:00
Eugen Rochko
db3129ab11 New translations strings.xml (Arabic) 2022-12-27 21:32:08 +01:00
Eugen Rochko
57a38a83e4 New translations strings.xml (Russian) 2022-12-24 14:52:14 +01:00
Eugen Rochko
c0de43e2f3 New translations strings.xml (Vietnamese) 2022-12-24 06:25:12 +01:00
Eugen Rochko
c6e29c9ce4 New translations strings.xml (Filipino) 2022-12-23 14:24:05 +01:00
Eugen Rochko
35e8f5eddf New translations strings.xml (Filipino) 2022-12-23 11:33:45 +01:00
Eugen Rochko
40ed72aeff New translations full_description.txt (Dutch) 2022-12-22 02:02:15 +01:00
Eugen Rochko
75033cf42e New translations strings.xml (Dutch) 2022-12-22 02:02:14 +01:00
Eugen Rochko
4a29a63d50 New translations short_description.txt (Dutch) 2022-12-21 23:28:34 +01:00
Eugen Rochko
595a6847dc New translations strings.xml (Dutch) 2022-12-21 23:28:33 +01:00
Eugen Rochko
64f403b644 New translations full_description.txt (Thai) 2022-12-19 21:15:22 +01:00
Eugen Rochko
314517c378 New translations full_description.txt (Hungarian) 2022-12-19 11:42:43 +01:00
Eugen Rochko
b90fc55b3f New translations strings.xml (Hungarian) 2022-12-19 11:42:42 +01:00
Eugen Rochko
cd57966810 New translations full_description.txt (Indonesian) 2022-12-18 00:52:58 +01:00
Eugen Rochko
8c0851e2b5 New translations strings.xml (Indonesian) 2022-12-18 00:52:57 +01:00
Eugen Rochko
b9efa434d2 New translations strings.xml (Thai) 2022-12-16 22:37:47 +01:00
Eugen Rochko
adc085a313 New translations strings.xml (Thai) 2022-12-16 21:27:39 +01:00
Eugen Rochko
a2a2f67239 New translations strings.xml (Catalan) 2022-12-16 17:40:43 +01:00
Eugen Rochko
c30fba61ca New translations strings.xml (Swedish) 2022-12-16 13:09:15 +01:00
Eugen Rochko
f09b37d28f New translations strings.xml (Persian) 2022-12-16 09:28:27 +01:00
Eugen Rochko
6cbc89b01d New translations strings.xml (Persian) 2022-12-16 08:22:43 +01:00
Eugen Rochko
ffd538fbd0 New translations strings.xml (Dutch) 2022-12-15 17:36:44 +01:00
Eugen Rochko
1f27f66432 New translations full_description.txt (Dutch) 2022-12-15 16:30:46 +01:00
Eugen Rochko
25f302f62f New translations strings.xml (Basque) 2022-12-14 13:39:14 +01:00
Eugen Rochko
d54eb6ed73 New translations strings.xml (Basque) 2022-12-14 12:41:52 +01:00
Eugen Rochko
24a6d77777 New translations strings.xml (Spanish) 2022-12-13 16:47:57 +01:00
Eugen Rochko
5cbebe7ec6 New translations strings.xml (Portuguese) 2022-12-13 13:29:44 +01:00
Eugen Rochko
a31c310ffa New translations full_description.txt (German) 2022-12-13 12:26:47 +01:00
Eugen Rochko
752d0b5ca9 New translations strings.xml (Korean) 2022-12-13 02:15:40 +01:00
Eugen Rochko
170131188a New translations title.txt (Persian) 2022-12-12 14:17:48 +01:00
Eugen Rochko
3269613139 New translations short_description.txt (Persian) 2022-12-12 14:17:47 +01:00
Eugen Rochko
52cc74fb85 New translations full_description.txt (Persian) 2022-12-12 14:17:46 +01:00
Eugen Rochko
d7d09b1d56 New translations strings.xml (Persian) 2022-12-12 14:17:45 +01:00
Eugen Rochko
797f2b5929 New translations strings.xml (Spanish) 2022-12-12 13:22:18 +01:00
Eugen Rochko
fa5053fe38 New translations full_description.txt (Spanish) 2022-12-12 11:19:07 +01:00
Eugen Rochko
c682c249bd New translations strings.xml (Spanish) 2022-12-12 11:19:06 +01:00
Eugen Rochko
01c229c7c1 New translations strings.xml (Spanish) 2022-12-12 10:19:26 +01:00
Eugen Rochko
83f39d6b22 New translations strings.xml (Thai) 2022-12-11 21:27:37 +01:00
Eugen Rochko
715ec6e7c6 New translations strings.xml (Thai) 2022-12-11 20:11:30 +01:00
Eugen Rochko
b6fa34e87f New translations strings.xml (Italian) 2022-12-11 17:31:10 +01:00
Eugen Rochko
6ff14cc7a1 New translations full_description.txt (Slovenian) 2022-12-11 15:55:38 +01:00
Eugen Rochko
d606ce89e0 New translations strings.xml (Slovenian) 2022-12-11 15:55:37 +01:00
Eugen Rochko
41e80f1d24 New translations full_description.txt (Hungarian) 2022-12-11 14:42:32 +01:00
Eugen Rochko
8decd66e26 New translations strings.xml (Hungarian) 2022-12-11 14:42:31 +01:00
Eugen Rochko
c033849fb4 New translations strings.xml (Thai) 2022-12-11 14:42:30 +01:00
Eugen Rochko
14054b2198 New translations strings.xml (Hungarian) 2022-12-11 13:46:42 +01:00
Eugen Rochko
3c3a6712bd New translations strings.xml (Icelandic) 2022-12-11 10:41:24 +01:00
Eugen Rochko
6a97ed41e0 New translations strings.xml (Icelandic) 2022-12-11 09:42:40 +01:00
Eugen Rochko
bfedd6c953 New translations full_description.txt (Vietnamese) 2022-12-11 06:15:06 +01:00
Eugen Rochko
23d72346b3 New translations strings.xml (Vietnamese) 2022-12-11 06:15:05 +01:00
Eugen Rochko
e9510875ea New translations strings.xml (Vietnamese) 2022-12-11 05:13:59 +01:00
Eugen Rochko
84d7b6c48f New translations strings.xml (Italian) 2022-12-11 01:14:30 +01:00
Eugen Rochko
5f4af7024d New translations full_description.txt (Portuguese, Brazilian) 2022-12-10 20:48:20 +01:00
Eugen Rochko
3b16eb807e New translations strings.xml (Portuguese, Brazilian) 2022-12-10 20:48:19 +01:00
Eugen Rochko
ef6b52049f New translations strings.xml (German) 2022-12-10 17:34:19 +01:00
Eugen Rochko
a7b035bb8e New translations strings.xml (Chinese Simplified) 2022-12-10 16:11:51 +01:00
Eugen Rochko
645216b8eb New translations strings.xml (Chinese Simplified) 2022-12-10 15:10:07 +01:00
Eugen Rochko
2b1c18635e New translations strings.xml (Italian) 2022-12-10 11:42:34 +01:00
Eugen Rochko
bb7a76617e New translations full_description.txt (Korean) 2022-12-10 06:43:06 +01:00
Eugen Rochko
ab50e7861a New translations strings.xml (Korean) 2022-12-10 05:29:13 +01:00
Eugen Rochko
d52b88c816 New translations strings.xml (Korean) 2022-12-10 03:51:49 +01:00
Eugen Rochko
e5d0a2a14c New translations full_description.txt (Korean) 2022-12-10 02:44:45 +01:00
Eugen Rochko
11e9db7ded New translations strings.xml (Korean) 2022-12-10 02:44:44 +01:00
Eugen Rochko
23c1a78d01 New translations strings.xml (German) 2022-12-09 21:35:30 +01:00
Eugen Rochko
e524423191 New translations full_description.txt (Ukrainian) 2022-12-09 20:36:43 +01:00
Eugen Rochko
7286e71442 New translations strings.xml (Ukrainian) 2022-12-09 20:36:42 +01:00
Eugen Rochko
71681458a1 New translations strings.xml (French) 2022-12-09 19:20:25 +01:00
Eugen Rochko
4d4b3c8867 New translations strings.xml (French) 2022-12-09 17:51:26 +01:00
Eugen Rochko
681d808a74 New translations strings.xml (Kabyle) 2022-12-09 16:35:54 +01:00
Eugen Rochko
876a0b27a6 New translations strings.xml (French) 2022-12-09 16:35:53 +01:00
Eugen Rochko
9dce3b9a17 New translations full_description.txt (Arabic) 2022-12-09 14:48:38 +01:00
Eugen Rochko
f77b487520 New translations strings.xml (Arabic) 2022-12-09 14:48:37 +01:00
Eugen Rochko
f3c73a5c8a New translations strings.xml (Chinese Traditional) 2022-12-09 03:47:27 +01:00
Eugen Rochko
37502b3747 New translations strings.xml (Chinese Traditional) 2022-12-09 02:46:30 +01:00
Eugen Rochko
309e84d14c New translations strings.xml (Filipino) 2022-12-08 21:26:30 +01:00
Eugen Rochko
ff464bef9f New translations strings.xml (Hungarian) 2022-12-08 21:26:29 +01:00
Eugen Rochko
dfa5cd65f3 New translations strings.xml (Icelandic) 2022-12-08 21:26:28 +01:00
Eugen Rochko
ccba5969a5 New translations strings.xml (Belarusian) 2022-12-08 21:26:27 +01:00
Eugen Rochko
03baef713d New translations strings.xml (Slovenian) 2022-12-08 21:26:27 +01:00
Eugen Rochko
a3617349bb New translations strings.xml (Irish) 2022-12-08 21:26:26 +01:00
Eugen Rochko
e57b22d2fc New translations strings.xml (Romanian) 2022-12-08 21:26:25 +01:00
Eugen Rochko
6aabaa497d New translations strings.xml (Bengali) 2022-12-08 21:26:24 +01:00
Eugen Rochko
6caa142ead New translations strings.xml (Hindi) 2022-12-08 21:26:23 +01:00
Eugen Rochko
b01e6e30a4 New translations strings.xml (Scottish Gaelic) 2022-12-08 21:26:21 +01:00
Eugen Rochko
5e3a612828 New translations strings.xml (Sinhala) 2022-12-08 21:26:19 +01:00
Eugen Rochko
b498e7e83e New translations strings.xml (Indonesian) 2022-12-08 21:26:18 +01:00
Eugen Rochko
7508643c89 New translations strings.xml (Dutch) 2022-12-08 21:26:17 +01:00
Eugen Rochko
24d2189399 New translations strings.xml (Kabyle) 2022-12-08 21:26:17 +01:00
Eugen Rochko
4e470f34fd New translations strings.xml (Occitan) 2022-12-08 21:26:16 +01:00
Eugen Rochko
e3ca6448f2 New translations strings.xml (Bosnian) 2022-12-08 21:26:15 +01:00
Eugen Rochko
9dadac7d93 New translations strings.xml (Croatian) 2022-12-08 21:26:14 +01:00
Eugen Rochko
0715bd0aba New translations strings.xml (Thai) 2022-12-08 21:26:13 +01:00
Eugen Rochko
92772e7ee0 New translations strings.xml (Galician) 2022-12-08 21:26:12 +01:00
Eugen Rochko
f9f6c879e0 New translations strings.xml (Vietnamese) 2022-12-08 21:26:11 +01:00
Eugen Rochko
ec7623f5c5 New translations strings.xml (Chinese Simplified) 2022-12-08 21:26:10 +01:00
Eugen Rochko
0163242258 New translations strings.xml (Ukrainian) 2022-12-08 21:26:09 +01:00
Eugen Rochko
3f9c8247c6 New translations strings.xml (Turkish) 2022-12-08 21:26:08 +01:00
Eugen Rochko
20865ad202 New translations strings.xml (Swedish) 2022-12-08 21:26:06 +01:00
Eugen Rochko
b5ac895b15 New translations strings.xml (Russian) 2022-12-08 21:26:05 +01:00
Eugen Rochko
fbd550228b New translations strings.xml (Portuguese) 2022-12-08 21:26:04 +01:00
Eugen Rochko
238758fc0b New translations strings.xml (Korean) 2022-12-08 21:26:03 +01:00
Eugen Rochko
328a4339a4 New translations strings.xml (Japanese) 2022-12-08 21:26:02 +01:00
Eugen Rochko
747d958507 New translations strings.xml (Italian) 2022-12-08 21:26:01 +01:00
Eugen Rochko
8622160e62 New translations strings.xml (Armenian) 2022-12-08 21:26:00 +01:00
Eugen Rochko
df1042e87d New translations strings.xml (Hebrew) 2022-12-08 21:25:59 +01:00
Eugen Rochko
a5c6c11f09 New translations strings.xml (Finnish) 2022-12-08 21:25:58 +01:00
Eugen Rochko
7bd602cd45 New translations strings.xml (Basque) 2022-12-08 21:25:57 +01:00
Eugen Rochko
2065468f1f New translations strings.xml (Greek) 2022-12-08 21:25:56 +01:00
Eugen Rochko
7f9061d0c8 New translations strings.xml (Czech) 2022-12-08 21:25:55 +01:00
Eugen Rochko
00a638393e New translations strings.xml (Catalan) 2022-12-08 21:25:54 +01:00
Eugen Rochko
f21194f877 New translations strings.xml (Spanish) 2022-12-08 21:25:53 +01:00
Eugen Rochko
1772351fc5 New translations strings.xml (French) 2022-12-08 21:25:52 +01:00
Eugen Rochko
1030fc5e16 New translations strings.xml (Arabic) 2022-12-08 21:25:51 +01:00
Eugen Rochko
bef3ae96f6 New translations strings.xml (German) 2022-12-08 21:25:51 +01:00
Eugen Rochko
c9fa5b2104 New translations strings.xml (Chinese Traditional) 2022-12-08 21:25:50 +01:00
Eugen Rochko
79cd8c0805 New translations strings.xml (Polish) 2022-12-08 21:25:48 +01:00
Eugen Rochko
2b80420794 New translations strings.xml (Portuguese, Brazilian) 2022-12-08 21:25:47 +01:00
Eugen Rochko
b8e18613b1 New translations full_description.txt (French) 2022-12-08 18:43:26 +01:00
Eugen Rochko
87289e4804 New translations strings.xml (Ukrainian) 2022-12-08 18:43:25 +01:00
Eugen Rochko
ba3a06a782 New translations full_description.txt (Ukrainian) 2022-12-08 15:57:19 +01:00
Eugen Rochko
2764ef0417 New translations strings.xml (Ukrainian) 2022-12-08 15:57:18 +01:00
Eugen Rochko
ae0e89aa31 New translations full_description.txt (Catalan) 2022-12-08 13:36:42 +01:00
Eugen Rochko
d0e99cc517 New translations strings.xml (Catalan) 2022-12-08 13:36:41 +01:00
Eugen Rochko
604fb01d6c New translations strings.xml (Catalan) 2022-12-08 12:29:42 +01:00
Eugen Rochko
256a1687d1 New translations full_description.txt (Chinese Traditional) 2022-12-07 12:56:51 +01:00
Eugen Rochko
ea1ae58e54 New translations strings.xml (Chinese Traditional) 2022-12-07 12:56:50 +01:00
Eugen Rochko
fe9d119fe2 New translations strings.xml (Chinese Traditional) 2022-12-07 11:55:33 +01:00
Eugen Rochko
4a199533c1 New translations short_description.txt (Vietnamese) 2022-12-07 02:58:56 +01:00
Eugen Rochko
7e785f1b6c New translations strings.xml (Ukrainian) 2022-12-07 02:58:55 +01:00
Eugen Rochko
85b4824ea2 New translations strings.xml (Russian) 2022-12-07 02:58:54 +01:00
Eugen Rochko
d39af74bcc New translations strings.xml (Italian) 2022-12-07 00:52:19 +01:00
Eugen Rochko
bfb52af454 New translations full_description.txt (Italian) 2022-12-06 23:44:22 +01:00
Eugen Rochko
5630e5d488 New translations strings.xml (Italian) 2022-12-06 23:44:21 +01:00
Eugen Rochko
29780ecf22 New translations full_description.txt (Icelandic) 2022-12-06 19:46:01 +01:00
Eugen Rochko
a8b542feaa New translations full_description.txt (Kabyle) 2022-12-06 17:09:14 +01:00
Eugen Rochko
e85b182da7 New translations full_description.txt (Occitan) 2022-12-06 17:09:13 +01:00
Eugen Rochko
84e9195869 New translations full_description.txt (Scottish Gaelic) 2022-12-06 17:09:12 +01:00
Eugen Rochko
7a739457c9 New translations full_description.txt (Sinhala) 2022-12-06 17:09:11 +01:00
Eugen Rochko
30905a7c36 New translations full_description.txt (Bosnian) 2022-12-06 17:09:10 +01:00
Eugen Rochko
0326a6834a New translations full_description.txt (Hindi) 2022-12-06 17:09:09 +01:00
Eugen Rochko
7c75a67f9f New translations full_description.txt (Croatian) 2022-12-06 17:09:06 +01:00
Eugen Rochko
1aa0fbf7d5 New translations full_description.txt (Thai) 2022-12-06 17:09:04 +01:00
Eugen Rochko
9adce93645 New translations full_description.txt (Bengali) 2022-12-06 17:09:03 +01:00
Eugen Rochko
b7392ef62d New translations full_description.txt (Indonesian) 2022-12-06 17:09:02 +01:00
Eugen Rochko
6b55c90a93 New translations full_description.txt (Portuguese, Brazilian) 2022-12-06 17:09:00 +01:00
Eugen Rochko
9e9cd9ea4e New translations full_description.txt (Galician) 2022-12-06 17:08:59 +01:00
Eugen Rochko
ef91fb9e06 New translations full_description.txt (Vietnamese) 2022-12-06 17:08:57 +01:00
Eugen Rochko
2f49c525b6 New translations full_description.txt (Chinese Traditional) 2022-12-06 17:08:56 +01:00
Eugen Rochko
f78f179071 New translations full_description.txt (Chinese Simplified) 2022-12-06 17:08:55 +01:00
Eugen Rochko
6ed310f8ce New translations full_description.txt (Ukrainian) 2022-12-06 17:08:54 +01:00
Eugen Rochko
8da5a32b48 New translations full_description.txt (Turkish) 2022-12-06 17:08:53 +01:00
Eugen Rochko
74fcdaa223 New translations full_description.txt (Swedish) 2022-12-06 17:08:52 +01:00
Eugen Rochko
6b77b8fbbb New translations full_description.txt (Slovenian) 2022-12-06 17:08:51 +01:00
Eugen Rochko
9f9fdca53d New translations full_description.txt (Russian) 2022-12-06 17:08:50 +01:00
Eugen Rochko
540317017f New translations full_description.txt (Portuguese) 2022-12-06 17:08:47 +01:00
Eugen Rochko
567174fcde New translations full_description.txt (Polish) 2022-12-06 17:08:44 +01:00
Eugen Rochko
262bc1dcbe New translations full_description.txt (Dutch) 2022-12-06 17:08:43 +01:00
Eugen Rochko
b931928434 New translations full_description.txt (Korean) 2022-12-06 17:08:42 +01:00
Eugen Rochko
7e2057a847 New translations full_description.txt (Japanese) 2022-12-06 17:08:40 +01:00
Eugen Rochko
4a9b98f534 New translations full_description.txt (Italian) 2022-12-06 17:08:39 +01:00
Eugen Rochko
7bf45581e3 New translations full_description.txt (Armenian) 2022-12-06 17:08:38 +01:00
Eugen Rochko
61a7fe6217 New translations full_description.txt (Hebrew) 2022-12-06 17:08:37 +01:00
Eugen Rochko
efa1a3f14f New translations full_description.txt (Irish) 2022-12-06 17:08:36 +01:00
Eugen Rochko
925866c3f0 New translations full_description.txt (Finnish) 2022-12-06 17:08:35 +01:00
Eugen Rochko
7291ec6f88 New translations full_description.txt (Basque) 2022-12-06 17:08:34 +01:00
Eugen Rochko
16c9203956 New translations full_description.txt (Greek) 2022-12-06 17:08:33 +01:00
Eugen Rochko
b08f104663 New translations full_description.txt (Catalan) 2022-12-06 17:08:32 +01:00
Eugen Rochko
82b7c6c290 New translations full_description.txt (Arabic) 2022-12-06 17:08:31 +01:00
Eugen Rochko
63009a332f New translations full_description.txt (Spanish) 2022-12-06 17:08:29 +01:00
Eugen Rochko
95e56db159 New translations full_description.txt (French) 2022-12-06 17:08:28 +01:00
Eugen Rochko
48f981036b New translations full_description.txt (Romanian) 2022-12-06 17:08:27 +01:00
Eugen Rochko
79be77f986 New translations full_description.txt (Filipino) 2022-12-06 17:08:26 +01:00
Eugen Rochko
4fafab19fc New translations full_description.txt (Hungarian) 2022-12-06 17:08:25 +01:00
Eugen Rochko
cd71f6e858 New translations full_description.txt (Icelandic) 2022-12-06 17:08:24 +01:00
Eugen Rochko
63d5068c2c New translations full_description.txt (Belarusian) 2022-12-06 17:08:21 +01:00
Eugen Rochko
a9bc7fdeb7 New translations full_description.txt (Czech) 2022-12-06 17:08:20 +01:00
Eugen Rochko
89dc2608bc New translations full_description.txt (German) 2022-12-06 17:08:19 +01:00
202 changed files with 6497 additions and 1775 deletions

View File

@@ -9,10 +9,10 @@ android {
applicationId "org.joinmastodon.android.sk"
minSdk 23
targetSdk 33
versionCode 75
versionName "1.1.5+fork.75"
versionCode 79
versionName "1.2.0+fork.79"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
resConfigs "ar-rSA", "be-rBY", "bn-rBD", "bs-rBA", "ca-rES", "cs-rCZ", "de-rDE", "el-rGR", "es-rES", "eu-rES", "fi-rFI", "fil-rPH", "fr-rFR", "ga-rIE", "gd-rGB", "gl-rES", "hi-rIN", "hr-rHR", "hu-rHU", "hy-rAM", "in-rID", "is-rIS", "it-rIT", "iw-rIL", "ja-rJP", "kab", "ko-rKR", "nl-rNL", "oc-rFR", "pl-rPL", "pt-rBR", "pt-rPT", "ro-rRO", "ru-rRU", "si-rLK", "sl-rSI", "sv-rSE", "th-rTH", "tr-rTR", "uk-rUA", "vi-rVN", "zh-rCN", "zh-rTW"
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", "vi-rVN", "zh-rCN", "zh-rTW"
}
buildTypes {

View File

@@ -43,6 +43,9 @@ public class GlobalUserPreferences{
public static boolean bottomEncoding;
public static boolean collapseLongPosts;
public static boolean spectatorMode;
public static boolean autoHideFab;
public static boolean replyLineAboveHeader;
public static boolean compactReblogReplyLine;
public static String publishButtonText;
public static ThemePreference theme;
public static ColorPreference color;
@@ -54,6 +57,11 @@ public class GlobalUserPreferences{
public static Set<String> accountsWithLocalOnlySupport;
public static Set<String> accountsInGlitchMode;
/**
* Pleroma
*/
public static String replyVisibility;
private static SharedPreferences getPrefs(){
return MastodonApp.context.getSharedPreferences("global", Context.MODE_PRIVATE);
}
@@ -91,12 +99,16 @@ public class GlobalUserPreferences{
bottomEncoding=prefs.getBoolean("bottomEncoding", false);
collapseLongPosts=prefs.getBoolean("collapseLongPosts", true);
spectatorMode=prefs.getBoolean("spectatorMode", false);
autoHideFab=prefs.getBoolean("autoHideFab", true);
replyLineAboveHeader=prefs.getBoolean("replyLineAboveHeader", true);
compactReblogReplyLine=prefs.getBoolean("compactReblogReplyLine", true);
publishButtonText=prefs.getString("publishButtonText", "");
theme=ThemePreference.values()[prefs.getInt("theme", 0)];
recentLanguages=fromJson(prefs.getString("recentLanguages", null), recentLanguagesType, new HashMap<>());
pinnedTimelines=fromJson(prefs.getString("pinnedTimelines", null), pinnedTimelinesType, new HashMap<>());
accountsWithLocalOnlySupport=prefs.getStringSet("accountsWithLocalOnlySupport", new HashSet<>());
accountsInGlitchMode=prefs.getStringSet("accountsInGlitchMode", new HashSet<>());
replyVisibility=prefs.getString("replyVisibility", null);
try {
color=ColorPreference.valueOf(prefs.getString("color", ColorPreference.PINK.name()));
@@ -131,14 +143,18 @@ public class GlobalUserPreferences{
.putBoolean("prefixRepliesWithRe", prefixRepliesWithRe)
.putBoolean("collapseLongPosts", collapseLongPosts)
.putBoolean("spectatorMode", spectatorMode)
.putBoolean("autoHideFab", autoHideFab)
.putBoolean("compactReblogReplyLine", compactReblogReplyLine)
.putString("publishButtonText", publishButtonText)
.putBoolean("bottomEncoding", bottomEncoding)
.putBoolean("replyLineAboveHeader", replyLineAboveHeader)
.putInt("theme", theme.ordinal())
.putString("color", color.name())
.putString("recentLanguages", gson.toJson(recentLanguages))
.putString("pinnedTimelines", gson.toJson(pinnedTimelines))
.putStringSet("accountsWithLocalOnlySupport", accountsWithLocalOnlySupport)
.putStringSet("accountsInGlitchMode", accountsInGlitchMode)
.putString("replyVisibility", replyVisibility)
.apply();
}

View File

@@ -5,6 +5,7 @@ import android.app.NotificationChannel;
import android.app.NotificationChannelGroup;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.RemoteInput;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -16,15 +17,25 @@ import android.util.Log;
import org.joinmastodon.android.api.MastodonAPIController;
import org.joinmastodon.android.api.requests.notifications.GetNotificationByID;
import org.joinmastodon.android.api.requests.statuses.CreateStatus;
import org.joinmastodon.android.api.requests.statuses.SetStatusBookmarked;
import org.joinmastodon.android.api.requests.statuses.SetStatusFavorited;
import org.joinmastodon.android.api.requests.statuses.SetStatusReblogged;
import org.joinmastodon.android.api.session.AccountSession;
import org.joinmastodon.android.api.session.AccountSessionManager;
import org.joinmastodon.android.model.Account;
import org.joinmastodon.android.model.NotificationAction;
import org.joinmastodon.android.model.Preferences;
import org.joinmastodon.android.model.PushNotification;
import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.model.StatusPrivacy;
import org.joinmastodon.android.ui.utils.UiUtils;
import org.parceler.Parcels;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import java.util.UUID;
import java.util.stream.Collectors;
import me.grishka.appkit.api.Callback;
@@ -37,6 +48,9 @@ public class PushNotificationReceiver extends BroadcastReceiver{
private static final String TAG="PushNotificationReceive";
public static final int NOTIFICATION_ID=178;
private static final String ACTION_KEY_TEXT_REPLY = "ACTION_KEY_TEXT_REPLY";
private static final int SUMMARY_ID = 791;
private static int notificationId = 0;
@Override
@@ -91,6 +105,35 @@ public class PushNotificationReceiver extends BroadcastReceiver{
Log.w(TAG, "onReceive: invalid push notification format");
}
}
if(intent.getBooleanExtra("fromNotificationAction", false)){
String accountID=intent.getStringExtra("accountID");
int notificationId=intent.getIntExtra("notificationId", -1);
if (notificationId >= 0){
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(accountID, notificationId);
}
if(intent.hasExtra("notification")){
org.joinmastodon.android.model.Notification notification=Parcels.unwrap(intent.getParcelableExtra("notification"));
String statusID=notification.status.id;
if (statusID != null) {
AccountSessionManager accountSessionManager = AccountSessionManager.getInstance();
Preferences preferences = accountSessionManager.getAccount(accountID).preferences;
switch (NotificationAction.values()[intent.getIntExtra("notificationAction", 0)]) {
case FAVORITE -> new SetStatusFavorited(statusID, true).exec(accountID);
case BOOKMARK -> new SetStatusBookmarked(statusID, true).exec(accountID);
case REBLOG -> new SetStatusReblogged(notification.status.id, true, preferences.postingDefaultVisibility).exec(accountID);
case UNDO_REBLOG -> new SetStatusReblogged(notification.status.id, false, preferences.postingDefaultVisibility).exec(accountID);
case REPLY -> handleReplyAction(context, accountID, intent, notification, notificationId, preferences);
default -> Log.w(TAG, "onReceive: Failed to get NotificationAction");
}
}
}else{
Log.e(TAG, "onReceive: Failed to load notification");
}
}
}
private void notify(Context context, PushNotification pn, String accountID, org.joinmastodon.android.model.Notification notification){
@@ -142,7 +185,7 @@ public class PushNotificationReceiver extends BroadcastReceiver{
.setShowWhen(true)
.setCategory(Notification.CATEGORY_SOCIAL)
.setAutoCancel(true)
.setColor(context.getColor(R.color.primary_700));
.setColor(context.getColor(R.color.shortcut_icon_background));
if (!GlobalUserPreferences.uniformNotificationIcon) {
builder.setSmallIcon(switch (pn.notificationType) {
@@ -164,6 +207,108 @@ public class PushNotificationReceiver extends BroadcastReceiver{
if(AccountSessionManager.getInstance().getLoggedInAccounts().size()>1){
builder.setSubText(accountName);
}
nm.notify(accountID, GlobalUserPreferences.keepOnlyLatestNotification ? NOTIFICATION_ID : notificationId++, builder.build());
int id = GlobalUserPreferences.keepOnlyLatestNotification ? NOTIFICATION_ID : notificationId++;
if (notification != null){
switch (pn.notificationType){
case MENTION, STATUS -> {
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.N){
builder.addAction(buildReplyAction(context, id, accountID, notification));
}
builder.addAction(buildNotificationAction(context, id, accountID, notification, context.getString(R.string.button_favorite), NotificationAction.FAVORITE));
builder.addAction(buildNotificationAction(context, id, accountID, notification, context.getString(R.string.add_bookmark), NotificationAction.BOOKMARK));
if(notification.status.visibility != StatusPrivacy.DIRECT) {
builder.addAction(buildNotificationAction(context, id, accountID, notification, context.getString(R.string.button_reblog), NotificationAction.REBLOG));
}
}
case UPDATE -> {
if(notification.status.reblogged)
builder.addAction(buildNotificationAction(context, id, accountID, notification, context.getString(R.string.sk_undo_reblog), NotificationAction.UNDO_REBLOG));
}
}
}
nm.notify(accountID, id, builder.build());
}
private Notification.Action buildNotificationAction(Context context, int notificationId, String accountID, org.joinmastodon.android.model.Notification notification, String title, NotificationAction action){
Intent notificationIntent=new Intent(context, PushNotificationReceiver.class);
notificationIntent.putExtra("notificationId", notificationId);
notificationIntent.putExtra("fromNotificationAction", true);
notificationIntent.putExtra("accountID", accountID);
notificationIntent.putExtra("notificationAction", action.ordinal());
notificationIntent.putExtra("notification", Parcels.wrap(notification));
PendingIntent actionPendingIntent = PendingIntent.getBroadcast(context, new Random().nextInt(), notificationIntent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_ONE_SHOT);
return new Notification.Action.Builder(null, title, actionPendingIntent).build();
}
private Notification.Action buildReplyAction(Context context, int notificationId, String accountID, org.joinmastodon.android.model.Notification notification){
String replyLabel = context.getResources().getString(R.string.button_reply);
RemoteInput remoteInput = new RemoteInput.Builder(ACTION_KEY_TEXT_REPLY)
.setLabel(replyLabel)
.build();
Intent notificationIntent=new Intent(context, PushNotificationReceiver.class);
notificationIntent.putExtra("notificationId", notificationId);
notificationIntent.putExtra("fromNotificationAction", true);
notificationIntent.putExtra("accountID", accountID);
notificationIntent.putExtra("notificationAction", NotificationAction.REPLY.ordinal());
notificationIntent.putExtra("notification", Parcels.wrap(notification));
int flags = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S ? PendingIntent.FLAG_MUTABLE | PendingIntent.FLAG_UPDATE_CURRENT : PendingIntent.FLAG_UPDATE_CURRENT;
PendingIntent replyPendingIntent = PendingIntent.getBroadcast(context, new Random().nextInt(), notificationIntent,flags);
return new Notification.Action.Builder(null, replyLabel, replyPendingIntent).addRemoteInput(remoteInput).build();
}
private void handleReplyAction(Context context, String accountID, Intent intent, org.joinmastodon.android.model.Notification notification, int notificationId, Preferences preferences) {
Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
if (remoteInput == null) {
Log.e(TAG, "handleReplyAction: Could not get reply input");
return;
}
CharSequence input = remoteInput.getCharSequence(ACTION_KEY_TEXT_REPLY);
CreateStatus.Request req=new CreateStatus.Request();
req.status = input.toString();
req.language = preferences.postingDefaultLanguage;
req.visibility = preferences.postingDefaultVisibility;
req.inReplyToId = notification.status.id;
if(!notification.status.spoilerText.isEmpty() && GlobalUserPreferences.prefixRepliesWithRe && !notification.status.spoilerText.startsWith("re: ")){
req.spoilerText = "re: " + notification.status.spoilerText;
}
new CreateStatus(req, UUID.randomUUID().toString()).setCallback(new Callback<Status>() {
@Override
public void onSuccess(Status status) {
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification.Builder builder = android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O ?
new Notification.Builder(context, accountID+"_"+notification.type) :
new Notification.Builder(context)
.setPriority(Notification.PRIORITY_DEFAULT)
.setDefaults(Notification.DEFAULT_SOUND | Notification.DEFAULT_VIBRATE);
notification.status = status;
Intent contentIntent=new Intent(context, MainActivity.class);
contentIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
contentIntent.putExtra("fromNotification", true);
contentIntent.putExtra("accountID", accountID);
contentIntent.putExtra("notification", Parcels.wrap(notification));
Notification repliedNotification = builder.setSmallIcon(R.drawable.ic_ntf_logo)
.setContentTitle(context.getString(R.string.sk_notification_action_replied, notification.status.account.displayName))
.setContentText(status.getStrippedText())
.setCategory(Notification.CATEGORY_SOCIAL)
.setContentIntent(PendingIntent.getActivity(context, notificationId, contentIntent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT))
.build();
notificationManager.notify(accountID, notificationId, repliedNotification);
}
@Override
public void onError(ErrorResponse errorResponse) {
}
}).exec(accountID);
}
}

View File

@@ -13,9 +13,11 @@ import org.joinmastodon.android.BuildConfig;
import org.joinmastodon.android.MastodonApp;
import org.joinmastodon.android.api.requests.notifications.GetNotifications;
import org.joinmastodon.android.api.requests.timelines.GetHomeTimeline;
import org.joinmastodon.android.api.session.AccountSession;
import org.joinmastodon.android.api.session.AccountSessionManager;
import org.joinmastodon.android.model.CacheablePaginatedResponse;
import org.joinmastodon.android.model.Filter;
import org.joinmastodon.android.model.Instance;
import org.joinmastodon.android.model.Notification;
import org.joinmastodon.android.model.PaginatedResponse;
import org.joinmastodon.android.model.SearchResult;
@@ -130,7 +132,8 @@ public class CacheController{
cancelDelayedClose();
databaseThread.postRunnable(()->{
try{
List<Filter> filters=AccountSessionManager.getInstance().getAccount(accountID).wordFilters.stream().filter(f->f.context.contains(Filter.FilterContext.NOTIFICATIONS)).collect(Collectors.toList());
AccountSession accountSession=AccountSessionManager.getInstance().getAccount(accountID);
List<Filter> filters=accountSession.wordFilters.stream().filter(f->f.context.contains(Filter.FilterContext.NOTIFICATIONS)).collect(Collectors.toList());
if(!forceReload){
SQLiteDatabase db=getOrOpenDatabase();
String table=onlyPosts ? "notifications_posts" : onlyMentions ? "notifications_mentions" : "notifications_all";
@@ -160,7 +163,8 @@ public class CacheController{
Log.w(TAG, "getNotifications: corrupted notification object in database", x);
}
}
new GetNotifications(maxID, count, onlyPosts ? EnumSet.of(Notification.Type.STATUS) : onlyMentions ? EnumSet.of(Notification.Type.MENTION): EnumSet.allOf(Notification.Type.class))
Instance instance=AccountSessionManager.getInstance().getInstanceInfo(accountSession.domain);
new GetNotifications(maxID, count, onlyPosts ? EnumSet.of(Notification.Type.STATUS) : onlyMentions ? EnumSet.of(Notification.Type.MENTION): EnumSet.allOf(Notification.Type.class), instance.pleroma != null)
.setCallback(new Callback<>(){
@Override
public void onSuccess(List<Notification> result){

View File

@@ -16,6 +16,7 @@ import org.joinmastodon.android.MastodonApp;
import org.joinmastodon.android.api.gson.IsoInstantTypeAdapter;
import org.joinmastodon.android.api.gson.IsoLocalDateTypeAdapter;
import org.joinmastodon.android.api.session.AccountSession;
import org.joinmastodon.android.model.Status;
import java.io.BufferedReader;
import java.io.IOException;
@@ -40,12 +41,15 @@ import okhttp3.ResponseBody;
public class MastodonAPIController{
private static final String TAG="MastodonAPIController";
public static final Gson gson=new GsonBuilder()
public static final Gson gsonWithoutDeserializer = new GsonBuilder()
.disableHtmlEscaping()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.registerTypeAdapter(Instant.class, new IsoInstantTypeAdapter())
.registerTypeAdapter(LocalDate.class, new IsoLocalDateTypeAdapter())
.create();
public static final Gson gson = gsonWithoutDeserializer.newBuilder()
.registerTypeAdapter(Status.class, new Status.StatusDeserializer())
.create();
private static WorkerThread thread=new WorkerThread("MastodonAPIController");
private static OkHttpClient httpClient=new OkHttpClient.Builder().build();

View File

@@ -1,6 +1,5 @@
package org.joinmastodon.android.api.requests.notifications;
import com.google.gson.annotations.SerializedName;
import com.google.gson.reflect.TypeToken;
import org.joinmastodon.android.api.ApiUtils;
@@ -11,18 +10,24 @@ import java.util.EnumSet;
import java.util.List;
public class GetNotifications extends MastodonAPIRequest<List<Notification>>{
public GetNotifications(String maxID, int limit, EnumSet<Notification.Type> includeTypes){
public GetNotifications(String maxID, int limit, EnumSet<Notification.Type> includeTypes, boolean isPleromaInstance){
super(HttpMethod.GET, "/notifications", new TypeToken<>(){});
if(maxID!=null)
addQueryParameter("max_id", maxID);
if(limit>0)
addQueryParameter("limit", ""+limit);
if(includeTypes!=null){
for(String type:ApiUtils.enumSetToStrings(includeTypes, Notification.Type.class)){
addQueryParameter("types[]", type);
}
for(String type:ApiUtils.enumSetToStrings(EnumSet.complementOf(includeTypes), Notification.Type.class)){
addQueryParameter("exclude_types[]", type);
if(!isPleromaInstance) {
for(String type:ApiUtils.enumSetToStrings(includeTypes, Notification.Type.class)){
addQueryParameter("types[]", type);
}
for(String type:ApiUtils.enumSetToStrings(EnumSet.complementOf(includeTypes), Notification.Type.class)){
addQueryParameter("exclude_types[]", type);
}
}else{
for(String type:ApiUtils.enumSetToStrings(includeTypes, Notification.Type.class)){
addQueryParameter("include_types[]", type);
}
}
}
removeUnsupportedItems=true;

View File

@@ -45,6 +45,8 @@ public class CreateStatus extends MastodonAPIRequest<Status>{
public Instant scheduledAt;
public String language;
public String quoteId;
public static class Poll{
public ArrayList<String> options=new ArrayList<>();
public int expiresIn;

View File

@@ -2,6 +2,7 @@ package org.joinmastodon.android.api.requests.timelines;
import com.google.gson.reflect.TypeToken;
import org.joinmastodon.android.GlobalUserPreferences;
import org.joinmastodon.android.api.MastodonAPIRequest;
import org.joinmastodon.android.model.Status;
@@ -18,5 +19,7 @@ public class GetHomeTimeline extends MastodonAPIRequest<List<Status>>{
addQueryParameter("since_id", sinceID);
if(limit>0)
addQueryParameter("limit", ""+limit);
if(GlobalUserPreferences.replyVisibility != null)
addQueryParameter("reply_visibility", GlobalUserPreferences.replyVisibility);
}
}

View File

@@ -278,6 +278,12 @@ public class AccountSessionManager{
public void onSuccess(Account result){
session.self=result;
session.infoLastUpdated=System.currentTimeMillis();
if(session.preferences != null && session.preferences.postingDefaultVisibility != null){
session.preferences.postingDefaultVisibility = result.source.privacy;
}
if(session.preferences != null && session.preferences.postingDefaultLanguage != null){
session.preferences.postingDefaultLanguage = result.source.language;
}
writeAccountsFile();
}
@@ -297,7 +303,14 @@ public class AccountSessionManager{
}
@Override
public void onError(ErrorResponse error) {}
public void onError(ErrorResponse error) {
Preferences preferences = new Preferences();
if(session.self != null){
preferences.postingDefaultVisibility = session.self.source.privacy;
preferences.postingDefaultLanguage = session.self.source.language;
}
session.preferences = preferences;
}
}).exec(session.getID());
}

View File

@@ -3,6 +3,10 @@ package org.joinmastodon.android.fragments;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.animation.TranslateAnimation;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import org.joinmastodon.android.R;
import org.joinmastodon.android.api.requests.accounts.GetAccountStatuses;

View File

@@ -16,6 +16,7 @@ import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowInsets;
import android.view.animation.TranslateAnimation;
import android.widget.ImageButton;
import android.widget.Toolbar;
@@ -31,12 +32,10 @@ import org.joinmastodon.android.model.Poll;
import org.joinmastodon.android.model.Relationship;
import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.ui.BetterItemAnimator;
import org.joinmastodon.android.ui.PhotoLayoutHelper;
import org.joinmastodon.android.ui.TileGridLayoutManager;
import org.joinmastodon.android.ui.displayitems.ExtendedFooterStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.GapStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.HeaderStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.ImageStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.MediaGridStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.PollFooterStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.PollOptionStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.StatusDisplayItem;
@@ -44,8 +43,10 @@ import org.joinmastodon.android.ui.displayitems.TextStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.WarningFilteredStatusDisplayItem;
import org.joinmastodon.android.ui.photoviewer.PhotoViewer;
import org.joinmastodon.android.ui.photoviewer.PhotoViewerHost;
import org.joinmastodon.android.ui.utils.MediaAttachmentViewController;
import org.joinmastodon.android.ui.utils.UiUtils;
import org.joinmastodon.android.ui.views.ImageAttachmentFrameLayout;
import org.joinmastodon.android.ui.views.MediaGridLayout;
import org.joinmastodon.android.utils.TypedObjectPool;
import java.util.ArrayList;
import java.util.Collections;
@@ -56,7 +57,6 @@ import java.util.stream.Collectors;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import me.grishka.appkit.Nav;
@@ -75,10 +75,12 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
protected DisplayItemsAdapter adapter;
protected String accountID;
protected PhotoViewer currentPhotoViewer;
protected ImageButton fab;
protected int scrollDiff = 0;
protected HashMap<String, Account> knownAccounts=new HashMap<>();
protected HashMap<String, Relationship> relationships=new HashMap<>();
protected Rect tmpRect=new Rect();
protected ImageButton fab;
protected TypedObjectPool<MediaGridStatusDisplayItem.GridItemType, MediaAttachmentViewController> attachmentViewsPool=new TypedObjectPool<>(this::makeNewMediaAttachmentView);
public BaseStatusListFragment(){
super(20);
@@ -188,21 +190,21 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
}
@Override
public void openPhotoViewer(String parentID, Status _status, int attachmentIndex){
final Status status=_status.reblog!=null ? _status.reblog : _status;
public void openPhotoViewer(String parentID, Status _status, int attachmentIndex, MediaGridStatusDisplayItem.Holder gridHolder){
final Status status=_status.getContentStatus();
currentPhotoViewer=new PhotoViewer(getActivity(), status.mediaAttachments, attachmentIndex, new PhotoViewer.Listener(){
private ImageStatusDisplayItem.Holder<?> transitioningHolder;
private MediaAttachmentViewController transitioningHolder;
@Override
public void setPhotoViewVisibility(int index, boolean visible){
ImageStatusDisplayItem.Holder<?> holder=findPhotoViewHolder(index);
MediaAttachmentViewController holder=findPhotoViewHolder(index);
if(holder!=null)
holder.photo.setAlpha(visible ? 1f : 0f);
}
@Override
public boolean startPhotoViewTransition(int index, @NonNull Rect outRect, @NonNull int[] outCornerRadius){
ImageStatusDisplayItem.Holder<?> holder=findPhotoViewHolder(index);
MediaAttachmentViewController holder=findPhotoViewHolder(index);
if(holder!=null){
transitioningHolder=holder;
View view=transitioningHolder.photo;
@@ -210,7 +212,8 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
view.getLocationOnScreen(pos);
outRect.set(pos[0], pos[1], pos[0]+view.getWidth(), pos[1]+view.getHeight());
list.setClipChildren(false);
transitioningHolder.itemView.setElevation(1f);
gridHolder.setClipChildren(false);
transitioningHolder.view.setElevation(1f);
return true;
}
return false;
@@ -237,15 +240,16 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
view.setTranslationY(0f);
view.setScaleX(1f);
view.setScaleY(1f);
transitioningHolder.itemView.setElevation(0f);
transitioningHolder.view.setElevation(0f);
if(list!=null)
list.setClipChildren(true);
gridHolder.setClipChildren(true);
transitioningHolder=null;
}
@Override
public Drawable getPhotoViewCurrentDrawable(int index){
ImageStatusDisplayItem.Holder<?> holder=findPhotoViewHolder(index);
MediaAttachmentViewController holder=findPhotoViewHolder(index);
if(holder!=null)
return holder.photo.getDrawable();
return null;
@@ -261,23 +265,8 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
requestPermissions(permissions, PhotoViewer.PERMISSION_REQUEST);
}
private ImageStatusDisplayItem.Holder<?> findPhotoViewHolder(int index){
if(list==null)
return null;
int offset=0;
for(StatusDisplayItem item:displayItems){
if(item.parentID.equals(parentID)){
if(item instanceof ImageStatusDisplayItem){
RecyclerView.ViewHolder holder=list.findViewHolderForAdapterPosition(getMainAdapterOffset()+offset+index);
if(holder instanceof ImageStatusDisplayItem.Holder<?> imgHolder){
return imgHolder;
}
return null;
}
}
offset++;
}
return null;
private MediaAttachmentViewController findPhotoViewHolder(int index){
return gridHolder.getViewController(index);
}
});
}
@@ -285,11 +274,40 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
@Override
public void onViewCreated(View view, Bundle savedInstanceState){
super.onViewCreated(view, savedInstanceState);
fab=view.findViewById(R.id.fab);
list.addOnScrollListener(new RecyclerView.OnScrollListener(){
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy){
if(currentPhotoViewer!=null)
currentPhotoViewer.offsetView(-dx, -dy);
if (fab!=null && GlobalUserPreferences.autoHideFab) {
if (dy > 0 && fab.getVisibility() == View.VISIBLE) {
TranslateAnimation animate = new TranslateAnimation(
0,
0,
0,
fab.getHeight() * 2);
animate.setDuration(300);
fab.startAnimation(animate);
fab.setVisibility(View.INVISIBLE);
scrollDiff = 0;
} else if (dy < 0 && fab.getVisibility() != View.VISIBLE) {
if (list.getChildAt(0).getTop() == 0 || scrollDiff > 400) {
fab.setVisibility(View.VISIBLE);
TranslateAnimation animate = new TranslateAnimation(
0,
0,
fab.getHeight() * 2,
0);
animate.setDuration(300);
fab.startAnimation(animate);
scrollDiff = 0;
} else {
scrollDiff += Math.abs(dy);
}
}
}
}
});
list.addItemDecoration(new StatusListItemDecoration());
@@ -327,38 +345,12 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
updateToolbar();
if (withComposeButton()) {
fab = view.findViewById(R.id.fab);
fab.setVisibility(View.VISIBLE);
fab.setOnClickListener(this::onFabClick);
fab.setOnLongClickListener(this::onFabLongClick);
}
}
@Override
protected RecyclerView.LayoutManager onCreateLayoutManager(){
GridLayoutManager lm=new TileGridLayoutManager(getActivity(), 1000);
lm.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup(){
@Override
public int getSpanSize(int position){
position-=getMainAdapterOffset();
if(position>=0 && position<displayItems.size()){
StatusDisplayItem item=displayItems.get(position);
if(item instanceof ImageStatusDisplayItem imgItem){
PhotoLayoutHelper.TiledLayoutResult layout=imgItem.tiledLayout;
PhotoLayoutHelper.TiledLayoutResult.Tile tile=imgItem.thisTile;
int spans=0;
for(int i=0;i<tile.colSpan;i++){
spans+=layout.columnSizes[tile.startCol+i];
}
return spans;
}
}
return 1000;
}
});
return lm;
}
@Override
public void onConfigurationChanged(Configuration newConfig){
super.onConfigurationChanged(newConfig);
@@ -477,7 +469,7 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
revealSpoiler(status, holder.getItemID());
}
public void onRevealSpoilerClick(ImageStatusDisplayItem.Holder<?> holder){
public void onRevealSpoilerClick(MediaGridStatusDisplayItem.Holder holder){
Status status=holder.getItem().status;
revealSpoiler(status, holder.getItemID());
}
@@ -511,7 +503,6 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
holder.getItem().status.textExpandable = expandable;
HeaderStatusDisplayItem.Holder header = findHolderOfType(holder.getItemID(), HeaderStatusDisplayItem.Holder.class);
if (header != null) header.rebind();
holder.rebind();
}
}
@@ -525,13 +516,14 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
protected void updateImagesSpoilerState(Status status, String itemID){
ArrayList<Integer> updatedPositions=new ArrayList<>();
for(ImageStatusDisplayItem.Holder photo:(List<ImageStatusDisplayItem.Holder>)findAllHoldersOfType(itemID, ImageStatusDisplayItem.Holder.class)){
photo.setRevealed(status.spoilerRevealed);
updatedPositions.add(photo.getAbsoluteAdapterPosition()-getMainAdapterOffset());
MediaGridStatusDisplayItem.Holder mediaGrid=findHolderOfType(itemID, MediaGridStatusDisplayItem.Holder.class);
if(mediaGrid!=null){
mediaGrid.setRevealed(status.spoilerRevealed);
updatedPositions.add(mediaGrid.getAbsoluteAdapterPosition()-getMainAdapterOffset());
}
int i=0;
for(StatusDisplayItem item:displayItems){
if(itemID.equals(item.parentID) && item instanceof ImageStatusDisplayItem && !updatedPositions.contains(i)){
if(itemID.equals(item.parentID) && item instanceof MediaGridStatusDisplayItem && !updatedPositions.contains(i)){
adapter.notifyItemChanged(i);
}
i++;
@@ -674,6 +666,15 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
return UiUtils.pickAccountForCompose(getActivity(), accountID);
}
private MediaAttachmentViewController makeNewMediaAttachmentView(MediaGridStatusDisplayItem.GridItemType type){
return new MediaAttachmentViewController(getActivity(), type);
}
public TypedObjectPool<MediaGridStatusDisplayItem.GridItemType, MediaAttachmentViewController> getAttachmentViewsPool(){
return attachmentViewsPool;
}
protected class DisplayItemsAdapter extends UsableRecyclerView.Adapter<BindableViewHolder<StatusDisplayItem>> implements ImageLoaderRecyclerAdapter{
public DisplayItemsAdapter(){
@@ -711,16 +712,6 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
public ImageLoaderRequest getImageRequest(int position, int image){
return displayItems.get(position).getImageRequest(image);
}
// @Override
// public void onViewDetachedFromWindow(@NonNull BindableViewHolder<StatusDisplayItem> holder){
// if(holder instanceof ImageLoaderViewHolder){
// int count=holder.getItem().getImageCount();
// for(int i=0;i<count;i++){
// ((ImageLoaderViewHolder) holder).clearImage(i);
// }
// }
// }
}
private class StatusListItemDecoration extends RecyclerView.ItemDecoration{
@@ -754,25 +745,21 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
for(int i=0;i<parent.getChildCount();i++){
View child=parent.getChildAt(i);
RecyclerView.ViewHolder holder=parent.getChildViewHolder(child);
if(holder instanceof ImageStatusDisplayItem.Holder<?> imgHolder){
if(holder instanceof MediaGridStatusDisplayItem.Holder imgHolder){
if(!imgHolder.getItem().status.spoilerRevealed && TextUtils.isEmpty(imgHolder.getItem().status.spoilerText)){
hiddenMediaPaint.setColor(0x80000000);
PhotoLayoutHelper.TiledLayoutResult.Tile tile=imgHolder.getItem().thisTile;
float hGap=tile.startCol>0 ? V.dp(1) : 0;
float vGap=tile.startRow>0 ? V.dp(1) : 0;
c.drawRect(child.getX()-hGap, child.getY()-vGap, child.getX()+child.getWidth(), child.getY()+child.getHeight(), hiddenMediaPaint);
c.drawRect(child.getX(), child.getY(), child.getX()+child.getWidth(), child.getY()+child.getHeight(), hiddenMediaPaint);
}
}
}
for(int i=0;i<parent.getChildCount();i++){
View child=parent.getChildAt(i);
RecyclerView.ViewHolder holder=parent.getChildViewHolder(child);
if(holder instanceof ImageStatusDisplayItem.Holder<?> imgHolder){
if(holder instanceof MediaGridStatusDisplayItem.Holder imgHolder){
if(!imgHolder.getItem().status.spoilerRevealed){
PhotoLayoutHelper.TiledLayoutResult.Tile tile=imgHolder.getItem().thisTile;
if(tile.startCol==0 && tile.startRow==0 && TextUtils.isEmpty(imgHolder.getItem().status.spoilerText)){
if(TextUtils.isEmpty(imgHolder.getItem().status.spoilerText)){
int listWidth=getListWidthForMediaLayout();
int width=Math.min(listWidth, V.dp(ImageAttachmentFrameLayout.MAX_WIDTH));
int width=Math.min(listWidth, V.dp(MediaGridLayout.MAX_WIDTH));
if(currentMediaHiddenLayoutsWidth!=width)
rebuildMediaHiddenLayouts(width-V.dp(32));
c.save();
@@ -797,47 +784,6 @@ public abstract class BaseStatusListFragment<T extends DisplayItemsParent> exten
}
}
@Override
public void getItemOffsets(@NonNull Rect outRect, @NonNull View view, @NonNull RecyclerView parent, @NonNull RecyclerView.State state){
RecyclerView.ViewHolder holder=parent.getChildViewHolder(view);
if(holder instanceof ImageStatusDisplayItem.Holder){
int listWidth=getListWidthForMediaLayout();
int width=Math.min(listWidth, V.dp(ImageAttachmentFrameLayout.MAX_WIDTH));
PhotoLayoutHelper.TiledLayoutResult layout=((ImageStatusDisplayItem.Holder<?>) holder).getItem().tiledLayout;
PhotoLayoutHelper.TiledLayoutResult.Tile tile=((ImageStatusDisplayItem.Holder<?>) holder).getItem().thisTile;
if(tile.startCol+tile.colSpan<layout.columnSizes.length){
outRect.right=V.dp(1);
}
if(tile.startRow+tile.rowSpan<layout.rowSizes.length){
outRect.bottom=V.dp(1);
}
// For a view that spans rows, compensate its additional height so the row it's in stays the right height
if(tile.rowSpan>1){
outRect.bottom=-(Math.round(tile.height/1000f*width)-Math.round(layout.rowSizes[tile.startRow]/1000f*width));
}
// ...and for its siblings, offset those on rows below first to the right where they belong
if(tile.startCol>0 && layout.tiles[0].rowSpan>1 && tile.startRow>layout.tiles[0].startRow){
int xOffset=Math.round(layout.tiles[0].width/1000f*listWidth);
outRect.left=xOffset;
outRect.right=-xOffset;
}
// If the width of the media block is smaller than that of the RecyclerView, offset the views horizontally to center them
if(listWidth>width){
outRect.left+=(listWidth-V.dp(ImageAttachmentFrameLayout.MAX_WIDTH))/2;
if(tile.startCol>0){
int spanOffset=0;
for(int i=0;i<tile.startCol;i++){
spanOffset+=layout.columnSizes[i];
}
outRect.left-=Math.round(spanOffset/1000f*listWidth);
outRect.left+=Math.round(spanOffset/1000f*width);
}
}
}
}
private void rebuildMediaHiddenLayouts(int width){
currentMediaHiddenLayoutsWidth=width;
String title=getString(R.string.sensitive_content);

View File

@@ -109,7 +109,7 @@ import org.joinmastodon.android.ui.text.ComposeAutocompleteSpan;
import org.joinmastodon.android.ui.text.ComposeHashtagOrMentionSpan;
import org.joinmastodon.android.ui.text.HtmlParser;
import org.joinmastodon.android.ui.utils.SimpleTextWatcher;
import org.joinmastodon.android.ui.utils.TransferSpeedTracker;
import org.joinmastodon.android.utils.TransferSpeedTracker;
import org.joinmastodon.android.ui.utils.UiUtils;
import org.joinmastodon.android.ui.views.ComposeEditText;
import org.joinmastodon.android.ui.views.ComposeMediaLayout;
@@ -204,6 +204,7 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
private List<EmojiCategory> customEmojis;
private CustomEmojiPopupKeyboard emojiKeyboard;
private Status replyTo;
private Status quote;
private String initialText;
private String uuid;
private int pollDuration=24*3600;
@@ -252,6 +253,8 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
editingStatus=Parcels.unwrap(getArguments().getParcelable("editStatus"));
if(getArguments().containsKey("replyTo"))
replyTo=Parcels.unwrap(getArguments().getParcelable("replyTo"));
if(getArguments().containsKey("quote"))
quote=Parcels.unwrap(getArguments().getParcelable("quote"));
if(instance==null){
Nav.finish(this);
return;
@@ -333,7 +336,9 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
scheduleTimeBtn=view.findViewById(R.id.scheduled_time_btn);
sensitiveIcon=view.findViewById(R.id.sensitive_icon);
sensitiveItem=view.findViewById(R.id.sensitive_item);
replyText=view.findViewById(R.id.reply_text);
replyText=view.findViewById(GlobalUserPreferences.replyLineAboveHeader ? R.id.reply_text : R.id.reply_text_below);
view.findViewById(GlobalUserPreferences.replyLineAboveHeader ? R.id.reply_text_below : R.id.reply_text)
.setVisibility(View.GONE);
if (isPhotoPickerAvailable()) {
PopupMenu attachPopup = new PopupMenu(getContext(), mediaBtn);
@@ -605,7 +610,8 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
}
});
spoilerEdit.addTextChangedListener(new SimpleTextWatcher(e->updateCharCounter()));
if(replyTo!=null){
if(replyTo!=null || quote!=null){
Status status = quote!=null ? quote : replyTo;
View replyWrap = view.findViewById(R.id.reply_wrap);
scrollView.getViewTreeObserver().addOnGlobalLayoutListener(() -> {
int scrollHeight = scrollView.getHeight();
@@ -631,13 +637,13 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
originalPost.setOnClickListener(v->{
Bundle args=new Bundle();
args.putString("account", accountID);
args.putParcelable("status", Parcels.wrap(replyTo));
args.putParcelable("status", Parcels.wrap(status));
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
Nav.go(getActivity(), ThreadFragment.class, args);
});
ImageView avatar = view.findViewById(R.id.avatar);
ViewImageLoader.load(avatar, null, new UrlImageLoaderRequest(replyTo.account.avatar));
ViewImageLoader.load(avatar, null, new UrlImageLoaderRequest(status.account.avatar));
ViewOutlineProvider roundCornersOutline=new ViewOutlineProvider(){
@Override
public void getOutline(View view, Outline outline){
@@ -649,15 +655,15 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
avatar.setOnClickListener(v->{
Bundle args=new Bundle();
args.putString("account", accountID);
args.putParcelable("profileAccount", Parcels.wrap(replyTo.account));
args.putParcelable("profileAccount", Parcels.wrap(status.account));
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
Nav.go(getActivity(), ProfileFragment.class, args);
});
((TextView) view.findViewById(R.id.name)).setText(replyTo.account.displayName);
((TextView) view.findViewById(R.id.username)).setText(replyTo.account.getDisplayUsername());
((TextView) view.findViewById(R.id.name)).setText(status.account.displayName);
((TextView) view.findViewById(R.id.username)).setText(status.account.getDisplayUsername());
view.findViewById(R.id.visibility).setVisibility(View.GONE);
Drawable visibilityIcon = getActivity().getDrawable(switch(replyTo.visibility){
Drawable visibilityIcon = getActivity().getDrawable(switch(status.visibility){
case PUBLIC -> R.drawable.ic_fluent_earth_20_regular;
case UNLISTED -> R.drawable.ic_fluent_lock_open_20_regular;
case PRIVATE -> R.drawable.ic_fluent_lock_closed_20_filled;
@@ -668,36 +674,37 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
moreBtn.setImageDrawable(visibilityIcon);
moreBtn.setBackground(null);
TextView timestamp = view.findViewById(R.id.timestamp);
if (replyTo.editedAt==null) timestamp.setText(UiUtils.formatRelativeTimestamp(getContext(), replyTo.createdAt));
else timestamp.setText(getString(R.string.edited_timestamp, UiUtils.formatRelativeTimestamp(getContext(), replyTo.editedAt)));
if (replyTo.spoilerText != null && !replyTo.spoilerText.isBlank()) {
if (status.editedAt!=null) timestamp.setText(getString(R.string.edited_timestamp, UiUtils.formatRelativeTimestamp(getContext(), status.editedAt)));
else if (status.createdAt!=null) timestamp.setText(UiUtils.formatRelativeTimestamp(getContext(), status.createdAt));
else timestamp.setText("");
if (status.spoilerText != null && !status.spoilerText.isBlank()) {
view.findViewById(R.id.spoiler_header).setVisibility(View.VISIBLE);
((TextView) view.findViewById(R.id.spoiler_title_inline)).setText(replyTo.spoilerText);
((TextView) view.findViewById(R.id.spoiler_title_inline)).setText(status.spoilerText);
}
SpannableStringBuilder content = HtmlParser.parse(replyTo.content, replyTo.emojis, replyTo.mentions, replyTo.tags, accountID);
SpannableStringBuilder content = HtmlParser.parse(status.content, status.emojis, status.mentions, status.tags, accountID);
LinkedTextView text = view.findViewById(R.id.text);
if (content.length() > 0) text.setText(content);
else view.findViewById(R.id.display_item_text).setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, V.dp(16)));
replyText.setText(getString(R.string.in_reply_to, replyTo.account.displayName));
int visibilityNameRes = switch (replyTo.visibility) {
replyText.setText(getString(quote!=null? R.string.sk_quoting_user : R.string.in_reply_to, status.account.displayName));
int visibilityNameRes = switch (status.visibility) {
case PUBLIC -> R.string.visibility_public;
case UNLISTED -> R.string.sk_visibility_unlisted;
case PRIVATE -> R.string.visibility_followers_only;
case DIRECT -> R.string.visibility_private;
case LOCAL -> R.string.sk_local_only;
};
replyText.setContentDescription(getString(R.string.in_reply_to, replyTo.account.displayName) + ". " + getString(R.string.post_visibility) + ": " + getString(visibilityNameRes));
replyText.setContentDescription(getString(R.string.in_reply_to, status.account.displayName) + ". " + getString(R.string.post_visibility) + ": " + getString(visibilityNameRes));
replyText.setOnClickListener(v->{
scrollView.smoothScrollTo(0, 0);
});
ArrayList<String> mentions=new ArrayList<>();
String ownID=AccountSessionManager.getInstance().getAccount(accountID).self.id;
if(!replyTo.account.id.equals(ownID))
mentions.add('@'+replyTo.account.acct);
for(Mention mention:replyTo.mentions){
if(!status.account.id.equals(ownID))
mentions.add('@'+status.account.acct);
for(Mention mention:status.mentions){
if(mention.id.equals(ownID))
continue;
String m='@'+mention.acct;
@@ -710,17 +717,17 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
ignoreSelectionChanges=true;
mainEditText.setSelection(mainEditText.length());
ignoreSelectionChanges=false;
if(!TextUtils.isEmpty(replyTo.spoilerText)){
if(!TextUtils.isEmpty(status.spoilerText)){
hasSpoiler=true;
spoilerEdit.setVisibility(View.VISIBLE);
if(GlobalUserPreferences.prefixRepliesWithRe && !replyTo.spoilerText.startsWith("re: ")){
spoilerEdit.setText("re: " + replyTo.spoilerText);
if(GlobalUserPreferences.prefixRepliesWithRe && !status.spoilerText.startsWith("re: ")){
spoilerEdit.setText("re: " + status.spoilerText);
}else{
spoilerEdit.setText(replyTo.spoilerText);
spoilerEdit.setText(status.spoilerText);
}
spoilerBtn.setSelected(true);
}
if (replyTo.language != null && !replyTo.language.isEmpty()) updateLanguage(replyTo.language);
if (status.language != null && !status.language.isEmpty()) updateLanguage(status.language);
}
}else if (editingStatus==null || editingStatus.inReplyToId==null){
// TODO: remove workaround after https://github.com/mastodon/mastodon-android/issues/341 gets fixed
@@ -971,9 +978,11 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
}
private void onCustomEmojiClick(Emoji emoji){
int start=mainEditText.getSelectionStart();
String prefix=start>0 && !Character.isWhitespace(mainEditText.getText().charAt(start-1)) ? " :" : ":";
mainEditText.getText().replace(start, mainEditText.getSelectionEnd(), prefix+emoji.shortcode+':');
if(getActivity().getCurrentFocus() instanceof EditText edit){
int start=edit.getSelectionStart();
String prefix=start>0 && !Character.isWhitespace(edit.getText().charAt(start-1)) ? " :" : ":";
edit.getText().replace(start, edit.getSelectionEnd(), prefix+emoji.shortcode+':');
}
}
@Override
@@ -1085,6 +1094,9 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
if(hasSpoiler && spoilerEdit.length()>0){
req.spoilerText=spoilerEdit.getText().toString();
}
if(quote != null){
req.quoteId=quote.id;
}
if(uuid==null)
uuid=UUID.randomUUID().toString();
@@ -1117,7 +1129,9 @@ public class ComposeFragment extends MastodonToolbarFragment implements OnBackPr
}else{
E.post(new StatusUpdatedEvent(result));
}
Nav.finish(ComposeFragment.this);
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O || !isStateSaved()) {
Nav.finish(ComposeFragment.this);
}
if (getArguments().getBoolean("navigateToStatus", false)) {
Bundle args=new Bundle();
args.putString("account", accountID);

View File

@@ -358,7 +358,7 @@ public class HomeTabFragment extends MastodonToolbarFragment implements Scrollab
addListsToOverflowMenu();
addHashtagsToOverflowMenu();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && !UiUtils.isEMUI()) {
m.setGroupDividerEnabled(true);
}
}

View File

@@ -232,7 +232,7 @@ public class NotificationsFragment extends MastodonToolbarFragment implements Sc
@Override
public SimpleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){
FrameLayout view=tabViews[viewType];
((ViewGroup)view.getParent()).removeView(view);
if (view.getParent() != null) ((ViewGroup)view.getParent()).removeView(view);
view.setVisibility(View.VISIBLE);
view.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
return new SimpleViewHolder(view);

View File

@@ -19,9 +19,7 @@ import org.joinmastodon.android.model.Notification;
import org.joinmastodon.android.model.PaginatedResponse;
import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.ui.displayitems.AccountCardStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.AccountStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.HeaderStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.ImageStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.StatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.TextStatusDisplayItem;
import org.joinmastodon.android.ui.utils.DiscoverInfoBannerHelper;
@@ -40,7 +38,6 @@ import java.util.stream.Stream;
import androidx.recyclerview.widget.RecyclerView;
import me.grishka.appkit.Nav;
import me.grishka.appkit.api.SimpleCallback;
import me.grishka.appkit.utils.V;
public class NotificationsListFragment extends BaseStatusListFragment<Notification>{
private boolean onlyMentions;
@@ -98,13 +95,6 @@ public class NotificationsListFragment extends BaseStatusListFragment<Notificati
HeaderStatusDisplayItem titleItem=extraText!=null ? new HeaderStatusDisplayItem(n.id, n.account, n.createdAt, this, accountID, n.status, extraText, n, null) : null;
if(n.status!=null){
ArrayList<StatusDisplayItem> items=StatusDisplayItem.buildItems(this, n.status, accountID, n, knownAccounts, titleItem!=null, titleItem==null, n, false, Filter.FilterContext.NOTIFICATIONS);
if(titleItem!=null){
for(StatusDisplayItem item:items){
if(item instanceof ImageStatusDisplayItem imgItem){
imgItem.horizontalInset=V.dp(32);
}
}
}
if(titleItem!=null)
items.add(0, titleItem);
return items;
@@ -127,6 +117,8 @@ public class NotificationsListFragment extends BaseStatusListFragment<Notificati
knownAccounts.put(s.account.id, s.account);
if(s.status!=null && !knownAccounts.containsKey(s.status.account.id))
knownAccounts.put(s.status.account.id, s.status.account);
if(s.status!=null && s.status.reblog!=null && !knownAccounts.containsKey(s.status.reblog.account.id))
knownAccounts.put(s.status.reblog.account.id, s.status.reblog.account);
}
@Override

View File

@@ -19,24 +19,30 @@ import android.os.Bundle;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.text.style.ImageSpan;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.SubMenu;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewOutlineProvider;
import android.view.ViewTreeObserver;
import android.view.WindowInsets;
import android.view.inputmethod.InputMethodManager;
import android.view.animation.TranslateAnimation;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.Toolbar;
import org.joinmastodon.android.GlobalUserPreferences;
@@ -142,10 +148,11 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
private Uri editNewAvatar, editNewCover;
private String profileAccountID;
private boolean refreshing;
private View fab;
private ImageButton fab;
private WindowInsets childInsets;
private PhotoViewer currentPhotoViewer;
private boolean editModeLoading;
protected int scrollDiff = 0;
private static final int MAX_FIELDS=4;
@@ -298,6 +305,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
});
actionButton.setOnClickListener(this::onActionButtonClick);
actionButton.setOnLongClickListener(this::onActionButtonLongClick);
notifyButton.setOnClickListener(this::onNotifyButtonClick);
avatar.setOnClickListener(this::onAvatarClick);
cover.setOnClickListener(this::onCoverClick);
@@ -489,8 +497,10 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
for (Account.Role role : account.roles) {
TextView roleText = new TextView(getActivity(), null, 0, R.style.role_label);
roleText.setText(role.name);
GradientDrawable bg = (GradientDrawable) roleText.getBackground().mutate();
bg.setStroke(V.dp(2), Color.parseColor(role.color));
if (!TextUtils.isEmpty(role.color) && role.color.startsWith("#")) try {
GradientDrawable bg = (GradientDrawable) roleText.getBackground().mutate();
bg.setStroke(V.dp(2), Color.parseColor(role.color));
} catch (Exception ignored) {}
rolesView.addView(roleText);
}
}
@@ -540,10 +550,12 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
fields.clear();
AccountField joined=new AccountField();
joined.parsedName=joined.name=getString(R.string.profile_joined);
joined.parsedValue=joined.value=DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).format(LocalDateTime.ofInstant(account.createdAt, ZoneId.systemDefault()));
fields.add(joined);
if (account.createdAt != null) {
AccountField joined=new AccountField();
joined.parsedName=joined.name=getString(R.string.profile_joined);
joined.parsedValue=joined.value=DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).format(LocalDateTime.ofInstant(account.createdAt, ZoneId.systemDefault()));
fields.add(joined);
}
for(AccountField field:account.fields){
field.parsedValue=ssb=HtmlParser.parse(field.value, account.emojis, Collections.emptyList(), Collections.emptyList(), accountID);
@@ -599,6 +611,16 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
return;
inflater.inflate(isOwnProfile ? R.menu.profile_own : R.menu.profile, menu);
UiUtils.enableOptionsMenuIcons(getActivity(), menu, R.id.bookmarks, R.id.followed_hashtags);
boolean hasMultipleAccounts = AccountSessionManager.getInstance().getLoggedInAccounts().size() > 1;
MenuItem openWithAccounts = menu.findItem(R.id.open_with_account);
openWithAccounts.setVisible(hasMultipleAccounts);
SubMenu accountsMenu = openWithAccounts.getSubMenu();
if (hasMultipleAccounts) {
accountsMenu.clear();
UiUtils.populateAccountsMenu(accountID, accountsMenu, s-> UiUtils.openURL(
getActivity(), s.getID(), account.url, false
));
}
menu.findItem(R.id.share).setTitle(getString(R.string.share_user, account.getShortUsername()));
if(isOwnProfile)
return;
@@ -734,6 +756,10 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
notifyButton.setContentDescription(getString(relationship.notifying ? R.string.sk_user_post_notifications_on : R.string.sk_user_post_notifications_off, '@'+account.username));
}
public ImageButton getFab() {
return fab;
}
private void onScrollChanged(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY){
int topBarsH=getToolbar().getHeight()+statusBarHeight;
if(scrollY>avatarBorder.getTop()-topBarsH){
@@ -764,6 +790,35 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
if(currentPhotoViewer!=null){
currentPhotoViewer.offsetView(0, oldScrollY-scrollY);
}
if (GlobalUserPreferences.autoHideFab) {
int dy = scrollY - oldScrollY;
if (dy > 0 && fab.getVisibility() == View.VISIBLE) {
TranslateAnimation animate = new TranslateAnimation(
0,
0,
0,
fab.getHeight() * 2);
animate.setDuration(300);
fab.startAnimation(animate);
fab.setVisibility(View.INVISIBLE);
scrollDiff = 0;
} else if (dy < 0 && fab.getVisibility() != View.VISIBLE) {
if (v.getScrollY() == 0 || scrollDiff > 400) {
fab.setVisibility(View.VISIBLE);
TranslateAnimation animate = new TranslateAnimation(
0,
0,
fab.getHeight() * 2,
0);
animate.setDuration(300);
fab.startAnimation(animate);
scrollDiff = 0;
} else {
scrollDiff += Math.abs(dy);
}
}
}
}
private Fragment getFragmentForPage(int page){
@@ -792,6 +847,31 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
}
}
private boolean onActionButtonLongClick(View v) {
if (isOwnProfile || AccountSessionManager.getInstance().getLoggedInAccounts().size() < 2) return false;
UiUtils.pickAccount(getActivity(), accountID, R.string.sk_follow_as, R.drawable.ic_fluent_person_add_28_regular, session -> {
UiUtils.lookupAccount(getActivity(), account, session.getID(), accountID, acc -> {
if (acc == null) return;
new SetAccountFollowed(acc.id, true, true).setCallback(new Callback<>() {
@Override
public void onSuccess(Relationship relationship) {
Toast.makeText(
getActivity(),
getString(R.string.sk_followed_as, session.self.getShortUsername()),
Toast.LENGTH_SHORT
).show();
}
@Override
public void onError(ErrorResponse error) {
error.showToast(getActivity());
}
}).exec(session.getID());
});
}, null);
return true;
}
private void setActionProgressVisible(boolean visible){
actionButton.setTextVisible(!visible);
actionProgress.setVisibility(visible ? View.VISIBLE : View.GONE);
@@ -838,7 +918,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
pager.setUserInputEnabled(false);
actionButton.setText(R.string.done);
ArrayList<Animator> animators=new ArrayList<>();
Drawable overlay=getResources().getDrawable(R.drawable.edit_avatar_overlay).mutate();
Drawable overlay=getResources().getDrawable(R.drawable.edit_avatar_overlay, getActivity().getTheme()).mutate();
avatar.setForeground(overlay);
animators.add(ObjectAnimator.ofInt(overlay, "alpha", 0, 255));
@@ -1055,7 +1135,7 @@ public class ProfileFragment extends LoaderFragment implements OnBackPressedList
@Override
public SimpleViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType){
FrameLayout view=tabViews[viewType];
((ViewGroup)view.getParent()).removeView(view);
if (view.getParent() != null) ((ViewGroup)view.getParent()).removeView(view);
view.setVisibility(View.VISIBLE);
view.setLayoutParams(new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
return new SimpleViewHolder(view);

View File

@@ -80,7 +80,7 @@ public class SettingsFragment extends MastodonToolbarFragment{
private ArrayList<Item> items=new ArrayList<>();
private ThemeItem themeItem;
private NotificationPolicyItem notificationPolicyItem;
private SwitchItem showNewPostsButtonItem, glitchModeItem;
private SwitchItem showNewPostsButtonItem, glitchModeItem, compactReblogReplyLineItem;
private String accountID;
private boolean needUpdateNotificationSettings;
private boolean needAppRestart;
@@ -213,6 +213,22 @@ public class SettingsFragment extends MastodonToolbarFragment{
GlobalUserPreferences.showReplies=i.checked;
GlobalUserPreferences.save();
}));
if (instance.pleroma != null) {
items.add(new ButtonItem(R.string.sk_settings_reply_visibility, R.drawable.ic_fluent_chat_24_regular, b->{
PopupMenu popupMenu=new PopupMenu(getActivity(), b, Gravity.CENTER_HORIZONTAL);
popupMenu.inflate(R.menu.reply_visibility);
popupMenu.setOnMenuItemClickListener(item -> this.onReplyVisibilityChanged(item, b));
b.setOnTouchListener(popupMenu.getDragToOpenListener());
b.setOnClickListener(v->popupMenu.show());
b.setText(GlobalUserPreferences.replyVisibility == null ?
R.string.sk_settings_reply_visibility_all :
switch(GlobalUserPreferences.replyVisibility){
case "following" -> R.string.sk_settings_reply_visibility_following;
case "self" -> R.string.sk_settings_reply_visibility_self;
default -> R.string.sk_settings_reply_visibility_all;
});
}));
}
items.add(new SwitchItem(R.string.sk_settings_show_boosts, R.drawable.ic_fluent_arrow_repeat_all_24_regular, GlobalUserPreferences.showBoosts, i->{
GlobalUserPreferences.showBoosts=i.checked;
GlobalUserPreferences.save();
@@ -239,15 +255,35 @@ public class SettingsFragment extends MastodonToolbarFragment{
GlobalUserPreferences.showNoAltIndicator=i.checked;
GlobalUserPreferences.save();
}));
items.add(new SwitchItem(R.string.sk_settings_collapse_long_posts, R.drawable.ic_fluent_chevron_down_24_filled, GlobalUserPreferences.collapseLongPosts, i->{
items.add(new SwitchItem(R.string.sk_settings_collapse_long_posts, R.drawable.ic_fluent_chevron_down_24_regular, GlobalUserPreferences.collapseLongPosts, i->{
GlobalUserPreferences.collapseLongPosts=i.checked;
GlobalUserPreferences.save();
}));
items.add(new SwitchItem(R.string.sk_spectator_mode, R.drawable.ic_fluent_eye_24_regular, GlobalUserPreferences.spectatorMode, i->{
items.add(new SwitchItem(R.string.sk_settings_hide_interaction, R.drawable.ic_fluent_eye_24_regular, GlobalUserPreferences.spectatorMode, i->{
GlobalUserPreferences.spectatorMode=i.checked;
GlobalUserPreferences.save();
needAppRestart=true;
}));
items.add(new SwitchItem(R.string.sk_settings_hide_fab, R.drawable.ic_fluent_edit_24_regular, GlobalUserPreferences.autoHideFab, i->{
GlobalUserPreferences.autoHideFab=i.checked;
GlobalUserPreferences.save();
needAppRestart=true;
}));
items.add(new SwitchItem(R.string.sk_reply_line_above_avatar, R.drawable.ic_fluent_arrow_reply_24_regular, GlobalUserPreferences.replyLineAboveHeader, i->{
GlobalUserPreferences.replyLineAboveHeader=i.checked;
GlobalUserPreferences.compactReblogReplyLine=i.checked;
compactReblogReplyLineItem.enabled=i.checked;
compactReblogReplyLineItem.checked= GlobalUserPreferences.replyLineAboveHeader;
if (list.findViewHolderForAdapterPosition(items.indexOf(compactReblogReplyLineItem)) instanceof SwitchViewHolder svh) svh.rebind();
GlobalUserPreferences.save();
needAppRestart=true;
}));
items.add(compactReblogReplyLineItem=new SwitchItem(R.string.sk_compact_reblog_reply_line, R.drawable.ic_fluent_re_order_24_regular, GlobalUserPreferences.compactReblogReplyLine, i->{
GlobalUserPreferences.compactReblogReplyLine=i.checked;
GlobalUserPreferences.save();
needAppRestart=true;
}));
compactReblogReplyLineItem.enabled=GlobalUserPreferences.replyLineAboveHeader;
items.add(new SwitchItem(R.string.sk_settings_translate_only_opened, R.drawable.ic_fluent_translate_24_regular, GlobalUserPreferences.translateButtonOpenedOnly, i->{
GlobalUserPreferences.translateButtonOpenedOnly=i.checked;
GlobalUserPreferences.save();
@@ -460,6 +496,25 @@ public class SettingsFragment extends MastodonToolbarFragment{
}
}
private boolean onReplyVisibilityChanged(MenuItem item, Button btn){
String pref = null;
int id = item.getItemId();
if (id == R.id.reply_visibility_following) pref = "following";
else if (id == R.id.reply_visibility_self) pref = "self";
GlobalUserPreferences.replyVisibility=pref;
GlobalUserPreferences.save();
btn.setText(GlobalUserPreferences.replyVisibility == null ?
R.string.sk_settings_reply_visibility_all :
switch(GlobalUserPreferences.replyVisibility){
case "following" -> R.string.sk_settings_reply_visibility_following;
case "self" -> R.string.sk_settings_reply_visibility_self;
default -> R.string.sk_settings_reply_visibility_all;
});
return true;
}
private void restartActivityToApplyNewTheme(){
// Calling activity.recreate() causes a black screen for like half a second.
// So, let's take a screenshot and overlay it on top to create the illusion of a smoother transition.

View File

@@ -41,6 +41,8 @@ public abstract class StatusListFragment extends BaseStatusListFragment<Status>{
protected void addAccountToKnown(Status s){
if(!knownAccounts.containsKey(s.account.id))
knownAccounts.put(s.account.id, s.account);
if(s.reblog!=null && !knownAccounts.containsKey(s.reblog.account.id))
knownAccounts.put(s.reblog.account.id, s.reblog.account);
}
@Override

View File

@@ -5,9 +5,12 @@ import android.view.View;
import org.joinmastodon.android.R;
import org.joinmastodon.android.api.requests.statuses.GetStatusContext;
import org.joinmastodon.android.api.session.AccountSession;
import org.joinmastodon.android.api.session.AccountSessionManager;
import org.joinmastodon.android.events.StatusCreatedEvent;
import org.joinmastodon.android.model.Account;
import org.joinmastodon.android.model.Filter;
import org.joinmastodon.android.model.Instance;
import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.model.StatusContext;
import org.joinmastodon.android.ui.displayitems.ExtendedFooterStatusDisplayItem;
@@ -19,6 +22,7 @@ import org.joinmastodon.android.ui.utils.UiUtils;
import org.joinmastodon.android.utils.StatusFilterPredicate;
import org.parceler.Parcels;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
@@ -68,6 +72,30 @@ public class ThreadFragment extends StatusListFragment{
data.add(mainStatus);
onAppendItems(Collections.singletonList(mainStatus));
}
AccountSession account=AccountSessionManager.getInstance().getAccount(accountID);
Instance instance=AccountSessionManager.getInstance().getInstanceInfo(account.domain);
if(instance.pleroma != null){
List<String> threadIds=new ArrayList<>();
threadIds.add(mainStatus.id);
for(Status s:result.descendants){
if(threadIds.contains(s.inReplyToId)){
threadIds.add(s.id);
}
}
threadIds.add(mainStatus.inReplyToId);
for(int i=result.ancestors.size()-1; i >= 0; i--){
Status s=result.ancestors.get(i);
if(s.inReplyToId != null && threadIds.contains(s.id)){
threadIds.add(s.inReplyToId);
}
}
result.ancestors=result.ancestors.stream().filter(s -> threadIds.contains(s.id)).collect(Collectors.toList());
result.descendants=getDescendantsOrdered(mainStatus.id,
result.descendants.stream()
.filter(s -> threadIds.contains(s.id))
.collect(Collectors.toList()));
}
result.descendants=filterStatuses(result.descendants);
result.ancestors=filterStatuses(result.ancestors);
if(footerProgress!=null)
@@ -90,6 +118,24 @@ public class ThreadFragment extends StatusListFragment{
.exec(accountID);
}
private List<Status> getDescendantsOrdered(String id, List<Status> statuses){
List<Status> out=new ArrayList<>();
for(Status s:getDirectDescendants(id, statuses)){
out.add(s);
getDirectDescendants(s.id, statuses).forEach(d ->{
out.add(d);
out.addAll(getDescendantsOrdered(d.id, statuses));
});
}
return out;
}
private List<Status> getDirectDescendants(String id, List<Status> statuses){
return statuses.stream()
.filter(s -> s.inReplyToId.equals(id))
.collect(Collectors.toList());
}
private List<Status> filterStatuses(List<Status> statuses){
StatusFilterPredicate statusFilterPredicate=new StatusFilterPredicate(accountID,Filter.FilterContext.THREAD);
return statuses.stream()

View File

@@ -248,6 +248,6 @@ public class AccountActivationFragment extends ToolbarFragment{
Bundle args=new Bundle();
args.putString("account", accountID);
// Nav.goClearingStack(getActivity(), HomeFragment.class, args);
Nav.goClearingStack(getActivity(), OnboardingProfileSetupFragment.class, args);
Nav.goClearingStack(getActivity(), OnboardingFollowSuggestionsFragment.class, args);
}
}

View File

@@ -5,15 +5,12 @@ import android.app.ProgressDialog;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.LocaleList;
import android.text.TextUtils;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowInsets;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.TextView;
import org.joinmastodon.android.R;
@@ -23,7 +20,6 @@ import org.joinmastodon.android.api.requests.instance.GetInstance;
import org.joinmastodon.android.model.Instance;
import org.joinmastodon.android.model.catalog.CatalogInstance;
import org.joinmastodon.android.ui.M3AlertDialogBuilder;
import org.joinmastodon.android.ui.utils.UiUtils;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
@@ -31,6 +27,8 @@ import org.xml.sax.InputSource;
import java.io.IOException;
import java.net.IDN;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -50,7 +48,6 @@ import me.grishka.appkit.fragments.BaseRecyclerFragment;
import me.grishka.appkit.utils.BindableViewHolder;
import me.grishka.appkit.utils.MergeRecyclerAdapter;
import me.grishka.appkit.utils.V;
import me.grishka.appkit.views.UsableRecyclerView;
import okhttp3.Call;
import okhttp3.Request;
import okhttp3.Response;
@@ -112,46 +109,10 @@ abstract class InstanceCatalogFragment extends BaseRecyclerFragment<CatalogInsta
}
protected List<CatalogInstance> sortInstances(List<CatalogInstance> result){
Map<String, List<CatalogInstance>> byLang=result.stream().collect(Collectors.groupingBy(ci->ci.language));
for(List<CatalogInstance> group:byLang.values()){
Collections.sort(group, (a, b)->{
double aa=Math.abs(DUNBAR-Math.log(a.lastWeekUsers));
double bb=Math.abs(DUNBAR-Math.log(b.lastWeekUsers));
return Double.compare(aa, bb);
});
}
// get the list of user-configured system languages
List<String> userLangs;
if(Build.VERSION.SDK_INT<24){
userLangs=Collections.singletonList(getResources().getConfiguration().locale.getLanguage());
}else{
LocaleList ll=getResources().getConfiguration().getLocales();
userLangs=new ArrayList<>(ll.size());
for(int i=0;i<ll.size();i++){
userLangs.add(ll.get(i).getLanguage());
}
}
// add instances in preferred languages to the top of the list, in the order of preference
Map<Boolean, List<CatalogInstance>> byLang=result.stream().sorted(Comparator.comparingInt((CatalogInstance ci)->ci.lastWeekUsers).reversed()).collect(Collectors.groupingBy(ci->ci.approvalRequired));
ArrayList<CatalogInstance> sortedList=new ArrayList<>();
for(String lang:userLangs){
List<CatalogInstance> langInstances=byLang.remove(lang);
if(langInstances!=null){
sortedList.addAll(langInstances);
}
}
// sort the remaining language groups by aggregate lastWeekUsers
class InstanceGroup{
public int activeUsers;
public List<CatalogInstance> instances;
}
byLang.values().stream().map(il->{
InstanceGroup group=new InstanceGroup();
group.instances=il;
for(CatalogInstance instance:il){
group.activeUsers+=instance.lastWeekUsers;
}
return group;
}).sorted(Comparator.comparingInt((InstanceGroup g)->g.activeUsers).reversed()).forEachOrdered(ig->sortedList.addAll(ig.instances));
sortedList.addAll(byLang.getOrDefault(false, Collections.emptyList()));
sortedList.addAll(byLang.getOrDefault(true, Collections.emptyList()));
return sortedList;
}
@@ -208,6 +169,20 @@ abstract class InstanceCatalogFragment extends BaseRecyclerFragment<CatalogInsta
cancelLoadingInstanceInfo();
}
}
try{
new URI("https://"+domain+"/api/v1/instance"); // Validate the host by trying to parse the URI
}catch(URISyntaxException x){
showInstanceInfoLoadError(domain, x);
if(fakeInstance!=null){
fakeInstance.description=getString(R.string.error);
if(filteredData.size()>0 && filteredData.get(0)==fakeInstance){
if(list.findViewHolderForAdapterPosition(1) instanceof BindableViewHolder<?> ivh){
ivh.rebind();
}
}
}
return;
}
loadingInstanceDomain=domain;
loadingInstanceRequest=new GetInstance();
loadingInstanceRequest.setCallback(new Callback<>(){

View File

@@ -64,7 +64,7 @@ public class InstanceCatalogSignupFragment extends InstanceCatalogFragment imple
private List<String> languages=Collections.emptyList();
private PopupMenu langFilterMenu, speedFilterMenu;
private SignupSpeedFilter currentSignupSpeedFilter=SignupSpeedFilter.INSTANT;
private SignupSpeedFilter currentSignupSpeedFilter=SignupSpeedFilter.ANY;
private String currentLanguage=null;
private boolean searchQueryMode;
private LinearLayout filtersWrap;
@@ -75,7 +75,7 @@ public class InstanceCatalogSignupFragment extends InstanceCatalogFragment imple
private FilterChipView categoryGeneral, categorySpecialInterests;
private List<FilterChipView> regionalFilters;
private CatalogInstance.Region chosenRegion;
private CategoryChoice categoryChoice;
private CategoryChoice categoryChoice=CategoryChoice.GENERAL;
public InstanceCatalogSignupFragment(){
super(R.layout.fragment_onboarding_common, 10);
@@ -371,6 +371,9 @@ public class InstanceCatalogSignupFragment extends InstanceCatalogFragment imple
if(instances.isEmpty()){
instances=data.stream().filter(ci->!ci.approvalRequired && ("general".equals(ci.category) || (ci.categories!=null && ci.categories.contains("general")))).collect(Collectors.toList());
}
if(instances.isEmpty()){
instances=data.stream().filter(ci->("general".equals(ci.category) || (ci.categories!=null && ci.categories.contains("general")))).collect(Collectors.toList());
}
if(instances.isEmpty()){
return;
}

View File

@@ -2,8 +2,14 @@ package org.joinmastodon.android.fragments.onboarding;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.graphics.Typeface;
import android.os.Build;
import android.os.Bundle;
import android.text.Html;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.style.StyleSpan;
import android.text.style.TypefaceSpan;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
@@ -64,7 +70,7 @@ public class InstanceRulesFragment extends ToolbarFragment{
list.setLayoutManager(new LinearLayoutManager(getActivity()));
View headerView=inflater.inflate(R.layout.item_list_header_simple, list, false);
TextView text=headerView.findViewById(R.id.text);
text.setText(getString(R.string.instance_rules_subtitle, instance.uri));
text.setText(Html.fromHtml(getString(R.string.instance_rules_subtitle, "<b>"+Html.escapeHtml(instance.uri)+"</b>")));
adapter=new MergeRecyclerAdapter();
adapter.addAdapter(new SingleViewRecyclerAdapter(headerView));

View File

@@ -191,6 +191,13 @@ public class OnboardingFollowSuggestionsFragment extends BaseRecyclerFragment<Pa
.setCallback(new Callback<>(){
@Override
public void onSuccess(Relationship result){
relationships.put(id, result);
for(int i=0;i<list.getChildCount();i++){
if(list.getChildViewHolder(list.getChildAt(i)) instanceof SuggestionViewHolder svh && svh.getItem().account.id.equals(id)){
svh.rebind();
break;
}
}
numRunningFollowRequests--;
progress.setProgress(progress.getMax()-accountIdsToFollow.size()-numRunningFollowRequests);
followNextAccount(accountIdsToFollow, progress);
@@ -209,20 +216,7 @@ public class OnboardingFollowSuggestionsFragment extends BaseRecyclerFragment<Pa
private void proceed(){
Bundle args=new Bundle();
args.putString("account", accountID);
Nav.go(getActivity(), HomeFragment.class, args);
getActivity().getWindow().getDecorView().postDelayed(()->Nav.finish(this), 500);
}
@Override
protected boolean canGoBack(){
return true;
}
@Override
public void onToolbarNavigationClick(){
Bundle args=new Bundle();
args.putString("account", accountID);
Nav.goClearingStack(getActivity(), HomeFragment.class, args);
Nav.go(getActivity(), OnboardingProfileSetupFragment.class, args);
}
private class SuggestionsAdapter extends UsableRecyclerView.Adapter<SuggestionViewHolder> implements ImageLoaderRecyclerAdapter{

View File

@@ -151,8 +151,7 @@ public class OnboardingProfileSetupFragment extends ToolbarFragment implements R
AccountSessionManager.getInstance().updateAccountInfo(accountID, result);
Bundle args=new Bundle();
args.putString("account", accountID);
Nav.go(getActivity(), OnboardingFollowSuggestionsFragment.class, args);
getActivity().getWindow().getDecorView().postDelayed(()->Nav.finish(OnboardingProfileSetupFragment.this), 500);
Nav.goClearingStack(getActivity(), HomeFragment.class, args);
}
@Override
@@ -182,6 +181,11 @@ public class OnboardingProfileSetupFragment extends ToolbarFragment implements R
profileFieldsLayout.startDragging(view);
return true;
});
view.findViewById(R.id.delete).setOnClickListener(v->{
profileFieldsLayout.removeView(view);
if(addRow.getVisibility()==View.GONE)
addRow.setVisibility(View.VISIBLE);
});
return view;
}
@@ -222,16 +226,4 @@ public class OnboardingProfileSetupFragment extends ToolbarFragment implements R
img.setForeground(null);
ViewImageLoader.load(img, null, new UrlImageLoaderRequest(uri, size, size));
}
@Override
protected boolean canGoBack(){
return true;
}
@Override
public void onToolbarNavigationClick(){
Bundle args=new Bundle();
args.putString("account", accountID);
Nav.goClearingStack(getActivity(), HomeFragment.class, args);
}
}

View File

@@ -22,10 +22,8 @@ import org.joinmastodon.android.events.FinishReportFragmentsEvent;
import org.joinmastodon.android.fragments.StatusListFragment;
import org.joinmastodon.android.model.Account;
import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.ui.PhotoLayoutHelper;
import org.joinmastodon.android.ui.displayitems.AudioStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.HeaderStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.ImageStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.LinkCardStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.ReblogOrReplyLineStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.StatusDisplayItem;
@@ -132,22 +130,7 @@ public class ReportAddPostsChoiceFragment extends StatusListFragment{
if(holder.getAbsoluteAdapterPosition()==0)
return;
outRect.left=V.dp(40);
if(holder instanceof ImageStatusDisplayItem.Holder<?> imgHolder){
PhotoLayoutHelper.TiledLayoutResult layout=imgHolder.getItem().tiledLayout;
PhotoLayoutHelper.TiledLayoutResult.Tile tile=imgHolder.getItem().thisTile;
String siblingID;
if(holder.getAbsoluteAdapterPosition()<parent.getAdapter().getItemCount()-1){
siblingID=displayItems.get(holder.getAbsoluteAdapterPosition()-getMainAdapterOffset()+1).parentID;
}else{
siblingID=null;
}
if(tile.startCol>0)
outRect.left=0;
outRect.left+=V.dp(16);
outRect.right=V.dp(16);
if(!imgHolder.getItemID().equals(siblingID) || tile.startRow+tile.rowSpan==layout.rowSizes.length)
outRect.bottom=V.dp(16);
}else if(holder instanceof AudioStatusDisplayItem.Holder){
if(holder instanceof AudioStatusDisplayItem.Holder){
outRect.bottom=V.dp(16);
}else if(holder instanceof LinkCardStatusDisplayItem.Holder){
outRect.bottom=V.dp(16);
@@ -166,10 +149,6 @@ public class ReportAddPostsChoiceFragment extends StatusListFragment{
parent.getDecoratedBoundsWithMargins(child, tmpRect);
String id=sdiHolder.getItemID();
int height=tmpRect.height();
if(holder instanceof ImageStatusDisplayItem.Holder<?> imgHolder){
if(imgHolder.getItem().thisTile.startCol+imgHolder.getItem().thisTile.colSpan<imgHolder.getItem().tiledLayout.columnSizes.length)
height=0;
}
if(!(holder instanceof HeaderStatusDisplayItem.Holder) && !(holder instanceof ReblogOrReplyLineStatusDisplayItem.Holder))
postsWithKnownNonHeaderHeights.add(id);
knownDisplayItemHeights.put(holder.getAbsoluteAdapterPosition(), height);
@@ -236,17 +215,6 @@ public class ReportAddPostsChoiceFragment extends StatusListFragment{
return adapter;
}
@Override
protected List<StatusDisplayItem> buildDisplayItems(Status s){
List<StatusDisplayItem> items=StatusDisplayItem.buildItems(this, s, accountID, s, knownAccounts, true, false, null);
for(StatusDisplayItem item:items){
if(item instanceof ImageStatusDisplayItem isdi){
isdi.horizontalInset=V.dp(40+32);
}
}
return items;
}
protected void drawDivider(View child, View bottomSibling, RecyclerView.ViewHolder holder, RecyclerView.ViewHolder siblingHolder, RecyclerView parent, Canvas c, Paint paint){
parent.getDecoratedBoundsWithMargins(child, tmpRect);
tmpRect.offset(0, Math.round(child.getTranslationY()));

View File

@@ -14,7 +14,7 @@ import java.util.List;
* Represents a user of Mastodon and their associated profile.
*/
@Parcel
public class Account extends BaseModel{
public class Account extends BaseModel implements Searchable{
// Base attributes
/**
@@ -43,7 +43,7 @@ public class Account extends BaseModel{
/**
* The profile's display name.
*/
@RequiredField
// @RequiredField
public String displayName;
/**
* The profile's bio / description.
@@ -86,7 +86,7 @@ public class Account extends BaseModel{
/**
* When the account was created.
*/
@RequiredField
// @RequiredField
public Instant createdAt;
/**
* When the most recent status was posted.
@@ -135,6 +135,11 @@ public class Account extends BaseModel{
public List<Role> roles;
@Override
public String getQuery() {
return url;
}
@Parcel
public static class Role {
public String name;

View File

@@ -121,7 +121,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

@@ -0,0 +1,9 @@
package org.joinmastodon.android.model;
public enum NotificationAction {
FAVORITE,
REBLOG,
UNDO_REBLOG,
BOOKMARK,
REPLY,
}

View File

@@ -16,12 +16,13 @@ public class Poll extends BaseModel{
private boolean expired;
public boolean multiple;
public int votersCount;
public int votesCount;
public boolean voted;
@RequiredField
// @RequiredField
public List<Integer> ownVotes;
@RequiredField
public List<Option> options;
@RequiredField
// @RequiredField
public List<Emoji> emojis;
public transient ArrayList<Option> selectedOptions;
@@ -29,6 +30,8 @@ public class Poll extends BaseModel{
@Override
public void postprocess() throws ObjectValidationException{
super.postprocess();
if (emojis == null) emojis = List.of();
if (ownVotes == null) ownVotes = List.of();
for(Emoji e:emojis)
e.postprocess();
}
@@ -41,10 +44,12 @@ public class Poll extends BaseModel{
", expired="+expired+
", multiple="+multiple+
", votersCount="+votersCount+
", votesCount="+votesCount+
", voted="+voted+
", ownVotes="+ownVotes+
", options="+options+
", emojis="+emojis+
", selectedOptions="+selectedOptions+
'}';
}

View File

@@ -0,0 +1,5 @@
package org.joinmastodon.android.model;
public interface Searchable {
String getQuery();
}

View File

@@ -1,5 +1,14 @@
package org.joinmastodon.android.model;
import static org.joinmastodon.android.api.MastodonAPIController.gson;
import static org.joinmastodon.android.api.MastodonAPIController.gsonWithoutDeserializer;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParseException;
import org.joinmastodon.android.GlobalUserPreferences;
import org.joinmastodon.android.api.ObjectValidationException;
import org.joinmastodon.android.api.RequiredField;
@@ -7,16 +16,17 @@ import org.joinmastodon.android.events.StatusCountersUpdatedEvent;
import org.joinmastodon.android.ui.text.HtmlParser;
import org.parceler.Parcel;
import java.lang.reflect.Type;
import java.time.Instant;
import java.util.List;
@Parcel
public class Status extends BaseModel implements DisplayItemsParent{
public class Status extends BaseModel implements DisplayItemsParent, Searchable{
@RequiredField
public String id;
@RequiredField
public String uri;
@RequiredField
// @RequiredField // sometimes null on calckey
public Instant createdAt;
@RequiredField
public Account account;
@@ -58,6 +68,8 @@ public class Status extends BaseModel implements DisplayItemsParent{
public boolean bookmarked;
public boolean pinned;
public Status quote; // can be boolean in calckey
public transient boolean filterRevealed;
public transient boolean spoilerRevealed;
public transient boolean textExpanded, textExpandable;
@@ -66,6 +78,9 @@ public class Status extends BaseModel implements DisplayItemsParent{
@Override
public void postprocess() throws ObjectValidationException{
if(spoilerText!=null && !spoilerText.isEmpty() && !sensitive)
sensitive=true;
super.postprocess();
if(application!=null)
application.postprocess();
@@ -163,4 +178,33 @@ public class Status extends BaseModel implements DisplayItemsParent{
s.filtered = List.of();
return s;
}
@Override
public String getQuery() {
return url;
}
public static class StatusDeserializer implements JsonDeserializer<Status> {
@Override
public Status deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
JsonObject obj = json.getAsJsonObject();
Status quote = null;
if (obj.has("quote") && obj.get("quote").isJsonObject())
quote = gson.fromJson(obj.get("quote"), Status.class);
obj.remove("quote");
Status reblog = null;
if (obj.has("reblog"))
reblog = gson.fromJson(obj.get("reblog"), Status.class);
obj.remove("reblog");
Status status = gsonWithoutDeserializer.fromJson(json, Status.class);
status.quote = quote;
status.reblog = reblog;
return status;
}
}
}

View File

@@ -11,8 +11,14 @@ import java.util.List;
import androidx.annotation.NonNull;
public class PhotoLayoutHelper{
public static final int MAX_WIDTH=1000;
public static final int MAX_HEIGHT=1910;
@NonNull
public static TiledLayoutResult processThumbs(int _maxW, int _maxH, List<Attachment> thumbs){
public static TiledLayoutResult processThumbs(List<Attachment> thumbs){
int _maxW=MAX_WIDTH;
int _maxH=MAX_HEIGHT;
TiledLayoutResult result=new TiledLayoutResult();
if(thumbs.size()==1){
Attachment att=thumbs.get(0);
@@ -45,13 +51,8 @@ public class PhotoLayoutHelper{
float avgRatio=!ratios.isEmpty() ? sum(ratios)/ratios.size() : 1.0f;
float maxW, maxH, marginW=0, marginH=0;
if(_maxW>0){
maxW=_maxW;
maxH=_maxH;
}else{
maxW=510;
maxH=510;
}
maxW=_maxW;
maxH=_maxH;
float maxRatio=maxW/maxH;

View File

@@ -79,10 +79,10 @@ public class ExtendedFooterStatusDisplayItem extends StatusDisplayItem{
}else{
editHistory.setVisibility(View.GONE);
}
String timeStr=TIME_FORMATTER.format(item.status.createdAt.atZone(ZoneId.systemDefault()));
String timeStr=item.status.createdAt != null ? TIME_FORMATTER.format(item.status.createdAt.atZone(ZoneId.systemDefault())) : null;
if (item.status.application!=null && !TextUtils.isEmpty(item.status.application.name)) {
time.setText(item.parentFragment.getString(R.string.timestamp_via_app, timeStr, ""));
time.setText(timeStr != null ? item.parentFragment.getString(R.string.timestamp_via_app, timeStr, "") : "");
applicationName.setText(item.status.application.name);
if (item.status.application.website != null && item.status.application.website.toLowerCase().startsWith("https://")) {
applicationName.setOnClickListener(e -> UiUtils.openURL(context, null, item.status.application.website));

View File

@@ -26,6 +26,7 @@ import org.joinmastodon.android.api.session.AccountSession;
import org.joinmastodon.android.api.session.AccountSessionManager;
import org.joinmastodon.android.fragments.BaseStatusListFragment;
import org.joinmastodon.android.fragments.ComposeFragment;
import org.joinmastodon.android.model.Instance;
import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.model.StatusPrivacy;
import org.joinmastodon.android.ui.M3AlertDialogBuilder;
@@ -190,6 +191,7 @@ public class FooterStatusDisplayItem extends StatusDisplayItem{
String accountID = session.getID();
args.putString("account", accountID);
UiUtils.lookupStatus(v.getContext(), item.status, accountID, item.accountID, status -> {
if (status == null) return;
args.putParcelable("replyTo", Parcels.wrap(status));
Nav.go(item.parentFragment.getActivity(), ComposeFragment.class, args);
});
@@ -280,12 +282,18 @@ public class FooterStatusDisplayItem extends StatusDisplayItem{
v.startAnimation(opacityIn);
Bundle args=new Bundle();
args.putString("account", item.accountID);
StringBuilder prefilledText = new StringBuilder().append("\n\n");
String ownID = AccountSessionManager.getInstance().getAccount(item.accountID).self.id;
if (!item.status.account.id.equals(ownID)) prefilledText.append('@').append(item.status.account.acct).append(' ');
prefilledText.append(item.status.url);
args.putString("prefilledText", prefilledText.toString());
args.putInt("selectionStart", 0);
AccountSession accountSession=AccountSessionManager.getInstance().getAccount(item.accountID);
Instance instance=AccountSessionManager.getInstance().getInstanceInfo(accountSession.domain);
if(instance.pleroma == null){
StringBuilder prefilledText = new StringBuilder().append("\n\n");
String ownID = AccountSessionManager.getInstance().getAccount(item.accountID).self.id;
if (!item.status.account.id.equals(ownID)) prefilledText.append('@').append(item.status.account.acct).append(' ');
prefilledText.append(item.status.url);
args.putString("prefilledText", prefilledText.toString());
args.putInt("selectionStart", 0);
}else{
args.putParcelable("quote", Parcels.wrap(item.status));
}
Nav.go(item.parentFragment.getActivity(), ComposeFragment.class, args);
});

View File

@@ -1,42 +0,0 @@
package org.joinmastodon.android.ui.displayitems;
import android.app.Activity;
import android.graphics.Outline;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewOutlineProvider;
import org.joinmastodon.android.R;
import org.joinmastodon.android.fragments.BaseStatusListFragment;
import org.joinmastodon.android.model.Attachment;
import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.ui.PhotoLayoutHelper;
import me.grishka.appkit.imageloader.requests.UrlImageLoaderRequest;
public class GifVStatusDisplayItem extends ImageStatusDisplayItem{
public GifVStatusDisplayItem(String parentID, Status status, Attachment attachment, BaseStatusListFragment parentFragment, int index, int totalPhotos, PhotoLayoutHelper.TiledLayoutResult tiledLayout, PhotoLayoutHelper.TiledLayoutResult.Tile thisTile){
super(parentID, parentFragment, attachment, status, index, totalPhotos, tiledLayout, thisTile);
request=new UrlImageLoaderRequest(attachment.previewUrl, 1000, 1000);
}
@Override
public Type getType(){
return Type.GIFV;
}
public static class Holder extends ImageStatusDisplayItem.Holder<GifVStatusDisplayItem>{
public Holder(Activity activity, ViewGroup parent){
super(activity, R.layout.display_item_gifv, parent);
View play=findViewById(R.id.play_button);
play.setOutlineProvider(new ViewOutlineProvider(){
@Override
public void getOutline(View view, Outline outline){
outline.setOval(0, 0, view.getWidth(), view.getHeight());
outline.setAlpha(.99f); // fixes shadow rendering
}
});
}
}
}

View File

@@ -455,7 +455,9 @@ public class HeaderStatusDisplayItem extends StatusDisplayItem{
if (hasMultipleAccounts && accountsMenu != null) {
openWithAccounts.setVisible(true);
accountsMenu.clear();
populateAccountsMenu(accountsMenu);
UiUtils.populateAccountsMenu(item.accountID, accountsMenu, s-> UiUtils.openURL(
item.parentFragment.getActivity(), s.getID(), item.status.url, false
));
} else if (openWithAccounts != null) {
openWithAccounts.setVisible(false);
}

View File

@@ -1,244 +0,0 @@
package org.joinmastodon.android.ui.displayitems;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import org.joinmastodon.android.GlobalUserPreferences;
import org.joinmastodon.android.R;
import org.joinmastodon.android.fragments.BaseStatusListFragment;
import org.joinmastodon.android.model.Attachment;
import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.ui.PhotoLayoutHelper;
import org.joinmastodon.android.ui.drawables.BlurhashCrossfadeDrawable;
import org.joinmastodon.android.ui.photoviewer.PhotoViewerHost;
import org.joinmastodon.android.ui.views.ImageAttachmentFrameLayout;
import androidx.annotation.LayoutRes;
import me.grishka.appkit.imageloader.ImageLoaderViewHolder;
import me.grishka.appkit.imageloader.requests.ImageLoaderRequest;
import me.grishka.appkit.utils.CubicBezierInterpolator;
public abstract class ImageStatusDisplayItem extends StatusDisplayItem{
public final int index;
public final int totalPhotos;
protected Attachment attachment;
protected ImageLoaderRequest request;
public final Status status;
public final PhotoLayoutHelper.TiledLayoutResult tiledLayout;
public final PhotoLayoutHelper.TiledLayoutResult.Tile thisTile;
public int horizontalInset;
public ImageStatusDisplayItem(String parentID, BaseStatusListFragment parentFragment, Attachment photo, Status status, int index, int totalPhotos, PhotoLayoutHelper.TiledLayoutResult tiledLayout, PhotoLayoutHelper.TiledLayoutResult.Tile thisTile){
super(parentID, parentFragment);
this.attachment=photo;
this.status=status;
this.index=index;
this.totalPhotos=totalPhotos;
this.tiledLayout=tiledLayout;
this.thisTile=thisTile;
}
@Override
public int getImageCount(){
return 1;
}
@Override
public ImageLoaderRequest getImageRequest(int index){
return request;
}
public static abstract class Holder<T extends ImageStatusDisplayItem> extends StatusDisplayItem.Holder<T> implements ImageLoaderViewHolder{
public final ImageView photo;
private ImageAttachmentFrameLayout layout;
private BlurhashCrossfadeDrawable crossfadeDrawable=new BlurhashCrossfadeDrawable();
private boolean didClear;
private AnimatorSet currentAnim;
private final FrameLayout altTextWrapper;
private final TextView altTextButton;
private final ImageView noAltTextButton;
private final View altTextScroller;
private final ImageButton altTextClose;
private final TextView altText, noAltText;
private View altOrNoAltButton;
private boolean altTextShown;
public Holder(Activity activity, @LayoutRes int layout, ViewGroup parent){
super(activity, layout, parent);
photo=findViewById(R.id.photo);
photo.setOnClickListener(this::onViewClick);
this.layout=(ImageAttachmentFrameLayout)itemView;
altTextWrapper=findViewById(R.id.alt_text_wrapper);
altTextButton=findViewById(R.id.alt_button);
noAltTextButton=findViewById(R.id.no_alt_button);
altTextScroller=findViewById(R.id.alt_text_scroller);
altTextClose=findViewById(R.id.alt_text_close);
altText=findViewById(R.id.alt_text);
noAltText=findViewById(R.id.no_alt_text);
altTextButton.setOnClickListener(this::onShowHideClick);
noAltTextButton.setOnClickListener(this::onShowHideClick);
altTextClose.setOnClickListener(this::onShowHideClick);
// altTextScroller.setNestedScrollingEnabled(true);
}
@Override
public void onBind(ImageStatusDisplayItem item){
layout.setLayout(item.tiledLayout, item.thisTile, item.horizontalInset);
crossfadeDrawable.setSize(item.attachment.getWidth(), item.attachment.getHeight());
crossfadeDrawable.setBlurhashDrawable(item.attachment.blurhashPlaceholder);
crossfadeDrawable.setCrossfadeAlpha(item.status.spoilerRevealed ? 0f : 1f);
photo.setImageDrawable(null);
photo.setImageDrawable(crossfadeDrawable);
photo.setContentDescription(TextUtils.isEmpty(item.attachment.description) ? item.parentFragment.getString(R.string.media_no_description) : item.attachment.description);
didClear=false;
if (currentAnim != null) currentAnim.cancel();
boolean altTextMissing = TextUtils.isEmpty(item.attachment.description);
altOrNoAltButton = altTextMissing ? noAltTextButton : altTextButton;
altTextShown=false;
altTextScroller.setVisibility(View.GONE);
altTextClose.setVisibility(View.GONE);
altTextButton.setVisibility(View.VISIBLE);
noAltTextButton.setVisibility(View.VISIBLE);
altTextButton.setAlpha(1f);
noAltTextButton.setAlpha(1f);
altTextWrapper.setVisibility(View.VISIBLE);
if (altTextMissing){
if (GlobalUserPreferences.showNoAltIndicator) {
noAltTextButton.setVisibility(View.VISIBLE);
noAltText.setVisibility(View.VISIBLE);
altTextWrapper.setBackgroundResource(R.drawable.bg_image_no_alt_overlay);
altTextButton.setVisibility(View.GONE);
altText.setVisibility(View.GONE);
} else {
altTextWrapper.setVisibility(View.GONE);
}
}else{
if (GlobalUserPreferences.showAltIndicator) {
noAltTextButton.setVisibility(View.GONE);
noAltText.setVisibility(View.GONE);
altTextWrapper.setBackgroundResource(R.drawable.bg_image_alt_overlay);
altTextButton.setVisibility(View.VISIBLE);
altTextButton.setText(R.string.sk_alt_button);
altText.setVisibility(View.VISIBLE);
altText.setText(item.attachment.description);
altText.setPadding(0, 0, 0, 0);
} else {
altTextWrapper.setVisibility(View.GONE);
}
}
}
private void onShowHideClick(View v){
boolean show=v.getId()==R.id.alt_button || v.getId()==R.id.no_alt_button;
if(altTextShown==show)
return;
if(currentAnim!=null)
currentAnim.cancel();
altTextShown=show;
if(show){
altTextScroller.setVisibility(View.VISIBLE);
altTextClose.setVisibility(View.VISIBLE);
}else{
altOrNoAltButton.setVisibility(View.VISIBLE);
// Hide these views temporarily so FrameLayout measures correctly
altTextScroller.setVisibility(View.GONE);
altTextClose.setVisibility(View.GONE);
}
// This is the current size...
int prevLeft=altTextWrapper.getLeft();
int prevRight=altTextWrapper.getRight();
int prevTop=altTextWrapper.getTop();
altTextWrapper.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener(){
@Override
public boolean onPreDraw(){
altTextWrapper.getViewTreeObserver().removeOnPreDrawListener(this);
// ...and this is after the layout pass, right now the FrameLayout has its final size, but we animate that change
if(!show){
// Show these views again so they're visible for the duration of the animation.
// No one would notice they were missing during measure/layout.
altTextScroller.setVisibility(View.VISIBLE);
altTextClose.setVisibility(View.VISIBLE);
}
AnimatorSet set=new AnimatorSet();
set.playTogether(
ObjectAnimator.ofInt(altTextWrapper, "left", prevLeft, altTextWrapper.getLeft()),
ObjectAnimator.ofInt(altTextWrapper, "right", prevRight, altTextWrapper.getRight()),
ObjectAnimator.ofInt(altTextWrapper, "top", prevTop, altTextWrapper.getTop()),
ObjectAnimator.ofFloat(altOrNoAltButton, View.ALPHA, show ? 1f : 0f, show ? 0f : 1f),
ObjectAnimator.ofFloat(altTextScroller, View.ALPHA, show ? 0f : 1f, show ? 1f : 0f),
ObjectAnimator.ofFloat(altTextClose, View.ALPHA, show ? 0f : 1f, show ? 1f : 0f)
);
set.setDuration(300);
set.setInterpolator(CubicBezierInterpolator.DEFAULT);
set.addListener(new AnimatorListenerAdapter(){
@Override
public void onAnimationEnd(Animator animation){
if(show){
altOrNoAltButton.setVisibility(View.GONE);
}else{
altTextScroller.setVisibility(View.GONE);
altTextClose.setVisibility(View.GONE);
}
currentAnim=null;
}
});
set.start();
currentAnim=set;
return true;
}
});
}
@Override
public void setImage(int index, Drawable drawable){
crossfadeDrawable.setImageDrawable(drawable);
if(didClear && item.status.spoilerRevealed)
crossfadeDrawable.animateAlpha(0f);
}
@Override
public void clearImage(int index){
crossfadeDrawable.setCrossfadeAlpha(1f);
crossfadeDrawable.setImageDrawable(null);
didClear=true;
}
private void onViewClick(View v){
if(!item.status.spoilerRevealed){
item.parentFragment.onRevealSpoilerClick(this);
}else if(item.parentFragment instanceof PhotoViewerHost){
Status contentStatus=item.status.reblog!=null ? item.status.reblog : item.status;
((PhotoViewerHost) item.parentFragment).openPhotoViewer(item.parentID, item.status, contentStatus.mediaAttachments.indexOf(item.attachment));
}
}
public void setRevealed(boolean revealed){
crossfadeDrawable.animateAlpha(revealed ? 0f : 1f);
}
}
}

View File

@@ -0,0 +1,311 @@
package org.joinmastodon.android.ui.displayitems;
import static org.joinmastodon.android.ui.utils.MediaAttachmentViewController.altWrapPadding;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import org.joinmastodon.android.GlobalUserPreferences;
import org.joinmastodon.android.R;
import org.joinmastodon.android.fragments.BaseStatusListFragment;
import org.joinmastodon.android.model.Attachment;
import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.ui.PhotoLayoutHelper;
import org.joinmastodon.android.ui.photoviewer.PhotoViewerHost;
import org.joinmastodon.android.ui.utils.MediaAttachmentViewController;
import org.joinmastodon.android.ui.views.FrameLayoutThatOnlyMeasuresFirstChild;
import org.joinmastodon.android.ui.views.MediaGridLayout;
import org.joinmastodon.android.utils.TypedObjectPool;
import java.util.ArrayList;
import java.util.List;
import me.grishka.appkit.imageloader.ImageLoaderViewHolder;
import me.grishka.appkit.imageloader.requests.ImageLoaderRequest;
import me.grishka.appkit.imageloader.requests.UrlImageLoaderRequest;
import me.grishka.appkit.utils.CubicBezierInterpolator;
public class MediaGridStatusDisplayItem extends StatusDisplayItem{
private static final String TAG="MediaGridDisplayItem";
private final PhotoLayoutHelper.TiledLayoutResult tiledLayout;
private final TypedObjectPool<GridItemType, MediaAttachmentViewController> viewPool;
private final List<Attachment> attachments;
private final ArrayList<ImageLoaderRequest> requests=new ArrayList<>();
public final Status status;
public MediaGridStatusDisplayItem(String parentID, BaseStatusListFragment<?> parentFragment, PhotoLayoutHelper.TiledLayoutResult tiledLayout, List<Attachment> attachments, Status status){
super(parentID, parentFragment);
this.tiledLayout=tiledLayout;
this.viewPool=parentFragment.getAttachmentViewsPool();
this.attachments=attachments;
this.status=status;
for(Attachment att:attachments){
requests.add(new UrlImageLoaderRequest(switch(att.type){
case IMAGE -> att.url;
case VIDEO, GIFV -> att.previewUrl;
default -> throw new IllegalStateException("Unexpected value: "+att.type);
}, 1000, 1000));
}
}
@Override
public Type getType(){
return Type.MEDIA_GRID;
}
@Override
public int getImageCount(){
return requests.size();
}
@Override
public ImageLoaderRequest getImageRequest(int index){
return requests.get(index);
}
public enum GridItemType{
PHOTO,
VIDEO,
GIFV
}
public static class Holder extends StatusDisplayItem.Holder<MediaGridStatusDisplayItem> implements ImageLoaderViewHolder{
private final FrameLayout wrapper;
private final MediaGridLayout layout;
private final View.OnClickListener clickListener=this::onViewClick, altTextClickListener=this::onAltTextClick;
private final ArrayList<MediaAttachmentViewController> controllers=new ArrayList<>();
private final FrameLayout altTextWrapper;
private final TextView altTextButton;
private final ImageView noAltTextButton;
private final View altTextScroller;
private final ImageButton altTextClose;
private final TextView altText, noAltText;
private int altTextIndex=-1;
private Animator altTextAnimator;
public Holder(Activity activity, ViewGroup parent){
super(new FrameLayoutThatOnlyMeasuresFirstChild(activity));
wrapper=(FrameLayout)itemView;
layout=new MediaGridLayout(activity);
wrapper.addView(layout);
activity.getLayoutInflater().inflate(R.layout.overlay_image_alt_text, wrapper);
altTextWrapper=findViewById(R.id.alt_text_wrapper);
altTextButton=findViewById(R.id.alt_button);
noAltTextButton=findViewById(R.id.no_alt_button);
altTextScroller=findViewById(R.id.alt_text_scroller);
altTextClose=findViewById(R.id.alt_text_close);
altText=findViewById(R.id.alt_text);
noAltText=findViewById(R.id.no_alt_text);
altTextClose.setOnClickListener(this::onAltTextCloseClick);
}
@Override
public void onBind(MediaGridStatusDisplayItem item){
if(altTextAnimator!=null)
altTextAnimator.cancel();
layout.setTiledLayout(item.tiledLayout);
for(MediaAttachmentViewController c:controllers){
item.viewPool.reuse(c.type, c);
}
layout.removeAllViews();
controllers.clear();
int i=0;
for(Attachment att:item.attachments){
MediaAttachmentViewController c=item.viewPool.obtain(switch(att.type){
case IMAGE -> GridItemType.PHOTO;
case VIDEO -> GridItemType.VIDEO;
case GIFV -> GridItemType.GIFV;
default -> throw new IllegalStateException("Unexpected value: "+att.type);
});
if(c.view.getLayoutParams()==null)
c.view.setLayoutParams(new MediaGridLayout.LayoutParams(item.tiledLayout.tiles[i]));
else
((MediaGridLayout.LayoutParams) c.view.getLayoutParams()).tile=item.tiledLayout.tiles[i];
layout.addView(c.view);
c.view.setOnClickListener(clickListener);
c.view.setTag(i);
if(c.btnsWrap!=null){
c.btnsWrap.setOnClickListener(altTextClickListener);
c.btnsWrap.setTag(i);
c.btnsWrap.setAlpha(1f);
}
controllers.add(c);
c.bind(att, item.status);
i++;
}
altTextButton.setVisibility(View.VISIBLE);
noAltTextButton.setVisibility(View.VISIBLE);
altTextWrapper.setVisibility(View.GONE);
altTextIndex=-1;
}
@Override
public void setImage(int index, Drawable drawable){
controllers.get(index).setImage(drawable);
}
@Override
public void clearImage(int index){
controllers.get(index).clearImage();
}
private void onViewClick(View v){
int index=(Integer)v.getTag();
if(!item.status.spoilerRevealed){
item.parentFragment.onRevealSpoilerClick(this);
}else if(item.parentFragment instanceof PhotoViewerHost){
((PhotoViewerHost) item.parentFragment).openPhotoViewer(item.parentID, item.status, index, this);
}
}
private void onAltTextClick(View v){
if(altTextAnimator!=null)
altTextAnimator.cancel();
v.setVisibility(View.INVISIBLE);
int index=(Integer)v.getTag();
altTextIndex=index;
Attachment att=item.attachments.get(index);
boolean hasAltText = !TextUtils.isEmpty(att.description);
altTextButton.setVisibility(hasAltText && GlobalUserPreferences.showAltIndicator ? View.VISIBLE : View.GONE);
noAltTextButton.setVisibility(!hasAltText && GlobalUserPreferences.showNoAltIndicator ? View.VISIBLE : View.GONE);
altText.setVisibility(hasAltText && GlobalUserPreferences.showAltIndicator ? View.VISIBLE : View.GONE);
noAltText.setVisibility(!hasAltText && GlobalUserPreferences.showNoAltIndicator ? View.VISIBLE : View.GONE);
altText.setText(att.description);
altTextWrapper.setVisibility(View.VISIBLE);
altTextWrapper.setBackgroundResource(hasAltText ? R.drawable.bg_image_alt_overlay : R.drawable.bg_image_no_alt_overlay);
altTextWrapper.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener(){
@Override
public boolean onPreDraw(){
altTextWrapper.getViewTreeObserver().removeOnPreDrawListener(this);
int[] loc={0, 0};
v.getLocationInWindow(loc);
int btnL=loc[0], btnT=loc[1];
wrapper.getLocationInWindow(loc);
btnL-=loc[0];
btnT-=loc[1];
ArrayList<Animator> anims=new ArrayList<>();
anims.add(ObjectAnimator.ofFloat(altTextButton, View.ALPHA, 1, 0));
anims.add(ObjectAnimator.ofFloat(noAltTextButton, View.ALPHA, 1, 0));
anims.add(ObjectAnimator.ofFloat(altTextScroller, View.ALPHA, 0, 1));
anims.add(ObjectAnimator.ofFloat(altTextClose, View.ALPHA, 0, 1));
anims.add(ObjectAnimator.ofInt(altTextWrapper, "left", btnL+altWrapPadding[0], altTextWrapper.getLeft()));
anims.add(ObjectAnimator.ofInt(altTextWrapper, "top", btnT+altWrapPadding[1], altTextWrapper.getTop()));
anims.add(ObjectAnimator.ofInt(altTextWrapper, "right", btnL+v.getWidth()-altWrapPadding[2], altTextWrapper.getRight()));
anims.add(ObjectAnimator.ofInt(altTextWrapper, "bottom", btnT+v.getHeight()-altWrapPadding[3], altTextWrapper.getBottom()));
for(Animator a:anims)
a.setDuration(300);
for(MediaAttachmentViewController c:controllers){
if(c.btnsWrap!=null && c.btnsWrap!=v){
anims.add(ObjectAnimator.ofFloat(c.btnsWrap, View.ALPHA, 1, 0).setDuration(150));
}
}
AnimatorSet set=new AnimatorSet();
set.playTogether(anims);
set.setInterpolator(CubicBezierInterpolator.DEFAULT);
set.addListener(new AnimatorListenerAdapter(){
@Override
public void onAnimationEnd(Animator animation){
altTextAnimator=null;
for(MediaAttachmentViewController c:controllers){
if(c.btnsWrap!=null){
c.btnsWrap.setVisibility(View.INVISIBLE);
}
}
}
});
altTextAnimator=set;
set.start();
return true;
}
});
}
private void onAltTextCloseClick(View v){
if(altTextAnimator!=null)
altTextAnimator.cancel();
View btn=controllers.get(altTextIndex).btnsWrap;
for(MediaAttachmentViewController c:controllers){
if(c.btnsWrap!=null && c.btnsWrap!=btn) {
c.btnsWrap.setVisibility(View.VISIBLE);
}
}
int[] loc={0, 0};
btn.getLocationInWindow(loc);
int btnL=loc[0], btnT=loc[1];
wrapper.getLocationInWindow(loc);
btnL-=loc[0];
btnT-=loc[1];
ArrayList<Animator> anims=new ArrayList<>();
anims.add(ObjectAnimator.ofFloat(altTextButton, View.ALPHA, 1));
anims.add(ObjectAnimator.ofFloat(noAltTextButton, View.ALPHA, 1));
anims.add(ObjectAnimator.ofFloat(altTextScroller, View.ALPHA, 0));
anims.add(ObjectAnimator.ofFloat(altTextClose, View.ALPHA, 0));
anims.add(ObjectAnimator.ofInt(altTextWrapper, "left", btnL+altWrapPadding[0]));
anims.add(ObjectAnimator.ofInt(altTextWrapper, "top", btnT+altWrapPadding[1]));
anims.add(ObjectAnimator.ofInt(altTextWrapper, "right", btnL+btn.getWidth()-altWrapPadding[2]));
anims.add(ObjectAnimator.ofInt(altTextWrapper, "bottom", btnT+btn.getHeight()-altWrapPadding[3]));
for(Animator a:anims)
a.setDuration(300);
for(MediaAttachmentViewController c:controllers){
// if(c.btnsWrap!=null && c.btnsWrap!=btn){
anims.add(ObjectAnimator.ofFloat(c.btnsWrap, View.ALPHA, 1).setDuration(150));
// }
}
AnimatorSet set=new AnimatorSet();
set.playTogether(anims);
set.setInterpolator(CubicBezierInterpolator.DEFAULT);
set.addListener(new AnimatorListenerAdapter(){
@Override
public void onAnimationEnd(Animator animation){
altTextAnimator=null;
altTextWrapper.setVisibility(View.GONE);
btn.setVisibility(View.VISIBLE);
}
});
altTextAnimator=set;
set.start();
}
public void setRevealed(boolean revealed){
for(MediaAttachmentViewController c:controllers){
c.setRevealed(revealed);
}
}
public MediaAttachmentViewController getViewController(int index){
return controllers.get(index);
}
public void setClipChildren(boolean clip){
layout.setClipChildren(clip);
wrapper.setClipChildren(clip);
}
}
}

View File

@@ -1,45 +0,0 @@
package org.joinmastodon.android.ui.displayitems;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.app.Activity;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.ScrollView;
import android.widget.TextView;
import org.joinmastodon.android.GlobalUserPreferences;
import org.joinmastodon.android.R;
import org.joinmastodon.android.fragments.BaseStatusListFragment;
import org.joinmastodon.android.model.Attachment;
import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.ui.PhotoLayoutHelper;
import me.grishka.appkit.imageloader.requests.UrlImageLoaderRequest;
import me.grishka.appkit.utils.CubicBezierInterpolator;
import me.grishka.appkit.utils.V;
public class PhotoStatusDisplayItem extends ImageStatusDisplayItem{
public PhotoStatusDisplayItem(String parentID, Status status, Attachment photo, BaseStatusListFragment parentFragment, int index, int totalPhotos, PhotoLayoutHelper.TiledLayoutResult tiledLayout, PhotoLayoutHelper.TiledLayoutResult.Tile thisTile){
super(parentID, parentFragment, photo, status, index, totalPhotos, tiledLayout, thisTile);
request=new UrlImageLoaderRequest(photo.url, 1000, 1000);
}
@Override
public Type getType(){
return Type.PHOTO;
}
public static class Holder extends ImageStatusDisplayItem.Holder<PhotoStatusDisplayItem> {
public Holder(Activity activity, ViewGroup parent) {
super(activity, R.layout.display_item_photo, parent);
}
}
}

View File

@@ -35,8 +35,9 @@ public class PollOptionStatusDisplayItem extends StatusDisplayItem{
text=HtmlParser.parseCustomEmoji(option.title, poll.emojis);
emojiHelper.setText(text);
showResults=poll.isExpired() || poll.voted;
if(showResults && option.votesCount!=null && poll.votersCount>0){
votesFraction=(float)option.votesCount/(float)poll.votersCount;
int total=poll.votersCount>0 ? poll.votersCount : poll.votesCount;
if(showResults && option.votesCount!=null && total>0){
votesFraction=(float)option.votesCount/(float)total;
int mostVotedCount=0;
for(Poll.Option opt:poll.options)
mostVotedCount=Math.max(mostVotedCount, opt.votesCount);

View File

@@ -10,8 +10,10 @@ import android.text.SpannableStringBuilder;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import org.joinmastodon.android.GlobalUserPreferences;
import org.joinmastodon.android.R;
import org.joinmastodon.android.fragments.BaseStatusListFragment;
import org.joinmastodon.android.model.Emoji;
@@ -27,9 +29,10 @@ import androidx.annotation.Nullable;
import me.grishka.appkit.imageloader.ImageLoaderViewHolder;
import me.grishka.appkit.imageloader.requests.ImageLoaderRequest;
import me.grishka.appkit.utils.V;
public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{
private CharSequence text;
private CharSequence text, compactText;
@DrawableRes
private int icon;
private StatusPrivacy visibility;
@@ -37,8 +40,15 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{
private int iconEnd;
private CustomEmojiHelper emojiHelper=new CustomEmojiHelper();
private View.OnClickListener handleClick;
boolean belowHeader, needBottomPadding;
ReblogOrReplyLineStatusDisplayItem extra;
String contentDescription;
public ReblogOrReplyLineStatusDisplayItem(String parentID, BaseStatusListFragment parentFragment, CharSequence text, List<Emoji> emojis, @DrawableRes int icon, StatusPrivacy visibility, @Nullable View.OnClickListener handleClick){
public ReblogOrReplyLineStatusDisplayItem(String parentID, BaseStatusListFragment parentFragment, CharSequence text, List<Emoji> emojis, @DrawableRes int icon, StatusPrivacy visibility, @Nullable View.OnClickListener handleClick) {
this(parentID, parentFragment, text, emojis, icon, visibility, handleClick, null);
}
public ReblogOrReplyLineStatusDisplayItem(String parentID, BaseStatusListFragment parentFragment, CharSequence text, List<Emoji> emojis, @DrawableRes int icon, StatusPrivacy visibility, @Nullable View.OnClickListener handleClick, String contentDescription) {
super(parentID, parentFragment);
SpannableStringBuilder ssb=new SpannableStringBuilder(text);
HtmlParser.parseCustomEmoji(ssb, emojis);
@@ -49,6 +59,7 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{
TypedValue outValue = new TypedValue();
context.getTheme().resolveAttribute(android.R.attr.selectableItemBackground, outValue, true);
updateVisibility(visibility);
this.contentDescription = contentDescription;
}
public void updateVisibility(StatusPrivacy visibility) {
@@ -77,29 +88,64 @@ public class ReblogOrReplyLineStatusDisplayItem extends StatusDisplayItem{
}
public static class Holder extends StatusDisplayItem.Holder<ReblogOrReplyLineStatusDisplayItem> implements ImageLoaderViewHolder{
private final TextView text;
private final TextView text, extraText;
private final View separator;
private int currentOrientation = -1;
public Holder(Activity activity, ViewGroup parent){
super(activity, R.layout.display_item_reblog_or_reply_line, parent);
text=findViewById(R.id.text);
extraText=findViewById(R.id.extra_text);
separator=findViewById(R.id.separator);
if (GlobalUserPreferences.replyLineAboveHeader && GlobalUserPreferences.compactReblogReplyLine) {
itemView.getViewTreeObserver().addOnPreDrawListener(() -> {
if (item == null) return true;
int orientation = ((LinearLayout) itemView).getOrientation();
if (orientation == currentOrientation) return true; // only run once
currentOrientation = orientation;
extraText.setPaddingRelative(extraText.getPaddingStart(), item.extra != null && orientation == LinearLayout.VERTICAL ? 0 : V.dp(16), extraText.getPaddingEnd(), extraText.getPaddingBottom());
separator.setVisibility(item.extra != null && orientation == LinearLayout.HORIZONTAL ? View.VISIBLE : View.GONE);
((LinearLayout) itemView).removeView(extraText);
if (orientation == LinearLayout.VERTICAL) ((LinearLayout) itemView).addView(extraText);
else ((LinearLayout) itemView).addView(extraText, 0);
return true;
});
}
}
@Override
public void onBind(ReblogOrReplyLineStatusDisplayItem item){
private void bindLine(ReblogOrReplyLineStatusDisplayItem item, TextView text) {
if (item.contentDescription != null) text.setContentDescription(item.contentDescription);
text.setText(item.text);
text.setCompoundDrawablesRelativeWithIntrinsicBounds(item.icon, 0, item.iconEnd, 0);
if(item.handleClick!=null) text.setOnClickListener(item.handleClick);
text.setEnabled(!item.inset);
text.setClickable(!item.inset);
text.setOnClickListener(item.handleClick);
text.setEnabled(!item.inset && item.handleClick != null);
text.setClickable(!item.inset && item.handleClick != null);
Context ctx = itemView.getContext();
int visibilityText = item.visibility != null ? switch (item.visibility) {
case PUBLIC -> R.string.visibility_public;
case UNLISTED -> R.string.sk_visibility_unlisted;
case PRIVATE -> R.string.visibility_followers_only;
case LOCAL -> R.string.sk_local_only;
default -> 0;
} : 0;
if (visibilityText != 0) text.setContentDescription(item.text + " (" + ctx.getString(visibilityText) + ")");
if(Build.VERSION.SDK_INT<Build.VERSION_CODES.N)
UiUtils.fixCompoundDrawableTintOnAndroid6(text);
text.setTextAppearance(item.belowHeader ? R.style.m3_label_large : R.style.m3_title_small);
text.setCompoundDrawableTintList(text.getTextColors());
}
@Override
public void onBind(ReblogOrReplyLineStatusDisplayItem item){
bindLine(item, text);
if (item.extra != null) bindLine(item.extra, extraText);
extraText.setVisibility(item.extra == null ? View.GONE : View.VISIBLE);
separator.setVisibility(item.extra == null ? View.GONE : View.VISIBLE);
ViewGroup.MarginLayoutParams params = new ViewGroup.MarginLayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
params.bottomMargin = item.belowHeader ? V.dp(-6) : V.dp(-12);
params.topMargin = item.belowHeader ? V.dp(-6) : 0;
itemView.setLayoutParams(params);
itemView.setPadding(itemView.getPaddingLeft(), itemView.getPaddingTop(), itemView.getPaddingRight(), item.needBottomPadding ? V.dp(16) : 0);
}
@Override

View File

@@ -7,12 +7,12 @@ import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import org.joinmastodon.android.GlobalUserPreferences;
import org.joinmastodon.android.R;
import org.joinmastodon.android.api.session.AccountSessionManager;
import org.joinmastodon.android.fragments.BaseStatusListFragment;
import org.joinmastodon.android.fragments.HashtagTimelineFragment;
import org.joinmastodon.android.fragments.HomeTabFragment;
import org.joinmastodon.android.fragments.HomeTimelineFragment;
import org.joinmastodon.android.fragments.ListTimelineFragment;
import org.joinmastodon.android.fragments.ProfileFragment;
import org.joinmastodon.android.fragments.ThreadFragment;
@@ -20,7 +20,6 @@ import org.joinmastodon.android.model.Account;
import org.joinmastodon.android.model.Attachment;
import org.joinmastodon.android.model.DisplayItemsParent;
import org.joinmastodon.android.model.Filter;
import org.joinmastodon.android.model.Hashtag;
import org.joinmastodon.android.model.Notification;
import org.joinmastodon.android.model.Poll;
import org.joinmastodon.android.model.ScheduledStatus;
@@ -33,7 +32,6 @@ import org.parceler.Parcels;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
@@ -68,10 +66,7 @@ public abstract class StatusDisplayItem{
case HEADER -> new HeaderStatusDisplayItem.Holder(activity, parent);
case REBLOG_OR_REPLY_LINE -> new ReblogOrReplyLineStatusDisplayItem.Holder(activity, parent);
case TEXT -> new TextStatusDisplayItem.Holder(activity, parent);
case PHOTO -> new PhotoStatusDisplayItem.Holder(activity, parent);
case GIFV -> new GifVStatusDisplayItem.Holder(activity, parent);
case AUDIO -> new AudioStatusDisplayItem.Holder(activity, parent);
case VIDEO -> new VideoStatusDisplayItem.Holder(activity, parent);
case POLL_OPTION -> new PollOptionStatusDisplayItem.Holder(activity, parent);
case POLL_FOOTER -> new PollFooterStatusDisplayItem.Holder(activity, parent);
case CARD -> new LinkCardStatusDisplayItem.Holder(activity, parent);
@@ -81,6 +76,7 @@ public abstract class StatusDisplayItem{
case HASHTAG -> new HashtagStatusDisplayItem.Holder(activity, parent);
case GAP -> new GapStatusDisplayItem.Holder(activity, parent);
case EXTENDED_FOOTER -> new ExtendedFooterStatusDisplayItem.Holder(activity, parent);
case MEDIA_GRID -> new MediaGridStatusDisplayItem.Holder(activity, parent);
case WARNING -> new WarningFilteredStatusDisplayItem.Holder(activity, parent);
};
}
@@ -114,24 +110,37 @@ public abstract class StatusDisplayItem{
statusForContent.filterRevealed = filterPredicate.testWithWarning(status);
}
ReblogOrReplyLineStatusDisplayItem replyLine = null;
boolean threadReply = statusForContent.inReplyToAccountId != null &&
statusForContent.inReplyToAccountId.equals(statusForContent.account.id);
if(statusForContent.inReplyToAccountId!=null && !(threadReply && fragment instanceof ThreadFragment)){
Account account = knownAccounts.get(statusForContent.inReplyToAccountId);
String text = threadReply ? fragment.getString(R.string.sk_show_thread)
: account == null ? fragment.getString(R.string.sk_in_reply)
: GlobalUserPreferences.compactReblogReplyLine && status.reblog != null ? account.displayName
: fragment.getString(R.string.in_reply_to, account.displayName);
String fullText = threadReply ? fragment.getString(R.string.sk_show_thread)
: account == null ? fragment.getString(R.string.sk_in_reply)
: fragment.getString(R.string.in_reply_to, account.displayName);
replyLine = new ReblogOrReplyLineStatusDisplayItem(
parentID, fragment, text, account == null ? List.of() : account.emojis,
R.drawable.ic_fluent_arrow_reply_20_filled, null, null, fullText
);
}
if(status.reblog!=null){
boolean isOwnPost = AccountSessionManager.getInstance().isSelf(fragment.getAccountID(), status.account);
items.add(new ReblogOrReplyLineStatusDisplayItem(parentID, fragment, fragment.getString(R.string.user_boosted, status.account.displayName), status.account.emojis, R.drawable.ic_fluent_arrow_repeat_all_20_filled, isOwnPost ? status.visibility : null, i->{
String fullText = fragment.getString(R.string.user_boosted, status.account.displayName);
String text = GlobalUserPreferences.compactReblogReplyLine && replyLine != null ? status.account.displayName : fullText;
items.add(new ReblogOrReplyLineStatusDisplayItem(parentID, fragment, text, status.account.emojis, R.drawable.ic_fluent_arrow_repeat_all_20_filled, isOwnPost ? status.visibility : null, i->{
args.putParcelable("profileAccount", Parcels.wrap(status.account));
Nav.go(fragment.getActivity(), ProfileFragment.class, args);
}));
}else if(status.inReplyToAccountId!=null && knownAccounts.containsKey(status.inReplyToAccountId)){
Account account=Objects.requireNonNull(knownAccounts.get(status.inReplyToAccountId));
items.add(new ReblogOrReplyLineStatusDisplayItem(parentID, fragment, fragment.getString(R.string.in_reply_to, account.displayName), account.emojis, R.drawable.ic_fluent_arrow_reply_20_filled, null, i->{
args.putParcelable("profileAccount", Parcels.wrap(account));
Nav.go(fragment.getActivity(), ProfileFragment.class, args);
}));
} else if (
!(status.tags.isEmpty() ||
fragment instanceof HashtagTimelineFragment ||
fragment instanceof ListTimelineFragment
) && fragment.getParentFragment() instanceof HomeTabFragment home
) {
}, fullText));
} else if (!(status.tags.isEmpty() ||
fragment instanceof HashtagTimelineFragment ||
fragment instanceof ListTimelineFragment
) && fragment.getParentFragment() instanceof HomeTabFragment home) {
home.getHashtags().stream()
.filter(followed -> status.tags.stream()
.anyMatch(hashtag -> followed.name.equalsIgnoreCase(hashtag.name)))
@@ -146,28 +155,38 @@ public abstract class StatusDisplayItem{
}
)));
}
if (replyLine != null && GlobalUserPreferences.replyLineAboveHeader) {
Optional<ReblogOrReplyLineStatusDisplayItem> primaryLine = items.stream()
.filter(i -> i instanceof ReblogOrReplyLineStatusDisplayItem)
.map(ReblogOrReplyLineStatusDisplayItem.class::cast)
.findFirst();
if (primaryLine.isPresent() && GlobalUserPreferences.compactReblogReplyLine) {
primaryLine.get().extra = replyLine;
} else {
items.add(replyLine);
}
}
HeaderStatusDisplayItem header;
items.add(header=new HeaderStatusDisplayItem(parentID, statusForContent.account, statusForContent.createdAt, fragment, accountID, statusForContent, null, notification, scheduledStatus));
if (replyLine != null && !GlobalUserPreferences.replyLineAboveHeader) {
replyLine.belowHeader = true;
items.add(replyLine);
}
if(!TextUtils.isEmpty(statusForContent.content))
items.add(new TextStatusDisplayItem(parentID, HtmlParser.parse(statusForContent.content, statusForContent.emojis, statusForContent.mentions, statusForContent.tags, accountID), fragment, statusForContent, disableTranslate));
else if (!GlobalUserPreferences.replyLineAboveHeader && replyLine != null)
replyLine.needBottomPadding=true;
else
header.needBottomPadding=true;
List<Attachment> imageAttachments=statusForContent.mediaAttachments.stream().filter(att->att.type.isImage()).collect(Collectors.toList());
if(!imageAttachments.isEmpty()){
int photoIndex=0;
PhotoLayoutHelper.TiledLayoutResult layout=PhotoLayoutHelper.processThumbs(1000, 1910, imageAttachments);
for(Attachment attachment:imageAttachments){
if(attachment.type==Attachment.Type.IMAGE){
items.add(new PhotoStatusDisplayItem(parentID, statusForContent, attachment, fragment, photoIndex, imageAttachments.size(), layout, layout.tiles[photoIndex]));
}else if(attachment.type==Attachment.Type.GIFV){
items.add(new GifVStatusDisplayItem(parentID, statusForContent, attachment, fragment, photoIndex, imageAttachments.size(), layout, layout.tiles[photoIndex]));
}else if(attachment.type==Attachment.Type.VIDEO){
items.add(new VideoStatusDisplayItem(parentID, statusForContent, attachment, fragment, photoIndex, imageAttachments.size(), layout, layout.tiles[photoIndex]));
}else{
throw new IllegalStateException("This isn't supposed to happen, type is "+attachment.type);
}
photoIndex++;
}
PhotoLayoutHelper.TiledLayoutResult layout=PhotoLayoutHelper.processThumbs(imageAttachments);
items.add(new MediaGridStatusDisplayItem(parentID, fragment, layout, imageAttachments, statusForContent));
}
for(Attachment att:statusForContent.mediaAttachments){
if(att.type==Attachment.Type.AUDIO){
@@ -211,9 +230,6 @@ public abstract class StatusDisplayItem{
HEADER,
REBLOG_OR_REPLY_LINE,
TEXT,
PHOTO,
VIDEO,
GIFV,
AUDIO,
POLL_OPTION,
POLL_FOOTER,
@@ -223,8 +239,9 @@ public abstract class StatusDisplayItem{
ACCOUNT,
HASHTAG,
GAP,
WARNING,
EXTENDED_FOOTER
EXTENDED_FOOTER,
MEDIA_GRID,
WARNING
}
public static abstract class Holder<T extends StatusDisplayItem> extends BindableViewHolder<T> implements UsableRecyclerView.DisableableClickable{

View File

@@ -6,6 +6,7 @@ import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.widget.LinearLayout;
import android.widget.Button;
import android.widget.ScrollView;
@@ -31,6 +32,7 @@ import org.joinmastodon.android.ui.utils.UiUtils;
import org.joinmastodon.android.ui.views.LinkedTextView;
import org.joinmastodon.android.utils.StatusTextEncoder;
import java.util.Locale;
import java.util.regex.Pattern;
import me.grishka.appkit.api.Callback;
@@ -97,9 +99,11 @@ public class TextStatusDisplayItem extends StatusDisplayItem{
private final float textMaxHeight, textCollapsedHeight;
private final LinearLayout.LayoutParams collapseParams, wrapParams;
private final ViewGroup parent;
public Holder(Activity activity, ViewGroup parent){
super(activity, R.layout.display_item_text, parent);
this.parent=parent;
text=findViewById(R.id.text);
spoilerTitle=findViewById(R.id.spoiler_title);
spoilerTitleInline=findViewById(R.id.spoiler_title_inline);
@@ -165,13 +169,13 @@ public class TextStatusDisplayItem extends StatusDisplayItem{
boolean translateEnabled = !item.disableTranslate && instanceInfo != null &&
instanceInfo.v2 != null && instanceInfo.v2.configuration.translation != null &&
instanceInfo.v2.configuration.translation.enabled;
boolean isBottomText = BOTTOM_TEXT_PATTERN.matcher(item.status.getStrippedText()).find();
boolean translateVisible = (isBottomText || (
translateEnabled &&
!item.status.visibility.isLessVisibleThan(StatusPrivacy.UNLISTED) &&
item.status.language != null &&
(item.session.preferences == null || !item.status.language.equalsIgnoreCase(item.session.preferences.postingDefaultLanguage))))
// todo: compare to mastodon locale instead (how do i query that?!)
!item.status.language.equalsIgnoreCase(Locale.getDefault().getLanguage())))
&& (!GlobalUserPreferences.translateButtonOpenedOnly || item.textSelectable);
translateWrap.setVisibility(translateVisible ? View.VISIBLE : View.GONE);
translateButton.setText(item.translated ? R.string.sk_translate_show_original : R.string.sk_translate_post);
@@ -227,13 +231,17 @@ public class TextStatusDisplayItem extends StatusDisplayItem{
readMore.setVisibility(View.GONE);
}
if (GlobalUserPreferences.collapseLongPosts) text.post(() -> {
text.measure(
View.MeasureSpec.makeMeasureSpec(parent.getWidth(), View.MeasureSpec.EXACTLY),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
if (GlobalUserPreferences.collapseLongPosts && !item.status.textExpandable) {
boolean tooBig = text.getMeasuredHeight() > textMaxHeight;
boolean inTimeline = !item.textSelectable;
boolean hasSpoiler = !TextUtils.isEmpty(item.status.spoilerText);
boolean expandable = inTimeline && tooBig && !hasSpoiler;
item.parentFragment.onEnableExpandable(this, expandable);
});
item.parentFragment.onEnableExpandable(Holder.this, expandable);
}
readMore.setVisibility(item.status.textExpandable && !item.status.textExpanded ? View.VISIBLE : View.GONE);
textScrollView.setLayoutParams(item.status.textExpandable && !item.status.textExpanded ? collapseParams : wrapParams);

View File

@@ -1,42 +0,0 @@
package org.joinmastodon.android.ui.displayitems;
import android.app.Activity;
import android.graphics.Outline;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewOutlineProvider;
import org.joinmastodon.android.R;
import org.joinmastodon.android.fragments.BaseStatusListFragment;
import org.joinmastodon.android.model.Attachment;
import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.ui.PhotoLayoutHelper;
import me.grishka.appkit.imageloader.requests.UrlImageLoaderRequest;
public class VideoStatusDisplayItem extends ImageStatusDisplayItem{
public VideoStatusDisplayItem(String parentID, Status status, Attachment attachment, BaseStatusListFragment parentFragment, int index, int totalPhotos, PhotoLayoutHelper.TiledLayoutResult tiledLayout, PhotoLayoutHelper.TiledLayoutResult.Tile thisTile){
super(parentID, parentFragment, attachment, status, index, totalPhotos, tiledLayout, thisTile);
request=new UrlImageLoaderRequest(attachment.previewUrl, 1000, 1000);
}
@Override
public Type getType(){
return Type.VIDEO;
}
public static class Holder extends ImageStatusDisplayItem.Holder<VideoStatusDisplayItem>{
public Holder(Activity activity, ViewGroup parent){
super(activity, R.layout.display_item_video, parent);
View play=findViewById(R.id.play_button);
play.setOutlineProvider(new ViewOutlineProvider(){
@Override
public void getOutline(View view, Outline outline){
outline.setOval(0, 0, view.getWidth(), view.getHeight());
outline.setAlpha(.99f); // fixes shadow rendering
}
});
}
}
}

View File

@@ -1,7 +1,8 @@
package org.joinmastodon.android.ui.photoviewer;
import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.ui.displayitems.MediaGridStatusDisplayItem;
public interface PhotoViewerHost{
void openPhotoViewer(String parentID, Status status, int attachmentIndex);
void openPhotoViewer(String parentID, Status status, int attachmentIndex, MediaGridStatusDisplayItem.Holder gridHolder);
}

View File

@@ -8,24 +8,25 @@ import android.graphics.Rect;
import android.graphics.RectF;
import android.text.Layout;
import android.text.Spanned;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.SoundEffectConstants;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.TextView;
import androidx.annotation.NonNull;
import org.joinmastodon.android.ui.utils.UiUtils;
import me.grishka.appkit.utils.V;
public class ClickableLinksDelegate {
private Paint hlPaint;
private final Paint hlPaint;
private Path hlPath;
private LinkSpan selectedSpan;
private TextView view;
private final TextView view;
private final Runnable longClickRunnable = () -> {
if (selectedSpan != null) selectedSpan.onLongClick(view);
};
private final GestureDetector gestureDetector;
public ClickableLinksDelegate(TextView view) {
this.view=view;
@@ -33,11 +34,45 @@ public class ClickableLinksDelegate {
hlPaint.setAntiAlias(true);
hlPaint.setPathEffect(new CornerPathEffect(V.dp(3)));
// view.setHighlightColor(view.getResources().getColor(android.R.color.holo_blue_light));
gestureDetector = new GestureDetector(view.getContext(), new LinkGestureListener(), view.getHandler());
}
public boolean onTouch(MotionEvent event) {
long eventDuration = event.getEventTime() - event.getDownTime();
if(event.getAction()==MotionEvent.ACTION_DOWN){
if(event.getAction()==MotionEvent.ACTION_CANCEL){
// the gestureDetector does not provide a callback for CANCEL, therefore:
// remove background color of view before passing event to gestureDetector
resetAndInvalidate();
}
return gestureDetector.onTouchEvent(event);
}
/**
* remove highlighting from span and let the system redraw the view
*/
private void resetAndInvalidate() {
hlPath=null;
selectedSpan=null;
view.invalidate();
}
public void onDraw(Canvas canvas){
if(hlPath!=null){
canvas.save();
canvas.translate(0, view.getPaddingTop());
canvas.drawPath(hlPath, hlPaint);
canvas.restore();
}
}
/**
* GestureListener for spans that represent URLs.
* onDown: on start of touch event, set highlighting
* onSingleTapUp: when there was a (short) tap, call onClick and reset highlighting
* onLongPress: copy URL to clipboard, let user know, reset highlighting
*/
private class LinkGestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onDown(@NonNull MotionEvent event) {
int line=-1;
Rect rect=new Rect();
Layout l=view.getLayout();
@@ -52,8 +87,7 @@ public class ClickableLinksDelegate {
return false;
}
CharSequence text=view.getText();
if(text instanceof Spanned){
Spanned s=(Spanned)text;
if(text instanceof Spanned s){
LinkSpan[] spans=s.getSpans(0, s.length()-1, LinkSpan.class);
if(spans.length>0){
for(LinkSpan span:spans){
@@ -70,7 +104,6 @@ public class ClickableLinksDelegate {
}
hlPath=new Path();
selectedSpan=span;
view.postDelayed(longClickRunnable, ViewConfiguration.getLongPressTimeout());
hlPaint.setColor((span.getColor() & 0x00FFFFFF) | 0x33000000);
//l.getSelectionPath(start, end, hlPath);
for(int j=lstart;j<=lend;j++){
@@ -96,35 +129,26 @@ public class ClickableLinksDelegate {
}
}
}
return super.onDown(event);
}
if(event.getAction()==MotionEvent.ACTION_UP && selectedSpan!=null){
if (eventDuration <= ViewConfiguration.getLongPressTimeout()) {
@Override
public boolean onSingleTapUp(@NonNull MotionEvent event) {
if(selectedSpan!=null){
view.playSoundEffect(SoundEffectConstants.CLICK);
selectedSpan.onClick(view.getContext());
resetAndInvalidate();
return true;
}
view.removeCallbacks(longClickRunnable);
hlPath=null;
selectedSpan=null;
view.invalidate();
return false;
}
if(event.getAction()==MotionEvent.ACTION_CANCEL){
hlPath=null;
selectedSpan=null;
view.removeCallbacks(longClickRunnable);
view.invalidate();
return false;
}
return false;
}
public void onDraw(Canvas canvas){
if(hlPath!=null){
canvas.save();
canvas.translate(0, view.getPaddingTop());
canvas.drawPath(hlPath, hlPaint);
canvas.restore();
}
}
@Override
public void onLongPress(@NonNull MotionEvent event) {
if (selectedSpan == null) return;
UiUtils.copyText(view, selectedSpan.getType() == LinkSpan.Type.URL ? selectedSpan.getLink() : selectedSpan.getText());
//reset view
resetAndInvalidate();
}
}
}

View File

@@ -46,14 +46,14 @@ public class LinkSpan extends CharacterStyle {
}
}
public void onLongClick(View view) {
UiUtils.copyText(view, getType() == Type.URL ? link : text);
}
public String getLink(){
return link;
}
public String getText() {
return text;
}
public Type getType(){
return type;
}

View File

@@ -8,10 +8,8 @@ import android.view.View;
import org.joinmastodon.android.R;
import org.joinmastodon.android.fragments.BaseStatusListFragment;
import org.joinmastodon.android.fragments.NotificationsListFragment;
import org.joinmastodon.android.ui.PhotoLayoutHelper;
import org.joinmastodon.android.ui.displayitems.ImageStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.LinkCardStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.MediaGridStatusDisplayItem;
import org.joinmastodon.android.ui.displayitems.StatusDisplayItem;
import java.util.List;
@@ -87,21 +85,11 @@ public class InsetStatusItemDecoration extends RecyclerView.ItemDecoration{
boolean topSiblingInset=pos>0 && displayItems.get(pos-1).inset;
boolean bottomSiblingInset=pos<displayItems.size()-1 && displayItems.get(pos+1).inset;
int pad;
if(holder instanceof ImageStatusDisplayItem.Holder || holder instanceof LinkCardStatusDisplayItem.Holder)
if(holder instanceof MediaGridStatusDisplayItem.Holder || holder instanceof LinkCardStatusDisplayItem.Holder)
pad=V.dp(16);
else
pad=V.dp(12);
boolean insetLeft=true, insetRight=true;
if(holder instanceof ImageStatusDisplayItem.Holder<?> img){
PhotoLayoutHelper.TiledLayoutResult layout=img.getItem().tiledLayout;
PhotoLayoutHelper.TiledLayoutResult.Tile tile=img.getItem().thisTile;
// only inset those items that are on the edges of the layout
insetLeft=tile.startCol==0;
insetRight=tile.startCol+tile.colSpan==layout.columnSizes.length;
// inset all items in the bottom row
if(tile.startRow+tile.rowSpan==layout.rowSizes.length)
bottomSiblingInset=false;
}
if(insetLeft)
outRect.left=pad;
if(insetRight)

View File

@@ -0,0 +1,77 @@
package org.joinmastodon.android.ui.utils;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.text.TextUtils;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import org.joinmastodon.android.GlobalUserPreferences;
import org.joinmastodon.android.R;
import org.joinmastodon.android.model.Attachment;
import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.ui.displayitems.MediaGridStatusDisplayItem;
import org.joinmastodon.android.ui.drawables.BlurhashCrossfadeDrawable;
public class MediaAttachmentViewController{
public final View view;
public final MediaGridStatusDisplayItem.GridItemType type;
public final ImageView photo;
public final View altButton, noAltButton, btnsWrap;
public static int[] altWrapPadding = null;
private BlurhashCrossfadeDrawable crossfadeDrawable=new BlurhashCrossfadeDrawable();
private final Context context;
private boolean didClear;
private Status status;
public MediaAttachmentViewController(Context context, MediaGridStatusDisplayItem.GridItemType type){
view=context.getSystemService(LayoutInflater.class).inflate(switch(type){
case PHOTO -> R.layout.display_item_photo;
case VIDEO -> R.layout.display_item_video;
case GIFV -> R.layout.display_item_gifv;
}, null);
photo=view.findViewById(R.id.photo);
altButton=view.findViewById(R.id.alt_button);
noAltButton=view.findViewById(R.id.no_alt_button);
btnsWrap=view.findViewById(R.id.alt_badges);
this.type=type;
this.context=context;
if (altWrapPadding == null) {
altWrapPadding = new int[] { btnsWrap.getPaddingLeft(), btnsWrap.getPaddingTop(), btnsWrap.getPaddingRight(), btnsWrap.getPaddingBottom() };
}
}
public void bind(Attachment attachment, Status status){
this.status=status;
crossfadeDrawable.setSize(attachment.getWidth(), attachment.getHeight());
crossfadeDrawable.setBlurhashDrawable(attachment.blurhashPlaceholder);
crossfadeDrawable.setCrossfadeAlpha(status.spoilerRevealed ? 0f : 1f);
photo.setImageDrawable(null);
photo.setImageDrawable(crossfadeDrawable);
boolean hasAltText = !TextUtils.isEmpty(attachment.description);
photo.setContentDescription(!hasAltText ? context.getString(R.string.media_no_description) : attachment.description);
if(btnsWrap!=null){
btnsWrap.setVisibility(View.VISIBLE);
altButton.setVisibility(hasAltText && GlobalUserPreferences.showAltIndicator ? View.VISIBLE : View.GONE);
noAltButton.setVisibility(!hasAltText && GlobalUserPreferences.showNoAltIndicator ? View.VISIBLE : View.GONE);
}
didClear=false;
}
public void setImage(Drawable drawable){
crossfadeDrawable.setImageDrawable(drawable);
if(didClear && status.spoilerRevealed)
crossfadeDrawable.animateAlpha(0f);
}
public void clearImage(){
crossfadeDrawable.setCrossfadeAlpha(1f);
crossfadeDrawable.setImageDrawable(null);
didClear=true;
}
public void setRevealed(boolean revealed){
crossfadeDrawable.animateAlpha(revealed ? 0f : 1f);
}
}

View File

@@ -87,6 +87,7 @@ import org.joinmastodon.android.model.Notification;
import org.joinmastodon.android.model.Relationship;
import org.joinmastodon.android.model.ScheduledStatus;
import org.joinmastodon.android.model.SearchResults;
import org.joinmastodon.android.model.Searchable;
import org.joinmastodon.android.model.Status;
import org.joinmastodon.android.model.StatusPrivacy;
import org.joinmastodon.android.ui.M3AlertDialogBuilder;
@@ -107,8 +108,10 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.BiPredicate;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
@@ -692,10 +695,7 @@ public class UiUtils {
button.setBackground(ta.getDrawable(0));
ta.recycle();
ta=button.getContext().obtainStyledAttributes(styleRes, new int[]{android.R.attr.textColor});
if(relationship.blocking)
button.setTextColor(button.getResources().getColorStateList(R.color.error_600));
else
button.setTextColor(ta.getColorStateList(0));
button.setTextColor(ta.getColorStateList(0));
ta.recycle();
}
@@ -988,6 +988,8 @@ public class UiUtils {
public static void pickInteractAs(Context context, String accountID, Status sourceStatus, Predicate<Status> checkInteracted, InteractionPerformer interactionPerformer, @StringRes int interactAsRes, @StringRes int interactedAsAccountRes, @StringRes int alreadyInteractedRes, @DrawableRes int iconRes) {
pickAccount(context, accountID, interactAsRes, iconRes, session -> {
lookupStatus(context, sourceStatus, session.getID(), accountID, status -> {
if (status == null) return;
if (checkInteracted.test(status)) {
Toast.makeText(context, alreadyInteractedRes, Toast.LENGTH_SHORT).show();
return;
@@ -1003,18 +1005,33 @@ public class UiUtils {
}, null);
}
public static void lookupStatus(Context context, Status queryStatus, String targetAccountID, @Nullable String sourceAccountID, Consumer<Status> statusConsumer) {
public static void lookupStatus(Context context, Status queryStatus, String targetAccountID, @Nullable String sourceAccountID, Consumer<Status> resultConsumer) {
lookup(context, queryStatus, targetAccountID, sourceAccountID, GetSearchResults.Type.STATUSES, resultConsumer, results ->
!results.statuses.isEmpty() ? Optional.of(results.statuses.get(0)) : Optional.empty()
);
}
public static void lookupAccount(Context context, Account queryAccount, String targetAccountID, @Nullable String sourceAccountID, Consumer<Account> resultConsumer) {
lookup(context, queryAccount, targetAccountID, sourceAccountID, GetSearchResults.Type.ACCOUNTS, resultConsumer, results ->
!results.accounts.isEmpty() ? Optional.of(results.accounts.get(0)) : Optional.empty()
);
}
public static <T extends Searchable> void lookup(Context context, T query, String targetAccountID, @Nullable String sourceAccountID, @Nullable GetSearchResults.Type type, Consumer<T> resultConsumer, Function<SearchResults, Optional<T>> extractResult) {
if (sourceAccountID != null && targetAccountID.startsWith(sourceAccountID.substring(0, sourceAccountID.indexOf('_')))) {
statusConsumer.accept(queryStatus);
resultConsumer.accept(query);
return;
}
new GetSearchResults(queryStatus.url, GetSearchResults.Type.STATUSES, true).setCallback(new Callback<>() {
new GetSearchResults(query.getQuery(), type, true).setCallback(new Callback<>() {
@Override
public void onSuccess(SearchResults results) {
if (!results.statuses.isEmpty()) statusConsumer.accept(results.statuses.get(0));
else
Optional<T> result = extractResult.apply(results);
if (result.isPresent()) resultConsumer.accept(result.get());
else {
Toast.makeText(context, R.string.sk_resource_not_found, Toast.LENGTH_SHORT).show();
resultConsumer.accept(null);
}
}
@Override
@@ -1129,6 +1146,10 @@ public class UiUtils {
return !TextUtils.isEmpty(getSystemProperty("ro.miui.ui.version.code"));
}
public static boolean isEMUI() {
return !TextUtils.isEmpty(getSystemProperty("ro.build.version.emui"));
}
public static int alphaBlendColors(int color1, int color2, float alpha) {
float alpha0 = 1f - alpha;
int r = Math.round(((color1 >> 16) & 0xFF) * alpha0 + ((color2 >> 16) & 0xFF) * alpha);
@@ -1251,6 +1272,17 @@ public class UiUtils {
return intent;
}
public static void populateAccountsMenu(String excludeAccountID, Menu menu, Consumer<AccountSession> onClick) {
List<AccountSession> sessions=AccountSessionManager.getInstance().getLoggedInAccounts();
sessions.stream().filter(s -> !s.getID().equals(excludeAccountID)).forEach(s -> {
String username = "@"+s.self.username+"@"+s.domain;
menu.add(username).setOnMenuItemClickListener((c) -> {
onClick.accept(s);
return true;
});
});
}
/**
* Wraps a View.OnClickListener to filter multiple clicks in succession.
* Useful for buttons that perform some action that changes their state asynchronously.

View File

@@ -0,0 +1,29 @@
package org.joinmastodon.android.ui.views;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.FrameLayout;
public class FrameLayoutThatOnlyMeasuresFirstChild extends FrameLayout{
public FrameLayoutThatOnlyMeasuresFirstChild(Context context){
this(context, null);
}
public FrameLayoutThatOnlyMeasuresFirstChild(Context context, AttributeSet attrs){
this(context, attrs, 0);
}
public FrameLayoutThatOnlyMeasuresFirstChild(Context context, AttributeSet attrs, int defStyle){
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
if(getChildCount()==0)
return;
View child0=getChildAt(0);
measureChild(child0, widthMeasureSpec, heightMeasureSpec);
super.onMeasure(child0.getMeasuredWidth() | MeasureSpec.EXACTLY, child0.getMeasuredHeight() | MeasureSpec.EXACTLY);
}
}

View File

@@ -1,54 +0,0 @@
package org.joinmastodon.android.ui.views;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.FrameLayout;
import org.joinmastodon.android.ui.PhotoLayoutHelper;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import me.grishka.appkit.utils.V;
public class ImageAttachmentFrameLayout extends FrameLayout{
public static final int MAX_WIDTH=400; // dp
private PhotoLayoutHelper.TiledLayoutResult tileLayout;
private PhotoLayoutHelper.TiledLayoutResult.Tile tile;
private int horizontalInset;
public ImageAttachmentFrameLayout(@NonNull Context context){
super(context);
}
public ImageAttachmentFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs){
super(context, attrs);
}
public ImageAttachmentFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr){
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
if(isInEditMode()){
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
return;
}
int w=Math.min(((View)getParent()).getMeasuredWidth(), V.dp(MAX_WIDTH))-horizontalInset;
int actualHeight=Math.round(tile.height/1000f*w)+V.dp(1)*(tile.rowSpan-1);
int actualWidth=Math.round(tile.width/1000f*w);
if(tile.startCol+tile.colSpan<tileLayout.columnSizes.length)
actualWidth-=V.dp(1);
heightMeasureSpec=actualHeight | MeasureSpec.EXACTLY;
widthMeasureSpec=actualWidth | MeasureSpec.EXACTLY;
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
public void setLayout(PhotoLayoutHelper.TiledLayoutResult layout, PhotoLayoutHelper.TiledLayoutResult.Tile tile, int horizontalInset){
tileLayout=layout;
this.tile=tile;
this.horizontalInset=horizontalInset;
}
}

View File

@@ -0,0 +1,105 @@
package org.joinmastodon.android.ui.views;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import org.joinmastodon.android.ui.PhotoLayoutHelper;
import me.grishka.appkit.utils.V;
public class MediaGridLayout extends ViewGroup{
private static final String TAG="MediaGridLayout";
public static final int MAX_WIDTH=400; // dp
private static final int GAP=1; // dp
private PhotoLayoutHelper.TiledLayoutResult tiledLayout;
private int[] columnStarts=new int[10], columnEnds=new int[10], rowStarts=new int[10], rowEnds=new int[10];
public MediaGridLayout(Context context){
this(context, null);
}
public MediaGridLayout(Context context, AttributeSet attrs){
this(context, attrs, 0);
}
public MediaGridLayout(Context context, AttributeSet attrs, int defStyle){
super(context, attrs, defStyle);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
if(tiledLayout==null){
setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), 0);
return;
}
int width=Math.min(V.dp(MAX_WIDTH), MeasureSpec.getSize(widthMeasureSpec));
int height=Math.round(width*(tiledLayout.height/(float)PhotoLayoutHelper.MAX_WIDTH));
int offset=0;
for(int i=0;i<tiledLayout.columnSizes.length;i++){
columnStarts[i]=offset;
offset+=Math.round(tiledLayout.columnSizes[i]/(float)tiledLayout.width*width);
columnEnds[i]=offset;
offset+=V.dp(GAP);
}
columnEnds[tiledLayout.columnSizes.length-1]=width;
offset=0;
for(int i=0;i<tiledLayout.rowSizes.length;i++){
rowStarts[i]=offset;
offset+=Math.round(tiledLayout.rowSizes[i]/(float)tiledLayout.height*height);
rowEnds[i]=offset;
offset+=V.dp(GAP);
}
rowEnds[tiledLayout.rowSizes.length-1]=height;
for(int i=0;i<getChildCount();i++){
View child=getChildAt(i);
LayoutParams lp=(LayoutParams) child.getLayoutParams();
int colSpan=Math.max(1, lp.tile.colSpan)-1;
int rowSpan=Math.max(1, lp.tile.rowSpan)-1;
int w=columnEnds[lp.tile.startCol+colSpan]-columnStarts[lp.tile.startCol];
int h=rowEnds[lp.tile.startRow+rowSpan]-rowStarts[lp.tile.startRow];
child.measure(w | MeasureSpec.EXACTLY, h | MeasureSpec.EXACTLY);
}
setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), height);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b){
if(tiledLayout==null)
return;
int maxWidth=V.dp(MAX_WIDTH);
int xOffset=0;
if(r-l>maxWidth){
xOffset=(r-l)/2-maxWidth/2;
}
for(int i=0;i<getChildCount();i++){
View child=getChildAt(i);
LayoutParams lp=(LayoutParams) child.getLayoutParams();
int colSpan=Math.max(1, lp.tile.colSpan)-1;
int rowSpan=Math.max(1, lp.tile.rowSpan)-1;
child.layout(columnStarts[lp.tile.startCol]+xOffset, rowStarts[lp.tile.startRow], columnEnds[lp.tile.startCol+colSpan]+xOffset, rowEnds[lp.tile.startRow+rowSpan]);
}
}
public void setTiledLayout(PhotoLayoutHelper.TiledLayoutResult tiledLayout){
this.tiledLayout=tiledLayout;
requestLayout();
}
public static class LayoutParams extends ViewGroup.LayoutParams{
public PhotoLayoutHelper.TiledLayoutResult.Tile tile;
public LayoutParams(PhotoLayoutHelper.TiledLayoutResult.Tile tile){
super(WRAP_CONTENT, WRAP_CONTENT);
this.tile=tile;
}
}
}

View File

@@ -1,4 +1,4 @@
package org.joinmastodon.android.ui.utils;
package org.joinmastodon.android.utils;
import android.os.SystemClock;

View File

@@ -0,0 +1,36 @@
package org.joinmastodon.android.utils;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Objects;
import java.util.function.Function;
public class TypedObjectPool<K, V>{
private final Function<K, V> producer;
private final HashMap<K, LinkedList<V>> pool=new HashMap<>();
public TypedObjectPool(Function<K, V> producer){
this.producer=producer;
}
public V obtain(K type){
LinkedList<V> tp=pool.get(type);
if(tp==null)
pool.put(type, tp=new LinkedList<>());
V value=tp.poll();
if(value==null)
value=producer.apply(type);
return value;
}
public void reuse(K type, V obj){
Objects.requireNonNull(obj);
Objects.requireNonNull(type);
LinkedList<V> tp=pool.get(type);
if(tp==null)
pool.put(type, tp=new LinkedList<>());
tp.add(obj);
}
}

View File

@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<selector>
<item android:state_focused="true">
<shape>
<stroke android:color="?colorM3Primary" android:width="2dp"/>
<corners android:radius="4dp"/>
</shape>
</item>
<item>
<shape>
<stroke android:color="?colorM3Outline" android:width="1dp"/>
<corners android:radius="4dp"/>
</shape>
</item>
</selector>
</item>
</layer-list>

View File

@@ -4,5 +4,5 @@
android:shape="rectangle">
<corners android:radius="4sp" />
<solid android:color="?colorBackgroundLight" />
<stroke android:width="2dp" android:color="#00ff00" />
<stroke android:width="2dp" android:color="?android:colorAccent" />
</shape>

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="M7,21Q6.175,21 5.588,20.413Q5,19.825 5,19V6H4V4H9V3H15V4H20V6H19V19Q19,19.825 18.413,20.413Q17.825,21 17,21ZM17,6H7V19Q7,19 7,19Q7,19 7,19H17Q17,19 17,19Q17,19 17,19ZM9,17H11V8H9ZM13,17H15V8H13ZM7,6V19Q7,19 7,19Q7,19 7,19Q7,19 7,19Q7,19 7,19Z"/>
</vector>

View File

@@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:pathData="M4.22 8.47c0.293-0.293 0.767-0.293 1.06 0L12 15.19l6.72-6.72c0.293-0.293 0.767-0.293 1.06 0 0.293 0.293 0.293 0.767 0 1.06l-7.25 7.25c-0.293 0.293-0.767 0.293-1.06 0L4.22 9.53c-0.293-0.293-0.293-0.767 0-1.06z" android:fillColor="@color/fluent_default_icon_tint"/>
</vector>

View File

@@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="28dp" android:height="28dp" android:viewportWidth="28" android:viewportHeight="28">
<path android:pathData="M15.114 25.719c-0.396-0.408-0.746-0.861-1.04-1.35C13.418 24.453 12.725 24.5 12 24.5c-5.111 0-8.5-2.111-8.5-4.785V19l0.007-0.145C3.58 18.095 4.22 17.5 5 17.5h8.624c0.234-0.535 0.529-1.038 0.875-1.5H5c-1.657 0-3 1.343-3 3v0.715C2 23.433 6.21 26 12 26c1.101 0 2.145-0.098 3.114-0.281zM18 8c0-3.314-2.686-6-6-6S6 4.686 6 8s2.686 6 6 6 6-2.686 6-6zM7.5 8c0-2.485 2.015-4.5 4.5-4.5s4.5 2.015 4.5 4.5-2.015 4.5-4.5 4.5S7.5 10.485 7.5 8zm13 19c3.59 0 6.5-2.91 6.5-6.5S24.09 14 20.5 14 14 16.91 14 20.5s2.91 6.5 6.5 6.5zm0-11c0.276 0 0.5 0.224 0.5 0.5V20h3.5c0.276 0 0.5 0.224 0.5 0.5S24.776 21 24.5 21H21v3.5c0 0.276-0.224 0.5-0.5 0.5S20 24.776 20 24.5V21h-3.5c-0.276 0-0.5-0.224-0.5-0.5s0.224-0.5 0.5-0.5H20v-3.5c0-0.276 0.224-0.5 0.5-0.5z" android:fillColor="@color/fluent_default_icon_tint"/>
</vector>

View File

@@ -0,0 +1,3 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:width="24dp" android:height="24dp" android:viewportWidth="24" android:viewportHeight="24">
<path android:pathData="M2.75 13.25h18.5c0.414 0 0.75 0.336 0.75 0.75 0 0.38-0.282 0.694-0.648 0.743L21.25 14.75H2.75C2.336 14.75 2 14.414 2 14c0-0.38 0.282-0.694 0.648-0.743L2.75 13.25h18.5-18.5zm0-4h18.5C21.664 9.25 22 9.586 22 10c0 0.38-0.282 0.694-0.648 0.743L21.25 10.75H2.75C2.336 10.75 2 10.414 2 10c0-0.38 0.282-0.694 0.648-0.743L2.75 9.25h18.5-18.5z" android:fillColor="@color/fluent_default_icon_tint"/>
</vector>

View File

@@ -1,79 +1,34 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- This is hidden from screenreaders because that same alt text is set as content description on the ImageView -->
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/alt_text_wrapper"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start|bottom"
android:layout_margin="12dp"
android:importantForAccessibility="noHideDescendants"
android:background="@drawable/bg_image_alt_overlay">
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/alt_badges"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start|bottom"
android:padding="12dp"
android:importantForAccessibility="noHideDescendants">
<ImageView
android:id="@+id/no_alt_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="4dp"
android:src="@drawable/ic_fluent_important_20_filled"
android:tint="?colorGray25" />
<ImageView
android:id="@+id/no_alt_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:padding="4dp"
android:src="@drawable/ic_fluent_important_20_filled"
android:background="@drawable/bg_image_no_alt_overlay"
android:tint="?colorGray25" />
<TextView
android:id="@+id/alt_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@style/m3_label_large"
android:textColor="?colorGray25"
android:gravity="center"
android:includeFontPadding="false"
android:paddingHorizontal="5dp"
android:paddingVertical="1dp"
android:text="@string/sk_alt_button"/>
<ImageButton
android:id="@+id/alt_text_close"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="end|top"
android:src="@drawable/ic_baseline_close_24"
android:tint="#FFF"
android:background="?android:actionBarItemBackground"/>
<org.joinmastodon.android.ui.views.NestableScrollView
android:id="@+id/alt_text_scroller"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="40dp">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/alt_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:textAppearance="@style/m3_body_medium"
android:textColor="?colorGray25"
tools:text="Alt text goes here"/>
<TextView
android:id="@+id/no_alt_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginVertical="8dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="14dp"
android:textAppearance="@style/m3_label_large"
android:textColor="?colorGray25"
android:text="@string/sk_no_alt_text"/>
</LinearLayout>
</org.joinmastodon.android.ui.views.NestableScrollView>
<TextView
android:id="@+id/alt_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom"
android:textAppearance="@style/m3_label_large"
android:textColor="?colorGray25"
android:gravity="center"
android:includeFontPadding="false"
android:paddingHorizontal="5dp"
android:paddingVertical="1dp"
android:background="@drawable/bg_image_alt_overlay"
android:text="@string/sk_alt_button"/>
</FrameLayout>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
@@ -8,9 +8,10 @@
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="start|center_vertical"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:padding="16dp"
android:textAppearance="@style/m3_title_medium"
android:textColor="?android:textColorSecondary"
@@ -20,11 +21,11 @@
android:id="@+id/reveal_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end|center_vertical"
android:layout_gravity="center_vertical"
android:padding="16dp"
android:text="@string/tap_to_reveal"
android:singleLine="true"
android:ellipsize="end"
android:textColor="?android:textColorSecondary" />
</FrameLayout>
</LinearLayout>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<org.joinmastodon.android.ui.views.ImageAttachmentFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
@@ -27,4 +27,4 @@
<include layout="@layout/alt_badge" />
</org.joinmastodon.android.ui.views.ImageAttachmentFrameLayout>
</FrameLayout>

View File

@@ -27,6 +27,7 @@
android:visibility="gone"
android:background="?android:actionBarItemBackground"
android:contentDescription="@string/sk_delete_notification"
android:tooltipText="@string/sk_delete_notification"
android:scaleType="center"
android:src="@drawable/ic_fluent_dismiss_20_filled"
android:tint="?android:textColorSecondary" />

View File

@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<org.joinmastodon.android.ui.views.ImageAttachmentFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
<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">
@@ -12,4 +13,4 @@
<include layout="@layout/alt_badge" />
</org.joinmastodon.android.ui.views.ImageAttachmentFrameLayout>
</FrameLayout>

View File

@@ -1,14 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
<org.joinmastodon.android.ui.views.AutoOrientationLinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingHorizontal="16dp"
android:layout_marginBottom="-12dp">
<TextView
android:id="@+id/extra_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingTop="16dp"
android:paddingBottom="6dp"
android:textAppearance="@style/m3_title_small"
android:drawableStart="@drawable/ic_fluent_arrow_reply_20_filled"
android:drawableTint="?android:textColorSecondary"
android:drawablePadding="6dp"
android:singleLine="true"
android:ellipsize="end"/>
<TextView
android:id="@+id/separator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginHorizontal="6dp"
android:paddingTop="16dp"
android:paddingHorizontal="1dp"
android:textAppearance="@style/m3_title_small"
android:gravity="center_horizontal"
android:importantForAccessibility="no"
android:includeFontPadding="false"
android:text="@string/sk_separator" />
<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingHorizontal="16dp"
android:paddingTop="16dp"
android:paddingBottom="6dp"
android:textAppearance="@style/m3_title_small"
@@ -18,4 +46,4 @@
android:singleLine="true"
android:ellipsize="end"/>
</FrameLayout>
</org.joinmastodon.android.ui.views.AutoOrientationLinearLayout>

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<org.joinmastodon.android.ui.views.ImageAttachmentFrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content">
@@ -20,4 +20,4 @@
<include layout="@layout/alt_badge" />
</org.joinmastodon.android.ui.views.ImageAttachmentFrameLayout>
</FrameLayout>

View File

@@ -64,10 +64,10 @@
android:paddingBottom="6dp"
android:textAppearance="@style/m3_title_small"
android:drawableStart="@drawable/ic_fluent_arrow_reply_20_filled"
tools:drawableEnd="@drawable/ic_fluent_earth_20_regular"
android:drawableTint="?android:textColorSecondary"
android:drawablePadding="6dp"
android:singleLine="true"
android:text="@string/sk_in_reply"
android:ellipsize="end"/>
<RelativeLayout
@@ -90,7 +90,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toEndOf="@id/self_avatar"
android:layout_marginTop="2sp"
android:paddingTop="4sp"
android:minHeight="24sp"
android:ellipsize="end"
android:singleLine="true"
@@ -101,9 +101,9 @@
android:id="@+id/self_extra_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="2sp"
android:layout_marginStart="8sp"
android:layout_toEndOf="@id/self_name"
android:paddingTop="4sp"
android:ellipsize="end"
android:fontFamily="sans-serif"
android:singleLine="true"
@@ -125,6 +125,23 @@
</RelativeLayout>
<TextView
android:id="@+id/reply_text_below"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="-6dp"
android:layout_marginBottom="-6dp"
android:layout_marginStart="16dp"
android:paddingTop="16dp"
android:paddingBottom="6dp"
android:textAppearance="@style/m3_title_small"
android:drawableStart="@drawable/ic_fluent_arrow_reply_20_filled"
android:drawableTint="?android:textColorSecondary"
android:drawablePadding="6dp"
android:singleLine="true"
android:text="@string/sk_in_reply"
android:ellipsize="end"/>
<FrameLayout
android:id="@+id/toot_text_wrap"
android:layout_width="match_parent"

View File

@@ -9,7 +9,8 @@
<ScrollView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1">
android:layout_weight="1"
android:fillViewport="true">
<LinearLayout
android:layout_width="match_parent"
@@ -28,6 +29,11 @@
android:textColor="?colorM3OnSurface"
android:text="@string/confirm_email_subtitle"/>
<Space
android:layout_width="1dp"
android:layout_height="0px"
android:layout_weight="1"/>
<ImageView
android:layout_width="230dp"
android:layout_height="wrap_content"
@@ -37,6 +43,11 @@
android:adjustViewBounds="true"
android:src="@drawable/confirm_email_art"/>
<Space
android:layout_width="1dp"
android:layout_height="0px"
android:layout_weight="1"/>
</LinearLayout>
</ScrollView>

View File

@@ -40,17 +40,17 @@
android:background="@drawable/bg_onboarding_panel">
<Button
android:id="@+id/btn_skip"
android:id="@+id/btn_next"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:layout_marginBottom="16dp"
style="@style/Widget.Mastodon.M3.Button.Tonal"
android:text="@string/skip"/>
android:text="@string/follow_all"/>
<Button
android:id="@+id/btn_next"
android:id="@+id/btn_skip"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="16dp"
@@ -58,7 +58,7 @@
android:layout_marginTop="8dp"
android:layout_marginBottom="16dp"
style="@style/Widget.Mastodon.M3.Button.Filled"
android:text="@string/follow_all"/>
android:text="@string/skip"/>
</LinearLayout>

View File

@@ -64,6 +64,7 @@
android:contentDescription="@string/clear"
android:stateListAnimator="@null"
android:elevation="0dp"
android:tint="?colorM3OnSurfaceVariant"
android:src="@drawable/ic_m3_cancel"/>
</org.joinmastodon.android.ui.views.FloatingHintEditTextLayout>

View File

@@ -36,7 +36,7 @@
android:layout_marginTop="16dp"
android:layout_marginBottom="8dp"
android:layout_marginHorizontal="16dp"
android:inputType="textFilter|textNoSuggestions"
android:inputType="textUri|textNoSuggestions"
android:singleLine="true"
android:imeOptions="actionGo"
android:drawableStart="@drawable/ic_fluent_globe_20_regular"

View File

@@ -2,32 +2,43 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="56dp"
android:paddingStart="16dp"
android:paddingEnd="8dp"
android:layout_height="wrap_content"
android:paddingStart="8dp"
android:paddingEnd="16dp"
android:clipToPadding="false"
android:background="?colorM3Background">
<ImageView
android:id="@+id/dragger_thingy"
android:layout_width="56dp"
android:layout_height="56dp"
android:layout_alignParentEnd="true"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_alignParentStart="true"
android:layout_marginEnd="8dp"
android:scaleType="center"
android:tint="?colorM3OnSurface"
android:contentDescription="@string/reorder"
android:src="@drawable/ic_drag_handle_24px"/>
<ImageButton
android:id="@+id/delete"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_alignParentEnd="true"
android:layout_marginStart="8dp"
android:scaleType="center"
android:tint="?colorM3OnSurface"
android:background="?android:actionBarItemBackground"
android:contentDescription="@string/delete"
android:src="@drawable/ic_delete_24px"/>
<EditText
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="24dp"
android:layout_marginTop="6dp"
android:layout_toStartOf="@id/dragger_thingy"
android:background="@null"
android:padding="0dp"
android:textAppearance="@style/m3_body_large"
android:textColor="?colorM3OnSurfaceVariant"
android:textColorHint="?colorM3OnSurfaceVariant"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_toEndOf="@id/dragger_thingy"
android:layout_toStartOf="@id/delete"
style="@style/Widget.Mastodon.M3.EditText"
android:inputType="textCapSentences"
android:hint="@string/field_content"
android:saveEnabled="false"
@@ -36,14 +47,13 @@
<EditText
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="20dp"
android:layout_toStartOf="@id/dragger_thingy"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:layout_marginBottom="8dp"
android:layout_toEndOf="@id/dragger_thingy"
android:layout_toStartOf="@id/delete"
android:layout_below="@id/content"
android:background="@null"
android:padding="0dp"
android:textAppearance="@style/m3_body_medium"
android:textColor="?colorM3OnSurfaceVariant"
android:textColorHint="?colorM3OnSurfaceVariant"
style="@style/Widget.Mastodon.M3.EditText"
android:inputType="textCapSentences"
android:hint="@string/field_label"
android:saveEnabled="false"

View File

@@ -0,0 +1,77 @@
<?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:id="@+id/alt_text_wrapper"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="start|bottom"
android:layout_margin="12dp"
android:importantForAccessibility="noHideDescendants"
android:background="@drawable/bg_image_alt_overlay">
<ImageView
android:id="@+id/no_alt_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:padding="4dp"
android:src="@drawable/ic_fluent_important_20_filled"
android:tint="?colorGray25" />
<TextView
android:id="@+id/alt_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="@style/m3_label_large"
android:textColor="?colorGray25"
android:gravity="center"
android:includeFontPadding="false"
android:paddingHorizontal="5dp"
android:paddingVertical="1dp"
android:text="@string/sk_alt_button"/>
<ImageButton
android:id="@+id/alt_text_close"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="end|top"
android:src="@drawable/ic_baseline_close_24"
android:tint="#FFF"
android:background="?android:actionBarItemBackground"/>
<org.joinmastodon.android.ui.views.NestableScrollView
android:id="@+id/alt_text_scroller"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_marginEnd="40dp">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/alt_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="8dp"
android:textAppearance="@style/m3_body_medium"
android:textColor="#FFF"
tools:text="Alt text goes here"/>
<TextView
android:id="@+id/no_alt_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginVertical="8dp"
android:layout_marginEnd="8dp"
android:layout_marginStart="14dp"
android:textAppearance="@style/m3_label_large"
android:textColor="?colorGray25"
android:text="@string/sk_no_alt_text"/>
</LinearLayout>
</org.joinmastodon.android.ui.views.NestableScrollView>
</FrameLayout>

View File

@@ -1,5 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/open_with_account" android:title="@string/sk_open_with_account" android:icon="@drawable/ic_fluent_person_swap_24_regular">
<menu android:id="@+id/accounts" />
</item>
<item android:id="@+id/share" android:title="@string/share_user" android:icon="@drawable/ic_fluent_share_24_regular"/>
<item android:id="@+id/mute" android:title="@string/mute_user" android:icon="@drawable/ic_fluent_speaker_off_24_regular"/>
<item android:id="@+id/block" android:title="@string/block_user" android:icon="@drawable/ic_fluent_person_prohibited_24_regular"/>

View File

@@ -2,6 +2,9 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/followed_hashtags" android:title="@string/sk_hashtags_you_follow" android:icon="@drawable/ic_fluent_number_symbol_24_regular" android:showAsAction="always"/>
<item android:id="@+id/bookmarks" android:title="@string/bookmarks" android:icon="@drawable/ic_fluent_bookmark_multiple_24_regular" android:showAsAction="always"/>
<item android:id="@+id/open_with_account" android:title="@string/sk_open_with_account" android:icon="@drawable/ic_fluent_person_swap_24_regular">
<menu android:id="@+id/accounts" />
</item>
<item android:id="@+id/manage_user_lists" android:title="@string/sk_your_lists" android:icon="@drawable/ic_fluent_people_24_regular"/>
<item android:id="@+id/favorites" android:title="@string/your_favorites" android:icon="@drawable/ic_fluent_star_24_regular"/>
<item android:id="@+id/scheduled" android:title="@string/sk_unsent_posts" android:icon="@drawable/ic_fluent_folder_open_24_regular"/>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@+id/reply_visibility_all" android:title="@string/sk_settings_reply_visibility_all"/>
<item android:id="@+id/reply_visibility_following" android:title="@string/sk_settings_reply_visibility_following"/>
<item android:id="@+id/reply_visibility_self" android:title="@string/sk_settings_reply_visibility_self"/>
</menu>

View File

@@ -1,9 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="get_started">الخطوات الأولى</string>
<string name="get_started">إنشاء حساب</string>
<string name="already_have_account">لدي حساب بالفعل</string>
<string name="log_in">تسجيلُ الدخول</string>
<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>
@@ -13,7 +16,7 @@
<string name="user_followed_you">بَدَأ بِمُتابَعَتِك</string>
<string name="user_sent_follow_request">أرسَلَ طَلَبًا لِمُتابَعَتِك</string>
<string name="user_favorited">فَضَّلَ مَنشُورَك</string>
<string name="notification_boosted">أعادَ تَدوينَ مَنشُورَك</string>
<string name="notification_boosted">أعادَ تَدوينَ مَنشُورِك</string>
<string name="poll_ended">انتهى استطلاعُ الرأي</string>
<string name="time_seconds">%d ثا</string>
<string name="time_minutes">%d د</string>
@@ -54,7 +57,7 @@
<string name="media">وسائط</string>
<string name="profile_about">حَول</string>
<string name="button_follow">تابِع</string>
<string name="button_following">يُتابِع</string>
<string name="button_following">مُتابَع</string>
<string name="edit_profile">حرّر الملف الشخصي</string>
<string name="mention_user">ذِكر @%s</string>
<string name="share_user">مُشارَكَةُ %s</string>
@@ -79,7 +82,7 @@
<string name="field_label">التسمية</string>
<string name="field_content">المحتوى</string>
<string name="saving">يحفظ…</string>
<string name="post_from_user">نُشر من %s</string>
<string name="post_from_user">مَنشور مِن %s</string>
<string name="poll_option_hint">الخيار %d</string>
<plurals name="x_minutes">
<item quantity="zero">أقل من دقيقة</item>
@@ -226,15 +229,16 @@
<string name="back">العودة</string>
<string name="instance_catalog_title">يتكوّن ماستدون من مستخدمين موزّعين عبر خوادم مختلفة.</string>
<string name="instance_catalog_subtitle">اختر خادمًا بناءً على اهتماماتك، منطقتك أو يمكنك حتى اختيارُ مجتمعٍ ذي غرضٍ عام. وسيضل بامكانك التواصل مع المستخدمين من الخوادم الأخرى.</string>
<string name="search_communities">ابحث عن خادم أو أدخل رابطه</string>
<string name="instance_rules_title">بعض القواعد الأساسية</string>
<string name="instance_rules_subtitle">خذ دقيقة لمراجعة القواعد التي حددها وفرضها مديروا %s.</string>
<string name="signup_title">دعنا نجهزك في %s</string>
<string name="search_communities">اسم الخادم أو عنوان URL</string>
<string name="instance_rules_title">قواعد الخادم</string>
<string name="instance_rules_subtitle">من خلال المتابعة، أنت توافق على اتباع القواعد التالية التي تم تعيينها وإنفاذها من قبل مشرفي %s.</string>
<string name="signup_title">إنشاء حساب</string>
<string name="edit_photo">حرّر</string>
<string name="display_name">الاسم العلني</string>
<string name="display_name">الاسم</string>
<string name="username">اسم المستخدم</string>
<string name="email">البريد الإلكتروني</string>
<string name="password">كلمة المرور</string>
<string name="confirm_password">تأكيد كلمة المرور</string>
<string name="password_note">ضمّن الأحرف الكبيرة والأحرف الخاصة والأرقام لزيادة قوة كلمة المرور.</string>
<string name="category_academia">أكاديمي</string>
<string name="category_activism">النشطاء</string>
@@ -245,12 +249,14 @@
<string name="category_games">ألعاب</string>
<string name="category_general">عام</string>
<string name="category_journalism">صحافة</string>
<string name="category_lgbt">LGBT</string>
<string name="category_lgbt">مجتمع الميم</string>
<string name="category_music">موسيقى</string>
<string name="category_regional">إقليمي</string>
<string name="category_tech">تقني</string>
<string name="confirm_email_title">شيءٌ أخير</string>
<string name="confirm_email_subtitle">أنقر على الرابط المرسل إليك لاستيثاق حسابك.</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>
@@ -305,7 +311,7 @@
<string name="notify_favorites">بِالإعْجاب بِمَنشوري</string>
<string name="notify_follow">بمتابعتي</string>
<string name="notify_reblog">بإعادة تدوين مَنشوري</string>
<string name="notify_mention">ذكرني</string>
<string name="notify_mention">بِالإشارَةِ إليّ</string>
<string name="settings_boring">المنطِقَةُ المُملَّة</string>
<string name="settings_account">إعدادات الحساب</string>
<string name="settings_contribute">ساهم في ماستدون</string>
@@ -342,7 +348,7 @@
<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">لماذا تريد الانضمام؟</string>
<string name="signup_reason_note">هذا سوف يساعدنا في مراجعة تطبيقك.</string>
<string name="clear">امسح</string>
<string name="profile_header">الصورة الفوقية</string>
@@ -426,7 +432,7 @@
<item quantity="many">منذ %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>
@@ -459,8 +465,54 @@
<!-- %s is file size -->
<string name="download_update">جارٍ التنزيل (%s)</string>
<string name="install_update">تثبيت</string>
<string name="privacy_policy_title">ماستدون وخصوصيتك</string>
<string name="privacy_policy_subtitle">على الرغم من أن تطبيق ماستدون لا يجمع أي بيانات، فإن الخادم الذي قمت بالتسجيل من خلاله قد تكون له سياسة مختلفة. خذ دقيقة للمراجعة والموافقة على سياسة خصوصية التطبيق ماستدون وسياسة الخصوصية للخادم الخاص بك.</string>
<string name="privacy_policy_title">خصوصيتك</string>
<string name="privacy_policy_subtitle">على الرغم من أن تطبيق ماستدون لا يجمع أي بيانات، فإن الخادم الذي قمت بالتسجيل من خلاله قد تكون له سياسة مختلفة.\n\nإذا لم توافق على سياسة %s، يمكنك العودة واختيار خادم مختلف.</string>
<string name="i_agree">أنا مُوافِق</string>
<string name="empty_list">هذه القائمة فارغة</string>
<string name="instance_signup_closed">هذا الخادم لا يقبل التسجيلات الجديدة.</string>
<string name="text_copied">نُسِخ إلى الحافظة</string>
<string name="add_bookmark">إضافة إلى الفواصل المرجعية</string>
<string name="remove_bookmark">إزالة الفاصلة المرجعية</string>
<string name="bookmarks">الفواصل المرجعية</string>
<string name="your_favorites">مفضّلاتك</string>
<string name="login_title">مرحبا بك مجددًا</string>
<string name="login_subtitle">قم بتسجيل الدخول باستخدام الخادم حيث قمتَ بإنشاء حسابك فيه.</string>
<string name="server_url">رابط الخادم</string>
<string name="welcome_page1_title">ما هو ماستدون؟</string>
<string name="welcome_page1_text">تخيل أن لديك عنوان بريد إلكتروني ينتهي بـ @example.com.\n\n رغم ذلك يمكنك إرسال واستقبال رسائل البريد الإلكتروني من أي شخص، حتى إذا كان بريدهم الإلكتروني الخاص ينتهي بـ @gmail.com أو @icloud.com أو @example.com.</string>
<string name="welcome_page2_title">ماستدون هكذا.</string>
<string name="welcome_page2_text">قد يكون مُعرّفُك @gothgirl654@example.social ، ولكنه بإمكانك متابعة وإعادة تدوين ومحادثة @fallout5ever@example.online.</string>
<string name="welcome_page3_title">كيف يمكنني اختيار خادم؟</string>
<string name="welcome_page3_text">يختار الأشخاص المختلفون خوادم مختلفة لأي عدد من الأسباب. يعد art.example مكانًا رائعًا للفنانين ، بينما قد يكون glasgow.example اختيارًا جيدًا للاسكتلنديين. \n\n لا يمكنك أن تخطئ في أي من الخوادم التي نوصي بها ، لذلك بغض النظر عن أي واحد تختاره (أو إذا قمت بإدخال الخادم الخاص بك في شريط البحث) ، فلن يفوتك أي شيء في أي مكان.</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>
<string name="server_filter_any_signup_speed">أي سرعة تسجيل</string>
<string name="server_filter_region_europe">أوروبا</string>
<string name="server_filter_region_north_america">أمريكا الشمالية</string>
<string name="server_filter_region_south_america">أمريكا الجنوبية</string>
<string name="server_filter_region_africa">أفريقيا</string>
<string name="server_filter_region_asia">آسيا</string>
<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>
<string name="profile_setup_subtitle">يمكنك دائماً إكمال هذا في وقت لاحق في علامة التبويب الملف الشخصي.</string>
<string name="profile_setup_explanation">يمكنك إضافة ما يصل إلى أربعة حقول شخصية لأي شيء تريده. الموقع، الروابط، الضمائر - السماء هي الحد الأقصى.</string>
<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="signup_username_taken">اِسم المُستَخدِم هذا مأخوذٌ بالفعل.</string>
</resources>

View File

@@ -1,16 +1,449 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="get_started">Пачаць</string>
<string name="get_started">Стварыць уліковы запіс</string>
<string name="already_have_account">У мяне ўжо ёсць уліковы запіс</string>
<string name="log_in">Увайсці</string>
<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">падпісаўся(-лася) на вас</string>
<string name="user_sent_follow_request">адправіў запыт на падпіску</string>
<string name="user_favorited">упадабаў(-ла) ваш допіс</string>
<string name="notification_boosted">пашырыў(-ла) ваш допіс</string>
<string name="poll_ended">апытанне завершана</string>
<string name="time_seconds">%dсек</string>
<string name="time_minutes">%dхв</string>
<string name="time_hours">%dгадз</string>
<string name="time_days">%dдз</string>
<string name="share_toot_title">Абагуліць</string>
<string name="settings">Налады</string>
<string name="publish">Апублікаваць</string>
<string name="discard_draft">Скасаваць чарнавік?</string>
<string name="discard">Выйсці</string>
<string name="cancel">Скасаваць</string>
<plurals name="followers">
<item quantity="one">падпісчык</item>
<item quantity="few">падпісчыка</item>
<item quantity="many">падпісчыкаў</item>
<item quantity="other">падпісчыкаў</item>
</plurals>
<plurals name="following">
<item quantity="one">падпісаны</item>
<item quantity="few">падпісаны</item>
<item quantity="many">падпісаны</item>
<item quantity="other">падпісаны</item>
</plurals>
<plurals name="posts">
<item quantity="one">допіс</item>
<item quantity="few">допісы</item>
<item quantity="many">допісаў</item>
<item quantity="other">допісаў</item>
</plurals>
<string name="posts">Допісы</string>
<string name="posts_and_replies">Допісы і адказы</string>
<string name="media">Медыя</string>
<string name="profile_about">Інфармацыя</string>
<string name="button_follow">Падпісацца</string>
<string name="button_following">Вы падпісаны</string>
<string name="edit_profile">Рэдагаваць профіль</string>
<string name="mention_user">Згадаць %s</string>
<string name="share_user">Абагуліць %s</string>
<string name="mute_user">Ігнараваць %s</string>
<string name="unmute_user">Не ігнараваць %s</string>
<string name="block_user">Заблакіраваць %s</string>
<string name="unblock_user">Разблакіраваць %s</string>
<string name="report_user">Паскардзіцца на %s</string>
<string name="block_domain">Заблакіраваць %s</string>
<string name="unblock_domain">Разблакіраваць %s</string>
<plurals name="x_posts">
<item quantity="one">%,d допіс</item>
<item quantity="few">%,d допісы</item>
<item quantity="many">%,d допісаў</item>
<item quantity="other">%,d допісаў</item>
</plurals>
<string name="profile_joined">Далучыўся</string>
<string name="done">Гатова</string>
<string name="loading">Загрузка…</string>
<string name="field_label">Метка</string>
<string name="field_content">Змесціва</string>
<string name="saving">Захаванне…</string>
<string name="post_from_user">Допіс ад %s</string>
<string name="poll_option_hint">Варыянт %d</string>
<plurals name="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="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_days">
<item quantity="one">%d дзень</item>
<item quantity="few">%d дні</item>
<item quantity="many">%d дзён</item>
<item quantity="other">%d дзён</item>
</plurals>
<string name="compose_poll_duration">Працягласць: %s</string>
<plurals name="x_seconds_left">
<item quantity="one">%d секунда засталася</item>
<item quantity="few">%d секунды засталося</item>
<item quantity="many">%d секунд засталося</item>
<item quantity="other">%d секунд засталося</item>
</plurals>
<plurals name="x_minutes_left">
<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_left">
<item quantity="one">%d гадзіна засталася</item>
<item quantity="few">%d гадзіны засталося</item>
<item quantity="many">%d гадзін засталося</item>
<item quantity="other">%d гадзін засталося</item>
</plurals>
<plurals name="x_days_left">
<item quantity="one">%d дзень застаўся</item>
<item quantity="few">%d дні засталося</item>
<item quantity="many">%d дзён засталося</item>
<item quantity="other">%d дзён засталося</item>
</plurals>
<plurals name="x_voters">
<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>
<string name="do_mute">Ігнараваць</string>
<string name="confirm_unmute_title">Не ігнараваць уліковы запіс</string>
<string name="confirm_unmute">Не ігнараваць %s?</string>
<string name="do_unmute">Не ігнараваць</string>
<string name="confirm_block_title">Заблакіраваць уліковы запіс</string>
<string name="confirm_block_domain_title">Заблакіраваць дамен</string>
<string name="confirm_block">Заблакіраваць %s?</string>
<string name="do_block">Заблакіраваць</string>
<string name="confirm_unblock_title">Разблакіраваць уліковы запіс</string>
<string name="confirm_unblock_domain_title">Разблакіраваць дамен</string>
<string name="confirm_unblock">Разблакіраваць %s?</string>
<string name="do_unblock">Разблакіраваць</string>
<string name="button_muted">Ігнаруецца</string>
<string name="button_blocked">Заблакіраваны</string>
<string name="action_vote">Прагаласаваць</string>
<string name="tap_to_reveal">Націсніце, каб паказаць</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="few">%d чалавекі размаўляе</item>
<item quantity="many">%d чалавек размаўляе</item>
<item quantity="other">%d чалавек размаўляе</item>
</plurals>
<plurals name="discussed_x_times">
<item quantity="one">Абмяркоўвалася %d раз</item>
<item quantity="few">Абмяркоўвалася %d разы</item>
<item quantity="many">Абмяркоўвалася %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>
<string name="report_choose_posts">Ці ёсць допісы, якія пацвярджаюць гэтую скаргу?</string>
<string name="report_choose_posts_subtitle">Абярыце ўсе варыянты, што падыходзяць</string>
<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="instance_catalog_title">Mastodon складаецца з карыстальнікаў на розных серверах.</string>
<string name="instance_catalog_subtitle">Выбірайце сервер у залежнасці ад вашых інтарэсаў, рэгіёна або выберыце сервер агульнага прызначэння. Вы па-ранейшаму можаце ўзаемадзейнічаць з усімі, незалежна ад сервера.</string>
<string name="search_communities">Назва сервера або URL</string>
<string name="instance_rules_title">Правілы сервера</string>
<string name="signup_title">Стварыць уліковы запіс</string>
<string name="edit_photo">рэдагаваць</string>
<string name="display_name">Імя</string>
<string name="username">Імя карыстальніка</string>
<string name="email">Электронная пошта</string>
<string name="password">Пароль</string>
<string name="confirm_password">Пацвердзіць пароль</string>
<string name="password_note">Выкарыстоўвайце вялікія літары, спецыяльныя сімвалы і лічбы, каб павялічыць надзейнасць пароля.</string>
<string name="category_academia">Акадэмія</string>
<string name="category_activism">Актывізм</string>
<string name="category_all">Усе</string>
<string name="category_art">Мастацтва</string>
<string name="category_food">Ежа</string>
<string name="category_furry">Furry</string>
<string name="category_games">Гульні</string>
<string name="category_general">Асноўныя</string>
<string name="category_journalism">Журналістыка</string>
<string name="category_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="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="add_image_description">Дадаць апісанне відарыса…</string>
<string name="retry_upload">Паўтарыць запампоўку</string>
<string name="edit_image">Рэдагаваць відарыс</string>
<string name="save">Захаваць</string>
<string name="add_alt_text">Дадаць альтэрнатыўны тэкст</string>
<string name="alt_text_subtitle">Альтэрнатыўны тэкст апісвае вашы фатаграфіі для людзей са слабым зрокам ці без яго. Паспрабуйце ўключыць дастаткова дэталяў, каб быў зразумелы кантэкст.</string>
<string name="alt_text_hint">напрыклад, Сабака падазрона азіраецца з прыжмуранымі вачыма на камеру.</string>
<string name="visibility_public">Публічны</string>
<string name="visibility_followers_only">Толькі для падпісчыкаў</string>
<string name="visibility_private">Толькі людзі, якіх я згадаў</string>
<string name="search_all">Усе</string>
<string name="search_people">Людзі</string>
<string name="recent_searches">Нядаўнія запыты</string>
<string name="step_x_of_n">Крок %1$d з %2$d</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>
<plurals name="cant_add_more_than_x_attachments">
<item quantity="one">Вы не можаце дадаць больш за %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="theme_true_black">Сапраўдны чорны рэжым</string>
<string name="settings_behavior">Паводзіны</string>
<string name="settings_gif">Прайграваць аніміраваныя аватары і эмодзі</string>
<string name="settings_custom_tabs">Выкарыстоўваць убудаваны браўзер</string>
<string name="settings_notifications">Апавяшчэнні</string>
<string name="notify_me_when">Паведаміце мне, калі</string>
<string name="notify_anyone">кожны</string>
<string name="notify_follower">падпісчык</string>
<string name="notify_followed">на каго я падпісаны</string>
<string name="notify_none">ніхто</string>
<string name="notify_favorites">Дадае мой допіс у абранае</string>
<string name="notify_follow">Падпісаўся на мяне</string>
<string name="notify_reblog">Пашырае мой допіс</string>
<string name="notify_mention">Згадвае мяне</string>
<string name="settings_boring">Нудная зона</string>
<string name="settings_account">Налады ўліковага запісу</string>
<string name="settings_contribute">Унесці ўклад у Mastodon</string>
<string name="settings_tos">Умовы выкарыстання</string>
<string name="settings_privacy_policy">Палітыка прыватнасці</string>
<string name="settings_spicy">Вострая зона</string>
<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">Вы ўпэўненыя, што хочаце выйсці?</string>
<string name="sensitive_content">Далікатны змест</string>
<string name="sensitive_content_explain">Аўтар пазначыў гэты медыя файл як далікатны. Націсніце, каб паказаць.</string>
<string name="media_hidden">Націсніце, каб паказаць</string>
<string name="avatar_description">Перайсці да профілю %s</string>
<string name="more_options">Больш опцый</string>
<string name="reveal_content">Паказаць змест</string>
<string name="hide_content">Схаваць змест</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>
<string name="add_media">Дадаць медыя</string>
<string name="add_poll">Дадаць апытанне</string>
<string name="emoji">Эмодзі</string>
<string name="post_visibility">Бачнасць допісу</string>
<string name="home_timeline">Хатняя стужка</string>
<string name="my_profile">Мой профіль</string>
<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="open_in_browser">Адкрыць у браўзеры</string>
<string name="hide_boosts_from_user">Схаваць пашырэнні ад %s</string>
<string name="show_boosts_from_user">Паказаць пашырэнні ад %s</string>
<string name="signup_reason_note">Гэта дапаможа нам разгледзець вашу заяўку.</string>
<string name="clear">Ачысціць</string>
<string name="profile_header">Відарыс шапкі</string>
<string name="profile_picture">Аватар</string>
<string name="reorder">Упарадкаваць</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>
<string name="no_app_to_handle_action">Няма праграмы для выканання гэтага дзеяння</string>
<string name="local_timeline">Супольнасць</string>
<string name="trending_posts_info_banner">Допісы, што набіраюць папулярнасць у вашым кутку Mastodon.</string>
<string name="trending_hashtags_info_banner">Хэштэгі, што набіраюць папулярнасць у вашым кутку Mastodon.</string>
<string name="trending_links_info_banner">Навіна, якая найбольш абмяркоўваецца ў вашым кутку Mastodon.</string>
<string name="local_timeline_info_banner">Гэта самыя апошнія допісы людзей, якія выкарыстоўваюць той жа сервер Mastodon, што і вы.</string>
<string name="dismiss">Адхіліць</string>
<string name="see_new_posts">Паказаць новыя допісы</string>
<string name="load_missing_posts">Загрузіць адсутныя допісы</string>
<string name="follow_back">Падпісацца ў адказ</string>
<string name="button_follow_pending">Чакаюць</string>
<string name="follows_you">Падпісаны(-а) на вас</string>
<string name="manually_approves_followers">Уручную пацвярджае падпісчыкаў</string>
<string name="current_account">Бягучы ўліковы запіс</string>
<string name="log_out_account">Выйсці з %s</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="few">%,d падпісчыка</item>
<item quantity="many">%,d падпісчыкаў</item>
<item quantity="other">%,d падпісчыкаў</item>
</plurals>
<plurals name="x_following">
<item quantity="one">%,d падпіска</item>
<item quantity="few">%,d падпіскі</item>
<item quantity="many">%,d падпісак</item>
<item quantity="other">%,d падпісак</item>
</plurals>
<plurals name="x_favorites">
<item quantity="one">%,d абраны</item>
<item quantity="few">%,d абраныя</item>
<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="post_info_reblogs">Пашырэнні</string>
<string name="post_info_favorites">Абраныя</string>
<string name="edit_history">Гісторыя рэдагавання</string>
<string name="last_edit_at_x">Апошняе рэдагаванне %s</string>
<string name="time_just_now">толькі што</string>
<plurals name="x_seconds_ago">
<item quantity="one">%d секунду таму</item>
<item quantity="few">%d секунды таму</item>
<item quantity="many">%d секунд таму</item>
<item quantity="other">%d секунд таму</item>
</plurals>
<plurals name="x_minutes_ago">
<item quantity="one">%d хвіліну таму</item>
<item quantity="few">%d хвіліны таму</item>
<item quantity="many">%d хвілін таму</item>
<item quantity="other">%d хвілін таму</item>
</plurals>
<string name="edited_timestamp">адрэдагавана %s</string>
<string name="edit_original_post">Зыходны допіс</string>
<string name="edit_text_edited">Тэкст адрэдагавана</string>
<string name="edit_spoiler_added">Папярэджанне аб змесціве дададзена</string>
<string name="edit_spoiler_edited">Папярэджанне аб змесціве адрэдагавана</string>
<string name="edit_spoiler_removed">Папярэджанне аб змесціве выдалена</string>
<string name="edit_poll_added">Апытанне дададзена</string>
<string name="edit_poll_edited">Апытанне адрэдагавана</string>
<string name="edit_poll_removed">Апытанне выдалена</string>
<string name="edit_media_added">Медыя дададзены</string>
<string name="edit_media_removed">Медыя выдалены</string>
<string name="edit_media_reordered">Медыя пераўпарадкаваны</string>
<string name="edit_marked_sensitive">Пазначаны як далікатны</string>
<string name="edit_marked_not_sensitive">Пазначаны як неадчувальны</string>
<string name="edit_multiple_changed">Допіс адрэдагавана</string>
<string name="edit">Рэдагаваць</string>
<string name="discard_changes">Скасаваць змены?</string>
<string name="upload_failed">Не ўдалося запампаваць</string>
<string name="file_size_bytes">%d байтаў</string>
<string name="file_size_kb">%.2f КБ</string>
<string name="file_size_mb">%.2f МБ</string>
<string name="file_size_gb">%.2f ГБ</string>
<string name="file_upload_progress">%1$s з %2$s</string>
<string name="file_upload_time_remaining">Засталося %s</string>
<string name="upload_error_connection_lost">Ваша прылада страціла злучэнне з Інтэрнэтам</string>
<string name="upload_processing">Апрацоўка…</string>
<!-- %s is version like 1.2.3 -->
<string name="update_available">Mastodon для Android %s гатовы да спампоўкі.</string>
<!-- %s is version like 1.2.3 -->
<string name="update_ready">Mastodon для Android %s спампаваны і гатовы да ўсталявання.</string>
<!-- %s is file size -->
<string name="download_update">Спампаваць (%s)</string>
<string name="install_update">Усталяваць</string>
<string name="i_agree">Я згодны</string>
<string name="empty_list">Гэты ліст пусты</string>
<string name="instance_signup_closed">Гэты сервер не прымае новыя рэгістрацыі.</string>
<string name="text_copied">Скапіявана ў буфер абмену</string>
<string name="add_bookmark">Закладка</string>
<string name="remove_bookmark">Выдаліць закладку</string>
<string name="bookmarks">Закладкі</string>
<string name="your_favorites">Вашы абраныя</string>
<string name="login_title">З вяртаннем</string>
<string name="login_subtitle">Увайдзіце з дапамогай сервера, на якім вы стварылі свой уліковы запіс.</string>
<string name="server_url">URL-адрас сервера</string>
<string name="welcome_page1_text">Уявіце, што ў вас ёсць адрас электроннай пошты, які заканчваецца на @example.com.\n\nВы па-ранейшаму можаце адпраўляць і атрымліваць электронныя лісты ад каго захочаце, нават калі іх электронная пошта заканчваецца на @gmail.com, @icloud.com або @example.com.</string>
<string name="welcome_page2_title">Mastodon такі.</string>
<string name="welcome_page2_text">Ваш ідэнтыфікатар можа быць @gothgirl654@example.social, але вы ўсё яшчэ можаце падпісвацца, пашыраць і перапісвацца з @fallout5ever@example.online.</string>
<string name="welcome_page3_title">Як выбраць сервер?</string>
<string name="welcome_page3_text">Розныя людзі выбіраюць розныя серверы па розных прычынах. art.example з\'яўляецца выдатным месцам для мастакоў, у той час як glasgow.example можа быць добрым выбарам для шатландцаў.\n\nВы не памыліцеся ні з адным з нашых рэкамендаваных сервераў, так што незалежна ад таго, які вы выбераце (або калі ўведзяце ваш уласны ў радку пошуку сервера), вы нідзе нічога не прапусціце.</string>
<string name="server_filter_any_language">Любая мова</string>
<string name="server_filter_region_europe">Еўропа</string>
<string name="server_filter_region_north_america">Паўночная Амерыка</string>
<string name="server_filter_region_south_america">Паўднёвая Амерыка</string>
<string name="server_filter_region_africa">Афрыка</string>
<string name="server_filter_region_asia">Азія</string>
<string name="server_filter_region_oceania">Акіянія</string>
<!-- %s is server domain -->
<!-- Shown in a progress dialog when you tap "follow all" -->
<!-- %1$s is server domain, %2$s is email domain. You can reorder these placeholders to fit your language better. -->
<string name="signup_username_taken">Гэта імя карыстальніка занята.</string>
</resources>

View File

@@ -1,3 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
</resources>
<string name="sk_app_name">Megalodon</string>
<string name="sk_delete_and_redraft">Выдаліць і паправіць</string>
<string name="sk_confirm_delete_and_redraft_title">Выдаліць і паправіць допіс</string>
<string name="sk_pin_post">Замацаваць у профілі</string>
<string name="sk_confirm_pin_post_title">Замацаваць допіс у профілі</string>
<string name="sk_confirm_pin_post">Вы хочаце замацаваць гэты допіс у сваім профілі\?</string>
<string name="sk_pinning">Замацаванне допісу…</string>
<string name="sk_confirm_unpin_post_title">Адмацаваць допіс ад профілю</string>
<string name="sk_unpinning">Адмацаванне допісу…</string>
<string name="sk_image_description">Апісанне выявы</string>
<string name="sk_visibility_unlisted">Прыхаваны</string>
<string name="sk_settings_show_replies">Паказваць адказы</string>
<string name="sk_settings_show_boosts">Паказаць пашырэнні</string>
<string name="sk_pinned_posts">Замацавана</string>
<string name="sk_confirm_delete_and_redraft">Вы ўпэўненыя, што жадаеце выдаліць і паправіць гэты допіс\?</string>
<string name="sk_unpin_post">Адмацаваць ад профілю</string>
<string name="sk_confirm_unpin_post">Вы ўпэўненыя, што жадаеце адмацаваць гэты допіс\?</string>
</resources>

View File

@@ -1,45 +1,100 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="get_started">শুরু করুন</string>
<string name="get_started">অ্যাকাউন্ট তৈরি করুন</string>
<string name="already_have_account">আমার আগে থেকেই একটি অ্যাকাউন্ট আছে</string>
<string name="log_in">লগ ইন করুন</string>
<string name="next">পরবর্তী</string>
<string name="next">এরপর</string>
<string name="error">কোনো ত্রুটি ঘটেছে</string>
<string name="ok">ঠিক আছে</string>
<string name="preparing_auth">প্রমাণীকরণের জন্য প্রস্তুত হচ্ছে...</string>
<string name="notifications">বিজ্ঞপ্তি</string>
<string name="user_followed_you">অনুসরণ করে</string>
<string name="user_sent_follow_request">অনুসরণের জন্য অনুরোধ পাঠানো হয়েছে</string>
<string name="user_favorited">পোস্টটি পছন্দ করা হয়েছে</string>
<string name="in_reply_to">%s কে উত্তর দিন</string>
<string name="notifications">নোটিফিকেশন</string>
<string name="user_followed_you">আপনাকে ফলো করেছে</string>
<string name="user_sent_follow_request">ফলো করার জন্য অনুরোধ পাঠানো হয়েছে</string>
<string name="user_favorited">আপনার পোস্টটি পছন্দ করেছেন</string>
<string name="notification_boosted">আপনার পোস্টের প্রচার করা হয়েছে</string>
<string name="poll_ended">ভোট শেষ</string>
<string name="time_seconds">%d সে.</string>
<string name="time_minutes">%d মি.</string>
<string name="time_hours">%d ঘ.</string>
<string name="time_days">%d দি.</string>
<string name="share_toot_title">শেয়ার করুন</string>
<string name="settings">সেটিংস</string>
<string name="cancel">বাতিল করুন</string>
<plurals name="posts">
<item quantity="one">পোস্ট</item>
<item quantity="other">পোস্টগুলো</item>
</plurals>
<string name="posts">পোস্টগুলো</string>
<string name="share_user">%s -কে শেয়ার করুন</string>
<string name="mute_user">%s -কে মিউট করুন</string>
<string name="unmute_user">%s -কে আনমিউট করুন</string>
<string name="block_user">%s -কে ব্লক করুন</string>
<string name="unblock_user">%s -কে আনব্লক করুন</string>
<string name="report_user">%s -এর নামে রিপোর্ট করুন</string>
<string name="block_domain">%s -কে ব্লক করুন</string>
<string name="unblock_domain">%s -কে আনব্লক করুন</string>
<plurals name="x_posts">
<item quantity="one">%,d টি পোস্ট</item>
<item quantity="other">%,d টি পোস্ট</item>
</plurals>
<string name="profile_joined">যুক্ত হয়েছেন</string>
<string name="done">হয়ে গেছে</string>
<string name="loading">লোড হচ্ছে…</string>
<string name="saving">সেভ হচ্ছে…</string>
<plurals name="x_minutes">
<item quantity="one">%d মিনিট</item>
<item quantity="other">%d মিনিট</item>
</plurals>
<plurals name="x_hours">
<item quantity="one">%d ঘণ্টা</item>
<item quantity="other">%d ঘণ্টা</item>
</plurals>
<plurals name="x_days">
<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_title">অ্যাকাউন্টটি মিউট করুন</string>
<string name="do_mute">মিউট করুন</string>
<string name="confirm_unmute_title">অ্যাকাউন্ট টি আনমিউট করুন</string>
<string name="confirm_unmute">%s আনমিউট নিশ্চিত করুন</string>
<string name="do_unmute">মিউট</string>
<string name="confirm_block_title">অ্যাকাউন্ট টি ব্লক করুন</string>
<string name="confirm_block_title">অ্যাকাউন্টটি ব্লক করুন</string>
<string name="confirm_block_domain_title">ওয়েবসাইটটি ব্লক করুন</string>
<string name="do_block">ব্লক করুন</string>
<string name="confirm_unblock_title">অ্যাকাউন্ট আনব্লক করুন</string>
<string name="confirm_unblock">%s আনব্লক নিশ্চিত করুন</string>
<string name="do_unblock">আনব্লক করুন</string>
<string name="button_muted">মিউট করা হয়েছে</string>
<string name="tap_to_reveal">ট্যাপ করে দেখুন</string>
<string name="button_blocked">ব্লক করা আছে</string>
<string name="action_vote">ভোট</string>
<string name="tap_to_reveal">দেখার জন্য টিপুন</string>
<string name="delete">মুছে ফেলুন</string>
<string name="confirm_delete_title">পোস্ট মুছে ফেলুন</string>
<string name="confirm_delete">আপনি কি এই পোস্টটি মুছে ফেলতে চান?</string>
<string name="deleting">মুছে ফেলা হচ্ছে</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="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 jon ব্যক্তিরা বলছেন</item>
</plurals>
<!-- %s is the email address -->
<!-- translators: %,d is a valid placeholder, it formats the number with locale-dependent grouping separators -->
<!-- %s is version like 1.2.3 -->
<!-- %s is version like 1.2.3 -->
<!-- %s is file size -->
<!-- %s is server domain -->
<!-- Shown in a progress dialog when you tap "follow all" -->
<!-- %1$s is server domain, %2$s is email domain. You can reorder these placeholders to fit your language better. -->
</resources>

View File

@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="get_started">Kreni</string>
<string name="log_in">Loguj se</string>
<string name="next">Dalje</string>
<string name="error">Greška</string>
@@ -129,14 +128,7 @@
<string name="report_personal_title">Ne želite ovo vidjeti?</string>
<string name="report_personal_subtitle">Kada vidite nešto nepoželjno na Mastodon-u, možete blokirati odredjeni profil.</string>
<string name="back">Nazad</string>
<string name="instance_rules_title">Važna pravila</string>
<string name="instance_rules_subtitle">Pogledajte pravila koja je odredila %s administracija.</string>
<string name="signup_title">Krenimo sa postavkama na %s</string>
<string name="edit_photo">uredi</string>
<string name="display_name">vaše ime</string>
<string name="username">korisničko ime</string>
<string name="email">email</string>
<string name="password">lozinka</string>
<string name="password_note">Koristite velika slova, brojeve i oznake da bi osigurali lozinku.</string>
<string name="category_academia">Akademija</string>
<string name="category_activism">Aktivizam</string>
@@ -151,8 +143,7 @@
<string name="category_music">Muzika</string>
<string name="category_regional">Regionalno</string>
<string name="category_tech">Tehnika</string>
<string name="confirm_email_title">Zadnja stvar</string>
<string name="confirm_email_subtitle">Kliknite na link koji smo vam poslali u email-u da se verifikujete.</string>
<!-- %s is the email address -->
<string name="resend">Ponovo poslato</string>
<string name="open_email_app">Otvori email</string>
<string name="resent_email">Email za verifikaciju poslat</string>
@@ -238,7 +229,6 @@
<string name="unfollowed_user">Ne pratite %s</string>
<string name="followed_user">Sada pratite %s</string>
<string name="open_in_browser">Otvori u pregledniku</string>
<string name="signup_reason">zašto se želite pridružiti?</string>
<string name="signup_reason_note">Ovo nam pomaže prilikom odobravanja vašeg zahtjeva.</string>
<string name="clear">Briši</string>
<string name="profile_header">Slika zaglavlja</string>
@@ -255,4 +245,7 @@
<!-- %s is version like 1.2.3 -->
<!-- %s is version like 1.2.3 -->
<!-- %s is file size -->
<!-- %s is server domain -->
<!-- Shown in a progress dialog when you tap "follow all" -->
<!-- %1$s is server domain, %2$s is email domain. You can reorder these placeholders to fit your language better. -->
</resources>

View File

@@ -1,9 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="get_started">Comença</string>
<string name="get_started">Crea un compte</string>
<string name="already_have_account">Ja tinc un compte</string>
<string name="log_in">Inicia sessió</string>
<string name="next">Següent</string>
<string name="loading_instance">S\'està recuperant la informació del servidor…</string>
<string name="error">Error</string>
<string name="not_a_mastodon_instance">Sembla que %s no és un servidor de Mastodon.</string>
<string name="ok">D\'acord</string>
<string name="preparing_auth">Preparant l\'autenticació…</string>
<string name="finishing_auth">Finalitzant l\'autenticació…</string>
@@ -170,15 +173,15 @@
<string name="back">Enrere</string>
<string name="instance_catalog_title">Mastodon està format per usuaris de diferents servidors.</string>
<string name="instance_catalog_subtitle">Tria un servidor en funció dels teus interessos, regió o un de propòsit general. Seguiràs podent connectar amb tothom, independentment del servidor.</string>
<string name="search_communities">Cerca servidors o introdueix l\'URL</string>
<string name="instance_rules_title">Algunes normes bàsiques</string>
<string name="instance_rules_subtitle">Pren un minut per revisar les normes establertes i aplicades pels administradors de %s.</string>
<string name="signup_title">Deixa que et posem en marxa a %s</string>
<string name="search_communities">Nom del servidor o URL</string>
<string name="instance_rules_title">Normes del servidor</string>
<string name="signup_title">Crear un compte</string>
<string name="edit_photo">edita</string>
<string name="display_name">nom visible</string>
<string name="username">nom d\'usuari</string>
<string name="email">correu electrònic</string>
<string name="password">contrasenya</string>
<string name="display_name">Nom</string>
<string name="username">Nom d\'usuari</string>
<string name="email">Correu electrònic</string>
<string name="password">Contrasenya</string>
<string name="confirm_password">Confirmar contrasenya</string>
<string name="password_note">Inclou lletres majúscules, caràcters especials i números per augmentar la seguretat de la teva contrasenya.</string>
<string name="category_academia">Acadèmic</string>
<string name="category_activism">Activisme</string>
@@ -193,8 +196,9 @@
<string name="category_music">Música</string>
<string name="category_regional">Regional</string>
<string name="category_tech">Tecnologia</string>
<string name="confirm_email_title">Una última cosa</string>
<string name="confirm_email_subtitle">Toca l\'enllaç del correu electrònic que t\'hem enviat per a confirmar el teu compte.</string>
<string name="confirm_email_title">Comprova la teva safata d\'entrada</string>
<!-- %s is the email address -->
<string name="confirm_email_didnt_get">No has rebut l\'enllaç?</string>
<string name="resend">Reenvia</string>
<string name="open_email_app">Obre l\'aplicació de correu</string>
<string name="resent_email">Sha enviat el correu electrònic de confirmació</string>
@@ -282,7 +286,6 @@
<string name="open_in_browser">Obre al navegador</string>
<string name="hide_boosts_from_user">Amaga els impulsos de %s</string>
<string name="show_boosts_from_user">Mostra els impulsos de %s</string>
<string name="signup_reason">per què vols unir-te?</string>
<string name="signup_reason_note">Això ens ajudarà a revisar la teva petició.</string>
<string name="clear">Esborra</string>
<string name="profile_header">Imatge de capçalera</string>
@@ -375,8 +378,6 @@
<!-- %s is file size -->
<string name="download_update">Baixa (%s)</string>
<string name="install_update">Instal·la</string>
<string name="privacy_policy_title">Mastodon i la teva privacitat</string>
<string name="privacy_policy_subtitle">Tot i que l\'aplicació Mastodon no recull cap dada, el servidor mitjançant el qual et registres pot tenir una política diferent. Pren un minut per revisar i acceptar la política de privadesa de l\'aplicació Mastodon i la política de privadesa del teu servidor.</string>
<string name="i_agree">Dacord</string>
<string name="empty_list">Aquesta llista està buida</string>
<string name="instance_signup_closed">Aquest servidor no accepta nous registres.</string>
@@ -384,4 +385,11 @@
<string name="add_bookmark">Marca</string>
<string name="remove_bookmark">Elimina el marcador</string>
<string name="bookmarks">Marcadors</string>
<string name="your_favorites">Els meus preferits</string>
<string name="login_title">Hola de nou</string>
<string name="login_subtitle">Inicia sessió amb el servidor on vas crear el compte.</string>
<string name="server_url">URL del servidor</string>
<!-- %s is server domain -->
<!-- Shown in a progress dialog when you tap "follow all" -->
<!-- %1$s is server domain, %2$s is email domain. You can reorder these placeholders to fit your language better. -->
</resources>

View File

@@ -142,4 +142,115 @@
<string name="sk_your_lists">Llistes</string>
<string name="sk_loading_fediverse_resource_title">Buscant-ho al Fedivers</string>
<string name="sk_loading_resource_on_instance_title">Buscant-ho a %s</string>
<string name="sk_pin_timeline">Fixa la línia de temps</string>
<string name="sk_unpin_timeline">No fixes la línia de temps</string>
<string name="sk_remove">Elimina</string>
<string name="sk_timeline_icon">Icona</string>
<string name="sk_unpinned_timeline">S\'ha deixat de fixar de l\'inici</string>
<string name="sk_pinned_timeline">S\'ha fixat a l\'inici</string>
<string name="sk_icon_heart">Cor</string>
<string name="sk_icon_star">Estrela</string>
<string name="sk_list">Llista</string>
<string name="sk_icon_dog">Gos</string>
<string name="sk_recent_searches_placeholder">Escriviu per a cercar</string>
<string name="sk_remove_follower">Elimina el seguidor</string>
<string name="sk_remove_follower_confirm">Voleu eliminar %s com a seguidor bloquejant-lo i desbloquejant-lo immediatament\?</string>
<string name="sk_do_remove_follower">Elimina</string>
<string name="sk_remove_follower_success">S\'ha eliminat el seguidor correctament</string>
<string name="sk_changelog">Registre de canvis</string>
<string name="sk_alt_text_missing_title">Falta el text alternatiu</string>
<string name="sk_alt_text_missing">Almenys un adjunt no conté cap descripció.</string>
<string name="sk_publish_anyway">Publica igualment</string>
<string name="sk_settings_disable_alt_text_reminder">Desactiva el recordatori per a afegir text alternatiu</string>
<string name="sk_notify_posts_info_banner">Si activeu les notificacions de publicacions d\'algunes persones, les seues publicacions noves apareixeran ací.</string>
<string name="sk_timelines">Línies de temps</string>
<string name="sk_timeline_posts">Publicacions</string>
<string name="sk_timelines_add">Afegeix</string>
<string name="sk_timeline">Línia de temps</string>
<string name="sk_icon_city">Ciutat</string>
<string name="sk_icon_cat">Gat</string>
<string name="sk_icon_rabbit">Conill</string>
<string name="sk_icon_turtle">Tortuga</string>
<string name="sk_icon_balloon">Globus</string>
<string name="sk_icon_image">Imatge</string>
<string name="sk_icon_bot">Bot</string>
<string name="sk_icon_language">Llengua</string>
<string name="sk_icon_location">Ubicació</string>
<string name="sk_icon_megaphone">Megàfon</string>
<string name="sk_icon_microphone">Micròfon</string>
<string name="sk_icon_microscope">Microscopi</string>
<string name="sk_icon_keyboard">Piano</string>
<string name="sk_icon_coffee">Café</string>
<string name="sk_icon_news">Notícies</string>
<string name="sk_icon_pi">Pi</string>
<string name="sk_icon_color_palette">Paleta de color</string>
<string name="sk_icon_academic_cap">Barret acadèmic</string>
<string name="sk_icon_tag">Etiqueta</string>
<string name="sk_icon_weather">Temps</string>
<string name="sk_icon_games">Jocs</string>
<string name="sk_icon_code">Codi</string>
<string name="sk_icon_light_bulb">Bombeta</string>
<string name="sk_icon_train">Tren</string>
<string name="sk_icon_leaves">Fulles</string>
<string name="sk_icon_sport">Esport</string>
<string name="sk_icon_aperture">Obertura</string>
<string name="sk_icon_music">Música</string>
<string name="sk_icon_people">Persones</string>
<string name="sk_icon_health">Salut</string>
<string name="sk_icon_important">Important</string>
<string name="sk_icon_chat">Xat</string>
<string name="sk_icon_shield">Escut</string>
<string name="sk_icon_book">Llibre</string>
<string name="sk_icon_bicycle">Bicicleta</string>
<string name="sk_icon_map">Mapa</string>
<string name="sk_icon_backpack">Motxilla</string>
<string name="sk_icon_briefcase">Maleta</string>
<string name="sk_icon_fire">Foc</string>
<string name="sk_icon_bug">Marieta</string>
<string name="sk_icon_pizza">Pizza</string>
<string name="sk_icon_stethoscope">Estetoscopi</string>
<string name="sk_icon_gavel">Martell</string>
<string name="sk_attach_file">Adjunta un fitxer</string>
<string name="sk_icon_headphones">Auriculars</string>
<string name="sk_icon_human">Humà</string>
<string name="sk_icon_globe">Globus</string>
<string name="sk_edit_timeline">Edita la línia de temps</string>
<string name="sk_icon_pin">Xinxeta</string>
<string name="sk_edit_timelines">Edita les línies de temps</string>
<string name="sk_alt_button">ALT</string>
<string name="sk_post_edited">editat</string>
<string name="sk_notification_type_update">Publicacions editades</string>
<string name="sk_notify_update">Edita una publicació impulsada</string>
<string name="sk_no_results">Sense resultats</string>
<string name="sk_no_alt_text">Ni hi ha cap text alternatiu</string>
<string name="sk_settings_show_alt_indicator">Indicador dels textos alternatius</string>
<string name="sk_save_draft_message">Voleu desar els canvis en l\'esborrany o publicar-lo ara\?</string>
<string name="sk_updater_enable_pre_releases">Activa els prellançaments</string>
<string name="sk_separator">·</string>
<string name="sk_instance_features">Característiques de la instància</string>
<string name="sk_settings_support_local_only">El servidor suporta publicacions locals</string>
<string name="sk_settings_glitch_instance">Mode només local de Glitch</string>
<string name="sk_settings_glitch_mode_explanation">Activeu-ho si la vostra instància d\'inici s\'executa a Glitch. No és necessari per a Hometown o Akkoma.</string>
<string name="sk_inline_local_only">local</string>
<string name="sk_inline_direct">només gent mencionada</string>
<string name="sk_settings_local_only_explanation">La vostra instància d\'inici ha d\'admetre la publicació local perquè això funcione. La majoria de versions modificades de Mastodon sí que ho fan, però Mastodon no.</string>
<string name="sk_sign_ups">Usuaris registrats</string>
<string name="sk_local_only">Només instància local</string>
<string name="sk_settings_see_new_posts_button">Botó de «Publicacions noves»</string>
<string name="sk_notify_poll_results">Resultats de l\'enquesta</string>
<string name="sk_settings_server_version">Versió del servidor: %s</string>
<string name="sk_hashtag">Etiqueta</string>
<string name="sk_icon_laugh">Riure</string>
<string name="sk_icon_clapper_board">Claqueta</string>
<string name="sk_icon_math_formula">Fòrmula matemàtica</string>
<string name="sk_searching">Cercant…</string>
<string name="sk_save_draft">Voleu desar l\'esborrany\?</string>
<string name="sk_settings_show_no_alt_indicator">Indicador dels textos alternatius inexistents</string>
<string name="sk_settings_prefix_reply_cw_with_re">Afegeix «re:» a les respostes als avisos de contingut</string>
<string name="sk_filtered">Filtrat: %s</string>
<string name="sk_expand">Amplia</string>
<string name="sk_collapse">Tanca</string>
<string name="sk_settings_collapse_long_posts">Acurta les publicacions llargues</string>
<string name="sk_signed_up">registrat</string>
<string name="sk_spectator_mode">Mode d\'espectador</string>
</resources>

View File

@@ -1,9 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="get_started">Začínáme</string>
<string name="get_started">Vytvořit účet</string>
<string name="already_have_account">Již mám účet</string>
<string name="log_in">Přihlásit se</string>
<string name="next">Další</string>
<string name="loading_instance">Načítání informací o serveru…</string>
<string name="error">Chyba</string>
<string name="not_a_mastodon_instance">%s se nezdá být Mastodon serverem.</string>
<string name="ok">OK</string>
<string name="preparing_auth">Příprava na autentizaci…</string>
<string name="finishing_auth">Dokončení autentizace…</string>
@@ -198,15 +201,7 @@
<string name="back">Zpět</string>
<string name="instance_catalog_title">Mastodon tvoří uživatelé z různých serverů.</string>
<string name="instance_catalog_subtitle">Vyberte si server podle na svých zájmů, regionu nebo obecného účelu. Stále se můžete spojit se všemi bez ohledu na server.</string>
<string name="search_communities">Hledat server nebo zadat URL</string>
<string name="instance_rules_title">Některá základní pravidla</string>
<string name="instance_rules_subtitle">Udělejte si chvíli čas a zkontrolujte pravidla, která admini %s nastavili a vynucují.</string>
<string name="signup_title">Pojďme si nastavit %s</string>
<string name="edit_photo">upravit</string>
<string name="display_name">zobrazované jméno</string>
<string name="username">uživatelské jméno</string>
<string name="email">e-mail</string>
<string name="password">heslo</string>
<string name="password_note">Použijte velká písmena, speciální znaky a čísla, abyste zvýšili sílu hesla.</string>
<string name="category_academia">Akademická sféra</string>
<string name="category_activism">Aktivismus</string>
@@ -221,8 +216,7 @@
<string name="category_music">Hudba</string>
<string name="category_regional">Regionální</string>
<string name="category_tech">Technologie</string>
<string name="confirm_email_title">Ještě jedna věc</string>
<string name="confirm_email_subtitle">Klepněte na odkaz, který jsme vám poslali e-mailem, abyste účet ověřili.</string>
<!-- %s is the email address -->
<string name="resend">Poslat znovu</string>
<string name="open_email_app">Otevřít e-mailovou aplikaci</string>
<string name="resent_email">Potvrzující e-mail byl odeslán</string>
@@ -312,7 +306,6 @@
<string name="open_in_browser">Otevřít v prohlížeči</string>
<string name="hide_boosts_from_user">Skrýt boosty od %s</string>
<string name="show_boosts_from_user">Zobrazit boosty od %s</string>
<string name="signup_reason">proč se chcete zaregistrovat?</string>
<string name="signup_reason_note">Toto nám pomůže posoudit vaši žádost.</string>
<string name="clear">Vyčistit</string>
<string name="profile_header">Obrázek v záhlaví</string>
@@ -417,8 +410,6 @@
<!-- %s is file size -->
<string name="download_update">Stáhnout (%s)</string>
<string name="install_update">Instalovat</string>
<string name="privacy_policy_title">Mastodon a vaše soukromí</string>
<string name="privacy_policy_subtitle">Ačkoliv aplikace Mastodon neshromažďuje žádná data, server, na kterém se registrujete, může mít jiné zásady. Věnujte minutu kontrole a odsouhlasení zásad soukromí aplikace Mastodon a vašeho serveru.</string>
<string name="i_agree">Souhlasím</string>
<string name="empty_list">Tento seznam je prázdný</string>
<string name="instance_signup_closed">Tento server nepřijímá nové registrace.</string>
@@ -427,4 +418,15 @@
<string name="remove_bookmark">Odstranit ze záložek</string>
<string name="bookmarks">Záložky</string>
<string name="your_favorites">Vaše oblíbení</string>
<string name="login_title">Vítejte zpět</string>
<string name="login_subtitle">Přihlaste se pomocí serveru, kde jste vytvořili svůj účet.</string>
<string name="server_url">URL serveru</string>
<string name="welcome_page1_text">Představte si, že máte e-mailovou adresu, která končí @example.com.\n\nStále můžete od kohokoliv odesílat a přijímat e-maily, i když jejich e-mail končí na @gmail.com nebo @icloud.com nebo @example.com.</string>
<string name="welcome_page2_title">Takový je Mastodon.</string>
<string name="welcome_page2_text">Vaše uživatelské jméno může být @gothgirl654@example.social, ale stále můžete sledovat, boostovat a chatovat s @fallout5ever@example.online.</string>
<string name="welcome_page3_title">Jak si vybrat server?</string>
<string name="welcome_page3_text">Různí lidé si vybírají různé servery z různých důvodů. Art.example je skvělým místem pro umělce, zatímco glasgow.example může být dobrou volbou pro Skoty.\n\nS žádným z našich doporučených serverů nemůžete udělat chybu, takže bez ohledu na to, který z nich si vyberete (nebo pokud zadáte svůj vlastní do vyhledávacího řádku serveru), nikde neprohloupíte.</string>
<!-- %s is server domain -->
<!-- Shown in a progress dialog when you tap "follow all" -->
<!-- %1$s is server domain, %2$s is email domain. You can reorder these placeholders to fit your language better. -->
</resources>

View File

@@ -146,14 +146,14 @@
<string name="sk_compose_no_schedule">Peidiwch ag amserlennu</string>
<string name="sk_settings_reduce_motion">Lleihau mudiant mewn animeiddiadau</string>
<string name="sk_delete_list_confirm">Ydych chi\'n sicr eich bod eisiau dileu\'r rhestr %s\?</string>
<string name="sk_recent_searches_placeholder">Teipiwch rhywbeth i ddechrau chwilio</string>
<string name="sk_recent_searches_placeholder">Teipiwch i ddechrau chwilio</string>
<string name="sk_remove_follower_confirm">Tynnu %s fel dilynwr drwy eu rhwystro a\'i ddadrwystro ar unwaith\?</string>
<string name="sk_edit_timelines">Golygu ffrydiau</string>
<string name="sk_edit_timelines">Golygu ffrydiau</string>
<string name="sk_alt_button">ALT</string>
<string name="sk_alt_text_missing_title">Dim testun alt</string>
<string name="sk_alt_text_missing">O leiaf un atodiad heb ei ddisgrifio.</string>
<string name="sk_publish_anyway">Cyhoeddi beth bynnag</string>
<string name="sk_settings_disable_alt_text_reminder">Analluogi nodyn atgoffa testun alt</string>
<string name="sk_settings_disable_alt_text_reminder">Analluogi nodyn atgoffa i ychwanegu testun alt</string>
<string name="sk_post_edited">Wedi\'i olygu</string>
<string name="sk_notification_type_update">Negeseuon wedi\'u golygu</string>
<string name="sk_notify_posts_info_banner">Os ydych chi\'n galluogi hysbysiadau post ar gyfer rhai pobl, bydd eu postiadau newydd yn ymddangos yma.</string>
@@ -226,4 +226,28 @@
<string name="sk_icon_pin">Pin</string>
<string name="sk_notify_update">Golygu neges wedi\'i hybu</string>
<string name="sk_icon_bicycle">Beic</string>
<string name="sk_searching">Chwilio…</string>
<string name="sk_no_results">Dim atebion</string>
<string name="sk_save_draft">Cadw drafft\?</string>
<string name="sk_save_draft_message">Dych chi eisiau cadw eich newidiadau i\'r drafft hwn neu gyhoeddi fe nawr\?</string>
<string name="sk_no_alt_text">Dim testun alt ar gael</string>
<string name="sk_settings_show_alt_indicator">Dangosydd ar gyfer testunau alt</string>
<string name="sk_settings_show_no_alt_indicator">Dangosydd ar gyfer testunau alt ar goll</string>
<string name="sk_updater_enable_pre_releases">Galluogi rhag-rhyddhad</string>
<string name="sk_inline_local_only">Lleol yn unig</string>
<string name="sk_inline_direct">crybwylliadau yn unig</string>
<string name="sk_separator">·</string>
<string name="sk_instance_features">Nodweddion y gweinydd</string>
<string name="sk_settings_support_local_only">Gweinydd yn cefnogi postio yn lleol yn unig</string>
<string name="sk_settings_local_only_explanation">Rhaid i\'ch gweinydd gefnogi postio yn lleol yn unig er mwyn i hyn weithio. Mae\'r rhan fwyaf o fersiynau wedi\'u haddasu o Mastodon yn gwneud hynny, ond nid yw Mastodon yn gwneud hynny.</string>
<string name="sk_settings_glitch_instance">Modd lleol yn unig Glitch</string>
<string name="sk_settings_glitch_mode_explanation">Galluogi hyn os yw eich gweinydd yn rhedeg ar Glitch. Nid oes ei angen ar gyfer Hometown neu Akkoma.</string>
<string name="sk_signed_up">Wedi ymuno</string>
<string name="sk_reported">Wedi\'i adrodd</string>
<string name="sk_sign_ups">Defnyddwyr yn ymuno</string>
<string name="sk_new_reports">Adroddiadau newydd</string>
<string name="sk_local_only">Gweinydd lleol yn unig</string>
<string name="sk_settings_see_new_posts_button">Botwm \"Gweld negeseuon newydd\"</string>
<string name="sk_settings_server_version">Fersiwn y gweinydd: %s</string>
<string name="sk_notify_poll_results">Canlyniadau\'r pôl</string>
</resources>

View File

@@ -0,0 +1,427 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="get_started">Opret konto</string>
<string name="already_have_account">Jeg har allerede en konto</string>
<string name="log_in">Log ind</string>
<string name="next">Næste</string>
<string name="loading_instance">Henter serverinfo…</string>
<string name="error">Fejl</string>
<string name="not_a_mastodon_instance">%s ser ikke ud 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 boostede</string>
<string name="in_reply_to">Som svar til %s</string>
<string name="notifications">Meddelelser</string>
<string name="user_followed_you">begyndte at følge dig</string>
<string name="user_sent_follow_request">sendte dig en følgeanmodning</string>
<string name="user_favorited">favoritmarkerede dit indlæg</string>
<string name="notification_boosted">boostede dit indlæg</string>
<string name="poll_ended">afstemning afsluttet</string>
<string name="time_seconds">%ds</string>
<string name="time_minutes">%d m</string>
<string name="time_hours">%d t</string>
<string name="time_days">%d d</string>
<string name="share_toot_title">Del</string>
<string name="settings">Indstillinger</string>
<string name="publish">Offentliggør</string>
<string name="discard_draft">Kassér kladde?</string>
<string name="discard">Kassér</string>
<string name="cancel">Fortryd</string>
<plurals name="followers">
<item quantity="one">følger</item>
<item quantity="other">følgere</item>
</plurals>
<plurals name="following">
<item quantity="one">følger</item>
<item quantity="other">følger</item>
</plurals>
<plurals name="posts">
<item quantity="one">indlæg</item>
<item quantity="other">indlæg</item>
</plurals>
<string name="posts">Indlæg</string>
<string name="posts_and_replies">Indlæg og svar</string>
<string name="media">Medier</string>
<string name="profile_about">Om</string>
<string name="button_follow">Følg</string>
<string name="button_following">Følger</string>
<string name="edit_profile">Redigér profil</string>
<string name="mention_user">Nævn %s</string>
<string name="share_user">Del %s</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>
<plurals name="x_posts">
<item quantity="one">%,d indlæg</item>
<item quantity="other">%,d indlæg</item>
</plurals>
<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_content">Indhold</string>
<string name="saving">Gemmer…</string>
<string name="post_from_user">Indlæg fra %s</string>
<string name="poll_option_hint">Valgmulighed %d</string>
<plurals name="x_minutes">
<item quantity="one">%d minut</item>
<item quantity="other">%d minutter</item>
</plurals>
<plurals name="x_hours">
<item quantity="one">%d time</item>
<item quantity="other">%d timer</item>
</plurals>
<plurals name="x_days">
<item quantity="one">%d dag</item>
<item quantity="other">%d dage</item>
</plurals>
<string name="compose_poll_duration">Varighed: %s</string>
<plurals name="x_seconds_left">
<item quantity="one">%d sekund tilbage</item>
<item quantity="other">%d sekunder tilbage</item>
</plurals>
<plurals name="x_minutes_left">
<item quantity="one">%d minut tilbage</item>
<item quantity="other">%d minutter tilbage</item>
</plurals>
<plurals name="x_hours_left">
<item quantity="one">%d time tilbage</item>
<item quantity="other">%d timer tilbage</item>
</plurals>
<plurals name="x_days_left">
<item quantity="one">%d dag tilbage</item>
<item quantity="other">%d dage tilbage</item>
</plurals>
<plurals name="x_voters">
<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="button_muted">Skjult (muted)</string>
<string name="button_blocked">Blokeret</string>
<string name="action_vote">Stem</string>
<string name="tap_to_reveal">Tryk for at vise</string>
<string name="delete">Slet</string>
<string name="confirm_delete_title">Slet indlæg</string>
<string name="confirm_delete">Er du sikker på, at du vil slette dette indlæg?</string>
<string name="deleting">Sletter…</string>
<string name="notification_channel_audio_player">Afspilning af lyd</string>
<string name="play">Afspil</string>
<string name="pause">Sæt på pause</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">Alle</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>
</plurals>
<plurals name="discussed_x_times">
<item quantity="one">Diskuteret %d gang</item>
<item quantity="other">Diskuteret %d gange</item>
</plurals>
<string name="report_title">Indberet %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 en passende grund</string>
<string name="report_reason_personal">Jeg 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">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 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">Det er noget andet</string>
<string name="report_reason_other_subtitle">Problemet passer ikke ind i andre kategorier</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_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="report_sent_title">Tak for anmeldelsen, der vil blive set nærmere på dette.</string>
<string name="report_sent_subtitle">Mens dette gennemgås, kan du selv bortfiltrere indlæg fra %s.</string>
<string name="unfollow_user">Følg ikke længere %s</string>
<string name="unfollow">Følg ikke længere</string>
<string name="mute_user_explain">Du vil ikke se den pågældendes indlæg eller boosts i din tidslinje. Vedkommende vil ikke få besked om dæmpningen.</string>
<string name="block_user_explain">Vedkommende vil ikke længere kunne følge dig eller se dine indlæg, men vedkommende kan se blokeringen.</string>
<string name="report_personal_title">Ønsker du ikke at se dette?</string>
<string name="report_personal_subtitle">Når du ser noget, du ikke kan lide på Mastodon, kan du fjerne personen fra din tidslinje.</string>
<string name="back">Tilbage</string>
<string name="instance_catalog_title">Mastodon er skabt af brugere på forskellige servere.</string>
<string name="instance_catalog_subtitle">Vælg en server baseret på dine interesser, region eller et generelt formål. Du kan stadig forbinde med alle, uanset serveren.</string>
<string name="search_communities">Server-navn 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="signup_title">Opret konto</string>
<string name="edit_photo">rediger</string>
<string name="display_name">Navn</string>
<string name="username">Brugernavn</string>
<string name="email">Email</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="category_academia">Forskning og højere uddannelser</string>
<string name="category_activism">Aktivisme</string>
<string name="category_all">Alt</string>
<string name="category_art">Kunst</string>
<string name="category_food">Mad</string>
<string name="category_furry">Pelsdyr</string>
<string name="category_games">Spil</string>
<string name="category_general">Generelt</string>
<string name="category_journalism">Journalistik</string>
<string name="category_lgbt">LGBT</string>
<string name="category_music">Musik</string>
<string name="category_regional">Regionalt</string>
<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å linket vi sendte dig for at bekræfte %s. Vi venter lige her.</string>
<string name="confirm_email_didnt_get">Fandt du ikke et 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="compose_hint">Skriv hvad du har på hjerte</string>
<string name="content_warning">Indholdsadvarsel</string>
<string name="add_image_description">Tilføj billede beskrivelse…</string>
<string name="retry_upload">Forsøg upload igen</string>
<string name="edit_image">Rediger billede</string>
<string name="save">Gem</string>
<string name="add_alt_text">Tilføj alternativ tekst</string>
<string name="alt_text_subtitle">Alternativ tekst beskriver dine fotos af hensyn til svagtseende og blinde. Nøjs med at skrive lige nøjagtig så detaljeret at sammenhængen er tydelig.</string>
<string name="alt_text_hint">f.eks. en hund, der ser sig mistænkeligt omkring med sammenknebne øjne på kameraet.</string>
<string name="visibility_public">Offentlig</string>
<string name="visibility_followers_only">Kun følgere</string>
<string name="visibility_private">Kun personer jeg nævner</string>
<string name="search_all">Alle</string>
<string name="search_people">Personer</string>
<string name="recent_searches">Seneste søgninger</string>
<string name="step_x_of_n">Trin %1$d af %2$d</string>
<string name="skip">Spring over</string>
<string name="notification_type_follow">Nye følgere</string>
<string name="notification_type_favorite">Favoritmarkeringer</string>
<string name="notification_type_reblog">Boosts</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>
<plurals name="cant_add_more_than_x_attachments">
<item quantity="one">Du kan ikke tilføje mere end %d medievedhæftning</item>
<item quantity="other">Du kan ikke tilføje mere end %d medievedhæftninger</item>
</plurals>
<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="settings_theme">Visuel fremtræden</string>
<string name="theme_auto">Automatisk</string>
<string name="theme_light">Lys</string>
<string name="theme_dark">Mørk</string>
<string name="theme_true_black">Sand sort tilstand</string>
<string name="settings_behavior">Opførsel</string>
<string name="settings_gif">Spil animerede avatarer og emoji</string>
<string name="settings_custom_tabs">Benyt in-app browser</string>
<string name="settings_notifications">Meddelelser</string>
<string name="notify_me_when">Giv mig besked når</string>
<string name="notify_anyone">hvem som helst</string>
<string name="notify_follower">en følger</string>
<string name="notify_followed">nogen jeg følger</string>
<string name="notify_none">ingen</string>
<string name="notify_favorites">Favoritmarkerede mit indlæg</string>
<string name="notify_follow">Følger mig</string>
<string name="notify_reblog">Booster mit indlæg</string>
<string name="notify_mention">Nævner mig</string>
<string name="settings_boring">Den kedelige zone</string>
<string name="settings_account">Kontoindstillinger</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_spicy">Den krydrede zone</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">Er du sikker på, at du vil logge ud?</string>
<string name="sensitive_content">Følsomt indhold</string>
<string name="sensitive_content_explain">Forfatteren markerede dette medie som følsomt. Tryk for at afsløre.</string>
<string name="media_hidden">Tryk for at vise</string>
<string name="avatar_description">Gå til %ss profil</string>
<string name="more_options">Flere muligheder</string>
<string name="reveal_content">Afslør indhold</string>
<string name="hide_content">Skjul indhold</string>
<string name="new_post">Nyt indlæg</string>
<string name="button_reply">Svar</string>
<string name="button_reblog">Boost</string>
<string name="button_favorite">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>
<string name="add_poll">Tilføj en afstemning</string>
<string name="emoji">Emoji</string>
<string name="post_visibility">Synlighed af indlæg</string>
<string name="home_timeline">Hjemmetidslinje</string>
<string name="my_profile">Min profil</string>
<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="open_in_browser">Åbn i browser</string>
<string name="hide_boosts_from_user">Skjul boosts fra %s</string>
<string name="show_boosts_from_user">Vis boosts fra %s</string>
<string name="signup_reason">Hvorfor ønsker du at tilmelde dig?</string>
<string name="signup_reason_note">Dette hjælper os med at vurdere din ansøgning.</string>
<string name="clear">Ryd</string>
<string name="profile_header">Overskriftsbillede</string>
<string name="profile_picture">Profilbillede</string>
<string name="reorder">Omarranger</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>
<string name="open_settings">Åbn Indstillinger</string>
<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">Der er ingen app til at udføre denne handling</string>
<string name="local_timeline">Fællesskab</string>
<string name="trending_posts_info_banner">Dette er indlæg der tiltrækker sig opmærksomhed i dit hjørne af Mastodon.</string>
<string name="trending_hashtags_info_banner">Dette er hashtags der tiltrækker sig opmærksomhed i dit hjørne af Mastodon.</string>
<string name="trending_links_info_banner">Dette er de nyheder, der deles mest i dit hjørne af Mastodon.</string>
<string name="local_timeline_info_banner">Disse er de seneste indlæg af medlemmer på din Mastodon-server.</string>
<string name="dismiss">Afvis</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>
<string name="button_follow_pending">Afventer</string>
<string name="follows_you">Følger dig</string>
<string name="manually_approves_followers">Godkender følgere manuelt</string>
<string name="current_account">Nuværende konto</string>
<string name="log_out_account">Log %s ud</string>
<!-- translators: %,d is a valid placeholder, it formats the number with locale-dependent grouping separators -->
<plurals name="x_followers">
<item quantity="one">%,d følger</item>
<item quantity="other">%,d følgere</item>
</plurals>
<plurals name="x_following">
<item quantity="one">%,d følger</item>
<item quantity="other">%,d følgere</item>
</plurals>
<plurals name="x_favorites">
<item quantity="one">%,d favoritmarkering</item>
<item quantity="other">%,d favoritmarkeringer</item>
</plurals>
<plurals name="x_reblogs">
<item quantity="one">%,d boost</item>
<item quantity="other">%,d boosts</item>
</plurals>
<string name="timestamp_via_app">%1$s via %2$s</string>
<string name="time_now">nu</string>
<string name="post_info_reblogs">Boosts</string>
<string name="post_info_favorites">Favoritmarkeringer</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>
<plurals name="x_seconds_ago">
<item quantity="one">%d sekund siden</item>
<item quantity="other">%d sekunder siden</item>
</plurals>
<plurals name="x_minutes_ago">
<item quantity="one">%d minut siden</item>
<item quantity="other">%d minutter siden</item>
</plurals>
<string name="edited_timestamp">redigerede %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_removed">Indholdsadvarsel fjernet</string>
<string name="edit_poll_added">Afstemning tilføjet</string>
<string name="edit_poll_edited">Afstemning redigeret</string>
<string name="edit_poll_removed">Afstemning fjernet</string>
<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_multiple_changed">Indlæg redigeret</string>
<string name="edit">Rediger</string>
<string name="discard_changes">Fortryd æ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>
<string name="file_size_mb">%.2f MB</string>
<string name="file_size_gb">%.2f GB</string>
<string name="file_upload_progress">%1$s af %2$s</string>
<string name="file_upload_time_remaining">%s tilbage</string>
<string name="upload_error_connection_lost">Din enhed har mistet forbindelsen til internettet</string>
<string name="upload_processing">Behandler…</string>
<!-- %s is version like 1.2.3 -->
<string name="update_available">Mastodon til Android %s er klar til download.</string>
<!-- %s is version like 1.2.3 -->
<string name="update_ready">Mastodon til Android %s er downloadet og klar til at installere.</string>
<!-- %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="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="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="server_url">Server-URL</string>
<string name="welcome_page1_title">Hvad er Mastodon?</string>
<string name="welcome_page1_text">Det svarer til at du har en e-mailadresse, der slutter med @eksempel.dk.\n\nAlligevel kan du stadig både sende og modtage e-mails fra alle, selv om deres e-mail ender på @gmail.com eller @icloud.com eller @eksempel.dk.</string>
<string name="welcome_page2_title">Mastodon er ligesådan.</string>
<string name="welcome_page2_text">Dit brugernavn kan være @goth654@eksempel.social, men du kan stadig følge, booste, og chatte med @denanden@eksempel.online.</string>
<string name="welcome_page3_title">Hvordan vælger jeg en server?</string>
<string name="welcome_page3_text">Forskellige mennesker vælger forskellige servere af mange forskellige grunde. art.example er et godt sted for kunstnere, mens glasgow.example kan være et godt pluk for skotter.\n\nDu kan ikke gå galt i byen med en af vores anbefalingsservere, så uanset hvilken du vælger (eller hvis du indtaster din egen i serversøgelinjen), vil du aldrig gå glip af noget nogen steder.</string>
<string name="signup_random_server_explain">Vi vælger en server baseret på dit sprog, hvis du fortsætter uden at foretage et valg.</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>
<string name="server_filter_any_signup_speed">Hvilken som helst tilmeldingshastghed</string>
<string name="server_filter_region_europe">Europa</string>
<string name="server_filter_region_north_america">Nordamerika</string>
<string name="server_filter_region_south_america">Sydamerika</string>
<string name="server_filter_region_africa">Afrika</string>
<string name="server_filter_region_asia">Asien</string>
<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">Adgangskoderne er ikke ens</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>
<string name="profile_setup_subtitle">Du kan altid afslutte dette senere i fanen Profil.</string>
<string name="profile_setup_explanation">Du kan tilføje op til fire profilfelter til lige, hvad du ønsker. Placering, links, pronomener — du bestemmer.</string>
<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>
<!-- %s is server domain -->
<!-- Shown in a progress dialog when you tap "follow all" -->
<!-- %1$s is server domain, %2$s is email domain. You can reorder these placeholders to fit your language better. -->
</resources>

View File

@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="get_started">Loslegen</string>
<string name="get_started">Konto erstellen</string>
<string name="already_have_account">Ich habe bereits ein Konto</string>
<string name="log_in">Anmelden</string>
<string name="next">Weiter</string>
<string name="loading_instance">Server-Informationen werden abgerufen …</string>
@@ -172,22 +173,23 @@
<string name="back">Zurück</string>
<string name="instance_catalog_title">Mastodon wird von Benutzer*innen auf verschiedenen Servern gestaltet.</string>
<string name="instance_catalog_subtitle">Wähle einen Server basierend auf deinen Interessen oder deiner Region oder einfach einen allgemeinen. Du kannst trotzdem mit jedem interagieren, egal auf welchem Server.</string>
<string name="search_communities">Server suchen oder Link eingeben</string>
<string name="instance_rules_title">Serverregeln</string>
<string name="instance_rules_subtitle">Nimm dir eine Minute Zeit und lies die Serverregeln von %s durch.</string>
<string name="signup_title">Okay, lass uns mit %s anfangen</string>
<string name="search_communities">Servername oder -adresse</string>
<string name="instance_rules_title">Server-Regeln</string>
<string name="instance_rules_subtitle">Mit dem Fortfahren erklärst du dich damit einverstanden, die folgenden Regeln zu befolgen, die von den %s-Moderatoren aufgestellt und umgesetzt werden.</string>
<string name="signup_title">Konto erstellen</string>
<string name="edit_photo">bearbeiten</string>
<string name="display_name">Anzeigename</string>
<string name="display_name">Name</string>
<string name="username">Profilname</string>
<string name="email">E-Mail</string>
<string name="password">Passwort</string>
<string name="confirm_password">Passwort bestätigen</string>
<string name="password_note">Verwende Großbuchstaben, Sonderzeichen und Zahlen, um deine Passwortstärke zu erhöhen.</string>
<string name="category_academia">Bildung</string>
<string name="category_activism">Bürgerbeteiligung</string>
<string name="category_all">Alle</string>
<string name="category_art">Kunst</string>
<string name="category_food">Essen</string>
<string name="category_furry">Furries</string>
<string name="category_furry">Furry</string>
<string name="category_games">Spiele</string>
<string name="category_general">Allgemein</string>
<string name="category_journalism">Journalismus</string>
@@ -195,12 +197,14 @@
<string name="category_music">Musik</string>
<string name="category_regional">Regional</string>
<string name="category_tech">Technik</string>
<string name="confirm_email_title">Eine letzte Sache noch</string>
<string name="confirm_email_subtitle">Tippe auf den Link, den wir dir per E-Mail geschickt haben, um dein Konto zu verifizieren.</string>
<string name="confirm_email_title">Überprüfe deinen Posteingang</string>
<!-- %s is the email address -->
<string name="confirm_email_subtitle">Klicke auf den Link, den wir dir geschickt haben, um %s zu bestätigen. Wir warten hier auf dich.</string>
<string name="confirm_email_didnt_get">Kein Link erhalten?</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">Was gibt\'s Neues? Was geht dir durch den Kopf? Was liegt dir am Herzen?</string>
<string name="compose_hint">Was gibt\'s Neues?</string>
<string name="content_warning">Inhaltswarnung</string>
<string name="add_image_description">Bildbeschreibung hinzufügen </string>
<string name="retry_upload">Erneut hochladen</string>
@@ -284,7 +288,7 @@
<string name="open_in_browser">Im Browser öffnen</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">Weshalb möchtest du beitreten?</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>
<string name="clear">Leeren</string>
<string name="profile_header">Titelbild</string>
@@ -377,17 +381,54 @@
<!-- %s is file size -->
<string name="download_update">(%s) herunterladen</string>
<string name="install_update">Installieren</string>
<string name="privacy_policy_title">Mastodon und der Schutz deiner Daten</string>
<string name="privacy_policy_subtitle">Obwohl die Mastodon-App keinerlei Daten sammelt, könnte der Server, über den du dich registriert hast, eine abweichende Datenschutzerklärung haben. Nimm dir einen Moment Zeit, um die Datenschutzbestimmungen sowohl der App als auch deiner Mastodon-Instanz durchzulesen und sie zu akzeptieren.</string>
<string name="privacy_policy_title">Deine Privatsphäre</string>
<string name="privacy_policy_subtitle">Auch wenn die Mastodon-App keine Daten sammelt, kann der Server, über den du dich anmeldest, eine andere Richtlinie haben.\n\nWenn du mit der Richtlinie für %s nicht einverstanden bist, kannst du zurückkehren und einen anderen Server wählen.</string>
<string name="i_agree">Ich stimme zu</string>
<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 setzen</string>
<string name="add_bookmark">Lesezeichen hinzufügen</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="welcome_page1_title">Was ist Mastodon?</string>
<string name="welcome_page1_text">Angenommen, du hast eine E-Mail-Adresse, die mit @example.com endet.\n\nDu kannst immer noch E-Mails von allen empfangen, auch wenn deren E-Mail-Adresse mit @gmail.com, @icloud.com oder @example.com endet.</string>
<string name="welcome_page2_title">Mastodon ist genau so.</string>
<string name="welcome_page2_text">Dein Nutzer*innenname könnte @GothGirl654@example.social sein, aber du kannst trotzdem @fallout5ever@example.online folgen, deren Beiträge teilen und dich mit der Person unterhalten.</string>
<string name="welcome_page3_title">Wie wähle ich einen Server aus?</string>
<string name="welcome_page3_text">Unterschiedliche Menschen wählen aus verschiedenen Gründen unterschiedliche Server. art.example ist ein toller Ort für Künstler*innen, während glasgow.example eine gute Wahl für Schott*innen sein könnte.\n\nWähle nach Möglichkeit einen kleinen Server aus, mit dessen Regeln du dich wohl fühlst und der dir vertrauenswürdig erscheint (über die Server-Suchleiste kannst du dich direkt mit dem Server deines Vertrauens verbinden).</string>
<string name="signup_random_server_explain">Wenn du ohne Auswahl fortfährst, wählen wir einen Server in deiner Sprache aus.</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>
<string name="server_filter_any_signup_speed">Beliebige Registrierungsdauer</string>
<string name="server_filter_region_europe">Europa</string>
<string name="server_filter_region_north_america">Nordamerika</string>
<string name="server_filter_region_south_america">Südamerika</string>
<string name="server_filter_region_africa">Afrika</string>
<string name="server_filter_region_asia">Asien</string>
<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>
<string name="profile_setup_subtitle">Du kannst dies jederzeit später auf dem Profil-Reiter vervollständigen.</string>
<string name="profile_setup_explanation">Du kannst bis zu vier Profilfelder für alles, was du möchtest, hinzufügen. Standort, Links, Pronomen - deiner Fantasie sind hier keine Grenzen gesetzt.</string>
<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 keine persönlichen Daten.</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 einen anderen oder &lt;a&gt;wähle einen anderen Server&lt;/a&gt;.</string>
<string name="signup_username_taken">Dieser Benutzername ist bereits vergeben.</string>
</resources>

View File

@@ -250,4 +250,21 @@
<string name="sk_settings_see_new_posts_button">“Neue Beiträge anzeigen”-Button</string>
<string name="sk_settings_server_version">Server-Version: %s</string>
<string name="sk_notify_poll_results">Umfrage-Ergebnisse</string>
<string name="sk_settings_prefix_reply_cw_with_re">CWs beim Antworten “re:” voranstellen</string>
<string name="sk_filtered">Gefiltert: %s</string>
<string name="sk_expand">Erweitern</string>
<string name="sk_collapse">Einklappen</string>
<string name="sk_settings_collapse_long_posts">Sehr lange Beiträge einklappen</string>
<string name="sk_unfinished_attachments">Anhänge richtig stellen\?</string>
<string name="sk_settings_hide_interaction">Interaktions-Buttons verstecken</string>
<string name="sk_unfinished_attachments_message">Einige Anhänge sind nicht fertig hochgeladen.</string>
<string name="sk_followed_as">Mit %s gefolgt</string>
<string name="sk_settings_hide_fab">Verfassen-Button automatisch ausblenden</string>
<string name="sk_follow_as">Mit anderem Account folgen</string>
<string name="sk_in_reply">Als Antwort</string>
<string name="sk_settings_reply_visibility">Antwort-Sichtbarkeit</string>
<string name="sk_settings_reply_visibility_all">Alle Antworten</string>
<string name="sk_settings_reply_visibility_following">Antworten auf Follows</string>
<string name="sk_settings_reply_visibility_self">Antworten an mich</string>
<string name="sk_quoting_user">Zitiere %s</string>
</resources>

View File

@@ -1,7 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- %s is the email address -->
<!-- translators: %,d is a valid placeholder, it formats the number with locale-dependent grouping separators -->
<!-- %s is version like 1.2.3 -->
<!-- %s is version like 1.2.3 -->
<!-- %s is file size -->
<!-- %s is server domain -->
<!-- Shown in a progress dialog when you tap "follow all" -->
<!-- %1$s is server domain, %2$s is email domain. You can reorder these placeholders to fit your language better. -->
</resources>

View File

@@ -1,28 +1,31 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="get_started">Empezar</string>
<string name="get_started">Crear cuenta</string>
<string name="already_have_account">Ya tengo una cuenta</string>
<string name="log_in">Iniciar sesión</string>
<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">Terminando autenticación…</string>
<string name="user_boosted">%s reblogueado</string>
<string name="finishing_auth">Finalizando autenticación…</string>
<string name="user_boosted">%s reblogueó</string>
<string name="in_reply_to">En respuesta a %s</string>
<string name="notifications">Notificaciones</string>
<string name="user_followed_you">te siguió</string>
<string name="user_sent_follow_request">te quiere seguir</string>
<string name="user_favorited">ha marcado como favorita tu publicación</string>
<string name="notification_boosted">ha reblogueado tu publicación</string>
<string name="user_followed_you">ha empezado a seguirte</string>
<string name="user_sent_follow_request">te envió una solicitud de seguimiento</string>
<string name="user_favorited">marcó como favorita</string>
<string name="notification_boosted">reblogueó</string>
<string name="poll_ended">encuesta finalizada</string>
<string name="time_seconds">%ds</string>
<string name="time_minutes">%dm</string>
<string name="time_hours">%dh</string>
<string name="time_days">%dd</string>
<string name="share_toot_title">Compartir</string>
<string name="settings">Configuración</string>
<string name="settings">Ajustes</string>
<string name="publish">Publicar</string>
<string name="discard_draft">¿Descartar el borrador?</string>
<string name="discard_draft">¿Descartar borrador?</string>
<string name="discard">Descartar</string>
<string name="cancel">Cancelar</string>
<plurals name="followers">
@@ -38,19 +41,19 @@
<item quantity="other">publicaciones</item>
</plurals>
<string name="posts">Publicaciones</string>
<string name="posts_and_replies">Publicaciones y Respuestas</string>
<string name="posts_and_replies">Publicaciones y respuestas</string>
<string name="media">Multimedia</string>
<string name="profile_about">Acerca de</string>
<string name="button_follow">Seguir</string>
<string name="button_following">Siguiendo</string>
<string name="edit_profile">Editar Perfil</string>
<string name="edit_profile">Editar perfil</string>
<string name="mention_user">Mencionar a %s</string>
<string name="share_user">Compartir %s</string>
<string name="mute_user">Silenciar a %s</string>
<string name="unmute_user">Des-silenciar a %s</string>
<string name="unmute_user">Dejar de silenciar a %s</string>
<string name="block_user">Bloquear a %s</string>
<string name="unblock_user">Desbloquear a %s</string>
<string name="report_user">Reportar a %s</string>
<string name="report_user">Denunciar a %s</string>
<string name="block_domain">Bloquear %s</string>
<string name="unblock_domain">Desbloquear %s</string>
<plurals name="x_posts">
@@ -100,11 +103,11 @@
</plurals>
<string name="poll_closed">Cerrado</string>
<string name="confirm_mute_title">Silenciar cuenta</string>
<string name="confirm_mute">Confirmar para silenciar %s</string>
<string name="confirm_mute">Confirmar para silenciar a %s</string>
<string name="do_mute">Silenciar</string>
<string name="confirm_unmute_title">Des-silenciar cuenta</string>
<string name="confirm_unmute">Confirmar para des-silenciar a %s</string>
<string name="do_unmute">Des-silenciar</string>
<string name="confirm_unmute_title">Dejar de silenciar cuenta</string>
<string name="confirm_unmute">Confirmar para dejar de silenciar a %s</string>
<string name="do_unmute">Dejar de silenciar</string>
<string name="confirm_block_title">Bloquear cuenta</string>
<string name="confirm_block_domain_title">Bloquear dominio</string>
<string name="confirm_block">Confirmar para bloquear a %s</string>
@@ -119,7 +122,7 @@
<string name="tap_to_reveal">Toca para mostrar</string>
<string name="delete">Eliminar</string>
<string name="confirm_delete_title">Eliminar publicación</string>
<string name="confirm_delete">¿Estás seguro de que deseas eliminar esta 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>
@@ -127,7 +130,7 @@
<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">Hashtags</string>
<string name="hashtags">Etiquetas</string>
<string name="news">Noticias</string>
<string name="for_you">Para ti</string>
<string name="all_notifications">Todas</string>
@@ -140,13 +143,13 @@
<item quantity="one">Debatido %d vez</item>
<item quantity="other">Debatido %d veces</item>
</plurals>
<string name="report_title">Reportar %s</string>
<string name="report_title">Denunciar a %s</string>
<string name="report_choose_reason">¿Cuál es el problema con esta publicación?</string>
<string name="report_choose_reason_account">¿Cuál es el problema con %s?</string>
<string name="report_choose_reason_subtitle">Selecciona la mejor opción</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">Es publicidad no deseada</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>
@@ -154,31 +157,32 @@
<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>
<string name="report_choose_posts">¿Hay alguna publicación que respalde este informe?</string>
<string name="report_choose_posts">¿Hay alguna publicación que respalde esta denuncia?</string>
<string name="report_choose_posts_subtitle">Selecciona todos los que correspondan</string>
<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 el informe</string>
<string name="report_sent_title">Gracias por informar, estudiaremos el caso.</string>
<string name="sending_report">Enviando denuncia</string>
<string name="report_sent_title">Gracias por denunciar; estudiaremos el caso.</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 publicaciones o reblogueos en tu línea temporal. No sabrán que han sido silenciados.</string>
<string name="block_user_explain">Ya no podrán seguir o ver tus mensajes, pero pueden ver si han sido bloqueados.</string>
<string name="report_personal_title">¿No quieres ver esto?</string>
<string name="report_personal_subtitle">Cuando veas algo que no te gusta en Mastodon, puedes quitar a la persona de tu experiencia.</string>
<string name="report_personal_subtitle">Cuando vea en Mastodon algo que no le agrada, puede sacar a la persona de su experiencia.</string>
<string name="back">Atrás</string>
<string name="instance_catalog_title">Mastodon está hecho por usuarios den diferentes servidores.</string>
<string name="instance_catalog_subtitle">Selecciona un servidor basado en tus intereses, región o un propósito general. Aun así puedes conectarte con todo el mundo, sin importar el servidor.</string>
<string name="search_communities">Busca servidores o introduce la URL</string>
<string name="instance_rules_title">Algunas reglas básicas</string>
<string name="instance_rules_subtitle">Tómate un minuto para revisar las reglas establecidas y aplicadas por las personas que administran %s.</string>
<string name="signup_title">Deja que te preparemos en %s</string>
<string name="search_communities">Nombre del servidor o URL</string>
<string name="instance_rules_title">Reglas del servidor</string>
<string name="instance_rules_subtitle">Al continuar, aceptas seguir las siguientes reglas establecidas y aplicadas por los %s moderadores.</string>
<string name="signup_title">Crear cuenta</string>
<string name="edit_photo">editar</string>
<string name="display_name">nombre a mostrar</string>
<string name="username">nombre de usuario</string>
<string name="email">correo electrónico</string>
<string name="password">contraseña</string>
<string name="display_name">Nombre</string>
<string name="username">Nombre de usuario</string>
<string name="email">Correo electrónico</string>
<string name="password">Contraseña</string>
<string name="confirm_password">Confirmar contraseña</string>
<string name="password_note">Incluye letras mayúsculas, caracteres especiales y números para aumentar la fuerza de tu contraseña.</string>
<string name="category_academia">Académico</string>
<string name="category_activism">Activismo</string>
@@ -193,8 +197,10 @@
<string name="category_music">Música</string>
<string name="category_regional">Regional</string>
<string name="category_tech">Tecnología</string>
<string name="confirm_email_title">Una última cosa</string>
<string name="confirm_email_subtitle">Toque el enlace que le enviamos por correo electrónico para verificar su cuenta.</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>
@@ -282,7 +288,7 @@
<string name="open_in_browser">Abrir en el navegador</string>
<string name="hide_boosts_from_user">Ocultar reblogueos de %s</string>
<string name="show_boosts_from_user">Mostrar reblogueos de %s</string>
<string name="signup_reason">¿por qué quieres unirte?</string>
<string name="signup_reason">¿Por qué quieres unirte?</string>
<string name="signup_reason_note">Esto nos ayudará a revisar su solicitud.</string>
<string name="clear">Borrar</string>
<string name="profile_header">Imagen de cabecera</string>
@@ -375,7 +381,54 @@
<!-- %s is file size -->
<string name="download_update">Descargar (%s)</string>
<string name="install_update">Instalar</string>
<string name="privacy_policy_title">Mastodon y su privacidad</string>
<string name="privacy_policy_subtitle">Aunque la aplicación de Mastodon no recolecta ningún dato, el servidor al que se registre puede tener una política diferente. Tómese un minuto para revisar y aceptar las políticas de privacidad de la aplicación de Mastodon y las políticas de privacidad de su servidor.</string>
<string name="privacy_policy_title">Tu privacidad</string>
<string name="privacy_policy_subtitle">Aunque la aplicación Mastodon no recoge ningún dato, el servidor al que se registra puede tener una política diferente.\n\nSi no está de acuerdo con la política para %s, puede volver atrás y elegir un servidor diferente.</string>
<string name="i_agree">Acepto</string>
<string name="empty_list">Esta lista está vacía</string>
<string name="instance_signup_closed">Este servidor no acepta altas nuevas.</string>
<string name="text_copied">Copiado en el portapapeles</string>
<string name="add_bookmark">Marcadores</string>
<string name="remove_bookmark">Eliminar marcador</string>
<string name="bookmarks">Marcadores</string>
<string name="your_favorites">Sus favoritos</string>
<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="welcome_page1_title">¿Qué es Mastodon?</string>
<string name="welcome_page1_text">Imagina que tienes una dirección de correo electrónico que termina con @ejemplo.com.\n\nPuedes enviar y recibir correos electrónicos de cualquier persona, incluso si su correo electrónico termina en @gmail.com o @icloud.com o @ejemplo.com.</string>
<string name="welcome_page2_title">Mastodon es parecido.</string>
<string name="welcome_page2_text">Tu cuenta puede ser @gothgirl654@example.social, pero puedes seguir, rebloguear, y chatear con @fallout5ever@example.online.</string>
<string name="welcome_page3_title">¿Cómo elijo un servidor?</string>
<string name="welcome_page3_text">Diferentes personas eligen diferentes servidores por diferentes motivos. Por ejemplo, art.example es un buen lugar para artistas, mientras que madrid.example puede ser una buena elección para los madrileños.\n\nNo te equivocarás con ninguno de nuestros servidores recomendados, por lo que independientemente del que escojas (o si introduces tu propio servidor en la barra de búsqueda), no te perderás ni una en ningún lugar.</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>
<string name="server_filter_any_signup_speed">Cualquier velocidad de registro</string>
<string name="server_filter_region_europe">Europa</string>
<string name="server_filter_region_north_america">Norteamérica</string>
<string name="server_filter_region_south_america">Suramérica</string>
<string name="server_filter_region_africa">África</string>
<string name="server_filter_region_asia">Asia</string>
<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>
<string name="profile_setup_subtitle">Siempre puedes completar esto más tarde en la pestaña Perfil.</string>
<string name="profile_setup_explanation">Puedes añadir hasta cuatro campos de perfil para todo lo que quieras. Ubicación, enlaces, pronombres — el cielo es el límite.</string>
<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">TL;DR: No recogemos o 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 desde %2$s. Prueba uno diferente o &lt;a&gt;elige un servidor diferente&lt;/a&gt;.</string>
<string name="signup_username_taken">Este nombre de usuario ya existe.</string>
</resources>

View File

@@ -3,27 +3,27 @@
<string name="sk_pinned_posts">Anclado</string>
<string name="sk_delete_and_redraft">Eliminar y editar</string>
<string name="sk_confirm_delete_and_redraft_title">Eliminar y editar publicación</string>
<string name="sk_confirm_delete_and_redraft">¿Confirma que quiere eliminar y volver a editar esta publicación\?</string>
<string name="sk_pin_post">Anclar en perfil</string>
<string name="sk_confirm_pin_post_title">Anclar publicación en perfil</string>
<string name="sk_confirm_pin_post">¿Quiere anclar la publicación en su perfil\?</string>
<string name="sk_confirm_delete_and_redraft">¿Seguro que quieres eliminar y editar esta publicación\?</string>
<string name="sk_pin_post">Anclar en el perfil</string>
<string name="sk_confirm_pin_post_title">Anclar publicación en el perfil</string>
<string name="sk_confirm_pin_post">¿Quieres anclar la publicación en tu perfil\?</string>
<string name="sk_pinning">Anclando publicación…</string>
<string name="sk_unpin_post">Desanclar del perfil</string>
<string name="sk_confirm_unpin_post_title">Desanclar publicación del perfil</string>
<string name="sk_confirm_unpin_post">¿Confirma que quiere desanclar esta publicación\?</string>
<string name="sk_confirm_unpin_post">¿Seguro que quieres desanclar esta publicación\?</string>
<string name="sk_app_name">Megalodon</string>
<string name="sk_unpinning">Desanclando publicación…</string>
<string name="sk_image_description">Descripción de la imagen</string>
<string name="sk_visibility_unlisted">Descatalogada</string>
<string name="sk_visibility_unlisted">No listada</string>
<string name="sk_settings_show_replies">Mostrar respuestas</string>
<string name="sk_settings_show_boosts">Mostrar impulsos</string>
<string name="sk_settings_load_new_posts">Cargar publicaciones nuevas automáticamente</string>
<string name="sk_settings_show_interaction_counts">Mostrar recuentos de interacciones</string>
<string name="sk_mark_media_as_sensitive">Marcar medio como delicado</string>
<string name="sk_user_post_notifications_on">Activadas las notificaciones de posts para %s</string>
<string name="sk_user_post_notifications_off">Desactivadas las notificaciones de posts para %s</string>
<string name="sk_settings_show_interaction_counts">Mostrar recuento de interacciones</string>
<string name="sk_mark_media_as_sensitive">Marcar contenido como delicado</string>
<string name="sk_user_post_notifications_on">Activadas las notificaciones de publicaciones para %s</string>
<string name="sk_user_post_notifications_off">Desactivadas las notificaciones de publicaciones para %s</string>
<string name="sk_federated_timeline">Federación</string>
<string name="sk_federated_timeline_info_banner">Estas son las publicaciones más recientes de las personas de su federación.</string>
<string name="sk_federated_timeline_info_banner">Estas son las publicaciones más recientes de las personas de tu federación.</string>
<string name="sk_update_available">Megalodon %s está listo para descargar.</string>
<string name="sk_update_ready">Megalodon %s se ha descargado y está listo para instalarse.</string>
<string name="sk_check_for_update">Buscar actualizaciones</string>
@@ -34,113 +34,113 @@
<string name="sk_reject_follow_request">Rechazar solicitud de seguimiento</string>
<string name="sk_lists_with_user">Listas con %s</string>
<string name="sk_settings_always_reveal_content_warnings">Mostrar siempre advertencias de contenido</string>
<string name="sk_disable_marquee">Desactivar desplazamiento de texto en barras del título</string>
<string name="sk_disable_marquee">Desactivar desplazamiento de texto los encabezados</string>
<string name="sk_settings_contribute">Contribuir a Megalodon</string>
<string name="sk_settings_show_federated_timeline">Mostrar cronología federada</string>
<string name="sk_settings_app_version">Megalodon v%1$s (%2$d)</string>
<string name="sk_notification_type_status">Publicaciones</string>
<string name="sk_notify_posts">Publicar notificaciones</string>
<string name="sk_settings_color_palette">Colores para los temas</string>
<string name="sk_notify_posts">Notificaciones de publicación</string>
<string name="sk_settings_color_palette">Color del tema</string>
<string name="sk_color_palette_pink">Rosa</string>
<string name="sk_color_palette_purple">Violeta</string>
<string name="sk_color_palette_green">Verde</string>
<string name="sk_color_palette_blue">Azul</string>
<string name="sk_color_palette_brown">Marrón</string>
<string name="sk_color_palette_yellow">Amarillo</string>
<string name="sk_poll_allow_multiple">Permitir respuesta múltiple</string>
<string name="sk_poll_allow_multiple">Permitir varias respuestas</string>
<string name="sk_translate_post">Traducir</string>
<string name="sk_translate_show_original">Mostrar original</string>
<string name="sk_translated_using">Traducido mediante %s</string>
<string name="sk_post_language">Idioma: %s</string>
<string name="sk_available_languages">Idiomas disponibles</string>
<string name="sk_language_name">%s (%s)</string>
<string name="sk_confirm_clear_recent_languages">¿Confirma que quiere vaciar sus idiomas usados recientemente\?</string>
<string name="sk_clear_recent_languages">Vaciar idiomas usados recientemente</string>
<string name="sk_welcome_text">¡El tiburón te saluda! Para empezar, introduzca a continuación el nombre del dominio de su instancia de origen.</string>
<string name="sk_example_domain">example.social</string>
<string name="sk_welcome_title">¡Bienvenidos!</string>
<string name="sk_confirm_clear_recent_languages">¿Seguro que quieres borrar los idiomas usados recientemente\?</string>
<string name="sk_clear_recent_languages">Borrar idiomas usados recientemente</string>
<string name="sk_welcome_text">¡El tiburón te saluda! Para empezar, introduce a continuación el nombre del dominio de tu instancia.</string>
<string name="sk_example_domain">ejemplo.social</string>
<string name="sk_welcome_title">¡Bienvenido!</string>
<string name="sk_color_palette_material3">Sistema</string>
<string name="sk_color_palette_red">Rojo</string>
<string name="sk_settings_profile">Configurar el perfil</string>
<string name="sk_settings_posting">Preferencias de publicación</string>
<string name="sk_settings_filters">Configurar los filtros</string>
<string name="sk_settings_auth">Ajustes de seguridad</string>
<string name="sk_settings_rules">Reglas</string>
<string name="sk_settings_rules">Normas</string>
<string name="sk_settings_about">Acerca de la aplicación</string>
<string name="sk_settings_donate">Donar</string>
<string name="sk_tabs_disable_swipe">Deshabilitar el deslizamiento entre pestañas</string>
<string name="sk_delete_notification">Eliminar la notificación</string>
<string name="sk_tabs_disable_swipe">Desactivar el desplazamiento entre pestañas</string>
<string name="sk_delete_notification">Eliminar notificación</string>
<string name="sk_delete_notification_confirm_action">Eliminar la notificación</string>
<string name="sk_delete_notification_confirm">¿Estás seguro de que quieres borrar esta notificación\?</string>
<string name="sk_clear_all_notifications">Borrar todas las notificaciones</string>
<string name="sk_clear_all_notifications_confirm_action">Borrar todo</string>
<string name="sk_enable_delete_notifications">Activar la eliminación de notificaciones</string>
<string name="sk_settings_publish_button_text">Publicar el texto del botón</string>
<string name="sk_settings_publish_button_text">Texto del botón de publicación</string>
<string name="sk_settings_publish_button_text_title">Personalizar el texto del botón Publicar</string>
<string name="sk_settings_translate_only_opened">Ocultar el botón de la traducción en la línea de tiempo</string>
<string name="sk_settings_translate_only_opened">Ocultar el botón de la traducción en la cronología</string>
<string name="sk_clear_all_notifications_confirm">¿Estás seguro de que quieres borrar todas las notificaciones\?</string>
<string name="sk_settings_translation_availability_note_available">¡%s admite traducción!</string>
<string name="sk_settings_translation_availability_note_unavailable">%s no parece soportar la traducción.</string>
<string name="sk_settings_translation_availability_note_unavailable">%s no parece admitir la traducción.</string>
<string name="sk_loading_fediverse_resource_title">Buscándolo en el Fediverso</string>
<string name="sk_quote_post">Publicar sobre esto</string>
<string name="sk_undo_reblog">Deshacer reblogueo</string>
<string name="sk_reblog_with_visibility">Rebloguea con visibilidad</string>
<string name="sk_hashtags_you_follow">Hashtags que sigues</string>
<string name="sk_copy_link_to_post">Copiar enlace a la publicación</string>
<string name="sk_hashtags_you_follow">Etiquetas que sigues</string>
<string name="sk_copy_link_to_post">Copiar enlace de la publicación</string>
<string name="sk_open_with_account">Abrir con otra cuenta</string>
<string name="sk_resource_not_found">El recurso no se pudo encontrar</string>
<string name="sk_loading_resource_on_instance_title">Buscándolo en %s</string>
<string name="sk_bookmarked_as">Añadido a favoritos como %s</string>
<string name="sk_already_bookmarked">Ya marcado</string>
<string name="sk_favorited_as">Favorito como %s</string>
<string name="sk_bookmarked_as">Añadido a marcadores como %s</string>
<string name="sk_already_bookmarked">Ya en marcadores</string>
<string name="sk_favorited_as">Marcado favorito como %s</string>
<string name="sk_already_favorited">Ya es un favorito</string>
<string name="sk_reblog_as">Compartir con otra cuenta</string>
<string name="sk_reblogged_as">Compartido como %s</string>
<string name="sk_already_reblogged">Ya se volvió a publicar</string>
<string name="sk_reblog_as">Impulsar con otra cuenta</string>
<string name="sk_reblogged_as">Impulsado como %s</string>
<string name="sk_already_reblogged">Ya se había impulsado</string>
<string name="sk_reply_as">Responder con otra cuenta</string>
<string name="sk_bookmark_as">Marcar con otra cuenta</string>
<string name="sk_favorite_as">Favoritos con otra cuenta</string>
<string name="sk_bookmark_as">Añadir a marcadores con otra cuenta</string>
<string name="sk_favorite_as">Marcar favorito con otra cuenta</string>
<string name="sk_settings_uniform_icon_for_notifications">Mismo icono para todas las notificaciones</string>
<string name="sk_forward_report_to">Reenviar a %s</string>
<string name="sk_unsent_posts">Mensajes no enviados</string>
<string name="sk_unsent_posts">Publicaciones no enviadas</string>
<string name="sk_draft">Borrador</string>
<string name="sk_schedule">Programar</string>
<string name="sk_confirm_delete_draft_title">Borrar el borrador</string>
<string name="sk_confirm_delete_draft">¿Seguro que quieres borrar este borrador\?</string>
<string name="sk_confirm_delete_scheduled_post_title">Borrar la entrada programada</string>
<string name="sk_confirm_delete_scheduled_post">¿Está seguro de que desea eliminar esta publicación programada\?</string>
<string name="sk_draft_or_schedule">A borrador o programar el envio</string>
<string name="sk_compose_draft">El mensaje se guardará como borrador.</string>
<string name="sk_confirm_delete_draft_title">Eliminar borrador</string>
<string name="sk_confirm_delete_draft">¿Seguro que quieres eliminar este borrador\?</string>
<string name="sk_confirm_delete_scheduled_post_title">Borrar publicación programada</string>
<string name="sk_confirm_delete_scheduled_post">¿Seguro que quieres eliminar esta publicación programada\?</string>
<string name="sk_draft_or_schedule">Borrador o programar</string>
<string name="sk_compose_draft">La publicación se guardará como borrador.</string>
<string name="sk_compose_scheduled">Programado para</string>
<string name="sk_draft_saved">Borrador guardado</string>
<string name="sk_post_scheduled">Publicación programada</string>
<string name="sk_scheduled_too_soon_title">La hora programada es demasiado pronto</string>
<string name="sk_scheduled_too_soon">El mensaje debe programarse con al menos 10 minutos de antelación.</string>
<string name="sk_scheduled_too_soon">La publicación debe programarse con al menos 10 minutos de antelación.</string>
<string name="sk_confirm_save_draft">¿Guardar el borrador\?</string>
<string name="sk_confirm_save_changes">¿Guardar los cambios\?</string>
<string name="sk_mark_as_draft">Marcar como borrador</string>
<string name="sk_schedule_post">Programar la publicación</string>
<string name="sk_schedule_or_draft">Calendario o proyecto</string>
<string name="sk_schedule_or_draft">Programar o borrador</string>
<string name="sk_compose_no_schedule">No programar</string>
<string name="sk_compose_no_draft">No hagas borradores</string>
<string name="sk_settings_reduce_motion">Reducir el movimiento en las animaciones</string>
<string name="sk_compose_no_draft">No guardar borrador</string>
<string name="sk_settings_reduce_motion">Reducir el movimiento de las animaciones</string>
<string name="sk_announcements">Anuncios</string>
<string name="sk_mark_as_read">Marcar como leído</string>
<string name="sk_settings_about_instance">Sobre la instancia</string>
<string name="sk_settings_single_notification">Mostrar solo una notificación</string>
<string name="sk_create">Crear</string>
<string name="sk_create_list_title">Crear una lista</string>
<string name="sk_list_name_hint">Lista de nombres</string>
<string name="sk_list_name_hint">Nombre de la lista</string>
<string name="sk_list_replies_policy">Mostrar respuestas a</string>
<string name="sk_list_replies_policy_followed">Usuarios a los que sigues</string>
<string name="sk_list_replies_policy_none">Ninguno</string>
<string name="sk_delete_list">Eliminar la lista</string>
<string name="sk_delete_list_confirm">¿Estás seguro de que quieres borrar la lista \"%s\"\?</string>
<string name="sk_edit_list_title">Editar la lista</string>
<string name="sk_delete_list_confirm">¿Seguro que quieres borrar la lista \"%s\"\?</string>
<string name="sk_edit_list_title">Editar lista</string>
<string name="sk_your_lists">Tus listas</string>
<string name="sk_list_replies_policy_list">Lista de miembros</string>
<string name="sk_list_replies_policy_list">Miembros de la lista</string>
<string name="sk_timeline_home">Inicio</string>
<string name="sk_timeline_federated">Federación</string>
<string name="sk_timeline_federated">Federada</string>
<string name="sk_timeline_local">Local</string>
<string name="sk_recent_searches_placeholder">Escribe para empezar a buscar</string>
<string name="sk_remove_follower">Eliminar como seguidor</string>
@@ -151,9 +151,9 @@
<string name="sk_icon_heart">Corazón</string>
<string name="sk_list">Lista</string>
<string name="sk_alt_text_missing_title">Falta texto alternativo</string>
<string name="sk_alt_text_missing">Por lo menos un elemento anexado no contiene descripción.</string>
<string name="sk_alt_text_missing">Por lo menos un archivo adjunto no contiene descripción.</string>
<string name="sk_publish_anyway">Publicar de todas formas</string>
<string name="sk_settings_disable_alt_text_reminder">Deshabilitar el recordatorio de texto alternativo</string>
<string name="sk_settings_disable_alt_text_reminder">Desactivar recordatorio para añadir texto alternativo</string>
<string name="sk_notify_posts_info_banner">Si tienes habilitadas las notificaciones de publicación para algunas personas, sus nuevas publicaciones aparecerán aquí.</string>
<string name="sk_timelines">Cronologías</string>
<string name="sk_icon_city">Ciudad</string>
@@ -170,7 +170,7 @@
<string name="sk_icon_megaphone">Megáfono</string>
<string name="sk_icon_microphone">Micrófono</string>
<string name="sk_icon_microscope">Microscopio</string>
<string name="sk_icon_keyboard">Teclado</string>
<string name="sk_icon_keyboard">Piano</string>
<string name="sk_icon_coffee">Café</string>
<string name="sk_icon_laugh">Risa</string>
<string name="sk_icon_news">Noticias</string>
@@ -201,7 +201,7 @@
<string name="sk_icon_backpack">Mochila</string>
<string name="sk_icon_briefcase">Maletín</string>
<string name="sk_icon_fire">Fuego</string>
<string name="sk_icon_bug">Fallo</string>
<string name="sk_icon_bug">Insecto</string>
<string name="sk_icon_pizza">Pizza</string>
<string name="sk_icon_gavel">Grava</string>
<string name="sk_icon_gauge">Calibre</string>
@@ -209,27 +209,27 @@
<string name="sk_icon_human">Humano</string>
<string name="sk_icon_globe">Globo</string>
<string name="sk_edit_timeline">Editar cronología</string>
<string name="sk_icon_pin">Pin</string>
<string name="sk_icon_pin">Chincheta</string>
<string name="sk_edit_timelines">Editar cronologías</string>
<string name="sk_alt_button">ALT</string>
<string name="sk_post_edited">editado</string>
<string name="sk_notification_type_update">Publicaciones editadas</string>
<string name="sk_notify_update">Edita un mensaje reblogueado</string>
<string name="sk_notify_update">Editó una publicación impulsada</string>
<string name="sk_searching">Buscando…</string>
<string name="sk_no_results">Sin resultados</string>
<string name="sk_save_draft">¿Guardar el borrador\?</string>
<string name="sk_no_alt_text">No hay texto alternativo disponible</string>
<string name="sk_settings_show_alt_indicator">Indicador para textos alternativos</string>
<string name="sk_settings_show_no_alt_indicator">Indicador para textos alternativos que faltan</string>
<string name="sk_updater_enable_pre_releases">Habilitar pre-lanzamientos</string>
<string name="sk_settings_show_alt_indicator">Desplegable de textos alternativos</string>
<string name="sk_settings_show_no_alt_indicator">Indicador de ausencia de texto alternativo</string>
<string name="sk_updater_enable_pre_releases">Activar versiones beta</string>
<string name="sk_timeline_posts">Publicaciones</string>
<string name="sk_timelines_add">Añadir</string>
<string name="sk_timeline">Cronología</string>
<string name="sk_hashtag">Hashtag</string>
<string name="sk_pin_timeline">Fijar cronología</string>
<string name="sk_unpin_timeline">Desfijar cronología</string>
<string name="sk_pinned_timeline">Fijado al inicio</string>
<string name="sk_unpinned_timeline">Desfijado del inicio</string>
<string name="sk_hashtag">Etiqueta</string>
<string name="sk_pin_timeline">Anclar cronología</string>
<string name="sk_unpin_timeline">Desanclar cronología</string>
<string name="sk_pinned_timeline">Anclado a inicio</string>
<string name="sk_unpinned_timeline">Desanclado de inicio</string>
<string name="sk_remove">Eliminado</string>
<string name="sk_timeline_icon">Icono</string>
<string name="sk_icon_star">Estrella</string>
@@ -241,11 +241,26 @@
<string name="sk_local_only">Sólo instancia local</string>
<string name="sk_instance_features">Funciones de la instancia</string>
<string name="sk_settings_support_local_only">El servidor admite la publicación sólo local</string>
<string name="sk_settings_local_only_explanation">Para que esto funcione, su instancia de origen debe soportar la publicación sólo local. La mayoría de las versiones modificadas de Mastodon lo hacen, pero Mastodon no.</string>
<string name="sk_settings_local_only_explanation">Para que esto funcione, tu instancia de origen debe soportar la publicación sólo local. La mayoría de las versiones modificadas de Mastodon lo hacen, pero Mastodon no.</string>
<string name="sk_settings_glitch_instance">Glitch modo sólo local</string>
<string name="sk_settings_glitch_mode_explanation">Habilita esta opción si tu instancia local funciona con Glitch. No es necesario para Hometown o Akkoma.</string>
<string name="sk_signed_up">inscrito</string>
<string name="sk_signed_up">registrado</string>
<string name="sk_reported">reportado</string>
<string name="sk_sign_ups">Registro de usuarios</string>
<string name="sk_new_reports">Nuevos informes</string>
<string name="sk_settings_server_version">Versión de servidor: %s</string>
<string name="sk_notify_poll_results">Resultado de encuestas</string>
<string name="sk_filtered">Filtrado: %s</string>
<string name="sk_expand">Ampliar</string>
<string name="sk_collapse">Minimizar</string>
<string name="sk_settings_collapse_long_posts">Minimizar publicaciones largas</string>
<string name="sk_unfinished_attachments">¿Corregir adjuntos\?</string>
<string name="sk_unfinished_attachments_message">Algunos adjuntos no han terminado de subirse.</string>
<string name="sk_settings_prefix_reply_cw_with_re">Añadir \"re:\" a respuestas a Advertencias de Contenido</string>
<string name="sk_spectator_mode">Modo espectador</string>
<string name="sk_settings_hide_interaction">Ocultar los botones de interacción</string>
<string name="sk_follow_as">Seguir desde otra cuenta</string>
<string name="sk_followed_as">Seguido desde %s</string>
<string name="sk_settings_hide_fab">Ocultar automáticamente el botón Redactar</string>
<string name="sk_in_reply">Respondiendo a</string>
</resources>

View File

@@ -1,9 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="get_started">Nola hasi</string>
<string name="get_started">Sortu kontua</string>
<string name="already_have_account">Badut kontua dagoeneko</string>
<string name="log_in">Hasi saioa</string>
<string name="next">Hurrengoa</string>
<string name="loading_instance">Zerbitzariaren informazioa berreskuratzen…</string>
<string name="error">Errorea</string>
<string name="not_a_mastodon_instance">%s(e) k ez dirudi Mastodon instantzia bat denik.</string>
<string name="ok">Ados</string>
<string name="preparing_auth">Autentifikaziorako prestatzen…</string>
<string name="finishing_auth">Autentikazioa bukatzen…</string>
@@ -170,15 +173,15 @@
<string name="back">Atzera</string>
<string name="instance_catalog_title">Mastodon zerbitzari desberdinetako erabiltzaileez egina dago.</string>
<string name="instance_catalog_subtitle">Aukeratu zerbitzari bat zure interesen, eskualdearen edo helburuen arabera. Pertsona guztiekin konektatu ahal izango duzu, zerbitzaria zein den kontuan hartu gabe.</string>
<string name="search_communities">Bilatu zerbitzariak edo idatzi URL-a</string>
<string name="instance_rules_title">Oinarrizko arau batzuk</string>
<string name="instance_rules_subtitle">Hartu minutu bat %s-en administratzaileek ezarri eta aplikatutako arauak berrikusteko.</string>
<string name="signup_title">%s zerbitzariko kontua prestatuko dizugu</string>
<string name="search_communities">Zerbitzari izena edo URLa</string>
<string name="instance_rules_title">Zerbitzariaren arauak</string>
<string name="signup_title">Sortu kontua</string>
<string name="edit_photo">editatu</string>
<string name="display_name">pantaila-izena</string>
<string name="username">erabiltzaile-izena</string>
<string name="email">eposta</string>
<string name="password">pasahitza</string>
<string name="display_name">Izena</string>
<string name="username">Erabiltzaile-izena</string>
<string name="email">Eposta</string>
<string name="password">Pasahitza</string>
<string name="confirm_password">Berretsi pasahitza</string>
<string name="password_note">Sartu letra larriak, karaktere bereziak eta zenbakiak zure pasahitzaren segurtasuna areagotzeko.</string>
<string name="category_academia">Akademia</string>
<string name="category_activism">Aktibismoa</string>
@@ -193,8 +196,8 @@
<string name="category_music">Musika</string>
<string name="category_regional">Herrialdekoa</string>
<string name="category_tech">Teknologia</string>
<string name="confirm_email_title">Eta azkenik...</string>
<string name="confirm_email_subtitle">Sakatu epostaz bidali dizugun loturan zure kontua egiaztatzeko.</string>
<string name="confirm_email_title">Egiaztatu zure sarrerako ontzia</string>
<!-- %s is the email address -->
<string name="resend">Berbidali</string>
<string name="open_email_app">Ireki eposta aplikazioa</string>
<string name="resent_email">Berretzi eposta bidaltzea</string>
@@ -282,7 +285,7 @@
<string name="open_in_browser">Ireki nabigatzailean</string>
<string name="hide_boosts_from_user">Ezkutatu %s(r)en bultzadak</string>
<string name="show_boosts_from_user">Erakutsi %s(r)en bultzadak</string>
<string name="signup_reason">zergatik elkartu nahi duzu?</string>
<string name="signup_reason">Zergatik elkartu nahi duzu?</string>
<string name="signup_reason_note">Honek zure eskaera berrikustean lagunduko digu.</string>
<string name="clear">Garbitu</string>
<string name="profile_header">Goiburu irudia</string>
@@ -375,8 +378,7 @@
<!-- %s is file size -->
<string name="download_update">(%s) deskargatu</string>
<string name="install_update">Instalatu</string>
<string name="privacy_policy_title">Mastodon eta zure pribatutasuna</string>
<string name="privacy_policy_subtitle">Mastodon aplikazioak daturik jasotzen ez duen arren, izena ematen duzun zerbitzariak beste politika bat izan dezake. Eskaini minutu bat Mastodon aplikazioaren pribatutasun politika eta zure zerbitzariaren pribatutasun politika berrikusteko eta ados zaudela ziurtatzeko.</string>
<string name="privacy_policy_title">Zure pribatutasuna</string>
<string name="i_agree">Ados nago</string>
<string name="empty_list">Zerrenda hau hutsik dago</string>
<string name="instance_signup_closed">Zerbitzari honek ez ditu izen-emate berriak onartzen.</string>
@@ -385,4 +387,31 @@
<string name="remove_bookmark">Kendu laster-marka</string>
<string name="bookmarks">Laster-markak</string>
<string name="your_favorites">Zure gogokoak</string>
<string name="login_title">Ongi etorri berriro ere</string>
<string name="login_subtitle">Hasi saioa kontua sortu zenuen zerbitzariarekin.</string>
<string name="server_url">Zerbitzariaren URLa</string>
<string name="welcome_page1_title">Zer da Mastodon?</string>
<string name="welcome_page1_text">Imajinatu zure helbide elektronikoa adibidea.eus-en amaitzen dela. \n\n Oraindik edonoren mezu elektronikoak bidali eta jaso ditzakezu, baita posta elektronikoa @gmail.com edo @icloud.com edo @adibidea.eus helbideetan amaitzen bada ere.</string>
<string name="welcome_page2_title">Mastodon antzekoa da.</string>
<string name="welcome_page2_text">Zure kontua \"@pertsona1@mastodon.eus\" izan liteke, baina oraindik ere jarraitu, bultzatu edo txateatu dezakezu \"@pertsona2@mastodon.social\" edo bestelako edozein kontu.</string>
<string name="welcome_page3_title">Nola aukeratzen dut zerbitzari bat?</string>
<string name="welcome_page3_text">Hainbat pertsonak zerbitzari bat baino gehiago aukeratzen dituzte arrazoi ezberdinengatik. Adibidez, art.example leku ona da artistentzat eta mastodon.eus, berriz, euskaldunentzat. Gure gomendioetako zerbitzariekin, ez duzu hanka sartuko eta edozein dela ere zure aukera, beste zerbitzarietako kideekin harremana izan dezakezu (bilaketa-barran bilatuz).</string>
<string name="server_filter_any_language">Edozein hizkuntza</string>
<string name="server_filter_instant_signup">Berehalako erregistroa</string>
<string name="server_filter_region_europe">Europa</string>
<string name="server_filter_region_north_america">Ipar Amerika</string>
<string name="server_filter_region_south_america">Hego Amerika</string>
<string name="server_filter_region_africa">Afrika</string>
<string name="server_filter_region_asia">Asia</string>
<string name="server_filter_region_oceania">Ozeania</string>
<string name="not_accepting_new_members">Ez da kide berririk onartzen</string>
<string name="signup_passwords_dont_match">Pasahitzak ez datoz bat</string>
<string name="profile_add_row">Gehitu errenkada</string>
<string name="follow_all">Jarraitu denak</string>
<string name="server_rules_disagree">Ez ados</string>
<!-- %s is server domain -->
<string name="profile_bio">Biografia</string>
<!-- Shown in a progress dialog when you tap "follow all" -->
<!-- %1$s is server domain, %2$s is email domain. You can reorder these placeholders to fit your language better. -->
<string name="signup_username_taken">Erabiltzaile-izen hau hartuta dago.</string>
</resources>

View File

@@ -72,7 +72,7 @@
<string name="sk_settings_translation_availability_note_available">%s-k itzulpena onartzen du!</string>
<string name="sk_settings_translation_availability_note_unavailable">%s ez da itzulpena onartzen duten instantzien artean ageri.</string>
<string name="sk_clear_all_notifications">Ezabatu jakinarazpen guztiak</string>
<string name="sk_clear_all_notifications_confirm_action">Ezabatu dena</string>
<string name="sk_clear_all_notifications_confirm_action">Ezabatu denak</string>
<string name="sk_clear_all_notifications_confirm">Ziur al zaude jakinarazpen guztiak ezabatu nahi dituzula\?</string>
<string name="sk_loading_fediverse_resource_title">Fedibertsoan bilatzen</string>
<string name="sk_undo_reblog">Bultzada desegin</string>
@@ -146,7 +146,7 @@
<string name="sk_changelog">Aldaketen zerrenda</string>
<string name="sk_alt_text_missing">Eranskin batek gutxienez ez du deskribapenik.</string>
<string name="sk_publish_anyway">Argitaratu hala ere</string>
<string name="sk_settings_disable_alt_text_reminder">Desgaitu testu alternatiboaren jakinarazpena</string>
<string name="sk_settings_disable_alt_text_reminder">Desgaitu gogorarazlea testu alternatiboa gehitzeko</string>
<string name="sk_timelines">Denbora-lerroak</string>
<string name="sk_timeline_posts">Bidalketak</string>
<string name="sk_timelines_add">Gehitu</string>
@@ -218,7 +218,7 @@
<string name="sk_edit_timelines">Denbora-lerroak editatu</string>
<string name="sk_alt_button">ALT</string>
<string name="sk_post_edited">Editatua</string>
<string name="sk_notification_type_update">Bidalketa editatua</string>
<string name="sk_notification_type_update">Editatutako argitalpenak</string>
<string name="sk_notify_update">Bultzatutako bidalketa editatu</string>
<string name="sk_no_results">Emaitzarik ez</string>
<string name="sk_save_draft">Zirriborroa gorde\?</string>
@@ -232,4 +232,33 @@
<string name="sk_alt_text_missing_title">Testu alternatiboa falta da</string>
<string name="sk_searching">Bilatzen…</string>
<string name="sk_save_draft_message">Zirriborro honetako aldaketak gorde edo argitaratu nahi dituzu\?</string>
<string name="sk_settings_prefix_reply_cw_with_re">Gehitu \"re:\" hasieran edukiaren abisuen erantzunetan</string>
<string name="sk_filtered">Iragazita: %s</string>
<string name="sk_expand">Zabaldu</string>
<string name="sk_collapse">Itxi</string>
<string name="sk_settings_collapse_long_posts">Itxi argitalpen oso luzeak</string>
<string name="sk_unfinished_attachments">Finkatu eranskinak\?</string>
<string name="sk_unfinished_attachments_message">Eranskin batzuk ez dira igo oraindik.</string>
<string name="sk_notify_posts_info_banner">Pertsona batzuen argitalpenen jakinarazpenak gaitzen badituzu, beraien argitalpen berriak hemen ageriko dira.</string>
<string name="sk_updater_enable_pre_releases">Gaitu beta bertsioak</string>
<string name="sk_inline_direct">aipamenak soilik</string>
<string name="sk_separator">·</string>
<string name="sk_instance_features">Instantziaren ezaugarriak</string>
<string name="sk_settings_local_only_explanation">Zure jatorriko instantziak bertan soilik argitaratzea baimendu behar du hau ibili dadin. Aldatutako Mastodon bertsio askok darabilte, baina Mastodonek ez.</string>
<string name="sk_inline_local_only">bertan soilik</string>
<string name="sk_settings_support_local_only">Zerbitzariak bertan soilik argitaratzea baimentzen du</string>
<string name="sk_settings_glitch_instance">Glitch bertan soilik modua</string>
<string name="sk_settings_glitch_mode_explanation">Gaitu hau zure jatorrizko instantziak Glitch badarabil. Ez da beharrezkoa Hometown edo Akkomarako.</string>
<string name="sk_signed_up">izena emanda</string>
<string name="sk_reported">salatuta</string>
<string name="sk_sign_ups">Erabiltzaileen izen-ematea</string>
<string name="sk_new_reports">Salaketa berriak</string>
<string name="sk_local_only">Bertako instantzia soilik</string>
<string name="sk_settings_see_new_posts_button">\"Ikusi argitalpen berriak\" botoia</string>
<string name="sk_settings_server_version">Zerbitzariaren bertsioa: %s</string>
<string name="sk_notify_poll_results">Bozketaren emaitzak</string>
<string name="sk_settings_hide_interaction">Ezkutatu interakzio-botoiak</string>
<string name="sk_follow_as">Jarraitu beste kontu batetik</string>
<string name="sk_followed_as">%s-(d/t)ik jarraitua</string>
<string name="sk_settings_hide_fab">Automatikoki ezkutatu Idatzi botoia</string>
</resources>

View File

@@ -0,0 +1,102 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="get_started">ایجاد حساب</string>
<string name="already_have_account">من از قبل حساب‌کاربری دارم</string>
<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="finishing_auth">درحال تکمیل احرازهویت…</string>
<string name="in_reply_to">در پاسخ به %s</string>
<string name="notifications">اعلان‌ها</string>
<string name="user_followed_you">شما را دنبال می‌کند</string>
<string name="user_sent_follow_request">یک درخواست دنبال کردن برای شما ارسال کرد</string>
<string name="user_favorited"> فرسته‌تان را پسندید</string>
<string name="notification_boosted">مطلب شما را به‌اشتراک گذاشت</string>
<string name="poll_ended">نظرسنجی به پایان رسید</string>
<string name="time_seconds">%dثانیه</string>
<string name="time_minutes">%dدقیقه</string>
<string name="time_hours">%dساعت</string>
<string name="time_days">%dروز</string>
<string name="share_toot_title">اشتراک‌گذاری</string>
<string name="settings">تنظیمات</string>
<string name="publish">انتشار</string>
<string name="discard_draft">پیش‌نویس‌ کنار گذاشته شود؟</string>
<string name="discard">صرف‌نظر کردن</string>
<string name="cancel">لغو</string>
<string name="posts">پست‌ها</string>
<string name="posts_and_replies">پست‌ها و پاسخ‌ها</string>
<string name="media">رسانه</string>
<string name="profile_about">درباره</string>
<string name="button_follow">فالو</string>
<string name="share_user">اشتراک‌گذاری %s</string>
<string name="mute_user">بی‌صدا %s</string>
<string name="block_user">مسدود %s</string>
<string name="unblock_user">رفع مسدودیت %s</string>
<string name="profile_joined">عضو شد</string>
<string name="done">انجام شد</string>
<string name="loading">درحال بارگذاری…</string>
<string name="field_label">برچسب</string>
<string name="field_content">محتوا</string>
<string name="saving">درحال ذخیره‌سازی…</string>
<string name="do_mute">بی‌صدا</string>
<string name="do_block">مسدود</string>
<string name="action_vote">رأی</string>
<string name="delete">حذف</string>
<string name="confirm_delete_title">حذف پست</string>
<string name="play">پخش</string>
<string name="pause">توقف</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="report_title">گزارش کردن %s</string>
<string name="report_reason_personal">من این را دوست ندارم</string>
<string name="report_reason_spam">این هرزنامه است</string>
<string name="back">بازگشت</string>
<string name="edit_photo">ویرایش</string>
<string name="category_activism">فعالیت</string>
<string name="category_all">همه</string>
<string name="category_art">هنر</string>
<string name="category_food">غذا</string>
<string name="category_games">بازی‌ها</string>
<string name="category_lgbt">LGBT</string>
<string name="category_music">موسیقی</string>
<string name="category_regional">منطقه‌ای</string>
<string name="category_tech">فناوری</string>
<!-- %s is the email address -->
<string name="resend">ارسال دوباره</string>
<string name="save">ذخیره</string>
<string name="visibility_public">عمومی</string>
<string name="search_all">همه</string>
<string name="search_people">افراد</string>
<string name="skip">بعدی</string>
<string name="notification_type_favorite">علاقه‌مندی‌ها</string>
<string name="notification_type_poll">نظرسنجی‌ها</string>
<string name="choose_account">انتخاب حساب</string>
<string name="theme_auto">خودکار</string>
<string name="theme_light">روشن</string>
<string name="theme_dark">تاریک</string>
<string name="new_post">پست جدید</string>
<string name="button_reply">پاسخ</string>
<string name="button_favorite">برگزیده‌</string>
<string name="button_share">اشتراک‌گذاری</string>
<string name="emoji">ایموجی</string>
<string name="clear">پاک‌کردن</string>
<string name="download">دانلود</string>
<!-- translators: %,d is a valid placeholder, it formats the number with locale-dependent grouping separators -->
<string name="time_now">اکنون</string>
<string name="time_just_now">همين الان</string>
<string name="edit">ویرایش</string>
<!-- %s is version like 1.2.3 -->
<!-- %s is version like 1.2.3 -->
<!-- %s is file size -->
<string name="install_update">نصب</string>
<string name="i_agree">موافقم</string>
<!-- %s is server domain -->
<!-- Shown in a progress dialog when you tap "follow all" -->
<!-- %1$s is server domain, %2$s is email domain. You can reorder these placeholders to fit your language better. -->
</resources>

View File

@@ -1,6 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="get_started">Aloita</string>
<string name="log_in">Kirjaudu sisään</string>
<string name="next">Seuraava</string>
<string name="error">Virhe</string>
@@ -17,9 +16,6 @@
<string name="all_notifications">Kaikki</string>
<string name="back">Takaisin</string>
<string name="edit_photo">muokkaa</string>
<string name="display_name">näyttönimi</string>
<string name="email">sähköposti</string>
<string name="password">salasana</string>
<string name="category_academia">Akateeminen</string>
<string name="category_activism">Aktivismi</string>
<string name="category_all">Kaikki</string>
@@ -33,6 +29,7 @@
<string name="category_music">Musiikki</string>
<string name="category_regional">Alueellinen</string>
<string name="category_tech">Teknologia</string>
<!-- %s is the email address -->
<string name="save">Tallenna</string>
<string name="theme_auto">Automaattinen</string>
<string name="theme_light">Vaalea</string>
@@ -53,4 +50,7 @@
<!-- %s is version like 1.2.3 -->
<!-- %s is version like 1.2.3 -->
<!-- %s is file size -->
<!-- %s is server domain -->
<!-- Shown in a progress dialog when you tap "follow all" -->
<!-- %1$s is server domain, %2$s is email domain. You can reorder these placeholders to fit your language better. -->
</resources>

View File

@@ -1,14 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="get_started">Magsimula</string>
<string name="get_started">Gumawa ng account</string>
<string name="already_have_account">Mayroon na akong account</string>
<string name="log_in">Mag-log in</string>
<string name="next">Sunod</string>
<string name="loading_instance">Pagkuha ng impormasyon sa server…</string>
<string name="error">Nag-Error</string>
<string name="not_a_mastodon_instance">%s hindi lumilitaw para maging Mastodon server.</string>
<string name="ok">OK</string>
<string name="preparing_auth">Paghahanda para sa pagpapatunay…</string>
<string name="finishing_auth">Natapos na ang pagpapatunay…</string>
<string name="user_boosted">%s reblogged</string>
<string name="in_reply_to">Sa sumagot sa %s</string>
<string name="in_reply_to">Bilang tugon kay %s</string>
<string name="notifications">Mga abiso</string>
<string name="user_followed_you">sinundan ka</string>
<string name="user_sent_follow_request">may nagpadala sa iyo ng follow request</string>
@@ -39,7 +42,7 @@
</plurals>
<string name="posts">Mga Post</string>
<string name="posts_and_replies">Mga post at Mga tugon</string>
<string name="media">Medya</string>
<string name="media">Media</string>
<string name="profile_about">Tungkol</string>
<string name="button_follow">Sundan</string>
<string name="button_following">Sumusunod</string>
@@ -48,9 +51,9 @@
<string name="share_user">Ibahagi %s</string>
<string name="mute_user">I-mute %s</string>
<string name="unmute_user">I-unmute %s</string>
<string name="block_user">Na-Block %s</string>
<string name="unblock_user">Na-Unblock %s</string>
<string name="report_user">Na-report %s</string>
<string name="block_user">I-Block %s</string>
<string name="unblock_user">I-Unblock %s</string>
<string name="report_user">I-Report %s</string>
<string name="block_domain">Na-Block %s</string>
<string name="unblock_domain">Na-Unblock %s</string>
<plurals name="x_posts">
@@ -63,7 +66,7 @@
<string name="field_label">Label</string>
<string name="field_content">Nilalaman</string>
<string name="saving">Pag-save…</string>
<string name="post_from_user">Post galing %s</string>
<string name="post_from_user">Post mula kay %s</string>
<string name="poll_option_hint">Pagpipilian %d</string>
<plurals name="x_minutes">
<item quantity="one">%d minuto</item>
@@ -95,7 +98,7 @@
<item quantity="other">%d natitirang araw</item>
</plurals>
<plurals name="x_voters">
<item quantity="one">%, d botante</item>
<item quantity="one">%,d botante</item>
<item quantity="other">%,d botante</item>
</plurals>
<string name="poll_closed">Sarado</string>
@@ -108,20 +111,22 @@
<string name="confirm_block_title">I-Block Ang Account</string>
<string name="confirm_block_domain_title">I-Block Ang Domain</string>
<string name="confirm_block">Kumpirmahin ang pag-block %s</string>
<string name="do_block">Block</string>
<string name="do_block">I-Block</string>
<string name="confirm_unblock_title">I-Unblock ang Account</string>
<string name="confirm_unblock_domain_title">I-Unblock ang Domain</string>
<string name="confirm_unblock">Kumpirmahin ang pag-unblock%s</string>
<string name="do_unblock">Unblock</string>
<string name="do_unblock">I-Unblock</string>
<string name="button_muted">Naka-mute</string>
<string name="button_blocked">Na-block</string>
<string name="action_vote">Bumoto</string>
<string name="tap_to_reveal">I-Tap para ipakita</string>
<string name="tap_to_reveal">I-Tap para makita</string>
<string name="delete">Tanggalin</string>
<string name="confirm_delete_title">Burahin ang Post</string>
<string name="confirm_delete">Sigurado ka bang gusto mong burahin ang post na ito?</string>
<string name="deleting">Pagtanggal…</string>
<string name="notification_channel_audio_player">Pag-playback ng Audio</string>
<string name="play">I-play</string>
<string name="pause">I-Pause</string>
<string name="log_out">Mag-Sign out</string>
<string name="add_account">Magdagdag ng account</string>
<string name="search_hint">Maghanap</string>
@@ -138,7 +143,7 @@
<item quantity="one">Tinalakay %d oras</item>
<item quantity="other">Tinalakay %d oras</item>
</plurals>
<string name="report_title">Na-report %s</string>
<string name="report_title">I-Report %s</string>
<string name="report_choose_reason">Ano ang mali sa post na ito?</string>
<string name="report_choose_reason_account">Ano ang mali sa %s?</string>
<string name="report_choose_reason_subtitle">Piliin ang pinakamahusay na tugma</string>
@@ -146,8 +151,8 @@
<string name="report_reason_personal_subtitle">Hindi ito isang bagay na nais mong makita</string>
<string name="report_reason_spam">Ito ay spam</string>
<string name="report_reason_spam_subtitle">Nakakahamak na mga link, pekeng pakikipag-ugnayan, o paulit-ulit na mga tugon</string>
<string name="report_reason_violation">Lumalabag ito sa mga patakaran ng server</string>
<string name="report_reason_violation_subtitle">Alam mo na nilalabag nito ang mga tiyak na patakaran</string>
<string name="report_reason_violation">Lumalabag ito sa mga panuntunan ng server</string>
<string name="report_reason_violation_subtitle">Alam mo na lumalabag ito sa mga partikular na panuntunan</string>
<string name="report_reason_other">Ito may iba pa</string>
<string name="report_reason_other_subtitle">Ang isyu ay hindi umaangkop sa iba pang mga kategorya</string>
<string name="report_choose_rule">Aling mga patakaran ang nilabag?</string>
@@ -156,10 +161,230 @@
<string name="report_choose_posts_subtitle">Piliin ang lahat na aaply</string>
<string name="report_comment_title">Mayroon pa bang dapat nating malaman?</string>
<string name="report_comment_hint">Mga Karagdagang Komento</string>
<string name="sending_report">Pagpapadala ng Ulat…</string>
<string name="report_sent_title">Salamat sa pag-uulat, titingnan namin ito.</string>
<string name="report_sent_subtitle">Habang sinusuri namin ito, maaari kang gumawa ng aksyon laban sa %s.</string>
<string name="unfollow_user">I-Unfollow %s</string>
<string name="unfollow">I-unfollow</string>
<string name="mute_user_explain">Hindi mo makikita ang kanilang mga post o reblogs sa iyong home feed. Hindi nila malalaman na sila ay na-mute.</string>
<string name="block_user_explain">Hindi na nila magagawang sundin o makita ang iyong mga post, ngunit maaari nilang makita kung na-block sila.</string>
<string name="report_personal_title">Ayaw mong makita ito?</string>
<string name="report_personal_subtitle">Kapag nakakita ka ng mga bagay na hindi mo gusto sa Mastodon, maaari mong alisin ang tao mula sa iyong karanasan.</string>
<string name="back">Bumalik</string>
<string name="instance_catalog_title">Ang Mastodon ay gawa sa mga user sa iba\'t ibang mga server.</string>
<string name="instance_catalog_subtitle">Pumili ng server batay sa iyong mga interes, rehiyon, o isang pangkalahatang layunin. Maaari ka pa ring kumonekta sa lahat, anuman ang server.</string>
<string name="edit_photo">i-edit</string>
<string name="password_note">Isama ang mga malalaking titik, mga espesyal na character, at mga numero para madagdagan ang lakas ng iyong password.</string>
<string name="category_academia">Academia</string>
<string name="category_activism">Activism</string>
<string name="category_all">Lahat</string>
<string name="category_art">Sining</string>
<string name="category_food">Pagkain</string>
<string name="category_furry">Furry</string>
<string name="category_games">Mga Laro</string>
<string name="category_general">Pangkalahatan</string>
<string name="category_journalism">Pamamahayag</string>
<string name="category_lgbt">LGBT</string>
<string name="category_music">Musika</string>
<string name="category_regional">Rehiyon</string>
<string name="category_tech">Tech</string>
<!-- %s is the email address -->
<string name="resend">Muling ipadala</string>
<string name="open_email_app">Buksan ang email app</string>
<string name="resent_email">Kumpirmasyon ng email napadala</string>
<string name="compose_hint">I-Type o i-paste kung ano ang nasa isip mo</string>
<string name="content_warning">Babala sa nilalaman</string>
<string name="add_image_description">Magdagdag ng paglalarawan ng imahe…</string>
<string name="retry_upload">Muling subukan ang pag-upload</string>
<string name="edit_image">I-edit ang imahe</string>
<string name="save">I-save</string>
<string name="add_alt_text">Magdagdag ng teksto ng alt</string>
<string name="alt_text_subtitle">Inilalarawan ng Alt text ang iyong mga larawan para sa mga taong may mababa o walang paningin. Subukang isama lamang ang sapat na detalye para maunawaan ang konteksto.</string>
<string name="alt_text_hint">hal. Ang aso ay nakatingin sa paligid na kahina-hinala na may makitid na mga mata sa camera.</string>
<string name="visibility_public">Publiko</string>
<string name="visibility_followers_only">Mga tagasunod lamang</string>
<string name="visibility_private">Mga tao lang ang binabanggit ko</string>
<string name="search_all">Lahat</string>
<string name="search_people">Mga Tao</string>
<string name="recent_searches">Kamakailang mga paghahanap</string>
<string name="step_x_of_n">Hakbang %1$d of %2$d</string>
<string name="skip">Laktawan</string>
<string name="notification_type_follow">Mga Bagong Follower</string>
<string name="notification_type_favorite">Mga Paborito</string>
<string name="notification_type_reblog">Mga Reblog</string>
<string name="notification_type_mention">Mga binangit</string>
<string name="notification_type_poll">Mga botohan</string>
<string name="choose_account">Pumili ng account</string>
<string name="err_not_logged_in">Pakiusap mag-log in muna sa Mastodon</string>
<plurals name="cant_add_more_than_x_attachments">
<item quantity="one">Hindi ka maaaring magdagdag ng higit sa %d media attachment</item>
<item quantity="other">Hindi ka maaaring magdagdag ng higit sa %d media attachment</item>
</plurals>
<string name="media_attachment_unsupported_type">Ang File %s ay hindi suportadong uri</string>
<string name="media_attachment_too_big">Ang File %1$s ay lumampas sa limitasyon ng laki ng %2$s MB</string>
<string name="settings_theme">Visual na hitsura</string>
<string name="theme_auto">Awtomatiko</string>
<string name="theme_light">Ilaw</string>
<string name="theme_dark">Madilim</string>
<string name="theme_true_black">Tunay na maitim na mode</string>
<string name="settings_behavior">Pag-uugali</string>
<string name="settings_gif">Maglaro ng mga animated na avatar at emoji</string>
<string name="settings_custom_tabs">Gumamit ng in-app browser</string>
<string name="settings_notifications">Mga abiso</string>
<string name="notify_me_when">Abisuhan ako kapag</string>
<string name="notify_anyone">sinuman</string>
<string name="notify_follower">isang tagasunod</string>
<string name="notify_followed">isang taong sinusundan ko</string>
<string name="notify_none">walang simuman</string>
<string name="notify_favorites">Paborito Ang aking post</string>
<string name="notify_follow">Sumusunod sa akin</string>
<string name="notify_reblog">Reblogs ang aking post</string>
<string name="notify_mention">Banggitin ako</string>
<string name="settings_boring">Ang nakababagot na zone</string>
<string name="settings_account">Mga setting ng Account</string>
<string name="settings_contribute">Mag-ambag sa Mastodon</string>
<string name="settings_tos">Mga tuntunin ng serbisyo</string>
<string name="settings_privacy_policy">Patakaran sa Pagkapribado</string>
<string name="settings_spicy">Ang maanghang na zone</string>
<string name="settings_clear_cache">I-Clear ang cache ng media</string>
<string name="settings_app_version">Mastodon para sa Android v%1$s (%2$d)</string>
<string name="media_cache_cleared">Na-clear ang cache ng Media</string>
<string name="confirm_log_out">Sigurado ka bang gusto mong mag-sign out?</string>
<string name="sensitive_content">Sensitibong nilalaman</string>
<string name="sensitive_content_explain">Minarkahan ng may-akda ang media na ito bilang sensitibo. I-tap para makita.</string>
<string name="media_hidden">I-Tap para mapakita</string>
<string name="avatar_description">Pumunta sa profile ng %s</string>
<string name="more_options">Higit pang mga pagpipilian</string>
<string name="reveal_content">Ipakita ang nilalaman</string>
<string name="hide_content">Itago ang nilalaman</string>
<string name="new_post">Bagong post</string>
<string name="button_reply">Tumugon</string>
<string name="button_reblog">Reblog</string>
<string name="button_favorite">Paborito</string>
<string name="button_share">Ibahagi</string>
<string name="media_no_description">Media nang walang paglalarawan</string>
<string name="add_media">Magdagdag ng media</string>
<string name="add_poll">Magdagdag ng botohan</string>
<string name="emoji">Emoji</string>
<string name="post_visibility">Kakayahang makita ang Post</string>
<string name="home_timeline">Timeline ng tahanan</string>
<string name="my_profile">Aking profile</string>
<string name="media_viewer">Media tagapanood</string>
<string name="follow_user">I-follow %s</string>
<string name="unfollowed_user">I-Unfollow %s</string>
<string name="followed_user">Sinusundan mo ngayon ang %s</string>
<string name="open_in_browser">Buksan sa browser</string>
<string name="hide_boosts_from_user">Itago ang mga reblog mula sa %s</string>
<string name="show_boosts_from_user">Ipakita ang mga reblog mula sa %s</string>
<string name="signup_reason_note">Makakatulong ito sa amin na suriin ang iyong aplikasyon.</string>
<string name="clear">I-Clear</string>
<string name="profile_header">Imahe ng Header</string>
<string name="profile_picture">Larawan ng Profile</string>
<string name="reorder">Muling ayusin</string>
<string name="download">I-download</string>
<string name="permission_required">Kinakailangan ang pahintulot</string>
<string name="storage_permission_to_download">Ang app ay nangangailangan ng access sa iyong storage para i-save ang file na ito.</string>
<string name="open_settings">Buksan ang mga setting</string>
<string name="error_saving_file">Error sa pag-save ng file</string>
<string name="file_saved">Nai-save ang File</string>
<string name="downloading">Nagda-download…</string>
<string name="no_app_to_handle_action">Walang app para mahawakan ang pagkilos na ito</string>
<string name="local_timeline">Komunidad</string>
<string name="trending_posts_info_banner">Ito ang mga post na nakakakuha ng traksyon sa iyong sulok ng Mastodon.</string>
<string name="trending_hashtags_info_banner">Ito ang mga hashtags na nakakakuha ng traksyon sa iyong sulok ng Mastodon.</string>
<string name="trending_links_info_banner">Ito ang mga kuwento ng balita na ibinabahagi ang pinaka sa iyong sulok ng Mastodon.</string>
<string name="local_timeline_info_banner">Ito ang pinakahuling mga post ng mga taong gumagamit ng parehong Mastodon server tulad mo.</string>
<string name="dismiss">I-dismiss</string>
<string name="see_new_posts">Tingnan ang mga bagong post</string>
<string name="load_missing_posts">Mag-Load ng nawawalang mga post</string>
<string name="follow_back">Sundan Pabalik</string>
<string name="button_follow_pending">Nakabinbin</string>
<string name="follows_you">Sinundan ka</string>
<string name="manually_approves_followers">Manu-manong aprubahan ang mga tagasunod</string>
<string name="current_account">Kasalukuyang account</string>
<string name="log_out_account">Mag-Log out %s</string>
<!-- translators: %,d is a valid placeholder, it formats the number with locale-dependent grouping separators -->
<plurals name="x_followers">
<item quantity="one">%,d tagasunod</item>
<item quantity="other">%,d tagasunod</item>
</plurals>
<plurals name="x_following">
<item quantity="one">%, d Sumusunod</item>
<item quantity="other">%, d Sumusunod</item>
</plurals>
<plurals name="x_favorites">
<item quantity="one">%, d Paborito</item>
<item quantity="other">%, d paborito</item>
</plurals>
<plurals name="x_reblogs">
<item quantity="one">%, d reblog</item>
<item quantity="other">%, d reblog</item>
</plurals>
<string name="timestamp_via_app">%1$s sa pamamagitan ng %2$s</string>
<string name="time_now">ngayon</string>
<string name="post_info_reblogs">Mga Reblog</string>
<string name="post_info_favorites">Mga Paborito</string>
<string name="edit_history">I-Edit ang kasaysayan</string>
<string name="last_edit_at_x">Huling edit %s</string>
<string name="time_just_now">ngayon lang</string>
<plurals name="x_seconds_ago">
<item quantity="one">%d segundo ang nakalipas</item>
<item quantity="other">%d segundo ang nakalipas</item>
</plurals>
<plurals name="x_minutes_ago">
<item quantity="one">%d minuto ang nakalipas</item>
<item quantity="other">%d minuto ang nakalipas</item>
</plurals>
<string name="edited_timestamp">edited %s</string>
<string name="edit_original_post">Orihinal na post</string>
<string name="edit_text_edited">Na-edit ang teksto</string>
<string name="edit_spoiler_added">Idinagdag ang babala ng nilalaman</string>
<string name="edit_spoiler_edited">Na-edit ang babala ng nilalaman</string>
<string name="edit_spoiler_removed">Inalis ang babala ng nilalaman</string>
<string name="edit_poll_added">Ang Poll ay nadagdag</string>
<string name="edit_poll_edited">Na-edit ang Poll</string>
<string name="edit_poll_removed">Inalis ang Poll</string>
<string name="edit_media_added">Idinagdag ang Media</string>
<string name="edit_media_removed">Inalis ang Media</string>
<string name="edit_media_reordered">Muling inayos ng Media</string>
<string name="edit_marked_sensitive">Minarkahang sensitibo</string>
<string name="edit_marked_not_sensitive">Minarkahan hindi sensitibo</string>
<string name="edit_multiple_changed">Na-edit ang Post</string>
<string name="edit">I-edit</string>
<string name="discard_changes">Baliwalain ang mga pagbabago?</string>
<string name="upload_failed">Nabigo ang pag-Upload</string>
<string name="file_size_bytes">%d bytes</string>
<string name="file_size_kb">%.2f KB</string>
<string name="file_size_mb">%.2f MB</string>
<string name="file_size_gb">%.2f GB</string>
<string name="file_upload_progress">%1$s of %2$s</string>
<string name="file_upload_time_remaining">%s ang natitira</string>
<string name="upload_error_connection_lost">Nawala ang koneksyon ng iyong device sa internet</string>
<string name="upload_processing">Pagproseso…</string>
<!-- %s is version like 1.2.3 -->
<string name="update_available">Ang Mastodon para sa Android %s ay handa nang i-download.</string>
<!-- %s is version like 1.2.3 -->
<string name="update_ready">Ang Mastodon para sa Android %s ay nai-download at handa nang mai-install.</string>
<!-- %s is file size -->
<string name="download_update">I-Download (%s)</string>
<string name="install_update">I-install</string>
<string name="i_agree">Sang-ayon ako</string>
<string name="empty_list">Walang laman ang listahang ito</string>
<string name="instance_signup_closed">Ang server na ito ay hindi tumatanggap ng mga bagong pagrerehistro.</string>
<string name="text_copied">Kinopya sa clipboard</string>
<string name="add_bookmark">Bookmark</string>
<string name="remove_bookmark">Alisin ang bookmark</string>
<string name="bookmarks">Mga bookmark</string>
<string name="your_favorites">Ang Iyong Mga Paborito</string>
<string name="login_title">Maligayang pagbalik,</string>
<string name="login_subtitle">Mag-Log in gamit ang server kung saan mo nilikha ang iyong account.</string>
<string name="server_url">Ang URL ng server</string>
<string name="welcome_page1_text">Isipin na mayroon kang isang email address na nagtatapos sa @example. com. \n \nMaaari ka pa ring magpadala at tumanggap ng mga email mula sa sinuman, kahit na ang kanilang email ay nagtatapos sa @gmail.com o @icloud.com o @example.com.</string>
<string name="welcome_page2_title">Mastodon ay tulad na.</string>
<string name="welcome_page2_text">Ang iyong hawakan ay maaaring @gothgirl654@example.social, ngunit maaari mo pa ring sundin, reblog, at makipag-chat sa @fallout5ever@example.online.</string>
<string name="welcome_page3_title">Paano ako pumili ng server?</string>
<string name="welcome_page3_text">Ang iba \'t ibang mga tao ay pumili ng iba\' t ibang mga server para sa anumang bilang ng mga kadahilanan. sining.ang halimbawa ay isang magandang lugar para sa mga artista, habang ang glasgow.halimbawa ay maaaring maging isang mahusay na pick para sa Scots.\n \nhindi ka maaaring magkamali sa alinman sa aming mga inirekumendang server, kaya anuman ang pipiliin mo (o kung ipinasok mo ang iyong sarili sa search bar ng server), hindi ka makaligtaan ng isang matalo kahit saan.</string>
<!-- %s is server domain -->
<!-- Shown in a progress dialog when you tap "follow all" -->
<!-- %1$s is server domain, %2$s is email domain. You can reorder these placeholders to fit your language better. -->
</resources>

View File

@@ -1,6 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="get_started">Premiers pas</string>
<string name="get_started">Créer un compte</string>
<string name="already_have_account">J\'ai déjà un compte</string>
<string name="log_in">Se connecter</string>
<string name="next">Suivant</string>
<string name="loading_instance">Récupération des informations serveur…</string>
@@ -172,15 +173,16 @@
<string name="back">Retour</string>
<string name="instance_catalog_title">Mastodon est composé dutilisateurs sur différents serveurs.</string>
<string name="instance_catalog_subtitle">Choisissez un serveur en fonction de vos intérêts, de votre région ou alors rejoignez un serveur général. Vous pouvez toujours vous connecter avec tout le monde, quel que soit le serveur.</string>
<string name="search_communities">Rechercher des serveurs ou entrer une URL</string>
<string name="instance_rules_title">Quelques règles de base</string>
<string name="instance_rules_subtitle">Prenez une minute pour revoir les règles définies et appliquées par les administrateurs de %s.</string>
<string name="signup_title">Mettons les choses en place pour %s</string>
<string name="search_communities">Nom ou URL du serveur</string>
<string name="instance_rules_title">Règles du serveur</string>
<string name="instance_rules_subtitle">En continuant, vous acceptez de respecter les règles suivantes définies et appliquées par les modérateurs de %s.</string>
<string name="signup_title">Créer un compte</string>
<string name="edit_photo">modifier</string>
<string name="display_name">nom affiché</string>
<string name="username">nom dutilisateur</string>
<string name="email">courriel</string>
<string name="password">mot de passe</string>
<string name="display_name">Nom</string>
<string name="username">Nom dutilisateur</string>
<string name="email">E-mail</string>
<string name="password">Mot de passe</string>
<string name="confirm_password">Confirmez le mot de passe</string>
<string name="password_note">Inclure les lettres majuscules, les caractères spéciaux et les chiffres pour augmenter la force de votre mot de passe.</string>
<string name="category_academia">Universitaire</string>
<string name="category_activism">Activisme</string>
@@ -195,8 +197,10 @@
<string name="category_music">Musique</string>
<string name="category_regional">Régional</string>
<string name="category_tech">Technologie</string>
<string name="confirm_email_title">Une dernière chose</string>
<string name="confirm_email_subtitle">Appuyez sur le lien que nous vous avons envoyé par courriel pour vérifier votre compte.</string>
<string name="confirm_email_title">Consultez votre boîte de réception</string>
<!-- %s is the email address -->
<string name="confirm_email_subtitle">Cliquez sur le lien que nous vous avons envoyé pour vérifier %s. Nous vous attendons ici.</string>
<string name="confirm_email_didnt_get">Vous n\'avez pas reçu de lien ?</string>
<string name="resend">Renvoyer</string>
<string name="open_email_app">Ouvrir lapplication courriel</string>
<string name="resent_email">Courriel de confirmation envoyé</string>
@@ -284,7 +288,7 @@
<string name="open_in_browser">Ouvrir dans le navigateur</string>
<string name="hide_boosts_from_user">Masquer les partages de %s</string>
<string name="show_boosts_from_user">Afficher les partages de %s</string>
<string name="signup_reason">pourquoi voulez-vous vous inscrire ?</string>
<string name="signup_reason">Pourquoi voulez-vous vous inscrire ?</string>
<string name="signup_reason_note">Cela nous aidera à examiner votre demande.</string>
<string name="clear">Effacer</string>
<string name="profile_header">Image den-tête</string>
@@ -377,17 +381,54 @@
<!-- %s is file size -->
<string name="download_update">Téléchargement (%s)</string>
<string name="install_update">Installer</string>
<string name="privacy_policy_title">Mastodon et votre vie privée</string>
<string name="privacy_policy_subtitle">Bien que lapplication Mastodon ne collecte aucune donnée, le serveur auquel vous vous inscrivez peut avoir une politique différente. Prenez une minute pour examiner et accepter la politique de confidentialité de lapplication Mastodon ainsi que celle de votre serveur.</string>
<string name="privacy_policy_title">Votre Confidentialité</string>
<string name="privacy_policy_subtitle">Bien que l\'application Mastodon ne collecte aucune donnée, le serveur auquel vous vous inscrivez peut avoir une politique différente.\n\nSi vous n\'êtes pas d\'accord avec la politique de %s, vous pouvez revenir en arrière et choisir un serveur différent.</string>
<string name="i_agree">Jaccepte</string>
<string name="empty_list">Cette liste est vide</string>
<string name="instance_signup_closed">Ce serveur n\'accepte pas les nouvelles inscriptions.</string>
<string name="text_copied">Copié dans le presse-papier</string>
<string name="add_bookmark">Favoris</string>
<string name="add_bookmark">Ajouter aux marque-pages</string>
<string name="remove_bookmark">Retirer des favoris</string>
<string name="bookmarks">Favoris</string>
<string name="bookmarks">Marque-pages</string>
<string name="your_favorites">Vos favoris</string>
<string name="login_title">Content de vous revoir</string>
<string name="login_subtitle">Connectez-vous avec le serveur sur lequel vous avez créé votre compte.</string>
<string name="server_url">URL du serveur</string>
<string name="welcome_page1_title">Quest-ce que Mastodon?</string>
<string name="welcome_page1_text">Imaginez que vous ayez une adresse e-mail qui se termine par @example.com.\n\nVous pouvez toujours envoyer et recevoir des e-mails de n\'importe qui, même si leur e-mail se termine par @gmail.com ou @icloud.com ou @example.com.</string>
<string name="welcome_page2_title">Mastodon est comme ça.</string>
<string name="welcome_page2_text">Votre identifiant devrait être @gothgirl654@example.social, mais vous pouvez toujours suivre, rebloguer et discuter avec @fallout5ever@example.online.</string>
<string name="welcome_page3_title">Comment choisir un serveur?</string>
<string name="welcome_page3_text">Différentes personnes choisissent différents serveurs pour un certain nombre de raisons. art.example est un lieu idéal pour les artistes, tandis que glasgow.example pourrait être un bon choix pour les Écossais.\n\nVous ne pouvez pas vous tromper avec l\'un de nos serveurs recommandés et ainsi, quel que soit celui que vous choisissez (ou si vous entrez le vôtre dans la barre de recherche du serveur), vous ne manquerez jamais une info quelque part.</string>
<string name="signup_random_server_explain">Nous choisirons un serveur basé sur votre langue si vous continuez sans faire de sélection.</string>
<string name="server_filter_any_language">N\'importe quelle langue</string>
<string name="server_filter_instant_signup">Inscription instantanée</string>
<string name="server_filter_manual_review">Approbation manuelle</string>
<string name="server_filter_any_signup_speed">Toute vitesse d\'inscription</string>
<string name="server_filter_region_europe">Europe</string>
<string name="server_filter_region_north_america">Amérique du Nord</string>
<string name="server_filter_region_south_america">Amérique du Sud</string>
<string name="server_filter_region_africa">Afrique</string>
<string name="server_filter_region_asia">Asie</string>
<string name="server_filter_region_oceania">Océanie</string>
<string name="not_accepting_new_members">N\'accepte pas de nouveaux membres</string>
<string name="category_special_interests">Intérêt particulier</string>
<string name="signup_passwords_dont_match">Les mots de passe ne correspondent pas</string>
<string name="pick_server_for_me">Choisir pour moi</string>
<string name="profile_add_row">Ajouter une ligne</string>
<string name="profile_setup">Configuration du profil</string>
<string name="profile_setup_subtitle">Vous pourrez toujours compléter cela plus tard dans l\'onglet Profil.</string>
<string name="profile_setup_explanation">Vous pouvez ajouter jusqu\'à quatre champs de profil pour tout ce que vous souhaitez. Localisation, liens, surnoms — le ciel est la limite.</string>
<string name="popular_on_mastodon">Populaire sur Mastodon</string>
<string name="follow_all">Tout suivre</string>
<string name="server_rules_disagree">Refuser</string>
<string name="privacy_policy_explanation">TL;DR : Nous ne collectons ni ne traitons rien.</string>
<!-- %s is server domain -->
<string name="server_policy_disagree">En désaccord avec %s</string>
<string name="profile_bio">Biographie</string>
<!-- Shown in a progress dialog when you tap "follow all" -->
<string name="sending_follows">Utilisateurs suivants…</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 n\'autorise pas les inscriptions de %2$s. Essayez-en un autre ou &lt;a&gt;choisissez un autre serveur&lt;/a&gt;.</string>
<string name="signup_username_taken">Ce nom d\'utilisateur est déjà pris.</string>
</resources>

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