Compare commits

...

116 Commits

Author SHA1 Message Date
4e3268a073 Updated default values 2023-12-10 13:55:27 -08:00
HJ
02fff5ddd5 Merge branch 'neetzsche/accommodate-scrobble-urls' into 'develop'
Accommodate scrobble URLs when present

See merge request pleroma/pleroma-fe!1872
2023-11-30 17:51:32 +00:00
HJ
ce46b97c59 Remove <img> for favicon 2023-11-30 17:47:32 +00:00
NEETzsche
730351dcd1 Accommodate scrobble URLs when present 2023-11-30 09:00:47 -07:00
HJ
358f92adff Merge branch 'weblate' into 'develop'
Translations update from Pleroma Weblate

See merge request pleroma/pleroma-fe!1870
2023-11-27 23:17:09 +00:00
Kian-ting Tan
846f9204f2 Translated using Weblate (Chinese (Min Nan) (nan_TW))
Currently translated at 100.0% (1072 of 1072 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nan_TW/
2023-11-27 14:23:45 +00:00
tusooa
7b9e3b5c24 Translated using Weblate (Chinese (Simplified))
Currently translated at 99.8% (1069 of 1071 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/zh_Hans/
2023-11-27 14:23:45 +00:00
HJ
e84e814c20 Merge branch 'post-mergeback-fixes' into 'develop'
remove duplicate changelog entries

See merge request pleroma/pleroma-fe!1876
2023-11-27 14:23:39 +00:00
Henry Jameson
d580433988 remove duplicate changelog entries 2023-11-27 16:22:45 +02:00
HJ
9cbcd5b5e3 Merge branch 'master' into 'develop'
mergeback master into develop

See merge request pleroma/pleroma-fe!1875
2023-11-27 14:20:48 +00:00
HJ
83acbf953a Merge branch 'release/2.6.x' into 'master'
merge 2.6.x to master since 2.6.1 release

See merge request pleroma/pleroma-fe!1874
2023-11-27 13:48:43 +00:00
Henry Jameson
6c78b59c99 version bunp 2023-11-27 15:38:16 +02:00
Henry Jameson
2cddc138e5 2.6.1 changelog 2023-11-27 15:37:48 +02:00
HJ
55ecb5239a Merge branch 'admin-dashboard-fixes' into 'develop'
Fixes and minor improvements for admin dashboard

See merge request pleroma/pleroma-fe!1863

(cherry picked from commit d21e3d5de2)

f354cef0 fix no feedback and no dropdown close for actions in frontends tab,
c99390e8 make notices appear above admin dash modal
b6a4b620 add better indication that stuff is happening
ce109c38 add favicon setting and add compact layout for AttachmentSetting
bf49aeb7 changelog
d9ea160a account for if there's no primary frontend setup
75eea5f2 Merge remote-tracking branch 'origin/develop' into admin-dashboard-fixes
a190ef2c fix crash added in this MR
1037a3bb remove the WIP tip since pleroma!3862 is in stable
b707a14b make sure generated meta goes below FE-provided favicon so that BE's one
2023-11-27 13:26:19 +00:00
HJ
d21e3d5de2 Merge branch 'admin-dashboard-fixes' into 'develop'
Fixes and minor improvements for admin dashboard

See merge request pleroma/pleroma-fe!1863
2023-11-27 13:26:01 +00:00
Henry Jameson
b707a14b10 make sure generated meta goes below FE-provided favicon so that BE's one
get prioritized
2023-11-22 22:05:16 +02:00
Henry Jameson
1037a3bb72 remove the WIP tip since pleroma!3862 is in stable 2023-11-19 10:06:06 +02:00
Henry Jameson
a190ef2c56 fix crash added in this MR 2023-11-19 10:02:42 +02:00
Henry Jameson
75eea5f2b2 Merge remote-tracking branch 'origin/develop' into admin-dashboard-fixes 2023-11-19 09:58:29 +02:00
Henry Jameson
d9ea160a67 account for if there's no primary frontend setup 2023-11-13 17:31:12 +02:00
HJ
84e2fa1a5e Merge branch 'tusooa/react-more-actions-fix' into 'develop'
Accessibility for react & extra buttons

See merge request pleroma/pleroma-fe!1869

(cherry picked from commit 18c0cf1845)

0026b35f Add alt text for react and extra-buttons popup
82063f34 Add aria-controls to extra-buttons trigger
5ff14837 Add changelog
2023-11-12 23:06:26 +00:00
HJ
18c0cf1845 Merge branch 'tusooa/react-more-actions-fix' into 'develop'
Accessibility for react & extra buttons

See merge request pleroma/pleroma-fe!1869
2023-11-12 23:06:14 +00:00
tusooa
5ff14837a7
Add changelog 2023-11-12 16:47:59 -05:00
Henry Jameson
bf49aeb756 changelog 2023-11-12 22:18:54 +02:00
tusooa
82063f34b2
Add aria-controls to extra-buttons trigger 2023-11-12 15:13:28 -05:00
tusooa
0026b35f66
Add alt text for react and extra-buttons popup 2023-11-12 14:51:39 -05:00
HJ
3781f0e3bf Merge branch 'cherry-pick-faef2767' into 'release/2.6.x'
Fix admin dashboard crashing for 2.6.1

See merge request pleroma/pleroma-fe!1868
2023-11-12 10:48:06 +00:00
HJ
9ccd013522 Merge branch 'tusooa/fix-admin-crash-when-no-primary-fe-set' into 'develop'
fix admin crash when no primary fe set

See merge request pleroma/pleroma-fe!1867

(cherry picked from commit faef2767cd)

661d5b6d Fix frontend admin tab crashing when no primary frontend is set
b2c5520d Add changelog for frontend tab crash fix
2023-11-12 10:38:38 +00:00
HJ
faef2767cd Merge branch 'tusooa/fix-admin-crash-when-no-primary-fe-set' into 'develop'
fix admin crash when no primary fe set

See merge request pleroma/pleroma-fe!1867
2023-11-12 10:38:13 +00:00
tusooa
b2c5520d33
Add changelog for frontend tab crash fix 2023-11-11 19:27:38 -05:00
tusooa
661d5b6d25
Fix frontend admin tab crashing when no primary frontend is set 2023-11-11 19:27:38 -05:00
tusooa
c3c233c6fe Merge branch 'weblate' into 'develop'
Translations update from Pleroma Weblate

See merge request pleroma/pleroma-fe!1866
2023-11-12 00:11:05 +00:00
Dmytro Poltavchenko
7c1c4237b4 Translated using Weblate (Ukrainian)
Currently translated at 90.0% (964 of 1070 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/uk/
2023-11-10 13:31:52 +00:00
Tirifto
f49f8dba6f Translated using Weblate (Esperanto)
Currently translated at 91.9% (974 of 1059 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/eo/
2023-11-10 13:31:52 +00:00
Kian-ting Tan
698a91d345 Translated using Weblate (Chinese (Min Nan) (nan_TW))
Currently translated at 100.0% (1059 of 1059 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nan_TW/
2023-11-10 13:31:52 +00:00
Kian-ting Tan
77b68c9c3f Translated using Weblate (Chinese (Min Nan) (nan_TW))
Currently translated at 79.8% (846 of 1059 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nan_TW/
2023-11-10 13:31:52 +00:00
Kian-ting Tan
06bd834a81 Translated using Weblate (Chinese (Min Nan) (nan_TW))
Currently translated at 77.6% (822 of 1059 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nan_TW/
2023-11-10 13:31:52 +00:00
Kian-ting Tan
cf483f62fd Translated using Weblate (Chinese (Min Nan) (nan_TW))
Currently translated at 76.2% (808 of 1059 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nan_TW/
2023-11-10 13:31:52 +00:00
Kian-ting Tan
1aa506e0cb Translated using Weblate (Chinese (Min Nan) (nan_TW))
Currently translated at 74.2% (786 of 1059 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nan_TW/
2023-11-10 13:31:52 +00:00
Kian-ting Tan
267f25f4f6 Translated using Weblate (Chinese (Min Nan) (nan_TW))
Currently translated at 73.2% (776 of 1059 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nan_TW/
2023-11-10 13:31:52 +00:00
Kian-ting Tan
910fdb39e4 Translated using Weblate (Chinese (Min Nan) (nan_TW))
Currently translated at 72.3% (763 of 1054 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nan_TW/
2023-11-10 13:31:52 +00:00
Kian-ting Tan
24a70bb231 Translated using Weblate (Chinese (Min Nan) (nan_TW))
Currently translated at 70.4% (743 of 1054 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nan_TW/
2023-11-10 13:31:52 +00:00
Kian-ting Tan
dec13e3624 Translated using Weblate (Chinese (Min Nan) (nan_TW))
Currently translated at 69.5% (733 of 1054 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nan_TW/
2023-11-10 13:31:52 +00:00
Kian-ting Tan
17b04a45ea Translated using Weblate (Chinese (Min Nan) (nan_TW))
Currently translated at 67.9% (716 of 1054 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nan_TW/
2023-11-10 13:31:52 +00:00
Kian-ting Tan
7e55fb5579 Translated using Weblate (Chinese (Min Nan) (nan_TW))
Currently translated at 65.1% (687 of 1054 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nan_TW/
2023-11-10 13:31:52 +00:00
Tirifto
08321c2aac Translated using Weblate (Esperanto)
Currently translated at 92.1% (971 of 1054 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/eo/
2023-11-10 13:31:52 +00:00
Kian-ting Tan
6f590a311a Translated using Weblate (Chinese (Min Nan) (nan_TW))
Currently translated at 64.0% (675 of 1054 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nan_TW/
2023-11-10 13:31:52 +00:00
Kian-ting Tan
780dd4e135 Translated using Weblate (Chinese (Min Nan) (nan_TW))
Currently translated at 63.0% (665 of 1054 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nan_TW/
2023-11-10 13:31:52 +00:00
Kian-ting Tan
943e0ac3f5 Translated using Weblate (Chinese (Min Nan) (nan_TW))
Currently translated at 61.0% (643 of 1054 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nan_TW/
2023-11-10 13:31:52 +00:00
Xnuk Shuman
975a240b88 Translated using Weblate (Korean)
Currently translated at 99.9% (1053 of 1054 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ko/
2023-11-10 13:31:52 +00:00
Kian-ting Tan
6690d9fab6 Translated using Weblate (Chinese (Min Nan) (nan_TW))
Currently translated at 60.0% (633 of 1054 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/nan_TW/
2023-11-10 13:31:52 +00:00
Xnuk Shuman
a4f0c6fc86 Translated using Weblate (Korean)
Currently translated at 99.9% (1053 of 1054 strings)

Translation: Pleroma/Pleroma-FE
Translate-URL: https://translate.pleroma.social/projects/pleroma/pleroma-fe/ko/
2023-11-10 13:31:52 +00:00
HJ
60cb173b61 Merge branch 'neetzsche/display-latest-scrobble' into 'develop'
Display the latest scrobble under a user's name

See merge request pleroma/pleroma-fe!1865
2023-11-10 13:31:45 +00:00
Henry Jameson
55d4ea3643 fix layout 2023-11-10 15:24:13 +02:00
NEETzsche
2c9930bd5b Display the latest scrobble under a user's name 2023-11-10 06:11:55 -07:00
Henry Jameson
ce109c38f3 add favicon setting and add compact layout for AttachmentSetting 2023-11-01 22:10:46 +02:00
Henry Jameson
b6a4b62058 add better indication that stuff is happening 2023-11-01 21:53:50 +02:00
Henry Jameson
c99390e864 make notices appear above admin dash modal 2023-11-01 21:48:05 +02:00
Henry Jameson
f354cef010 fix no feedback and no dropdown close for actions in frontends tab,
better default suggest
2023-11-01 21:44:14 +02:00
HJ
954d03150f Merge branch 'tusooa/extra-notifications' into 'develop'
Extra notifications

See merge request pleroma/pleroma-fe!1853
2023-10-31 11:29:04 +00:00
HJ
42d5d8e433 Merge branch 'release/2.6.x' into 'develop'
Mergeback 2.6.0 to develop

See merge request pleroma/pleroma-fe!1862
2023-10-29 16:32:54 +00:00
Henry Jameson
dbf14eee40 Version 2.6.0 2023-10-29 18:30:08 +02:00
Henry Jameson
c8b5b7845d Changelog 2.6.0 2023-10-29 18:29:37 +02:00
HJ
b6accf9e7f Merge branch 'develop' into 'master'
Update master branch

See merge request pleroma/pleroma-fe!1861
2023-10-29 16:26:05 +00:00
HJ
f685f9021b Merge branch 'fix-reports' into 'develop'
fix reports now showing reason

See merge request pleroma/pleroma-fe!1860
2023-10-26 23:48:45 +00:00
Henry Jameson
c9fd9ceb75 changelog 2023-10-27 02:48:30 +03:00
Henry Jameson
c622b77ddd fix reports now showing reason 2023-10-27 02:44:22 +03:00
HJ
4c11ac9a27 Merge branch 'quotes-hide-card' into 'develop'
oops

See merge request pleroma/pleroma-fe!1859
2023-10-13 13:10:57 +00:00
Henry Jameson
8f87a15069 oops 2023-10-13 12:37:50 +03:00
tusooa
3c38a79526 Merge branch 'quotes-hide-card' into 'develop'
Don't display link preview card if it's the same as quoted status

See merge request pleroma/pleroma-fe!1858
2023-10-11 21:03:19 +00:00
Henry Jameson
765fdbe8ab changelog 2023-10-11 22:49:35 +03:00
Henry Jameson
ece79f84a8 don't display link preview card if it's the same as quoted status 2023-10-11 22:43:51 +03:00
tusooa
45470e3355 Merge branch 'renovate/qrcode-1.x' into 'develop'
Update dependency qrcode to v1.5.3

See merge request pleroma/pleroma-fe!1821
2023-10-04 09:42:26 +00:00
tusooa
8801f63720 Merge branch 'renovate/phoenix-1.x' into 'develop'
Update dependency phoenix to v1.7.7

See merge request pleroma/pleroma-fe!1663
2023-10-04 09:40:31 +00:00
tusooa
e66b2b18af Merge branch 'renovate/mini-css-extract-plugin-2.x' into 'develop'
Update dependency mini-css-extract-plugin to v2.7.6

See merge request pleroma/pleroma-fe!1830
2023-10-04 09:38:11 +00:00
tusooa
d356841441 Merge branch 'export-subst-hash' into 'develop'
Use export-subst gitattribute to allow tarball builds

See merge request pleroma/pleroma-fe!1854
2023-10-04 09:31:14 +00:00
tusooa
c05b1b9072 Apply 1 suggestion(s) to 1 file(s) 2023-09-15 06:45:02 +00:00
Haelwenn (lanodan) Monnier
6e5c7bf308 Use export-subst gitattribute to allow tarball builds
For example it would do the following:

    let subst = "d3bf557c";
2023-09-10 09:01:10 +02:00
tusooa
1d679b59a0 Merge branch 'strip-unbalanced-attributes' into 'develop'
Fix HTML attribute parsing, discard attributes not strating with a letter

See merge request pleroma/pleroma-fe!1834
2023-09-04 17:26:42 +00:00
tusooa
b167025554 Merge branch 'fix-oauth2-token-linger' into 'develop'
Fix OAuth2 token lingering after revocation

See merge request pleroma/pleroma-fe!1852
2023-08-26 16:57:28 +00:00
HJ
3c041b2ba1 Merge branch 'tusooa/emoji-picker-button-accessible' into 'develop'
Make emoji picker buttons accessible

See merge request pleroma/pleroma-fe!1840
2023-08-22 20:38:02 +00:00
HJ
d8d2507303 Merge branch 'tusooa/1266-reload-user-pinned' into 'develop'
Fix pinned statuses gone when reloading user timeline

Closes #1266

See merge request pleroma/pleroma-fe!1847
2023-08-22 20:37:48 +00:00
HJ
cc0a63736a Merge branch 'tusooa/1274-nonascii-tags' into 'develop'
Fix parsing non-ascii tags

Closes #1274

See merge request pleroma/pleroma-fe!1848
2023-08-22 20:37:29 +00:00
Alexander Tumin
ac78f80194 Fix OAuth2 token lingering after revocation 2023-08-20 15:51:19 +03:00
tusooa
f059c1f314 Merge branch 'tusooa/quote' into 'develop'
Quote

See merge request pleroma/pleroma-fe!1846
2023-08-19 02:33:26 +00:00
tusooa
f153c688f6
Add changelog 2023-08-18 22:26:29 -04:00
tusooa
e4ab012f21
Move v-if condition to the right place 2023-08-18 22:25:32 -04:00
tusooa
ff25838479
Make lint happy 2023-08-18 22:25:32 -04:00
tusooa
ebee2bda63
Add icons to extra notifications 2023-08-18 22:25:32 -04:00
tusooa
a2c21e2742
Make clickable area the whole row 2023-08-18 22:25:32 -04:00
tusooa
c6715b346b
Show unread marker for extra notifications 2023-08-18 22:25:32 -04:00
tusooa
50bad0fc68
Display unread visuals when there are unread extra notifications 2023-08-18 22:25:32 -04:00
tusooa
bd60238f01
Do not show extra notifications in interactions page 2023-08-18 22:25:32 -04:00
tusooa
1c180ace0b
Fix router links to use route objects 2023-08-18 22:25:32 -04:00
tusooa
7f51ea369e
Make extra notification display customizable 2023-08-18 22:25:32 -04:00
tusooa
c4549f0993
Display follow requests in extra notifications 2023-08-18 22:25:32 -04:00
tusooa
0d6a9e8a64
Display extra notifications on notifications column 2023-08-18 22:25:11 -04:00
Alexander Tumin
9baffbfbde Fix HTML attribute parsing, discard attributes not strating with a letter 2023-08-12 22:35:42 +03:00
tusooa
0b0b1dabdf
Fix parsing non-ascii tags 2023-07-21 14:03:49 -04:00
tusooa
1b081a9272
Make reply-or-quote selection display as horizontal button group 2023-07-19 17:00:46 -04:00
tusooa
35d3b8f27d
Fix pinned statuses gone when reloading user timeline 2023-07-18 19:06:00 -04:00
tusooa
a314ad7ccc
Add fallback return false for quotable judgements 2023-07-17 17:29:18 -04:00
tusooa
441eea3683
Do not show quote options for servers without quote support 2023-07-17 17:28:36 -04:00
tusooa
99cff7e28b
Add changelog for quote 2023-07-17 11:29:36 -04:00
tusooa
63f56cfb27
Add aria-labels for reply/quote selector 2023-07-17 11:27:32 -04:00
tusooa
d22079cf73
Handle recursive quotes 2023-07-17 11:27:32 -04:00
tusooa
d72486f3e4
Implement sending quote posts 2023-07-17 11:27:07 -04:00
tusooa
1c20487494
Implement showing quotes 2023-07-13 00:44:30 -04:00
Pleroma Renovate Bot
067eefdb44 Update dependency phoenix to v1.7.7 2023-07-11 09:08:35 +00:00
tusooa
16140c278b
Add changelog 2023-06-18 15:46:05 -04:00
tusooa
96ef76f1d7
Make emoji picker buttons accessible 2023-06-18 15:45:30 -04:00
HJ
321a131c20 Merge branch 'cherry-pick-624af7ed' into 'master'
cherrypick parser fix into stable

See merge request pleroma/pleroma-fe!1836
2023-06-06 16:32:22 +00:00
HJ
4bc7873e03 Merge branch 'harden-parser' into 'develop'
fix regex misinterpreting tag name in badly formed HTML

See merge request pleroma/pleroma-fe!1835

(cherry picked from commit 624af7ed00)

00b47e16 fix regex misinterpreting tag name in badly formed HTML, prevent rich
5e656cc0 Merge remote-tracking branch 'origin/develop' into harden-parser
10e28f6c changelog
0109724a case insensititvy
2023-06-06 16:28:13 +00:00
Pleroma Renovate Bot
064ff35822 Update dependency mini-css-extract-plugin to v2.7.6 2023-05-23 09:07:59 +00:00
Pleroma Renovate Bot
73430beb5c Update dependency qrcode to v1.5.3 2023-05-05 09:04:29 +00:00
HJ
3a507ba9b2 Merge branch 'develop' into 'master'
Update stable - 2.5.0 release

See merge request pleroma/pleroma-fe!1711
2022-12-23 13:31:18 +00:00
71 changed files with 1723 additions and 137 deletions

1
.gitattributes vendored Normal file
View File

@ -0,0 +1 @@
/build/webpack.prod.conf.js export-subst

View File

@ -3,6 +3,37 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## 2.6.1
### Fixed
- fix admin dashboard not having any feedback on frontend installation
- Fix frontend admin tab crashing when no primary frontend is set
- Add aria attributes to react and extra buttons
## 2.6.0
### Added
- add the initial i18n translation file for Taiwanese (Hokkien), and modify some related files.
- Implemented a very basic instance administration screen
- Implement quoting
### Fixed
- Keep aspect ratio of custom emoji reaction in notification
- Fix openSettingsModalTab so that it correctly opens Settings modal instead of Admin modal
- Add alt text to emoji picker buttons
- Use export-subst gitattribute to allow tarball builds
- fix reports now showing reason/content
- Fix HTML attribute parsing, discard attributes not strating with a letter
- Make MentionsLine aware of line breaking by non-br elements
- Fix a bug where mentioning a user twice will not fill the mention into the textarea
- Fix parsing non-ascii tags
- Fix OAuth2 token lingering after revocation
- fix regex issue in HTML parser/renderer
- don't display quoted status twice
- fix typo in code that prevented cards from showing at all
- Fix react button not working if reaction accounts are not loaded
- Fix react button misalignment on safari ios
- Fix pinned statuses gone when reloading user timeline
- Fix scrolling emoji selector in modal in safari ios
## 2.5.1
### Fixed
- Checkboxes in settings can now work with screenreaders

View File

@ -11,9 +11,16 @@ var env = process.env.NODE_ENV === 'testing'
? require('../config/test.env')
: config.build.env
let commitHash = require('child_process')
let commitHash = (() => {
const subst = "$Format:%h$";
if(!subst.match(/Format:/)) {
return subst;
} else {
return require('child_process')
.execSync('git rev-parse --short HEAD')
.toString();
}
})();
var webpackConfig = merge(baseWebpackConfig, {
mode: 'production',

View File

@ -1 +0,0 @@
add the initial i18n translation file for Taiwanese (Hokkien), and modify some related files.

View File

@ -1 +0,0 @@
Implemented a very basic instance administration screen

View File

@ -0,0 +1 @@
Create a link to the URL of the scrobble when it's present

View File

@ -1 +0,0 @@
Keep aspect ratio of custom emoji reaction in notification

View File

@ -1 +0,0 @@
Fix openSettingsModalTab so that it correctly opens Settings modal instead of Admin modal

View File

@ -0,0 +1 @@
Support showing extra notifications in the notifications column

View File

@ -1 +0,0 @@
Fix a bug where mentioning a user twice will not fill the mention into the textarea

View File

@ -1 +0,0 @@
Make MentionsLine aware of line breaking by non-br elements

View File

@ -1 +0,0 @@
fix regex issue in HTML parser/renderer

View File

@ -1 +0,0 @@
Fix react button misalignment on safari ios

View File

@ -1 +0,0 @@
Fix react button not working if reaction accounts are not loaded

View File

@ -1 +0,0 @@
Fix scrolling emoji selector in modal in safari ios

View File

@ -0,0 +1 @@
Shows the most recent scrobble under each post when available

View File

@ -3,8 +3,8 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1,user-scalable=no">
<!--server-generated-meta-->
<link rel="icon" type="image/png" href="/favicon.png">
<!--server-generated-meta-->
</head>
<body class="hidden">
<noscript>To use Pleroma, please enable JavaScript.</noscript>

View File

@ -1,6 +1,6 @@
{
"name": "pleroma_fe",
"version": "2.5.0",
"version": "2.6.1",
"description": "Pleroma frontend, the default frontend of Pleroma social network server",
"author": "Pleroma contributors <https://git.pleroma.social/pleroma/pleroma-fe/-/blob/develop/CONTRIBUTORS.md>",
"private": false,
@ -35,9 +35,9 @@
"js-cookie": "3.0.1",
"localforage": "1.10.0",
"parse-link-header": "2.0.0",
"phoenix": "1.6.2",
"phoenix": "1.7.7",
"punycode.js": "2.3.0",
"qrcode": "1.5.1",
"qrcode": "1.5.3",
"querystring-es3": "0.2.1",
"url": "0.11.0",
"utf8": "3.0.0",
@ -97,7 +97,7 @@
"karma-spec-reporter": "0.0.36",
"karma-webpack": "5.0.0",
"lodash": "4.17.21",
"mini-css-extract-plugin": "2.7.5",
"mini-css-extract-plugin": "2.7.6",
"mocha": "10.2.0",
"nightwatch": "2.6.20",
"opn": "5.5.0",

View File

@ -259,6 +259,7 @@ const getNodeInfo = async ({ store }) => {
store.dispatch('setInstanceOption', { name: 'editingAvailable', value: features.includes('editing') })
store.dispatch('setInstanceOption', { name: 'pollLimits', value: metadata.pollLimits })
store.dispatch('setInstanceOption', { name: 'mailerEnabled', value: metadata.mailerEnabled })
store.dispatch('setInstanceOption', { name: 'quotingAvailable', value: features.includes('quote_posting') })
const uploadLimits = metadata.uploadLimits
store.dispatch('setInstanceOption', { name: 'uploadlimit', value: parseInt(uploadLimits.general) })

View File

@ -1,4 +1,5 @@
import Completion from '../../services/completion/completion.js'
import genRandomSeed from '../../services/random_seed/random_seed.service.js'
import EmojiPicker from '../emoji_picker/emoji_picker.vue'
import Popover from 'src/components/popover/popover.vue'
import ScreenReaderNotice from 'src/components/screen_reader_notice/screen_reader_notice.vue'
@ -110,7 +111,7 @@ const EmojiInput = {
},
data () {
return {
randomSeed: `${Math.random()}`.replace('.', '-'),
randomSeed: genRandomSeed(),
input: undefined,
caretEl: undefined,
highlighted: -1,

View File

@ -3,7 +3,7 @@
ref="popover"
trigger="click"
popover-class="emoji-picker popover-default"
:trigger-attrs="{ 'aria-hidden': true }"
:trigger-attrs="{ 'aria-hidden': true, tabindex: -1 }"
@show="onPopoverShown"
@close="onPopoverClosed"
>
@ -28,6 +28,7 @@
active: activeGroupView === group.id
}"
:title="group.text"
role="button"
@click.prevent="highlight(group.id)"
>
<span
@ -116,6 +117,7 @@
:key="group.id + emoji.displayText"
:title="maybeLocalizedEmojiName(emoji)"
class="emoji-item"
role="button"
@click.stop.prevent="onEmoji(emoji)"
>
<span
@ -126,6 +128,7 @@
v-else
class="emoji-picker-emoji -custom"
loading="lazy"
:alt="maybeLocalizedEmojiName(emoji)"
:src="emoji.imageUrl"
:data-emoji-name="group.id + emoji.displayText"
/>

View File

@ -1,4 +1,5 @@
import Popover from '../popover/popover.vue'
import genRandomSeed from '../../services/random_seed/random_seed.service.js'
import ConfirmModal from '../confirm_modal/confirm_modal.vue'
import { library } from '@fortawesome/fontawesome-svg-core'
import {
@ -40,7 +41,8 @@ const ExtraButtons = {
data () {
return {
expanded: false,
showingDeleteDialog: false
showingDeleteDialog: false,
randomSeed: genRandomSeed()
}
},
methods: {
@ -152,6 +154,15 @@ const ExtraButtons = {
editingAvailable () { return this.$store.state.instance.editingAvailable },
shouldConfirmDelete () {
return this.$store.getters.mergedConfig.modalOnDelete
},
triggerAttrs () {
return {
title: this.$t('status.more_actions'),
id: `popup-trigger-${this.randomSeed}`,
'aria-controls': `popup-menu-${this.randomSeed}`,
'aria-expanded': this.expanded,
'aria-haspopup': 'menu'
}
}
}
}

View File

@ -2,6 +2,7 @@
<Popover
class="ExtraButtons"
trigger="click"
:trigger-attrs="triggerAttrs"
placement="top"
:offset="{ y: 5 }"
:bound-to="{ x: 'container' }"
@ -10,10 +11,15 @@
@close="onClose"
>
<template #content="{close}">
<div class="dropdown-menu">
<div
class="dropdown-menu"
role="menu"
:id="`popup-menu-${randomSeed}`"
>
<button
v-if="canMute && !status.thread_muted"
class="button-default dropdown-item dropdown-item-icon"
role="menuitem"
@click.prevent="muteConversation"
>
<FAIcon
@ -24,6 +30,7 @@
<button
v-if="canMute && status.thread_muted"
class="button-default dropdown-item dropdown-item-icon"
role="menuitem"
@click.prevent="unmuteConversation"
>
<FAIcon
@ -34,6 +41,7 @@
<button
v-if="!status.pinned && canPin"
class="button-default dropdown-item dropdown-item-icon"
role="menuitem"
@click.prevent="pinStatus"
@click="close"
>
@ -45,6 +53,7 @@
<button
v-if="status.pinned && canPin"
class="button-default dropdown-item dropdown-item-icon"
role="menuitem"
@click.prevent="unpinStatus"
@click="close"
>
@ -57,6 +66,7 @@
<button
v-if="!status.bookmarked"
class="button-default dropdown-item dropdown-item-icon"
role="menuitem"
@click.prevent="bookmarkStatus"
@click="close"
>
@ -68,6 +78,7 @@
<button
v-if="status.bookmarked"
class="button-default dropdown-item dropdown-item-icon"
role="menuitem"
@click.prevent="unbookmarkStatus"
@click="close"
>
@ -80,6 +91,7 @@
<button
v-if="ownStatus && editingAvailable"
class="button-default dropdown-item dropdown-item-icon"
role="menuitem"
@click.prevent="editStatus"
@click="close"
>
@ -91,6 +103,7 @@
<button
v-if="isEdited && editingAvailable"
class="button-default dropdown-item dropdown-item-icon"
role="menuitem"
@click.prevent="showStatusHistory"
@click="close"
>
@ -102,6 +115,7 @@
<button
v-if="canDelete"
class="button-default dropdown-item dropdown-item-icon"
role="menuitem"
@click.prevent="deleteStatus"
@click="close"
>
@ -112,6 +126,7 @@
</button>
<button
class="button-default dropdown-item dropdown-item-icon"
role="menuitem"
@click.prevent="copyLink"
@click="close"
>
@ -123,6 +138,7 @@
<a
v-if="!status.is_local"
class="button-default dropdown-item dropdown-item-icon"
role="menuitem"
title="Source"
:href="status.external_url"
target="_blank"
@ -134,6 +150,7 @@
</a>
<button
class="button-default dropdown-item dropdown-item-icon"
role="menuitem"
@click.prevent="reportStatus"
@click="close"
>

View File

@ -0,0 +1,48 @@
import { mapGetters } from 'vuex'
import { library } from '@fortawesome/fontawesome-svg-core'
import {
faUserPlus,
faComments,
faBullhorn
} from '@fortawesome/free-solid-svg-icons'
library.add(
faUserPlus,
faComments,
faBullhorn
)
const ExtraNotifications = {
computed: {
shouldShowChats () {
return this.mergedConfig.showExtraNotifications && this.mergedConfig.showChatsInExtraNotifications && this.unreadChatCount
},
shouldShowAnnouncements () {
return this.mergedConfig.showExtraNotifications && this.mergedConfig.showAnnouncementsInExtraNotifications && this.unreadAnnouncementCount
},
shouldShowFollowRequests () {
return this.mergedConfig.showExtraNotifications && this.mergedConfig.showFollowRequestsInExtraNotifications && this.followRequestCount
},
hasAnythingToShow () {
return this.shouldShowChats || this.shouldShowAnnouncements || this.shouldShowFollowRequests
},
shouldShowCustomizationTip () {
return this.mergedConfig.showExtraNotificationsTip && this.hasAnythingToShow
},
currentUser () {
return this.$store.state.users.currentUser
},
...mapGetters(['unreadChatCount', 'unreadAnnouncementCount', 'followRequestCount', 'mergedConfig'])
},
methods: {
openNotificationSettings () {
return this.$store.dispatch('openSettingsModalTab', 'notifications')
},
dismissConfigurationTip () {
return this.$store.dispatch('setOption', { name: 'showExtraNotificationsTip', value: false })
}
}
}
export default ExtraNotifications

View File

@ -0,0 +1,113 @@
<template>
<div class="ExtraNotifications">
<div
v-if="shouldShowChats"
class="notification unseen"
>
<div class="notification-overlay" />
<router-link
class="button-unstyled -link extra-notification"
:to="{ name: 'chats', params: { username: currentUser.screen_name } }"
>
<FAIcon
fixed-width
class="fa-scale-110 icon"
icon="comments"
/>
{{ $tc('notifications.unread_chats', unreadChatCount, { num: unreadChatCount }) }}
</router-link>
</div>
<div
v-if="shouldShowAnnouncements"
class="notification unseen"
>
<div class="notification-overlay" />
<router-link
class="button-unstyled -link extra-notification"
:to="{ name: 'announcements' }"
>
<FAIcon
fixed-width
class="fa-scale-110 icon"
icon="bullhorn"
/>
{{ $tc('notifications.unread_announcements', unreadAnnouncementCount, { num: unreadAnnouncementCount }) }}
</router-link>
</div>
<div
v-if="shouldShowFollowRequests"
class="notification unseen"
>
<div class="notification-overlay" />
<router-link
class="button-unstyled -link extra-notification"
:to="{ name: 'friend-requests' }"
>
<FAIcon
fixed-width
class="fa-scale-110 icon"
icon="user-plus"
/>
{{ $tc('notifications.unread_follow_requests', followRequestCount, { num: followRequestCount }) }}
</router-link>
</div>
<i18n-t
v-if="shouldShowCustomizationTip"
tag="span"
class="notification tip extra-notification"
keypath="notifications.configuration_tip"
>
<template #theSettings>
<button
class="button-unstyled -link"
@click="openNotificationSettings"
>
{{ $t('notifications.configuration_tip_settings') }}
</button>
</template>
<template #dismiss>
<button
class="button-unstyled -link"
@click="dismissConfigurationTip"
>
{{ $t('notifications.configuration_tip_dismiss') }}
</button>
</template>
</i18n-t>
</div>
</template>
<script src="./extra_notifications.js" />
<style lang="scss">
@import "../../variables";
.ExtraNotifications {
width: 100%;
display: flex;
flex-direction: column;
align-items: stretch;
.notification {
width: 100%;
border-bottom: 1px solid;
border-color: $fallback--border;
border-color: var(--border, $fallback--border);
display: flex;
flex-direction: column;
align-items: stretch;
}
.extra-notification {
padding: 1em;
}
.icon {
margin-right: 0.5em;
}
.tip {
display: inline;
}
}
</style>

View File

@ -32,7 +32,7 @@
top: calc(var(--navbar-height) + 0.5em);
width: 100%;
pointer-events: none;
z-index: var(--ZI_navbar_popovers);
z-index: var(--ZI_modals_popovers);
display: flex;
flex-direction: column;
align-items: center;

View File

@ -39,6 +39,7 @@
<Notifications
ref="notifications"
:no-heading="true"
:no-extra="true"
:minimal-mode="true"
:filter-mode="filterMode"
/>

View File

@ -1,7 +1,10 @@
import SideDrawer from '../side_drawer/side_drawer.vue'
import Notifications from '../notifications/notifications.vue'
import ConfirmModal from '../confirm_modal/confirm_modal.vue'
import { unseenNotificationsFromStore } from '../../services/notification_utils/notification_utils'
import {
unseenNotificationsFromStore,
countExtraNotifications
} from '../../services/notification_utils/notification_utils'
import GestureService from '../../services/gesture_service/gesture_service'
import NavigationPins from 'src/components/navigation/navigation_pins.vue'
import { mapGetters } from 'vuex'
@ -50,7 +53,7 @@ const MobileNav = {
return unseenNotificationsFromStore(this.$store)
},
unseenNotificationsCount () {
return this.unseenNotifications.length
return this.unseenNotifications.length + countExtraNotifications(this.$store)
},
hideSitename () { return this.$store.state.instance.hideSitename },
sitename () { return this.$store.state.instance.name },

View File

@ -1,12 +1,14 @@
import { computed } from 'vue'
import { mapGetters } from 'vuex'
import Notification from '../notification/notification.vue'
import ExtraNotifications from '../extra_notifications/extra_notifications.vue'
import NotificationFilters from './notification_filters.vue'
import notificationsFetcher from '../../services/notifications_fetcher/notifications_fetcher.service.js'
import {
notificationsFromStore,
filteredNotificationsFromStore,
unseenNotificationsFromStore
unseenNotificationsFromStore,
countExtraNotifications
} from '../../services/notification_utils/notification_utils.js'
import FaviconService from '../../services/favicon_service/favicon_service.js'
import { library } from '@fortawesome/fontawesome-svg-core'
@ -23,7 +25,8 @@ const DEFAULT_SEEN_TO_DISPLAY_COUNT = 30
const Notifications = {
components: {
Notification,
NotificationFilters
NotificationFilters,
ExtraNotifications
},
props: {
// Disables panel styles, unread mark, potentially other notification-related actions
@ -31,6 +34,11 @@ const Notifications = {
minimalMode: Boolean,
// Custom filter mode, an array of strings, possible values 'mention', 'repeat', 'like', 'follow', used to override global filter for use in "Interactions" timeline
filterMode: Array,
// Do not show extra notifications
noExtra: {
type: Boolean,
default: false
},
// Disable teleporting (i.e. for /users/user/notifications)
disableTeleport: Boolean
},
@ -65,11 +73,17 @@ const Notifications = {
filteredNotifications () {
return filteredNotificationsFromStore(this.$store, this.filterMode)
},
unseenCountBadgeText () {
return `${this.unseenCount ? this.unseenCount : ''}${this.extraNotificationsCount ? '*' : ''}`
},
unseenCount () {
return this.unseenNotifications.length
},
extraNotificationsCount () {
return countExtraNotifications(this.$store)
},
unseenCountTitle () {
return this.unseenCount + (this.unreadChatCount) + this.unreadAnnouncementCount
return this.unseenNotifications.length + (this.unreadChatCount) + this.unreadAnnouncementCount
},
loading () {
return this.$store.state.statuses.notifications.loading
@ -94,6 +108,9 @@ const Notifications = {
return this.filteredNotifications.slice(0, this.unseenCount + this.seenToDisplayCount)
},
noSticky () { return this.$store.getters.mergedConfig.disableStickyHeaders },
showExtraNotifications () {
return !this.noExtra
},
...mapGetters(['unreadChatCount', 'unreadAnnouncementCount'])
},
mounted () {

View File

@ -17,9 +17,9 @@
<div class="title">
{{ $t('notifications.notifications') }}
<span
v-if="unseenCount"
v-if="unseenCountBadgeText"
class="badge badge-notification unseen-count"
>{{ unseenCount }}</span>
>{{ unseenCountBadgeText }}</span>
</div>
<div
v-if="showScrollTop"
@ -54,6 +54,13 @@
class="panel-body"
role="feed"
>
<div
v-if="showExtraNotifications"
role="listitem"
class="notification"
>
<extra-notifications />
</div>
<div
v-for="notification in notificationsToDisplay"
:key="notification.id"

View File

@ -1,4 +1,5 @@
import Timeago from 'components/timeago/timeago.vue'
import genRandomSeed from '../../services/random_seed/random_seed.service.js'
import RichContent from 'components/rich_content/rich_content.jsx'
import { forEach, map } from 'lodash'
@ -13,7 +14,7 @@ export default {
return {
loading: false,
choices: [],
randomSeed: `${Math.random()}`.replace('.', '-')
randomSeed: genRandomSeed()
}
},
created () {

View File

@ -1,4 +1,5 @@
import statusPoster from '../../services/status_poster/status_poster.service.js'
import genRandomSeed from '../../services/random_seed/random_seed.service.js'
import MediaUpload from '../media_upload/media_upload.vue'
import ScopeSelector from '../scope_selector/scope_selector.vue'
import EmojiInput from '../emoji_input/emoji_input.vue'
@ -156,11 +157,13 @@ const PostStatusForm = {
poll: this.statusPoll || {},
mediaDescriptions: this.statusMediaDescriptions || {},
visibility: this.statusScope || scope,
contentType: statusContentType
contentType: statusContentType,
quoting: false
}
}
return {
randomSeed: genRandomSeed(),
dropFiles: [],
uploadingFiles: false,
error: null,
@ -265,6 +268,30 @@ const PostStatusForm = {
isEdit () {
return typeof this.statusId !== 'undefined' && this.statusId.trim() !== ''
},
quotable () {
if (!this.$store.state.instance.quotingAvailable) {
return false
}
if (!this.replyTo) {
return false
}
const repliedStatus = this.$store.state.statuses.allStatusesObject[this.replyTo]
if (!repliedStatus) {
return false
}
if (repliedStatus.visibility === 'public' ||
repliedStatus.visibility === 'unlisted' ||
repliedStatus.visibility === 'local') {
return true
} else if (repliedStatus.visibility === 'private') {
return repliedStatus.user.id === this.$store.state.users.currentUser.id
}
return false
},
...mapGetters(['mergedConfig']),
...mapState({
mobileLayout: state => state.interface.mobileLayout
@ -292,7 +319,8 @@ const PostStatusForm = {
visibility: newStatus.visibility,
contentType: newStatus.contentType,
poll: {},
mediaDescriptions: {}
mediaDescriptions: {},
quoting: false
}
this.pollFormVisible = false
this.$refs.mediaUpload && this.$refs.mediaUpload.clearFile()
@ -340,6 +368,8 @@ const PostStatusForm = {
return
}
const replyOrQuoteAttr = newStatus.quoting ? 'quoteId' : 'inReplyToStatusId'
const postingOptions = {
status: newStatus.status,
spoilerText: newStatus.spoilerText || null,
@ -347,7 +377,7 @@ const PostStatusForm = {
sensitive: newStatus.nsfw,
media: newStatus.files,
store: this.$store,
inReplyToStatusId: this.replyTo,
[replyOrQuoteAttr]: this.replyTo,
contentType: newStatus.contentType,
poll,
idempotencyKey: this.idempotencyKey
@ -373,6 +403,7 @@ const PostStatusForm = {
}
const newStatus = this.newStatus
this.previewLoading = true
const replyOrQuoteAttr = newStatus.quoting ? 'quoteId' : 'inReplyToStatusId'
statusPoster.postStatus({
status: newStatus.status,
spoilerText: newStatus.spoilerText || null,
@ -380,7 +411,7 @@ const PostStatusForm = {
sensitive: newStatus.nsfw,
media: [],
store: this.$store,
inReplyToStatusId: this.replyTo,
[replyOrQuoteAttr]: this.replyTo,
contentType: newStatus.contentType,
poll: {},
preview: true

View File

@ -126,6 +126,36 @@
class="preview-status"
/>
</div>
<div
v-if="quotable"
role="radiogroup"
class="btn-group reply-or-quote-selector"
>
<button
:id="`reply-or-quote-option-${randomSeed}-reply`"
class="btn button-default reply-or-quote-option"
:class="{ toggled: !newStatus.quoting }"
tabindex="0"
role="radio"
:aria-labelledby="`reply-or-quote-option-${randomSeed}-reply`"
:aria-checked="!newStatus.quoting"
@click="newStatus.quoting = false"
>
{{ $t('post_status.reply_option') }}
</button>
<button
:id="`reply-or-quote-option-${randomSeed}-quote`"
class="btn button-default reply-or-quote-option"
:class="{ toggled: newStatus.quoting }"
tabindex="0"
role="radio"
:aria-labelledby="`reply-or-quote-option-${randomSeed}-quote`"
:aria-checked="newStatus.quoting"
@click="newStatus.quoting = true"
>
{{ $t('post_status.quote_option') }}
</button>
</div>
<EmojiInput
v-if="!disableSubject && (newStatus.spoilerText || alwaysShowSubject)"
v-model="newStatus.spoilerText"
@ -420,6 +450,10 @@
margin: 0;
}
.reply-or-quote-selector {
margin-bottom: 0.5em;
}
.text-format {
.only-format {
color: $fallback--faint;

View File

@ -11,6 +11,8 @@
/>
<span
class="button-unstyled popover-trigger"
role="button"
:tabindex="0"
:title="$t('tool_tip.add_reaction')"
@click.stop.prevent="show"
>

View File

@ -1,6 +1,7 @@
import Select from '../select/select.vue'
import StatusContent from '../status_content/status_content.vue'
import Timeago from '../timeago/timeago.vue'
import RichContent from 'src/components/rich_content/rich_content.jsx'
import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'
const Report = {
@ -10,10 +11,12 @@ const Report = {
components: {
Select,
StatusContent,
Timeago
Timeago,
RichContent
},
computed: {
report () {
console.log(this.$store.state.reports.reports[this.reportId] || {})
return this.$store.state.reports.reports[this.reportId] || {}
},
state: {

View File

@ -4,6 +4,7 @@ import IntegerSetting from '../helpers/integer_setting.vue'
import StringSetting from '../helpers/string_setting.vue'
import GroupSetting from '../helpers/group_setting.vue'
import Popover from 'src/components/popover/popover.vue'
import PanelLoading from 'src/components/panel_loading/panel_loading.vue'
import SharedComputedObject from '../helpers/shared_computed_object.js'
import { library } from '@fortawesome/fontawesome-svg-core'
@ -22,12 +23,18 @@ const FrontendsTab = {
defaultSource: 'admin'
}
},
data () {
return {
working: false
}
},
components: {
BooleanSetting,
ChoiceSetting,
IntegerSetting,
StringSetting,
GroupSetting,
PanelLoading,
Popover
},
created () {
@ -42,18 +49,56 @@ const FrontendsTab = {
...SharedComputedObject()
},
methods: {
canInstall (frontend) {
const fe = this.frontends.find(f => f.name === frontend.name)
if (!fe) return false
return fe.refs.includes(frontend.ref)
},
getSuggestedRef (frontend) {
const defaultFe = this.adminDraft[':pleroma'][':frontends'][':primary']
if (defaultFe?.name === frontend.name && this.canInstall(defaultFe)) {
return defaultFe.ref
} else {
return frontend.refs[0]
}
},
update (frontend, suggestRef) {
const ref = suggestRef || frontend.refs[0]
const ref = suggestRef || this.getSuggestedRef(frontend)
const { name } = frontend
const payload = { name, ref }
this.working = true
this.$store.state.api.backendInteractor.installFrontend({ payload })
.then((externalUser) => {
.finally(() => {
this.working = false
})
.then(async (response) => {
this.$store.dispatch('loadFrontendsStuff')
if (response.error) {
const reason = await response.error.json()
this.$store.dispatch('pushGlobalNotice', {
level: 'error',
messageKey: 'admin_dash.frontend.failure_installing_frontend',
messageArgs: {
version: name + '/' + ref,
reason: reason.error
},
timeout: 5000
})
} else {
this.$store.dispatch('pushGlobalNotice', {
level: 'success',
messageKey: 'admin_dash.frontend.success_installing_frontend',
messageArgs: {
version: name + '/' + ref
},
timeout: 2000
})
}
})
},
setDefault (frontend, suggestRef) {
const ref = suggestRef || frontend.refs[0]
const ref = suggestRef || this.getSuggestedRef(frontend)
const { name } = frontend
this.$store.commit('updateAdminDraft', { path: [':pleroma', ':frontends', ':primary'], value: { name, ref } })

View File

@ -3,6 +3,22 @@
padding: 0;
}
.relative {
position: relative;
}
.overlay {
position: absolute;
background: var(--bg);
// fix buttons showing through
z-index: 2;
opacity: 0.9;
top: 0;
bottom: 0;
left: 0;
right: 0;
}
dd {
text-overflow: ellipsis;
word-wrap: nowrap;

View File

@ -10,7 +10,6 @@
<li>
<h3>{{ $t('admin_dash.frontend.default_frontend') }}</h3>
<p>{{ $t('admin_dash.frontend.default_frontend_tip') }}</p>
<p>{{ $t('admin_dash.frontend.default_frontend_tip2') }}</p>
<ul class="setting-list">
<li>
<StringSetting path=":pleroma.:frontends.:primary.name" />
@ -24,7 +23,8 @@
</ul>
</li>
</ul>
<div class="setting-list">
<div class="setting-list relative">
<PanelLoading class="overlay" v-if="working"/>
<h3>{{ $t('admin_dash.frontend.available_frontends') }}</h3>
<ul class="cards-list">
<li
@ -33,9 +33,9 @@
>
<strong>{{ frontend.name }}</strong>
{{ ' ' }}
<span v-if="adminDraft[':pleroma'][':frontends'][':primary'].name === frontend.name">
<span v-if="adminDraft[':pleroma'][':frontends'][':primary']?.name === frontend.name">
<i18n-t
v-if="adminDraft[':pleroma'][':frontends'][':primary'].ref === frontend.refs[0]"
v-if="adminDraft[':pleroma'][':frontends'][':primary']?.ref === frontend.refs[0]"
keypath="admin_dash.frontend.is_default"
/>
<i18n-t
@ -86,6 +86,11 @@
? $t('admin_dash.frontend.reinstall')
: $t('admin_dash.frontend.install')
}}
<code>
{{
getSuggestedRef(frontend)
}}
</code>
</button>
<Popover
v-if="frontend.refs.length > 1"
@ -93,13 +98,14 @@
class="button-dropdown"
placement="bottom"
>
<template #content>
<template #content="{close}">
<div class="dropdown-menu">
<button
v-for="ref in frontend.refs"
:key="ref"
class="button-default dropdown-item"
@click="update(frontend, ref)"
@click.prevent="update(frontend, ref)"
@click="close"
>
<i18n-t keypath="admin_dash.frontend.install_version">
<template #version>
@ -128,14 +134,19 @@
class="button button-default btn"
type="button"
:disabled="
adminDraft[':pleroma'][':frontends'][':primary'].name === frontend.name &&
adminDraft[':pleroma'][':frontends'][':primary'].ref === frontend.refs[0]
adminDraft[':pleroma'][':frontends'][':primary']?.name === frontend.name &&
adminDraft[':pleroma'][':frontends'][':primary']?.ref === frontend.refs[0]
"
@click="setDefault(frontend)"
>
{{
$t('admin_dash.frontend.set_default')
}}
<code>
{{
getSuggestedRef(frontend)
}}
</code>
</button>
{{ ' ' }}
<Popover
@ -144,13 +155,14 @@
class="button-dropdown"
placement="bottom"
>
<template #content>
<template #content="{close}">
<div class="dropdown-menu">
<button
v-for="ref in frontend.refs.slice(1)"
v-for="ref in frontend.installedRefs || frontend.refs"
:key="ref"
class="button-default dropdown-item"
@click="setDefault(frontend, ref)"
@click.prevent="setDefault(frontend, ref)"
@click="close"
>
<i18n-t keypath="admin_dash.frontend.set_default_version">
<template #version>

View File

@ -6,6 +6,10 @@
<li>
<StringSetting path=":pleroma.:instance.:name" />
</li>
<!-- See https://git.pleroma.social/pleroma/pleroma/-/merge_requests/3963 -->
<li v-if="adminDraft[':pleroma'][':instance'][':favicon'] !== undefined">
<AttachmentSetting compact path=":pleroma.:instance.:favicon" />
</li>
<li>
<StringSetting path=":pleroma.:instance.:email" />
</li>
@ -16,7 +20,7 @@
<StringSetting path=":pleroma.:instance.:short_description" />
</li>
<li>
<AttachmentSetting path=":pleroma.:instance.:instance_thumbnail" />
<AttachmentSetting compact path=":pleroma.:instance.:instance_thumbnail" />
</li>
<li>
<AttachmentSetting path=":pleroma.:instance.:background_image" />

View File

@ -7,6 +7,7 @@ export default {
...Setting,
props: {
...Setting.props,
compact: Boolean,
acceptTypes: {
type: String,
required: false,

View File

@ -2,6 +2,7 @@
<span
v-if="matchesExpertLevel"
class="AttachmentSetting"
:class="{ '-compact': compact }"
>
<label
:for="path"
@ -24,8 +25,8 @@
{{ backendDescriptionDescription + ' ' }}
</p>
<div class="attachment-input">
<div>{{ $t('settings.url') }}</div>
<div class="controls">
<div class="controls control-field">
<label for="path">{{ $t('settings.url') }}</label>
<input
:id="path"
class="string-input"
@ -40,7 +41,7 @@
/>
<ProfileSettingIndicator :is-profile="isProfileSetting" />
</div>
<div>{{ $t('settings.preview') }}</div>
<div v-if="!compact">{{ $t('settings.preview') }}</div>
<Attachment
class="attachment"
:compact="compact"
@ -50,7 +51,7 @@
@setMedia="onMedia"
@naturalSizeLoad="onNaturalSizeLoad"
/>
<div class="controls">
<div class="controls control-upload">
<MediaUpload
ref="mediaUpload"
class="media-upload-icon"
@ -84,6 +85,35 @@
width: 20em;
}
&.-compact {
.attachment-input {
flex-direction: row;
align-items: flex-end;
}
.attachment {
flex: 0;
order: 0;
display: block;
min-width: 4em;
height: 4em;
align-self: center;
margin-bottom: 0;
}
.control-field {
order: 1;
min-width: 12em;
margin-left: 0.5em;
}
.control-upload {
order: 2;
min-width: 12em;
padding: 0 0.5em;
}
}
.controls {
margin-bottom: 0.5em;

View File

@ -91,6 +91,11 @@
{{ $t('settings.hide_attachments_in_convo') }}
</BooleanSetting>
</li>
<li>
<BooleanSetting path="hideScrobbles">
{{ $t('settings.hide_scrobbles') }}
</BooleanSetting>
</li>
</ul>
</div>
<div

View File

@ -51,6 +51,47 @@
</li>
</ul>
</li>
<li>
<BooleanSetting path="showExtraNotifications">
{{ $t('settings.notification_show_extra') }}
</BooleanSetting>
</li>
<li>
<ul class="setting-list suboptions">
<li>
<BooleanSetting
path="showChatsInExtraNotifications"
:disabled="!mergedConfig.showExtraNotifications"
>
{{ $t('settings.notification_extra_chats') }}
</BooleanSetting>
</li>
<li>
<BooleanSetting
path="showAnnouncementsInExtraNotifications"
:disabled="!mergedConfig.showExtraNotifications"
>
{{ $t('settings.notification_extra_announcements') }}
</BooleanSetting>
</li>
<li>
<BooleanSetting
path="showFollowRequestsInExtraNotifications"
:disabled="!mergedConfig.showExtraNotifications"
>
{{ $t('settings.notification_extra_follow_requests') }}
</BooleanSetting>
</li>
<li>
<BooleanSetting
path="showExtraNotificationsTip"
:disabled="!mergedConfig.showExtraNotifications"
>
{{ $t('settings.notification_extra_tip') }}
</BooleanSetting>
</li>
</ul>
</li>
</ul>
</div>

View File

@ -39,7 +39,8 @@ import {
faThumbtack,
faChevronUp,
faChevronDown,
faAngleDoubleRight
faAngleDoubleRight,
faPlay
} from '@fortawesome/free-solid-svg-icons'
library.add(
@ -59,7 +60,8 @@ library.add(
faThumbtack,
faChevronUp,
faChevronDown,
faAngleDoubleRight
faAngleDoubleRight,
faPlay
)
const camelCase = name => name.charAt(0).toUpperCase() + name.slice(1)
@ -133,6 +135,7 @@ const Status = {
'showPinned',
'inProfile',
'profileUserId',
'inQuote',
'simpleTree',
'controlledThreadDisplayStatus',
@ -159,7 +162,8 @@ const Status = {
uncontrolledMediaPlaying: [],
suspendable: true,
error: null,
headTailLinks: null
headTailLinks: null,
displayQuote: !this.inQuote
}
},
computed: {
@ -401,6 +405,24 @@ const Status = {
},
editingAvailable () {
return this.$store.state.instance.editingAvailable
},
hasVisibleQuote () {
return this.status.quote_url && this.status.quote_visible
},
hasInvisibleQuote () {
return this.status.quote_url && !this.status.quote_visible
},
quotedStatus () {
return this.status.quote_id ? this.$store.state.statuses.allStatusesObject[this.status.quote_id] : undefined
},
shouldDisplayQuote () {
return this.quotedStatus && this.displayQuote
},
scrobblePresent () {
return !this.mergedConfig.hideScrobbles && this.status.user.latestScrobble && this.status.user.latestScrobble.artist
},
scrobble () {
return this.status.user.latestScrobble
}
},
methods: {
@ -469,6 +491,18 @@ const Status = {
window.scrollBy(0, rect.bottom - window.innerHeight + 50)
}
}
},
toggleDisplayQuote () {
if (this.shouldDisplayQuote) {
this.displayQuote = false
} else if (!this.quotedStatus) {
this.$store.dispatch('fetchStatus', this.status.quote_id)
.then(() => {
this.displayQuote = true
})
} else {
this.displayQuote = true
}
}
},
watch: {

View File

@ -422,4 +422,22 @@
}
}
}
.quoted-status {
margin-top: 0.5em;
border: 1px solid var(--border, $fallback--border);
border-radius: var(--attachmentRadius, $fallback--attachmentRadius);
&.-unavailable-prompt {
padding: 0.5em;
}
}
.display-quoted-status-button {
margin: 0.5em;
&-icon {
color: inherit;
}
}
}

View File

@ -249,6 +249,47 @@
</button>
</span>
</div>
<div
v-if="scrobblePresent"
class="status-rich-presence"
>
<a
v-if="scrobble.externalLink"
:href="scrobble.externalLink"
target="_blank"
>
{{ scrobble.artist }} {{ scrobble.title }}
<FAIcon
class="fa-scale-110 fa-old-padding"
icon="play"
/>
<span class="status-rich-presence-time">
<Timeago
template-key="time.in_past"
:time="scrobble.created_at"
:auto-update="60"
/>
</span>
</a>
<span v-if="!scrobble.externalLink">
<FAIcon
class="fa-scale-110 fa-old-padding"
icon="music"
/>
{{ scrobble.artist }} {{ scrobble.title }}
<FAIcon
class="fa-scale-110 fa-old-padding"
icon="play"
/>
<span class="status-rich-presence-time">
<Timeago
template-key="time.in_past"
:time="scrobble.created_at"
:auto-update="60"
/>
</span>
</span>
</div>
<div
v-if="isReply || hasMentionsLine"
class="heading-reply-row"
@ -364,6 +405,45 @@
@parseReady="setHeadTailLinks"
/>
<article
v-if="hasVisibleQuote"
class="quoted-status"
>
<button
class="button-unstyled -link display-quoted-status-button"
:aria-expanded="shouldDisplayQuote"
@click="toggleDisplayQuote"
>
{{ shouldDisplayQuote ? $t('status.hide_quote') : $t('status.display_quote') }}
<FAIcon
class="display-quoted-status-button-icon"
:icon="shouldDisplayQuote ? 'chevron-up' : 'chevron-down'"
/>
</button>
<Status
v-if="shouldDisplayQuote"
:statusoid="quotedStatus"
:in-quote="true"
/>
</article>
<p
v-else-if="hasInvisibleQuote"
class="quoted-status -unavailable-prompt"
>
<i18n-t keypath="status.invisible_quote">
<template #link>
<bdi>
<a
:href="status.quote_url"
target="_blank"
>
{{ status.quote_url }}
</a>
</bdi>
</template>
</i18n-t>
</p>
<div
v-if="inConversation && !isPreview && replies && replies.length"
class="replies"

View File

@ -73,6 +73,10 @@ const StatusContent = {
},
computed: {
...controlledOrUncontrolledGetters(['showingTall', 'expandingSubject', 'showingLongSubject']),
statusCard () {
if (!this.status.card) return null
return this.status.card.url === this.status.quote_url ? null : this.status.card
},
hideAttachments () {
return (this.mergedConfig.hideAttachments && !this.inConversation) ||
(this.mergedConfig.hideAttachmentsInConv && this.inConversation)

View File

@ -43,7 +43,7 @@
/>
<div
v-if="status.card && !noHeading && !compact"
v-if="statusCard && !noHeading && !compact"
class="link-preview media-body"
>
<link-preview

View File

@ -160,6 +160,9 @@ const Timeline = {
if (this.timeline.flushMarker !== 0) {
this.$store.commit('clearTimeline', { timeline: this.timelineName, excludeUserId: true })
this.$store.commit('queueFlush', { timeline: this.timelineName, id: 0 })
if (this.timelineName === 'user') {
this.$store.dispatch('fetchPinnedStatuses', this.userId)
}
this.fetchOlderStatuses()
} else {
this.blockClicksTemporarily()

View File

@ -205,7 +205,13 @@
"migrated_to": "migrated to",
"reacted_with": "reacted with {0}",
"submitted_report": "submitted a report",
"poll_ended": "poll has ended"
"poll_ended": "poll has ended",
"unread_announcements": "{num} unread announcement | {num} unread announcements",
"unread_chats": "{num} unread chat | {num} unread chats",
"unread_follow_requests": "{num} new follow request | {num} new follow requests",
"configuration_tip": "You can customize what to display here in {theSettings}. {dismiss}",
"configuration_tip_settings": "the settings",
"configuration_tip_dismiss": "Do not show again"
},
"polls": {
"add_poll": "Add poll",
@ -261,6 +267,8 @@
"post_status": {
"edit_status": "Edit status",
"new_status": "Post new status",
"reply_option": "Reply to this status",
"quote_option": "Quote this status",
"account_not_locked_warning": "Your account is not {0}. Anyone can follow you to view your follower-only posts.",
"account_not_locked_warning_link": "locked",
"attachments_sensitive": "Mark attachments as sensitive",
@ -487,6 +495,7 @@
"hide_muted_posts": "Hide posts of muted users",
"mute_bot_posts": "Mute bot posts",
"hide_bot_indication": "Hide bot indication in posts",
"hide_scrobbles": "Hide scrobbles",
"hide_all_muted_posts": "Hide muted posts",
"max_thumbnails": "Maximum amount of thumbnails per post (empty = no limit)",
"hide_isp": "Hide instance-specific panel",
@ -559,6 +568,11 @@
"notification_visibility_moves": "User Migrates",
"notification_visibility_emoji_reactions": "Reactions",
"notification_visibility_polls": "Ends of polls you voted in",
"notification_show_extra": "Show extra notifications in the notifications column",
"notification_extra_chats": "Show unread chats",
"notification_extra_announcements": "Show unread announcements",
"notification_extra_follow_requests": "Show new follow requests",
"notification_extra_tip": "Show the customization tip for extra notifications",
"no_rich_text_description": "Strip rich text formatting from all posts",
"no_blocks": "No blocks",
"no_mutes": "No mutes",
@ -900,8 +914,9 @@
"wip_notice": "Please note that this section is a WIP and lacks certain features as backend implementation of front-end management is incomplete.",
"default_frontend": "Default front-end",
"default_frontend_tip": "Default front-end will be shown to all users. Currently there's no way to for a user to select personal front-end. If you switch away from PleromaFE you'll most likely have to use old and buggy AdminFE to do instance configuration until we replace it.",
"default_frontend_tip2": "WIP: Since Pleroma backend doesn't properly list all installed frontends you'll have to enter name and reference manually. List below provides shortcuts to fill the values.",
"available_frontends": "Available for install"
"available_frontends": "Available for install",
"failure_installing_frontend": "Failed to install frontend {version}: {reason}",
"success_installing_frontend": "Frontend {version} successfully installed"
},
"temp_overrides": {
":pleroma": {
@ -1028,7 +1043,11 @@
"show_all_conversation": "Show full conversation ({numStatus} other status) | Show full conversation ({numStatus} other statuses)",
"show_only_conversation_under_this": "Only show replies to this status",
"status_history": "Status history",
"reaction_count_label": "{num} person reacted | {num} people reacted"
"reaction_count_label": "{num} person reacted | {num} people reacted",
"hide_quote": "Hide the quoted status",
"display_quote": "Display the quoted status",
"invisible_quote": "Quoted status unavailable: {link}",
"more_actions": "More actions on this status"
},
"user_card": {
"approve": "Approve",

View File

@ -172,12 +172,14 @@
"direct_warning_to_first_only": "Ĉi tiu afiŝo estas nur videbla al uzantoj menciitaj je la komenco de la mesaĝo.",
"direct_warning_to_all": "Ĉi tiu afiŝo estos videbla al ĉiuj menciitaj uzantoj.",
"media_description": "Priskribo de vidaŭdaĵo",
"post": "Afiŝo",
"post": "Afiŝi",
"edit_remote_warning": "Aliaj foraj nodoj eble ne subtenas redaktadon, kaj ne povos ricevi pli novan version de via afiŝo.",
"edit_unsupported_warning": "Pleroma ne subtenas redaktadon de mencioj aŭ enketoj.",
"edit_status": "Redakti afiŝon",
"content_type_selection": "Formo de afiŝo",
"scope_notice_dismiss": "Fermi ĉi tiun avizon"
"scope_notice_dismiss": "Fermi ĉi tiun avizon",
"reply_option": "Respondi al ĉi tiu afiŝo",
"quote_option": "Citi ĉi tiun afiŝon"
},
"registration": {
"bio": "Priskribo",
@ -873,7 +875,8 @@
"symbols": "Simboloj",
"travel-and-places": "Vojaĝoj kaj lokoj"
},
"regional_indicator": "Regiona marko {letter}"
"regional_indicator": "Regiona marko {letter}",
"unpacked": "Malpakitaj bildosignoj"
},
"polls": {
"not_enough_options": "Tro malmultaj unikaj elektebloj en la enketo",

View File

@ -558,7 +558,7 @@
"discoverable": "검색 결과나 다른 서비스들에서 이 계정을 찾을 수 있도록 허용",
"pad_emoji": "에모지를 선택창에서 고를 때 띄어쓰기를 집어넣기",
"wordfilter": "단어 필터",
"word_filter_and_more": "단어 필터 그리고 더보기...",
"word_filter_and_more": "단어 필터 및 기타 설정...",
"accent": "강조",
"hide_media_previews": "미디어 미리보기 숨기기",
"max_thumbnails": "게시물 하나 당 최대로 보여질 섬네일 개수 (비워두면 제한을 두지 않습니다)",
@ -686,7 +686,15 @@
"remove_language": "삭제",
"primary_language": "주 언어:",
"fallback_language": "보조 언어 {index}:",
"confirm_dialogs_logout": "로그아웃"
"confirm_dialogs_logout": "로그아웃",
"url": "URL",
"preview": "미리보기",
"commit_value": "저장",
"commit_value_tooltip": "값이 저장되지 않았습니다, 버튼을 눌러 변경사항을 반영하세요",
"reset_value": "초기화",
"reset_value_tooltip": "변경사항 초기화",
"hard_reset_value": "완전 초기화",
"hard_reset_value_tooltip": "스토리지에서 설정을 제거하고, 기본값을 사용하도록 강제합니다"
},
"timeline": {
"collapse": "접기",
@ -703,7 +711,8 @@
"no_more_statuses": "새 게시물 없음",
"socket_reconnected": "실시간 연결 됨",
"socket_broke": "실시간 연결이 끊어짐: CloseEvent 코드 {0}",
"quick_filter_settings": "빠른 필터 설정"
"quick_filter_settings": "빠른 필터 설정",
"quick_view_settings": "빠른 뷰 설정"
},
"user_card": {
"approve": "승인",
@ -774,7 +783,33 @@
"approve_confirm_accept_button": "승인",
"approve_confirm_cancel_button": "승인 안 함",
"approve_confirm": "{user}의 팔로우 요청을 승인할까요?",
"block_confirm_title": "차단 확인"
"block_confirm_title": "차단 확인",
"note": "노트",
"unfollow_confirm": "정말 {user}를 팔로우 해제하시겠습니까?",
"unfollow_confirm_accept_button": "팔로우 해제",
"unfollow_confirm_cancel_button": "취소",
"remove_follower_confirm_title": "팔로워 삭제 확인",
"remove_follower_confirm_cancel_button": "냅두기",
"remove_follower_confirm_accept_button": "치우기",
"edit_note_cancel": "취소",
"birthday": "{birthday}에 태어남",
"edit_note": "노트 수정",
"edit_note_apply": "적용",
"deny_confirm_cancel_button": "취소",
"unfollow_confirm_title": "팔로우 해제 확인",
"mute_confirm_accept_button": "뮤트",
"remove_follower_confirm": "정말 {user}를 팔로워에서 치울까요?",
"deny_confirm_accept_button": "거절",
"mute_confirm_title": "뮤트 확인",
"mute_confirm": "정말 {user}를 뮤트할까요?",
"block_confirm_cancel_button": "취소",
"deny_confirm_title": "거절 확인",
"block_confirm": "정말 {user}를 차단할까요?",
"block_confirm_accept_button": "차단",
"mute_confirm_cancel_button": "취소",
"mute_duration_prompt": "이 사용자를 뮤트할 시간 (0으로 두면 무한히):",
"deny_confirm": "{user}의 팔로 요청을 거절할까요?",
"note_blank": "(없음)"
},
"user_profile": {
"timeline_title": "사용자 타임라인",
@ -794,7 +829,10 @@
"add_reaction": "반응 추가",
"accept_follow_request": "팔로우 요청 승인",
"reject_follow_request": "팔로우 요청 거절",
"bookmark": "북마크"
"bookmark": "북마크",
"autocomplete_available": "{number}개의 결과가 있습니다. 위 또는 아래 화살표 키로 탐색할 수 있습니다. | {number}개의 결과가 있습니다. 위 또는 아래 화살표 키로 탐색할 수 있습니다.",
"toggle_expand": "알림을 펼치거나 접어서 전체 게시물을 보기",
"toggle_mute": "알림을 펼치거나 접어서 뮤트한 내용 보기"
},
"upload": {
"error": {
@ -840,7 +878,8 @@
"symbols": "기호"
},
"keep_open": "열린 채로 두기",
"regional_indicator": "지역 표시기 {letter}"
"regional_indicator": "지역 표시기 {letter}",
"unpacked": "미분류 에모지"
},
"polls": {
"add_poll": "투표를 추가",
@ -1049,7 +1088,8 @@
"update_changelog_here": "변경 내역",
"update_changelog": "무엇이 바뀌었는지 자세히 알아보시려면, {theFullChangelog}을 참조하세요.",
"big_update_content": "저희가 한동안 릴리즈를 안 해서, 익숙하셨던 생김새나 경험과 많이 달라졌을 수 있습니다.",
"update_bugs": "저희가 비록 테스트를 많이 하고 직접 개발 버전을 쓰기도 하지만, 많이 바꾸기도 했고, 몇몇 가지 놓친 점들이 있을 터이니, 사용하면서 불편한 점이나 문제는 {pleromaGitlab}에 제보해주시면 감사하겠습니다. 저희는 겪으신 문제점이나 Pleroma와 Pleroma-FE에 대한 피드백과 제안을 환영합니다."
"update_bugs": "저희가 비록 테스트를 많이 하고 직접 개발 버전을 쓰기도 하지만, 많이 바꾸기도 했고, 몇몇 가지 놓친 점들이 있을 터이니, 사용하면서 불편한 점이나 문제는 {pleromaGitlab}에 제보해주시면 감사하겠습니다. 저희는 겪으신 문제점이나 Pleroma와 Pleroma-FE에 대한 피드백과 제안을 환영합니다.",
"art_by": "{linkToArtist} 그림"
},
"unicode_domain_indicator": {
"tooltip": "이 도메인은 아스키 문자가 아닌 문자를 포함하고 있습니다."
@ -1115,7 +1155,9 @@
"repeat_confirm_cancel_button": "리핏 안 함",
"delete_confirm_title": "삭제 확인",
"delete_confirm_accept_button": "삭제",
"delete_confirm_cancel_button": "냅두기"
"delete_confirm_cancel_button": "냅두기",
"delete_error": "게시물 삭제 에러: {0}",
"reaction_count_label": "{num}명이 반응함 | {num}명이 반응함"
},
"errors": {
"storage_unavailable": "Pleroma가 브라우저 저장소에 접근할 수 없습니다. 로그인이 풀리거나 로컬 설정이 초기화 되는 등 예상치 못한 문제를 겪을 수 있습니다. 쿠키를 활성화 해보세요."
@ -1159,5 +1201,91 @@
"submit_edit_action": "수정본 반영",
"cancel_edit_action": "취소",
"inactive_message": "이 공지사항은 비활성화 되었습니다"
},
"admin_dash": {
"window_title": "관리",
"wip_notice": "이 관리자 대시보드는 실험적이며 개발 중에 있습니다, {adminFeLink}.",
"old_ui_link": "대신 구 관리자 UI를 사용할 수 있습니다",
"reset_all": "전부 초기화",
"commit_all": "전부 저장",
"tabs": {
"nodb": "DB 설정 불가",
"instance": "인스턴스",
"frontends": "프론트엔드",
"limits": "제한"
},
"nodb": {
"heading": "데이터베이스 설정 기능이 비활성화 되어 있습니다",
"documentation": "관련 문서",
"text2": "대부분의 설정을 건드릴 수 없습니다.",
"text": "백엔드 설정 파일에서 {property}를 {value}로 바꿔야 합니다, {documentation}를 참고하세요."
},
"captcha": {
"kocaptcha": "KoCaptcha",
"native": "내장"
},
"instance": {
"registrations": "유저 가입",
"captcha_header": "캡차",
"kocaptcha": "KoCaptcha 설정",
"access": "인스턴스 접근",
"restrict": {
"timelines": "타임라인 접근",
"profiles": "사용자 프로필 접근",
"activities": "게시물/활동 접근",
"header": "로그인하지 않은 방문자의 접근을 제한",
"description": "특정 API의 접근을 허용할지 말지에 대한 세부 설정입니다. 기본적으로(애매한 체크 표시) 인스턴스가 비공개이면 접근을 차단합니다, 체크 표시는 인스턴스가 공개여도 차단함을 의미합니다, 체크 해제는 인스턴스가 비공개여도 접근을 허용함을 의미합니다. 설정을 바꾸면 예기치 않은 동작이 일어날 수 있음을 유의하세요, 예로 프로필 접근이 차단되면 프로필 정보 없이 게시물이 보여집니다."
},
"instance": "인스턴스 정보"
},
"limits": {
"arbitrary_limits": "임의 제한",
"posts": "게시물 제한",
"uploads": "첨부파일 제한",
"users": "사용자 프로필 제한",
"profile_fields": "프로필 필드 제한",
"user_uploads": "프로필 미디어 제한"
},
"frontend": {
"repository": "리포지토리 링크",
"versions": "사용 가능한 버전",
"build_url": "빌드 URL",
"reinstall": "재설치",
"is_default": "(기본)",
"is_default_custom": "(기본, 버전: {version})",
"install": "설치",
"install_version": "설치된 버전 {version}",
"more_install_options": "설치 옵션 더 보기",
"more_default_options": "기본 설정 옵션 더 보기",
"set_default": "기본으로 설정",
"set_default_version": "버전 {version}을 기본으로 설정",
"wip_notice": "이 부분은 프론트엔드 관리에 대한 백엔드 구현이 미완성이기 때문에 개발 중이고 몇몇 기능이 빠져 있습니다.",
"default_frontend": "기본 프론트엔드",
"default_frontend_tip2": "개발 중: 아직 Pleroma 백엔드가 모든 설치된 프론트엔드 목록을 알려주지 않기 때문에 이름과 ref을 직접 입력해야 합니다. 아래에 있는 목록은 여기 값을 입력하기 위한 단축 버튼입니다.",
"available_frontends": "설치 가능",
"default_frontend_tip": "기본 프론트엔드는 모든 유저에게 보입니다. 현재로썬 유저가 개인적으로 프론트엔드를 선택할 수 있진 않습니다. PleromaFE에서 벗어난다면 저희가 완전히 대체할 때까지는 인스턴스 설정을 위해서 아마도 낡고 버그투성이인 AdminFE를 쓰셔야 할 겁니다."
},
"temp_overrides": {
":pleroma": {
":instance": {
":public": {
"label": "인스턴스를 공개",
"description": "이것을 끄면 모든 API가 로그인한 유저만 사용 가능하게 되며, 로그인하지 않은 사용자에겐 공개와 연합 타임라인이 보이지 않게 됩니다."
},
":limit_to_local_content": {
"label": "로컬 컨텐츠만 검색하도록 제한",
"description": "로그인하지 않은 사람 (기본값), 모두 또는 없음에게 전역 검색을 비활성화합니다"
},
":description_limit": {
"label": "글자수 제한",
"description": "첨부파일 설명문의 글자수 제한"
},
":background_image": {
"label": "배경 이미지",
"description": "배경 이미지 (주로 PleromaFE에서 쓰임)"
}
}
}
}
}
}

View File

@ -205,7 +205,13 @@
"migrated_to": "移民到",
"reacted_with": "顯出{0} ê 反應",
"submitted_report": "送出檢舉",
"poll_ended": "投票結束"
"poll_ended": "投票結束",
"unread_announcements": "{num} 篇公告iáu bē 讀",
"unread_chats": "{num} ê開講iáu bē讀",
"unread_follow_requests": "{num}ê新ê跟tuè請求",
"configuration_tip": "用{theSettings}lí通自訂siánn物佇tsia顯示。{dismiss}",
"configuration_tip_settings": "設定",
"configuration_tip_dismiss": "Mài koh顯示"
},
"polls": {
"add_poll": "開投票",
@ -248,12 +254,12 @@
"regional_indicator": "地區指引 {letter}"
},
"errors": {
"storage_unavailable": "Pleroma buē-tàng the̍h 著瀏覽器儲存 ê。Lí ê 登入狀態抑是局部設定 buē 儲存mā 凡勢 tú 著意料外 ê 問題。拍開 cookie 看。"
"storage_unavailable": "Pleroma buē-tàng the̍h 著瀏覽器儲存 ê。Lí ê 登入狀態抑是局部設定 buē 儲存mā 凡勢 tú 著意料外 ê 問題。拍開 cookie 看māi。"
},
"interactions": {
"favs_repeats": "轉送 kap kah 意",
"follows": "最近綴 lí ê",
"emoji_reactions": "繪文字 ê 應",
"emoji_reactions": "繪文字 ê 應",
"reports": "檢舉",
"moves": "用者 ê 移民",
"load_older": "載入 koh khah 早 ê 互動"
@ -273,13 +279,13 @@
},
"content_type_selection": "貼 ê 形式",
"content_warning": "主旨(毋是必要)",
"default": "Tú kàu 高雄 ah。",
"default": "Tú正kàu高雄ah。",
"direct_warning_to_all": "Tsit ê PO 文通 hōo 逐 ê 提起 ê 用者看見。",
"direct_warning_to_first_only": "Tsit ê PO 文kan-ta 短信 tú 開始提起 ê 用者tsiah 通看見。",
"direct_warning_to_first_only": "Tsit ê PO 文kan-ta佇短phue tú開始提起ê用者tsiah通看見。",
"edit_remote_warning": "別 ê 站臺可能無支援編輯,無法度收著 PO 文上新 ê 版本。",
"edit_unsupported_warning": "Pleroma 無支持編輯 the̍h 起 hām 投票。",
"posting": "PO 文",
"preview": "Sing 看覓",
"preview": "Sing看māi",
"preview_empty": "空 ê",
"empty_status_error": "無法度 PO 無檔案 koh 空 ê 狀態",
"media_description_error": "更新媒體失敗,請 koh 試一 kái",
@ -295,7 +301,9 @@
"public": "公開 - PO kàu 公開時間線",
"unlisted": "Mài 列出來 - Mài PO tī 公開時間線"
},
"post": "PO 上去"
"post": "PO 上去",
"reply_option": "應tsit ê狀態",
"quote_option": "引用tsit ê狀態"
},
"registration": {
"bio_optional": "介紹(毋是必要)",
@ -360,7 +368,16 @@
"color": "色彩",
"opacity": "無透明度",
"contrast": {
"hint": "色彩ê對比率:{ratio}。{level}、 {context}"
"hint": "色彩ê對比率:{ratio}。{level}、 {context}",
"level": {
"aa": "合AA級ê準則上kē ê)",
"aaa": "合AAA級ê準則建議ê",
"bad": "無合半ê無障礙準則"
},
"context": {
"18pt": "大18pt 以上)ê文字",
"text": "文字"
}
}
},
"switcher": {
@ -370,7 +387,7 @@
"keep_roundness": "保留邊á角ê khà-buh",
"keep_fonts": "保持字型",
"reset": "重頭設定",
"clear_all": "清掉",
"clear_all": "Lóng清掉",
"clear_opacity": "清掉無透明度",
"load_theme": "載入主題",
"keep_as_is": "Mài振動",
@ -380,8 +397,116 @@
"upgraded_from_v2": "PleromaFE升級ah主題huân-sè kap lí知影ê無kâng。",
"v2_imported": "Lí輸入ê檔案是舊版本ê前端用ê。Guán盡量予版本相通毋過可能有所在buē-tàng。",
"older_version_imported": "Lí輸入ê檔案是予舊ê前端用ê。",
"future_version_imported": "Lí輸入ê檔案是新ê前端所用ê。"
"future_version_imported": "Lí輸入ê檔案是新ê前端所用ê。",
"snapshot_missing": "無主題ê快相佇檔案內所以伊看起來凡勢kap原來預料ê無kâng。",
"snapshot_present": "主題ê快相有載入所以逐ê值lóng khàm過去ah。Lí 通改載入主題實際ê資料。",
"fe_upgraded": "版本更新了後Pleroma前端ê ia̋n-jín 升級ah。",
"fe_downgraded": "Pleroma ê前端滾tńg去ah。",
"migration_snapshot_ok": "為著保險主題快相載入去ah。Lí ē當試載入主題資料。",
"migration_napshot_gone": "快相因故無去ahtsi̍t-kuá所在看起來可能hām lí所想ê無kâng。",
"snapshot_source_mismatch": "版本tshia̋ng-póng上可能因為前端滾轉去koh更新ah若因為用舊版本ê前端主題tsiah改變lí有可能beh用舊ê版本。無著用新ê。"
},
"save_load_hint": "佇揀iah是載入主題ê時「保存」選項保留現tsú時設定ê選項mā佇輸出主題ê時tsūn儲存頭拄á講ê選項。若是逐ê選擇框á無設定逐項設定就ē khǹg佇輸出ê主題。"
},
"common_colors": {
"_tab_label": "一般",
"main": "一般ê色彩",
"foreground_hint": "請看「進階」分頁來調整khah幼ê所在",
"rgbo": "標頭、強調、徽章"
},
"advanced_colors": {
"_tab_label": "進階",
"alert": "警告ê背景",
"alert_error": "錯誤",
"alert_warning": "警告",
"alert_neutral": "其他ê",
"post": "PO文用者紹介",
"badge": "徽章ê背景",
"popover": "提示、目錄、跳出來ê",
"badge_notification": "通知",
"panel_header": "面枋ê標題",
"top_bar": "頂 liâu-á",
"borders": "框á邊",
"buttons": "鈕仔",
"inputs": "輸入框á",
"faint_text": "淺ê文字",
"underlay": "Tshū-á",
"wallpaper": "壁紙",
"poll": "投票數ê圖",
"icons": "標á",
"highlight": "強調ê要素",
"pressed": "Tshi̍h ê 時",
"selectedPost": "選擇ê PO文",
"selectedMenu": "選擇ê目錄項目",
"disabled": "關ê",
"toggled": "切換ê時",
"tabs": "分頁",
"chat": {
"incoming": "收著ê",
"outgoing": "送出ê",
"border": "框á邊"
}
},
"radii": {
"_tab_label": "邊á角ê khà-buh"
},
"shadows": {
"_tab_label": "影kap光",
"override": "Khàm掉",
"shadow_id": "影 #{value}",
"blur": "予n̄g-n̄g",
"spread": "Hōo 闊",
"inset": "內pîng",
"filter_hint": {
"always_drop_shadow": "警告tsit ê 影一直用 {0}若是瀏覽器支援tsē。",
"drop_shadow_syntax": "{0} 無支援參數 {1} kap 關鍵字 {2}。",
"avatar_inset": "請注意結合內pîng kap外pîng ê影佇標頭,可能佇透明ê標頭現無預料ê結果。",
"spread_zero": "若是「hōo 闊」ê值比0較大影ê顯示ē kap hōo 闊設做0 kâng款",
"inset_classic": "內pîng ê影ē用{0}"
},
"component": "部件",
"hintV3": "針對影lí mā ē當用 {0} 標示法,來用其他ê色彩 khang (slot)。",
"components": {
"panelHeader": "面枋ê標題",
"topBar": "頂 liâu-á",
"avatar": "用者ê標頭(佇個人資料欄位)",
"popup": "跳出來ê kap提醒",
"button": "鈕仔",
"buttonHover": "鈕仔滑鼠ê指標khǹg佇面頂",
"panel": "面枋",
"avatarStatus": "用者ê標頭佇PO文ê顯示",
"buttonPressedHover": "鈕仔滑鼠指標leh khǹg 佇頂懸koh tshi̍h ê時)",
"buttonPressed": "鈕仔leh tshi̍h ê時)",
"input": "輸入框á"
}
},
"fonts": {
"_tab_label": "字型",
"components": {
"interface": "界面",
"input": "輸入框á",
"post": "PO文",
"postCode": "RTF ê PO文ê平闊文字"
},
"family": "字型ê名",
"help": "揀界面元件所用ê字型。若是揀「家己指定」lí著輸入系統內ê字型正確ê名。",
"size": "Sài-suh單位畫素",
"weight": "字ê重(粗度)",
"custom": "家己指定"
},
"preview": {
"header": "先看māi",
"content": "內容",
"error": "錯誤ê例",
"button": "鈕á",
"text": "Tsē是{0}kap{1} ê例",
"mono": "內容",
"input": "Tú正kàu高雄ah。",
"faint_link": "有幫tsān ê手冊",
"fine_print": "讀guán ê {0},毋過學無有路用ê!",
"header_faint": "Tsē OK",
"checkbox": "我有讀過使用條款",
"link": "好ê細ê連結"
}
},
"upload": {
@ -594,11 +719,11 @@
"hide_all_muted_posts": "Khàm掉消音êPO文",
"max_thumbnails": "PO文ê縮小圖ê khòo-tah無寫=無限制)",
"hide_isp": "Khàm 站臺特有ê面 pang",
"right_sidebar": "Kā 邊á liâu徙kah正手pîng",
"navbar_column_stretch": "伸導覽liâukah 欄平闊",
"right_sidebar": "Kā 邊á ê欄位徙kah正手pîng",
"navbar_column_stretch": "伸導覽liâukah 欄平闊",
"always_show_post_button": "一直顯示「新ê PO文」ê鈕仔",
"hide_wallpaper": "Khàm站臺ê壁紙",
"use_one_click_nsfw": "Tshi̍h 一ê就會當拍開敏感內容",
"use_one_click_nsfw": "Tshi̍h chi̍t 下就ē當拍開敏感內容",
"hide_post_stats": "Khàm PO文ê統計數據比如kah 意ê額數)",
"hide_filtered_statuses": "Khàm 逐ê過濾掉êPO文",
"hide_wordfiltered_statuses": "Khàm詞語過濾掉ê狀態",
@ -627,7 +752,7 @@
"mute_bot_posts": "Kā 機器lâng ê PO文消音",
"hide_shoutbox": "Khàm 站臺ê留話pang",
"account_backup_description": "Tse 予 lí ē當 kā lín 口座 ê 資訊 kap PO 文載落來,毋過 in 猶無法度輸入kàu Pleroma口座 ê 內底。",
"theme_help_v2_1": "拍開選擇框á就 ē 當改掉一寡組件ê色彩kap無透明度。Ji̍h「清掉所有ê」,ē 恢復原來ê款。",
"theme_help_v2_1": "拍開選擇框á就 ē 當改掉一寡組件ê色彩kap無透明度。Ji̍h「Lóng清掉」,ē 恢復原來ê款。",
"preload_images": "Kā 圖片先載入",
"hide_user_stats": "Khàm 掉用者ê統計數據(比如:綴ê lâng額",
"interfaceLanguage": "界面ê語言",
@ -678,7 +803,7 @@
"notification_visibility_mentions": "提起",
"notification_visibility_repeats": "轉送",
"notification_visibility_moves": "用者suá位",
"notification_visibility_emoji_reactions": "應",
"notification_visibility_emoji_reactions": "應",
"notification_visibility_polls": "Lí參與ê選舉辦suah佇",
"no_rich_text_description": "Po文mài用RTF格式",
"no_blocks": "無封鎖",
@ -690,7 +815,7 @@
"show_moderator_badge": "佇我ê個人資料顯示「管理員」證章",
"nsfw_clickthrough": "Khàm掉敏感ê媒體內容",
"oauth_tokens": "OAuth token",
"refresh_token": "頭the̍h token",
"refresh_token": "頭the̍h token",
"valid_until": "到期佇",
"revoke_token": "撤回",
"panelRadius": "面pang",
@ -716,12 +841,12 @@
"set_new_avatar": "設定新ê標頭",
"set_new_profile_background": "設定新ê個人資料ê背景",
"set_new_profile_banner": "設定新ê個人資料ê條á",
"reset_avatar": "Tuì頭設定標頭",
"reset_profile_background": "Tuì頭設個人資料ê背景",
"reset_profile_banner": "Tuì頭設個人資料ê條á",
"reset_avatar_confirm": "Lí敢確實beh tuì頭設定標頭?",
"reset_banner_confirm": "Lí敢確實beh tuì頭設定條á?",
"reset_background_confirm": "Lí敢確實beh tuì頭設定背景?",
"reset_avatar": "頭設定標頭",
"reset_profile_background": "頭設個人資料ê背景",
"reset_profile_banner": "頭設個人資料ê條á",
"reset_avatar_confirm": "Lí敢確實beh 頭設定標頭?",
"reset_banner_confirm": "Lí敢確實beh 頭設定條á?",
"reset_background_confirm": "Lí敢確實beh 頭設定背景?",
"settings": "設定",
"subject_input_always_show": "一直顯示主旨ê格á",
"subject_line_behavior": "回應ê時khóo-pih主旨",
@ -731,11 +856,11 @@
"conversation_display": "顯示對話ê風格",
"conversation_display_tree": "樹á ê形",
"disable_sticky_headers": "Mài 予欄位ê頭牢佇螢幕頂懸",
"show_scrollbars": "展示邊á liâu ê giú-á",
"show_scrollbars": "展示邊á ê欄位 ê giú-á",
"third_column_mode": "空間夠額ê時,展示第三ê欄位",
"third_column_mode_none": "不管時mài顯示第三ê欄位",
"third_column_mode_notifications": "通知ê欄位",
"third_column_mode_postform": "主要êPO文表kah導覽",
"third_column_mode_postform": "主要ê PO文表kah導覽",
"show_admin_badge": "佇我ê個人資料顯示「行政員」證章",
"pause_on_unfocused": "若是 Pleroma ê分頁無點開tiō 暫停更新",
"conversation_display_tree_quick": "樹á形ê展示",
@ -792,15 +917,437 @@
"notification_mutes": "若tsún無愛收tuì指定用者來ê通知著用消音。",
"notification_blocks": "封鎖用者ē停止所有i hia來ê通知mā取消訂伊。",
"enable_web_push_notifications": "拍開網頁sak通知ê功能",
"more_settings": "Koh較tsē ê設定"
"more_settings": "Koh較tsē ê設定",
"version": {
"title": "版本",
"backend_version": "後端ê版本",
"frontend_version": "前端ê版本"
},
"commit_value": "儲存",
"commit_value_tooltip": "值無儲存tshi̍h tsit ê 鈕仔來送出你改變ê",
"hard_reset_value": "硬ê重頭設",
"hard_reset_value_tooltip": "Suá掉儲存內底ê設定強制用預設ê值",
"reset_value": "重頭設",
"reset_value_tooltip": "重頭設草稿",
"hide_scrobbles": "Tshàng scrobble記錄",
"notification_show_extra": "顯示koh khah tsē ê通知佇通知ê欄位",
"notification_extra_chats": "顯示bô讀ê開講",
"notification_extra_announcements": "顯示bô讀ê公告",
"notification_extra_follow_requests": "顯示新ê跟tuè請求",
"notification_extra_tip": "顯示自訂其他通知ê撇步"
},
"status": {
"favorites": "收藏"
"favorites": "收藏",
"repeat_confirm_cancel_button": "Mài轉送",
"delete_confirm_title": "Thâi掉ê確認",
"edit": "編輯狀態",
"edited_at": "頂kái編輯佇{time}",
"pin": "釘佇個人資料",
"unpin": "Tuì個人資料拆掉",
"pinned": "釘入去ê",
"bookmark": "加入冊籤",
"unbookmark": "Tuì冊籤the̍h掉",
"delete_confirm": "Lí kám真ê beh thâi掉tsit ê狀態?",
"delete_confirm_accept_button": "Thâi掉",
"delete_confirm_cancel_button": "保留",
"reply_to": "回應",
"replies_list": "回應:",
"repeats": "轉送",
"repeat_confirm_accept_button": "轉送",
"repeat_confirm_title": "轉送ê確認",
"repeat_confirm": "Lí kám真ê beh轉送tsit ê狀態?",
"delete": "Thâi掉身份",
"delete_error": "Thâi狀態ê時出tshê{0}",
"mentions": "提起",
"move_down": "Kā附件suá kàu正pîng",
"thread_show_full": "展示tsit 條討論線ê所有lóng總有{numStatus}ê狀態,深度上限:{depth}",
"thread_follow": "看討論線tshun ê部份lóng總有{numStatus}ê狀態)",
"replies_list_with_others": "回應(+其他{numReplies}ê):",
"mute_conversation": "Kā會話消音",
"unmute_conversation": "Kā會話取消消音",
"status_unavailable": "狀態bē當用",
"copy_link": "Khóo-pih 狀態ê連結",
"external_source": "外口ê來源",
"thread_muted": "討論線消音ah",
"thread_muted_and_words": ",有詞語:",
"hide_full_subject": "Khàm掉主題ê全文",
"show_full_subject": "顯示標題ê全文",
"show_content": "顯示內容",
"hide_content": "Khàm掉內容",
"status_deleted": "Tsit篇PO文thâi掉ah",
"nsfw": "敏感ê內容",
"expand": "Thián開",
"you": "",
"plus_more": "Koh有{number}ê",
"many_attachments": "PO文有{number}ê附件",
"collapse_attachments": "Kā附件tshàng起來",
"show_all_attachments": "顯示逐ê附件",
"show_attachment_in_modal": "佇媒體模式顯示",
"show_attachment_description": "Kā敘述先看māi拍開附件會當看kui ê敘述)",
"hide_attachment": "Khàm掉附件",
"attachment_stop_flash": "停止Flash ê播放器",
"remove_attachment": "Kā附件suá走",
"move_up": "Kā附件suá kàu倒pîng",
"open_gallery": "拍開畫廊",
"thread_hide": "Khàm掉討論線",
"thread_show": "顯示討論線",
"thread_show_full_with_icon": "{icon} {text}",
"thread_follow_with_icon": "{icon} {text}",
"ancestor_follow": "看其他{numReplies}ê佇tsit ê狀態ê回應",
"ancestor_follow_with_icon": "{icon} {text}",
"show_all_conversation_with_icon": "{icon} {text}",
"show_all_conversation": "看kui ê會話(有其他{numStatus}ê狀態)",
"show_only_conversation_under_this": "Kan-ta顯示tsit ê狀態ê回應",
"status_history": "狀態ê歷史",
"reaction_count_label": "{num}ê lâng用表情反應",
"hide_quote": "Khàm條引用ê狀態",
"display_quote": "顯示引用ê狀態",
"invisible_quote": "引用ê狀態bē當用{link}",
"more_actions": "佇tsit ê狀態ê其他動作"
},
"user_card": {
"favorites": "收藏"
"favorites": "收藏",
"show_repeats": "顯示轉送",
"hide_repeats": "Khàm掉轉送",
"remove_follower_confirm": "Lí kám真正想beh kā {user} tuì lí所跟綴ê suá走",
"statuses": "狀態",
"admin_menu": {
"activate_account": "啟動口座",
"deactivate_account": "予口座失效",
"delete_account": "Thâi掉口座",
"force_nsfw": "Kā逐ê PO文標做敏感內容",
"strip_media": "Tuì PO文thâi掉媒體",
"force_unlisted": "強制PO文mài列佇公共時間線",
"disable_remote_subscription": "Mài允准tuì其他站臺跟tuè用者",
"sandbox": "強制PO文kan-ta予跟tuè ê看",
"disable_any_subscription": "Mài允准跟tuè任何用者",
"quarantine": "Tuì聯邦禁止用者ê PO文",
"delete_user": "Thâi掉用者ê口座",
"delete_user_data_and_deactivate_confirmation": "Án-ne ē永永thâi掉tsit ê口座ê資料兼hōo失效。Lí kám完全確定",
"grant_admin": "授與行政員ê權",
"revoke_admin": "撤掉行政員ê權",
"moderation": "仲裁",
"grant_moderator": "授與仲裁員ê權",
"revoke_moderator": "撤掉仲裁員ê權"
},
"highlight": {
"disabled": "Mài強調",
"side": "邊á ê花tsuā",
"solid": "孤色ê背景",
"striped": "花tsuā ê背景"
},
"note": "筆記",
"note_blank": "(無)",
"edit_note": "編輯筆記",
"edit_note_apply": "適用",
"approve": "核准",
"approve_confirm_title": "核准ê確認",
"approve_confirm_accept_button": "核准",
"approve_confirm_cancel_button": "Mài核准",
"block": "封鎖",
"blocked": "封鎖ah",
"block_confirm_title": "封鎖ê確認",
"approve_confirm": "Lí kám想beh核准{user}ê跟tuè請求",
"block_confirm": "Lí kám 真正想beh封鎖{user}?",
"block_confirm_accept_button": "封鎖",
"block_confirm_cancel_button": "Mài封鎖",
"deactivated": "停止使用ah",
"deny": "拒絕",
"deny_confirm_title": "拒絕ê確認",
"deny_confirm_accept_button": "拒絕",
"deny_confirm_cancel_button": "Mài拒絕",
"deny_confirm": "Lí kám想beh拒絕{user}ê跟tuè請求",
"edit_profile": "編輯個人資料",
"follow": "跟tuè",
"follow_cancel": "取消請求",
"follow_sent": "請求送ah",
"follow_progress": "Teh請求……",
"follow_unfollow": "無愛跟tuè",
"unfollow_confirm_title": "無愛跟tuè ê確認",
"unfollow_confirm": "lí kám真正無beh跟tuè {user}?",
"unfollow_confirm_accept_button": "無愛跟綴",
"unfollow_confirm_cancel_button": "繼續跟tuè",
"followees": "Teh跟綴",
"followers": "跟綴ê",
"following": "Teh跟tuè",
"follows_you": "跟tuè lí",
"hidden": "Tshàng起來ê",
"its_you": "Tse是lí",
"media": "媒體",
"mention": "提起",
"message": "短phue",
"mute": "消音",
"muted": "消音ê",
"mute_confirm_title": "消音ê確認",
"mute_confirm": "Lí確定想beh kā {user}消音?",
"mute_confirm_accept_button": "消音",
"mute_confirm_cancel_button": "Mài消音",
"mute_duration_prompt": "消音tsit ê用戶ê期限0表示永遠",
"per_day": "/kang",
"remote_follow": "遠距離ê關注",
"remove_follower": "Suá走跟綴ê",
"remove_follower_confirm_title": "Suá走跟tuè者ê確認",
"remove_follower_confirm_accept_button": "Suá走",
"remove_follower_confirm_cancel_button": "保留",
"report": "檢舉",
"subscribe": "注文",
"unsubscribe": "取消注文",
"unblock": "Mài封鎖",
"unblock_progress": "Teh取消封鎖……",
"block_progress": "Leh封鎖……",
"unmute": "Mài消音",
"mute_progress": "Leh消音……",
"unmute_progress": "Leh取消消音……",
"bot": "機器lâng",
"birthday": "出世佇{birthday}",
"edit_note_cancel": "取消"
},
"tool_tip": {
"favorite": "收藏"
"favorite": "收藏",
"repeat": "轉送",
"media_upload": "Kā媒體傳起去",
"reply": "回應",
"add_reaction": "加反應",
"user_settings": "用者ê設定",
"accept_follow_request": "允准跟tuè ê請求",
"reject_follow_request": "拒絕跟tuè ê請求",
"bookmark": "冊籤",
"toggle_expand": "Thián開á是tshàng通知顯示kui篇PO文",
"toggle_mute": "Thián開á是tshàng通知顯露消音ê內容",
"autocomplete_available": "{number} ê結果通用。用頂kap下ê key來看結果。"
},
"password_reset": {
"instruction": "輸入你ê email地址iah是用者ê名。阮ē寄予lí連結通重頭設你ê密碼。",
"password_reset_disabled": "密碼重頭設ê功能無開放。請聯絡lín站臺ê行政員。",
"password_reset_required_but_mailer_is_disabled": "Lí著重設密碼M̄-koh重頭設密碼ê功能無開放。請聯絡lín站臺ê行政員。",
"forgot_password": "Buē記得密碼",
"password_reset": "密碼重頭設",
"placeholder": "你ê email iah是用者ê名",
"check_email": "檢查你ê電子phue箱有重頭設密碼ê連結ê phue無。",
"return_home": "Tńg去頭頁",
"too_many_requests": "Lí已經kàu 試ê回數限制 ah小等leh koh試。",
"password_reset_required": "Lí著重設密碼tsiah通登入。"
},
"admin_dash": {
"window_title": "行政員",
"reset_all": "Kui ê重頭設",
"wip_notice": "Tsit ê 管理 la-jí-báng (dashboard) 是試驗êkoh teh 起做,{adminFeLink}.",
"old_ui_link": "舊ê管理界面佇tsia",
"commit_all": "Lóng總儲存",
"tabs": {
"nodb": "無資料庫ê設置",
"instance": "站臺",
"limits": "限制",
"frontends": "前端"
},
"nodb": {
"heading": "資料庫設置無開放",
"text": "Lí需要改後端ê設置檔案tsiah ē當kā{property}設做{value},請佇{documentation}了解詳細。",
"documentation": "文件",
"text2": "大部份ê設定ē無開放。"
},
"limits": {
"user_uploads": "個人資料ê媒體限制",
"arbitrary_limits": "任何限制",
"posts": "PO文ê限制",
"uploads": "附件ê限制",
"users": "用者個人資料ê限制",
"profile_fields": "個人資料欄位ê限制"
},
"captcha": {
"native": "在來ê",
"kocaptcha": "KoCaptcha"
},
"instance": {
"instance": "站臺ê資訊",
"registrations": "用者ê註冊",
"kocaptcha": "KoCaptcha ê設定",
"restrict": {
"header": "管制無落名ê訪客使用",
"timelines": "讀取時間線",
"profiles": "讀取用者ê個人資料",
"activities": "讀取狀態/活動",
"description": "允准一kuá方面ê API the̍h取資源ê詳細設定。預設無定ê狀態若是站臺毋是公開êē無允准the̍h取選擇框á若勾就算站臺是公開êiáu是無允准the̍h取若無勾就算站臺是私人êmā是允准the̍h取。請注意若是設一kuá設定無預料ê行為可能產生。比如講若是the̍h取個人資料無開放PO文buē顯示個人資料。"
},
"access": "讀取實體",
"captcha_header": "CAPTCHA"
},
"frontend": {
"repository": "原始碼庫ê連結",
"versions": "通用ê版本",
"build_url": "起做URL",
"reinstall": "重頭安裝",
"is_default": "(預設)",
"is_default_custom": "(預設,版本:{version}",
"install": "安裝",
"install_version": "安裝ê版本:{version}",
"more_install_options": "其他ê安裝選項",
"more_default_options": "其他ê預設設定ê選項",
"set_default": "設做預設ê",
"set_default_version": "Kā版本{version}設做預設ê",
"default_frontend_tip": "預設ê前端ē展示予逐ê用者。現在用者無法度揀個人ê前端。若是lí變換無beh用PleromaFE上有可能ē用舊koh問題tsē ê AdminFE 做站臺ê設置佇阮iáu-bē kā伊取代以前。",
"wip_notice": "請注意tsit ê段落iáu teh起做欠缺一寡特點因為後端tuì前端管理ê實做無齊備。",
"default_frontend": "預設ê前端",
"default_frontend_tip2": "Teh起做因為Pleroma後端無適當列出逐ê安裝ê前端lí著手動輸入名字kap引用。下kha ê列單提供寫tsiah-ê 值ê近路。",
"available_frontends": "Ē當安裝"
},
"temp_overrides": {
":pleroma": {
":instance": {
":public": {
"description": "無開放tseē 控制逐êAPI干焦予登入ê用者用mā ē予公開kap聯邦ê時間線buē當予無落名ê訪客the̍h著。",
"label": "站臺是公開ê"
},
":limit_to_local_content": {
"label": "Kan-ta會當tshuē在地ê內容",
"description": "無開放無認證ê用者、逐儂猶是lóng總開放tshuē全球ê網路"
},
":description_limit": {
"label": "限制",
"description": "附件說明ê字元限制"
},
":background_image": {
"label": "背景ê影像",
"description": "背景ê影像主要予PleromaFE用"
}
}
}
}
},
"timeline": {
"up_to_date": "是上新ê",
"collapse": "疊起來",
"conversation": "會話",
"error": "佇the̍h時間線ê時出tshê{0}",
"load_older": "載入舊ê狀態",
"repeated": "轉送ah",
"no_retweet_hint": "PO文hőng標做限定跟綴êá是私人phue無法度轉送",
"show_new": "看新ê",
"reload": "重新載入",
"no_more_statuses": "無其他ê狀態",
"no_statuses": "無狀態",
"socket_reconnected": "實時ê連結成立ah",
"socket_broke": "實時連結拍m̄見ahCloseEvent代碼{0}",
"quick_view_settings": "快速 view ê設定",
"quick_filter_settings": "快速過濾器ê設定"
},
"time": {
"unit": {
"days": "{0}工",
"days_short": "{0}工",
"hours": "{0}點鐘",
"hours_short": "{0}點鐘",
"minutes": "{0}分鐘",
"minutes_short": "{0}分",
"months": "{0}個月",
"months_short": "{0}個月",
"seconds": "{0}秒鐘",
"seconds_short": "{0}秒",
"weeks": "{0}禮拜",
"weeks_short": "{0}週",
"years": "{0}年",
"years_short": "{0}年"
},
"in_future": "koh有{0}",
"in_past": "{0}進前",
"now": "tú正",
"now_short": "tsit-má"
},
"user_reporting": {
"title": "檢舉 {0}",
"forward_description": "Tsit ê口座是別ê站臺ê。Mā kám beh寄報告ê khóo-pih kàu hit ê站?",
"add_comment_description": "本檢舉ē 寄kàu你ê站臺ê仲裁員。Lí會當佇下kha解說檢舉tsit ê口座ê原因:",
"additional_comments": "其他ê意見",
"forward_to": "轉送kàu{0}",
"submit": "送出",
"generic_error": "佇處理lí ê請求ê時出tshê。"
},
"lists": {
"really_delete": "Kám真正 beh thâi列單",
"search": "Tshiau-tshuē用者",
"create": "建立",
"save": "保存改變",
"delete": "Thâi列單",
"lists": "列單",
"new": "新ê列單",
"title": "列單ê標題",
"following_only": "限制佇跟tuè ê",
"manage_lists": "管理列單",
"manage_members": "管理列單ê成員",
"add_members": "Tshiau-tshuē其他ê用者",
"remove_from_list": "Tuì列單suá走",
"add_to_list": "Ke-thinn kàu列單",
"is_in_list": "已經佇列單內底",
"editing_list": "編輯列單 {listTitle}",
"creating_list": "開新ê列單",
"update_title": "保存標題",
"error": "佇操作列單ê時出tshê{0}"
},
"update": {
"update_bugs": "請報告任何問題kap錯誤佇 {pleromaGitlab}因為已經改變真tsē。雖bóng guán徹底試過ka-kī mā用開發版iáu是有可能有無注意ê所在。Guán歡迎lí tuì所tú tio̍h ê問題提出意見kap建議或者是改進Pleroma kap Pleroma-FE ê方法。",
"big_update_title": "請sió等tsi̍t ê",
"update_bugs_gitlab": "Pleroma GitLab",
"big_update_content": "Guán已經有tsi̍t段時間無推出發行所以外觀kap感覺kap lí所慣勢ê凡勢無kâng。",
"update_changelog": "Beh知影改變ê詳細請看{theFullChangelog}。",
"update_changelog_here": "Changelog全文",
"art_by": "美術製作:{linkToArtist}"
},
"user_profile": {
"timeline_title": "用者ê時間線",
"profile_does_not_exist": "Pháinn勢tsit ê個人資料無佇leh。",
"profile_loading_error": "Pháinn勢佇載入tsit ê個人資料ê時出tshê。"
},
"who_to_follow": {
"more": "詳情",
"who_to_follow": "Siáng通tuè"
},
"upload": {
"error": {
"base": "傳起去ê時失敗。",
"message": "傳起去ê時失敗:{0}",
"file_too_big": "檔案siūnn大[{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]",
"default": "Koh試tsi̍t kái"
},
"file_size_units": {
"B": "B",
"KiB": "KiB",
"MiB": "MiB",
"GiB": "GiB",
"TiB": "TiB"
}
},
"search": {
"people": "Lâng",
"hashtags": "井字ê標籤",
"person_talking": "{count}ê lâng teh開講",
"people_talking": "{count}ê lâng teh開講",
"no_results": "無結果",
"no_more_results": "無其他結果",
"load_more": "載入其他結果"
},
"chats": {
"you": "Lí",
"message_user": "送短phue予{nickname}",
"delete": "Thâi掉",
"chats": "開講",
"new": "新ê開講",
"empty_message_error": "Bē當PO空ê短phue",
"more": "其他",
"delete_confirm": "Lí kám真正beh thâi tsit ê短phue",
"error_loading_chat": "佇載入開講ê時出問題。",
"error_sending_message": "佇送短phue ê時出問題。",
"empty_chat_list_placeholder": "Lí iáu buē開講過。開始開講"
},
"file_type": {
"audio": "聲音",
"video": "影片",
"image": "影像",
"file": "檔案"
},
"display_date": {
"today": "今á日"
},
"unicode_domain_indicator": {
"tooltip": "Tsit ê域名含m̄是ascii ê字元。"
}
}

View File

@ -121,7 +121,8 @@
"placeholder": "напр. stepan",
"logout_confirm": "Ви дійсно хочете вийти?",
"logout_confirm_accept_button": "Вийти",
"logout_confirm_cancel_button": "Ні, хочу назад!"
"logout_confirm_cancel_button": "Ні, хочу назад!",
"logout_confirm_title": "Вихід"
},
"importer": {
"error": "Під час імпортування файлу сталася помилка.",
@ -164,7 +165,13 @@
"broken_favorite": "Невідомий допис, шукаю його…",
"error": "Помилка при оновленні сповіщень: {0}",
"poll_ended": "опитування закінчено",
"submitted_report": "подав скаргу"
"submitted_report": "подав скаргу",
"unread_announcements": "{num} непрочитане оголошення | {num} непрочитаних оголошень",
"unread_chats": "{num} непрочитаний чат | {num} непрочитаних чатів",
"unread_follow_requests": "{num} новий запит на підписку | {num} нових запитів на підписку",
"configuration_tip": "Ви можете налаштувати, що відображати тут у {theSettings}. {dismiss}",
"configuration_tip_settings": "налаштування",
"configuration_tip_dismiss": "Не показувати знову"
},
"nav": {
"chats": "Чати",
@ -267,7 +274,8 @@
"activities": "Активності",
"symbols": "Символи",
"travel-and-places": "Подорожі та Місця"
}
},
"unpacked": "Розпаковані емоджі"
},
"post_status": {
"content_type": {
@ -304,7 +312,11 @@
"post": "Опублікувати",
"edit_unsupported_warning": "Pleroma не підтримує редагування згадувань чи голосувань.",
"edit_status": "Редагувати допис",
"edit_remote_warning": "Інші віддалені інстанси можуть не підтримувати редагування та вони можуть не отримати актуальну версію допису."
"edit_remote_warning": "Інші віддалені інстанси можуть не підтримувати редагування та вони можуть не отримати актуальну версію допису.",
"content_type_selection": "Форматування допису",
"scope_notice_dismiss": "Закрити це сповіщення",
"reply_option": "Відповісти на цей допис",
"quote_option": "Процитувати допис"
},
"settings": {
"blocks_imported": "Блокування імпортовані! Їх обробка триватиме певний час.",
@ -730,7 +742,7 @@
"conversation_display_tree_quick": "Вигляд дерева",
"disable_sticky_headers": "Не закріплювати заголовок колонки зверху на сторінці",
"third_column_mode_none": "Не показувати третю колонку взагалі",
"third_column_mode_notifications": "Колонка сповіщень",
"third_column_mode_notifications": "Колонку сповіщень",
"columns": "Колонки",
"auto_update": "Автоматично показувати нові дописи",
"use_websockets": "Використовувати вебсокети (Оновлення в реальному часі)",
@ -743,7 +755,38 @@
"wordfilter": "Фільтр слів",
"mention_links": "Посилання для згадування",
"user_profiles": "Профілі користувачів",
"notification_visibility_polls": "Закінчення опитувань, в яких ви проголосували"
"notification_visibility_polls": "Закінчення опитувань, в яких ви проголосували",
"remove_language": "Вилучити",
"primary_language": "Основна мова:",
"fallback_language": "Резервна мова {index}:",
"confirm_dialogs_deny_follow": "тим, як відмовити у запиті на підписку",
"confirm_dialogs_remove_follower": "видаленням підписника",
"notification_show_extra": "Показувати додаткові сповіщення в панелі сповіщень",
"notification_extra_chats": "Показувати непрочитані чати",
"notification_extra_announcements": "Показувати непрочитані оголошення",
"notification_extra_follow_requests": "Показувати нові запити на підписку",
"third_column_mode_postform": "Форму відправки повідомлень та панель навігації",
"notification_extra_tip": "Показати пораду з налаштувань для додаткових сповіщень",
"backup_running": "Резервне копіювання триває, оброблено {number} записи. | Резервне копіювання триває, оброблено {number} записів.",
"backup_failed": "Резервне копіювання не вдалося.",
"preview": "Попередній перегляд",
"url": "URL",
"birthday": {
"label": "День народження",
"show_birthday": "Показувати мій день народження"
},
"confirm_dialogs": "Запитувати підтвердження перед",
"confirm_dialogs_repeat": "поширенням допису",
"confirm_dialogs_unfollow": "скасуванням підписки",
"confirm_dialogs_block": "блокуванням користувача",
"confirm_dialogs_mute": "тим, як заглушити користувача",
"show_scrollbars": "Показувати смугу прокрутки на бічних панелях",
"column_sizes": "Розміри панелей",
"column_sizes_sidebar": "Бічна панель",
"add_language": "Додати резервну мову",
"confirm_dialogs_delete": "видаленням допису",
"confirm_dialogs_logout": "виходом із системи",
"confirm_dialogs_approve_follow": "схваленням запиту на підписку"
},
"selectable_list": {
"select_all": "Вибрати все"
@ -760,7 +803,8 @@
"password_required": "не може бути порожнім",
"email_required": "не може бути порожнім",
"fullname_required": "не може бути порожнім",
"username_required": "не може бути порожнім"
"username_required": "не може бути порожнім",
"birthday_required": "не може бути пустим"
},
"bio_placeholder": "напр.\nНаш народ завжди прагне волі для себе і бажає її для інших народів. Він боровся і бореться за правду і справедливість. Ми хочемо жити у згоді і взаємному шануванні з усіми народами доброї волі. Такі самі права визнаємо за іншими народами, за які боремося для себе.",
"fullname_placeholder": "напр. Степан Бандера",
@ -778,7 +822,9 @@
"reason": "Причина реєстрації",
"bio_optional": "Біографія (необов'язково)",
"email_language": "Якою мовою ви бажаєте отримувати електронні листи від сервера?",
"email_optional": "Ел. пошта (необов'язково)"
"email_optional": "Ел. пошта (необов'язково)",
"birthday": "День народження:",
"birthday_optional": "День народження (необов'язково):"
},
"who_to_follow": {
"who_to_follow": "На кого підписатися",
@ -890,7 +936,8 @@
"grant_moderator": "Надати права модератора",
"revoke_admin": "Позбавити прав адміністратора",
"grant_admin": "Надати права адміністратора",
"quarantine": "Не розповсюджувати дописи на інших інстансах"
"quarantine": "Не розповсюджувати дописи на інших інстансах",
"delete_user_data_and_deactivate_confirmation": "Це назовсім видалить дані обліковки й вимкне її. Точно продовжити?"
},
"deny": "Відмовити",
"block": "Заблокувати",
@ -929,7 +976,32 @@
"bot": "Бот",
"edit_profile": "Редагувати профіль",
"deactivated": "Деактивований",
"follow_cancel": "Скасувати запит"
"follow_cancel": "Скасувати запит",
"block_confirm_title": "Блокування",
"block_confirm": "Точно заблокувати {user}?",
"mute_confirm_cancel_button": "Ні, не приглушувати",
"note_blank": "(Пусто)",
"edit_note_apply": "Застосувати",
"edit_note_cancel": "Скасувати",
"block_confirm_accept_button": "Так, заблокувати",
"block_confirm_cancel_button": "Ні, не блокувати",
"deny_confirm_title": "Відхилити запит на підписку",
"mute_confirm_accept_button": "Так, приглушити",
"mute_confirm": "Точно приглушити {user}?",
"edit_note": "Редагувати нотатку",
"mute_confirm_title": "Приглушення",
"mute_duration_prompt": "Приглушити користувача на (0 якщо назавжди):",
"approve_confirm_title": "Дозвіл підписатись",
"approve_confirm_accept_button": "Так, дозволити",
"approve_confirm_cancel_button": "Ні, скасувати",
"deny_confirm_accept_button": "Так, відхилити",
"deny_confirm_cancel_button": "Ні, скасувати",
"deny_confirm": "Ви точно хочете відхилити запит на підписку від {user}?",
"unfollow_confirm_title": "Відписка",
"unfollow_confirm": "Точно відписатись від {user}?",
"unfollow_confirm_accept_button": "Так, відписатись",
"unfollow_confirm_cancel_button": "Ні, не відписуватись",
"note": "Приватна нотатка"
},
"status": {
"copy_link": "Скопіювати посилання на допис",
@ -965,7 +1037,38 @@
"plus_more": "+{number} більше",
"thread_show_full_with_icon": "{icon} {text}",
"show_only_conversation_under_this": "Показати всі відповіді на цей допис",
"status_history": "Історія змін"
"status_history": "Історія змін",
"thread_hide": "Сховати гілку",
"open_gallery": "Відкрити галерею",
"repeat_confirm": "Точно поширити допис?",
"repeat_confirm_title": "Підтвердьте поширення",
"repeat_confirm_accept_button": "Так, поширити",
"repeat_confirm_cancel_button": "Ні, не поширювати",
"delete_error": "Помилка при видаленні допису: {0}",
"delete_confirm_accept_button": "Так, видалити",
"delete_confirm_cancel_button": "Ні, лишити",
"delete_confirm_title": "Підтвердьте видалення",
"you": "(ви)",
"collapse_attachments": "Згорнути вкладення",
"show_all_attachments": "Показати всі вкладення",
"hide_attachment": "Сховати вкладення",
"many_attachments": "Вкладень: {number} | Вкладень: {number}",
"attachment_stop_flash": "Зупинити Flash-плеєр",
"thread_follow": "Ще відповідей: {numStatus} | Ще відповідей: {numStatus}",
"remove_attachment": "Видалити вкладення",
"ancestor_follow": "Переглянути ще {numReplies} під цим дописом | Переглянути ще {numReplies} під цим дописом",
"show_all_conversation": "Показати всю розмову (ще дописів: {numStatus}) | Показати всю розмову (ще дописів: {numStatus})",
"move_up": "Посунути вкладення ліворуч",
"move_down": "Посунути вкладення праворуч",
"thread_show": "Показати гілку",
"mentions": "Згадки",
"thread_show_full": "Показати відповіді: {numStatus} | Показати відповіді: {numStatus}",
"hide_quote": "Сховати процитований допис",
"display_quote": "Показати процитований допис",
"invisible_quote": "Процитований допис недоступний: {link}",
"replies_list_with_others": "Ще відповідей: {numReplies} | Ще відповідей: {numReplies}:",
"show_attachment_in_modal": "Показати вкладення у вікні",
"show_attachment_description": "Переглянути опис (натисніть саме вкладення, якщо опис не вміщається)"
},
"timeline": {
"no_more_statuses": "Більше немає дописів",
@ -980,7 +1083,8 @@
"repeated": "поширив(-ла)",
"no_retweet_hint": "Запис, позначено як \"тільки для підписників\" або \"особисте\" і тому не може бути поширений",
"socket_broke": "Втрачено з'єднання у реальному часі: код {0}",
"socket_reconnected": "Встановлено з'єднання у реальному часі"
"socket_reconnected": "Встановлено з'єднання у реальному часі",
"quick_view_settings": "Налаштування швидкого перегляду"
},
"user_reporting": {
"submit": "Відправити",
@ -1026,5 +1130,35 @@
"submit_edit_action": "Надіслати",
"cancel_edit_action": "Скасувати",
"inactive_message": "Це оголошення неактивне"
},
"lists": {
"really_delete": "Дійсно видалити список?",
"error": "Помилка при роботі зі списками: {0}",
"is_in_list": "Вже є у списку",
"editing_list": "Редагування списку {listTitle}",
"creating_list": "Створення нового списку",
"search": "Знайти користувачів",
"create": "Створити",
"save": "Зберегти зміни",
"manage_members": "Керувати учасниками списку",
"new": "Новий список",
"title": "Назва списку",
"delete": "Видалити список",
"following_only": "Лише за ким ви стежите",
"lists": "Списки",
"manage_lists": "Керувати списками",
"remove_from_list": "Видалити зі списку",
"add_to_list": "Додати до списку"
},
"update": {
"update_changelog": "Щоб дізнатись більше інформації, дивіться {theFullChangelog}.",
"update_bugs": "Будь ласка, повідомляйте про будь-які проблеми та помилки на {pleromaGitlab}, оскільки ми внесли багато змін, і навіть після ретельно проведених перевірок, ми можемо щось пропустити. Ми заздалегідь вдячні за ваші відгуки щодо проблем, з якими ви можете зіткнутися, а також пропозиції щодо вдосконалення Pleroma та Pleroma-FE.",
"update_changelog_here": "повний список змін",
"big_update_title": "Хвилинку уваги",
"update_bugs_gitlab": "Pleroma GitLab",
"big_update_content": "У нас не було оновлень протягом тривалого часу, тому речі можуть мати інакший вигляд, аніж ви звикли."
},
"unicode_domain_indicator": {
"tooltip": "Цей домен містить не-ASCII символи."
}
}

View File

@ -146,7 +146,13 @@
"follow_request": "想要关注你",
"error": "取得通知时发生错误:{0}",
"poll_ended": "投票结束了",
"submitted_report": "提交举报"
"submitted_report": "提交举报",
"unread_announcements": "{num} 条未读公告",
"unread_chats": "{num} 条未读聊天讯息",
"unread_follow_requests": "{num} 个新关注请求",
"configuration_tip": "可以在 {theSettings} 里定制什么会显示在这里。{dismiss}",
"configuration_tip_settings": "设置",
"configuration_tip_dismiss": "不再显示"
},
"polls": {
"add_poll": "增加投票",
@ -212,7 +218,9 @@
"edit_unsupported_warning": "Pleroma 不支持对提及或投票进行编辑。",
"edit_status": "编辑状态",
"content_type_selection": "发帖格式",
"scope_notice_dismiss": "关闭此提示"
"scope_notice_dismiss": "关闭此提示",
"reply_option": "回复这条状态",
"quote_option": "引用这条状态"
},
"registration": {
"bio": "简介",
@ -747,7 +755,12 @@
"reset_value_tooltip": "重置草稿",
"hard_reset_value": "硬重置",
"hard_reset_value_tooltip": "从存储中移除设置,强制使用默认值",
"emoji_reactions_scale": "表情回应比例系数"
"emoji_reactions_scale": "表情回应比例系数",
"notification_show_extra": "在通知栏里显示额外通知",
"notification_extra_chats": "显示未读聊天",
"notification_extra_announcements": "显示未读公告",
"notification_extra_follow_requests": "显示新的关注请求",
"notification_extra_tip": "显示额外通知的定制提示"
},
"time": {
"day": "{0} 天",
@ -880,7 +893,10 @@
"show_attachment_in_modal": "在媒体模式中显示",
"status_history": "状态历史",
"delete_error": "删除状态时出错:{0}",
"reaction_count_label": "{num} 人作出了表情回应"
"reaction_count_label": "{num} 人作出了表情回应",
"invisible_quote": "引用的状态不可用:{link}",
"hide_quote": "隐藏引用的状态",
"display_quote": "显示引用的状态"
},
"user_card": {
"approve": "核准",
@ -1184,7 +1200,7 @@
"big_update_title": "请忍耐一下",
"big_update_content": "我们已经有一段时间没有发布发行版,所以事情的外观和感觉可能与你习惯的不一样。",
"update_bugs": "请在 {pleromaGitlab} 上报告任何问题和bug因为我们已经改变了很多虽然我们进行了彻底的测试并且自己使用了开发版本但我们可能错过了一些东西。我们欢迎你对你可能遇到的问题或如何改进Pleroma和Pleroma-FE提出反馈和建议。",
"art_by": "Art by {linkToArtist}"
"art_by": "{linkToArtist} 的作品"
},
"lists": {
"search": "搜索用户",
@ -1266,7 +1282,6 @@
"wip_notice": "请注意此部分是一个WIP缺乏某些功能因为前端管理的后台实现并不完整。",
"default_frontend": "默认前端",
"default_frontend_tip": "默认的前端将显示给所有用户。目前还没有办法让用户选择个人的前端。如果你不使用 PleromaFE你很可能不得不使用旧的和有问题的 AdminFE 来进行实例配置,直到我们替换它。",
"default_frontend_tip2": "WIP: 由于 Pleroma 后端没有正确列出所有已安装的前端,你必须手动输入名称和引用。下面的列表提供了填写这些值的快捷方式。",
"available_frontends": "可供安装"
},
"temp_overrides": {

View File

@ -26,6 +26,7 @@ const adminSettingsStorage = {
},
setAvailableFrontends (state, { frontends }) {
state.frontends = frontends.map(f => {
f.installedRefs = f.installed_refs
if (f.name === 'pleroma-fe') {
f.refs = ['master', 'develop']
} else {

View File

@ -40,6 +40,7 @@ export const defaultState = {
padEmoji: true,
hideAttachments: false,
hideAttachmentsInConv: false,
hideScrobbles: false,
maxThumbnails: 16,
hideNsfw: true,
preloadImage: true,
@ -50,7 +51,7 @@ export const defaultState = {
alwaysShowNewPostButton: false,
autohideFloatingPostButton: false,
pauseOnUnfocused: true,
stopGifs: true,
stopGifs: false,
replyVisibility: 'all',
thirdColumnMode: 'notifications',
notificationVisibility: {
@ -90,7 +91,7 @@ export const defaultState = {
modalOnRemoveUserFromFollowers: undefined, // instance default
playVideosInModal: false,
useOneClickNsfw: false,
useContainFit: true,
useContainFit: false,
disableStickyHeaders: false,
showScrollbars: false,
userPopoverAvatarAction: 'open',
@ -117,6 +118,11 @@ export const defaultState = {
conversationTreeAdvanced: undefined, // instance default
conversationOtherRepliesButton: undefined, // instance default
conversationTreeFadeAncestors: undefined, // instance default
showExtraNotifications: undefined, // instance default
showExtraNotificationsTip: undefined, // instance default
showChatsInExtraNotifications: undefined, // instance default
showAnnouncementsInExtraNotifications: undefined, // instance default
showFollowRequestsInExtraNotifications: undefined, // instance default
maxDepthInThread: undefined, // instance default
autocompleteSelect: undefined // instance default
}

View File

@ -103,6 +103,11 @@ const defaultState = {
conversationTreeAdvanced: false,
conversationOtherRepliesButton: 'below',
conversationTreeFadeAncestors: false,
showExtraNotifications: true,
showExtraNotificationsTip: true,
showChatsInExtraNotifications: true,
showAnnouncementsInExtraNotifications: true,
showFollowRequestsInExtraNotifications: true,
maxDepthInThread: 6,
autocompleteSelect: false,
@ -128,6 +133,7 @@ const defaultState = {
mediaProxyAvailable: false,
suggestionsEnabled: false,
suggestionsWeb: '',
quotingAvailable: false,
// Html stuff
instanceSpecificPanelContent: '',

View File

@ -47,6 +47,7 @@ const emptyNotifications = () => ({
export const defaultState = () => ({
allStatuses: [],
scrobblesNextFetch: {},
allStatusesObject: {},
conversationsObject: {},
maxId: 0,
@ -120,8 +121,24 @@ const sortTimeline = (timeline) => {
return timeline
}
const getLatestScrobble = (state, user) => {
if (state.scrobblesNextFetch[user.id] && state.scrobblesNextFetch[user.id] > Date.now()) {
return
}
state.scrobblesNextFetch[user.id] = Date.now() + 24 * 60 * 60 * 1000
apiService.fetchScrobbles({ accountId: user.id }).then((scrobbles) => {
if (scrobbles.length > 0) {
user.latestScrobble = scrobbles[0]
state.scrobblesNextFetch[user.id] = Date.now() + 60 * 1000
}
})
}
// Add status to the global storages (arrays and objects maintaining statuses) except timelines
const addStatusToGlobalStorage = (state, data) => {
getLatestScrobble(state, data.user)
const result = mergeOrAdd(state.allStatuses, state.allStatusesObject, data)
if (result.new) {
// Add to conversation
@ -229,6 +246,10 @@ const addNewStatuses = (state, { statuses, showImmediately = false, timeline, us
timelineObject.newStatusCount += 1
}
if (status.quote) {
addStatus(status.quote, /* showImmediately = */ false, /* addToTimeline = */ false)
}
return status
}

View File

@ -651,6 +651,12 @@ const users = {
const response = data.error
// Authentication failed
commit('endLogin')
// remove authentication token on client/authentication errors
if ([400, 401, 403, 422].includes(response.status)) {
commit('clearToken')
}
if (response.status === 401) {
reject(new Error('Wrong username or password'))
} else {

View File

@ -107,6 +107,7 @@ const PLEROMA_ANNOUNCEMENTS_URL = '/api/v1/pleroma/admin/announcements'
const PLEROMA_POST_ANNOUNCEMENT_URL = '/api/v1/pleroma/admin/announcements'
const PLEROMA_EDIT_ANNOUNCEMENT_URL = id => `/api/v1/pleroma/admin/announcements/${id}`
const PLEROMA_DELETE_ANNOUNCEMENT_URL = id => `/api/v1/pleroma/admin/announcements/${id}`
const PLEROMA_SCROBBLES_URL = id => `/api/v1/pleroma/accounts/${id}/scrobbles`
const PLEROMA_ADMIN_CONFIG_URL = '/api/pleroma/admin/config'
const PLEROMA_ADMIN_DESCRIPTIONS_URL = '/api/pleroma/admin/config/descriptions'
@ -827,6 +828,7 @@ const postStatus = ({
poll,
mediaIds = [],
inReplyToStatusId,
quoteId,
contentType,
preview,
idempotencyKey
@ -859,6 +861,9 @@ const postStatus = ({
if (inReplyToStatusId) {
form.append('in_reply_to_id', inReplyToStatusId)
}
if (quoteId) {
form.append('quote_id', quoteId)
}
if (preview) {
form.append('preview', 'true')
}
@ -1761,6 +1766,23 @@ const installFrontend = ({ credentials, payload }) => {
})
}
const fetchScrobbles = ({ accountId, limit = 1 }) => {
let url = PLEROMA_SCROBBLES_URL(accountId)
const params = [['limit', limit]]
const queryString = map(params, (param) => `${param[0]}=${param[1]}`).join('&')
url += `?${queryString}`
return fetch(url, {})
.then((response) => {
if (response.ok) {
return response.json()
} else {
return {
error: response
}
}
})
}
const apiService = {
verifyCredentials,
fetchTimeline,
@ -1874,6 +1896,7 @@ const apiService = {
postAnnouncement,
editAnnouncement,
deleteAnnouncement,
fetchScrobbles,
adminFetchAnnouncements,
fetchInstanceDBConfig,
fetchInstanceConfigDescriptions,

View File

@ -325,6 +325,10 @@ export const parseStatus = (data) => {
output.thread_muted = pleroma.thread_muted
output.emoji_reactions = pleroma.emoji_reactions
output.parent_visible = pleroma.parent_visible === undefined ? true : pleroma.parent_visible
output.quote = pleroma.quote ? parseStatus(pleroma.quote) : undefined
output.quote_id = pleroma.quote_id ? pleroma.quote_id : (output.quote ? output.quote.id : undefined)
output.quote_url = pleroma.quote_url
output.quote_visible = pleroma.quote_visible
} else {
output.text = data.content
output.summary = data.spoiler_text

View File

@ -22,7 +22,7 @@ export const getAttrs = (tag, filter) => {
.replace(new RegExp('^' + getTagName(tag)), '')
.replace(/\/?$/, '')
.trim()
const attrs = Array.from(innertag.matchAll(/([a-z0-9-]+)(?:=("[^"]+?"|'[^']+?'))?/gi))
const attrs = Array.from(innertag.matchAll(/([a-z]+[a-z0-9-]*)(?:=("[^"]+?"|'[^']+?'))?/gi))
.map(([trash, key, value]) => [key, value])
.map(([k, v]) => {
if (!v) return [k, true]

View File

@ -14,8 +14,11 @@ export const mentionMatchesUrl = (attention, url) => {
* @param {string} url
*/
export const extractTagFromUrl = (url) => {
const regex = /tag[s]*\/(\w+)$/g
const result = regex.exec(url)
const decoded = decodeURI(url)
// https://git.pleroma.social/pleroma/elixir-libraries/linkify/-/blob/master/lib/linkify/parser.ex
// https://www.pcre.org/original/doc/html/pcrepattern.html
const regex = /tag[s]*\/([\p{L}\p{N}_]*[\p{Alphabetic}_·\u{200c}][\p{L}\p{N}_·\p{M}\u{200c}]*)$/ug
const result = regex.exec(decoded)
if (!result) {
return false
}

View File

@ -124,3 +124,17 @@ export const prepareNotificationObject = (notification, i18n) => {
return notifObj
}
export const countExtraNotifications = (store) => {
const mergedConfig = store.getters.mergedConfig
if (!mergedConfig.showExtraNotifications) {
return 0
}
return [
mergedConfig.showChatsInExtraNotifications ? store.getters.unreadChatCount : 0,
mergedConfig.showAnnouncementsInExtraNotifications ? store.getters.unreadAnnouncementCount : 0,
mergedConfig.showFollowRequestsInExtraNotifications ? store.getters.followRequestCount : 0
].reduce((a, c) => a + c, 0)
}

View File

@ -0,0 +1,3 @@
const genRandomSeed = () => `${Math.random()}`.replace('.', '-')
export default genRandomSeed

View File

@ -10,6 +10,7 @@ const postStatus = ({
poll,
media = [],
inReplyToStatusId = undefined,
quoteId = undefined,
contentType = 'text/plain',
preview = false,
idempotencyKey = ''
@ -24,6 +25,7 @@ const postStatus = ({
sensitive,
mediaIds,
inReplyToStatusId,
quoteId,
contentType,
poll,
preview,

View File

@ -78,5 +78,11 @@ describe('MatcherService', () => {
expect(MatcherService.extractTagFromUrl(url)).to.eql(false)
})
it('should return tag name from non-ascii tags', () => {
const url = encodeURI('https://website.com/tag/喵喵喵')
expect(MatcherService.extractTagFromUrl(url)).to.eql('喵喵喵')
})
})
})

27
tools/collect-changelog Executable file
View File

@ -0,0 +1,27 @@
#!/bin/sh
collectType() {
local suffix="$1"
local header="$2"
local printed=0
for file in changelog.d/*."$suffix"; do
if [ '!' -f "$file" ]; then
continue
fi
if [ "$printed" = 0 ]; then
echo
echo "### $header"
printed=1
fi
# Normalize any trailing newlines/spaces, etc.
echo "- $(cat "$file")"
done
}
collectType security Security
collectType change Changed
collectType add Added
collectType fix Fixed
collectType remove Removed
rm changelog.d/*

View File

@ -6523,10 +6523,10 @@ min-indent@^1.0.0:
resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869"
integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==
mini-css-extract-plugin@2.7.5:
version "2.7.5"
resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.5.tgz#afbb344977659ec0f1f6e050c7aea456b121cfc5"
integrity sha512-9HaR++0mlgom81s95vvNjxkg52n2b5s//3ZTI1EtzFb98awsLSivs2LMsVqnQ3ay0PVhqWcGNyDaTE961FOcjQ==
mini-css-extract-plugin@2.7.6:
version "2.7.6"
resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz#282a3d38863fddcd2e0c220aaed5b90bc156564d"
integrity sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==
dependencies:
schema-utils "^4.0.0"
@ -7141,10 +7141,10 @@ pend@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
phoenix@1.6.2:
version "1.6.2"
resolved "https://registry.yarnpkg.com/phoenix/-/phoenix-1.6.2.tgz#8d1d9f06e51cb893d08059e80488cd0de328e01a"
integrity sha512-VjR27NETvrLSj8rI6DlpVAfo7pCYth/9+1OCoTof4LKEbq0141ze/tdxFHHZzVQSok3gqJUo2h/tqbxR3r8eyw==
phoenix@1.7.7:
version "1.7.7"
resolved "https://registry.yarnpkg.com/phoenix/-/phoenix-1.7.7.tgz#829817ea65a83ef78a3a88e3e074125f502a034f"
integrity sha512-moAN6e4Z16x/x1nswUpnTR2v5gm7HsI7eluZ2YnYUUsBNzi3cY/5frmiJfXIEi877IQAafzTfp8hd6vEUMme+w==
picocolors@^1.0.0:
version "1.0.0"
@ -7622,10 +7622,10 @@ qjobs@^1.2.0:
resolved "https://registry.yarnpkg.com/qjobs/-/qjobs-1.2.0.tgz#c45e9c61800bd087ef88d7e256423bdd49e5d071"
integrity sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==
qrcode@1.5.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.5.1.tgz#0103f97317409f7bc91772ef30793a54cd59f0cb"
integrity sha512-nS8NJ1Z3md8uTjKtP+SGGhfqmTCs5flU/xR623oI0JX+Wepz9R8UrRVCTBTJm3qGw3rH6jJ6MUHjkDx15cxSSg==
qrcode@1.5.3:
version "1.5.3"
resolved "https://registry.yarnpkg.com/qrcode/-/qrcode-1.5.3.tgz#03afa80912c0dccf12bc93f615a535aad1066170"
integrity sha512-puyri6ApkEHYiVl4CFzo1tDkAZ+ATcnbJrJ6RiBM1Fhctdn/ix9MTE3hRph33omisEbC/2fcfemsseiKgBPKZg==
dependencies:
dijkstrajs "^1.0.1"
encode-utf8 "^1.0.3"