Compare commits

..

132 commits

Author SHA1 Message Date
Floatingghost
2914eaf1ca Revert "reduce gallery size"
This reverts commit 06ba190e2e.
2025-03-01 16:14:55 +00:00
floatingghost
0bf9cb0660 Merge pull request 'Optional widened main column' (#402) from Riedler/akkoma-fe:wide-columns-for-upstream into develop
Reviewed-on: https://akkoma.dev/AkkomaGang/akkoma-fe/pulls/402
2025-03-01 12:00:33 +00:00
floatingghost
65cb3b95e0 Merge pull request 'Use FEP-c16b: Formatting MFM functions' (#410) from ilja/akkoma-fe:use_fep-c16b_formatting_mfm_functions into develop
Reviewed-on: https://akkoma.dev/AkkomaGang/akkoma-fe/pulls/410
2025-02-27 12:04:41 +00:00
Riedler
f15b94d566 made widenTimeline false by default 2025-02-07 03:50:44 +01:00
Riedler
06ba190e2e reduce gallery size 2025-02-07 03:49:57 +01:00
floatingghost
2086522d64 Merge pull request '(arguably) improved layouting of user profile page' (#403) from Riedler/akkoma-fe:user-profile-changes into develop
Reviewed-on: https://akkoma.dev/AkkomaGang/akkoma-fe/pulls/403
2025-01-15 21:47:55 +00:00
Weblate
fa294e0003 Merge branch 'origin/develop' into Weblate. 2025-01-05 15:52:29 +00:00
floatingghost
d3fa5cfad0 Merge pull request 'post_status_form: enable sync flush for watcher' (#414) from novenary/akkoma-fe:sticky-drafts into develop
Reviewed-on: https://akkoma.dev/AkkomaGang/akkoma-fe/pulls/414
2025-01-05 15:52:26 +00:00
Weblate
9552287442 Merge branch 'origin/develop' into Weblate. 2025-01-05 15:52:19 +00:00
floatingghost
6b7c8f0def Merge pull request 'Allow using custom source URLs' (#421) from Oneric/akkoma-fe:custom-source into develop
Reviewed-on: https://akkoma.dev/AkkomaGang/akkoma-fe/pulls/421
2025-01-05 15:52:15 +00:00
Weblate
3386692e26 Merge branch 'origin/develop' into Weblate. 2025-01-05 15:51:50 +00:00
floatingghost
ad6bb47003 Merge pull request 'Add visual feedback when clicking translate' (#423) from ilja/akkoma-fe:provide_visual_feedback_when_clicking_translate_button into develop
Reviewed-on: https://akkoma.dev/AkkomaGang/akkoma-fe/pulls/423
2025-01-05 15:51:47 +00:00
ilja
9838545904 Add visual feedback when clicking translate
In a status, we can choose to translate the status (assuming there's a translator enabled on the backend)

It will translate, in practice generally according to detected language, and also provide an option to override the source language.

Translating can take a while, and there wasn't really a visual feedback when it was translating.
Now the translate button will be dissabled while translating.
2024-12-01 14:04:49 +01:00
ilja space
868c6e41ac Improve readability for MFM styles code
The code to turn mdm-data-* attributes into a value for the style attribute is complex.
I wrapped it in it's own function now for better code readability.
A comment was already provided with what the code intents to do and why, this information has also been moved
to this function.
2024-12-01 12:24:23 +01:00
Weblate
b3f25e5d84 Translated using Weblate (Polish)
Currently translated at 99.7% (1046 of 1049 strings)

Translated using Weblate (Polish)

Currently translated at 99.7% (1046 of 1049 strings)

Co-authored-by: ? <akkoma@mkljczk.pl>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: subtype <subtype@hollow.capital>
Translate-URL: http://translate.akkoma.dev/projects/akkoma/pleroma-fe/pl/
Translation: Pleroma fe/pleroma-fe
2024-11-22 04:56:24 +00:00
Weblate
248509073e Translated using Weblate (Italian)
Currently translated at 93.8% (985 of 1049 strings)

Co-authored-by: Steffo <akkoma@steffo.eu>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: http://translate.akkoma.dev/projects/akkoma/pleroma-fe/it/
Translation: Pleroma fe/pleroma-fe
2024-11-22 04:56:24 +00:00
Weblate
a7d6235131 Translated using Weblate (Lithuanian)
Currently translated at 8.1% (86 of 1049 strings)

Translated using Weblate (Lithuanian)

Currently translated at 5.5% (58 of 1049 strings)

Translated using Weblate (Lithuanian)

Currently translated at 1.9% (20 of 1049 strings)

Added translation using Weblate (Lithuanian)

Co-authored-by: Vaclovas Intas <Gateway_31@protonmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: http://translate.akkoma.dev/projects/akkoma/pleroma-fe/lt/
Translation: Pleroma fe/pleroma-fe
2024-11-22 04:56:24 +00:00
ilja space
177d96f977 Improve how scaling is done
During code review a much better way was pointed out to do the emoji scaling, by using `em`.

*key uses 2em for emoji, which is smaller than Akkoma has. I now kept the 38px for Akkoma,
but when "zoom" (ie x2, x3, x4, tada) happens, we set to 2em and zoom from there.
2024-11-01 14:25:22 +01:00
Oneric
42ba77ebf4 Allow using custom source URLs 2024-10-26 16:32:14 +02:00
floatingghost
4a50b1273d Merge pull request 'fix panel z-index conflicting with heading popover' (#422) from tea/akkoma-fe:fix/panel-z-index into develop
Reviewed-on: https://akkoma.dev/AkkomaGang/akkoma-fe/pulls/422
2024-10-26 03:42:48 +00:00
floatingghost
c76dc6d79e Merge pull request 'Fix redirect on logout' (#420) from Oneric/akkoma-fe:logout-redirect into develop
Reviewed-on: https://akkoma.dev/AkkomaGang/akkoma-fe/pulls/420
2024-10-26 03:42:23 +00:00
floatingghost
cb4c581cde Merge pull request 'Add proper autocomplete prop for TOTP login field' (#424) from tudbut/akkoma-fe:develop into develop
Reviewed-on: https://akkoma.dev/AkkomaGang/akkoma-fe/pulls/424
2024-10-26 03:41:15 +00:00
TudbuT
8231c8f0b6
add proper autocomplete prop for TOTP login field 2024-10-19 19:19:15 +02:00
novenary
ef242a1ddd post_status_form: enable sync flush for watcher
This fixes drafts not clearing after posting a reply.

Vue 3.3.11 changed watchers to stop firing after component unmount.
After posting a reply, the post form is removed, now causing the queued
event to be discarded.
Synchronous flush causes the handler to be called immediately when
changes happen, solving the problem.

The performance impact of this change seems non-existent. Even before,
typing would generate an event for each keystroke. Pasting is atomic.

See: https://github.com/vuejs/core/pull/7181
See: 80e2128d52
Fixes: a7dea2f70f
Fixes: #413
2024-10-15 00:16:45 +03:00
tea
35cf3327c8 fix panel z-index conflicting with heading popover
resolves #342
2024-10-05 10:59:46 +02:00
Oneric
1ae09458c6 Fix redirect on logout
An instance may restrict access to the public timeline (among others)
to authenticated users and there already is a setting to decide which page
to show authenticated and unauthenticated viewers by default each.
However, the logout redirect didn't honour this setting
leading to potentially broken pages and errors on logout
2024-09-28 17:47:28 +02:00
floatingghost
f391cf70a4 Merge pull request 'README: Add line to install Node.js' (#409) from ilja/akkoma-fe:README_add_to_install_node into develop
Reviewed-on: https://akkoma.dev/AkkomaGang/akkoma-fe/pulls/409
2024-08-25 09:09:35 +00:00
floatingghost
fa8fde2ab1 Merge pull request 'Upgrade vue packages' (#411) from Oneric/akkoma-fe:vue-mathml into develop
Reviewed-on: https://akkoma.dev/AkkomaGang/akkoma-fe/pulls/411
2024-08-25 09:08:04 +00:00
floatingghost
1f2c96a485 Merge pull request 'Fix setting restore from file' (#406) from Oneric/akkoma-fe:fix-file-restore into develop
Reviewed-on: https://akkoma.dev/AkkomaGang/akkoma-fe/pulls/406
2024-08-25 09:07:18 +00:00
ilja
25681cf5f6 Don't require # in the data-mfm-color attribute
For colour in MFM attributes, we expected a `#`, but that's apparently wrong. The BE
translates the `color` attribute in `$[fg.color=000 text]` into `data-mfm-color=000`.
But for the SCSS to work, we need to put it in the style attribute as `--mfm-color: #000`.

Generally we just add the attribute value as-is in the `style` attribute, but now we
have a special exception for color so we add a `#` before the value.
2024-08-18 15:48:22 +02:00
Oneric
6c178aa257 Upgrade vue packages
Bumping past vue 3.4.0 guarantees MathML support for FEP-dc88.

Related to: https://akkoma.dev/AkkomaGang/akkoma/pulls/642
2024-08-17 18:01:59 +02:00
ilja
6666a273a4 MFM only use sanitised data-* attribute values
We take the value from a data-* attribute and then add this to the style attribute.
This will probably be OK in most cases, but just to be sure, we check for "weird" characters first.
For now we only allow letters, numbers, dot, hash, and plus and minus sign, because those are the ones I currently know of who are used in MFM.
The data-* attribute remains because it was already considered proper HTML as-is.
2024-08-11 18:11:03 +02:00
ilja
3210873d7f MFM make all supported tags suggested
When typing MFM, a sugestor drop-down appears so you can see and/or choose what MFM function to use
The new MFM functions we support have now also been added
2024-08-10 13:55:52 +02:00
ilja
f5f9949253 Fix mfm-position and mfm-scale
The `span`'s needed an inline-block for the transform to wrok
I also added an `overflow: hidden;` because these functions can make the text go beyond the borders of the StatusBody
With `overflow: hidden;`, it won't show outside of the borders
2024-08-10 13:13:47 +02:00
ilja
ba4ae5badb Fix MFM functions x2, x3, and x4
These now work for the new, FEP-c16b compliant, representation
Nesting also works

It already worked for text and "normal" emoji, but now it also works for custom emoji
2024-08-10 12:45:37 +02:00
ilja
56a59e1b55 fill in data-mfm- variables
Things like `speed=0.1s` now work

I also noticed a class was set on StatusBody, but we don't use it, we use StatusContent.
Therefor I removed it now.

We do still pass the setting through StatusBody to RichContent bc it's used there to decide to not show greentext for arrows when MFM was used.
Note that while this setting still works
* You have to refresh the page to see it working (was already like this, so I didn't touch it here)
* It explicitly checks for content type. If womeone provides MFM-like HTML, then it will still show as greentext if that option is enabled
  I think it's a bit inconsistent, but otoh, the inconsistency to me seems more that we ignore the greentext option for one input type specifically

I do still notice generall bugs with MFM.
* Position doesn't seem to work, neither does scale.
* There also seems to be a regression where custom emojis don't become larger any more with e.g. `$[x2 :hehe: ]`

I don't assume the regression is made in this commit, so I add this already. The rest needs to be fixed before merging.
2024-08-05 17:23:15 +02:00
ilja
3065416c93 Make new SCSS work for non-variables
The SCSS that we took from Foundkey in a previous commit, is now working
The settings for disabling MFM or only show animation on hover are working
The previous representation also works and it's clearly marked in the code what is legacy
All the MFM SCSS is now located in one file specifically for MFM, ./src/components/status_content/mfm.scss

This is only SCSS:
* The variables who are provided as data-attributes are not working yet
* `sparkle` also doesn't work
2024-08-04 19:10:25 +02:00
Johann150
94141dcb3c Message from commiter: Add Foundkey MFM stylesheet
This is part of a bigger work to fix MFM in Akkoma
See <https://akkoma.dev/AkkomaGang/akkoma/issues/381>

Here we add the MFM stylesheet as it is used by Foundkey
See <b22e627089>

Foundkey uses MFM and both the Founkey and Akkoma projects and communities, have historically been closely related
As such it makes sense to start with feature-parity with Foundkey

This commit only adds the stylesheet so that correct attribution is given
Properly integrating and making it work will happen in later commits
2024-08-04 17:55:32 +02:00
ilja
92e278d406 Move MFM SCSS to separate SCSS
MFM was defined in three places.
There was ./src/components/status_body/status_body.scss => I moved this to ./src/components/status_content/mfm.scss
There was ./src/components/status_content/status_content.vue => I moved this to ./src/components/status_content/mfm.scss
There's ./static/mfm.css => I kept this as-is

./src/components/status_content/mfm.scss is now being loaded in ./src/components/status_content/status_content.vue

I added a comment in both ./src/components/status_content/mfm.scss and ./static/mfm.css referencing each other

Note that this is just a first step in an overhoal of how MFM is handled. It seemed easier to do this as a first step and then build further on that.
2024-08-04 17:44:21 +02:00
ilja
3349fe6ff2 Add line to install Node.js
For someone who isn't used to building fe things like this, it's
not always clear to install Node.js or what version.

A line has been added to the installation instructions pointing to
resources where to get it and what version to use. For version I
point to the woodpecker config because that is what the CI uses and
therefor always "tested".

There was a file .node-version who contained a node version, but
this was seriously outdated and removing it didn't seem to break
anything. Assuming it indeed doesn't do anything any more, it seems
better to remove to avoid confusion.
2024-08-03 09:54:14 +02:00
RiedleroD
94ed0991bc reverted 2e83ccefdc and clarified that compact user info is only used with enough room 2024-07-06 14:54:24 +02:00
Oneric
e274adf47d Fix setting restore from file
Previously restoring from file would also restore the old version value
breaking upload of the new settings to the server.

Additionallly it didn’t even attempt to sync settings after restore and
was insufferably slow due to individually updating every single setting
with a dispatch. Instead only update changed settings like on server
syncs which usually speeds the process up considerably.

Fixes: https://akkoma.dev/AkkomaGang/akkoma-fe/issues/405
2024-07-06 01:59:42 +02:00
RiedleroD
e955eb4503 oops, unfucked username placement 2024-07-03 18:58:50 +02:00
RiedleroD
c39d9fa64b fixed stuff overflowing in user popup e.g. in notifs 2024-07-03 18:30:51 +02:00
RiedleroD
a74a631793 stopped user handle from overflowing from its boundaries in user card 2024-07-03 17:45:40 +02:00
RiedleroD
2e83ccefdc disabled "compact user info" setting in mobile layout 2024-07-03 17:35:13 +02:00
RiedleroD
cf11b2523e disabled compact user card in mobile layout 2024-07-03 17:26:09 +02:00
Floatingghost
8765491399 Do not try to destructure when we don't need to 2024-06-27 02:58:52 +01:00
RiedleroD
85001814a2 added setting for user info compactness 2024-06-26 18:09:13 +02:00
RiedleroD
c902219997 added setting to switch between center and left-aligned user bio 2024-06-26 17:20:50 +02:00
RiedleroD
2e2e87db75 expand underlay to screen edges when TL is widened 2024-06-26 16:43:32 +02:00
RiedleroD
b2af067fd3 reverted visual changes to underlay 2024-06-26 16:39:04 +02:00
floatingghost
4211e05a75 Merge pull request 'status component: Fix repeater name overflowing' (#383) from yukijoou/akkoma-fe:fix-status-usernames into develop
Reviewed-on: https://akkoma.dev/AkkomaGang/akkoma-fe/pulls/383
2024-06-25 21:34:15 +00:00
Floatingghost
a3251a1ba6 Merge remote-tracking branch 'origin/translations' into develop 2024-06-23 03:03:40 +01:00
Floatingghost
e5608f4009 remove ora as a dep 2024-06-23 03:03:11 +01:00
Floatingghost
1092d43802 remove nonsense dep 2024-06-23 03:02:45 +01:00
Weblate
98a3622172 Merge branch 'origin/develop' into Weblate. 2024-06-17 21:40:59 +00:00
floatingghost
24b9e350e2 Merge pull request 'added minimum space to empty timeline' (#400) from Riedler/akkoma-fe:empty-tl-minspace into develop
Reviewed-on: https://akkoma.dev/AkkomaGang/akkoma-fe/pulls/400
2024-06-17 21:40:56 +00:00
Weblate
7ab4d22a4c Merge branch 'origin/develop' into Weblate. 2024-06-17 21:40:29 +00:00
floatingghost
8489f6d5ae Merge pull request 'visually fuse CW line and post body textarea' (#401) from Riedler/akkoma-fe:fuse-cw-to-post-body into develop
Reviewed-on: https://akkoma.dev/AkkomaGang/akkoma-fe/pulls/401
2024-06-17 21:40:26 +00:00
RiedleroD
754cd2fa57 slightly adjusted edit button spacing 2024-06-16 17:15:04 +02:00
RiedleroD
31055fb4f2 removed min-width statements that were messing up my layouts 2024-06-16 17:14:59 +02:00
RiedleroD
918b0e3770 stopped username from wrapping… 2024-06-16 17:14:14 +02:00
RiedleroD
88aae1706a oops, removed unneeded spacing 2024-06-16 17:14:08 +02:00
RiedleroD
3d2a8a3ca2 left-aligned bio text
why the fuck was it centered in the first place?!?
2024-06-16 17:14:03 +02:00
RiedleroD
a24fff5d5b moved user stats to between user info and user actions 2024-06-16 17:14:00 +02:00
RiedleroD
4abddf5e6a made wide column layout optional 2024-06-16 16:37:33 +02:00
RiedleroD
1b4df9e79d reverted audio attachments to 4:1 aspect ratio 2024-06-16 16:37:30 +02:00
RiedleroD
45fe334cd7 fixed sizing issues with attachments in some non-status containers 2024-06-16 16:37:26 +02:00
RiedleroD
dd32a33d59 fixed media attachment heights 2024-06-16 16:37:22 +02:00
RiedleroD
74b651a3a2 made attached images max size scale with font size
meta-comment: eliminated corner-case weirdness by replaced cursed CSS with slightly less cursed CSS
2024-06-16 16:37:07 +02:00
RiedleroD
21fe7d76d3 made columns use more space, fixed minor bug 2024-06-16 16:35:46 +02:00
RiedleroD
b2cab6d088 only flatten top of post body textarea if subject line is visible 2024-06-16 16:26:44 +02:00
RiedleroD
3ebaba6fa7 smushed subject line and post body together, kinda 2024-06-16 16:14:16 +02:00
RiedleroD
f1058567b9 also set min height for other lists (e.g. follow requests), not just the timeline 2024-06-16 16:12:15 +02:00
RiedleroD
49a850a1e9 added minimum space to empty timeline 2024-06-16 15:49:52 +02:00
Weblate
b2de68239f Merge branch 'origin/develop' into Weblate. 2024-06-15 12:41:26 +00:00
floatingghost
c68595345f Merge pull request 'ANNOYING dependency update' (#397) from dep-update into develop
Reviewed-on: https://akkoma.dev/AkkomaGang/akkoma-fe/pulls/397
2024-06-15 12:41:23 +00:00
Floatingghost
a5d4b0a68c Merge branch 'develop' into dep-update 2024-06-15 13:38:40 +01:00
Floatingghost
bd263587b2 Merge branch 'develop' into dep-update 2024-06-15 13:36:24 +01:00
Weblate
c19fb198ca Merge branch 'origin/develop' into Weblate. 2024-06-15 12:33:42 +00:00
floatingghost
97966045cb Merge pull request 'make status form selectors justified properly' (#398) from rat/akkoma-fe:status-form-selector into develop
Reviewed-on: https://akkoma.dev/AkkomaGang/akkoma-fe/pulls/398
2024-06-15 12:33:38 +00:00
rat
aad023c8a0 make status form selectors justified properly 2024-06-10 17:20:51 -07:00
Floatingghost
c952b2335c correct eslint plugin 2024-05-29 04:04:56 +01:00
Floatingghost
0baf31f498 correct package.json lint task 2024-05-29 04:01:29 +01:00
Floatingghost
8fa24d0c40 migrate to eslint 9 syntax 2024-05-29 03:59:37 +01:00
Floatingghost
5848c18ec8 remove unused CI file 2024-05-29 03:43:41 +01:00
Weblate
54dbead22c Merge branch 'origin/develop' into Weblate. 2024-05-28 21:33:19 +00:00
floatingghost
3e86db24d3 Update .woodpecker.yml 2024-05-28 21:33:15 +00:00
Weblate
d8f3f5002f Merge branch 'origin/develop' into Weblate. 2024-05-28 21:31:51 +00:00
floatingghost
7789c5def6 Update .woodpecker.yml 2024-05-28 21:31:46 +00:00
Floatingghost
a45f482c79 remove a useless log 2024-05-28 04:18:32 +01:00
Weblate
ed22c480f9 Merge branch 'origin/develop' into Weblate. 2024-05-28 03:17:19 +00:00
Floatingghost
f3934afbd8 make sure we normalise interfaceLanguage 2024-05-28 04:17:04 +01:00
Weblate
3797495e53 Merge branch 'origin/develop' into Weblate. 2024-05-28 03:15:47 +00:00
Floatingghost
0b437ab6fd remove line left over in conflict 2024-05-28 04:15:35 +01:00
Floatingghost
a7dea2f70f ANNOYING dependency update 2024-05-28 04:02:17 +01:00
Weblate
2c9da4a58c Merge branch 'origin/develop' into Weblate. 2024-05-28 02:25:05 +00:00
floatingghost
8964dce609 Merge pull request 'Make animated emojis in reactions pause' (#378) from sarayalth/akkoma-fe:pause-animated-reaction into develop
Reviewed-on: https://akkoma.dev/AkkomaGang/akkoma-fe/pulls/378
2024-05-28 02:25:02 +00:00
Weblate
156b036caa Merge branch 'origin/develop' into Weblate. 2024-05-28 02:24:09 +00:00
floatingghost
1a49a1b3ac Merge pull request 'Expand Unicode emoji map' (#385) from Oneric/akkoma-fe:emoji_update into develop
Reviewed-on: https://akkoma.dev/AkkomaGang/akkoma-fe/pulls/385
2024-05-28 02:24:06 +00:00
Weblate
61d82a2a07 Merge branch 'origin/develop' into Weblate. 2024-05-28 02:22:11 +00:00
Floatingghost
1adef56603 Merge remote-tracking branch 'partizan/386-default-post-lang' into develop 2024-05-28 03:22:03 +01:00
Weblate
b9bf0f0002 Merge branch 'origin/develop' into Weblate. 2024-05-28 02:14:58 +00:00
Floatingghost
5aaa605df0 add asdf tool file 2024-05-28 03:14:50 +01:00
Weblate
7136ea80b9 Merge branch 'origin/develop' into Weblate. 2024-05-28 02:14:48 +00:00
Floatingghost
71e287d56c update CI to v2 2024-05-28 03:14:37 +01:00
Weblate
a64cdda725 Merge branch 'origin/develop' into Weblate. 2024-05-28 02:10:18 +00:00
floatingghost
70275684bf Merge pull request 'Fix posting for "special" interface languages' (#377) from Oneric/akkoma-fe:post-language-specialcodes into develop
Reviewed-on: https://akkoma.dev/AkkomaGang/akkoma-fe/pulls/377
2024-05-28 02:10:15 +00:00
Weblate
7e7f03aece Merge branch 'origin/develop' into Weblate. 2024-05-28 02:07:18 +00:00
floatingghost
29ff2ef455 Merge pull request 'Fix ordering of favourites timeline' (#392) from Oneric/akkoma-fe:favourite-ordering into develop
Reviewed-on: https://akkoma.dev/AkkomaGang/akkoma-fe/pulls/392
2024-05-28 02:07:15 +00:00
Yuki Joou
8c49474dea status component: Fix repeater name overflowing
If someone repeating a post had a long username, their username would
overflow beyond the bounds of the post.

This fixes this isse by turning the bar displaying the username and
repeat icon into a flexbox.
2024-05-18 01:25:15 +02:00
Oneric
62e0dd858c Fix ordering of favourites timeline
The backend returns them order by when the post was favourited;
reordering them by post date jumbles everything up each addition
and serves no purpose.

Fixes: https://akkoma.dev/AkkomaGang/akkoma-fe/issues/391
2024-05-15 18:47:47 +02:00
sarah
cc709394c5 remove unused classes on notifications 2024-05-14 18:09:21 +02:00
Serhii Tereshchenko
57beea6a0d fix: Use label and key for options 2024-05-13 16:13:58 +03:00
Weblate
45524552a0 Translated using Weblate (Vietnamese)
Currently translated at 91.9% (964 of 1048 strings)

Translated using Weblate (Vietnamese)

Currently translated at 92.2% (965 of 1046 strings)

Translated using Weblate (Vietnamese)

Currently translated at 92.2% (965 of 1046 strings)

Translated using Weblate (Vietnamese)

Currently translated at 84.3% (882 of 1046 strings)

Translated using Weblate (Vietnamese)

Currently translated at 84.3% (882 of 1046 strings)

Translated using Weblate (Vietnamese)

Currently translated at 79.8% (835 of 1046 strings)

Translated using Weblate (Vietnamese)

Currently translated at 79.8% (835 of 1046 strings)

Co-authored-by: Nguyễn Gia Phong <cnx@loang.net>
Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: xarvos <huyngo@disroot.org>
Translate-URL: http://translate.akkoma.dev/projects/akkoma/pleroma-fe/vi/
Translation: Pleroma fe/pleroma-fe
2024-04-29 14:09:37 +00:00
Weblate
ee66b69ab5 Translated using Weblate (Japanese)
Currently translated at 0.2% (3 of 1046 strings)

Added translation using Weblate (Japanese)

Co-authored-by: Nakaya <s_fpfb_sub-second@yahoo.co.jp>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: http://translate.akkoma.dev/projects/akkoma/pleroma-fe/ja/
Translation: Pleroma fe/pleroma-fe
2024-04-29 14:09:37 +00:00
Weblate
d42e374704 Translated using Weblate (Greek)
Currently translated at 15.9% (167 of 1046 strings)

Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: getimiskon <getimiskon@disroot.org>
Translate-URL: http://translate.akkoma.dev/projects/akkoma/pleroma-fe/el/
Translation: Pleroma fe/pleroma-fe
2024-04-29 14:09:37 +00:00
Weblate
ce8a9d2b4a Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (1048 of 1048 strings)

Merge branch 'origin/develop' into Weblate.

Translated using Weblate (Chinese (Simplified))

Currently translated at 100.0% (1046 of 1046 strings)

Co-authored-by: Poesty Li <poesty7450@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: http://translate.akkoma.dev/projects/akkoma/pleroma-fe/zh_Hans/
Translation: Pleroma fe/pleroma-fe
2024-04-29 14:09:37 +00:00
Weblate
d2b7ac6d8c Translated using Weblate (Polish)
Currently translated at 99.7% (1045 of 1048 strings)

Translated using Weblate (Polish)

Currently translated at 99.7% (1045 of 1048 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (1046 of 1046 strings)

Translated using Weblate (Polish)

Currently translated at 100.0% (1046 of 1046 strings)

Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: subtype <subtype@hollow.capital>
Translate-URL: http://translate.akkoma.dev/projects/akkoma/pleroma-fe/pl/
Translation: Pleroma fe/pleroma-fe
2024-04-29 14:09:37 +00:00
Weblate
754c72cb24 Translated using Weblate (Portuguese)
Currently translated at 100.0% (1048 of 1048 strings)

Co-authored-by: Jammer Lammer <akHarINlMYExpSmVPDRT@proton.me>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: http://translate.akkoma.dev/projects/akkoma/pleroma-fe/pt/
Translation: Pleroma fe/pleroma-fe
2024-04-29 14:09:37 +00:00
Weblate
f5bd195422 Translated using Weblate (Russian)
Currently translated at 68.7% (719 of 1046 strings)

Co-authored-by: Mel <hi@mel.gg>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: http://translate.akkoma.dev/projects/akkoma/pleroma-fe/ru/
Translation: Pleroma fe/pleroma-fe
2024-04-29 14:09:37 +00:00
Weblate
d49fd46554 Translated using Weblate (Japanese (ja_EASY))
Currently translated at 72.3% (757 of 1046 strings)

Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: kazari <6c577a54-aac9-482a-955e-745c858445e3@simplelogin.com>
Translate-URL: http://translate.akkoma.dev/projects/akkoma/pleroma-fe/ja_EASY/
Translation: Pleroma fe/pleroma-fe
2024-04-29 14:09:37 +00:00
Weblate
9982373853 Translated using Weblate (Italian)
Currently translated at 80.4% (841 of 1045 strings)

Translated using Weblate (Italian)

Currently translated at 65.3% (683 of 1045 strings)

Co-authored-by: Cuche <cuche@mailbox.org>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: http://translate.akkoma.dev/projects/akkoma/pleroma-fe/it/
Translation: Pleroma fe/pleroma-fe
2024-04-29 14:09:37 +00:00
Weblate
5206b5cf9c Translated using Weblate (Chinese (Traditional))
Currently translated at 100.0% (1048 of 1048 strings)

Translated using Weblate (Chinese (Traditional))

Currently translated at 99.2% (1040 of 1048 strings)

Co-authored-by: Toot <toothpicker@users.noreply.translate.akkoma.dev>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: http://translate.akkoma.dev/projects/akkoma/pleroma-fe/zh_Hant/
Translation: Pleroma fe/pleroma-fe
2024-04-29 14:09:37 +00:00
Weblate
a65a06ca04 Translated using Weblate (Catalan)
Currently translated at 100.0% (1048 of 1048 strings)

Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: fadelkon <fadelkon@posteo.net>
Translate-URL: http://translate.akkoma.dev/projects/akkoma/pleroma-fe/ca/
Translation: Pleroma fe/pleroma-fe
2024-04-29 14:09:37 +00:00
Weblate
c10b38afbc Translated using Weblate (Indonesian)
Currently translated at 71.9% (753 of 1046 strings)

Co-authored-by: Aldiantoro Nugroho <kriwil@gmail.com>
Co-authored-by: Weblate <noreply@weblate.org>
Translate-URL: http://translate.akkoma.dev/projects/akkoma/pleroma-fe/id/
Translation: Pleroma fe/pleroma-fe
2024-04-29 14:09:37 +00:00
Weblate
009941ea2c Translated using Weblate (Spanish)
Currently translated at 93.7% (983 of 1048 strings)

Translated using Weblate (Spanish)

Currently translated at 93.9% (983 of 1046 strings)

Translated using Weblate (Spanish)

Currently translated at 92.5% (967 of 1045 strings)

Co-authored-by: Weblate <noreply@weblate.org>
Co-authored-by: taretka <info@tarteka.net>
Translate-URL: http://translate.akkoma.dev/projects/akkoma/pleroma-fe/es/
Translation: Pleroma fe/pleroma-fe
2024-04-29 14:09:37 +00:00
Serhii Tereshchenko
042e8c78dc feat: Add "Default post language" option
Refs #386
2024-04-20 16:07:03 +03:00
Oneric
0e07d88afa Expand Unicode emoji map
This pulls in 267 new emoji:
  - all 258 non-deprecated country or macro region
    flags (composed by two regional indicators)
  - all 3 regional flags currently recommended for general use
    (Wales, Scotland, England)
  - a few random ones i picked out
    - goose
    - heart on fire
    - heart mending
    - transgender flag
    - rainbow flag
    - pirate flag

The new names are derived from official Unicode names
with minor modifications to fit into the usual shortcode scheme
and dropping the flag_ prefix from country indicators.
Due to a naming conflict the old "japan" emoji
U+1F5FE SILHOUETTE OF JAPAN was renamed to "japan_silhouette".
2024-04-04 21:52:33 +02:00
sarah
1f5f8665c8 make animated reactions pause unless hovered on notifications 2024-03-01 20:02:19 +01:00
Oneric
428ed70b0d Fix posting for special interface languages
Easy Japanses (ja_easy) and traditional Chinses (zh_Hant) use
(custom) non-ISO codes in the interface. Because MastoAPI only accepts
ISO 639 codes, the backend will return an error rendering users
unable to do anything unless the post’s language was explicitly set.
2024-02-26 08:05:55 +01:00
139 changed files with 8009 additions and 6196 deletions

View file

@ -1,2 +0,0 @@
build/*.js
config/*.js

View file

@ -1,30 +0,0 @@
module.exports = {
root: true,
parserOptions: {
parser: '@babel/eslint-parser',
sourceType: 'module'
},
// https://github.com/feross/standard/blob/master/RULES.md#javascript-standard-style
extends: [
'plugin:vue/recommended'
],
// required to lint *.vue files
plugins: [
'vue',
'import'
],
// add your custom rules here
rules: {
// allow paren-less arrow functions
'arrow-parens': 0,
// allow async-await
'generator-star-spacing': 0,
// allow debugger during development
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
'vue/require-prop-types': 0,
'vue/no-unused-vars': 0,
'no-tabs': 0,
'vue/multi-word-component-names': 0,
'vue/no-reserved-component-names': 0
}
}

View file

@ -1 +0,0 @@
7.2.1

1
.tool-versions Normal file
View file

@ -0,0 +1 @@
nodejs 20.12.2

View file

@ -1,20 +1,21 @@
labels:
platform: linux/amd64 platform: linux/amd64
pipeline:
steps:
lint: lint:
when: when:
event: event:
- pull_request - pull_request
image: node:18 image: node:20
commands: commands:
- yarn - yarn
- yarn lint - yarn lint
#- yarn stylelint
test: test:
when: when:
event: event:
- pull_request - pull_request
image: node:18 image: node:20
commands: commands:
- apt update - apt update
- apt install firefox-esr -y --no-install-recommends - apt install firefox-esr -y --no-install-recommends
@ -28,7 +29,7 @@ pipeline:
branch: branch:
- develop - develop
- stable - stable
image: node:18 image: node:20
commands: commands:
- yarn - yarn
- yarn build - yarn build
@ -40,15 +41,15 @@ pipeline:
branch: branch:
- develop - develop
- stable - stable
image: node:18 image: node:20
secrets: secrets:
- SCW_ACCESS_KEY - SCW_ACCESS_KEY
- SCW_SECRET_KEY - SCW_SECRET_KEY
- SCW_DEFAULT_ORGANIZATION_ID - SCW_DEFAULT_ORGANIZATION_ID
commands: commands:
- apt-get update && apt-get install -y rclone wget zip - apt-get update && apt-get install -y rclone wget zip
- wget https://github.com/scaleway/scaleway-cli/releases/download/v2.5.1/scaleway-cli_2.5.1_linux_amd64 - wget https://github.com/scaleway/scaleway-cli/releases/download/v2.30.0/scaleway-cli_2.30.0_linux_amd64
- mv scaleway-cli_2.5.1_linux_amd64 scaleway-cli - mv scaleway-cli_2.30.0_linux_amd64 scaleway-cli
- chmod +x scaleway-cli - chmod +x scaleway-cli
- ./scaleway-cli object config install type=rclone - ./scaleway-cli object config install type=rclone
- zip akkoma-fe.zip -r dist - zip akkoma-fe.zip -r dist
@ -70,8 +71,8 @@ pipeline:
- SCW_DEFAULT_ORGANIZATION_ID - SCW_DEFAULT_ORGANIZATION_ID
commands: commands:
- apt-get update && apt-get install -y rclone wget git zip - apt-get update && apt-get install -y rclone wget git zip
- wget https://github.com/scaleway/scaleway-cli/releases/download/v2.5.1/scaleway-cli_2.5.1_linux_amd64 - wget https://github.com/scaleway/scaleway-cli/releases/download/v2.30.0/scaleway-cli_2.30.0_linux_amd64
- mv scaleway-cli_2.5.1_linux_amd64 scaleway-cli - mv scaleway-cli_2.30.0_linux_amd64 scaleway-cli
- chmod +x scaleway-cli - chmod +x scaleway-cli
- ./scaleway-cli object config install type=rclone - ./scaleway-cli object config install type=rclone
- cd docs - cd docs

View file

@ -20,6 +20,8 @@ To use Akkoma-FE in Akkoma, use the [frontend](https://docs.akkoma.dev/stable/ad
## Build Setup ## Build Setup
Make sure you have [Node.js](https://nodejs.org/) installed. You can check `/.woodpecker.yml` for which node version the Akkoma CI currently uses.
``` bash ``` bash
# install dependencies # install dependencies
corepack enable corepack enable

View file

@ -1,36 +1,36 @@
// https://github.com/shelljs/shelljs // https://github.com/shelljs/shelljs
require('./check-versions')() require("./check-versions")();
require('shelljs/global') require("shelljs/global");
env.NODE_ENV = 'production' env.NODE_ENV = "production";
var path = require('path') var path = require("path");
var config = require('../config') var config = require("../config");
var ora = require('ora') var webpack = require("webpack");
var webpack = require('webpack') var webpackConfig = require("./webpack.prod.conf");
var webpackConfig = require('./webpack.prod.conf')
console.log( console.log(
' Tip:\n' + " Tip:\n" +
' Built files are meant to be served over an HTTP server.\n' + " Built files are meant to be served over an HTTP server.\n" +
' Opening index.html over file:// won\'t work.\n' " Opening index.html over file:// won't work.\n",
) );
var spinner = ora('building for production...') var assetsPath = path.join(
spinner.start() config.build.assetsRoot,
config.build.assetsSubDirectory,
var assetsPath = path.join(config.build.assetsRoot, config.build.assetsSubDirectory) );
rm('-rf', assetsPath) rm("-rf", assetsPath);
mkdir('-p', assetsPath) mkdir("-p", assetsPath);
cp('-R', 'static/*', assetsPath) cp("-R", "static/*", assetsPath);
webpack(webpackConfig, function (err, stats) { webpack(webpackConfig, function (err, stats) {
spinner.stop() if (err) throw err;
if (err) throw err process.stdout.write(
process.stdout.write(stats.toString({ stats.toString({
colors: true, colors: true,
modules: false, modules: false,
children: false, children: false,
chunks: false, chunks: false,
chunkModules: false chunkModules: false,
}) + '\n') }) + "\n",
}) );
});

View file

@ -5,7 +5,7 @@ var path = require('path')
var express = require('express') var express = require('express')
var webpack = require('webpack') var webpack = require('webpack')
var opn = require('opn') var opn = require('opn')
var proxyMiddleware = require('http-proxy-middleware') const { createProxyMiddleware } = require('http-proxy-middleware');
var webpackConfig = process.env.NODE_ENV === 'testing' var webpackConfig = process.env.NODE_ENV === 'testing'
? require('./webpack.prod.conf') ? require('./webpack.prod.conf')
: require('./webpack.dev.conf') : require('./webpack.dev.conf')
@ -36,7 +36,13 @@ Object.keys(proxyTable).forEach(function (context) {
if (typeof options === 'string') { if (typeof options === 'string') {
options = { target: options } options = { target: options }
} }
app.use(proxyMiddleware(context, options)) const targetUrl = new URL(options.target);
// add path
targetUrl.pathname = context;
options.target = targetUrl.toString();
console.log("Proxying", context, "to", options.target);
app.use(context, createProxyMiddleware(options))
}) })
// handle fallback for HTML5 history API // handle fallback for HTML5 history API

View file

@ -3,6 +3,7 @@ var config = require('../config')
var utils = require('./utils') var utils = require('./utils')
var projectRoot = path.resolve(__dirname, '../') var projectRoot = path.resolve(__dirname, '../')
var { VueLoaderPlugin } = require('vue-loader') var { VueLoaderPlugin } = require('vue-loader')
const ESLintPlugin = require('eslint-webpack-plugin');
var env = process.env.NODE_ENV var env = process.env.NODE_ENV
// check env & config/index.js to decide weither to enable CSS Sourcemaps for the // check env & config/index.js to decide weither to enable CSS Sourcemaps for the
@ -35,6 +36,7 @@ module.exports = {
], ],
fallback: { fallback: {
"url": require.resolve("url/"), "url": require.resolve("url/"),
querystring: require.resolve("querystring-es3")
}, },
alias: { alias: {
'static': path.resolve(__dirname, '../static'), 'static': path.resolve(__dirname, '../static'),
@ -47,20 +49,6 @@ module.exports = {
module: { module: {
noParse: /node_modules\/localforage\/dist\/localforage.js/, noParse: /node_modules\/localforage\/dist\/localforage.js/,
rules: [ rules: [
{
enforce: 'pre',
test: /\.(js|vue)$/,
include: projectRoot,
exclude: /node_modules/,
use: {
loader: 'eslint-loader',
options: {
formatter: require('eslint-friendly-formatter'),
sourceMap: config.build.productionSourceMap,
extract: true
}
}
},
{ {
enforce: 'post', enforce: 'post',
test: /\.(json5?|ya?ml)$/, // target json, json5, yaml and yml files test: /\.(json5?|ya?ml)$/, // target json, json5, yaml and yml files
@ -118,6 +106,9 @@ module.exports = {
] ]
}, },
plugins: [ plugins: [
new VueLoaderPlugin() new VueLoaderPlugin(),
new ESLintPlugin({
configType: 'flat'
})
] ]
} }

View file

@ -2,5 +2,4 @@ var { merge } = require('webpack-merge')
var devEnv = require('./dev.env') var devEnv = require('./dev.env')
module.exports = merge(devEnv, { module.exports = merge(devEnv, {
NODE_ENV: '"testing"'
}) })

31
eslint.config.js Normal file
View file

@ -0,0 +1,31 @@
const pluginVue = require('eslint-plugin-vue')
const pluginImport = require('eslint-plugin-import')
module.exports = [
...pluginVue.configs['flat/recommended'],
{
languageOptions: {
parserOptions: {
parser: '@babel/eslint-parser',
sourceType: 'module'
}
},
rules: {
// allow paren-less arrow functions
'arrow-parens': 0,
// allow async-await
'generator-star-spacing': 0,
// allow debugger during development
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
'vue/require-prop-types': 0,
'vue/no-unused-vars': 0,
'no-tabs': 0,
'vue/multi-word-component-names': 0,
'vue/no-reserved-component-names': 0
},
ignores: [
'build/*.js',
'config/*.js'
]
}
]

View file

@ -6,7 +6,6 @@
<title>Akkoma</title> <title>Akkoma</title>
<link rel="stylesheet" href="/static/font/tiresias.css"> <link rel="stylesheet" href="/static/font/tiresias.css">
<link rel="stylesheet" href="/static/font/css/lato.css"> <link rel="stylesheet" href="/static/font/css/lato.css">
<link rel="stylesheet" href="/static/mfm.css">
<link rel="stylesheet" href="/static/custom.css"> <link rel="stylesheet" href="/static/custom.css">
<link rel="stylesheet" href="/static/theme-holder.css" id="theme-holder"> <link rel="stylesheet" href="/static/theme-holder.css" id="theme-holder">
<!--server-generated-meta--> <!--server-generated-meta-->

View file

@ -1,6 +1,6 @@
{ {
"name": "pleroma_fe", "name": "pleroma_fe",
"version": "3.11.0", "version": "3.10.0",
"description": "A frontend for Akkoma instances", "description": "A frontend for Akkoma instances",
"author": "Roger Braun <roger@rogerbraun.net>", "author": "Roger Braun <roger@rogerbraun.net>",
"private": true, "private": true,
@ -12,120 +12,118 @@
"e2e": "node test/e2e/runner.js", "e2e": "node test/e2e/runner.js",
"test": "npm run unit && npm run e2e", "test": "npm run unit && npm run e2e",
"stylelint": "stylelint src/**/*.scss", "stylelint": "stylelint src/**/*.scss",
"lint": "eslint --ext .js,.vue src test/unit/specs test/e2e/specs", "lint": "eslint src test/unit/specs test/e2e/specs",
"lint-fix": "eslint --fix --ext .js,.vue src test/unit/specs test/e2e/specs" "lint-fix": "eslint --fix src test/unit/specs test/e2e/specs"
}, },
"dependencies": { "dependencies": {
"@babel/runtime": "7.17.8", "@babel/runtime": "7.17.8",
"@chenfengyuan/vue-qrcode": "2.0.0", "@chenfengyuan/vue-qrcode": "^2.0.0",
"@floatingghost/pinch-zoom-element": "^1.3.1", "@floatingghost/pinch-zoom-element": "^1.3.1",
"@fortawesome/fontawesome-svg-core": "1.3.0", "@fortawesome/fontawesome-svg-core": "^6.5.2",
"@fortawesome/free-regular-svg-icons": "^6.1.2", "@fortawesome/free-regular-svg-icons": "^6.5.2",
"@fortawesome/free-solid-svg-icons": "^6.2.0", "@fortawesome/free-solid-svg-icons": "^6.5.2",
"@fortawesome/vue-fontawesome": "3.0.1", "@fortawesome/vue-fontawesome": "^3.0.8",
"@vuelidate/core": "^2.0.0", "@vuelidate/core": "^2.0.3",
"@vuelidate/validators": "^2.0.0", "@vuelidate/validators": "^2.0.4",
"blurhash": "^2.0.4", "blurhash": "^2.0.5",
"body-scroll-lock": "2.7.1", "body-scroll-lock": "^3.1.5",
"chromatism": "3.0.0", "chromatism": "^3.0.0",
"click-outside-vue3": "4.0.1", "click-outside-vue3": "^4.0.1",
"cropperjs": "1.5.12", "cropperjs": "^1.6.2",
"diff": "3.5.0", "diff": "^5.2.0",
"escape-html": "1.0.3", "escape-html": "^1.0.3",
"iso-639-1": "^2.1.15", "iso-639-1": "^2.1.15",
"js-cookie": "^3.0.1", "js-cookie": "^3.0.1",
"localforage": "1.10.0", "localforage": "^1.10.0",
"parse-link-header": "^2.0.0", "parse-link-header": "^2.0.0",
"phoenix": "1.6.2", "phoenix": "^1.7.12",
"punycode.js": "2.1.0", "punycode.js": "^2.3.1",
"qrcode": "1", "qrcode": "^1.5.3",
"url": "^0.11.0", "querystring-es3": "^0.2.1",
"vue": "^3.2.31", "url": "^0.11.3",
"vue-i18n": "^9.2.2", "vue": "^3.4.38",
"vue-router": "4.0.14", "vue-i18n": "^9.14.0",
"vue-template-compiler": "2.6.11", "vue-router": "^4.4.3",
"vuex": "4.0.2" "vue-template-compiler": "^2.7.16",
"vuex": "^4.1.0"
}, },
"devDependencies": { "devDependencies": {
"@babel/core": "7.17.8", "@babel/core": "^7.24.6",
"@babel/eslint-parser": "^7.19.1", "@babel/eslint-parser": "^7.19.1",
"@babel/plugin-transform-runtime": "7.17.0", "@babel/plugin-transform-runtime": "^7.24.6",
"@babel/preset-env": "7.16.11", "@babel/preset-env": "^7.24.6",
"@babel/register": "7.17.7", "@babel/register": "^7.24.6",
"@intlify/vue-i18n-loader": "^5.0.0", "@intlify/vue-i18n-loader": "^5.0.0",
"@ungap/event-target": "0.2.3", "@ungap/event-target": "^0.2.4",
"@vue/babel-helper-vue-jsx-merge-props": "1.2.1", "@vue/babel-helper-vue-jsx-merge-props": "^1.4.0",
"@vue/babel-plugin-jsx": "1.1.1", "@vue/babel-plugin-jsx": "^1.2.2",
"@vue/compiler-sfc": "^3.1.0", "@vue/compiler-sfc": "^3.1.0",
"@vue/test-utils": "^2.0.2", "@vue/test-utils": "^2.0.2",
"autoprefixer": "6.7.7", "autoprefixer": "^10.4.19",
"babel-loader": "^9.1.0", "babel-loader": "^9.1.0",
"babel-plugin-lodash": "3.3.4", "babel-plugin-lodash": "^3.3.4",
"chai": "^4.3.7", "chai": "^4.3.7",
"chalk": "1.1.3", "chalk": "^1.1.3",
"chromedriver": "^107.0.3", "chromedriver": "^119.0.1",
"connect-history-api-fallback": "^2.0.0", "connect-history-api-fallback": "^2.0.0",
"cross-spawn": "^7.0.3", "cross-spawn": "^7.0.3",
"css-loader": "^6.7.2", "css-loader": "^7.1.2",
"custom-event-polyfill": "^1.0.7", "custom-event-polyfill": "^1.0.7",
"eslint": "^7.32.0", "eslint": "^9.3.0",
"eslint-config-standard": "^17.0.0", "eslint-config-standard": "^17.1.0",
"eslint-friendly-formatter": "^4.0.1", "eslint-friendly-formatter": "^4.0.1",
"eslint-loader": "^4.0.2", "eslint-plugin-import": "^2.29.1",
"eslint-plugin-import": "^2.26.0",
"eslint-plugin-node": "^11.1.0", "eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^6.1.1", "eslint-plugin-promise": "^6.2.0",
"eslint-plugin-standard": "^5.0.0", "eslint-plugin-standard": "^5.0.0",
"eslint-plugin-vue": "^9.7.0", "eslint-plugin-vue": "^9.26.0",
"eventsource-polyfill": "0.9.6", "eslint-webpack-plugin": "^4.2.0",
"express": "4.17.3", "eventsource-polyfill": "^0.9.6",
"express": "^4.19.2",
"file-loader": "^6.2.0", "file-loader": "^6.2.0",
"function-bind": "1.1.1", "function-bind": "^1.1.2",
"html-webpack-plugin": "^5.5.0", "html-webpack-plugin": "^5.5.0",
"http-proxy-middleware": "0.21.0", "http-proxy-middleware": "^3.0.0",
"inject-loader": "2.0.1", "json-loader": "^0.5.7",
"isparta-loader": "2.0.0", "karma": "^6.4.3",
"json-loader": "0.5.7", "karma-coverage": "^2.2.1",
"karma": "6.3.17", "karma-firefox-launcher": "^2.1.3",
"karma-coverage": "1.1.2", "karma-mocha": "^2.0.1",
"karma-firefox-launcher": "1.3.0", "karma-mocha-reporter": "^2.2.5",
"karma-mocha": "2.0.1", "karma-sinon-chai": "^2.0.2",
"karma-mocha-reporter": "2.2.5", "karma-sourcemap-loader": "^0.4.0",
"karma-sinon-chai": "2.0.2", "karma-spec-reporter": "^0.0.36",
"karma-sourcemap-loader": "0.3.8",
"karma-spec-reporter": "0.0.33",
"karma-webpack": "^5.0.0", "karma-webpack": "^5.0.0",
"lodash": "4.17.21", "lodash": "^4.17.21",
"lolex": "1.6.0", "lolex": "^6.0.0",
"mini-css-extract-plugin": "0.12.0", "mini-css-extract-plugin": "^2.9.0",
"mocha": "3.5.3", "mocha": "^10.4.0",
"nightwatch": "0.9.21", "nightwatch": "^3.6.3",
"opn": "4.0.2", "opn": "^6.0.0",
"ora": "0.4.1",
"postcss-html": "^1.5.0", "postcss-html": "^1.5.0",
"postcss-loader": "3.0.0", "postcss-loader": "^8.1.1",
"postcss-sass": "^0.5.0", "postcss-sass": "^0.5.0",
"raw-loader": "0.5.1", "raw-loader": "^4.0.2",
"sass": "^1.56.0", "sass": "^1.77.2",
"sass-loader": "^13.2.0", "sass-loader": "^14.2.1",
"selenium-server": "2.53.1", "selenium-server": "^3.141.59",
"semver": "5.7.1", "semver": "^7.6.2",
"shelljs": "0.8.5", "shelljs": "^0.8.5",
"sinon": "2.4.1", "sinon": "^18.0.0",
"sinon-chai": "2.14.0", "sinon-chai": "^3.7.0",
"stylelint": "^14.15.0", "stylelint": "^14.15.0",
"stylelint-config-recommended-vue": "^1.4.0", "stylelint-config-recommended-vue": "^1.4.0",
"stylelint-config-standard": "^29.0.0", "stylelint-config-standard": "^29.0.0",
"stylelint-config-standard-scss": "^6.1.0", "stylelint-config-standard-scss": "^6.1.0",
"stylelint-rscss": "^0.4.0", "stylelint-rscss": "^0.4.0",
"url-loader": "^4.1.1", "url-loader": "^4.1.1",
"vue-loader": "^17.0.0", "vue-loader": "^17.4.2",
"vue-style-loader": "^4.1.2", "vue-style-loader": "^4.1.3",
"webpack": "^5.75.0", "webpack": "^5.91.0",
"webpack-dev-middleware": "^5.3.3", "webpack-dev-middleware": "^7.2.1",
"webpack-hot-middleware": "^2.25.1", "webpack-hot-middleware": "^2.26.1",
"webpack-merge": "^5.8.0", "webpack-merge": "^5.10.0",
"workbox-webpack-plugin": "^6.5.4" "workbox-webpack-plugin": "^7.1.0"
}, },
"engines": { "engines": {
"node": ">= 16.0.0", "node": ">= 16.0.0",

View file

@ -59,7 +59,8 @@ export default {
{ {
'-reverse': this.reverseLayout, '-reverse': this.reverseLayout,
'-no-sticky-headers': this.noSticky, '-no-sticky-headers': this.noSticky,
'-has-new-post-button': this.newPostButtonShown '-has-new-post-button': this.newPostButtonShown,
'-wide-timeline': this.widenTimeline
}, },
'-' + this.layoutType '-' + this.layoutType
] ]
@ -93,6 +94,9 @@ export default {
newPostButtonShown () { newPostButtonShown () {
return this.$store.getters.mergedConfig.alwaysShowNewPostButton || this.layoutType === 'mobile' return this.$store.getters.mergedConfig.alwaysShowNewPostButton || this.layoutType === 'mobile'
}, },
widenTimeline () {
return this.$store.getters.mergedConfig.widenTimeline
},
showFeaturesPanel () { return this.$store.state.instance.showFeaturesPanel }, showFeaturesPanel () { return this.$store.state.instance.showFeaturesPanel },
editingAvailable () { return this.$store.state.instance.editingAvailable }, editingAvailable () { return this.$store.state.instance.editingAvailable },
layoutType () { return this.$store.state.interface.layoutType }, layoutType () { return this.$store.state.interface.layoutType },

View file

@ -172,6 +172,10 @@ nav {
background-color: rgba(0, 0, 0, 0.15); background-color: rgba(0, 0, 0, 0.15);
background-color: var(--underlay, rgba(0, 0, 0, 0.15)); background-color: var(--underlay, rgba(0, 0, 0, 0.15));
z-index: -1000; z-index: -1000;
.-wide-timeline & {
margin:0 calc(var(--columnGap) / -2);
}
} }
.app-layout { .app-layout {
@ -187,12 +191,17 @@ nav {
grid-template-rows: 1fr; grid-template-rows: 1fr;
box-sizing: border-box; box-sizing: border-box;
margin: 0 auto; margin: 0 auto;
padding: 0 calc(var(--columnGap) / 2);
align-content: flex-start; align-content: flex-start;
flex-wrap: wrap; flex-wrap: wrap;
justify-content: center; justify-content: center;
min-height: 100vh; min-height: 100vh;
overflow-x: clip; overflow-x: clip;
&.-wide-timeline {
--maxiColumn: minmax(var(--miniColumn), 1fr);
}
.column { .column {
--___columnMargin: var(--columnGap); --___columnMargin: var(--columnGap);

View file

@ -183,6 +183,12 @@ const setSettings = async ({ apiConfig, staticConfig, store }) => {
copyInstanceOption('renderMisskeyMarkdown') copyInstanceOption('renderMisskeyMarkdown')
copyInstanceOption('sidebarRight') copyInstanceOption('sidebarRight')
if (config.backendCommitUrl)
copyInstanceOption('backendCommitUrl')
if (config.frontendCommitUrl)
copyInstanceOption('frontendCommitUrl')
return store.dispatch('setTheme', config['theme']) return store.dispatch('setTheme', config['theme'])
} }

View file

@ -6,7 +6,7 @@
:bound-to="{ x: 'container' }" :bound-to="{ x: 'container' }"
remove-padding remove-padding
> >
<template v-slot:content> <template #content>
<div class="dropdown-menu"> <div class="dropdown-menu">
<template v-if="relationship.following"> <template v-if="relationship.following">
<button <button
@ -71,7 +71,7 @@
</button> </button>
</div> </div>
</template> </template>
<template v-slot:trigger> <template #trigger>
<button class="button-unstyled ellipsis-button"> <button class="button-unstyled ellipsis-button">
<FAIcon <FAIcon
class="icon" class="icon"
@ -93,7 +93,7 @@
keypath="user_card.block_confirm" keypath="user_card.block_confirm"
tag="span" tag="span"
> >
<template v-slot:user> <template #user>
<span <span
v-text="user.screen_name_ui" v-text="user.screen_name_ui"
/> />

View file

@ -246,8 +246,8 @@
ref="flash" ref="flash"
class="flash" class="flash"
:src="attachment.large_thumb_url || attachment.url" :src="attachment.large_thumb_url || attachment.url"
@playerOpened="setFlashLoaded(true)" @player-opened="setFlashLoaded(true)"
@playerClosed="setFlashLoaded(false)" @player-closed="setFlashLoaded(false)"
/> />
</span> </span>
</div> </div>

View file

@ -22,12 +22,12 @@
<script> <script>
export default { export default {
emits: ['update:modelValue'],
props: [ props: [
'modelValue', 'modelValue',
'indeterminate', 'indeterminate',
'disabled' 'disabled'
] ],
emits: ['update:modelValue']
} }
</script> </script>

View file

@ -14,7 +14,7 @@
:model-value="present" :model-value="present"
:disabled="disabled" :disabled="disabled"
class="opt" class="opt"
@update:modelValue="$emit('update:modelValue', typeof modelValue === 'undefined' ? fallback : undefined)" @update:model-value="$emit('update:modelValue', typeof modelValue === 'undefined' ? fallback : undefined)"
/> />
<div class="input color-input-field"> <div class="input color-input-field">
<input <input
@ -46,7 +46,6 @@
</div> </div>
</div> </div>
</template> </template>
<style lang="scss" src="./color_input.scss"></style>
<script> <script>
import Checkbox from '../checkbox/checkbox.vue' import Checkbox from '../checkbox/checkbox.vue'
import { hex2rgb } from '../../services/color_convert/color_convert.js' import { hex2rgb } from '../../services/color_convert/color_convert.js'
@ -108,6 +107,7 @@ export default {
} }
} }
</script> </script>
<style lang="scss" src="./color_input.scss"></style>
<style lang="scss"> <style lang="scss">
.color-control { .color-control {

View file

@ -25,6 +25,8 @@
</dialog-modal> </dialog-modal>
</template> </template>
<script src="./confirm_modal.js"></script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '../../_variables'; @import '../../_variables';
@ -35,5 +37,3 @@
} }
} }
</style> </style>
<script src="./confirm_modal.js"></script>

View file

@ -267,11 +267,11 @@ const conversation = {
}, },
replies () { replies () {
let i = 1 let i = 1
// eslint-disable-next-line camelcase
return reduce(this.conversation, (result, { id, in_reply_to_status_id }) => { return reduce(this.conversation, (result, { id, in_reply_to_status_id }) => {
/* eslint-disable camelcase */
const irid = in_reply_to_status_id const irid = in_reply_to_status_id
/* eslint-enable camelcase */
if (irid) { if (irid) {
result[irid] = result[irid] || [] result[irid] = result[irid] || []
result[irid].push({ result[irid].push({

View file

@ -91,7 +91,7 @@
:controlled-set-media-playing="(newVal) => toggleStatusContentProperty(status.id, 'mediaPlaying', newVal)" :controlled-set-media-playing="(newVal) => toggleStatusContentProperty(status.id, 'mediaPlaying', newVal)"
@goto="setHighlight" @goto="setHighlight"
@toggleExpanded="toggleExpanded" @toggle-expanded="toggleExpanded"
/> />
<div <div
v-if="showOtherRepliesButtonBelowStatus && getReplies(status.id).length > 1" v-if="showOtherRepliesButtonBelowStatus && getReplies(status.id).length > 1"
@ -184,7 +184,7 @@
:toggle-status-content-property="toggleStatusContentProperty" :toggle-status-content-property="toggleStatusContentProperty"
@goto="setHighlight" @goto="setHighlight"
@toggleExpanded="toggleExpanded" @toggle-expanded="toggleExpanded"
/> />
</div> </div>
</div> </div>

View file

@ -44,9 +44,9 @@
/> />
</router-link> </router-link>
<router-link <router-link
v-if="publicTimelineVisible"
:to="{ name: 'public-timeline' }" :to="{ name: 'public-timeline' }"
class="nav-icon" class="nav-icon"
v-if="publicTimelineVisible"
> >
<FAIcon <FAIcon
fixed-width fixed-width
@ -68,9 +68,9 @@
/> />
</router-link> </router-link>
<router-link <router-link
v-if="federatedTimelineVisible"
:to="{ name: 'public-external-timeline' }" :to="{ name: 'public-external-timeline' }"
class="nav-icon" class="nav-icon"
v-if="federatedTimelineVisible"
> >
<FAIcon <FAIcon
fixed-width fixed-width

View file

@ -9,7 +9,7 @@
class="btn button-default" class="btn button-default"
> >
{{ $t('domain_mute_card.unmute') }} {{ $t('domain_mute_card.unmute') }}
<template v-slot:progress> <template #progress>
{{ $t('domain_mute_card.unmute_progress') }} {{ $t('domain_mute_card.unmute_progress') }}
</template> </template>
</ProgressButton> </ProgressButton>
@ -19,7 +19,7 @@
class="btn button-default" class="btn button-default"
> >
{{ $t('domain_mute_card.mute') }} {{ $t('domain_mute_card.mute') }}
<template v-slot:progress> <template #progress>
{{ $t('domain_mute_card.mute_progress') }} {{ $t('domain_mute_card.mute_progress') }}
</template> </template>
</ProgressButton> </ProgressButton>

View file

@ -2,7 +2,7 @@
<Modal <Modal
v-if="isFormVisible" v-if="isFormVisible"
class="edit-form-modal-view" class="edit-form-modal-view"
@backdropClicked="closeModal" @backdrop-clicked="closeModal"
> >
<div class="edit-form-modal-panel panel"> <div class="edit-form-modal-panel panel">
<div class="panel-heading"> <div class="panel-heading">
@ -11,10 +11,10 @@
<PostStatusForm <PostStatusForm
class="panel-body" class="panel-body"
v-bind="params" v-bind="params"
@posted="closeModal" :disable-polls="true"
:disablePolls="true" :disable-visibility-selector="true"
:disableVisibilitySelector="true"
:post-handler="doEditStatus" :post-handler="doEditStatus"
@posted="closeModal"
/> />
</div> </div>
</Modal> </Modal>

View file

@ -43,7 +43,10 @@
:class="{ highlighted: index === highlighted }" :class="{ highlighted: index === highlighted }"
@click.stop.prevent="onClick($event, suggestion)" @click.stop.prevent="onClick($event, suggestion)"
> >
<span v-if="!suggestion.mfm" class="image"> <span
v-if="!suggestion.mfm"
class="image"
>
<img <img
v-if="suggestion.img" v-if="suggestion.img"
:src="suggestion.img" :src="suggestion.img"

View file

@ -1,4 +1,4 @@
const MFM_TAGS = ['blur', 'bounce', 'flip', 'font', 'jelly', 'jump', 'rainbow', 'rotate', 'shake', 'sparkle', 'spin', 'tada', 'twitch', 'x2', 'x3', 'x4'] const MFM_TAGS = ['bg', 'blur', 'bounce', 'center', 'fg', 'flip', 'font', 'jelly', 'jump', 'position', 'rainbow', 'rotate', 'scale', 'shake', 'sparkle', 'spin', 'tada', 'twitch', 'x2', 'x3', 'x4']
.map(tag => ({ displayText: tag, detailText: '$[' + tag + ' ]', replacement: '$[' + tag + ' ]', mfm: true })) .map(tag => ({ displayText: tag, detailText: '$[' + tag + ' ]', replacement: '$[' + tag + ' ]', mfm: true }))
/** /**
@ -122,14 +122,14 @@ export const suggestUsers = ({ dispatch, state }) => {
const screenNameAlphabetically = a.screen_name > b.screen_name ? 1 : -1 const screenNameAlphabetically = a.screen_name > b.screen_name ? 1 : -1
return diff + nameAlphabetically + screenNameAlphabetically return diff + nameAlphabetically + screenNameAlphabetically
/* eslint-disable camelcase */
}).map(({ screen_name, screen_name_ui, name, profile_image_url_original }) => ({ }).map(({ screen_name, screen_name_ui, name, profile_image_url_original }) => ({
displayText: screen_name_ui, displayText: screen_name_ui,
detailText: name, detailText: name,
imageUrl: profile_image_url_original, imageUrl: profile_image_url_original,
replacement: '@' + screen_name + ' ' replacement: '@' + screen_name + ' '
})) }))
/* eslint-enable camelcase */
suggestions = newSuggestions || [] suggestions = newSuggestions || []
return suggestions return suggestions

View file

@ -7,7 +7,7 @@
:bound-to="{ x: 'container' }" :bound-to="{ x: 'container' }"
remove-padding remove-padding
> >
<template v-slot:content="{close}"> <template #content="{close}">
<div class="dropdown-menu"> <div class="dropdown-menu">
<button <button
v-if="canMute && !status.thread_muted" v-if="canMute && !status.thread_muted"
@ -172,7 +172,7 @@
</button> </button>
</div> </div>
</template> </template>
<template v-slot:trigger> <template #trigger>
<button class="button-unstyled popover-trigger"> <button class="button-unstyled popover-trigger">
<FAIcon <FAIcon
class="fa-scale-110 fa-old-padding" class="fa-scale-110 fa-old-padding"

View file

@ -1,5 +1,8 @@
<template> <template>
<basic-user-card :user="user" v-if="show"> <basic-user-card
v-if="show"
:user="user"
>
<div class="follow-request-card-content-container"> <div class="follow-request-card-content-container">
<button <button
class="btn button-default" class="btn button-default"

View file

@ -88,10 +88,8 @@ const Gallery = {
set(this.sizes, id, { width, height }) set(this.sizes, id, { width, height })
}, },
rowStyle (row) { rowStyle (row) {
if (row.audio) { if (!row.audio && !row.minimal && !row.grid) {
return { 'padding-bottom': '25%' } // fixed reduced height for audio return { 'aspect-ratio': `1/${(1 / (row.items.length + 0.6))}` }
} else if (!row.minimal && !row.grid) {
return { 'padding-bottom': `${(100 / (row.items.length + 0.6))}%` }
} }
}, },
itemStyle (id, row) { itemStyle (id, row) {

View file

@ -31,8 +31,8 @@
:description="descriptions && descriptions[attachment.id]" :description="descriptions && descriptions[attachment.id]"
:hide-description="size === 'small' || tooManyAttachments && hidingLong" :hide-description="size === 'small' || tooManyAttachments && hidingLong"
:style="itemStyle(attachment.id, row.items)" :style="itemStyle(attachment.id, row.items)"
@setMedia="onMedia" @set-media="onMedia"
@naturalSizeLoad="onNaturalSizeLoad" @natural-size-load="onNaturalSizeLoad"
/> />
</div> </div>
</div> </div>
@ -96,9 +96,15 @@
.gallery-row { .gallery-row {
position: relative; position: relative;
height: 0;
width: 100%; width: 100%;
flex-grow: 1; flex-grow: 1;
.Status & {
max-height: 30em;
}
&.-audio {
aspect-ratio: 4/1; // this is terrible, but it's how it was before so I'm not changing it >:(
}
&:not(:first-child) { &:not(:first-child) {
margin-top: 0.5em; margin-top: 0.5em;

View file

@ -42,6 +42,7 @@ export default {
@import '../../_variables.scss'; @import '../../_variables.scss';
.list { .list {
min-height: 1em;
&-item:not(:last-child) { &-item:not(:last-child) {
border-bottom: 1px solid; border-bottom: 1px solid;
border-bottom-color: $fallback--border; border-bottom-color: $fallback--border;

View file

@ -2,7 +2,7 @@
<Modal <Modal
v-if="showing" v-if="showing"
class="media-modal-view" class="media-modal-view"
@backdropClicked="hideIfNotSwiped" @backdrop-clicked="hideIfNotSwiped"
> >
<SwipeClick <SwipeClick
v-if="type === 'image'" v-if="type === 'image'"

View file

@ -42,7 +42,7 @@ const mediaUpload = {
.then((fileData) => { .then((fileData) => {
self.$emit('uploaded', fileData) self.$emit('uploaded', fileData)
self.decreaseUploadCount() self.decreaseUploadCount()
}, (error) => { // eslint-disable-line handle-callback-err }, (error) => {
self.$emit('upload-failed', 'default') self.$emit('upload-failed', 'default')
self.decreaseUploadCount() self.decreaseUploadCount()
}) })

View file

@ -18,6 +18,7 @@
<input <input
id="code" id="code"
v-model="code" v-model="code"
autocomplete="one-time-code"
class="form-control" class="form-control"
> >
</div> </div>

View file

@ -4,7 +4,7 @@
class="panel-heading" class="panel-heading"
@click="toggleHidden" @click="toggleHidden"
> >
<h4>{{ $t('moderation.reports.report') + ' ' + this.account.screen_name }}</h4> <h4>{{ $t('moderation.reports.report') + ' ' + account.screen_name }}</h4>
<button <button
v-if="isOpen" v-if="isOpen"
class="button-default" class="button-default"
@ -35,7 +35,10 @@
<div v-if="content"> <div v-if="content">
{{ decode(content) }} {{ decode(content) }}
</div> </div>
<i v-else class="faint"> <i
v-else
class="faint"
>
{{ $t('moderation.reports.no_content') }} {{ $t('moderation.reports.no_content') }}
</i> </i>
<div class="report-author"> <div class="report-author">
@ -43,12 +46,12 @@
class="small-avatar" class="small-avatar"
:user="actor" :user="actor"
/> />
{{ this.actor.screen_name }} {{ actor.screen_name }}
</div> </div>
</div> </div>
<div <div
v-if="!hidden && statuses.length > 0"
class="dropdown" class="dropdown"
v-if="!hidden && this.statuses.length > 0"
> >
<button <button
class="button button-unstyled dropdown-header" class="button button-unstyled dropdown-header"
@ -74,8 +77,8 @@
</div> </div>
</div> </div>
<div <div
v-if="!hidden && notes.length > 0"
class="dropdown" class="dropdown"
v-if="!hidden && this.notes.length > 0"
> >
<button <button
class="button button-unstyled dropdown-header" class="button button-unstyled dropdown-header"
@ -99,9 +102,9 @@
</div> </div>
<div class="report-add-note"> <div class="report-add-note">
<textarea <textarea
v-model.trim="note"
rows="1" rows="1"
cols="1" cols="1"
v-model.trim="note"
:placeholder="$t('moderation.reports.note_placeholder')" :placeholder="$t('moderation.reports.note_placeholder')"
/> />
<button <button
@ -134,7 +137,7 @@
:offset="{ y: 5 }" :offset="{ y: 5 }"
remove-padding remove-padding
> >
<template v-slot:trigger> <template #trigger>
<button <button
class="btn button-default" class="btn button-default"
:disabled="!tagPolicyEnabled" :disabled="!tagPolicyEnabled"
@ -147,7 +150,7 @@
/> />
</button> </button>
</template> </template>
<template v-slot:content="{close}"> <template #content="{close}">
<div <div
class="dropdown-menu" class="dropdown-menu"
:disabled="!tagPolicyEnabled" :disabled="!tagPolicyEnabled"

View file

@ -6,7 +6,7 @@
class="small-avatar" class="small-avatar"
:user="user" :user="user"
/> />
{{ this.user.screen_name }} {{ user.screen_name }}
</div> </div>
<div class="header-right"> <div class="header-right">
<Timeago <Timeago

View file

@ -22,6 +22,9 @@ export default {
default: false default: false
} }
}, },
emits: [
'backdropClicked',
],
computed: { computed: {
classes () { classes () {
return { return {

View file

@ -8,7 +8,7 @@
@show="setToggled(true)" @show="setToggled(true)"
@close="setToggled(false)" @close="setToggled(false)"
> >
<template v-slot:content> <template #content>
<div class="dropdown-menu"> <div class="dropdown-menu">
<span v-if="user.is_local"> <span v-if="user.is_local">
<button <button
@ -122,7 +122,7 @@
</span> </span>
</div> </div>
</template> </template>
<template v-slot:trigger> <template #trigger>
<button <button
class="btn button-default btn-block moderation-tools-button" class="btn button-default btn-block moderation-tools-button"
:class="{ toggled }" :class="{ toggled }"
@ -137,11 +137,11 @@
v-if="showDeleteUserDialog" v-if="showDeleteUserDialog"
:on-cancel="deleteUserDialog.bind(this, false)" :on-cancel="deleteUserDialog.bind(this, false)"
> >
<template v-slot:header> <template #header>
{{ $t('user_card.admin_menu.delete_user') }} {{ $t('user_card.admin_menu.delete_user') }}
</template> </template>
<p>{{ $t('user_card.admin_menu.delete_user_confirmation') }}</p> <p>{{ $t('user_card.admin_menu.delete_user_confirmation') }}</p>
<template v-slot:footer> <template #footer>
<button <button
class="btn button-default" class="btn button-default"
@click="deleteUserDialog(false)" @click="deleteUserDialog(false)"

View file

@ -6,6 +6,7 @@ import UserCard from '../user_card/user_card.vue'
import Timeago from '../timeago/timeago.vue' import Timeago from '../timeago/timeago.vue'
import RichContent from 'src/components/rich_content/rich_content.jsx' import RichContent from 'src/components/rich_content/rich_content.jsx'
import ConfirmModal from '../confirm_modal/confirm_modal.vue' import ConfirmModal from '../confirm_modal/confirm_modal.vue'
import StillImage from '../still-image/still-image.vue'
import { isStatusNotification } from '../../services/notification_utils/notification_utils.js' import { isStatusNotification } from '../../services/notification_utils/notification_utils.js'
import { highlightClass, highlightStyle } from '../../services/user_highlighter/user_highlighter.js' import { highlightClass, highlightStyle } from '../../services/user_highlighter/user_highlighter.js'
import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator' import generateProfileLink from 'src/services/user_profile_link_generator/user_profile_link_generator'
@ -50,7 +51,8 @@ const Notification = {
Timeago, Timeago,
Status, Status,
RichContent, RichContent,
ConfirmModal ConfirmModal,
StillImage
}, },
methods: { methods: {
toggleUserExpanded () { toggleUserExpanded () {

View file

@ -116,12 +116,13 @@
scope="global" scope="global"
keypath="notifications.reacted_with" keypath="notifications.reacted_with"
> >
<img <still-image
v-if="notification.emoji_url !== null" v-if="notification.emoji_url !== null"
class="notification-reaction-emoji" class="notification-reaction-emoji"
:src="notification.emoji_url" :src="notification.emoji_url"
:name="notification.emoji" :title="notification.emoji"
> :alt="notification.emoji"
/>
<span <span
v-else v-else
class="emoji-reaction-emoji" class="emoji-reaction-emoji"

View file

@ -5,7 +5,7 @@
placement="bottom" placement="bottom"
:bound-to="{ x: 'container' }" :bound-to="{ x: 'container' }"
> >
<template v-slot:content> <template #content>
<div class="dropdown-menu"> <div class="dropdown-menu">
<button <button
class="button-default dropdown-item" class="button-default dropdown-item"
@ -72,7 +72,7 @@
</button> </button>
</div> </div>
</template> </template>
<template v-slot:trigger> <template #trigger>
<button class="filter-trigger-button button-unstyled"> <button class="filter-trigger-button button-unstyled">
<FAIcon icon="filter" /> <FAIcon icon="filter" />
</button> </button>

View file

@ -14,7 +14,7 @@
:model-value="present" :model-value="present"
:disabled="disabled" :disabled="disabled"
class="opt" class="opt"
@update:modelValue="$emit('update:modelValue', !present ? fallback : undefined)" @update:model-value="$emit('update:modelValue', !present ? fallback : undefined)"
/> />
<input <input
:id="name" :id="name"

View file

@ -2,7 +2,6 @@
<pinch-zoom <pinch-zoom
class="pinch-zoom-parent" class="pinch-zoom-parent"
v-bind="$attrs" v-bind="$attrs"
v-on="$listeners"
> >
<slot /> <slot />
</pinch-zoom> </pinch-zoom>

View file

@ -9,11 +9,12 @@ import StatusContent from '../status_content/status_content.vue'
import fileTypeService from '../../services/file_type/file_type.service.js' import fileTypeService from '../../services/file_type/file_type.service.js'
import { findOffset } from '../../services/offset_finder/offset_finder.service.js' import { findOffset } from '../../services/offset_finder/offset_finder.service.js'
import { reject, map, uniqBy, debounce } from 'lodash' import { reject, map, uniqBy, debounce } from 'lodash'
import { usePostLanguageOptions } from 'src/lib/post_language'
import suggestor from '../emoji_input/suggestor.js' import suggestor from '../emoji_input/suggestor.js'
import { mapGetters, mapState } from 'vuex' import { mapGetters, mapState } from 'vuex'
import Checkbox from '../checkbox/checkbox.vue' import Checkbox from '../checkbox/checkbox.vue'
import Select from '../select/select.vue' import Select from '../select/select.vue'
import iso6391 from 'iso-639-1'
import { library } from '@fortawesome/fontawesome-svg-core' import { library } from '@fortawesome/fontawesome-svg-core'
import { import {
@ -62,6 +63,13 @@ const deleteDraft = (draftKey) => {
localStorage.setItem('drafts', JSON.stringify(draftData)); localStorage.setItem('drafts', JSON.stringify(draftData));
} }
const interfaceToISOLanguage = (ilang) => {
const sep = ilang.indexOf("_");
return sep < 0 ?
ilang :
ilang.substr(0, sep);
}
const PostStatusForm = { const PostStatusForm = {
props: [ props: [
'statusId', 'statusId',
@ -129,6 +137,13 @@ const PostStatusForm = {
this.$refs.textarea.focus() this.$refs.textarea.focus()
} }
}, },
setup() {
const {postLanguageOptions} = usePostLanguageOptions()
return {
postLanguageOptions,
}
},
data () { data () {
const preset = this.$route.query.message const preset = this.$route.query.message
let statusText = preset || '' let statusText = preset || ''
@ -138,7 +153,8 @@ const PostStatusForm = {
statusText = buildMentionsString({ user: this.repliedUser, attentions: this.attentions }, currentUser) statusText = buildMentionsString({ user: this.repliedUser, attentions: this.attentions }, currentUser)
} }
const { postContentType: contentType, sensitiveByDefault, sensitiveIfSubject, interfaceLanguage, alwaysShowSubjectInput } = this.$store.getters.mergedConfig const { postContentType: contentType, postLanguage: defaultPostLanguage, sensitiveByDefault, sensitiveIfSubject, interfaceLanguage, alwaysShowSubjectInput } = this.$store.getters.mergedConfig
const postLanguage = defaultPostLanguage || interfaceToISOLanguage(interfaceLanguage)
let statusParams = { let statusParams = {
spoilerText: this.subject || '', spoilerText: this.subject || '',
@ -149,7 +165,7 @@ const PostStatusForm = {
poll: {}, poll: {},
mediaDescriptions: {}, mediaDescriptions: {},
visibility: this.suggestedVisibility(), visibility: this.suggestedVisibility(),
language: interfaceLanguage, language: postLanguage,
contentType contentType
} }
@ -164,7 +180,7 @@ const PostStatusForm = {
poll: this.statusPoll || {}, poll: this.statusPoll || {},
mediaDescriptions: this.statusMediaDescriptions || {}, mediaDescriptions: this.statusMediaDescriptions || {},
visibility: this.statusScope || this.suggestedVisibility(), visibility: this.statusScope || this.suggestedVisibility(),
language: this.statusLanguage || interfaceLanguage, language: this.statusLanguage || postLanguage,
contentType: statusContentType contentType: statusContentType
} }
} }
@ -309,13 +325,11 @@ const PostStatusForm = {
...mapState({ ...mapState({
mobileLayout: state => state.interface.mobileLayout mobileLayout: state => state.interface.mobileLayout
}), }),
isoLanguages () {
return iso6391.getAllCodes();
}
}, },
watch: { watch: {
'newStatus': { 'newStatus': {
deep: true, deep: true,
flush: 'sync',
handler () { handler () {
this.statusChanged() this.statusChanged()
} }

View file

@ -118,8 +118,8 @@
/> />
</div> </div>
<EmojiInput <EmojiInput
ref="subject-emoji-input"
v-if="subjectVisible" v-if="subjectVisible"
ref="subject-emoji-input"
v-model="newStatus.spoilerText" v-model="newStatus.spoilerText"
enable-emoji-picker enable-emoji-picker
hide-emoji-button hide-emoji-button
@ -170,7 +170,7 @@
cols="1" cols="1"
:disabled="posting && !optimisticPosting" :disabled="posting && !optimisticPosting"
class="form-post-body" class="form-post-body"
:class="{ 'scrollable-form': !!maxHeight }" :class="{ 'scrollable-form': !!maxHeight, '-has-subject': subjectVisible }"
@keydown.exact.enter="submitOnEnter && postStatus($event, newStatus)" @keydown.exact.enter="submitOnEnter && postStatus($event, newStatus)"
@keydown.meta.enter="postStatus($event, newStatus)" @keydown.meta.enter="postStatus($event, newStatus)"
@keydown.ctrl.enter="!submitOnEnter && postStatus($event, newStatus)" @keydown.ctrl.enter="!submitOnEnter && postStatus($event, newStatus)"
@ -190,6 +190,7 @@
<div <div
v-if="!disableScopeSelector" v-if="!disableScopeSelector"
class="visibility-tray" class="visibility-tray"
:class="{ 'visibility-tray-edit': isEdit }"
> >
<scope-selector <scope-selector
v-if="!disableVisibilitySelector" v-if="!disableVisibilitySelector"
@ -200,7 +201,9 @@
/> />
<div <div
class="language-selector" class="format-selector-container">
<div
class="format-selector"
> >
<Select <Select
id="post-language" id="post-language"
@ -208,17 +211,17 @@
class="form-control" class="form-control"
> >
<option <option
v-for="language in isoLanguages" v-for="language in postLanguageOptions"
:key="language" :key="language.key"
:value="language" :value="language.value"
> >
{{ language }} {{ language.label }}
</option> </option>
</Select> </Select>
</div> </div>
<div <div
v-if="postFormats.length > 1" v-if="postFormats.length > 1"
class="text-format" class="text-format format-selector"
> >
<Select <Select
id="post-content-type" id="post-content-type"
@ -236,7 +239,7 @@
</div> </div>
<div <div
v-if="postFormats.length === 1 && postFormats[0] !== 'text/plain'" v-if="postFormats.length === 1 && postFormats[0] !== 'text/plain'"
class="text-format" class="text-format format-selector"
> >
<span class="only-format"> <span class="only-format">
{{ $t(`post_status.content_type["${postFormats[0]}"]`) }} {{ $t(`post_status.content_type["${postFormats[0]}"]`) }}
@ -244,6 +247,7 @@
</div> </div>
</div> </div>
</div> </div>
</div>
<poll-form <poll-form
v-if="pollsAvailable" v-if="pollsAvailable"
ref="pollForm" ref="pollForm"
@ -460,6 +464,10 @@
align-items: baseline; align-items: baseline;
} }
.visibility-tray-edit {
justify-content: right;
}
.visibility-notice.edit-warning { .visibility-notice.edit-warning {
> :first-child { > :first-child {
margin-top: 0; margin-top: 0;
@ -470,6 +478,12 @@
} }
} }
.format-selector-container {
.format-selector {
display: inline-block;
}
}
.media-upload-icon, .poll-icon, .emoji-icon, .spoiler-icon { .media-upload-icon, .poll-icon, .emoji-icon, .spoiler-icon {
font-size: 1.85em; font-size: 1.85em;
line-height: 1.1; line-height: 1.1;
@ -570,6 +584,11 @@
line-height: 1.85; line-height: 1.85;
} }
.form-post-subject {
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
.form-post-body { .form-post-body {
// TODO: make a resizable textarea component? // TODO: make a resizable textarea component?
box-sizing: content-box; // needed for easier computation of dynamic size box-sizing: content-box; // needed for easier computation of dynamic size
@ -582,6 +601,11 @@
min-height: calc(var(--post-line-height) * 1em); min-height: calc(var(--post-line-height) * 1em);
resize: none; resize: none;
&.-has-subject {
border-top-left-radius: 0;
border-top-right-radius: 0;
}
&.scrollable-form { &.scrollable-form {
overflow-y: auto; overflow-y: auto;
} }

View file

@ -3,7 +3,7 @@
v-if="isLoggedIn && !resettingForm" v-if="isLoggedIn && !resettingForm"
:is-open="modalActivated" :is-open="modalActivated"
class="post-form-modal-view" class="post-form-modal-view"
@backdropClicked="closeModal" @backdrop-clicked="closeModal"
> >
<div class="post-form-modal-panel panel"> <div class="post-form-modal-panel panel">
<div class="panel-heading"> <div class="panel-heading">

View file

@ -8,13 +8,13 @@
remove-padding remove-padding
@show="focusInput" @show="focusInput"
> >
<template v-slot:content="{close}"> <template #content="{close}">
<EmojiPicker <EmojiPicker
:enable-sticker-picker="false" :enable-sticker-picker="false"
@emoji="addReaction($event, close)" @emoji="addReaction($event, close)"
/> />
</template> </template>
<template v-slot:trigger> <template #trigger>
<button <button
class="button-unstyled popover-trigger" class="button-unstyled popover-trigger"
:title="$t('tool_tip.add_reaction')" :title="$t('tool_tip.add_reaction')"

View file

@ -2,7 +2,7 @@ export default {
props: [ 'user' ], props: [ 'user' ],
computed: { computed: {
subscribeUrl () { subscribeUrl () {
// eslint-disable-next-line no-undef
const serverUrl = new URL(this.user.statusnet_profile_url) const serverUrl = new URL(this.user.statusnet_profile_url)
return `${serverUrl.protocol}//${serverUrl.host}/main/ostatus` return `${serverUrl.protocol}//${serverUrl.host}/main/ostatus`
} }

View file

@ -121,6 +121,19 @@ export default {
} }
} }
const mfmStyleFromDataAttributes = (attributes) => {
// CSS selectors can check if a data-* attribute is true, but can't use other values, so we want to add them to the style attribute
// Here we turn e.g. `{'data-mfm-some': '1deg', 'data-mfm-thing': '5s'}` to "--mfm-some: 1deg;--mfm-thing: 5s;"
// Note that we only add the value to `style` when they contain only letters, numbers, dot, or minus signs
// At the moment of writing, this should be enough for legitimate purposes and reduces the chance of injection by using special characters
// There is a special case for the `color` value, who is provided without `#`, but requires this in the `style` attribute
return Object.keys(attributes).filter(
(key) => key.startsWith('data-mfm-') && attributes[key] !== true && /^[a-zA-Z0-9.\-]*$/.test(attributes[key])
).map(
(key) => '--mfm-' + key.substr(9) + (key === 'data-mfm-color' ? ': #' : ': ') + attributes[key] + ';'
).reduce((a,v) => a+v, '')
}
// Processor to use with html_tree_converter // Processor to use with html_tree_converter
const processItem = (item, index, array, what) => { const processItem = (item, index, array, what) => {
// Handle text nodes - just add emoji // Handle text nodes - just add emoji
@ -191,6 +204,15 @@ export default {
if (this.handleLinks && attrs?.['class']?.includes?.('h-card')) { if (this.handleLinks && attrs?.['class']?.includes?.('h-card')) {
return ['', children.map(processItem), ''] return ['', children.map(processItem), '']
} }
let mfm_style = mfmStyleFromDataAttributes(attrs)
if (mfm_style !== '') {
return [
opener.slice(0,-1) + ' style="' + mfm_style + '">',
children.map(processItem),
closer
]
}
} }
if (children !== undefined) { if (children !== undefined) {

View file

@ -24,7 +24,7 @@
:items="items" :items="items"
:get-key="getKey" :get-key="getKey"
> >
<template v-slot:item="{item}"> <template #item="{item}">
<div <div
class="selectable-list-item-inner" class="selectable-list-item-inner"
:class="{ 'selectable-list-item-selected-inner': isSelected(item) }" :class="{ 'selectable-list-item-selected-inner': isSelected(item) }"
@ -41,7 +41,7 @@
/> />
</div> </div>
</template> </template>
<template v-slot:empty> <template #empty>
<slot name="empty" /> <slot name="empty" />
</template> </template>
</List> </List>

View file

@ -6,7 +6,7 @@
<Checkbox <Checkbox
:model-value="state" :model-value="state"
:disabled="disabled" :disabled="disabled"
@update:modelValue="update" @update:model-value="update"
> >
<span <span
v-if="!!$slots.default" v-if="!!$slots.default"

View file

@ -8,7 +8,7 @@
<Select <Select
:model-value="state" :model-value="state"
:disabled="disabled" :disabled="disabled"
@update:modelValue="update" @update:model-value="update"
> >
<option <option
v-for="option in options" v-for="option in options"

View file

@ -6,14 +6,14 @@
<Popover <Popover
trigger="hover" trigger="hover"
> >
<template v-slot:trigger> <template #trigger>
&nbsp; &nbsp;
<FAIcon <FAIcon
icon="wrench" icon="wrench"
:aria-label="$t('settings.setting_changed')" :aria-label="$t('settings.setting_changed')"
/> />
</template> </template>
<template v-slot:content> <template #content>
<div class="modified-tooltip"> <div class="modified-tooltip">
{{ $t('settings.setting_changed') }} {{ $t('settings.setting_changed') }}
</div> </div>

View file

@ -6,14 +6,14 @@
<Popover <Popover
trigger="hover" trigger="hover"
> >
<template v-slot:trigger> <template #trigger>
&nbsp; &nbsp;
<FAIcon <FAIcon
icon="server" icon="server"
:aria-label="$t('settings.setting_server_side')" :aria-label="$t('settings.setting_server_side')"
/> />
</template> </template>
<template v-slot:content> <template #content>
<div class="serverside-tooltip"> <div class="serverside-tooltip">
{{ $t('settings.setting_server_side') }} {{ $t('settings.setting_server_side') }}
</div> </div>

View file

@ -69,7 +69,7 @@ const SettingsModal = {
this.$store.dispatch('closeSettingsModal') this.$store.dispatch('closeSettingsModal')
}, },
logout () { logout () {
this.$router.replace('/main/public') this.$router.replace(this.$store.state.instance.redirectRootNoLogin || '/main/all')
this.$store.dispatch('closeSettingsModal') this.$store.dispatch('closeSettingsModal')
this.$store.dispatch('logout') this.$store.dispatch('logout')
}, },

View file

@ -108,7 +108,7 @@
<Checkbox <Checkbox
:model-value="!!expertLevel" :model-value="!!expertLevel"
class="expertMode" class="expertMode"
@update:modelValue="expertLevel = Number($event)" @update:model-value="expertLevel = Number($event)"
> >
{{ $t("settings.expert_mode") }} {{ $t("settings.expert_mode") }}
</Checkbox> </Checkbox>

View file

@ -72,7 +72,7 @@ const DataImportExportTab = {
// check is it's a local user // check is it's a local user
if (user && user.is_local) { if (user && user.is_local) {
// append the instance address // append the instance address
// eslint-disable-next-line no-undef
return user.screen_name + '@' + location.hostname return user.screen_name + '@' + location.hostname
} }
return user.screen_name return user.screen_name

View file

@ -4,6 +4,7 @@ import ScopeSelector from 'src/components/scope_selector/scope_selector.vue'
import IntegerSetting from '../helpers/integer_setting.vue' import IntegerSetting from '../helpers/integer_setting.vue'
import InterfaceLanguageSwitcher from 'src/components/interface_language_switcher/interface_language_switcher.vue' import InterfaceLanguageSwitcher from 'src/components/interface_language_switcher/interface_language_switcher.vue'
import { usePostLanguageOptions } from 'src/lib/post_language'
import SharedComputedObject from '../helpers/shared_computed_object.js' import SharedComputedObject from '../helpers/shared_computed_object.js'
import ServerSideIndicator from '../helpers/server_side_indicator.vue' import ServerSideIndicator from '../helpers/server_side_indicator.vue'
import { library } from '@fortawesome/fontawesome-svg-core' import { library } from '@fortawesome/fontawesome-svg-core'
@ -17,6 +18,11 @@ library.add(
) )
const GeneralTab = { const GeneralTab = {
setup() {
const {postLanguageOptions} = usePostLanguageOptions()
return {postLanguageOptions}
},
data () { data () {
return { return {
subjectLineOptions: ['email', 'noop', 'masto'].map(mode => ({ subjectLineOptions: ['email', 'noop', 'masto'].map(mode => ({
@ -118,6 +124,12 @@ const GeneralTab = {
this.$store.dispatch('setOption', { name: 'translationLanguage', value: val }) this.$store.dispatch('setOption', { name: 'translationLanguage', value: val })
} }
}, },
postLanguage: {
get: function () { return this.$store.getters.mergedConfig.postLanguage },
set: function (val) {
this.$store.dispatch('setOption', { name: 'postLanguage', value: val })
}
},
...SharedComputedObject() ...SharedComputedObject()
}, },
methods: { methods: {

View file

@ -44,7 +44,6 @@
<template <template
v-if="profilesExpanded" v-if="profilesExpanded"
> >
<div <div
v-for="profile in settingsProfiles" v-for="profile in settingsProfiles"
:key="profile.id" :key="profile.id"
@ -73,15 +72,24 @@
</button> </button>
</template> </template>
</div> </div>
<button class="btn button-default" @click="refreshProfiles()"> <button
class="btn button-default"
@click="refreshProfiles()"
>
{{ $t('settings.settings_profiles_refresh') }} {{ $t('settings.settings_profiles_refresh') }}
<FAIcon icon="sync" @click="refreshProfiles()" /> <FAIcon
icon="sync"
@click="refreshProfiles()"
/>
</button> </button>
<h3>{{ $t('settings.settings_profile_creation') }}</h3> <h3>{{ $t('settings.settings_profile_creation') }}</h3>
<label for="settings-profile-new-name"> <label for="settings-profile-new-name">
{{ $t('settings.settings_profile_creation_new_name_label') }} {{ $t('settings.settings_profile_creation_new_name_label') }}
</label> </label>
<input v-model="newProfileName" id="settings-profile-new-name"> <input
id="settings-profile-new-name"
v-model="newProfileName"
>
<button <button
class="btn button-default" class="btn button-default"
@click="createSettingsProfile" @click="createSettingsProfile"
@ -151,6 +159,16 @@
{{ $t('settings.show_page_backgrounds') }} {{ $t('settings.show_page_backgrounds') }}
</BooleanSetting> </BooleanSetting>
</li> </li>
<li>
<BooleanSetting path="centerAlignBio">
{{ $t('settings.center_align_bio') }}
</BooleanSetting>
</li>
<li>
<BooleanSetting path="compactUserInfo">
{{ $t('settings.compact_user_info') }}
</BooleanSetting>
</li>
<li> <li>
<BooleanSetting path="stopGifs"> <BooleanSetting path="stopGifs">
{{ $t('settings.stop_gifs') }} {{ $t('settings.stop_gifs') }}
@ -261,6 +279,11 @@
{{ $t('settings.right_sidebar') }} {{ $t('settings.right_sidebar') }}
</BooleanSetting> </BooleanSetting>
</li> </li>
<li>
<BooleanSetting path="widenTimeline">
{{ $t('settings.widen_timeline') }}
</BooleanSetting>
</li>
<li> <li>
<ChoiceSetting <ChoiceSetting
v-if="user" v-if="user"
@ -585,6 +608,15 @@
{{ $t('settings.post_status_content_type') }} {{ $t('settings.post_status_content_type') }}
</ChoiceSetting> </ChoiceSetting>
</li> </li>
<li>
<ChoiceSetting
id="postLanguage"
path="postLanguage"
:options="postLanguageOptions"
>
{{ $t('settings.post_language') }}
</ChoiceSetting>
</li>
<li> <li>
<BooleanSetting <BooleanSetting
path="alwaysShowNewPostButton" path="alwaysShowNewPostButton"

View file

@ -85,7 +85,7 @@ const MutesAndBlocks = {
// check is it's a local user // check is it's a local user
if (user && user.is_local) { if (user && user.is_local) {
// append the instance address // append the instance address
// eslint-disable-next-line no-undef
return user.screen_name + '@' + location.hostname return user.screen_name + '@' + location.hostname
} }
return user.screen_name return user.screen_name

View file

@ -10,7 +10,7 @@
:query="queryUserIds" :query="queryUserIds"
:placeholder="$t('settings.search_user_to_block')" :placeholder="$t('settings.search_user_to_block')"
> >
<template v-slot="row"> <template #default="row">
<BlockCard <BlockCard
:user-id="row.item" :user-id="row.item"
/> />
@ -21,7 +21,7 @@
:refresh="true" :refresh="true"
:get-key="i => i" :get-key="i => i"
> >
<template v-slot:header="{selected}"> <template #header="{selected}">
<div class="bulk-actions"> <div class="bulk-actions">
<ProgressButton <ProgressButton
v-if="selected.length > 0" v-if="selected.length > 0"
@ -29,7 +29,7 @@
:click="() => blockUsers(selected)" :click="() => blockUsers(selected)"
> >
{{ $t('user_card.block') }} {{ $t('user_card.block') }}
<template v-slot:progress> <template #progress>
{{ $t('user_card.block_progress') }} {{ $t('user_card.block_progress') }}
</template> </template>
</ProgressButton> </ProgressButton>
@ -39,16 +39,16 @@
:click="() => unblockUsers(selected)" :click="() => unblockUsers(selected)"
> >
{{ $t('user_card.unblock') }} {{ $t('user_card.unblock') }}
<template v-slot:progress> <template #progress>
{{ $t('user_card.unblock_progress') }} {{ $t('user_card.unblock_progress') }}
</template> </template>
</ProgressButton> </ProgressButton>
</div> </div>
</template> </template>
<template v-slot:item="{item}"> <template #item="{item}">
<BlockCard :user-id="item" /> <BlockCard :user-id="item" />
</template> </template>
<template v-slot:empty> <template #empty>
{{ $t('settings.no_blocks') }} {{ $t('settings.no_blocks') }}
</template> </template>
</BlockList> </BlockList>
@ -63,7 +63,7 @@
:query="queryUserIds" :query="queryUserIds"
:placeholder="$t('settings.search_user_to_mute')" :placeholder="$t('settings.search_user_to_mute')"
> >
<template v-slot="row"> <template #default="row">
<MuteCard <MuteCard
:user-id="row.item" :user-id="row.item"
/> />
@ -74,7 +74,7 @@
:refresh="true" :refresh="true"
:get-key="i => i" :get-key="i => i"
> >
<template v-slot:header="{selected}"> <template #header="{selected}">
<div class="bulk-actions"> <div class="bulk-actions">
<ProgressButton <ProgressButton
v-if="selected.length > 0" v-if="selected.length > 0"
@ -82,7 +82,7 @@
:click="() => muteUsers(selected)" :click="() => muteUsers(selected)"
> >
{{ $t('user_card.mute') }} {{ $t('user_card.mute') }}
<template v-slot:progress> <template #progress>
{{ $t('user_card.mute_progress') }} {{ $t('user_card.mute_progress') }}
</template> </template>
</ProgressButton> </ProgressButton>
@ -92,16 +92,16 @@
:click="() => unmuteUsers(selected)" :click="() => unmuteUsers(selected)"
> >
{{ $t('user_card.unmute') }} {{ $t('user_card.unmute') }}
<template v-slot:progress> <template #progress>
{{ $t('user_card.unmute_progress') }} {{ $t('user_card.unmute_progress') }}
</template> </template>
</ProgressButton> </ProgressButton>
</div> </div>
</template> </template>
<template v-slot:item="{item}"> <template #item="{item}">
<MuteCard :user-id="item" /> <MuteCard :user-id="item" />
</template> </template>
<template v-slot:empty> <template #empty>
{{ $t('settings.no_mutes') }} {{ $t('settings.no_mutes') }}
</template> </template>
</MuteList> </MuteList>
@ -114,7 +114,7 @@
:query="queryKnownDomains" :query="queryKnownDomains"
:placeholder="$t('settings.type_domains_to_mute')" :placeholder="$t('settings.type_domains_to_mute')"
> >
<template v-slot="row"> <template #default="row">
<DomainMuteCard <DomainMuteCard
:domain="row.item" :domain="row.item"
/> />
@ -125,7 +125,7 @@
:refresh="true" :refresh="true"
:get-key="i => i" :get-key="i => i"
> >
<template v-slot:header="{selected}"> <template #header="{selected}">
<div class="bulk-actions"> <div class="bulk-actions">
<ProgressButton <ProgressButton
v-if="selected.length > 0" v-if="selected.length > 0"
@ -133,16 +133,16 @@
:click="() => unmuteDomains(selected)" :click="() => unmuteDomains(selected)"
> >
{{ $t('domain_mute_card.unmute') }} {{ $t('domain_mute_card.unmute') }}
<template v-slot:progress> <template #progress>
{{ $t('domain_mute_card.unmute_progress') }} {{ $t('domain_mute_card.unmute_progress') }}
</template> </template>
</ProgressButton> </ProgressButton>
</div> </div>
</template> </template>
<template v-slot:item="{item}"> <template #item="{item}">
<DomainMuteCard :domain="item" /> <DomainMuteCard :domain="item" />
</template> </template>
<template v-slot:empty> <template #empty>
{{ $t('settings.no_mutes') }} {{ $t('settings.no_mutes') }}
</template> </template>
</DomainMuteList> </DomainMuteList>

View file

@ -130,7 +130,7 @@ const ProfileTab = {
note: this.newBio, note: this.newBio,
locked: this.newLocked, locked: this.newLocked,
// Backend notation. // Backend notation.
/* eslint-disable camelcase */
display_name: this.newName, display_name: this.newName,
fields_attributes: this.newFields.filter(el => el != null), fields_attributes: this.newFields.filter(el => el != null),
bot: this.bot, bot: this.bot,
@ -138,7 +138,7 @@ const ProfileTab = {
status_ttl_days: this.expirePosts ? this.newPostTTLDays : -1, status_ttl_days: this.expirePosts ? this.newPostTTLDays : -1,
permit_followback: this.permit_followback, permit_followback: this.permit_followback,
accepts_direct_messages_from: this.userAcceptsDirectMessagesFrom accepts_direct_messages_from: this.userAcceptsDirectMessagesFrom
/* eslint-enable camelcase */
} }
if (this.emailLanguage) { if (this.emailLanguage) {
@ -187,7 +187,7 @@ const ProfileTab = {
}) })
return return
} }
// eslint-disable-next-line no-undef
const reader = new FileReader() const reader = new FileReader()
reader.onload = ({ target }) => { reader.onload = ({ target }) => {
const img = target.result const img = target.result

View file

@ -110,11 +110,9 @@
max="730" max="730"
class="expire-posts-days" class="expire-posts-days"
:placeholder="$t('settings.expire_posts_input_placeholder')" :placeholder="$t('settings.expire_posts_input_placeholder')"
/> >
</p>
<p>
</p> </p>
<p />
<p> <p>
<interface-language-switcher <interface-language-switcher
:prompt-text="$t('settings.email_language')" :prompt-text="$t('settings.email_language')"

View file

@ -1,22 +1,25 @@
import { extractCommit } from 'src/services/version/version.service' import { extractCommit } from 'src/services/version/version.service'
const pleromaFeCommitUrl = 'https://akkoma.dev/AkkomaGang/pleroma-fe/commit/' function joinURL(base, subpath) {
const pleromaBeCommitUrl = 'https://akkoma.dev/AkkomaGang/akkoma/commit/' return URL.parse(subpath, base)?.href || "invalid base URL"
}
const VersionTab = { const VersionTab = {
data () { data () {
const instance = this.$store.state.instance const instance = this.$store.state.instance
return { return {
backendCommitUrl: instance.backendCommitUrl,
backendVersion: instance.backendVersion, backendVersion: instance.backendVersion,
frontendCommitUrl: instance.frontendCommitUrl,
frontendVersion: instance.frontendVersion frontendVersion: instance.frontendVersion
} }
}, },
computed: { computed: {
frontendVersionLink () { frontendVersionLink () {
return pleromaFeCommitUrl + this.frontendVersion return joinURL(this.frontendCommitUrl, this.frontendVersion)
}, },
backendVersionLink () { backendVersionLink () {
return pleromaBeCommitUrl + extractCommit(this.backendVersion) return joinURL(this.backendCommitUrl, extractCommit(this.backendVersion))
} }
} }
} }

View file

@ -266,6 +266,16 @@
color: $fallback--cGreen; color: $fallback--cGreen;
color: var(--cGreen, $fallback--cGreen); color: var(--cGreen, $fallback--cGreen);
} }
.right-side {
display: flex;
align-items: center;
gap: 0.3em;
}
.repeat-tooltip {
flex-shrink: 0;
}
} }
.repeater-avatar { .repeater-avatar {

View file

@ -83,7 +83,7 @@
:user="statusoid.user" :user="statusoid.user"
/> />
<div class="right-side faint"> <div class="right-side faint">
<span <div
class="status-username repeater-name" class="status-username repeater-name"
:title="retweeter" :title="retweeter"
> >
@ -100,8 +100,12 @@
v-else v-else
:to="retweeterProfileLink" :to="retweeterProfileLink"
>{{ retweeter }}</router-link> >{{ retweeter }}</router-link>
</span> </div>
{{ ' ' }} {{ ' ' }}
<div
class="repeat-tooltip"
>
<FAIcon <FAIcon
icon="retweet" icon="retweet"
class="repeat-icon" class="repeat-icon"
@ -110,6 +114,7 @@
{{ $t('timeline.repeated') }} {{ $t('timeline.repeated') }}
</div> </div>
</div> </div>
</div>
<div <div
v-if="!deleted" v-if="!deleted"
@ -368,7 +373,7 @@
:controlled-toggle-showing-long-subject="controlledToggleShowingLongSubject" :controlled-toggle-showing-long-subject="controlledToggleShowingLongSubject"
@mediaplay="addMediaPlaying($event)" @mediaplay="addMediaPlaying($event)"
@mediapause="removeMediaPlaying($event)" @mediapause="removeMediaPlaying($event)"
@parseReady="setHeadTailLinks" @parse-ready="setHeadTailLinks"
/> />
</div> </div>
@ -476,8 +481,8 @@
/> />
<extra-buttons <extra-buttons
:status="status" :status="status"
@onError="showError" @on-error="showError"
@onSuccess="clearError" @on-success="clearError"
/> />
</div> </div>
</div> </div>

View file

@ -41,7 +41,8 @@ const StatusContent = {
postLength: this.status.text.length, postLength: this.status.text.length,
parseReadyDone: false, parseReadyDone: false,
renderMisskeyMarkdown, renderMisskeyMarkdown,
translateFrom: null translateFrom: null,
translating: false
} }
}, },
computed: { computed: {
@ -135,7 +136,10 @@ const StatusContent = {
}, },
translateStatus () { translateStatus () {
const translateTo = this.$store.getters.mergedConfig.translationLanguage || this.$store.state.instance.interfaceLanguage const translateTo = this.$store.getters.mergedConfig.translationLanguage || this.$store.state.instance.interfaceLanguage
this.$store.dispatch('translateStatus', { id: this.status.id, language: translateTo, from: this.translateFrom }) this.translating = true
this.$store.dispatch(
'translateStatus', { id: this.status.id, language: translateTo, from: this.translateFrom }
).finally(() => { this.translating = false })
} }
} }
} }

View file

@ -3,6 +3,7 @@
.StatusBody { .StatusBody {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
overflow: hidden;
.translation { .translation {
border: 1px solid var(--accent, $fallback--link); border: 1px solid var(--accent, $fallback--link);
@ -23,24 +24,6 @@
transition: 0.05s; transition: 0.05s;
} }
._mfm_x2_ {
.emoji {
height: 100px;
}
}
._mfm_x3_ {
.emoji {
height: 150px;
}
}
._mfm_x4_ {
.emoji {
height: 200px;
}
}
.attachments { .attachments {
margin-top: 0.5em; margin-top: 0.5em;
} }

View file

@ -1,7 +1,7 @@
<template> <template>
<div <div
class="StatusBody" class="StatusBody"
:class="{ '-compact': compact, 'mfm-disabled': !renderMisskeyMarkdown }" :class="{ '-compact': compact }"
> >
<div class="body"> <div class="body">
<div <div
@ -54,7 +54,7 @@
:mfm="renderMisskeyMarkdown && (status.media_type === 'text/x.misskeymarkdown')" :mfm="renderMisskeyMarkdown && (status.media_type === 'text/x.misskeymarkdown')"
:greentext="mergedConfig.greentext" :greentext="mergedConfig.greentext"
:attentions="status.attentions" :attentions="status.attentions"
@parseReady="onParseReady" @parse-ready="onParseReady"
/> />
<div <div
v-if="status.translation" v-if="status.translation"
@ -70,7 +70,7 @@
:mfm="renderMisskeyMarkdown && (status.media_type === 'text/x.misskeymarkdown')" :mfm="renderMisskeyMarkdown && (status.media_type === 'text/x.misskeymarkdown')"
:greentext="mergedConfig.greentext" :greentext="mergedConfig.greentext"
:attentions="status.attentions" :attentions="status.attentions"
@parseReady="onParseReady" @parse-ready="onParseReady"
/> />
<div> <div>
<label class="label">{{ $t('status.override_translation_source_language') }}</label> <label class="label">{{ $t('status.override_translation_source_language') }}</label>
@ -89,7 +89,11 @@
</option> </option>
</Select> </Select>
{{ ' ' }} {{ ' ' }}
<button @click="translateStatus" class="btn button-default"> <button
class="btn button-default"
:disabled="translating"
@click="translateStatus"
>
{{ $t('status.translate') }} {{ $t('status.translate') }}
</button> </button>
</div> </div>

View file

@ -0,0 +1,423 @@
/**
* "FEP-c16b: Formatting MFM functions" attributes that Akkoma supports
*/
.StatusContent:not(.mfm-disabled) {
/* The following are the non-animated MFM */
.mfm-center {
display: block;
text-align: center;
}
.mfm-flip {
display: inline-block;
transform: scaleX(-1);
}
.mfm-flip[data-mfm-v] {
transform: scaleY(-1);
}
.mfm-flip[data-mfm-v][data-mfm-h] {
transform: scale(-1, -1);
}
.mfm-font[data-mfm-serif] {
font-family: serif;
}
.mfm-font[data-mfm-monospace] {
font-family: monospace;
}
.mfm-font[data-mfm-cursive] {
font-family: cursive;
}
.mfm-font[data-mfm-fantasy] {
font-family: fantasy;
}
.mfm-font[data-mfm-emoji] {
font-family: emoji;
}
.mfm-font[data-mfm-math] {
font-family: math;
}
.mfm-blur {
filter: blur(6px);
transition: filter 0.3s;
&:hover {
filter: blur(0);
}
}
.mfm-rotate {
display: inline-block;
transform: rotate(calc(var(--mfm-deg, 90) * 1deg));
transform-origin: center center;
}
.mfm-x2 {
--mfm-zoom-size: 200%;
}
.mfm-x3 {
--mfm-zoom-size: 400%;
}
.mfm-x4 {
--mfm-zoom-size: 600%;
}
.mfm-x2,
.mfm-x3,
.mfm-x4,
.mfm-tada {
.emoji {
--emoji-size: 2em;
}
font-size: var(--mfm-zoom-size);
.mfm-x2,
.mfm-x3,
.mfm-x4,
.mfm-tada {
/* only half effective */
font-size: calc(var(--mfm-zoom-size) / 2 + 50%);
.mfm-x2,
.mfm-x3,
.mfm-x4,
.mfm-tada {
/* disabled */
font-size: 100%;
}
}
}
.mfm-position {
display: inline-block;
transform: translate(calc(var(--mfm-x, 0) * 1em), calc(var(--mfm-y, 0) * 1em));
}
.mfm-scale {
display: inline-block;
transform: scale(var(--mfm-x, 1), var(--mfm-y, 1));
}
.mfm-fg {
color: var(--mfm-color, #f00);
}
.mfm-bg {
background-color: var(--mfm-color, #0f0);
}
/* The following are the animated MFM */
/* .mfm-hover means that we should only play animation when hovering over the StatusContent
* So either StatusContent does not have this class,
* or it has the class and we are hovering over StatusContent
*/
&:not(.mfm-hover:not(:hover)) {
.mfm-jelly {
display: inline-block;
animation: mfm-rubberBand var(--mfm-speed, 1s) linear infinite both;
}
.mfm-twitch {
display: inline-block;
animation: mfm-twitch var(--mfm-speed, 0.5s) ease infinite;
}
.mfm-shake {
display: inline-block;
animation: mfm-shake var(--mfm-speed, 0.5s) ease infinite;
}
.mfm-spin {
display: inline-block;
animation: mfm-spin var(--mfm-speed, 1.5s) linear infinite;
}
.mfm-spin[data-mfm-y] {
animation-name: mfm-spinY;
}
.mfm-spin[data-mfm-x] {
animation-name: mfm-spinX;
}
.mfm-spin[data-mfm-alternate] {
animation-direction: alternate;
}
.mfm-spin[data-mfm-left] {
animation-direction: reverse;
}
.mfm-jump {
display: inline-block;
animation: mfm-jump var(--mfm-speed, 0.75s) linear infinite;
}
.mfm-bounce {
display: inline-block;
animation: mfm-bounce var(--mfm-speed, 0.75s) linear infinite;
transform-origin: center bottom;
}
.mfm-rainbow {
animation: mfm-rainbow var(--mfm-speed, 1s) linear infinite;
}
.mfm-tada {
display: inline-block;
animation: mfm-tada var(--mfm-speed, 1s) linear infinite both;
--mfm-zoom-size: 150%;
}
}
/* animation keyframes */
@keyframes mfm-spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
@keyframes mfm-spinX {
0% { transform: perspective(128px) rotateX(0deg); }
100% { transform: perspective(128px) rotateX(360deg); }
}
@keyframes mfm-spinY {
0% { transform: perspective(128px) rotateY(0deg); }
100% { transform: perspective(128px) rotateY(360deg); }
}
@keyframes mfm-jump {
0% { transform: translateY(0); }
25% { transform: translateY(-16px); }
50% { transform: translateY(0); }
75% { transform: translateY(-8px); }
100% { transform: translateY(0); }
}
@keyframes mfm-bounce {
0% { transform: translateY(0) scale(1, 1); }
25% { transform: translateY(-16px) scale(1, 1); }
50% { transform: translateY(0) scale(1, 1); }
75% { transform: translateY(0) scale(1.5, 0.75); }
100% { transform: translateY(0) scale(1, 1); }
}
@keyframes mfm-twitch {
0% { transform: translate(7px, -2px); }
5% { transform: translate(-3px, 1px); }
10% { transform: translate(-7px, -1px); }
15% { transform: translate(0, -1px); }
20% { transform: translate(-8px, 6px); }
25% { transform: translate(-4px, -3px); }
30% { transform: translate(-4px, -6px); }
35% { transform: translate(-8px, -8px); }
40% { transform: translate(4px, 6px); }
45% { transform: translate(-3px, 1px); }
50% { transform: translate(2px, -10px); }
55% { transform: translate(-7px, 0); }
60% { transform: translate(-2px, 4px); }
65% { transform: translate(3px, -8px); }
70% { transform: translate(6px, 7px); }
75% { transform: translate(-7px, -2px); }
80% { transform: translate(-7px, -8px); }
85% { transform: translate(9px, 3px); }
90% { transform: translate(-3px, -2px); }
95% { transform: translate(-10px, 2px); }
100% { transform: translate(-2px, -6px); }
}
@keyframes mfm-shake {
0% { transform: translate(-3px, -1px) rotate(-8deg); }
5% { transform: translate(0, -1px) rotate(-10deg); }
10% { transform: translate(1px, -3px) rotate(0deg); }
15% { transform: translate(1px, 1px) rotate(11deg); }
20% { transform: translate(-2px, 1px) rotate(1deg); }
25% { transform: translate(-1px, -2px) rotate(-2deg); }
30% { transform: translate(-1px, 2px) rotate(-3deg); }
35% { transform: translate(2px, 1px) rotate(6deg); }
40% { transform: translate(-2px, -3px) rotate(-9deg); }
45% { transform: translate(0, -1px) rotate(-12deg); }
50% { transform: translate(1px, 2px) rotate(10deg); }
55% { transform: translate(0, -3px) rotate(8deg); }
60% { transform: translate(1px, -1px) rotate(8deg); }
65% { transform: translate(0, -1px) rotate(-7deg); }
70% { transform: translate(-1px, -3px) rotate(6deg); }
75% { transform: translate(0, -2px) rotate(4deg); }
80% { transform: translate(-2px, -1px) rotate(3deg); }
85% { transform: translate(1px, -3px) rotate(-10deg); }
90% { transform: translate(1px, 0) rotate(3deg); }
95% { transform: translate(-2px, 0) rotate(-3deg); }
100% { transform: translate(2px, 1px) rotate(2deg); }
}
@keyframes mfm-rubberBand {
0% { transform: scale3d(1, 1, 1); }
30% { transform: scale3d(1.25, 0.75, 1); }
40% { transform: scale3d(0.75, 1.25, 1); }
50% { transform: scale3d(1.15, 0.85, 1); }
65% { transform: scale3d(0.95, 1.05, 1); }
75% { transform: scale3d(1.05, 0.95, 1); }
100% { transform: scale3d(1, 1, 1); }
}
@keyframes mfm-rainbow {
0% { filter: hue-rotate(0deg) contrast(150%) saturate(150%); }
100% { filter: hue-rotate(360deg) contrast(150%) saturate(150%); }
}
@keyframes mfm-tada {
0%,
100% { transform: scale3d(1, 1, 1); }
10%,
20% { transform: scale3d(0.9, 0.9, 0.9) rotate3d(0, 0, 1, -3deg); }
30%,
50%,
70%,
90% { transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); }
40%,
60%,
80% { transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); }
}
/**
* Legacy MFM
* This is for backwards compatibility with posts formatted on Akkoma before support for FEP-c16b
* Note that it uses the keyframes as defined above for the FEP-c16b compatible MFM representation
*/
.mfm {
display: inline-block;
}
/* The following are the legacy non-animated MFM */
._mfm_flip_[data-h][data-v] {
transform: scale(-1, -1);
}
._mfm_flip_[data-v] {
transform: scaleY(-1);
}
._mfm_flip_:not([data-v]) {
transform: scaleX(-1);
}
._mfm_x2_ {
font-size: 200%;
}
._mfm_x3_ {
font-size: 400%;
}
._mfm_x4_ {
font-size: 600%;
}
._mfm_x2_ {
.emoji {
height: 100px;
}
}
._mfm_x3_ {
.emoji {
height: 150px;
}
}
._mfm_x4_ {
.emoji {
height: 200px;
}
}
._mfm_blur_ {
filter: blur(6px);
transition: filter 0.3s;
}
._mfm_blur_:hover {
filter: blur(0);
}
._mfm_rotate_ {
transform: rotate(90deg);
transform-origin: center center;
}
/* The following are the legacy animated MFM */
/* .mfm-hover means that we should only play animation when hovering over the StatusContent
* So either StatusContent does not have this class,
* or it has the class and we are hovering over StatusContent
*/
&:not(.mfm-hover:not(:hover)) {
._mfm_tada_ {
font-size: 150%;
animation: mfm-tada 1s linear infinite both;
}
._mfm_jelly_ {
animation: mfm-rubberBand 1s linear infinite both;
}
._mfm_twitch_ {
animation: mfm-twitch 0.5s ease infinite;
}
._mfm_shake_ {
animation: mfm-shake 0.5s ease infinite;
}
._mfm_spin_ {
animation: mfm-spin 0.5s linear infinite;
}
._mfm_spin_[data-x] {
animation-name: mfm-spinX;
}
._mfm_spin_[data-y] {
animation-name: mfm-spinY;
}
._mfm_spin_[left] {
animation-direction: reverse;
}
._mfm_spin_[alternate] {
animation-direction: alternate;
}
._mfm_jump_ {
animation: mfm-jump 0.75s linear infinite;
}
._mfm_bounce_ {
animation: mfm-bounce 0.75s linear infinite;
transform-origin: center bottom;
}
._mfm_rainbow_ {
animation: mfm-rainbow 1s linear infinite;
}
}
}

View file

@ -14,7 +14,7 @@
:toggle-showing-tall="toggleShowingTall" :toggle-showing-tall="toggleShowingTall"
:toggle-expanding-subject="toggleExpandingSubject" :toggle-expanding-subject="toggleExpandingSubject"
:toggle-showing-long-subject="toggleShowingLongSubject" :toggle-showing-long-subject="toggleShowingLongSubject"
@parseReady="$emit('parseReady', $event)" @parse-ready="$emit('parseReady', $event)"
> >
<div v-if="status.poll && status.poll.options && !compact"> <div v-if="status.poll && status.poll.options && !compact">
<Poll <Poll
@ -64,6 +64,7 @@
</template> </template>
<script src="./status_content.js"></script> <script src="./status_content.js"></script>
<style lang="scss" src="./mfm.scss" />
<style lang="scss"> <style lang="scss">
.StatusContent { .StatusContent {
flex: 1; flex: 1;
@ -75,23 +76,6 @@
height: 50px; height: 50px;
} }
} }
&.mfm-hover:not(:hover) {
.mfm {
animation: none !important;
}
}
&.mfm-disabled {
span {
font-size: 100% !important;
}
.mfm {
animation: none !important;
}
.emoji {
height: 32px !important;
}
}
} }
.quote-inline, .quote-inline,

View file

@ -2,7 +2,7 @@
<Modal <Modal
v-if="modalActivated" v-if="modalActivated"
class="status-history-modal-view" class="status-history-modal-view"
@backdropClicked="closeModal" @backdrop-clicked="closeModal"
> >
<div class="status-history-modal-panel panel"> <div class="status-history-modal-panel panel">
<div class="panel-heading"> <div class="panel-heading">
@ -17,7 +17,7 @@
v-for="status in history" v-for="status in history"
:key="status.id" :key="status.id"
:statusoid="status" :statusoid="status"
:isPreview="true" :is-preview="true"
class="conversation-status status-fadein panel-body" class="conversation-status status-fadein panel-body"
/> />
</div> </div>

View file

@ -5,10 +5,10 @@
:bound-to="{ x: 'container' }" :bound-to="{ x: 'container' }"
@show="enter" @show="enter"
> >
<template v-slot:trigger> <template #trigger>
<slot /> <slot />
</template> </template>
<template v-slot:content> <template #content>
<Status <Status
v-if="status" v-if="status"
:is-preview="true" :is-preview="true"

View file

@ -7,7 +7,8 @@
> >
<div <div
v-if="animated && imageTypeLabel" v-if="animated && imageTypeLabel"
class="image-type-label"> class="image-type-label"
>
{{ imageTypeLabel }} {{ imageTypeLabel }}
</div> </div>
<canvas <canvas

View file

@ -32,7 +32,7 @@
:dive="dive ? () => dive(status.id) : undefined" :dive="dive ? () => dive(status.id) : undefined"
@goto="setHighlight" @goto="setHighlight"
@toggleExpanded="toggleExpanded" @toggle-expanded="toggleExpanded"
/> />
<div <div
v-if="currentReplies.length && threadShowing" v-if="currentReplies.length && threadShowing"

View file

@ -28,4 +28,7 @@
} }
} }
} }
.timeline {
min-height: 1em;
}
} }

View file

@ -4,7 +4,7 @@
class="TimelineQuickSettings" class="TimelineQuickSettings"
:bound-to="{ x: 'container' }" :bound-to="{ x: 'container' }"
> >
<template v-slot:content> <template #content>
<div class="dropdown-menu"> <div class="dropdown-menu">
<div v-if="loggedIn"> <div v-if="loggedIn">
<button <button
@ -80,7 +80,7 @@
</button> </button>
</div> </div>
</template> </template>
<template v-slot:trigger> <template #trigger>
<button class="button-unstyled"> <button class="button-unstyled">
<FAIcon icon="filter" /> <FAIcon icon="filter" />
</button> </button>

View file

@ -9,12 +9,12 @@
@show="openMenu" @show="openMenu"
@close="() => isOpen = false" @close="() => isOpen = false"
> >
<template v-slot:content> <template #content>
<div class="timeline-menu-popover popover-default"> <div class="timeline-menu-popover popover-default">
<TimelineMenuContent /> <TimelineMenuContent />
</div> </div>
</template> </template>
<template v-slot:trigger> <template #trigger>
<button class="button-unstyled title timeline-menu-title"> <button class="button-unstyled title timeline-menu-title">
<span class="timeline-title">{{ timelineName() }}</span> <span class="timeline-title">{{ timelineName() }}</span>
<span> <span>

View file

@ -62,7 +62,6 @@
:title="$t('nav.twkn_timeline_description')" :title="$t('nav.twkn_timeline_description')"
:aria-label="$t('nav.twkn_timeline_description')" :aria-label="$t('nav.twkn_timeline_description')"
>{{ $t("nav.twkn") }}</span> >{{ $t("nav.twkn") }}</span>
</router-link> </router-link>
</li> </li>
<li v-if="currentUser"> <li v-if="currentUser">

View file

@ -16,9 +16,9 @@
/> />
</router-link> </router-link>
<router-link <router-link
v-if="publicTimelineVisible"
:to="{ name: 'public-timeline' }" :to="{ name: 'public-timeline' }"
class="nav-icon" class="nav-icon"
v-if="publicTimelineVisible"
> >
<FAIcon <FAIcon
fixed-width fixed-width
@ -40,9 +40,9 @@
/> />
</router-link> </router-link>
<router-link <router-link
v-if="federatedTimelineVisible"
:to="{ name: 'public-external-timeline' }" :to="{ name: 'public-external-timeline' }"
class="nav-icon" class="nav-icon"
v-if="federatedTimelineVisible"
> >
<FAIcon <FAIcon
fixed-width fixed-width

View file

@ -66,7 +66,7 @@ export default {
return this.user.id !== this.$store.state.users.currentUser.id return this.user.id !== this.$store.state.users.currentUser.id
}, },
subscribeUrl () { subscribeUrl () {
// eslint-disable-next-line no-undef
const serverUrl = new URL(this.user.statusnet_profile_url) const serverUrl = new URL(this.user.statusnet_profile_url)
return `${serverUrl.protocol}//${serverUrl.host}/main/ostatus` return `${serverUrl.protocol}//${serverUrl.host}/main/ostatus`
}, },
@ -117,6 +117,11 @@ export default {
shouldConfirmMute () { shouldConfirmMute () {
return this.mergedConfig.modalOnMute return this.mergedConfig.modalOnMute
}, },
compactUserInfo () {
return this.$store.getters.mergedConfig.compactUserInfo
&& (this.$store.state.interface.layoutType !== 'mobile')
&& this.switcher
},
...mapGetters(['mergedConfig']) ...mapGetters(['mergedConfig'])
}, },
components: { components: {

View file

@ -21,6 +21,13 @@
position: relative; position: relative;
} }
.user-buttons {
grid-area: edit;
display: flex;
padding: .5em 0 .5em 0;
justify-self: end;
}
.panel-body { .panel-body {
word-wrap: break-word; word-wrap: break-word;
border-bottom-right-radius: inherit; border-bottom-right-radius: inherit;
@ -53,7 +60,6 @@
} }
&-bio { &-bio {
text-align: center;
display: block; display: block;
line-height: 1.3; line-height: 1.3;
padding: 1em; padding: 1em;
@ -100,15 +106,14 @@
padding: 0 26px; padding: 0 26px;
.container { .container {
min-width: 0;
padding: 16px 0 6px; padding: 16px 0 6px;
display: flex; display: grid;
align-items: flex-start; grid-template-areas:
max-height: 56px; "pfp name edit"
"pfp summary summary"
> * { "stats stats stats";
min-width: 0; grid-template-columns: auto 1fr auto;
} align-items: start;
.Avatar { .Avatar {
--_avatarShadowBox: var(--avatarShadow); --_avatarShadowBox: var(--avatarShadow);
@ -123,6 +128,7 @@
} }
&-avatar-link { &-avatar-link {
grid-area: pfp;
position: relative; position: relative;
cursor: pointer; cursor: pointer;
@ -153,8 +159,8 @@
.external-link-button, .edit-profile-button { .external-link-button, .edit-profile-button {
cursor: pointer; cursor: pointer;
width: 2.5em; width: 2.3em;
text-align: center; text-align: right;
margin: -0.5em 0; margin: -0.5em 0;
padding: 0.5em 0; padding: 0.5em 0;
@ -165,12 +171,16 @@
} }
.user-summary { .user-summary {
display: block; grid-area: summary;
display: grid;
grid-template-areas:
"name name name name name"
"hand role lock avg _";
grid-template-columns:
auto auto auto auto 1fr;
justify-items: start;
margin-left: 0.6em; margin-left: 0.6em;
text-align: left;
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap;
flex: 1 1 0;
// This is so that text doesn't get overlapped by avatar's shadow if it has // This is so that text doesn't get overlapped by avatar's shadow if it has
// big one // big one
z-index: 1; z-index: 1;
@ -178,55 +188,81 @@
--emoji-size: 1.7em; --emoji-size: 1.7em;
.top-line, .user-locked {
.bottom-line {
display: flex;
}
}
.user-name {
text-overflow: ellipsis;
overflow: hidden;
flex: 1 1 auto;
margin-right: 1em;
font-size: 1.1em;
}
.bottom-line {
font-weight: light;
font-size: 1.1em;
align-items: baseline;
.lock-icon {
margin-left: 0.5em; margin-left: 0.5em;
grid-area: lock;
} }
.user-screen-name { .user-screen-name {
min-width: 1px; min-width: 1px;
flex: 0 1 auto; max-width: 100%;
text-overflow: ellipsis; text-overflow: ellipsis;
overflow: hidden; overflow: hidden;
color: $fallback--lightText; color: $fallback--lightText;
color: var(--lightText, $fallback--lightText); color: var(--lightText, $fallback--lightText);
grid-area: hand;
} }
.dailyAvg { .dailyAvg {
min-width: 1px; min-width: 1px;
flex: 0 0 auto;
margin-left: 1em; margin-left: 1em;
font-size: 0.7em; font-size: 0.7em;
color: $fallback--text; color: $fallback--text;
color: var(--text, $fallback--text); color: var(--text, $fallback--text);
grid-area: avg;
} }
.user-roles {
display: flex;
grid-area: role;
.user-role { .user-role {
flex: none;
color: $fallback--text; color: $fallback--text;
color: var(--alertNeutralText, $fallback--text); color: var(--alertNeutralText, $fallback--text);
background-color: $fallback--fg; background-color: $fallback--fg;
background-color: var(--alertNeutral, $fallback--fg); background-color: var(--alertNeutral, $fallback--fg);
} }
} }
}
.user-counts {
grid-area: stats;
display: flex;
line-height:16px;
padding-top: 0.5em;
text-align: center;
justify-content: space-around;
color: $fallback--lightText;
color: var(--lightText, $fallback--lightText);
align-self: center;
.user-count {
padding: .5em 0 .5em 0;
margin: 0 .5em;
h5 {
font-size:1em;
font-weight: bolder;
margin: 0 0 0.25em;
}
a {
text-decoration: none;
}
}
}
.user-name {
text-align: start;
text-overflow: ellipsis;
overflow: hidden;
margin-left: 0.6em;
font-size: 1.1em;
grid-area: name;
align-self: center;
white-space: nowrap;
max-width: 100%;
z-index: 1; // so shadow from user avatar doesn't overlap it
}
.user-meta { .user-meta {
margin-bottom: .15em; margin-bottom: .15em;
@ -290,34 +326,21 @@
margin: 0; margin: 0;
} }
} }
&.-compact {
.container {
grid-template-areas:
"pfp name stats edit"
"pfp summary stats edit";
grid-template-columns: auto auto 1fr auto;
}
.user-counts {
padding-top: 0;
justify-content: space-evenly;
}
}
} }
.sidebar .edit-profile-button { .sidebar .edit-profile-button {
display: none; display: none;
} }
.user-counts {
display: flex;
line-height:16px;
padding: .5em 1.5em 0em 1.5em;
text-align: center;
justify-content: space-between;
color: $fallback--lightText;
color: var(--lightText, $fallback--lightText);
flex-wrap: wrap;
}
.user-count {
flex: 1 0 auto;
padding: .5em 0 .5em 0;
margin: 0 .5em;
h5 {
font-size:1em;
font-weight: bolder;
margin: 0 0 0.25em;
}
a {
text-decoration: none;
}
}

View file

@ -9,7 +9,10 @@
class="background-image" class="background-image"
/> />
<div class="panel-heading -flexible-height"> <div class="panel-heading -flexible-height">
<div class="user-info"> <div
class="user-info"
:class="{ '-compact': this.compactUserInfo }"
>
<div class="container"> <div class="container">
<a <a
v-if="allowZoomingAvatar" v-if="allowZoomingAvatar"
@ -29,6 +32,7 @@
</a> </a>
<router-link <router-link
v-else v-else
class="user-info-avatar-link"
:to="userProfileLink(user)" :to="userProfileLink(user)"
> >
<UserAvatar <UserAvatar
@ -36,14 +40,79 @@
:user="user" :user="user"
/> />
</router-link> </router-link>
<div class="user-summary">
<div class="top-line">
<RichContent <RichContent
:title="user.name" :title="user.name"
class="user-name" class="user-name"
:html="user.name" :html="user.name"
:emoji="user.emoji" :emoji="user.emoji"
/> />
<div class="user-summary">
<router-link
class="user-screen-name"
:title="user.screen_name_ui"
:to="userProfileLink(user)"
>
@{{ user.screen_name_ui }}
</router-link>
<span class="user-roles" v-if="!hideBio && (user.deactivated || !!visibleRole || user.bot)">
<span
v-if="user.deactivated"
class="alert user-role"
>
{{ $t('user_card.deactivated') }}
</span>
<span
v-if="!!visibleRole"
class="alert user-role"
>
{{ $t(`general.role.${visibleRole}`) }}
</span>
<span
v-if="user.bot"
class="alert user-role"
>
{{ $t('user_card.bot') }}
</span>
</span>
<span class="user-locked" v-if="user.locked">
<FAIcon
class="lock-icon"
icon="lock"
size="sm"
/>
</span>
<span
v-if="!mergedConfig.hideUserStats && !hideBio"
class="dailyAvg"
>{{ dailyAvg }} {{ $t('user_card.per_day') }}</span>
</div>
<div
v-if="!mergedConfig.hideUserStats && switcher"
class="user-counts"
>
<div
class="user-count"
@click.prevent="setProfileView('statuses')"
>
<h5>{{ $t('user_card.statuses') }}</h5>
<span>{{ user.statuses_count }} <br></span>
</div>
<div
class="user-count"
@click.prevent="setProfileView('friends')"
>
<h5>{{ $t('user_card.followees') }}</h5>
<span>{{ hideFollowsCount ? $t('user_card.hidden') : user.friends_count }}</span>
</div>
<div
class="user-count"
@click.prevent="setProfileView('followers')"
>
<h5>{{ $t('user_card.followers') }}</h5>
<span>{{ hideFollowersCount ? $t('user_card.hidden') : user.followers_count }}</span>
</div>
</div>
<div class="user-buttons">
<button <button
v-if="!isOtherUser && user.is_local" v-if="!isOtherUser && user.is_local"
class="button-unstyled edit-profile-button" class="button-unstyled edit-profile-button"
@ -84,47 +153,6 @@
:relationship="relationship" :relationship="relationship"
/> />
</div> </div>
<div class="bottom-line">
<router-link
class="user-screen-name"
:title="user.screen_name_ui"
:to="userProfileLink(user)"
>
@{{ user.screen_name_ui }}
</router-link>
<template v-if="!hideBio">
<span
v-if="user.deactivated"
class="alert user-role"
>
{{ $t('user_card.deactivated') }}
</span>
<span
v-if="!!visibleRole"
class="alert user-role"
>
{{ $t(`general.role.${visibleRole}`) }}
</span>
<span
v-if="user.bot"
class="alert user-role"
>
{{ $t('user_card.bot') }}
</span>
</template>
<span v-if="user.locked">
<FAIcon
class="lock-icon"
icon="lock"
size="sm"
/>
</span>
<span
v-if="!mergedConfig.hideUserStats && !hideBio"
class="dailyAvg"
>{{ dailyAvg }} {{ $t('user_card.per_day') }}</span>
</div>
</div>
</div> </div>
<div class="user-meta"> <div class="user-meta">
<div <div
@ -269,38 +297,13 @@
v-if="!hideBio" v-if="!hideBio"
class="panel-body" class="panel-body"
> >
<div
v-if="!mergedConfig.hideUserStats && switcher"
class="user-counts"
>
<div
class="user-count"
@click.prevent="setProfileView('statuses')"
>
<h5>{{ $t('user_card.statuses') }}</h5>
<span>{{ user.statuses_count }} <br></span>
</div>
<div
class="user-count"
@click.prevent="setProfileView('friends')"
>
<h5>{{ $t('user_card.followees') }}</h5>
<span>{{ hideFollowsCount ? $t('user_card.hidden') : user.friends_count }}</span>
</div>
<div
class="user-count"
@click.prevent="setProfileView('followers')"
>
<h5>{{ $t('user_card.followers') }}</h5>
<span>{{ hideFollowersCount ? $t('user_card.hidden') : user.followers_count }}</span>
</div>
</div>
<RichContent <RichContent
v-if="!hideBio" v-if="!hideBio"
class="user-card-bio" class="user-card-bio"
:html="user.description_html" :html="user.description_html"
:emoji="user.emoji" :emoji="user.emoji"
:handle-links="true" :handle-links="true"
:style='{"text-align": this.$store.getters.mergedConfig.centerAlignBio ? "center" : "start"}'
/> />
</div> </div>
<teleport to="#modal"> <teleport to="#modal">

View file

@ -4,10 +4,10 @@
placement="top" placement="top"
:offset="{ y: 5 }" :offset="{ y: 5 }"
> >
<template v-slot:trigger> <template #trigger>
<slot /> <slot />
</template> </template>
<template v-slot:content> <template #content>
<div class="user-list-popover"> <div class="user-list-popover">
<template v-if="users.length"> <template v-if="users.length">
<div <div

View file

@ -121,8 +121,8 @@
</FriendList> </FriendList>
</div> </div>
<div <div
key="tags"
v-if="isUs" v-if="isUs"
key="tags"
:label="$t('user_card.followed_tags')" :label="$t('user_card.followed_tags')"
> >
<FollowedTagList <FollowedTagList

View file

@ -1,7 +1,7 @@
<template> <template>
<Modal <Modal
v-if="isOpen" v-if="isOpen"
@backdropClicked="closeModal" @backdrop-clicked="closeModal"
> >
<div class="user-reporting-panel panel"> <div class="user-reporting-panel panel">
<div class="panel-heading"> <div class="panel-heading">
@ -45,7 +45,7 @@
</div> </div>
<div class="user-reporting-panel-right"> <div class="user-reporting-panel-right">
<List :items="statuses"> <List :items="statuses">
<template v-slot:item="{item}"> <template #item="{item}">
<div class="status-fadein user-reporting-panel-sitem"> <div class="status-fadein user-reporting-panel-sitem">
<Status <Status
:in-conversation="false" :in-conversation="false"

View file

@ -84,6 +84,7 @@
"keep_open": "Mantindre el selector obert", "keep_open": "Mantindre el selector obert",
"load_all": "Carregant tots els {emojiAmount} emoji", "load_all": "Carregant tots els {emojiAmount} emoji",
"load_all_hint": "Carregat el primer {saneAmount} emoji, carregar tots els emoji pot causar problemes de rendiment.", "load_all_hint": "Carregat el primer {saneAmount} emoji, carregar tots els emoji pot causar problemes de rendiment.",
"recent": "Recents",
"search_emoji": "Buscar un emoji", "search_emoji": "Buscar un emoji",
"stickers": "Adhesius", "stickers": "Adhesius",
"unicode": "Emojis unicode" "unicode": "Emojis unicode"
@ -254,6 +255,10 @@
"hint": "Entra per a participar en la conversa", "hint": "Entra per a participar en la conversa",
"login": "Inicia sessió", "login": "Inicia sessió",
"logout": "Tanca la sessió", "logout": "Tanca la sessió",
"logout_confirm": "Segur que vols tancar la sessió?",
"logout_confirm_accept_button": "Surt",
"logout_confirm_cancel_button": "Canceŀla",
"logout_confirm_title": "Tanca la sessió",
"password": "Contrasenya", "password": "Contrasenya",
"placeholder": "el meu nom d'usuari", "placeholder": "el meu nom d'usuari",
"recovery_code": "Codi de recuperació", "recovery_code": "Codi de recuperació",
@ -266,6 +271,32 @@
"next": "Següent", "next": "Següent",
"previous": "Anterior" "previous": "Anterior"
}, },
"moderation": {
"moderation": "Moderació",
"reports": {
"add_note": "Afegeix una nota",
"close": "Tanca",
"delete_note": "Esborra la nota",
"delete_note_accept": "Sí, esborra-la",
"delete_note_cancel": "No, conserva-la",
"delete_note_confirm": "Segur que vols esborrar aquesta nota?",
"delete_note_title": "Cal confirmació",
"no_content": "Sense descripció",
"no_reports": "No hi ha informes per mostrar",
"note_placeholder": "Deixa una nota",
"notes": "{ count } nota | { count } notes",
"reopen": "Reobre",
"report": "Denuncia-ho",
"reports": "Denúncies",
"resolve": "Resol",
"show_closed": "Mostra les tancades",
"statuses": "{ count } post| { count } posts",
"tag_policy_notice": "Activa la restricció de publicacions segons la TagPolicy MRF",
"tags": "Estableix restriccions a les publicacions"
},
"statuses": "Publicacions",
"users": "Usuàries"
},
"nav": { "nav": {
"about": "Quant a", "about": "Quant a",
"administration": "Administració", "administration": "Administració",
@ -282,6 +313,7 @@
"interactions": "Interaccions", "interactions": "Interaccions",
"lists": "Llistes", "lists": "Llistes",
"mentions": "Mencions", "mentions": "Mencions",
"moderation": "Moderació",
"preferences": "Preferències", "preferences": "Preferències",
"public_timeline_description": "Apunts públics des d'aquesta instància", "public_timeline_description": "Apunts públics des d'aquesta instància",
"public_tl": "Línia de temps Pública", "public_tl": "Línia de temps Pública",
@ -375,9 +407,12 @@
"private": "Aquest apunt serà visible només per els teus seguidors", "private": "Aquest apunt serà visible només per els teus seguidors",
"public": "Aquest apunt serà visible per a tothom", "public": "Aquest apunt serà visible per a tothom",
"unlisted": "Aquest apunt no es veurà ni a la Línia de temps Pública ni a Tota la Xarxa Coneguda" "unlisted": "Aquest apunt no es veurà ni a la Línia de temps Pública ni a Tota la Xarxa Coneguda"
} },
"toggle_content_warning": "Des/activa l'avís de contingut"
}, },
"registration": { "registration": {
"awaiting_email_confirmation": "S'ha registrat el teu compte i s'ha enviat un correu a la teva adreça. Consulta el correu per completar el registre.",
"awaiting_email_confirmation_title": "Pendent de confirmar l'adreça de correu",
"bio": "Bio", "bio": "Bio",
"bio_placeholder": "p.e.\nHola! Benvingut a la meva bio.\nM'encanta veure anime i jugar a jocs. Espero que podrem ser amics!", "bio_placeholder": "p.e.\nHola! Benvingut a la meva bio.\nM'encanta veure anime i jugar a jocs. Espero que podrem ser amics!",
"captcha": "CAPTCHA", "captcha": "CAPTCHA",
@ -391,6 +426,8 @@
"reason_placeholder": "Aquesta instància aprova els registres manualment.\nExplica a l'administració per què vols registrar-te.", "reason_placeholder": "Aquesta instància aprova els registres manualment.\nExplica a l'administració per què vols registrar-te.",
"register": "Registre", "register": "Registre",
"registration": "Registre", "registration": "Registre",
"request_sent": "La teva soŀlicitud de registre s'ha enviat. Rebràs un correu quan sigui aprovada.",
"request_sent_title": "Soŀlicitud de registre",
"token": "Codi d'invitació", "token": "Codi d'invitació",
"username_placeholder": "p. ex. akko", "username_placeholder": "p. ex. akko",
"validations": { "validations": {
@ -500,6 +537,8 @@
"enable_web_push_notifications": "Habilitar notificacions del navegador", "enable_web_push_notifications": "Habilitar notificacions del navegador",
"enter_current_password_to_confirm": "Posa la teva contrasenya actual per a confirmar la teva identitat", "enter_current_password_to_confirm": "Posa la teva contrasenya actual per a confirmar la teva identitat",
"expert_mode": "Mostra avançat", "expert_mode": "Mostra avançat",
"expire_posts_enabled": "Esborra les publicacions després d'un cert nombre de dies",
"expire_posts_input_placeholder": "Nombre de dies",
"export_theme": "Desa el tema", "export_theme": "Desa el tema",
"file_export_import": { "file_export_import": {
"backup_restore": "Còpia de seguretat de la configuració", "backup_restore": "Còpia de seguretat de la configuració",
@ -641,6 +680,7 @@
"pad_emoji": "Acompanya els emojis amb espais al afegir-los des del selector", "pad_emoji": "Acompanya els emojis amb espais al afegir-los des del selector",
"panelRadius": "Panells", "panelRadius": "Panells",
"pause_on_unfocused": "Pausa quan la pestanya perdi el focus", "pause_on_unfocused": "Pausa quan la pestanya perdi el focus",
"permit_followback_description": "Aprova automàticament les soŀlicituds de seguiment que vinguin d'usuàries que ja segueixes",
"play_videos_in_modal": "Reproduir vídeos en un marc emergent", "play_videos_in_modal": "Reproduir vídeos en un marc emergent",
"post_look_feel": "Aspecte i Sensació dels apunts", "post_look_feel": "Aspecte i Sensació dels apunts",
"post_status_content_type": "Tipus de contingut d'apunt predeterminat", "post_status_content_type": "Tipus de contingut d'apunt predeterminat",
@ -709,6 +749,7 @@
"show_admin_badge": "Mostra l'insígnia \"Administrador\" en el meu perfil", "show_admin_badge": "Mostra l'insígnia \"Administrador\" en el meu perfil",
"show_moderator_badge": "Mostra l'insígnia \"Moderador\" en el meu perfil", "show_moderator_badge": "Mostra l'insígnia \"Moderador\" en el meu perfil",
"show_nav_shortcuts": "Mostra els accessos directes addicionals en el panell superior", "show_nav_shortcuts": "Mostra els accessos directes addicionals en el panell superior",
"show_page_backgrounds": "Mostra fons de pantalla específics de pàgines, com en les pàgines de perfil d'usuari",
"show_panel_nav_shortcuts": "Mostra els accessos directes de navegació de la línia de temps en el panell superior", "show_panel_nav_shortcuts": "Mostra els accessos directes de navegació de la línia de temps en el panell superior",
"show_scrollbars": "Mostra les barres de desplaçament de la columna lateral", "show_scrollbars": "Mostra les barres de desplaçament de la columna lateral",
"show_wider_shortcuts": "Mostra més separats els accessos directes del panell superior", "show_wider_shortcuts": "Mostra més separats els accessos directes del panell superior",
@ -884,8 +925,13 @@
"upload_a_photo": "Pujar una foto", "upload_a_photo": "Pujar una foto",
"useStreamingApi": "Rebre apunts i notificacions en temps real", "useStreamingApi": "Rebre apunts i notificacions en temps real",
"useStreamingApiWarning": "És genial emprar-lo. Si es trenca, refresca, suposo?", "useStreamingApiWarning": "És genial emprar-lo. Si es trenca, refresca, suposo?",
"use_blurhash": "Fes borroses les miniatures d'imatges NSFW",
"use_contain_fit": "No retallar els adjunts en miniatures", "use_contain_fit": "No retallar els adjunts en miniatures",
"use_one_click_nsfw": "Obre els adjunts NSFW amb només un clic", "use_one_click_nsfw": "Obre els adjunts NSFW amb només un clic",
"user_accepts_direct_messages_from": "Accepta missatges directes de",
"user_accepts_direct_messages_from_everybody": "Qualsevol",
"user_accepts_direct_messages_from_nobody": "Ningú",
"user_accepts_direct_messages_from_people_i_follow": "Comptes que segueixo",
"user_mutes": "Usuaris", "user_mutes": "Usuaris",
"user_profile_default_tab": "Pestanya per defecte en el Perfil d'Usuari", "user_profile_default_tab": "Pestanya per defecte en el Perfil d'Usuari",
"user_profiles": "Perfils d'usuari", "user_profiles": "Perfils d'usuari",
@ -1008,6 +1054,7 @@
"collapse": "Replega", "collapse": "Replega",
"conversation": "Conversa", "conversation": "Conversa",
"error": "Error carregant la línia de temps: {0}", "error": "Error carregant la línia de temps: {0}",
"follow_tag": "Segueix l'etiqueta",
"load_older": "Carrega apunts anteriors", "load_older": "Carrega apunts anteriors",
"no_more_statuses": "No hi ha més apunts", "no_more_statuses": "No hi ha més apunts",
"no_retweet_hint": "L'apunt és només per a seguidors o és \"directe\" i no es pot repetir o citar", "no_retweet_hint": "L'apunt és només per a seguidors o és \"directe\" i no es pot repetir o citar",
@ -1017,6 +1064,7 @@
"show_new": "Mostra els nous", "show_new": "Mostra els nous",
"socket_broke": "Connexió a temps real perduda: codi CloseEvent {0}", "socket_broke": "Connexió a temps real perduda: codi CloseEvent {0}",
"socket_reconnected": "Connexió a temps real establerta", "socket_reconnected": "Connexió a temps real establerta",
"unfollow_tag": "Deixa de seguir l'etiqueta",
"up_to_date": "Actualitzat" "up_to_date": "Actualitzat"
}, },
"toast": { "toast": {
@ -1081,6 +1129,7 @@
"block_confirm_title": "Bloqueja l'usuari", "block_confirm_title": "Bloqueja l'usuari",
"block_progress": "Bloquejant…", "block_progress": "Bloquejant…",
"blocked": "Bloquejat!", "blocked": "Bloquejat!",
"blocks_you": "Et té bloquejadi!",
"bot": "Bot", "bot": "Bot",
"deactivated": "Desactivat", "deactivated": "Desactivat",
"deny": "Denega", "deny": "Denega",
@ -1095,7 +1144,10 @@
"follow_cancel": "Cancel·la la sol·licitud", "follow_cancel": "Cancel·la la sol·licitud",
"follow_progress": "Sol·licitant…", "follow_progress": "Sol·licitant…",
"follow_sent": "Petició enviada!", "follow_sent": "Petició enviada!",
"follow_tag": "Segueix l'etiqueta",
"follow_unfollow": "Deixa de seguir", "follow_unfollow": "Deixa de seguir",
"followed_tags": "Etiquetes que segueixes",
"followed_users": "Usuaris que segueixes",
"followees": "Seguint", "followees": "Seguint",
"followers": "Seguidors", "followers": "Seguidors",
"following": "Seguint!", "following": "Seguint!",
@ -1120,12 +1172,14 @@
"mute_domain": "Bloqueja el domini", "mute_domain": "Bloqueja el domini",
"mute_progress": "Silenciant…", "mute_progress": "Silenciant…",
"muted": "Silenciat", "muted": "Silenciat",
"not_following_any_hashtags": "No estàs seguint cap etiqueta",
"note": "Nota privada", "note": "Nota privada",
"per_day": "per dia", "per_day": "per dia",
"remote_follow": "Seguiment remot", "remote_follow": "Seguiment remot",
"remove_follower": "Esborra seguidor", "remove_follower": "Esborra seguidor",
"replies": "Amb respostes", "replies": "Amb respostes",
"report": "Informa", "report": "Informa",
"requested_by": "Et vol seguir",
"show_repeats": "Mostra les repeticions", "show_repeats": "Mostra les repeticions",
"statuses": "Apunts", "statuses": "Apunts",
"subscribe": "Subscriu-te", "subscribe": "Subscriu-te",
@ -1135,11 +1189,13 @@
"unfollow_confirm_accept_button": "Sí, deixa'l de seguir", "unfollow_confirm_accept_button": "Sí, deixa'l de seguir",
"unfollow_confirm_cancel_button": "No, no el deixis de seguir", "unfollow_confirm_cancel_button": "No, no el deixis de seguir",
"unfollow_confirm_title": "Deixa de seguir l'usuari", "unfollow_confirm_title": "Deixa de seguir l'usuari",
"unfollow_tag": "Deixa de seguir l'etiqueta",
"unmute": "Deixa de silenciar", "unmute": "Deixa de silenciar",
"unmute_progress": "Deixant de silenciar…", "unmute_progress": "Deixant de silenciar…",
"unsubscribe": "Anul·la la subscripció" "unsubscribe": "Anul·la la subscripció"
}, },
"user_profile": { "user_profile": {
"field_validated": "Enllaç verificat",
"profile_does_not_exist": "Disculpes, aquest perfil no existeix.", "profile_does_not_exist": "Disculpes, aquest perfil no existeix.",
"profile_loading_error": "Disculpes, hi ha hagut un error carregant aquest perfil.", "profile_loading_error": "Disculpes, hi ha hagut un error carregant aquest perfil.",
"timeline_title": "Línia de temps del usuari" "timeline_title": "Línia de temps del usuari"

View file

@ -482,6 +482,7 @@
"blocks_tab": "Blocks", "blocks_tab": "Blocks",
"bot": "Dies ist ein Bot Account", "bot": "Dies ist ein Bot Account",
"btnRadius": "Knöpfe", "btnRadius": "Knöpfe",
"center_align_bio": "Zentrale Textausrichtung in der Bio",
"cBlue": "Blau (Antworten, folgt dir)", "cBlue": "Blau (Antworten, folgt dir)",
"cGreen": "Grün (Retweet)", "cGreen": "Grün (Retweet)",
"cOrange": "Orange (Favorisieren)", "cOrange": "Orange (Favorisieren)",
@ -496,6 +497,7 @@
"checkboxRadius": "Auswahlfelder", "checkboxRadius": "Auswahlfelder",
"collapse_subject": "Beiträge mit Inhaltswarnungen einklappen", "collapse_subject": "Beiträge mit Inhaltswarnungen einklappen",
"columns": "Spalten", "columns": "Spalten",
"compact_user_info": "Kompakte Benutzerinfos wenn genug Platz",
"composing": "Verfassen", "composing": "Verfassen",
"confirm_dialogs": "Bestätigung erforderlich für:", "confirm_dialogs": "Bestätigung erforderlich für:",
"confirm_dialogs_approve_follow": "Annehmen einer Followanfrage", "confirm_dialogs_approve_follow": "Annehmen einer Followanfrage",
@ -934,6 +936,7 @@
"title": "Version" "title": "Version"
}, },
"virtual_scrolling": "Anzeige der Zeitleiste optimieren", "virtual_scrolling": "Anzeige der Zeitleiste optimieren",
"widen_timeline": "Zeitleiste verbreitern, um horizontalen Platz zu füllen",
"word_filter": "Wortfilter", "word_filter": "Wortfilter",
"wordfilter": "Wortfilter" "wordfilter": "Wortfilter"
}, },

View file

@ -488,6 +488,7 @@
"blocks_tab": "Blocks", "blocks_tab": "Blocks",
"bot": "This is a bot account", "bot": "This is a bot account",
"btnRadius": "Buttons", "btnRadius": "Buttons",
"center_align_bio": "Center text in user bio",
"cBlue": "Blue (Reply, follow)", "cBlue": "Blue (Reply, follow)",
"cGreen": "Green (Retweet)", "cGreen": "Green (Retweet)",
"cOrange": "Orange (Favorite)", "cOrange": "Orange (Favorite)",
@ -502,6 +503,7 @@
"checkboxRadius": "Checkboxes", "checkboxRadius": "Checkboxes",
"collapse_subject": "Collapse posts with content warnings", "collapse_subject": "Collapse posts with content warnings",
"columns": "Columns", "columns": "Columns",
"compact_user_info": "Compact user info when enough space",
"composing": "Composing", "composing": "Composing",
"confirm_dialogs": "Require confirmation for:", "confirm_dialogs": "Require confirmation for:",
"confirm_dialogs_approve_follow": "Accepting a follow request", "confirm_dialogs_approve_follow": "Accepting a follow request",
@ -684,6 +686,7 @@
"play_videos_in_modal": "Play videos in a popup frame", "play_videos_in_modal": "Play videos in a popup frame",
"post_look_feel": "Posts Look & Feel", "post_look_feel": "Posts Look & Feel",
"post_status_content_type": "Default post content type", "post_status_content_type": "Default post content type",
"post_language": "Default post language",
"posts": "Posts", "posts": "Posts",
"preload_images": "Preload images", "preload_images": "Preload images",
"presets": "Presets", "presets": "Presets",
@ -947,6 +950,7 @@
}, },
"virtual_scrolling": "Optimize timeline rendering", "virtual_scrolling": "Optimize timeline rendering",
"use_blurhash": "Use blurhashes for NSFW thumbnails", "use_blurhash": "Use blurhashes for NSFW thumbnails",
"widen_timeline": "Widen the Timeline to fill horizontal space",
"word_filter": "Word filter", "word_filter": "Word filter",
"wordfilter": "Wordfilter" "wordfilter": "Wordfilter"
}, },

View file

@ -303,7 +303,7 @@
"announcements": "Anuncios", "announcements": "Anuncios",
"back": "Volver", "back": "Volver",
"bookmarks": "Marcadores", "bookmarks": "Marcadores",
"bubble_timeline": "Linea temporal burbuja", "bubble_timeline": "Línea temporal burbuja",
"bubble_timeline_description": "Publicaciones de instancias cercanas a la tuya, recomendadas por los/las administradores/as", "bubble_timeline_description": "Publicaciones de instancias cercanas a la tuya, recomendadas por los/las administradores/as",
"chats": "Chats", "chats": "Chats",
"dms": "Mensajes directos", "dms": "Mensajes directos",

View file

@ -503,7 +503,13 @@
"columns": "Colonne", "columns": "Colonne",
"composing": "Composizione", "composing": "Composizione",
"confirm_new_password": "Conferma la nuova password", "confirm_new_password": "Conferma la nuova password",
"conversation_display": "Stile di visualizzazione delle conversazioni",
"conversation_display_linear": "Stile lineare",
"conversation_display_tree": "Stile ad albero",
"conversation_other_replies_button": "Mostra il bottone \"altre risposte\"",
"conversation_other_replies_button_below": "Sotto i post",
"current_avatar": "La tua icona attuale", "current_avatar": "La tua icona attuale",
"current_mascot": "La tua mascotte attuale",
"current_password": "La tua password attuale", "current_password": "La tua password attuale",
"data_import_export_tab": "Importa o esporta dati", "data_import_export_tab": "Importa o esporta dati",
"default_vis": "Visibilità predefinita dei messaggi", "default_vis": "Visibilità predefinita dei messaggi",
@ -511,11 +517,15 @@
"delete_account_description": "Elimina definitivamente i tuoi dati e disattiva il tuo profilo.", "delete_account_description": "Elimina definitivamente i tuoi dati e disattiva il tuo profilo.",
"delete_account_error": "C'è stato un problema durante l'eliminazione del tuo profilo. Se il problema persiste contatta l'amministratore della tua stanza.", "delete_account_error": "C'è stato un problema durante l'eliminazione del tuo profilo. Se il problema persiste contatta l'amministratore della tua stanza.",
"delete_account_instructions": "Digita la tua password nel campo sottostante per eliminare il tuo profilo.", "delete_account_instructions": "Digita la tua password nel campo sottostante per eliminare il tuo profilo.",
"disable_sticky_headers": "Non fissare i titoli delle colonne in cima allo schermo",
"discoverable": "Permetti la scoperta di questo profilo a servizi di ricerca ed altro", "discoverable": "Permetti la scoperta di questo profilo a servizi di ricerca ed altro",
"domain_mutes": "Domini", "domain_mutes": "Domini",
"download_backup": "Scarica",
"email_language": "Lingua delle email ricevute dal server",
"emoji_reactions_on_timeline": "Mostra reazioni nelle sequenze", "emoji_reactions_on_timeline": "Mostra reazioni nelle sequenze",
"enable_web_push_notifications": "Abilita notifiche web push", "enable_web_push_notifications": "Abilita notifiche web push",
"enter_current_password_to_confirm": "Inserisci la tua password per identificarti", "enter_current_password_to_confirm": "Inserisci la tua password per identificarti",
"expert_mode": "Mostra avanzate",
"export_theme": "Salva impostazioni", "export_theme": "Salva impostazioni",
"file_export_import": { "file_export_import": {
"backup_restore": "Archiviazione impostazioni", "backup_restore": "Archiviazione impostazioni",
@ -543,18 +553,23 @@
"hide_all_muted_posts": "Nascondi messaggi silenziati", "hide_all_muted_posts": "Nascondi messaggi silenziati",
"hide_attachments_in_convo": "Nascondi gli allegati presenti nelle conversazioni", "hide_attachments_in_convo": "Nascondi gli allegati presenti nelle conversazioni",
"hide_attachments_in_tl": "Nascondi gli allegati presenti nelle sequenze", "hide_attachments_in_tl": "Nascondi gli allegati presenti nelle sequenze",
"hide_bot_indication": "Nascondi indicatore bot nei post",
"hide_favorites_description": "Non mostrare la lista dei miei preferiti (gli utenti verranno comunque notificati)",
"hide_filtered_statuses": "Nascondi messaggi filtrati", "hide_filtered_statuses": "Nascondi messaggi filtrati",
"hide_followers_count_description": "Non mostrare quanti seguaci ho", "hide_followers_count_description": "Non mostrare quanti seguaci ho",
"hide_followers_description": "Non mostrare i miei seguaci", "hide_followers_description": "Non mostrare i miei seguaci",
"hide_follows_count_description": "Non mostrare quanti utenti seguo", "hide_follows_count_description": "Non mostrare quanti utenti seguo",
"hide_follows_description": "Non mostrare chi seguo", "hide_follows_description": "Non mostrare chi seguo",
"hide_isp": "Nascondi pannello della stanza", "hide_isp": "Nascondi pannello della stanza",
"hide_list_aliases_error_action": "Chiudi",
"hide_media_previews": "Nascondi anteprime", "hide_media_previews": "Nascondi anteprime",
"hide_muted_posts": "Nascondi messaggi degli utenti silenziati", "hide_muted_posts": "Nascondi messaggi degli utenti silenziati",
"hide_muted_threads": "Nascondi conversazioni silenziate",
"hide_post_stats": "Nascondi statistiche dei messaggi (es. il numero di preferenze)", "hide_post_stats": "Nascondi statistiche dei messaggi (es. il numero di preferenze)",
"hide_shoutbox": "Nascondi muro dei graffiti", "hide_shoutbox": "Nascondi muro dei graffiti",
"hide_user_stats": "Nascondi statistiche dell'utente (es. il numero di seguaci)", "hide_user_stats": "Nascondi statistiche dell'utente (es. il numero di seguaci)",
"hide_wallpaper": "Nascondi sfondo della stanza", "hide_wallpaper": "Nascondi sfondo della stanza",
"hide_wordfiltered_statuses": "Nascondi post filtrati per parola",
"import_blocks_from_a_csv_file": "Importa blocchi da un file CSV", "import_blocks_from_a_csv_file": "Importa blocchi da un file CSV",
"import_followers_from_a_csv_file": "Importa una lista di chi segui da un file CSV", "import_followers_from_a_csv_file": "Importa una lista di chi segui da un file CSV",
"import_mutes_from_a_csv_file": "Importa silenziati da un file CSV", "import_mutes_from_a_csv_file": "Importa silenziati da un file CSV",
@ -567,10 +582,14 @@
"invalid_theme_imported": "Il file selezionato non è un tema supportato da Pleroma. Il tuo tema non è stato modificato.", "invalid_theme_imported": "Il file selezionato non è un tema supportato da Pleroma. Il tuo tema non è stato modificato.",
"limited_availability": "Non disponibile nel tuo browser", "limited_availability": "Non disponibile nel tuo browser",
"links": "Collegamenti", "links": "Collegamenti",
"list_aliases_error": "Errore nel recupero degli alias: {error}",
"list_backups_error": "Errore nel recupero della lista dei backup: {error}",
"lock_account_description": "Vaglia manualmente i nuovi seguaci", "lock_account_description": "Vaglia manualmente i nuovi seguaci",
"loop_video": "Riproduci video in ciclo continuo", "loop_video": "Riproduci video in ciclo continuo",
"loop_video_silent_only": "Riproduci solo video muti in ciclo continuo (es. le \"gif\" di Mastodon)", "loop_video_silent_only": "Riproduci solo video muti in ciclo continuo (es. le \"gif\" di Mastodon)",
"mascot": "Mascotte di MastodonFE",
"max_thumbnails": "Numero massimo di anteprime per messaggio", "max_thumbnails": "Numero massimo di anteprime per messaggio",
"mention_links": "Collegamenti delle menzioni",
"mfa": { "mfa": {
"authentication_methods": "Metodi di accesso", "authentication_methods": "Metodi di accesso",
"confirm_and_enable": "Conferma ed abilita OTP", "confirm_and_enable": "Conferma ed abilita OTP",
@ -594,6 +613,12 @@
}, },
"minimal_scopes_mode": "Riduci opzioni di visibilità", "minimal_scopes_mode": "Riduci opzioni di visibilità",
"more_settings": "Altre impostazioni", "more_settings": "Altre impostazioni",
"move_account": "Sposta account",
"move_account_error": "Errore nello spostamento dell'account: {error}",
"move_account_notes": "Se vuoi spostare questo account da qualche altra parte, devi andare all'account di destinazione e aggiungere un alias che punta qui.",
"move_account_target": "Account di destinazione (es. {example})",
"moved_account": "Account spostato.",
"mute_bot_posts": "Silenzia post dei bot",
"mute_export": "Esporta silenziati", "mute_export": "Esporta silenziati",
"mute_export_button": "Esporta i silenziati in un file CSV", "mute_export_button": "Esporta i silenziati in un file CSV",
"mute_import": "Carica silenziati", "mute_import": "Carica silenziati",
@ -603,6 +628,7 @@
"mutes_tab": "Silenziati", "mutes_tab": "Silenziati",
"name": "Nome", "name": "Nome",
"name_bio": "Nome ed introduzione", "name_bio": "Nome ed introduzione",
"new_alias_target": "Aggiungi nuovo alias (es. {example})",
"new_email": "Nuova email", "new_email": "Nuova email",
"new_password": "Nuova password", "new_password": "Nuova password",
"no_blocks": "Nessun utente bloccato", "no_blocks": "Nessun utente bloccato",
@ -620,6 +646,7 @@
"notification_visibility_likes": "Preferiti", "notification_visibility_likes": "Preferiti",
"notification_visibility_mentions": "Menzioni", "notification_visibility_mentions": "Menzioni",
"notification_visibility_moves": "Migrazioni utenti", "notification_visibility_moves": "Migrazioni utenti",
"notification_visibility_polls": "Termine dei poll in cui hai votato",
"notification_visibility_repeats": "Condivisioni", "notification_visibility_repeats": "Condivisioni",
"notifications": "Notifiche", "notifications": "Notifiche",
"nsfw_clickthrough": "Fai click per visualizzare gli allegati offuscati", "nsfw_clickthrough": "Fai click per visualizzare gli allegati offuscati",
@ -628,7 +655,9 @@
"panelRadius": "Pannelli", "panelRadius": "Pannelli",
"pause_on_unfocused": "Interrompi l'aggiornamento continuo mentre la scheda è in secondo piano", "pause_on_unfocused": "Interrompi l'aggiornamento continuo mentre la scheda è in secondo piano",
"play_videos_in_modal": "Riproduci video in un riquadro a sbalzo", "play_videos_in_modal": "Riproduci video in un riquadro a sbalzo",
"post_look_feel": "Aspetto dei post",
"post_status_content_type": "Tipo di contenuto dei messaggi", "post_status_content_type": "Tipo di contenuto dei messaggi",
"posts": "Post",
"preload_images": "Precarica immagini", "preload_images": "Precarica immagini",
"presets": "Valori predefiniti", "presets": "Valori predefiniti",
"profile_background": "Sfondo del tuo profilo", "profile_background": "Sfondo del tuo profilo",
@ -642,6 +671,8 @@
"profile_tab": "Profilo", "profile_tab": "Profilo",
"radii_help": "Imposta il raggio degli angoli (in pixel)", "radii_help": "Imposta il raggio degli angoli (in pixel)",
"refresh_token": "Aggiorna token", "refresh_token": "Aggiorna token",
"remove_alias": "Rimuovi questo alias",
"remove_backup": "Elimina",
"replies_in_timeline": "Risposte nelle sequenze", "replies_in_timeline": "Risposte nelle sequenze",
"reply_visibility_all": "Mostra tutte le risposte", "reply_visibility_all": "Mostra tutte le risposte",
"reply_visibility_following": "Mostra solo le risposte rivolte a me o agli utenti che seguo", "reply_visibility_following": "Mostra solo le risposte rivolte a me o agli utenti che seguo",
@ -666,12 +697,15 @@
"security_tab": "Sicurezza", "security_tab": "Sicurezza",
"sensitive_by_default": "Tutti i miei messaggi sono scabrosi", "sensitive_by_default": "Tutti i miei messaggi sono scabrosi",
"set_new_avatar": "Scegli una nuova icona", "set_new_avatar": "Scegli una nuova icona",
"set_new_mascot": "Imposta nuova mascotte",
"set_new_profile_background": "Scegli un nuovo sfondo", "set_new_profile_background": "Scegli un nuovo sfondo",
"set_new_profile_banner": "Scegli un nuovo gonfalone", "set_new_profile_banner": "Scegli un nuovo gonfalone",
"setting_changed": "Valore personalizzato", "setting_changed": "Valore personalizzato",
"setting_server_side": "Questa impostazione è legata al tuo profilo e ha effetto su tutte le sessioni e tutti i client",
"settings": "Impostazioni", "settings": "Impostazioni",
"show_admin_badge": "Mostra l'insegna di amministratore sul mio profilo", "show_admin_badge": "Mostra l'insegna di amministratore sul mio profilo",
"show_moderator_badge": "Mostra l'insegna di moderatore sul mio profilo", "show_moderator_badge": "Mostra l'insegna di moderatore sul mio profilo",
"show_scrollbars": "Mostra le barre di scorrimento delle colonne laterali",
"stop_gifs": "Riproduci GIF al passaggio del cursore", "stop_gifs": "Riproduci GIF al passaggio del cursore",
"streaming": "Mostra automaticamente i nuovi messaggi quando sei in cima alla pagina", "streaming": "Mostra automaticamente i nuovi messaggi quando sei in cima alla pagina",
"style": { "style": {
@ -780,66 +814,80 @@
}, },
"filter_hint": { "filter_hint": {
"always_drop_shadow": "Attenzione: quest'ombra usa sempre {0} se il tuo browser lo supporta.", "always_drop_shadow": "Attenzione: quest'ombra usa sempre {0} se il tuo browser lo supporta.",
"avatar_inset": "Tieni presente che combinare ombre (sia incluse che non) sulle icone utente potrebbe dare risultati strani con quelle trasparenti.", "avatar_inset": "Tieni presente che combinare ombre (sia incavate che non) sulle icone utente potrebbe dare risultati strani con avatar trasparenti.",
"drop_shadow_syntax": "{0} non supporta il parametro {1} né la keyword {2}.", "drop_shadow_syntax": "{0} non supporta il parametro {1} con la keyword {2}.",
"inset_classic": "Le ombre incluse usano {0}", "inset_classic": "Le ombre incavate usano {0}",
"spread_zero": "Lo spandimento maggiore di zero si azzera sulle ombre" "spread_zero": "Le ombre con espansione maggiore di zero appariranno come se l'espansione fosse zero"
}, },
"hintV3": "Per le ombre puoi anche usare la sintassi {0} per sfruttare il secondo colore.", "hintV3": "Per le ombre puoi anche usare la sintassi {0} per usare l'altro slot colore.",
"inset": "Includi", "inset": "Incavatura",
"override": "Sostituisci", "override": "Sovrascrivi",
"shadow_id": "Ombra numero {value}", "shadow_id": "Ombra #{value}",
"spread": "Spandi" "spread": "Espansione"
}, },
"switcher": { "switcher": {
"clear_all": "Azzera tutto", "clear_all": "Azzera tutto",
"clear_opacity": "Rimuovi opacità", "clear_opacity": "Azzera opacità",
"help": { "help": {
"fe_downgraded": "L'interfaccia è stata portata ad una versione precedente.", "fe_downgraded": "La versione di PleromaFE è riportata ad una versione precedente.",
"fe_upgraded": "Lo schema dei temi è stato aggiornato insieme all'interfaccia.", "fe_upgraded": "Il motore dei temi di PleromaFE è stato aggiornato insieme all'interfaccia.",
"future_version_imported": "Il tema importato è stato creato per una versione più recente dell'interfaccia.", "future_version_imported": "Il tema importato è stato creato per una versione più nuova del frontend.",
"migration_napshot_gone": "Anteprima del tema non trovata, non tutto potrebbe essere come ricordi.", "migration_napshot_gone": "Per qualche motivo non è stata trovata l'anteprima del tema, non tutto potrebbe essere come ricordi.",
"migration_snapshot_ok": "Ho caricato l'anteprima del tema. Puoi provare a caricarne i contenuti.", "migration_snapshot_ok": "Per sicurezza, è stata caricata l'anteprima del tema. Puoi provare a caricarne i contenuti.",
"older_version_imported": "Il tema importato è stato creato per una versione precedente dell'interfaccia.", "older_version_imported": "Il file importato è stato creato per una versione precedente del frontend.",
"snapshot_missing": "Il tema non è provvisto di anteprima, quindi potrebbe essere diverso da come appare.", "snapshot_missing": "Il file non è provvisto di anteprima, quindi potrebbe essere diverso da come appare.",
"snapshot_present": "Tutti i valori sono sostituiti dall'anteprima del tema. Puoi invece caricare i suoi contenuti.", "snapshot_present": "Tutti i valori sono sostituiti dall'anteprima del tema. Puoi invece caricare i suoi contenuti.",
"snapshot_source_mismatch": "Conflitto di versione: probabilmente l'interfaccia è stata portata indietro e poi aggiornata di nuovo. Se hai modificato il tema con una vecchia versione usa il tema precedente, altrimenti puoi usare il nuovo.", "snapshot_source_mismatch": "Conflitto di versione: probabilmente il frontend è stato deaggiornato e poi aggiornato di nuovo. Se hai modificato il tema con una vecchia versione usa il tema precedente, altrimenti usa quello nuovo.",
"upgraded_from_v2": "L'interfaccia è stata aggiornata, il tema potrebbe essere diverso da come lo ricordi.", "upgraded_from_v2": "PleromaFE è stato aggiornato, il tema potrebbe essere un pochino diverso da come lo ricordi.",
"v2_imported": "Il tema importato è stato creato per una vecchia interfaccia. Non tutto potrebbe essere come inteso." "v2_imported": "Il file importato è stato creato per un vecchio frontend. Cerchiamo di massimizzare la compatibilità, ma potrebbero esserci inconsistenze."
}, },
"keep_as_is": "Mantieni tal quale", "keep_as_is": "Mantieni com'è",
"keep_color": "Mantieni colori", "keep_color": "Mantieni colori",
"keep_fonts": "Mantieni font", "keep_fonts": "Mantieni font",
"keep_opacity": "Mantieni opacità", "keep_opacity": "Mantieni opacità",
"keep_roundness": "Mantieni vertici", "keep_roundness": "Mantieni vertici",
"keep_shadows": "Mantieni ombre", "keep_shadows": "Mantieni ombre",
"load_theme": "Carica tema", "load_theme": "Carica tema",
"reset": "Reimposta", "reset": "Azzera",
"save_load_hint": "Le opzioni \"mantieni\" conservano le impostazioni correnti quando selezioni o carichi un tema, e le salvano quando ne esporti uno. Quando nessuna casella è selezionata, tutte le impostazioni correnti saranno salvate nel tema.", "save_load_hint": "Le opzioni \"mantieni\" conservano le impostazioni correnti quando selezioni o carichi un tema, e le salvano quando ne esporti uno. Quando nessuna casella è selezionata, tutte le impostazioni correnti saranno salvate nel tema.",
"use_snapshot": "Versione precedente", "use_snapshot": "Versione precedente",
"use_source": "Nuova versione" "use_source": "Nuova versione"
} }
}, },
"subject_input_always_show": "Mostra sempre il campo Oggetto", "subject_input_always_show": "Mostra sempre il campo avvertenza sul contenuto",
"subject_line_behavior": "Copia oggetto quando rispondi", "subject_line_behavior": "Copia avvertenza sul contenuto quando rispondi",
"subject_line_email": "Come nelle email: \"re: oggetto\"", "subject_line_email": "Come nelle email: \"re: avvertenza\"",
"subject_line_mastodon": "Come in Mastodon: copia tal quale", "subject_line_mastodon": "Come su Mastodon: copia com'è",
"subject_line_noop": "Non copiare", "subject_line_noop": "Non copiare",
"text": "Testo", "text": "Testo",
"theme": "Tema", "theme": "Tema",
"theme_help": "Usa colori esadecimali (#rrggbb) per personalizzare il tuo schema di colori.", "theme_help": "Usa colori esadecimali (#rrvvbb) per personalizzare il tuo tema colori.",
"theme_help_v2_1": "Puoi anche forzare colore ed opacità di alcuni elementi selezionando la casella. Usa il pulsante \"Azzera\" per azzerare tutte le forzature.", "theme_help_v2_1": "Puoi anche sovrascrivere colore ed opacità di alcuni elementi spuntando la casella. Usa il pulsante \"Azzera\" per azzerare tutte le sovrascritture.",
"theme_help_v2_2": "Le icone vicino alcuni elementi sono indicatori del contrasto fra testo e sfondo, passaci sopra col puntatore per ulteriori informazioni. Se usani trasparenze, questi indicatori mostrano il peggior caso possibile.", "theme_help_v2_2": "Le icone vicino alcuni elementi sono indicatori del contrasto fra testo e sfondo, passaci sopra col puntatore per ulteriori informazioni. Se usano la trasparenza, questi indicatori mostrano come sarebbero nel peggior caso possibile.",
"third_column_mode": "Quando c'è abbastanza spazio, mostra una terza colonna contenente",
"third_column_mode_none": "Non mostrare proprio la terza colonna",
"third_column_mode_notifications": "Colonna notifiche",
"third_column_mode_postform": "Modulo post principale e navigazione",
"token": "Token", "token": "Token",
"tooltipRadius": "Suggerimenti/avvisi", "tooltipRadius": "Suggerimenti/allerte",
"translation_language": "Lingua finale di traduzione automatica",
"tree_advanced": "Mostra bottoni aggiuntivi per aprire e chiudere catene di risposte nelle conversazioni",
"tree_fade_ancestors": "Mostra antenati del post corrente in testo semitrasparente",
"type_domains_to_mute": "Cerca domini da silenziare", "type_domains_to_mute": "Cerca domini da silenziare",
"upload_a_photo": "Carica un'immagine", "upload_a_photo": "Carica una foto",
"useStreamingApi": "Ricevi messaggi e notifiche in tempo reale", "useStreamingApi": "Ricevi messaggi e notifiche in tempo reale",
"useStreamingApiWarning": "(Sconsigliato, sperimentale, può saltare messaggi)", "useStreamingApiWarning": "",
"use_blurhash": "Usa blurhash per anteprime NSFW",
"use_contain_fit": "Non ritagliare le anteprime degli allegati", "use_contain_fit": "Non ritagliare le anteprime degli allegati",
"use_one_click_nsfw": "Apri media offuscati con un solo click", "use_one_click_nsfw": "Apri allegati NSFW con un solo click",
"user_accepts_direct_messages_from": "Accetta post «diretti» da",
"user_accepts_direct_messages_from_everybody": "Tutti",
"user_accepts_direct_messages_from_nobody": "Nessuno",
"user_accepts_direct_messages_from_people_i_follow": "Persone che seguo",
"user_mutes": "Utenti", "user_mutes": "Utenti",
"user_settings": "Impostazioni Utente", "user_profile_default_tab": "Scheda predefinita sul profilo degli utenti",
"user_profiles": "Profili utente",
"user_settings": "Impostazioni utente",
"valid_until": "Valido fino a", "valid_until": "Valido fino a",
"values": { "values": {
"false": "no", "false": "no",
@ -847,86 +895,141 @@
}, },
"version": { "version": {
"backend_version": "Versione backend", "backend_version": "Versione backend",
"frontend_version": "Versione interfaccia", "frontend_version": "Versione frontend",
"title": "Versione" "title": "Versione"
}, },
"virtual_scrolling": "Velocizza l'elaborazione delle sequenze", "virtual_scrolling": "Velocizza rendering sequenze",
"word_filter": "Parole filtrate" "word_filter": "Filtro per parola",
"wordfilter": "Filtro per parola"
},
"settings_profile": {
"creating": "Creazione del nuovo profilo di impostazioni \"{profile}\"…",
"synchronization_error": "Non è stato possibile sincronizzare le impostazioni: {err}",
"synchronized": "Impostazioni sincronizzate!",
"synchronizing": "Sincronizzazione del profilo di impostazioni \"{profile}\"…"
}, },
"status": { "status": {
"ancestor_follow": "Vedi {numReplies} altra risposta sotto questo post | Vedi {numReplies} altre risposte sotto questo post",
"ancestor_follow_with_icon": "{icon} {text}",
"attachment_stop_flash": "Ferma Flash player",
"bookmark": "Aggiungi segnalibro", "bookmark": "Aggiungi segnalibro",
"copy_link": "Copia collegamento", "collapse_attachments": "Riduci allegati",
"delete": "Elimina messaggio", "copy_link": "Copia collegamento al post",
"delete_confirm": "Vuoi veramente eliminare questo messaggio?", "delete": "Elimina post",
"delete_confirm": "Vuoi davvero eliminare questo post?",
"delete_confirm_accept_button": "Sì, eliminalo",
"delete_confirm_cancel_button": "No, tienilo",
"delete_confirm_title": "Conferma eliminazione",
"edit": "Modifica",
"edit_history": "Cronologia modifiche",
"edit_history_modal_title": "Modificato {historyCount} volta | Modificato {historyCount} volte",
"edited_at": "Modificato {time}",
"expand": "Espandi", "expand": "Espandi",
"external_source": "Vai all'origine", "external_source": "Fonte originale",
"favorites": "Preferiti", "favorites": "Preferiti",
"hide_content": "Nascondi contenuti", "hide_attachment": "Nascondi allegato",
"hide_full_subject": "Nascondi oggetto intero", "hide_content": "Nascondi contenuto",
"hide_full_subject": "Nascondi avvertenza sul contenuto intera",
"many_attachments": "Il post ha {number} allegato | Il post ha {number} allegati",
"mentions": "Menzioni", "mentions": "Menzioni",
"move_down": "Muovi allegato a destra",
"move_up": "Muovi allegato a sinistra",
"mute_conversation": "Silenzia conversazione", "mute_conversation": "Silenzia conversazione",
"nsfw": "DISDICEVOLE", "nsfw": "NSFW",
"pin": "Intesta al profilo", "open_gallery": "Apri galleria",
"pinned": "Intestato", "override_translation_source_language": "Sovrascrivi lingua di origine",
"pin": "Fissa in cima al profilo",
"pinned": "Fissato",
"plus_more": "+{number} altri", "plus_more": "+{number} altri",
"repeats": "Condivisi", "redraft": "Elimina e correggi",
"redraft_confirm": "Vuoi davvero eliminare e correggere questo post? Le interazioni al post originale non saranno mantenute.",
"redraft_confirm_accept_button": "Sì, elimina e correggi",
"redraft_confirm_cancel_button": "No, tieni l'originale",
"redraft_confirm_title": "Conferma elimina e correggi",
"remove_attachment": "Rimuovi allegato",
"repeat_confirm": "Vuoi davvero condividere questo post?",
"repeat_confirm_accept_button": "Sì, condividilo",
"repeat_confirm_cancel_button": "No, non condividere",
"repeat_confirm_title": "Conferma condivisione",
"repeats": "Condivisioni",
"replies_list": "Risposte:", "replies_list": "Risposte:",
"replies_list_with_others": "Mostra {numReplies} altra risposta | Mostra {numReplies} altre risposte",
"reply_to": "In risposta a", "reply_to": "In risposta a",
"show_content": "Mostra contenuti", "show_all_attachments": "Mostra tutti gli allegati",
"show_full_subject": "Mostra oggetto intero", "show_all_conversation": "Mostra conversazione intera ({numStatus} altro post) | Mostra conversazione intera ({numStatus} altri post)",
"status_deleted": "Questo messagio è stato cancellato", "show_all_conversation_with_icon": "{icon} {text}",
"status_unavailable": "Messaggio non disponibile", "show_attachment_description": "Anteprima descrizione (apri l'allegato per la descrizione intera)",
"thread_muted": "Discussione silenziata", "show_attachment_in_modal": "Mostra allegato in una finestra",
"show_content": "Mostra contenuto",
"show_full_subject": "Mostra tutta l'avvertenza sul contenuto",
"show_only_conversation_under_this": "Mostra solo le risposte a questo post",
"status_deleted": "Questo post è stato eliminato",
"status_unavailable": "Post non disponibile",
"thread_follow": "Visualizza {numStatus} altra risposta | Visualizza {numStatus} altre risposte",
"thread_follow_with_icon": "{icon} {text}",
"thread_hide": "Nascondi questa conversazione",
"thread_muted": "Conversazione silenziata",
"thread_muted_and_words": ", contiene:", "thread_muted_and_words": ", contiene:",
"thread_show": "Mostra questa conversazione",
"thread_show_full": "Mostra {numStatus} risposta | Mostra tutte e {numStatus} le risposte",
"thread_show_full_with_icon": "{icon} {text}",
"translate": "Traduci",
"translated_from": "Tradotto da {language}",
"unbookmark": "Rimuovi segnalibro", "unbookmark": "Rimuovi segnalibro",
"unmute_conversation": "Riabilita conversazione", "unmute_conversation": "Desilenzia conversazione",
"unpin": "De-intesta", "unpin": "Rimuovi dalla cima del profilo",
"you": "(Tu)" "you": "(Tu)"
}, },
"time": { "time": {
"in_future": "fra {0}", "in_future": "fra {0}",
"in_past": "{0} fa", "in_past": "{0} fa",
"now": "adesso", "now": "proprio adesso",
"now_short": "adesso", "now_short": "ora",
"unit": { "unit": {
"days": "{0} giorni", "days": "{0} giorno | {0} giorni",
"days_short": "{0} g", "days_short": "{0} g",
"hours": "{0} ore", "hours": "{0} ora | {0} ore",
"hours_short": "{0} h", "hours_short": "{0} ora | {0} ore",
"minutes": "{0} minuti", "minutes": "{0} minuto | {0} minuti",
"minutes_short": "{0} min", "minutes_short": "{0} min",
"months": "{0} mesi", "months": "{0} mese | {0} mesi",
"months_short": "{0} mes", "months_short": "{0} mese | {0} mesi",
"seconds": "{0} secondi", "seconds": "{0} secondo | {0} secondi",
"seconds_short": "{0} sec", "seconds_short": "{0} sec",
"weeks": "{0} settimane", "weeks": "{0} settimana | {0} settimane",
"weeks_short": "{0} stm", "weeks_short": "{0} sett",
"years": "{0} anni", "years": "{0} anno | {0} anni",
"years_short": "{0} a" "years_short": "{0} a"
} }
}, },
"timeline": { "timeline": {
"collapse": "Ripiega", "collapse": "Riduci",
"conversation": "Conversazione", "conversation": "Conversazione",
"error": "Errore nel caricare la sequenza: {0}", "error": "Errore nel caricare la sequenza: {0}",
"load_older": "Carica messaggi precedenti", "follow_tag": "Segui hashtag",
"no_more_statuses": "Fine dei messaggi", "load_older": "Carica post precedenti",
"no_retweet_hint": "Il messaggio è diretto o solo per seguaci e non può essere condiviso", "no_more_statuses": "Non ci sono altri post",
"no_statuses": "Nessun messaggio", "no_retweet_hint": "Il messaggio è «solo per follower» o «diretto», quindi non può essere condiviso",
"no_statuses": "Nessun post",
"reload": "Ricarica", "reload": "Ricarica",
"repeated": "ha condiviso", "repeated": "ha condiviso",
"show_new": "Mostra nuovi", "show_new": "Mostra nuovi",
"socket_broke": "Connessione tempo reale interrotta: codice {0}", "socket_broke": "Connessione tempo reale interrotta: CloseEvent codice {0}",
"socket_reconnected": "Connesso in tempo reale", "socket_reconnected": "Connesso in tempo reale",
"unfollow_tag": "Smetti di seguire hashtag",
"up_to_date": "Aggiornato" "up_to_date": "Aggiornato"
}, },
"toast": {
"no_translation_target_set": "Nessuna lingua finale di traduzione impostata: la traduzione potrebbe fallire. Imposta una lingua finale di traduzione nelle tue impostazioni."
},
"tool_tip": { "tool_tip": {
"accept_follow_request": "Accetta seguace", "accept_follow_request": "Accetta richiesta di follow",
"add_reaction": "Reagisci", "add_reaction": "Aggiungi reazione",
"bookmark": "Aggiungi segnalibro", "bookmark": "Aggiungi segnalibro",
"favorite": "Gradisci", "favorite": "Rendi preferito",
"media_upload": "Carica allegati", "media_upload": "Carica media",
"reject_follow_request": "Rifiuta seguace", "quote": "Cita",
"reject_follow_request": "Rifiuta richiesta di follow",
"repeat": "Condividi", "repeat": "Condividi",
"reply": "Rispondi", "reply": "Rispondi",
"user_settings": "Impostazioni utente" "user_settings": "Impostazioni utente"
@ -934,7 +1037,7 @@
"upload": { "upload": {
"error": { "error": {
"base": "Caricamento fallito.", "base": "Caricamento fallito.",
"default": "Riprova in seguito", "default": "Riprova più tardi",
"file_too_big": "File troppo pesante [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]", "file_too_big": "File troppo pesante [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]",
"message": "Caricamento fallito: {0}" "message": "Caricamento fallito: {0}"
}, },
@ -948,79 +1051,115 @@
}, },
"user_card": { "user_card": {
"admin_menu": { "admin_menu": {
"activate_account": "Attiva profilo", "activate_account": "Riattiva account",
"deactivate_account": "Disattiva profilo", "deactivate_account": "Disattiva account",
"delete_account": "Elimina profilo", "delete_account": "Elimina account",
"delete_user": "Elimina utente", "delete_user": "Elimina utente",
"disable_any_subscription": "Rendi utente non seguibile", "delete_user_data_and_deactivate_confirmation": "Questo eliminerà permanentemente i dati dall'account e lo disattiverà. Sei sicuro al 100%?",
"disable_remote_subscription": "Blocca i tentativi di seguirlo da altre stanze", "disable_any_subscription": "Proibisci a tutti di seguire l'utente",
"force_nsfw": "Oscura tutti i messaggi", "disable_remote_subscription": "Proibisci ad istanze remote di seguire l'utente",
"force_unlisted": "Nascondi tutti i messaggi", "force_nsfw": "Marca tutti i post come NSFW",
"grant_admin": "Crea Amministratore", "force_unlisted": "Rendi tutti i post «non in elenco»",
"grant_moderator": "Crea Moderatore", "grant_admin": "Rendi amministratore",
"grant_moderator": "Rendi moderatore",
"moderation": "Moderazione", "moderation": "Moderazione",
"quarantine": "I messaggi non arriveranno alle altre stanze", "quarantine": "Impedisci la federazione dei post degli utenti",
"revoke_admin": "Divesti Amministratore", "revoke_admin": "Rimuovi da amministratore",
"revoke_moderator": "Divesti Moderatore", "revoke_moderator": "Rimuovi da moderatore",
"sandbox": "Rendi tutti i messaggi solo per seguaci", "sandbox": "Rendi tutti i messaggi \"solo per follower\"",
"strip_media": "Rimuovi ogni allegato ai messaggi" "strip_media": "Rimuovi media dai messaggi"
}, },
"approve": "Approva", "approve": "Accetta",
"approve_confirm": "Sei sicuro di voler permettere a questo utente di seguirti?",
"approve_confirm_accept_button": "Sì, accetta",
"approve_confirm_cancel_button": "No, annulla",
"approve_confirm_title": "Accetta richiesta di follow",
"block": "Blocca", "block": "Blocca",
"block_confirm": "Sei sicuro di voler bloccare {user}?",
"block_confirm_accept_button": "Sì, blocca",
"block_confirm_cancel_button": "No, non bloccare",
"block_confirm_title": "Blocca utente",
"block_progress": "Blocco…", "block_progress": "Blocco…",
"blocked": "Bloccato!", "blocked": "Bloccato!",
"blocks_you": "Ti blocca!",
"bot": "Bot", "bot": "Bot",
"deny": "Nega", "deactivated": "Disattivato",
"deny": "Rifiuta",
"deny_confirm": "Sei sicuro di voler rifiutare la richiesta di follow di questo utente?",
"deny_confirm_accept_button": "Sì, rifiuta",
"deny_confirm_cancel_button": "No, annulla",
"deny_confirm_title": "Rifiuta richiesta di follow",
"domain_muted": "Sblocca dominio",
"edit_profile": "Modifica profilo", "edit_profile": "Modifica profilo",
"favorites": "Preferiti", "favorites": "Preferiti",
"follow": "Segui", "follow": "Segui",
"follow_cancel": "Annulla richiesta",
"follow_progress": "Richiedo…", "follow_progress": "Richiedo…",
"follow_sent": "Richiesta inviata!", "follow_sent": "Richiesta inviata!",
"follow_unfollow": "Disconosci", "follow_tag": "Segui l'hashtag",
"followees": "Segue", "follow_unfollow": "Smetti di seguire",
"followers": "Seguaci", "followed_tags": "Hashtag seguiti",
"following": "Seguìto!", "followed_users": "Utenti seguiti",
"followees": "Seguiti",
"followers": "Follower",
"following": "Seguito!",
"follows_you": "Ti segue!", "follows_you": "Ti segue!",
"hidden": "Nascosto", "hidden": "Nascosto",
"hide_repeats": "Nascondi condivisioni", "hide_repeats": "Nascondi condivisioni",
"highlight": { "highlight": {
"disabled": "Nessun risalto", "disabled": "Nessuno sfondo",
"side": "Nastro a lato", "side": "Striscia laterale",
"solid": "Un colore", "solid": "Sfondo monocolore",
"striped": "A righe" "striped": "Sfondo a righe"
}, },
"its_you": "Sei tu!", "its_you": "Sei tu!",
"media": "Media", "media": "Media",
"mention": "Menziona", "mention": "Menziona",
"message": "Contatta", "message": "Contatta",
"mute": "Silenzia", "mute": "Silenzia",
"mute_progress": "Silenzio…", "mute_confirm": "Sei sicuro di voler silenziare {user}?",
"mute_confirm_accept_button": "Sì, silenzia",
"mute_confirm_cancel_button": "No, non silenziare",
"mute_confirm_title": "Silenzia utente",
"mute_domain": "Blocca dominio",
"mute_progress": "Silenziando…",
"muted": "Silenziato", "muted": "Silenziato",
"not_following_any_hashtags": "Non stai seguendo nessun hashtag",
"note": "Nota privata",
"per_day": "al giorno", "per_day": "al giorno",
"remote_follow": "Segui da remoto", "remote_follow": "Segui da remoto",
"remove_follower": "Rimuovi follower",
"replies": "Con risposte",
"report": "Segnala", "report": "Segnala",
"requested_by": "Ha chiesto di seguirti",
"show_repeats": "Mostra condivisioni", "show_repeats": "Mostra condivisioni",
"statuses": "Messaggi", "statuses": "Post",
"subscribe": "Abbònati", "subscribe": "Iscriviti",
"unblock": "Sblocca", "unblock": "Sblocca",
"unblock_progress": "Sblocco…", "unblock_progress": "Sblocco…",
"unmute": "Riabilita", "unfollow_confirm": "Sei sicuro di voler smettere di seguire {user}?",
"unmute_progress": "Riabilito…", "unfollow_confirm_accept_button": "Sì, smetti di seguire",
"unsubscribe": "Disdici" "unfollow_confirm_cancel_button": "No, non smettere di seguire",
"unfollow_confirm_title": "Smetti di seguire l'utente",
"unfollow_tag": "Smetti di seguire l'hashtag",
"unmute": "Desilenzia",
"unmute_progress": "Desilenziamento…",
"unsubscribe": "Disiscriviti"
}, },
"user_profile": { "user_profile": {
"field_validated": "Collegamento verificato",
"profile_does_not_exist": "Spiacente, questo profilo non esiste.", "profile_does_not_exist": "Spiacente, questo profilo non esiste.",
"profile_loading_error": "Spiacente, c'è stato un errore nel caricamento del profilo.", "profile_loading_error": "Spiacente, c'è stato un errore nel caricamento del profilo.",
"timeline_title": "Sequenza dell'utente" "timeline_title": "Sequenza dell'utente"
}, },
"user_reporting": { "user_reporting": {
"add_comment_description": "La segnalazione sarà inviata ai moderatori della tua stanza. Puoi motivarla qui sotto:", "add_comment_description": "La segnalazione sarà inviata ai moderatori della tua istanza. Puoi fornire una motivazione per cui stai segnalando questo account qui sotto:",
"additional_comments": "Osservazioni accessorie", "additional_comments": "Commenti aggiuntivi",
"forward_description": "Il profilo appartiene ad un'altra stanza. Inviare la segnalazione anche a quella?", "forward_description": "Il profilo appartiene ad un altro server. Inviare la segnalazione anche a quello?",
"forward_to": "Inoltra a {0}", "forward_to": "Inoltra a {0}",
"generic_error": "C'è stato un errore nell'elaborazione della tua richiesta.", "generic_error": "C'è stato un errore nell'elaborazione della tua richiesta.",
"submit": "Invia", "submit": "Invia",
"title": "Segnalo {0}" "title": "Segnala {0}"
}, },
"who_to_follow": { "who_to_follow": {
"more": "Altro", "more": "Altro",

124
src/i18n/lt.json Normal file
View file

@ -0,0 +1,124 @@
{
"about": {
"bubble_instances": "Vietiniai burbulo serveriai",
"bubble_instances_description": "Administratorių parinkti serveriai, kurie atstovauja šios serverio vietinę teritoriją",
"mrf": {
"federation": "Federacija",
"keyword": {
"ftl_removal": "Pašalinimas iš „Viso žinomo tinklo“ laiko skalės",
"is_replaced_by": "→",
"keyword_policies": "Raktažodžių politika",
"reject": "Atmesti",
"replace": "Pakeisti"
},
"mrf_policies": "Įjungta MRF politika",
"mrf_policies_desc": "MRF politika valdo serverio federacijos elgseną. Įjungtos toliau nurodytos politikos:",
"simple": {
"accept": "Priimti",
"accept_desc": "Šis serveris priima žinutes tik iš toliau nurodytų serverių:",
"ftl_removal": "Pašalinimas iš „Žinomo tinklo“ laiko skalės",
"ftl_removal_desc": "Šis serveris pašalina šiuos serverius iš „Žinomo tinklo“ laiko skalės:",
"instance": "Serveris",
"media_nsfw": "Medija priverstinai nustatyta kaip jautri",
"media_nsfw_desc": "Šis serveris priverčia nustatyti mediją kaip jautrią toliau nurodytų serverių įrašuose:",
"media_removal": "Medijos pašalinimas",
"media_removal_desc": "Šis serveris pašalina mediją iš toliau nurodytų serverių įrašų:",
"not_applicable": "Nėra",
"quarantine": "Karantinas",
"quarantine_desc": "Šis serveris nesiųs įrašų į toliau nurodytus serverius:",
"reason": "Priežastis",
"reject": "Atmesti",
"reject_desc": "Šis serveris nepriims žinučių iš toliau nurodytų serverių:",
"simple_policies": "Konkretaus serverio politika"
}
},
"staff": "Personalas"
},
"announcements": {
"all_day_prompt": "Tai visos dienos renginys",
"cancel_edit_action": "Atsisakyti",
"close_error": "Užverti",
"delete_action": "Ištrinti",
"edit_action": "Redaguoti",
"end_time_display": "Pasibaigia {time}",
"end_time_prompt": "Pabaigos laikas: ",
"inactive_message": "Šis skelbimas neaktyvus",
"mark_as_read_action": "Žymėti kaip skaitytą",
"page_header": "Skelbimai",
"post_action": "Siųsti",
"post_error": "Klaida: {error}",
"post_form_header": "Skelbti skelbimą"
},
"chats": {
"chats": "Pokalbiai",
"delete": "Ištrinti",
"more": "Daugiau",
"new": "Naujas pokalbis",
"you": "Jūs:"
},
"display_date": {
"today": "Šiandien"
},
"domain_mute_card": {
"mute": "Nutildyti",
"mute_progress": "Nutildoma…",
"unmute": "Atšaukti nutildymą",
"unmute_progress": "Atšaukiamas nutildymas…"
},
"emoji": {
"add_emoji": "Įterpti jaustuką",
"custom": "Pasirinktinis jaustukas",
"emoji": "Jaustukas",
"stickers": "Lipdukai",
"unicode": "Unikodo jaustukas"
},
"exporter": {
"export": "Eksportuoti"
},
"file_type": {
"audio": "Garso įrašas",
"file": "Failas",
"image": "Vaizdas",
"video": "Vaizdo įrašas"
},
"general": {
"more": "Daugiau",
"scope_in_timeline": {
"direct": "Tiesioginis",
"local": "Vietinis šį įrašą gali matyti tik jūsų serveris",
"private": "Tik sekėjams",
"public": "Vieša",
"unlisted": "Neįtrauktas į sąrašą"
},
"show_less": "Rodyti mažiau",
"show_more": "Rodyti daugiau",
"submit": "Pateikti",
"verify": "Patvirtinti"
},
"image_cropper": {
"cancel": "Atšaukti"
},
"importer": {
"submit": "Pateikti"
},
"user_card": {
"follow_tag": "Sekti saitažodį",
"not_following_any_hashtags": "Nesekate jokių saitažodžių.",
"unfollow_confirm_accept_button": "Taip, nebesekti",
"unfollow_confirm_cancel_button": "Ne, nenaikinti sekimą",
"unfollow_confirm_title": "Nebesekti naudotoją",
"unfollow_tag": "Nebesekti saitažodį"
},
"user_reporting": {
"additional_comments": "Papildomi komentarai",
"forward_description": "Paskyra yra iš kito serverio. Siųsti ataskaitos kopiją ir ten?",
"forward_to": "Persiųsti į {0}",
"generic_error": "Įvyko klaida apdorojant jūsų užklausą.",
"submit": "Pateikti",
"title": "Pranešama apie {0}"
},
"who_to_follow": {
"more": "Daugiau",
"who_to_follow": "Ką sekti"
}
}

View file

@ -599,7 +599,7 @@
"links": "Łącza", "links": "Łącza",
"list_aliases_error": "Błąd pobierania aliasów: {error}", "list_aliases_error": "Błąd pobierania aliasów: {error}",
"list_backups_error": "Błąd pobierania listy kopii zapasowych: {error}", "list_backups_error": "Błąd pobierania listy kopii zapasowych: {error}",
"lock_account_description": "Spraw, by konto mogli wyświetlać tylko zatwierdzeni obserwujący", "lock_account_description": "Wymagaj potwierdzenia nowych śledzących",
"loop_video": "Zapętlaj filmy", "loop_video": "Zapętlaj filmy",
"loop_video_silent_only": "Zapętlaj tylko filmy bez dźwięku (np. mastodonowe „gify”)", "loop_video_silent_only": "Zapętlaj tylko filmy bez dźwięku (np. mastodonowe „gify”)",
"mascot": "Maskotka Mastodon FE", "mascot": "Maskotka Mastodon FE",
@ -679,6 +679,7 @@
"pad_emoji": "Dodaj odstęp z obu stron emoji podczas dodawania selektorem", "pad_emoji": "Dodaj odstęp z obu stron emoji podczas dodawania selektorem",
"panelRadius": "Panele", "panelRadius": "Panele",
"pause_on_unfocused": "Wstrzymuj strumieniowanie kiedy karta nie jest aktywna", "pause_on_unfocused": "Wstrzymuj strumieniowanie kiedy karta nie jest aktywna",
"permit_followback_description": "Automatycznie potwierdź śledzenie przez użytkowników którch już śledzisz",
"play_videos_in_modal": "Odtwarzaj filmy bezpośrednio w przeglądarce mediów", "play_videos_in_modal": "Odtwarzaj filmy bezpośrednio w przeglądarce mediów",
"post_look_feel": "Wygląd wpisów", "post_look_feel": "Wygląd wpisów",
"post_status_content_type": "Domyślny typ zawartości wpisów", "post_status_content_type": "Domyślny typ zawartości wpisów",
@ -1148,7 +1149,7 @@
"followed_users": "Śledzeni użytkownicy", "followed_users": "Śledzeni użytkownicy",
"followees": "Obserwowani", "followees": "Obserwowani",
"followers": "Obserwujący", "followers": "Obserwujący",
"following": "Obserwowany!", "following": "Obserwujesz!",
"follows_you": "Obserwuje cię!", "follows_you": "Obserwuje cię!",
"hidden": "Ukryte", "hidden": "Ukryte",
"hide_repeats": "Ukryj powtórzenia", "hide_repeats": "Ukryj powtórzenia",
@ -1174,7 +1175,7 @@
"note": "Prywatna notatka", "note": "Prywatna notatka",
"per_day": "dziennie", "per_day": "dziennie",
"remote_follow": "Zdalna obserwacja", "remote_follow": "Zdalna obserwacja",
"remove_follower": "Zdalny śledzący", "remove_follower": "Usuń śledzenie",
"replies": "Z odpowiedziami", "replies": "Z odpowiedziami",
"report": "Zgłoś", "report": "Zgłoś",
"requested_by": "Chce cię śledzić", "requested_by": "Chce cię śledzić",

View file

@ -1,5 +1,7 @@
{ {
"about": { "about": {
"bubble_instances": "Instâncias Bubble Locais",
"bubble_instances_description": "Instâncias escolhidas pelos administradores para representar a área local dessa instância",
"mrf": { "mrf": {
"federation": "Federação", "federation": "Federação",
"keyword": { "keyword": {
@ -23,7 +25,7 @@
"media_removal_desc": "Este domínio remove multimédia das publicações dos seguintes domínios:", "media_removal_desc": "Este domínio remove multimédia das publicações dos seguintes domínios:",
"not_applicable": "N/A", "not_applicable": "N/A",
"quarantine": "Quarentena", "quarantine": "Quarentena",
"quarantine_desc": "Este domínio apenas irá publicar nos seguintes domínios:", "quarantine_desc": "Esta instância não irá enviar posts para as seguintes instâncias:",
"reason": "Razão", "reason": "Razão",
"reject": "Rejeitar", "reject": "Rejeitar",
"reject_desc": "Este domínio não aceitará mensagens dos seguintes domínios:", "reject_desc": "Este domínio não aceitará mensagens dos seguintes domínios:",
@ -39,6 +41,7 @@
"delete_action": "Apagar", "delete_action": "Apagar",
"edit_action": "Editar", "edit_action": "Editar",
"end_time_display": "Termina às {time}", "end_time_display": "Termina às {time}",
"end_time_prompt": "Tempo final: ",
"inactive_message": "Este anúncio está inativo", "inactive_message": "Este anúncio está inativo",
"mark_as_read_action": "Marcar como lido", "mark_as_read_action": "Marcar como lido",
"page_header": "Anúncios", "page_header": "Anúncios",
@ -120,6 +123,9 @@
"dismiss": "Ignorar", "dismiss": "Ignorar",
"enable": "Ativar", "enable": "Ativar",
"error_retry": "Por favor, tenta novamente", "error_retry": "Por favor, tenta novamente",
"flash_content": "Clique para mostrar o conteúdo Flash usando Ruffle (Experimental, talvez não funcione).",
"flash_fail": "Falha ao carregar conteúdo flash, veja o console para detalhes.",
"flash_security": "Note que isso pode ser potencialmente perigoso dado que conteúdos Flash ainda são código arbitrário.",
"generic_error": "Ocorreu um erro", "generic_error": "Ocorreu um erro",
"loading": "A carregar…", "loading": "A carregar…",
"more": "Mais", "more": "Mais",
@ -130,6 +136,13 @@
"admin": "Admin", "admin": "Admin",
"moderator": "Moderador" "moderator": "Moderador"
}, },
"scope_in_timeline": {
"direct": "Direto",
"local": "Local - apenas a sua instância pode ver esse post",
"private": "Apenas para seguidores",
"public": "Público",
"unlisted": "Não-listado"
},
"show_less": "Mostrar menos", "show_less": "Mostrar menos",
"show_more": "Mostrar mais", "show_more": "Mostrar mais",
"submit": "Enviar", "submit": "Enviar",
@ -152,6 +165,84 @@
"load_older": "Carregar interações mais antigas", "load_older": "Carregar interações mais antigas",
"moves": "O utilizador migra" "moves": "O utilizador migra"
}, },
"languages": {
"ar": "Árabe",
"az": "Azerbaijano",
"bg": "Búlgaro",
"cs": "Checo",
"da": "Dinamarquês",
"de": "Alemão",
"el": "Grego",
"en": "Inglês",
"eo": "Esperanto",
"es": "Espanhol",
"fa": "Persa",
"fi": "Finlandês",
"fr": "Francês",
"ga": "Irlandês",
"he": "Hebreu",
"hi": "Hindu",
"hu": "Húngaro",
"id": "Indonésio",
"it": "Italiano",
"ja": "Japonês",
"ko": "Coreano",
"lt": "Lituano",
"lv": "Letão",
"nl": "Holandês",
"pl": "Polonês",
"pt": "Português",
"ru": "Russo",
"sk": "Eslovaco",
"sv": "Sueco",
"tr": "Turco",
"translated_from": {
"ar": "Traduzido de @:languages.ar",
"az": "Traduzido de @:languages.az",
"bg": "Traduzido de @:languages.bg",
"cs": "Traduzido de @:languages.cs",
"da": "Traduzido de @:languages.da",
"de": "Traduzido de @:languages.de",
"el": "Traduzido de @:languages.el",
"en": "Traduzido de @:languages.en",
"eo": "Traduzido de @:languages.eo",
"es": "Traduzido de @:languages.es",
"fa": "Traduzido de @:languages.fa",
"fi": "Traduzido de @:languages.fi",
"fr": "Traduzido de @:languages.fr",
"ga": "Traduzido de @:languages.ga",
"he": "Traduzido de @:languages.he",
"hi": "Traduzido de @:languages.hi",
"hu": "Traduzido de @:languages.hu",
"id": "Traduzido de @:languages.id",
"it": "Traduzido de @:languages.it",
"ja": "Traduzido de @:languages.ja",
"ko": "Traduzido de @:languages.ko",
"lt": "Traduzido de @:languages.lt",
"lv": "Traduzido de @:languages.lv",
"nl": "Traduzido de @:languages.nl",
"pl": "Traduzido de @:languages.pl",
"pt": "Traduzido de @:languages.pt",
"ru": "Traduzido de @:languages.ru",
"sk": "Traduzido de @:languages.sk",
"sv": "Traduzido de @:languages.sv",
"tr": "Traduzido de @:languages.tr",
"uk": "Traduzido de @:languages.uk",
"zh": "Traduzido de @:languages.zh"
},
"uk": "Ucraniano",
"zh": "Chinês"
},
"lists": {
"create": "Criar",
"delete": "Apagar lista",
"following_only": "Limitar aos seguidores",
"lists": "Listas",
"new": "Nova Lista",
"save": "Salvar mudanças",
"search": "Procurar usuários",
"title": "Título da lista"
},
"login": { "login": {
"authentication_code": "Código de autenticação", "authentication_code": "Código de autenticação",
"description": "Iniciar sessão com OAuth", "description": "Iniciar sessão com OAuth",
@ -164,48 +255,90 @@
"hint": "Entra para participar na discussão", "hint": "Entra para participar na discussão",
"login": "Iniciar Sessão", "login": "Iniciar Sessão",
"logout": "Terminar sessão", "logout": "Terminar sessão",
"logout_confirm": "Você tem certeza que deseja sair?",
"logout_confirm_accept_button": "Sair",
"logout_confirm_cancel_button": "Cancelar",
"logout_confirm_title": "Sair",
"password": "Palavra-passe", "password": "Palavra-passe",
"placeholder": "ex. lain", "placeholder": "meunomedeusuario",
"recovery_code": "Código de recuperação", "recovery_code": "Código de recuperação",
"register": "Registrar", "register": "Registrar",
"username": "Nome de Utilizador" "username": "Nome de Utilizador"
}, },
"media_modal": { "media_modal": {
"counter": "{current} / {total}",
"hide": "Fechar visualizador de mídia",
"next": "Próximo", "next": "Próximo",
"previous": "Anterior" "previous": "Anterior"
}, },
"moderation": {
"moderation": "Moderação",
"reports": {
"add_note": "Adicionar nota",
"close": "Fechar",
"delete_note": "Apagar",
"delete_note_accept": "Sim, apague isso",
"delete_note_cancel": "Não, mantenha isso",
"delete_note_confirm": "Você tem certeza que deseja apagar essa nota?",
"delete_note_title": "Confirmar exclusão",
"no_content": "Nenhuma descrição dada",
"no_reports": "Nenhum relatório a ser mostrado",
"note_placeholder": "Deixar uma nota",
"notes": "{ count } nota | {count } notas",
"reopen": "Reabrir",
"report": "Reportar",
"reports": "Relatórios",
"resolve": "Resolver",
"show_closed": "Mostrar fechadas",
"statuses": "{ count } publicação | { count } publicações",
"tag_policy_notice": "Ativar a TagPolicy MRF para ativar as restrições de publicação",
"tags": "Definir restrições de publicação"
},
"statuses": "Publicações",
"users": "Usuários"
},
"nav": { "nav": {
"about": "Sobre", "about": "Sobre",
"administration": "Administração", "administration": "Administração",
"announcements": "Anúncios",
"back": "Voltar", "back": "Voltar",
"bookmarks": "Itens Guardados", "bookmarks": "Itens Guardados",
"bubble_timeline": "Linha de tempo Bubble",
"bubble_timeline_description": "Publicações de instâncias perto da sua, como recomendado pelos administradores",
"chats": "Salas de Chat", "chats": "Salas de Chat",
"dms": "Mensagens Diretas", "dms": "Mensagens Diretas",
"friend_requests": "Pedidos de seguidores", "friend_requests": "Pedidos de seguidores",
"home_timeline": "Linha de tempo pessoal",
"home_timeline_description": "Publicações de pessoas que você segue",
"interactions": "Interações", "interactions": "Interações",
"lists": "Listas",
"mentions": "Menções", "mentions": "Menções",
"moderation": "Moderação",
"preferences": "Preferências", "preferences": "Preferências",
"public_timeline_description": "Publicações públicas dessa instância",
"public_tl": "Cronologia Pública", "public_tl": "Cronologia Pública",
"search": "Pesquisar", "search": "Pesquisar",
"timeline": "Cronologia", "timeline": "Cronologia",
"timelines": "Cronologias", "timelines": "Cronologias",
"twkn": "Rede conhecida", "twkn": "Rede conhecida",
"twkn_timeline_description": "Publicações de toda a rede",
"user_search": "Pesquisa por Utilizadores", "user_search": "Pesquisa por Utilizadores",
"who_to_follow": "Quem seguir" "who_to_follow": "Quem seguir"
}, },
"notifications": { "notifications": {
"broken_favorite": "Publicação desconhecida, a procurar…", "broken_favorite": "Publicação desconhecida, procurando por isso…",
"error": "Erro ao obter notificações: {0}", "error": "Erro ao obter notificações: {0}",
"favorited_you": "gostou do teu post", "favorited_you": "favoritou sua publicação",
"follow_request": "quer seguir-te", "follow_request": "quer seguir-te",
"followed_you": "seguiu-te", "followed_you": "seguiu-te",
"load_older": "Carregar notificações antigas", "load_older": "Carregar notificações antigas",
"migrated_to": "migrou para", "migrated_to": "migrou para",
"no_more_notifications": "Sem mais notificações", "no_more_notifications": "Sem mais notificações",
"notifications": "Notificações", "notifications": "Notificações",
"poll_ended": "enquete foi finalizada",
"reacted_with": "reagiu com {0}", "reacted_with": "reagiu com {0}",
"read": "Lido!", "read": "Lido!",
"repeated_you": "partilhou o teu post" "repeated_you": "repostou a sua publicação"
}, },
"password_reset": { "password_reset": {
"check_email": "Verifica o teu endereço de e-mail para obter um link para repor a tua palavra-passe.", "check_email": "Verifica o teu endereço de e-mail para obter um link para repor a tua palavra-passe.",
@ -228,10 +361,12 @@
"multiple_choices": "Escolha múltipla", "multiple_choices": "Escolha múltipla",
"not_enough_options": "Demasiado poucas opções únicas na sondagem", "not_enough_options": "Demasiado poucas opções únicas na sondagem",
"option": "Opção", "option": "Opção",
"people_voted_count": "{count} pessoa votou | {count} pessoas votaram",
"single_choice": "Escolha única", "single_choice": "Escolha única",
"type": "Tipo de sondagem", "type": "Tipo de sondagem",
"vote": "Vota", "vote": "Vota",
"votes": "votos" "votes": "votos",
"votes_count": "{count} voto | {count} votos"
}, },
"post_status": { "post_status": {
"account_not_locked_warning": "A sua conta não é {0}. Qualquer pessoa pode seguir-te e ver os seus posts privados (só para seguidores).", "account_not_locked_warning": "A sua conta não é {0}. Qualquer pessoa pode seguir-te e ver os seus posts privados (só para seguidores).",
@ -241,43 +376,60 @@
"text/bbcode": "BBCode", "text/bbcode": "BBCode",
"text/html": "HTML", "text/html": "HTML",
"text/markdown": "Remarcação", "text/markdown": "Remarcação",
"text/plain": "Texto puro" "text/plain": "Texto puro",
"text/x.misskeymarkdown": "MFM"
}, },
"content_warning": "Assunto (opcional)", "content_warning": "Aviso de Conteúdo (opcional)",
"default": "Acabei de chegar em", "default": "Acabei de chegar em",
"direct_warning_to_all": "Esta publicação será visível para todos os utilizadores mencionados.", "direct_warning_to_all": "Esta publicação será visível para todos os utilizadores mencionados.",
"direct_warning_to_first_only": "Esta publicação só será visível para os utilizadores mencionados no início da mensagem.", "direct_warning_to_first_only": "Esta publicação só será visível para os utilizadores mencionados no início da mensagem.",
"empty_status_error": "Não consegues publicar um post vazio e sem ficheiros", "edit_remote_warning": "Mudanças feitas na publicação talvez não sejam visíveis em algumas instâncias!",
"edit_status": "Editar Status",
"edit_unsupported_warning": "Enquetes e menções não mudarão ao editar.",
"empty_status_error": "Não pode enviar uma publicação sem conteúdo ou arquivos",
"media_description": "Descrição da multimédia", "media_description": "Descrição da multimédia",
"media_description_error": "Falha ao atualizar ficheiro, tente novamente", "media_description_error": "Falha ao atualizar ficheiro, tente novamente",
"new_status": "Publicar nova publicação", "media_not_sensitive_warning": "Você tem um Aviso de Conteúdo, mas os anexos não estão marcados como sensíveis!",
"new_status": "Nova publicação",
"post": "Publicação",
"posting": "A publicar", "posting": "A publicar",
"preview": "Pré-visualização", "preview": "Pré-visualização",
"preview_empty": "Vazio", "preview_empty": "Vazio",
"scope": { "scope": {
"direct": "Direto - Enviar somente aos usuários mencionados", "direct": "Direto - Enviar somente aos usuários mencionados",
"local": "Local - não federar essa publicação",
"private": "Apenas para seguidores - Enviar apenas para seguidores", "private": "Apenas para seguidores - Enviar apenas para seguidores",
"public": "Público - Publicar em cronologias públicas", "public": "Público - Publicar em cronologias públicas",
"unlisted": "Não listado - Não exibir em cronologias públicas" "unlisted": "Não listado - Não exibir em cronologias públicas"
}, },
"scope_notice": { "scope_notice": {
"local": "Essa publicação não estará visível em outras instâncias",
"private": "Esta publicação será apenas visível para os teus seguidores", "private": "Esta publicação será apenas visível para os teus seguidores",
"public": "Esta publicação será visível para todos", "public": "Esta publicação será visível para todos",
"unlisted": "Esta publicação não será visível na Cronologia pública e na Rede conhecida por todos" "unlisted": "Esta publicação não será visível na Cronologia pública e na Rede conhecida por todos"
} },
"toggle_content_warning": "Alternar aviso de conteúdo"
}, },
"registration": { "registration": {
"awaiting_email_confirmation": "Sua conta foi registrada e um email foi enviado para o seu endereço. Por favor, verifique o email para completar o registro.",
"awaiting_email_confirmation_title": "Aguardando confirmação de email",
"bio": "Biografia", "bio": "Biografia",
"bio_placeholder": "Ex.:\nBem-vindo a minha bio.\nEu amo assistir anime e jogar. Eu espero que possamos ser amigos!", "bio_placeholder": "Ex.:\nBem-vindo a minha bio.\nEu amo assistir anime e jogar. Eu espero que possamos ser amigos!",
"captcha": "CAPTCHA", "captcha": "CAPTCHA",
"email": "Endereço de e-mail", "email": "Endereço de e-mail",
"email_language": "Em qual linguagem você quer receber os emails do servidor?",
"fullname": "Nome para exibição", "fullname": "Nome para exibição",
"fullname_placeholder": "ex. Lain Iwakura", "fullname_placeholder": "ex. Atsuko Kagari",
"new_captcha": "Clique na imagem para carregar um novo captcha", "new_captcha": "Clique na imagem para carregar um novo captcha",
"password_confirm": "Confirmação de palavra-passe", "password_confirm": "Confirmação de palavra-passe",
"reason": "Razão do registro",
"reason_placeholder": "Essa instância aprova os registros manualmente\nPermita ao administrador saber porque você deseja se registrar.",
"register": "Registrar",
"registration": "Registo", "registration": "Registo",
"request_sent": "Seu pedido de registro foi enviado para aprovação. Você irá receber um email quando a sua conta for aprovada.",
"request_sent_title": "Pedido de registro enviado",
"token": "Código do convite", "token": "Código do convite",
"username_placeholder": "ex. lain", "username_placeholder": "ex. akko",
"validations": { "validations": {
"email_required": "não pode ser deixado em branco", "email_required": "não pode ser deixado em branco",
"fullname_required": "não pode ser deixado em branco", "fullname_required": "não pode ser deixado em branco",
@ -304,7 +456,19 @@
}, },
"settings": { "settings": {
"accent": "Destaque", "accent": "Destaque",
"account_alias": "Apelidos de conta",
"account_alias_table_head": "Apelido",
"account_backup": "Backup de conta",
"account_backup_description": "Isso permite a você baixar um arquivo das informações da sua conta e as suas publicações, mas eles ainda não podem ser importados para uma conta do Akkoma.",
"account_backup_table_head": "Backup",
"account_privacy": "Privacidade",
"add_alias_error": "Erro ao adicionar apelido: {error}",
"add_backup": "Criar novo backup",
"add_backup_error": "Erro ao adicionar um novo backup: {error}",
"added_alias": "Apelido foi adicionado.",
"added_backup": "Adicionou um novo backup.",
"allow_following_move": "Permitir seguimento automático quando a conta for migrada para outra instância", "allow_following_move": "Permitir seguimento automático quando a conta for migrada para outra instância",
"always_show_post_button": "Sempre mostrar o botão flutuante de Nova Publicação",
"app_name": "Nome da aplicação", "app_name": "Nome da aplicação",
"attachmentRadius": "Anexos", "attachmentRadius": "Anexos",
"attachments": "Anexos", "attachments": "Anexos",
@ -314,6 +478,7 @@
"avatarRadius": "Avatares", "avatarRadius": "Avatares",
"avatar_size_instruction": "O tamanho mínimo recomendado para imagens de avatar é 150x150 pixels.", "avatar_size_instruction": "O tamanho mínimo recomendado para imagens de avatar é 150x150 pixels.",
"background": "Imagem de Fundo", "background": "Imagem de Fundo",
"backup_not_ready": "Esse backup não está pronto ainda.",
"bio": "Biografia", "bio": "Biografia",
"block_export": "Exportar utilizadores bloqueados", "block_export": "Exportar utilizadores bloqueados",
"block_export_button": "Exporta a tua lista de utilizadores bloqueados para um ficheiro csv", "block_export_button": "Exporta a tua lista de utilizadores bloqueados para um ficheiro csv",
@ -335,10 +500,27 @@
"changed_password": "Palavra-passe modificada com sucesso!", "changed_password": "Palavra-passe modificada com sucesso!",
"chatMessageRadius": "Mensagem de texto", "chatMessageRadius": "Mensagem de texto",
"checkboxRadius": "Caixas de seleção", "checkboxRadius": "Caixas de seleção",
"collapse_subject": "Esconder posts com assunto", "collapse_subject": "Colapsar publicações com aviso de conteúdo",
"columns": "Colunas",
"composing": "Escrita", "composing": "Escrita",
"confirm_dialogs": "Necessita de confirmação para:",
"confirm_dialogs_approve_follow": "Aceitar um pedido para seguir",
"confirm_dialogs_block": "Bloqueando alguém",
"confirm_dialogs_delete": "Apagar um post",
"confirm_dialogs_deny_follow": "Rejeitando um pedido de seguir",
"confirm_dialogs_mute": "Silenciando alguém",
"confirm_dialogs_repeat": "Repetindo um post",
"confirm_dialogs_unfollow": "Deixando de seguir alguém",
"confirm_new_password": "Confirmar nova palavra-passe", "confirm_new_password": "Confirmar nova palavra-passe",
"confirmation_dialogs": "Opções de confirmação",
"conversation_display": "Estilo de mostrador de conversa",
"conversation_display_linear": "Estilo-linear",
"conversation_display_tree": "Estilo em árvore",
"conversation_other_replies_button": "Mostrar o botão de \"outras respostas\"",
"conversation_other_replies_button_below": "Abaixo das publicações",
"conversation_other_replies_button_inside": "Dentro das publicações",
"current_avatar": "Seu avatar atual", "current_avatar": "Seu avatar atual",
"current_mascot": "Seu mascote atual",
"current_password": "Palavra-passe atual", "current_password": "Palavra-passe atual",
"data_import_export_tab": "Importação/exportação de dados", "data_import_export_tab": "Importação/exportação de dados",
"default_vis": "Opção de privacidade padrão", "default_vis": "Opção de privacidade padrão",
@ -346,14 +528,32 @@
"delete_account_description": "Apagar os seus dados permanentemente e desativar a sua conta.", "delete_account_description": "Apagar os seus dados permanentemente e desativar a sua conta.",
"delete_account_error": "Ocorreu um erro ao remover a sua conta. Se este persistir, por favor entre em contato com o/a administrador/a da instância.", "delete_account_error": "Ocorreu um erro ao remover a sua conta. Se este persistir, por favor entre em contato com o/a administrador/a da instância.",
"delete_account_instructions": "Escreva a sua palavra-passe no campo abaixo para confirmar a remoção da conta.", "delete_account_instructions": "Escreva a sua palavra-passe no campo abaixo para confirmar a remoção da conta.",
"disable_sticky_headers": "Não fixe o cabeçalho das colunas no topo da tela",
"discoverable": "Permitir a descoberta desta conta em resultados de busca e outros serviços", "discoverable": "Permitir a descoberta desta conta em resultados de busca e outros serviços",
"domain_mutes": "Domínios", "domain_mutes": "Domínios",
"download_backup": "Baixar",
"email_language": "Idioma para receber emails do servidor",
"emoji_reactions_on_timeline": "Mostrar reações de emoji na timeline", "emoji_reactions_on_timeline": "Mostrar reações de emoji na timeline",
"enable_web_push_notifications": "Habilitar notificações web push", "enable_web_push_notifications": "Habilitar notificações web push",
"enter_current_password_to_confirm": "Introduza a sua palavra-passe atual para confirmar a sua identidade", "enter_current_password_to_confirm": "Introduza a sua palavra-passe atual para confirmar a sua identidade",
"expert_mode": "Mostrar avançado",
"expire_posts_enabled": "Apagar publicações depois de certos dias",
"expire_posts_input_placeholder": "Número de dias",
"export_theme": "Guardar predefinições", "export_theme": "Guardar predefinições",
"file_export_import": {
"backup_restore": "Backup de configurações",
"backup_settings": "Fazer backup das configurações para um arquivo",
"backup_settings_theme": "Fazer backup das configurações e do tema em um arquivo",
"errors": {
"file_slightly_new": "A versão secundária do arquivo é diferente, algumas configurações podem não carregar",
"file_too_new": "Versão principal incompatível: {fileMajor}, esse PleromaFE (versão {feMajor}) é muito antigo para manipulá-lo",
"file_too_old": "Versão principal incompatível: {fileMajor}, a versão do arquivo é muito antiga e não é suportada (versão mínima {feMajor})",
"invalid_file": "O arquivo selecionado não é um arquivo de backup de configurações suportado pelo Pleroma. Nenhuma mudança foi feita."
},
"restore_settings": "Restaurar configurações de um arquivo"
},
"filtering": "Filtragem", "filtering": "Filtragem",
"filtering_explanation": "Todas as publicações que contenham estas palavras serão silenciadas; uma palavra por linha", "filtering_explanation": "Todas as publicações que contenham estas palavras serão silenciadas, uma por linha",
"follow_export": "Exportar quem você segue", "follow_export": "Exportar quem você segue",
"follow_export_button": "Exportar quem você segue para um arquivo CSV", "follow_export_button": "Exportar quem você segue para um arquivo CSV",
"follow_import": "Importar quem você segue", "follow_import": "Importar quem você segue",
@ -363,18 +563,29 @@
"fun": "Divertido", "fun": "Divertido",
"general": "Geral", "general": "Geral",
"greentext": "Texto verde (meme arrows)", "greentext": "Texto verde (meme arrows)",
"hide_all_muted_posts": "Ocultar publicações silenciadas",
"hide_attachments_in_convo": "Ocultar anexos em conversas", "hide_attachments_in_convo": "Ocultar anexos em conversas",
"hide_attachments_in_tl": "Ocultar anexos na cronologia", "hide_attachments_in_tl": "Ocultar anexos na cronologia",
"hide_bot_indication": "Ocultar indicador de bots na publicação",
"hide_favorites_description": "Não mostrar a lista dos meus favoritos (as pessoas ainda serão notificadas)",
"hide_filtered_statuses": "Esconder posts filtrados", "hide_filtered_statuses": "Esconder posts filtrados",
"hide_followers_count_description": "Não mostrar o número de seguidores", "hide_followers_count_description": "Não mostrar o número de seguidores",
"hide_followers_description": "Não mostrar quem me segue", "hide_followers_description": "Não mostrar quem me segue",
"hide_follows_count_description": "Não mostrar o número de contas seguidas", "hide_follows_count_description": "Não mostrar o número de contas seguidas",
"hide_follows_description": "Não mostrar quem estou seguindo", "hide_follows_description": "Não mostrar quem estou seguindo",
"hide_isp": "Esconder painel específico da instância", "hide_isp": "Esconder painel específico da instância",
"hide_list_aliases_error_action": "Fechar",
"hide_media_previews": "Ocultar pré-visualização de mídia",
"hide_muted_posts": "Esconder posts de utilizadores silenciados", "hide_muted_posts": "Esconder posts de utilizadores silenciados",
"hide_muted_threads": "Ocultar fios silenciados",
"hide_post_stats": "Esconder estatísticas de posts (p. ex. número de favoritos)", "hide_post_stats": "Esconder estatísticas de posts (p. ex. número de favoritos)",
"hide_shoutbox": "Ocultar instâncias do shoutbox",
"hide_site_favicon": "Ocultar o favicon da instância no painel de topo",
"hide_site_name": "Ocultar nome da instância no painel de topo",
"hide_threads_with_blocked_users": "Ocultar fios mencionando usuários bloqueados",
"hide_user_stats": "Esconder estatísticas do usuário (p. ex. número de seguidores)", "hide_user_stats": "Esconder estatísticas do usuário (p. ex. número de seguidores)",
"hide_wallpaper": "Esconder papel de parede da instância", "hide_wallpaper": "Esconder papel de parede da instância",
"hide_wordfiltered_statuses": "Ocultar publicações com palavras-filtradas",
"import_blocks_from_a_csv_file": "Importar bloqueados a partir de um arquivo CSV", "import_blocks_from_a_csv_file": "Importar bloqueados a partir de um arquivo CSV",
"import_followers_from_a_csv_file": "Importe seguidores a partir de um arquivo CSV", "import_followers_from_a_csv_file": "Importe seguidores a partir de um arquivo CSV",
"import_mutes_from_a_csv_file": "Importar silenciados de um ficheiro csv", "import_mutes_from_a_csv_file": "Importar silenciados de um ficheiro csv",
@ -387,10 +598,23 @@
"invalid_theme_imported": "O arquivo selecionado não é um tema compatível com o Pleroma. Nenhuma mudança no tema foi feita.", "invalid_theme_imported": "O arquivo selecionado não é um tema compatível com o Pleroma. Nenhuma mudança no tema foi feita.",
"limited_availability": "Indisponível para seu navegador", "limited_availability": "Indisponível para seu navegador",
"links": "Links", "links": "Links",
"list_aliases_error": "Erro ao buscar por apelido: {error}",
"list_backups_error": "Erro ao buscar por lista de backup: {error}",
"lock_account_description": "Restringir sua conta a seguidores aprovados", "lock_account_description": "Restringir sua conta a seguidores aprovados",
"loop_video": "Repetir vídeos", "loop_video": "Repetir vídeos",
"loop_video_silent_only": "Repetir apenas vídeos sem som (como os \"gifs\" do Mastodon)", "loop_video_silent_only": "Repetir apenas vídeos sem som (como os \"gifs\" do Mastodon)",
"mascot": "Mascote do Mastodon FE",
"max_depth_in_thread": "Número máximo de níveis de um fio a serem mostrados por padrão",
"max_thumbnails": "Número máximo de miniaturas por post", "max_thumbnails": "Número máximo de miniaturas por post",
"mention_link_bolden_you": "Destaque suas menções quando você for mencionado",
"mention_link_display": "Mostre o link das menções",
"mention_link_display_full": "sempre como nomes completos (ex: {'@'}foo{'@'}example.org)",
"mention_link_display_full_for_remote": "como nomes completos para usuários remotos (ex: {'@'}foo{'@'}example.org)",
"mention_link_display_short": "sempre como nomes curtos (ex: {'@'}foo)",
"mention_link_fade_domain": "Renomear domínios (ex: {'@'}example.org em {'@'}foo{'@'}example.org)",
"mention_link_show_avatar": "Mostrar o avatar do usuário ao lado do link",
"mention_link_show_tooltip": "Mostrar o nome completo dos usuários como dica aos usuários remotos",
"mention_links": "Links de menções",
"mfa": { "mfa": {
"authentication_methods": "Métodos de autenticação", "authentication_methods": "Métodos de autenticação",
"confirm_and_enable": "Confirmar e ativar a palavra-passe de utilização única", "confirm_and_enable": "Confirmar e ativar a palavra-passe de utilização única",
@ -413,6 +637,13 @@
"warning_of_generate_new_codes": "Quando gera novos códigos de recuperação, os antigos deixam de funcionar." "warning_of_generate_new_codes": "Quando gera novos códigos de recuperação, os antigos deixam de funcionar."
}, },
"minimal_scopes_mode": "Minimizar as opções de publicação", "minimal_scopes_mode": "Minimizar as opções de publicação",
"more_settings": "Mais configurações",
"move_account": "Mover conta",
"move_account_error": "Erro ao mover conta: {error}",
"move_account_notes": "Se você deseja mover a sua conta para outro lugar, você deve ir à sua conta alvo e adicionar um apelido apontando para cá.",
"move_account_target": "Conta alvo (ex:. {example})",
"moved_account": "Conta foi movida.",
"mute_bot_posts": "Silenciar publicações de bots",
"mute_export": "Exportar silenciados", "mute_export": "Exportar silenciados",
"mute_export_button": "Exporta os silenciados para um ficheiro csv", "mute_export_button": "Exporta os silenciados para um ficheiro csv",
"mute_import": "Importar silenciados", "mute_import": "Importar silenciados",
@ -422,6 +653,7 @@
"mutes_tab": "Silenciados", "mutes_tab": "Silenciados",
"name": "Nome", "name": "Nome",
"name_bio": "Nome & Biografia", "name_bio": "Nome & Biografia",
"new_alias_target": "Adicionar um novo apelido (ex: {example})",
"new_email": "Novo endereço de e-mail", "new_email": "Novo endereço de e-mail",
"new_password": "Nova palavra-passe", "new_password": "Nova palavra-passe",
"no_blocks": "Sem bloqueios", "no_blocks": "Sem bloqueios",
@ -431,6 +663,7 @@
"notification_mutes": "Para deixar de receber notificações de um utilizador específico, silencia-o.", "notification_mutes": "Para deixar de receber notificações de um utilizador específico, silencia-o.",
"notification_setting_block_from_strangers": "Bloqueia as notificações de utilizadores que não segues", "notification_setting_block_from_strangers": "Bloqueia as notificações de utilizadores que não segues",
"notification_setting_filters": "Filtros", "notification_setting_filters": "Filtros",
"notification_setting_hide_if_cw": "Ocultar o conteúdo de uma notificação de push se estiver sob um Aviso de Conteúdo",
"notification_setting_hide_notification_contents": "Ocultar o remetente e o conteúdo das notificações push", "notification_setting_hide_notification_contents": "Ocultar o remetente e o conteúdo das notificações push",
"notification_setting_privacy": "Privacidade", "notification_setting_privacy": "Privacidade",
"notification_visibility": "Tipos de notificação para mostrar", "notification_visibility": "Tipos de notificação para mostrar",
@ -439,6 +672,7 @@
"notification_visibility_likes": "Favoritos", "notification_visibility_likes": "Favoritos",
"notification_visibility_mentions": "Menções", "notification_visibility_mentions": "Menções",
"notification_visibility_moves": "Utilizador Migrado", "notification_visibility_moves": "Utilizador Migrado",
"notification_visibility_polls": "Finais de enquetes nas quais você votou",
"notification_visibility_repeats": "Partilhas", "notification_visibility_repeats": "Partilhas",
"notifications": "Notificações", "notifications": "Notificações",
"nsfw_clickthrough": "Ativar clique em anexos e pré-visualizações de links para ocultar anexos NSFW", "nsfw_clickthrough": "Ativar clique em anexos e pré-visualizações de links para ocultar anexos NSFW",
@ -446,8 +680,11 @@
"pad_emoji": "Preencher espaços ao adicionar emojis do seletor", "pad_emoji": "Preencher espaços ao adicionar emojis do seletor",
"panelRadius": "Paineis", "panelRadius": "Paineis",
"pause_on_unfocused": "Parar transmissão quando a aba não estiver em primeiro plano", "pause_on_unfocused": "Parar transmissão quando a aba não estiver em primeiro plano",
"permit_followback_description": "Automaticamente aprove pedidos de usuários já seguidos",
"play_videos_in_modal": "Reproduzir vídeos diretamente no visualizador de multimédia", "play_videos_in_modal": "Reproduzir vídeos diretamente no visualizador de multimédia",
"post_status_content_type": "Tipo de conteúdo do status", "post_look_feel": "Aspecto das publicações",
"post_status_content_type": "Formato padrão da publicações",
"posts": "Publicações",
"preload_images": "Pré-carregar imagens", "preload_images": "Pré-carregar imagens",
"presets": "Predefinições", "presets": "Predefinições",
"profile_background": "Pano de fundo de perfil", "profile_background": "Pano de fundo de perfil",
@ -461,10 +698,16 @@
"profile_tab": "Perfil", "profile_tab": "Perfil",
"radii_help": "Arredondar arestas da interface (em pixel)", "radii_help": "Arredondar arestas da interface (em pixel)",
"refresh_token": "Atualizar Token", "refresh_token": "Atualizar Token",
"remove_alias": "Remover esse apelido",
"remove_backup": "Remover",
"render_mfm": "Renderizar Misskey do Markdown",
"render_mfm_on_hover": "Pausar animações MFM enquanto se rola a publicação",
"replies_in_timeline": "Respostas na cronologia", "replies_in_timeline": "Respostas na cronologia",
"reply_visibility_all": "Mostrar todas as respostas", "reply_visibility_all": "Mostrar todas as respostas",
"reply_visibility_following": "Só mostrar respostas direcionadas a mim ou a usuários que sigo", "reply_visibility_following": "Só mostrar respostas direcionadas a mim ou a usuários que sigo",
"reply_visibility_following_short": "Mostrar respostas aos meus seguidores",
"reply_visibility_self": "Só mostrar respostas direcionadas a mim", "reply_visibility_self": "Só mostrar respostas direcionadas a mim",
"reply_visibility_self_short": "Mostrar respostas apenas pra mim",
"reset_avatar": "Redefinir avatar", "reset_avatar": "Redefinir avatar",
"reset_avatar_confirm": "Tens a certeza que desejas redefinir o avatar?", "reset_avatar_confirm": "Tens a certeza que desejas redefinir o avatar?",
"reset_background_confirm": "Tens a certeza que desejas redefinir o fundo?", "reset_background_confirm": "Tens a certeza que desejas redefinir o fundo?",
@ -472,6 +715,8 @@
"reset_profile_background": "Redefinir fundo de perfil", "reset_profile_background": "Redefinir fundo de perfil",
"reset_profile_banner": "Redefinir imagem do cabeçalho do perfil", "reset_profile_banner": "Redefinir imagem do cabeçalho do perfil",
"revoke_token": "Revogar", "revoke_token": "Revogar",
"right_sidebar": "Reverter a ordem das colunas",
"save": "Salvas mudanças",
"saving_err": "Erro ao salvar configurações", "saving_err": "Erro ao salvar configurações",
"saving_ok": "Configurações salvas", "saving_ok": "Configurações salvas",
"scope_copy": "Copiar opções de privacidade ao responder (Mensagens diretas sempre copiam)", "scope_copy": "Copiar opções de privacidade ao responder (Mensagens diretas sempre copiam)",
@ -479,12 +724,36 @@
"search_user_to_mute": "Pesquisar utilizadores que pretende silenciar", "search_user_to_mute": "Pesquisar utilizadores que pretende silenciar",
"security": "Segurança", "security": "Segurança",
"security_tab": "Segurança", "security_tab": "Segurança",
"sensitive_by_default": "Marcas as publicações como sensíveis por padrão",
"sensitive_if_subject": "Automaticamente marque as imagens como sensíveis se um aviso de conteúdo é especificado",
"set_new_avatar": "Alterar avatar", "set_new_avatar": "Alterar avatar",
"set_new_mascot": "Definir novo mascote",
"set_new_profile_background": "Alterar o pano de fundo de perfil", "set_new_profile_background": "Alterar o pano de fundo de perfil",
"set_new_profile_banner": "Alterar capa de perfil", "set_new_profile_banner": "Alterar capa de perfil",
"setting_changed": "As configurações estão diferentes do padrão",
"setting_server_side": "Essas configurações estão vinculadas ao seu perfil e afetarão todas as sessões e clientes",
"settings": "Configurações", "settings": "Configurações",
"settings_profile": "Perfis de Configurações",
"settings_profile_creation": "Criar novo perfil",
"settings_profile_creation_new_name_label": "Nome",
"settings_profile_creation_submit": "Criar",
"settings_profile_currently": "Atualmente usando {name} (versão: {version})",
"settings_profile_delete": "Apagar",
"settings_profile_delete_confirm": "Você realmente quer apagar esse perfil?",
"settings_profile_force_sync": "Sincronizar",
"settings_profile_in_use": "Em uso",
"settings_profile_use": "Usar",
"settings_profiles_refresh": "Recarregar perfis de configuração",
"settings_profiles_show": "Mostrar todos os perfis de configuração",
"settings_profiles_unshow": "Esconder todos os perfis de configuração",
"show_admin_badge": "Mostrar título de Administrador em meu perfil", "show_admin_badge": "Mostrar título de Administrador em meu perfil",
"show_moderator_badge": "Mostrar título de Moderador em meu perfil", "show_moderator_badge": "Mostrar título de Moderador em meu perfil",
"show_nav_shortcuts": "Mostrar atalhos de navegação extras no painel de topo",
"show_page_backgrounds": "Mostrar imagens de fundo específicas por página, por exemplo: para perfis de usuários",
"show_panel_nav_shortcuts": "Mostrar atalhos de navegação da linha do tempo no painel de topo",
"show_scrollbars": "Mostrar barras de rolamento na coluna lateral",
"show_wider_shortcuts": "Mostrar espaçamento mais largo entre atalhos no painel de topo",
"show_yous": "Mostrar (seu)s",
"stop_gifs": "Reproduzir GIFs ao passar o cursor", "stop_gifs": "Reproduzir GIFs ao passar o cursor",
"streaming": "Habilitar o fluxo automático de postagens no topo da página", "streaming": "Habilitar o fluxo automático de postagens no topo da página",
"style": { "style": {
@ -633,9 +902,9 @@
"use_source": "Nova versão" "use_source": "Nova versão"
} }
}, },
"subject_input_always_show": "Sempre mostrar campo de assunto", "subject_input_always_show": "Sempre mostrar o campo de alerta de conteúdo",
"subject_line_behavior": "Copiar assunto ao responder", "subject_line_behavior": "Copiar o aviso de conteúdo ao responder",
"subject_line_email": "Como num e-mail: \"re: assunto\"", "subject_line_email": "Como email: \"re: aviso\"",
"subject_line_mastodon": "Como o Mastodon: copiar como está", "subject_line_mastodon": "Como o Mastodon: copiar como está",
"subject_line_noop": "Não copiar", "subject_line_noop": "Não copiar",
"text": "Texto", "text": "Texto",
@ -643,15 +912,29 @@
"theme_help": "Use cores em código hexadecimal (#rrggbb) para personalizar seu esquema de cores.", "theme_help": "Use cores em código hexadecimal (#rrggbb) para personalizar seu esquema de cores.",
"theme_help_v2_1": "Você também pode sobrescrever as cores e opacidade de alguns componentes ao modificar o checkbox, use \"Limpar todos\" para limpar todas as modificações.", "theme_help_v2_1": "Você também pode sobrescrever as cores e opacidade de alguns componentes ao modificar o checkbox, use \"Limpar todos\" para limpar todas as modificações.",
"theme_help_v2_2": "Alguns ícones em registo são indicadores de fundo/contraste de textos, passe por cima para obter informações detalhadas. Tenha em atenção que os indicadores de contraste não funcionam muito bem com transparência.", "theme_help_v2_2": "Alguns ícones em registo são indicadores de fundo/contraste de textos, passe por cima para obter informações detalhadas. Tenha em atenção que os indicadores de contraste não funcionam muito bem com transparência.",
"third_column_mode": "Quando há espaço suficiente, mostrar a terceira coluna",
"third_column_mode_none": "Não mostre a terceira coluna de forma alguma",
"third_column_mode_notifications": "Coluna de notificações",
"third_column_mode_postform": "Formulário principal para publicações e navegação",
"token": "Token", "token": "Token",
"tooltipRadius": "Dicas/alertas", "tooltipRadius": "Dicas/alertas",
"translation_language": "Linguagem Automática para Tradução",
"tree_advanced": "Mostrar botões extras para abrir e fechar cadeias de respostas em fios",
"tree_fade_ancestors": "Mostrar ancestrais da publicação atual em texto fraco",
"type_domains_to_mute": "Pesquisar domínios para silenciar", "type_domains_to_mute": "Pesquisar domínios para silenciar",
"upload_a_photo": "Enviar uma foto", "upload_a_photo": "Enviar uma foto",
"useStreamingApi": "Receber publicações e notificações em tempo real", "useStreamingApi": "Receber publicações e notificações em tempo real",
"useStreamingApiWarning": "É legal usar isso. Se der algum problema, atualize, eu acho?", "useStreamingApiWarning": "É legal usar isso. Se der algum problema, atualize, eu acho?",
"use_blurhash": "Usar miniaturas borradas para imagens NSFW",
"use_contain_fit": "Não cortar o anexo na miniatura", "use_contain_fit": "Não cortar o anexo na miniatura",
"use_one_click_nsfw": "Abrir anexos sensíveis com um clique", "use_one_click_nsfw": "Abrir anexos sensíveis com um clique",
"user_accepts_direct_messages_from": "Aceitar DMs De",
"user_accepts_direct_messages_from_everybody": "Todos",
"user_accepts_direct_messages_from_nobody": "Ninguém",
"user_accepts_direct_messages_from_people_i_follow": "Pessoas que eu sigo",
"user_mutes": "Utilizadores", "user_mutes": "Utilizadores",
"user_profile_default_tab": "Aba Padrão no Perfil de Usuário",
"user_profiles": "Perfis de Usuários",
"user_settings": "Configurações de Usuário", "user_settings": "Configurações de Usuário",
"valid_until": "Válido até", "valid_until": "Válido até",
"values": { "values": {
@ -663,34 +946,87 @@
"frontend_version": "Versão do Frontend", "frontend_version": "Versão do Frontend",
"title": "Versão" "title": "Versão"
}, },
"virtual_scrolling": "Otimizar a apresentação da cronologia" "virtual_scrolling": "Otimizar a apresentação da cronologia",
"word_filter": "Filtro de palavras",
"wordfilter": "Filtro de palavras"
},
"settings_profile": {
"creating": "Criando novo perfil de configurações \"{profile}\"...",
"synchronization_error": "Não foi possível sincronizar as configurações : {err}",
"synchronized": "Configurações sincronizadas!",
"synchronizing": "Sincronizando perfil de configurações \"{profile}\"..."
}, },
"status": { "status": {
"ancestor_follow": "Veja mais {numReplies} outra resposta abaixo dessa publicação | Veja mais {numReplies} outras respostas abaixo dessa publicação",
"ancestor_follow_with_icon": "{icon} {text}",
"attachment_stop_flash": "Parar Flash Player",
"bookmark": "Guardar", "bookmark": "Guardar",
"copy_link": "Copiar o link do post", "collapse_attachments": "Colapsar anexos",
"delete": "Eliminar publicação", "copy_link": "Copiar link para publicação",
"delete_confirm": "Tens a certeza que desejas apagar a publicação?", "delete": "Apagar publicação",
"delete_confirm": "Você realmente deseja apagar essa publicação?",
"delete_confirm_accept_button": "Sim, apague-a",
"delete_confirm_cancel_button": "Não, mantenha-a",
"delete_confirm_title": "Confirmar exclusão",
"edit": "Editar",
"edit_history": "Editar Histórico",
"edit_history_modal_title": "Editado {historyCount} vez | Editado {historyCount} vezes",
"edited_at": "Editado {time}",
"expand": "Expandir", "expand": "Expandir",
"external_source": "Fonte externa", "external_source": "Fonte externa",
"favorites": "Favoritos", "favorites": "Favoritos",
"hide_attachment": "Esconder anexo",
"hide_content": "Ocultar o conteúdo", "hide_content": "Ocultar o conteúdo",
"hide_full_subject": "Ocultar o assunto completo", "hide_full_subject": "Ocultar todo o aviso de conteúdo",
"many_attachments": "A publicação tem {number} anexo | A publicação tem {number} anexos",
"mentions": "Menções",
"move_down": "Deslocar anexo à direita",
"move_up": "Deslocar anexo à esquerda",
"mute_conversation": "Silenciar a conversação", "mute_conversation": "Silenciar a conversação",
"nsfw": "NSFW (Não apropriado para trabalho)", "nsfw": "NSFW (Não apropriado para trabalho)",
"open_gallery": "Abrir galeria",
"override_translation_source_language": "Sobrepor a língua de origem",
"pin": "Fixar no perfil", "pin": "Fixar no perfil",
"pinned": "Afixado", "pinned": "Afixado",
"plus_more": "+{number} mais",
"redraft": "Apagar & Reformar",
"redraft_confirm": "Você realmente deseja apagar e refazer essa publicação? Interações com a publicação original não serão preservadas.",
"redraft_confirm_accept_button": "Sim, apague e reformule",
"redraft_confirm_cancel_button": "Não, mantenha o original",
"redraft_confirm_title": "Confirmar exclusão & refatoração",
"remove_attachment": "Remover anexo",
"repeat_confirm": "Você realmente deseja repetir essa publicação?",
"repeat_confirm_accept_button": "Sim, repita-a",
"repeat_confirm_cancel_button": "Não, não repita",
"repeat_confirm_title": "Confirmar repetição",
"repeats": "Partilhados", "repeats": "Partilhados",
"replies_list": "Respostas:", "replies_list": "Respostas:",
"replies_list_with_others": "Ver mais {numReplies} resposta | Veja mais {numReplies} respostas",
"reply_to": "Responder a", "reply_to": "Responder a",
"show_all_attachments": "Mostrar todos os anexos",
"show_all_conversation": "Mostrar toda a conversa ({numStatus} outra publicação) | Mostrar toda a conversa ({numStatus} outras publicações)",
"show_all_conversation_with_icon": "{icon} {text}",
"show_attachment_description": "Prever a descrição (abra o anexo para a descrição completa)",
"show_attachment_in_modal": "Mostrar anexos em uma janela",
"show_content": "Mostrar o conteúdo", "show_content": "Mostrar o conteúdo",
"show_full_subject": "Mostrar o assunto completo", "show_full_subject": "Mostra todo o aviso de conteúdo",
"show_only_conversation_under_this": "Mostrar apenas as respostas para essa publicação",
"status_deleted": "Esta publicação foi apagada", "status_deleted": "Esta publicação foi apagada",
"status_unavailable": "Publicação indisponível", "status_unavailable": "Publicação indisponível",
"thread_follow": "Ver mais {numStatus} resposta | Ver mais {numStatus} respostas",
"thread_follow_with_icon": "{icon} {text}",
"thread_hide": "Esconder esse fio",
"thread_muted": "Conversação silenciada", "thread_muted": "Conversação silenciada",
"thread_muted_and_words": ", contém:", "thread_muted_and_words": ", contém:",
"thread_show": "Mostrar esse fio",
"thread_show_full": "Mostrar {numStatus} resposta | Mostrar todas as {numStatus} respostas",
"thread_show_full_with_icon": "{icon} {text}",
"translate": "Traduzir",
"translated_from": "Traduzir de {language}",
"unbookmark": "Remover post dos Items Guardados", "unbookmark": "Remover post dos Items Guardados",
"unmute_conversation": "Mostrar a conversação", "unmute_conversation": "Mostrar a conversação",
"unpin": "Desafixar do perfil" "unpin": "Desafixar do perfil",
"you": "(Você)"
}, },
"time": { "time": {
"in_future": "em {0}", "in_future": "em {0}",
@ -718,21 +1054,29 @@
"collapse": "Esconder", "collapse": "Esconder",
"conversation": "Conversa", "conversation": "Conversa",
"error": "Erro a obter a cronologia: {0}", "error": "Erro a obter a cronologia: {0}",
"load_older": "Carregar postagens antigas", "follow_tag": "Seguir hashtag",
"load_older": "Carregar publicações antigas",
"no_more_statuses": "Sem mais posts", "no_more_statuses": "Sem mais posts",
"no_retweet_hint": "Posts apenas para seguidores ou diretos não podem ser partilhados", "no_retweet_hint": "Posts apenas para seguidores ou diretos não podem ser partilhados",
"no_statuses": "Sem posts", "no_statuses": "Sem publicações",
"reload": "Recarregar", "reload": "Recarregar",
"repeated": "partilhado", "repeated": "partilhado",
"show_new": "Mostrar novas", "show_new": "Mostrar novas",
"socket_broke": "Conexão em tempo real perdida : CloseEvent código {0}",
"socket_reconnected": "Conexão em tempo-real estabelecida",
"unfollow_tag": "Deixar de seguir hashtag",
"up_to_date": "Atualizado" "up_to_date": "Atualizado"
}, },
"toast": {
"no_translation_target_set": "Linguagem alvo para tradução não definida - isso pode falhar. Por favor, defina uma linguagem alvo nas suas configurações."
},
"tool_tip": { "tool_tip": {
"accept_follow_request": "Aceitar o pedido de seguimento", "accept_follow_request": "Aceitar o pedido de seguimento",
"add_reaction": "Adicionar Reação", "add_reaction": "Adicionar Reação",
"bookmark": "Guardar", "bookmark": "Guardar",
"favorite": "Favoritar", "favorite": "Favoritar",
"media_upload": "Envio de multimédia", "media_upload": "Envio de multimédia",
"quote": "Citação",
"reject_follow_request": "Rejeitar o pedido de seguimento", "reject_follow_request": "Rejeitar o pedido de seguimento",
"repeat": "Partilhar", "repeat": "Partilhar",
"reply": "Responder", "reply": "Responder",
@ -759,6 +1103,7 @@
"deactivate_account": "Desativar conta", "deactivate_account": "Desativar conta",
"delete_account": "Eliminar Conta", "delete_account": "Eliminar Conta",
"delete_user": "Eliminar utilizador", "delete_user": "Eliminar utilizador",
"delete_user_data_and_deactivate_confirmation": "Isso irá permanentemente apagar os dados dessa conta e a desativar. Você tem certeza disso?",
"disable_any_subscription": "Não permitir que nenhum utilizador te siga", "disable_any_subscription": "Não permitir que nenhum utilizador te siga",
"disable_remote_subscription": "Não permitir seguidores de instâncias remotas", "disable_remote_subscription": "Não permitir seguidores de instâncias remotas",
"force_nsfw": "Marcar todas as publicações como NSFW (não apropriado para o trabalho)", "force_nsfw": "Marcar todas as publicações como NSFW (não apropriado para o trabalho)",
@ -773,41 +1118,84 @@
"strip_media": "Eliminar ficheiros multimédia das publicações" "strip_media": "Eliminar ficheiros multimédia das publicações"
}, },
"approve": "Aprovar", "approve": "Aprovar",
"approve_confirm": "Você tem certeza que deseja permitir que esse usuário lhe siga?",
"approve_confirm_accept_button": "Sim, aceitar",
"approve_confirm_cancel_button": "No, cancelar",
"approve_confirm_title": "Aprovar pedido para seguir",
"block": "Bloquear", "block": "Bloquear",
"block_confirm": "Você tem certeza que deseja bloquear {user}?",
"block_confirm_accept_button": "Sim, bloquear",
"block_confirm_cancel_button": "Não, não bloqueie",
"block_confirm_title": "Bloquear usuário",
"block_progress": "A bloquear…", "block_progress": "A bloquear…",
"blocked": "Bloqueado!", "blocked": "Bloqueado!",
"blocks_you": "Bloqueia você!",
"bot": "Bot",
"deactivated": "Desativado",
"deny": "Negar", "deny": "Negar",
"deny_confirm": "Você tem certeza que deseja negar o pedido de te seguir desse usuário?",
"deny_confirm_accept_button": "Sim, negar",
"deny_confirm_cancel_button": "Não, cancelar",
"deny_confirm_title": "Negar pedido para seguir",
"domain_muted": "Desbloquear domínio",
"edit_profile": "Editar perfil",
"favorites": "Favoritos", "favorites": "Favoritos",
"follow": "Seguir", "follow": "Seguir",
"follow_cancel": "Cancelar pedido",
"follow_progress": "Enviando…", "follow_progress": "Enviando…",
"follow_sent": "Pedido enviado!", "follow_sent": "Pedido enviado!",
"follow_tag": "Seguir hashtag",
"follow_unfollow": "Deixar de seguir", "follow_unfollow": "Deixar de seguir",
"followed_tags": "Hashtags seguidas",
"followed_users": "Usuários seguidos",
"followees": "Seguindo", "followees": "Seguindo",
"followers": "Seguidores", "followers": "Seguidores",
"following": "Seguindo!", "following": "Seguindo!",
"follows_you": "Segue você!", "follows_you": "Segue você!",
"hidden": "Ocultar", "hidden": "Ocultar",
"hide_repeats": "Ocultar partilhas", "hide_repeats": "Ocultar partilhas",
"highlight": {
"disabled": "Sem destaques",
"side": "Faixa lateral",
"solid": "Fundo sólido",
"striped": "Fundo listrado"
},
"its_you": "É você!", "its_you": "É você!",
"media": "Multimédia", "media": "Multimédia",
"mention": "Mencionar", "mention": "Mencionar",
"message": "Mensagem", "message": "Mensagem",
"mute": "Silenciar", "mute": "Silenciar",
"mute_confirm": "Você tem certeza que deseja silenciar {user}?",
"mute_confirm_accept_button": "Sim, silenciar",
"mute_confirm_cancel_button": "Não, não silenciar",
"mute_confirm_title": "Silenciar usuário",
"mute_domain": "Bloquear domínio",
"mute_progress": "A silenciar…", "mute_progress": "A silenciar…",
"muted": "Silenciado", "muted": "Silenciado",
"not_following_any_hashtags": "Você não está seguindo nenhuma hashtag",
"note": "Nota privada",
"per_day": "por dia", "per_day": "por dia",
"remote_follow": "Seguir remotamente", "remote_follow": "Seguir remotamente",
"remove_follower": "Remover seguidor",
"replies": "Com Respostas",
"report": "Denunciar", "report": "Denunciar",
"requested_by": "Pediu para te seguir",
"show_repeats": "Mostrar partilhas", "show_repeats": "Mostrar partilhas",
"statuses": "Postagens", "statuses": "Publicações",
"subscribe": "Subscrever", "subscribe": "Subscrever",
"unblock": "Desbloquear", "unblock": "Desbloquear",
"unblock_progress": "A desbloquear…", "unblock_progress": "A desbloquear…",
"unfollow_confirm": "Você tem certeza que deseja deixar de seguir {user}?",
"unfollow_confirm_accept_button": "Sim, deixar de seguir",
"unfollow_confirm_cancel_button": "Não, não deixe de seguir",
"unfollow_confirm_title": "Deixar de seguir usuário",
"unfollow_tag": "Deixar de seguir hashtag",
"unmute": "Retirar silêncio", "unmute": "Retirar silêncio",
"unmute_progress": "A retirar silêncio…", "unmute_progress": "A retirar silêncio…",
"unsubscribe": "Retirar subscrição" "unsubscribe": "Retirar subscrição"
}, },
"user_profile": { "user_profile": {
"field_validated": "Link Verificado",
"profile_does_not_exist": "Desculpe, este perfil não existe.", "profile_does_not_exist": "Desculpe, este perfil não existe.",
"profile_loading_error": "Desculpe, houve um erro ao carregar este perfil.", "profile_loading_error": "Desculpe, houve um erro ao carregar este perfil.",
"timeline_title": "Cronologia do Utilizador" "timeline_title": "Cronologia do Utilizador"

View file

@ -1,4 +1,3 @@
/* eslint-disable import/no-webpack-loader-syntax */
// This module exports only the notification part of the i18n, // This module exports only the notification part of the i18n,
// which is useful for the service worker // which is useful for the service worker

View file

@ -872,8 +872,8 @@
"subject_input_always_show": "Luôn hiện hộp nhập cảnh báo nội dung", "subject_input_always_show": "Luôn hiện hộp nhập cảnh báo nội dung",
"subject_line_behavior": "Chép cảnh báo về nội dung khi trả lời", "subject_line_behavior": "Chép cảnh báo về nội dung khi trả lời",
"subject_line_email": "Như email: \"re: cảnh báo\"", "subject_line_email": "Như email: \"re: cảnh báo\"",
"subject_line_mastodon": "Giống Mastodon: copy as is", "subject_line_mastodon": "Giống Mastodon: giữ nguyên",
"subject_line_noop": "Đừng chép", "subject_line_noop": "Không chép",
"text": "Văn bản", "text": "Văn bản",
"theme": "Theme", "theme": "Theme",
"theme_help": "Dùng mã màu hex (#rrggbb) để tự chế theme.", "theme_help": "Dùng mã màu hex (#rrggbb) để tự chế theme.",

View file

@ -407,7 +407,8 @@
"private": "此帖文仅对你的关注者可见", "private": "此帖文仅对你的关注者可见",
"public": "此帖文对所有人可见", "public": "此帖文对所有人可见",
"unlisted": "此帖文在公共时间线和所有已知网络上均不可见" "unlisted": "此帖文在公共时间线和所有已知网络上均不可见"
} },
"toggle_content_warning": "切换内容警告"
}, },
"registration": { "registration": {
"awaiting_email_confirmation": "你的账号已被注册,一封电子邮件已发到你的地址。请检查电子邮件以完成注册。", "awaiting_email_confirmation": "你的账号已被注册,一封电子邮件已发到你的地址。请检查电子邮件以完成注册。",
@ -679,6 +680,7 @@
"pad_emoji": "从表情符号选择器插入表情符号时,在表情两侧插入空格", "pad_emoji": "从表情符号选择器插入表情符号时,在表情两侧插入空格",
"panelRadius": "面板", "panelRadius": "面板",
"pause_on_unfocused": "在离开页面时暂停时间线推送", "pause_on_unfocused": "在离开页面时暂停时间线推送",
"permit_followback_description": "自动批准已关注用户的关注请求",
"play_videos_in_modal": "在弹出框内播放视频", "play_videos_in_modal": "在弹出框内播放视频",
"post_look_feel": "文章的样子跟感受", "post_look_feel": "文章的样子跟感受",
"post_status_content_type": "默认发布的内容类型", "post_status_content_type": "默认发布的内容类型",
@ -747,6 +749,7 @@
"show_admin_badge": "在我的个人资料中显示“管理员”徽章", "show_admin_badge": "在我的个人资料中显示“管理员”徽章",
"show_moderator_badge": "在我的个人资料中显示“监察员”徽章", "show_moderator_badge": "在我的个人资料中显示“监察员”徽章",
"show_nav_shortcuts": "在顶部面板中显示额外的导航快捷键", "show_nav_shortcuts": "在顶部面板中显示额外的导航快捷键",
"show_page_backgrounds": "显示特定页面的背景,例如用户个人资料页",
"show_panel_nav_shortcuts": "在面板顶部显示时间线导航快捷键", "show_panel_nav_shortcuts": "在面板顶部显示时间线导航快捷键",
"show_scrollbars": "显示侧栏的滚动条", "show_scrollbars": "显示侧栏的滚动条",
"show_wider_shortcuts": "在顶部面板快捷键之间显示更宽的间隙", "show_wider_shortcuts": "在顶部面板快捷键之间显示更宽的间隙",

View file

@ -1,5 +1,7 @@
{ {
"about": { "about": {
"bubble_instances": "本地局域實例",
"bubble_instances_description": "管理員推薦的實例",
"mrf": { "mrf": {
"federation": "聯邦", "federation": "聯邦",
"keyword": { "keyword": {
@ -16,12 +18,15 @@
"accept_desc": "本實例只接收來自下列實例的消息:", "accept_desc": "本實例只接收來自下列實例的消息:",
"ftl_removal": "從所有已知網路中移除", "ftl_removal": "從所有已知網路中移除",
"ftl_removal_desc": "這個實例在所有已知網絡中移除下列實例:", "ftl_removal_desc": "這個實例在所有已知網絡中移除下列實例:",
"instance": "實例",
"media_nsfw": "媒體強制設定為敏感", "media_nsfw": "媒體強制設定為敏感",
"media_nsfw_desc": "這個實例強迫以下實例的帖子媒體設定為敏感:", "media_nsfw_desc": "這個實例把以下實例的貼文媒體強制設定為敏感:",
"media_removal": "移除媒體", "media_removal": "移除媒體",
"media_removal_desc": "這個實例移除以下實例的帖子媒體:", "media_removal_desc": "這個實例移除以下實例的貼文媒體:",
"not_applicable": "無",
"quarantine": "隔離", "quarantine": "隔離",
"quarantine_desc": "本實例只會把公開發文發送到下列實例:", "quarantine_desc": "本實例不會向下列實例發佈貼文:",
"reason": "理由",
"reject": "拒絕", "reject": "拒絕",
"reject_desc": "本實例不會接收來自下列實例的消息:", "reject_desc": "本實例不會接收來自下列實例的消息:",
"simple_policies": "站規" "simple_policies": "站規"
@ -29,6 +34,27 @@
}, },
"staff": "職員" "staff": "職員"
}, },
"announcements": {
"all_day_prompt": "這是一個全天事件",
"cancel_edit_action": "取消",
"close_error": "關閉",
"delete_action": "刪除",
"edit_action": "編輯",
"end_time_display": "結束於 {time}",
"end_time_prompt": "結束時間: ",
"inactive_message": "此公告處於非活躍狀態",
"mark_as_read_action": "標爲已讀",
"page_header": "公告",
"post_action": "發佈",
"post_error": "錯誤:{error}",
"post_form_header": "發佈公告",
"post_placeholder": "公告內容",
"published_time_display": "發表於 {time}",
"start_time_display": "開始於 {time}",
"start_time_prompt": "開始時間: ",
"submit_edit_action": "提交",
"title": "公告"
},
"chats": { "chats": {
"chats": "聊天", "chats": "聊天",
"delete": "刪除", "delete": "刪除",
@ -58,6 +84,7 @@
"keep_open": "選擇器保持打開", "keep_open": "選擇器保持打開",
"load_all": "加載所有繪文字(共 {emojiAmount} 個)", "load_all": "加載所有繪文字(共 {emojiAmount} 個)",
"load_all_hint": "最先加載的 {saneAmount} ,加載全部繪文字可能會帶來性能問題。", "load_all_hint": "最先加載的 {saneAmount} ,加載全部繪文字可能會帶來性能問題。",
"recent": "最近使用",
"search_emoji": "搜索繪文字", "search_emoji": "搜索繪文字",
"stickers": "貼紙", "stickers": "貼紙",
"unicode": "統一碼繪文字" "unicode": "統一碼繪文字"
@ -71,10 +98,10 @@
}, },
"features_panel": { "features_panel": {
"media_proxy": "媒體代理", "media_proxy": "媒體代理",
"scope_options": "可見範圍設置", "scope_options": "貼文可見範圍設置",
"text_limit": "文字數量限制", "text_limit": "文字數量限制",
"title": "特色", "title": "功能",
"upload_limit": "上傳限制", "upload_limit": "上傳大小限制",
"who_to_follow": "推薦關注" "who_to_follow": "推薦關注"
}, },
"file_type": { "file_type": {
@ -109,6 +136,13 @@
"admin": "管理員", "admin": "管理員",
"moderator": "主持人" "moderator": "主持人"
}, },
"scope_in_timeline": {
"direct": "私信",
"local": "本地 - 僅你所在的實例能看到此貼文",
"private": "僅關注者",
"public": "公開",
"unlisted": "不公開"
},
"show_less": "收起", "show_less": "收起",
"show_more": "展開", "show_more": "展開",
"submit": "提交", "submit": "提交",
@ -131,6 +165,84 @@
"load_older": "載入更早的互動", "load_older": "載入更早的互動",
"moves": "用戶遷移" "moves": "用戶遷移"
}, },
"languages": {
"ar": "阿拉伯文",
"az": "阿塞拜疆語",
"bg": "保加利亞語",
"cs": "捷克語",
"da": "丹麥語",
"de": "德語",
"el": "希臘語",
"en": "英語",
"eo": "世界語",
"es": "西班牙語",
"fa": "波斯語",
"fi": "芬蘭語",
"fr": "法語",
"ga": "愛爾蘭語",
"he": "希伯來語",
"hi": "印地語",
"hu": "匈牙利語",
"id": "印度尼西亞語",
"it": "義大利語",
"ja": "日語",
"ko": "韓語",
"lt": "立陶宛語",
"lv": "拉脫維亞語",
"nl": "荷蘭語",
"pl": "波蘭語",
"pt": "葡萄牙語",
"ru": "俄語",
"sk": "斯洛伐克語",
"sv": "瑞典語",
"tr": "土耳其語",
"translated_from": {
"ar": "翻譯自 @:languages.ar",
"az": "翻譯自 @:languages.az",
"bg": "翻譯自 @:languages.bg",
"cs": "翻譯自 @:languages.cs",
"da": "翻譯自 @:languages.da",
"de": "翻譯自 @:languages.de",
"el": "翻譯自 @:languages.el",
"en": "翻譯自 @:languages.en",
"eo": "翻譯自 @:languages.eo",
"es": "翻譯自 @:languages.es",
"fa": "翻譯自 @:languages.fa",
"fi": "翻譯自 @:languages.fi",
"fr": "翻譯自 @:languages.fr",
"ga": "翻譯自 @:languages.ga",
"he": "翻譯自 @:languages.he",
"hi": "翻譯自 @:languages.hi",
"hu": "翻譯自 @:languages.hu",
"id": "翻譯自 @:languages.id",
"it": "翻譯自 @:languages.it",
"ja": "翻譯自 @:languages.ja",
"ko": "翻譯自 @:languages.ko",
"lt": "翻譯自 @:languages.lt",
"lv": "翻譯自 @:languages.lv",
"nl": "翻譯自 @:languages.nl",
"pl": "翻譯自 @:languages.pl",
"pt": "翻譯自 @:languages.pt",
"ru": "翻譯自 @:languages.ru",
"sk": "翻譯自 @:languages.sk",
"sv": "翻譯自 @:languages.sv",
"tr": "翻譯自 @:languages.tr",
"uk": "翻譯自 @:languages.uk",
"zh": "翻譯自 @:languages.zh"
},
"uk": "烏克蘭語",
"zh": "中文"
},
"lists": {
"create": "創建",
"delete": "刪除列表",
"following_only": "只限於關注中的用戶",
"lists": "列表",
"new": "新建列表",
"save": "保存更改",
"search": "搜索用戶",
"title": "列表標題"
},
"login": { "login": {
"authentication_code": "驗證碼", "authentication_code": "驗證碼",
"description": "用 OAuth 登入", "description": "用 OAuth 登入",
@ -143,54 +255,95 @@
"hint": "登錄後加入討論", "hint": "登錄後加入討論",
"login": "登入", "login": "登入",
"logout": "登出", "logout": "登出",
"logout_confirm": "你確定要登出嗎?",
"logout_confirm_accept_button": "登出",
"logout_confirm_cancel_button": "取消",
"logout_confirm_title": "登出",
"password": "密碼", "password": "密碼",
"placeholder": "例:鈴音", "placeholder": "我的用户名",
"recovery_code": "恢復碼", "recovery_code": "恢復碼",
"register": "註冊", "register": "註冊",
"username": "用戶名" "username": "用戶名"
}, },
"media_modal": { "media_modal": {
"counter": "{current} / {total}",
"hide": "關閉媒體閱讀器",
"next": "往後", "next": "往後",
"previous": "往前" "previous": "往前"
}, },
"moderation": {
"moderation": "審核",
"reports": {
"add_note": "添加備註",
"close": "關閉",
"delete_note": "删除",
"delete_note_accept": "是,確認刪除",
"delete_note_cancel": "否,保留它",
"delete_note_confirm": "你確定要刪除此備註嗎?",
"delete_note_title": "確認刪除",
"no_content": "沒有給出描述",
"no_reports": "沒有舉報可顯示",
"note_placeholder": "留下備註",
"notes": "{ count } 條備註",
"reopen": "重新處理",
"report": "舉報於",
"reports": "舉報",
"resolve": "解決",
"show_closed": "顯示已解決的舉報",
"statuses": "{ count } 則貼文",
"tag_policy_notice": "啟用 TagPolicy MRF 來設置貼文限制",
"tags": "設置貼文限制"
},
"statuses": "貼文",
"users": "用户"
},
"nav": { "nav": {
"about": "關於", "about": "關於",
"administration": "管理員", "administration": "管理員",
"announcements": "公告",
"back": "後退", "back": "後退",
"bookmarks": "書籤", "bookmarks": "書籤",
"bubble_timeline": "局域時間線",
"bubble_timeline_description": "由管理員推薦,來自你所在實例相近的實例的貼文",
"chats": "聊天", "chats": "聊天",
"dms": "私信", "dms": "私信",
"friend_requests": "關注請求", "friend_requests": "關注請求",
"home_timeline": "家時間線", "home_timeline": "家時間線",
"home_timeline_description": "來自你所關注的人的貼文",
"interactions": "互動", "interactions": "互動",
"lists": "列表",
"mentions": "提及", "mentions": "提及",
"moderation": "審核",
"preferences": "偏好設置", "preferences": "偏好設置",
"public_timeline_description": "來自此實例的公開貼文",
"public_tl": "公共時間線", "public_tl": "公共時間線",
"search": "搜索", "search": "搜索",
"timeline": "時間線", "timeline": "時間線",
"timelines": "時間線", "timelines": "時間線",
"twkn": "已知網絡", "twkn": "已知網絡",
"twkn_timeline_description": "來自整個網絡的貼文",
"user_search": "用戶搜索", "user_search": "用戶搜索",
"who_to_follow": "推薦關注" "who_to_follow": "推薦關注"
}, },
"notifications": { "notifications": {
"broken_favorite": "未知的狀態,正在搜索中…", "broken_favorite": "未知帖文,搜索中…",
"error": "獲取通知錯誤:{0}", "error": "獲取通知錯誤:{0}",
"favorited_you": "喜歡了你的發文", "favorited_you": "喜歡了你的文",
"follow_request": "想要關注你", "follow_request": "想要關注你",
"followed_you": "關注了你", "followed_you": "關注了你",
"load_older": "載入更早的通知", "load_older": "載入更早的通知",
"migrated_to": "遷移到", "migrated_to": "遷移到",
"no_more_notifications": "沒有更多的通知", "no_more_notifications": "沒有更多的通知",
"notifications": "通知", "notifications": "通知",
"poll_ended": "投票已結束",
"reacted_with": "作出了 {0} 的反應", "reacted_with": "作出了 {0} 的反應",
"read": "已閱!", "read": "已閱!",
"repeated_you": "轉發了你的文" "repeated_you": "轉發了你的文"
}, },
"password_reset": { "password_reset": {
"check_email": "檢查你的郵箱,會有一個鏈接用於重置密碼。", "check_email": "請檢查你的郵箱,將會發送用於重置密碼的鏈結。",
"forgot_password": "忘記密碼了?", "forgot_password": "忘記密碼了?",
"instruction": "輸入你的電郵地址或者用戶名,我們將發送一個鏈到你的郵箱,用於重置密碼。", "instruction": "輸入你的電郵地址或者用戶名,我們將發送一個鏈到你的郵箱,用於重置密碼。",
"password_reset": "重置密碼", "password_reset": "重置密碼",
"password_reset_disabled": "密碼重置已經被禁用。請聯繫你的實例管理員。", "password_reset_disabled": "密碼重置已經被禁用。請聯繫你的實例管理員。",
"password_reset_required": "您必須重置密碼才能登陸。", "password_reset_required": "您必須重置密碼才能登陸。",
@ -223,47 +376,60 @@
"text/bbcode": "BBCode", "text/bbcode": "BBCode",
"text/html": "HTML", "text/html": "HTML",
"text/markdown": "Markdown", "text/markdown": "Markdown",
"text/plain": "純文本" "text/plain": "純文本",
"text/x.misskeymarkdown": "MFM"
}, },
"content_warning": "主題(可選)", "content_warning": "內容警告(可選)",
"default": "剛剛抵達洛杉磯。", "default": "剛剛抵達洛杉磯。",
"direct_warning_to_all": "本條內容只有被提及的用戶能夠看到。", "direct_warning_to_all": "本條內容只有被提及的用戶能夠看到。",
"direct_warning_to_first_only": "本條內容只有被在消息開始處提及的用戶能夠看到。", "direct_warning_to_first_only": "本條內容只有被在消息開始處提及的用戶能夠看到。",
"empty_status_error": "不能發布沒有內容,沒有附件的發文", "edit_remote_warning": "對帖文所做的更改在某些實例上可能不可見!",
"edit_status": "編輯狀態",
"edit_unsupported_warning": "投票和提及不會因編輯而更改。",
"empty_status_error": "不能發佈沒有內容或附件的帖文",
"media_description": "媒體描述", "media_description": "媒體描述",
"media_description_error": "無法更新媒體,請重試", "media_description_error": "無法更新媒體,請重試",
"new_status": "發佈新發文", "media_not_sensitive_warning": "你有標記內容警告,但附件沒有被標記爲敏感內容!",
"new_status": "發佈新帖文",
"post": "發送", "post": "發送",
"posting": "正在發送", "posting": "正在發送",
"preview": "預覽", "preview": "預覽",
"preview_empty": "空的", "preview_empty": "空的",
"scope": { "scope": {
"direct": "私信 - 只發送給被提及的用戶", "direct": "私信 - 只發送給被提及的用戶",
"local": "本地 - 不會向其它實例發佈此帖文",
"private": "僅關注者 - 只有關注了你的人能看到", "private": "僅關注者 - 只有關注了你的人能看到",
"public": "公共 - 發送到公共時間軸", "public": "公共 - 發送到公共時間軸",
"unlisted": "不公開 - 不會發送到公共時間軸" "unlisted": "不公開 - 不會發送到公共時間軸"
}, },
"scope_notice": { "scope_notice": {
"local": "此帖文在其它實例中不可見",
"private": "關注你的人才能看到本條內容", "private": "關注你的人才能看到本條內容",
"public": "本條帖子可以被所有人看到", "public": "本貼文可以被所有人看到",
"unlisted": "本條內容既不在公共時間線,也不會在所有已知網絡上可見" "unlisted": "本條內容既不在公共時間線,也不會在所有已知網絡上可見"
} },
"toggle_content_warning": "切換內容警告"
}, },
"registration": { "registration": {
"awaiting_email_confirmation": "你的帳號已成功申請註冊,一封註冊用的電子郵件已發到你的地址。請檢查電子郵件以完成註冊。",
"awaiting_email_confirmation_title": "等待確認郵箱中",
"bio": "簡介", "bio": "簡介",
"bio_placeholder": "例如:\n你好我是玲音。\n我是一個住在日本郊區的動畫少女。你可能在 Wired 見過我。", "bio_placeholder": "例如:\n嗨!歡迎來查看我的簡介。\n我喜歡看動畫片和玩遊戲。希望我們能成爲朋友",
"captcha": "CAPTCHA", "captcha": "CAPTCHA",
"email": "電子郵箱", "email": "電子郵箱",
"email_language": "你想從服務器接收到什麼語言的郵件?",
"fullname": "顯示名稱", "fullname": "顯示名稱",
"fullname_placeholder": "例如:岩倉玲音", "fullname_placeholder": "例如:亞可·卡嘉莉",
"new_captcha": "點擊圖片獲取新的驗證碼", "new_captcha": "點擊圖片獲取新的驗證碼",
"password_confirm": "確認密碼", "password_confirm": "確認密碼",
"reason": "註冊理由", "reason": "註冊理由",
"reason_placeholder": "此實例的註冊需要手動批准。\n請讓管理知道您為什麼想要註冊。", "reason_placeholder": "此實例的註冊需要手動批准。\n請讓管理知道您為什麼想要註冊。",
"register": "註冊", "register": "註冊",
"registration": "註冊", "registration": "註冊",
"request_sent": "你的註冊請求已被送去審核。當你的帳號被批准時,你會收到一封電子郵件。",
"request_sent_title": "註冊請求已發送",
"token": "邀請碼", "token": "邀請碼",
"username_placeholder": "例如lain", "username_placeholder": "例如:akko",
"validations": { "validations": {
"email_required": "不能留空", "email_required": "不能留空",
"fullname_required": "不能留空", "fullname_required": "不能留空",
@ -290,16 +456,29 @@
}, },
"settings": { "settings": {
"accent": "強調色", "accent": "強調色",
"allow_following_move": "正在關注的賬號遷移時自動重新關注", "account_alias": "帳號別名",
"account_alias_table_head": "別名",
"account_backup": "帳號備份",
"account_backup_description": "這個允許你下載一份帳號信息和文章的存檔,但是現在還不能導入到 Akkoma 帳號裏。",
"account_backup_table_head": "備份",
"account_privacy": "隱私",
"add_alias_error": "添加別名時出錯:{error}",
"add_backup": "創建一個新備份",
"add_backup_error": "添加新備份時出錯:{error}",
"added_alias": "别名已添加。",
"added_backup": "已創建一個新備份。",
"allow_following_move": "正在關注的帳號遷移時自動重新關注",
"always_show_post_button": "始終顯示浮動的“發佈新帖文”按鈕",
"app_name": "App 名稱", "app_name": "App 名稱",
"attachmentRadius": "附件", "attachmentRadius": "附件",
"attachments": "附件", "attachments": "附件",
"autohide_floating_post_button": "自動隱藏新帖子的按鈕(移動設備)", "autohide_floating_post_button": "自動隱藏新貼文的按鈕(移動設備)",
"avatar": "頭像", "avatar": "頭像",
"avatarAltRadius": "頭像(通知)", "avatarAltRadius": "頭像(通知)",
"avatarRadius": "頭像", "avatarRadius": "頭像",
"avatar_size_instruction": "推薦的頭像圖片最小的尺寸是 150x150 像素。", "avatar_size_instruction": "推薦的頭像圖片最小的尺寸是 150x150 像素。",
"background": "背景", "background": "背景",
"backup_not_ready": "備份還沒準備好。",
"bio": "簡介", "bio": "簡介",
"block_export": "封鎖黑名單導出", "block_export": "封鎖黑名單導出",
"block_export_button": "導出你的封鎖黑名單到一個 csv 文件", "block_export_button": "導出你的封鎖黑名單到一個 csv 文件",
@ -307,7 +486,7 @@
"block_import_error": "導入封鎖黑名單出錯", "block_import_error": "導入封鎖黑名單出錯",
"blocks_imported": "封鎖黑名單導入成功!需要一點時間來處理。", "blocks_imported": "封鎖黑名單導入成功!需要一點時間來處理。",
"blocks_tab": "封鎖", "blocks_tab": "封鎖",
"bot": "這是一個機器人號", "bot": "這是一個機器人號",
"btnRadius": "按鈕", "btnRadius": "按鈕",
"cBlue": "藍色(回覆,關注)", "cBlue": "藍色(回覆,關注)",
"cGreen": "綠色(轉發)", "cGreen": "綠色(轉發)",
@ -321,9 +500,27 @@
"changed_password": "成功修改了密碼!", "changed_password": "成功修改了密碼!",
"chatMessageRadius": "聊天訊息", "chatMessageRadius": "聊天訊息",
"checkboxRadius": "複選框", "checkboxRadius": "複選框",
"collapse_subject": "摺疊帶標題的內容", "collapse_subject": "摺疊帶內容警告的帖文",
"columns": "側欄",
"composing": "寫作設置", "composing": "寫作設置",
"confirm_dialogs": "需要確認當:",
"confirm_dialogs_approve_follow": "接受關注請求",
"confirm_dialogs_block": "封鎖某人",
"confirm_dialogs_delete": "删除帖文",
"confirm_dialogs_deny_follow": "拒絕關注請求",
"confirm_dialogs_mute": "靜音某人",
"confirm_dialogs_repeat": "轉發帖文",
"confirm_dialogs_unfollow": "取消關注某人",
"confirm_new_password": "確認新密碼", "confirm_new_password": "確認新密碼",
"confirmation_dialogs": "確認選項",
"conversation_display": "對話顯示樣式",
"conversation_display_linear": "線性樣式",
"conversation_display_tree": "樹狀樣式",
"conversation_other_replies_button": "顯示 “其它回覆” 按鈕",
"conversation_other_replies_button_below": "在貼文下方",
"conversation_other_replies_button_inside": "在貼文中",
"current_avatar": "當前頭像",
"current_mascot": "你當前的吉祥物",
"current_password": "當前密碼", "current_password": "當前密碼",
"data_import_export_tab": "數據導入/導出", "data_import_export_tab": "數據導入/導出",
"default_vis": "默認可見性範圍", "default_vis": "默認可見性範圍",
@ -331,11 +528,17 @@
"delete_account_description": "永久刪除你的帳號和所有數據。", "delete_account_description": "永久刪除你的帳號和所有數據。",
"delete_account_error": "刪除賬戶時發生錯誤,如果一直刪除不了,請聯繫實例管理員。", "delete_account_error": "刪除賬戶時發生錯誤,如果一直刪除不了,請聯繫實例管理員。",
"delete_account_instructions": "在下面輸入密碼,以確認刪除帳戶。", "delete_account_instructions": "在下面輸入密碼,以確認刪除帳戶。",
"discoverable": "允許通過搜索檢索等服務找到此賬號", "disable_sticky_headers": "不要把側欄的頂欄固定在屏幕的頂部",
"discoverable": "允許通過搜索檢索等服務找到此帳號",
"domain_mutes": "域名", "domain_mutes": "域名",
"download_backup": "下載",
"email_language": "從服務器收取郵件的語言",
"emoji_reactions_on_timeline": "在時間線上顯示繪文字互動", "emoji_reactions_on_timeline": "在時間線上顯示繪文字互動",
"enable_web_push_notifications": "啟用 web 推送通知", "enable_web_push_notifications": "啟用 web 推送通知",
"enter_current_password_to_confirm": "輸入你當前密碼來確認你的身份", "enter_current_password_to_confirm": "輸入你當前密碼來確認你的身份",
"expert_mode": "顯示進階設定",
"expire_posts_enabled": "在設定的天數後刪除帖文",
"expire_posts_input_placeholder": "天數",
"export_theme": "導出預置主題", "export_theme": "導出預置主題",
"file_export_import": { "file_export_import": {
"backup_restore": "設定備份", "backup_restore": "設定備份",
@ -344,13 +547,13 @@
"errors": { "errors": {
"file_slightly_new": "檔案的小版本不同,有些設置可能無法載入", "file_slightly_new": "檔案的小版本不同,有些設置可能無法載入",
"file_too_new": "不兼容的主版本:{fileMajor},此 PleromaFE設置版本 {feMajor})過舊,無法處理", "file_too_new": "不兼容的主版本:{fileMajor},此 PleromaFE設置版本 {feMajor})過舊,無法處理",
"file_too_old": "不兼容的主版本:{fileMajor},文件版本過舊,不受支持(最小設置版本 {feMajor}", "file_too_old": "主版本不兼容:設置文件 v{fileMajor} 版本過舊Pleroma-fe v{feMajor} 無法導入",
"invalid_file": "所選文件不是受支持的Pleroma設置備份。 沒有進行任何更改。" "invalid_file": "所選文件不是受支持的Pleroma設置備份。 沒有進行任何更改。"
}, },
"restore_settings": "從文件還原設置" "restore_settings": "從文件還原設置"
}, },
"filtering": "過濾", "filtering": "過濾",
"filtering_explanation": "所有包含以下詞彙的內容都會被隱藏,一行一個", "filtering_explanation": "所有包含以下詞彙的內容都會被隱藏。一行一個詞彙",
"follow_export": "導出關注", "follow_export": "導出關注",
"follow_export_button": "將關注導出成 csv 文件", "follow_export_button": "將關注導出成 csv 文件",
"follow_import": "導入關注", "follow_import": "導入關注",
@ -360,21 +563,29 @@
"fun": "有趣", "fun": "有趣",
"general": "通用", "general": "通用",
"greentext": "前文箭頭", "greentext": "前文箭頭",
"hide_all_muted_posts": "不顯示已隱藏的帖子", "hide_all_muted_posts": "不顯示已隱藏的貼文",
"hide_attachments_in_convo": "在對話中隱藏附件", "hide_attachments_in_convo": "在對話中隱藏附件",
"hide_attachments_in_tl": "在時間線上隱藏附件", "hide_attachments_in_tl": "在時間線上隱藏附件",
"hide_filtered_statuses": "隱藏過濾的發文", "hide_bot_indication": "隱藏帖文中的機器人標示",
"hide_favorites_description": "隱藏我的喜歡列表(對方仍然會收到通知)",
"hide_filtered_statuses": "隱藏過濾了的貼文",
"hide_followers_count_description": "不顯示關注者數量", "hide_followers_count_description": "不顯示關注者數量",
"hide_followers_description": "不要顯示關注我的人", "hide_followers_description": "不要顯示關注我的人",
"hide_follows_count_description": "不顯示關注數", "hide_follows_count_description": "不顯示關注數",
"hide_follows_description": "不要顯示我所關注的人", "hide_follows_description": "不要顯示我所關注的人",
"hide_isp": "隱藏指定實例的面板", "hide_isp": "隱藏指定實例的面板",
"hide_list_aliases_error_action": "關閉",
"hide_media_previews": "隱藏媒體預覽", "hide_media_previews": "隱藏媒體預覽",
"hide_muted_posts": "不顯示被靜音的用戶的帖子", "hide_muted_posts": "不顯示被靜音的用戶的貼文",
"hide_post_stats": "隱藏帖子的統計數據(例如:收藏的次數)", "hide_muted_threads": "隱藏已靜音的對話",
"hide_post_stats": "隱藏貼文的統計數據(例如:收藏的次數)",
"hide_shoutbox": "隱藏實例留言框", "hide_shoutbox": "隱藏實例留言框",
"hide_site_favicon": "隱藏頂部面板中的實例圖標",
"hide_site_name": "隱藏頂部面板中的實例圖標",
"hide_threads_with_blocked_users": "隱藏提及到被封鎖用戶的貼文",
"hide_user_stats": "隱藏用戶的統計數據(例如:關注者的數量)", "hide_user_stats": "隱藏用戶的統計數據(例如:關注者的數量)",
"hide_wallpaper": "隱藏實例桌布", "hide_wallpaper": "隱藏實例桌布",
"hide_wordfiltered_statuses": "隱藏經過詞語過濾的封鎖",
"import_blocks_from_a_csv_file": "從 csv 文件中導入封鎖黑名單名單", "import_blocks_from_a_csv_file": "從 csv 文件中導入封鎖黑名單名單",
"import_followers_from_a_csv_file": "從 csv 文件中導入關注", "import_followers_from_a_csv_file": "從 csv 文件中導入關注",
"import_mutes_from_a_csv_file": "從CSV文件導入靜音", "import_mutes_from_a_csv_file": "從CSV文件導入靜音",
@ -386,18 +597,31 @@
"interfaceLanguage": "界面語言", "interfaceLanguage": "界面語言",
"invalid_theme_imported": "您所選擇的主題文件不被 Pleroma 支持,因此主題未被修改。", "invalid_theme_imported": "您所選擇的主題文件不被 Pleroma 支持,因此主題未被修改。",
"limited_availability": "在您的瀏覽器中無法使用", "limited_availability": "在您的瀏覽器中無法使用",
"links": "鏈接", "links": "鏈結",
"list_aliases_error": "獲取別名時出錯:{error}",
"list_backups_error": "獲取備份列表出錯:{error}",
"lock_account_description": "你需要手動審核關注請求", "lock_account_description": "你需要手動審核關注請求",
"loop_video": "循環視頻", "loop_video": "循環視頻",
"loop_video_silent_only": "只循環沒有聲音的視頻例如Mastodon 裡的“GIF”", "loop_video_silent_only": "只循環沒有聲音的視頻例如Mastodon 裡的“GIF”",
"max_thumbnails": "最多每個帖子所能顯示的縮略圖數量", "mascot": "Mastodon FE 吉祥物",
"max_depth_in_thread": "默認顯示對話中的最大層數",
"max_thumbnails": "最多每個貼文所能顯示的縮略圖數量",
"mention_link_bolden_you": "當你被提及時,突出顯示該提及",
"mention_link_display": "顯示提及鏈結",
"mention_link_display_full": "始終以全名的形式出現(例如:{'@'}foo{'@'}example.org",
"mention_link_display_full_for_remote": "僅遠程實例用戶以全名的形式出現(例如:{'@'}foo{'@'}example.org",
"mention_link_display_short": "始終以簡稱的形式出現(例如:{'@'}foo",
"mention_link_fade_domain": "淡化顯示域名(例如:{'@'}example.org 中的 {'@'}foo{'@'}example.org",
"mention_link_show_avatar": "在鏈結旁邊顯示用戶頭像",
"mention_link_show_tooltip": "為遠程實例用戶顯示完整的用戶名(用戶名和網域)作爲 tooltip",
"mention_links": "提及鏈結",
"mfa": { "mfa": {
"authentication_methods": "身份驗證方法", "authentication_methods": "身份驗證方法",
"confirm_and_enable": "確認並啟用OTP", "confirm_and_enable": "確認並啟用OTP",
"generate_new_recovery_codes": "生成新的恢復碼", "generate_new_recovery_codes": "生成新的恢復碼",
"otp": "OTP", "otp": "OTP",
"recovery_codes": "恢復碼。", "recovery_codes": "恢復碼。",
"recovery_codes_warning": "抄寫這些號碼,或者保存在安全的地方。這些號碼不會再次顯示。如果你無法訪問你的 2FA app也丟失了你的恢復碼你的賬號就再也無法登錄了。", "recovery_codes_warning": "抄寫這些號碼,或者保存在安全的地方。這些號碼不會再次顯示。如果你無法訪問你的 2FA app也丟失了你的恢復碼你的號就再也無法登錄了。",
"scan": { "scan": {
"desc": "使用你的雙因素驗證 app掃瞄這個二維碼或者輸入這些文字密鑰", "desc": "使用你的雙因素驗證 app掃瞄這個二維碼或者輸入這些文字密鑰",
"secret_code": "密鑰", "secret_code": "密鑰",
@ -412,8 +636,14 @@
"waiting_a_recovery_codes": "正在接收備份碼…", "waiting_a_recovery_codes": "正在接收備份碼…",
"warning_of_generate_new_codes": "當你生成新的恢復碼時,你的舊恢復碼就失效了。" "warning_of_generate_new_codes": "當你生成新的恢復碼時,你的舊恢復碼就失效了。"
}, },
"minimal_scopes_mode": "最小發文範圍", "minimal_scopes_mode": "使發佈可見範圍的選項最少化",
"more_settings": "更多設置", "more_settings": "更多設置",
"move_account": "遷移帳號",
"move_account_error": "遷移帳號時出錯:{error}",
"move_account_notes": "如果你想把帳號遷移到別的地方,你必須前去你的目標帳號然後添加一個指向此處的別名。",
"move_account_target": "目標帳號(例如 {example}",
"moved_account": "帳號已遷移。",
"mute_bot_posts": "靜音機器人的帖文",
"mute_export": "靜音導出", "mute_export": "靜音導出",
"mute_export_button": "將靜音導出到csv文件", "mute_export_button": "將靜音導出到csv文件",
"mute_import": "靜音導入", "mute_import": "靜音導入",
@ -423,6 +653,7 @@
"mutes_tab": "靜音", "mutes_tab": "靜音",
"name": "名字", "name": "名字",
"name_bio": "名字及簡介", "name_bio": "名字及簡介",
"new_alias_target": "添加一個新別名(例如 {example}",
"new_email": "新電郵", "new_email": "新電郵",
"new_password": "新密碼", "new_password": "新密碼",
"no_blocks": "沒有封鎖", "no_blocks": "沒有封鎖",
@ -430,8 +661,9 @@
"no_rich_text_description": "不顯示富文本格式", "no_rich_text_description": "不顯示富文本格式",
"notification_blocks": "封鎖一個用戶會停掉所有他的通知,等同於取消關注。", "notification_blocks": "封鎖一個用戶會停掉所有他的通知,等同於取消關注。",
"notification_mutes": "要停止收到某個指定的用戶的通知,請使用靜音功能。", "notification_mutes": "要停止收到某個指定的用戶的通知,請使用靜音功能。",
"notification_setting_block_from_strangers": "屏蔽來自你沒有關注的用戶的通知", "notification_setting_block_from_strangers": "封鎖來自你沒有關注的用戶的通知",
"notification_setting_filters": "過濾器", "notification_setting_filters": "過濾器",
"notification_setting_hide_if_cw": "如果帖文包含內容警告,隱藏推送通知",
"notification_setting_hide_notification_contents": "隱藏推送通知中的發送者與內容信息", "notification_setting_hide_notification_contents": "隱藏推送通知中的發送者與內容信息",
"notification_setting_privacy": "隱私", "notification_setting_privacy": "隱私",
"notification_visibility": "要顯示的通知類型", "notification_visibility": "要顯示的通知類型",
@ -440,15 +672,19 @@
"notification_visibility_likes": "喜歡", "notification_visibility_likes": "喜歡",
"notification_visibility_mentions": "提及", "notification_visibility_mentions": "提及",
"notification_visibility_moves": "用戶遷移", "notification_visibility_moves": "用戶遷移",
"notification_visibility_polls": "你所投的投票的結束於",
"notification_visibility_repeats": "轉發", "notification_visibility_repeats": "轉發",
"notifications": "通知", "notifications": "通知",
"nsfw_clickthrough": "將敏感附件和鏈隱藏,點擊才能打開", "nsfw_clickthrough": "將敏感附件和鏈隱藏,點擊才能打開",
"oauth_tokens": "OAuth代幣", "oauth_tokens": "OAuth代幣",
"pad_emoji": "從繪文字選擇器插入繪文字時,在繪文字兩側插入空格", "pad_emoji": "從繪文字選擇器插入繪文字時,在繪文字兩側插入空格",
"panelRadius": "面板", "panelRadius": "面板",
"pause_on_unfocused": "在離開頁面時暫停時間線推送", "pause_on_unfocused": "在離開頁面時暫停時間線推送",
"permit_followback_description": "自動批准已關注用戶的關注請求",
"play_videos_in_modal": "在彈出框內播放視頻", "play_videos_in_modal": "在彈出框內播放視頻",
"post_status_content_type": "發文內容類型", "post_look_feel": "貼文的外觀",
"post_status_content_type": "默認貼文內容類型",
"posts": "貼文",
"preload_images": "預載圖片", "preload_images": "預載圖片",
"presets": "預置", "presets": "預置",
"profile_background": "配置文件背景圖", "profile_background": "配置文件背景圖",
@ -462,6 +698,10 @@
"profile_tab": "個人資料", "profile_tab": "個人資料",
"radii_help": "設置界面邊緣的圓角 (單位:像素)", "radii_help": "設置界面邊緣的圓角 (單位:像素)",
"refresh_token": "刷新token", "refresh_token": "刷新token",
"remove_alias": "移除此别名",
"remove_backup": "移除",
"render_mfm": "渲染 Misskey Markdown",
"render_mfm_on_hover": "停止播放 MFM 動畫,除了在滑鼠懸停於帖文時",
"replies_in_timeline": "時間線中的回覆", "replies_in_timeline": "時間線中的回覆",
"reply_visibility_all": "顯示所有回覆", "reply_visibility_all": "顯示所有回覆",
"reply_visibility_following": "只顯示發送給我的回覆/發送給我關注的用戶的回覆", "reply_visibility_following": "只顯示發送給我的回覆/發送給我關注的用戶的回覆",
@ -475,23 +715,45 @@
"reset_profile_background": "重置個人資料背景圖", "reset_profile_background": "重置個人資料背景圖",
"reset_profile_banner": "重置橫幅圖片", "reset_profile_banner": "重置橫幅圖片",
"revoke_token": "撤消", "revoke_token": "撤消",
"right_sidebar": "在右側顯示側欄", "right_sidebar": "在右側顯示側欄",
"save": "保存更改", "save": "保存更改",
"saving_err": "保存設置時發生錯誤", "saving_err": "保存設置時發生錯誤",
"saving_ok": "設置已保存", "saving_ok": "設置已保存",
"scope_copy": "回覆時的複製範圍(私信是總是複製的)", "scope_copy": "回覆時的複製範圍(私信是總是複製的)",
"search_user_to_block": "搜索你想屏蔽的用戶", "search_user_to_block": "搜索你想封鎖的用戶",
"search_user_to_mute": "搜索你想要隱藏的用戶", "search_user_to_mute": "搜索你想要隱藏的用戶",
"security": "安全", "security": "安全",
"security_tab": "安全", "security_tab": "安全",
"sensitive_by_default": "默認標記發文為敏感內容", "sensitive_by_default": "默認標記貼文為敏感內容",
"sensitive_if_subject": "如果內容警告已指定,自動將圖像標記爲敏感內容",
"set_new_avatar": "設置新頭像", "set_new_avatar": "設置新頭像",
"set_new_mascot": "設置新吉祥物",
"set_new_profile_background": "設置新的個人背景", "set_new_profile_background": "設置新的個人背景",
"set_new_profile_banner": "設置新的個人橫幅", "set_new_profile_banner": "設置新的個人橫幅",
"setting_changed": "與默認設置不同", "setting_changed": "與默認設置不同",
"setting_server_side": "這個設置是捆綁到你的個人資料的,會反映於所有會話和用戶端",
"settings": "設置", "settings": "設置",
"settings_profile": "設置配置文件",
"settings_profile_creation": "創建新的配置文件",
"settings_profile_creation_new_name_label": "名稱",
"settings_profile_creation_submit": "創建",
"settings_profile_currently": "目前使用 {name}(版本:{version}",
"settings_profile_delete": "删除",
"settings_profile_delete_confirm": "你確定要刪除此配置文件嗎?",
"settings_profile_force_sync": "同步",
"settings_profile_in_use": "使用中",
"settings_profile_use": "使用",
"settings_profiles_refresh": "重新載入設置配置文件",
"settings_profiles_show": "顯示所有設置配置文件",
"settings_profiles_unshow": "隱藏所有設置配置文件",
"show_admin_badge": "顯示管理徽章", "show_admin_badge": "顯示管理徽章",
"show_moderator_badge": "顯示主持人徽章", "show_moderator_badge": "顯示主持人徽章",
"show_nav_shortcuts": "在頂部面板中顯示額外的導航快捷鍵",
"show_page_backgrounds": "顯示特定頁面專用的背景,例如用戶自定義的背景",
"show_panel_nav_shortcuts": "在面板頂部顯示時間線導航快捷鍵",
"show_scrollbars": "顯示側欄的捲軸",
"show_wider_shortcuts": "在頂部面板快捷鍵之間顯示更寬的間隙",
"show_yous": "被提及時在貼文顯示「(你)」",
"stop_gifs": "鼠標懸停時播放GIF", "stop_gifs": "鼠標懸停時播放GIF",
"streaming": "開啟滾動到頂部時的自動推送", "streaming": "開啟滾動到頂部時的自動推送",
"style": { "style": {
@ -518,10 +780,10 @@
"panel_header": "面板標題", "panel_header": "面板標題",
"poll": "投票統計圖", "poll": "投票統計圖",
"popover": "提示框,菜單,彈出框", "popover": "提示框,菜單,彈出框",
"post": "帖子/用戶簡介", "post": "貼文/用戶簡介",
"pressed": "按下", "pressed": "按下",
"selectedMenu": "選中的菜單項", "selectedMenu": "選中的菜單項",
"selectedPost": "選中的帖子", "selectedPost": "選中的貼文",
"tabs": "標籤", "tabs": "標籤",
"toggled": "切換", "toggled": "切換",
"top_bar": "頂欄", "top_bar": "頂欄",
@ -555,8 +817,8 @@
"components": { "components": {
"input": "輸入框", "input": "輸入框",
"interface": "界面", "interface": "界面",
"post": "發帖文字", "post": "貼文文字",
"postCode": "帖子中使用等間距文字(富文本)" "postCode": "貼文中使用等間距文字(富文本)"
}, },
"custom": "自選", "custom": "自選",
"family": "字體名稱", "family": "字體名稱",
@ -574,7 +836,7 @@
"header": "預覽", "header": "預覽",
"header_faint": "這很正常", "header_faint": "這很正常",
"input": "剛剛抵達洛杉磯.", "input": "剛剛抵達洛杉磯.",
"link": "一個很好的小鏈", "link": "一個很好的小鏈",
"mono": "內容", "mono": "內容",
"text": "有堆 {0} 和 {1}" "text": "有堆 {0} 和 {1}"
}, },
@ -587,7 +849,7 @@
"component": "組件", "component": "組件",
"components": { "components": {
"avatar": "用戶頭像(在個人資料欄)", "avatar": "用戶頭像(在個人資料欄)",
"avatarStatus": "用戶頭像(在帖子顯示欄)", "avatarStatus": "用戶頭像(在貼文顯示欄)",
"button": "按鈕", "button": "按鈕",
"buttonHover": "按鈕(懸停)", "buttonHover": "按鈕(懸停)",
"buttonPressed": "按鈕(按下)", "buttonPressed": "按鈕(按下)",
@ -640,9 +902,9 @@
"use_source": "新版本" "use_source": "新版本"
} }
}, },
"subject_input_always_show": "總是顯示主題框", "subject_input_always_show": "總是顯示內容警告框",
"subject_line_behavior": "回覆時複製主題", "subject_line_behavior": "回覆時複製內容警告",
"subject_line_email": "比如電郵: \"re: 主題\"", "subject_line_email": "類似電子郵件:\"re: 警告\"",
"subject_line_mastodon": "比如mastodon: copy as is", "subject_line_mastodon": "比如mastodon: copy as is",
"subject_line_noop": "不要複製", "subject_line_noop": "不要複製",
"text": "文本", "text": "文本",
@ -650,15 +912,29 @@
"theme_help": "使用十六進制代碼(#rrggbb來設置主題顏色。", "theme_help": "使用十六進制代碼(#rrggbb來設置主題顏色。",
"theme_help_v2_1": "你也可以通過切換複選框來覆蓋某些組件的顏色和透明。使用“清除所有”來清楚所有覆蓋設置。", "theme_help_v2_1": "你也可以通過切換複選框來覆蓋某些組件的顏色和透明。使用“清除所有”來清楚所有覆蓋設置。",
"theme_help_v2_2": "某些條目下的圖標是背景或文本對比指示器,鼠標懸停可以獲取詳細信息。請記住,使用透明度來顯示最差的情況。", "theme_help_v2_2": "某些條目下的圖標是背景或文本對比指示器,鼠標懸停可以獲取詳細信息。請記住,使用透明度來顯示最差的情況。",
"third_column_mode": "當有足夠的空間時,顯示第三欄包含",
"third_column_mode_none": "不要顯示第三欄",
"third_column_mode_notifications": "通知欄",
"third_column_mode_postform": "主要投稿窗口和導覽",
"token": "代幣", "token": "代幣",
"tooltipRadius": "提醒", "tooltipRadius": "提醒",
"translation_language": "自動翻譯語言",
"tree_advanced": "顯示用來打開和關閉對話中的回覆鏈的按鈕",
"tree_fade_ancestors": "以淡色文字顯示當前貼文的上文",
"type_domains_to_mute": "搜索需要隱藏的域名", "type_domains_to_mute": "搜索需要隱藏的域名",
"upload_a_photo": "上傳照片", "upload_a_photo": "上傳照片",
"useStreamingApi": "實時接收發佈以及通知", "useStreamingApi": "實時接收發佈以及通知",
"useStreamingApiWarning": "(不推薦使用,實驗性的,已知跳過文章)", "useStreamingApiWarning": "(不推薦使用,實驗性的,已知跳過文章)",
"use_blurhash": "對 NSFW 的縮略圖使用模糊處理",
"use_contain_fit": "生成縮略圖時不要裁剪附件", "use_contain_fit": "生成縮略圖時不要裁剪附件",
"use_one_click_nsfw": "點擊一次以打開工作場所不適宜的附件", "use_one_click_nsfw": "點擊一次以打開工作場所不適宜的附件",
"user_accepts_direct_messages_from": "允許私信自",
"user_accepts_direct_messages_from_everybody": "所有人",
"user_accepts_direct_messages_from_nobody": "沒有人",
"user_accepts_direct_messages_from_people_i_follow": "我關注的人",
"user_mutes": "用户", "user_mutes": "用户",
"user_profile_default_tab": "用戶資料中的默認頁面",
"user_profiles": "用戶資料",
"user_settings": "用戶設置", "user_settings": "用戶設置",
"valid_until": "有效期至", "valid_until": "有效期至",
"values": { "values": {
@ -671,38 +947,90 @@
"title": "版本" "title": "版本"
}, },
"virtual_scrolling": "優化時間線渲染", "virtual_scrolling": "優化時間線渲染",
"word_filter": "詞過濾" "word_filter": "詞過濾",
"wordfilter": "詞語過濾器"
},
"settings_profile": {
"creating": "正在創建新的設置配置文件 \"{profile}\" 中...",
"synchronization_error": "無法同步設置:{err}",
"synchronized": "設置已同步!",
"synchronizing": "正在同步新的設置配置文件 \"{profile}\" 中..."
}, },
"status": { "status": {
"ancestor_follow": "查看此貼文下其它 {numReplies} 條回覆",
"ancestor_follow_with_icon": "{icon} {text}",
"attachment_stop_flash": "停止 Flash 播放器",
"bookmark": "書籤", "bookmark": "書籤",
"copy_link": "複製發文鏈接", "collapse_attachments": "折起附件",
"delete": "刪除發文", "copy_link": "複製貼文鏈結",
"delete_confirm": "你真的想要刪除這條發文嗎?", "delete": "刪除貼文",
"delete_confirm": "你真的想要刪除這則貼文嗎?",
"delete_confirm_accept_button": "是,删除它",
"delete_confirm_cancel_button": "否,保留它",
"delete_confirm_title": "確認刪除",
"edit": "編輯",
"edit_history": "編輯歷史",
"edit_history_modal_title": "已編輯 {historyCount} 次",
"edited_at": "編輯於 {time}",
"expand": "展开", "expand": "展开",
"external_source": "外部來源", "external_source": "外部來源",
"favorites": "喜歡", "favorites": "喜歡",
"hide_attachment": "隱藏附件",
"hide_content": "隱藏內容", "hide_content": "隱藏內容",
"hide_full_subject": "隱藏完整標題", "hide_full_subject": "隱藏全部內容警告",
"many_attachments": "貼文有 {number} 個附件",
"mentions": "提及",
"move_down": "把附件右移",
"move_up": "把附件左移",
"mute_conversation": "靜音對話", "mute_conversation": "靜音對話",
"nsfw": "工作不安全", "nsfw": "工作不安全",
"open_gallery": "打開圖庫",
"override_translation_source_language": "覆蓋源語言",
"pin": "在個人資料置頂", "pin": "在個人資料置頂",
"pinned": "置頂", "pinned": "置頂",
"plus_more": "還有 {number} 個",
"redraft": "刪除並編緝",
"redraft_confirm": "你確定要刪除並編緝此帖文嗎?與原帖文的互動將不會被保留。",
"redraft_confirm_accept_button": "是,刪除並編緝",
"redraft_confirm_cancel_button": "否,保持原樣",
"redraft_confirm_title": "確認刪除並編緝",
"remove_attachment": "移除附件",
"repeat_confirm": "你確定要轉發此貼文嗎?",
"repeat_confirm_accept_button": "是,轉發它",
"repeat_confirm_cancel_button": "否,不要轉發",
"repeat_confirm_title": "確認轉發",
"repeats": "轉發", "repeats": "轉發",
"replies_list": "回覆:", "replies_list": "回覆:",
"replies_list_with_others": "查看 {numReplies} 條回復",
"reply_to": "回覆", "reply_to": "回覆",
"show_all_attachments": "顯示所有附件",
"show_all_conversation": "顯示全部對話(還有其它 {numStatus} 條貼文)",
"show_all_conversation_with_icon": "{icon} {text}",
"show_attachment_description": "預覽描述(打開附件能看完整描述)",
"show_attachment_in_modal": "在窗口中顯示附件",
"show_content": "顯示內容", "show_content": "顯示內容",
"show_full_subject": "顯示完整標題", "show_full_subject": "顯示完整内容警告",
"show_only_conversation_under_this": "僅顯示此帖文的回覆",
"status_deleted": "該帖已被刪除", "status_deleted": "該帖已被刪除",
"status_unavailable": "發文不可取得", "status_unavailable": "貼文已不可用",
"thread_follow": "查看 {numStatus} 條更多回復",
"thread_follow_with_icon": "{icon} {text}",
"thread_hide": "隱藏此對話",
"thread_muted": "静音線程", "thread_muted": "静音線程",
"thread_muted_and_words": ",有这些字:", "thread_muted_and_words": ",有这些字:",
"thread_show": "顯示這個對話",
"thread_show_full": "顯示 {numStatus} 條回覆 | 顯示全部 {numStatus} 條回覆",
"thread_show_full_with_icon": "{icon} {text}",
"translate": "翻譯",
"translated_from": "翻譯自 {language}",
"unbookmark": "取消書籤", "unbookmark": "取消書籤",
"unmute_conversation": "對話取消靜音", "unmute_conversation": "對話取消靜音",
"unpin": "取消在個人資料置頂" "unpin": "取消在個人資料置頂",
"you": "(你)"
}, },
"time": { "time": {
"in_future": "還有 {0}", "in_future": "還有 {0}",
"in_past": "{0}前", "in_past": "{0}前",
"now": "剛剛", "now": "剛剛",
"now_short": "剛剛", "now_short": "剛剛",
"unit": { "unit": {
@ -726,23 +1054,29 @@
"collapse": "摺疊", "collapse": "摺疊",
"conversation": "對話", "conversation": "對話",
"error": "取得時間線時發生錯誤:{0}", "error": "取得時間線時發生錯誤:{0}",
"load_older": "載入更早的發文", "follow_tag": "關注話題標籤",
"no_more_statuses": "没有更多發文", "load_older": "載入更早的貼文",
"no_more_statuses": "没有更多貼文",
"no_retweet_hint": "這條內容僅關注者可見,或者是私信,因此不能轉發", "no_retweet_hint": "這條內容僅關注者可見,或者是私信,因此不能轉發",
"no_statuses": "没有文", "no_statuses": "没有文",
"reload": "重新載入", "reload": "重新載入",
"repeated": "已轉發", "repeated": "已轉發",
"show_new": "顯示新內容", "show_new": "顯示新內容",
"socket_broke": "丟失實時連接CloseEvent代碼{0}", "socket_broke": "丟失實時連接CloseEvent代碼{0}",
"socket_reconnected": "已建立實時連接", "socket_reconnected": "已建立實時連接",
"unfollow_tag": "取消關注話題標籤",
"up_to_date": "已是最新" "up_to_date": "已是最新"
}, },
"toast": {
"no_translation_target_set": "沒有設置翻譯目標語言 - 這可能會失敗。請在你的設置中設置目標語言。"
},
"tool_tip": { "tool_tip": {
"accept_follow_request": "接受關注請求", "accept_follow_request": "接受關注請求",
"add_reaction": "添加互動", "add_reaction": "添加互動",
"bookmark": "書籤", "bookmark": "書籤",
"favorite": "喜歡", "favorite": "喜歡",
"media_upload": "上傳多媒體", "media_upload": "上傳多媒體",
"quote": "引用",
"reject_follow_request": "拒絕關注請求", "reject_follow_request": "拒絕關注請求",
"repeat": "轉發", "repeat": "轉發",
"reply": "回覆", "reply": "回覆",
@ -765,35 +1099,55 @@
}, },
"user_card": { "user_card": {
"admin_menu": { "admin_menu": {
"activate_account": "啟用號", "activate_account": "啟用號",
"deactivate_account": "關閉賬號", "deactivate_account": "停用帳號",
"delete_account": "刪除號", "delete_account": "刪除號",
"delete_user": "刪除用戶", "delete_user": "刪除用戶",
"delete_user_data_and_deactivate_confirmation": "這將永久刪除該帳號的數據並停用該帳號。你完全確定嗎?",
"disable_any_subscription": "完全禁止關注用戶", "disable_any_subscription": "完全禁止關注用戶",
"disable_remote_subscription": "禁止從遠程實例關注用戶", "disable_remote_subscription": "禁止從遠程實例關注用戶",
"force_nsfw": "標記所有的帖子都是工作場合不適", "force_nsfw": "標記所有的貼文為工作場合不適NSFW",
"force_unlisted": "強制帖子為不公開", "force_unlisted": "強制使貼文為不公開",
"grant_admin": "賦予管理權限", "grant_admin": "賦予管理權限",
"grant_moderator": "賦予主持人權限", "grant_moderator": "賦予主持人權限",
"moderation": "調停", "moderation": "調停",
"quarantine": "從聯合實例中禁止用戶帖子", "quarantine": "從聯合實例中禁止用戶貼文",
"revoke_admin": "撤銷管理權限", "revoke_admin": "撤銷管理權限",
"revoke_moderator": "撤銷主持人權限", "revoke_moderator": "撤銷主持人權限",
"sandbox": "強制帖子為只有關注者可看", "sandbox": "強制貼文為只有關注者可看",
"strip_media": "從帖子裡刪除媒體文件" "strip_media": "從貼文裡刪除媒體文件"
}, },
"approve": "批准", "approve": "批准",
"approve_confirm": "你確定要讓此用戶關注你嗎?",
"approve_confirm_accept_button": "是,接受",
"approve_confirm_cancel_button": "否,取消",
"approve_confirm_title": "通過關注請求",
"block": "封鎖", "block": "封鎖",
"block_confirm": "你確定要封鎖 {user} 嗎?",
"block_confirm_accept_button": "是,封鎖",
"block_confirm_cancel_button": "否,不要封鎖",
"block_confirm_title": "封鎖用戶",
"block_progress": "封鎖中…", "block_progress": "封鎖中…",
"blocked": "已封鎖!", "blocked": "已封鎖!",
"blocks_you": "封鎖了你!",
"bot": "機器人", "bot": "機器人",
"deactivated": "已停用",
"deny": "拒絕", "deny": "拒絕",
"deny_confirm": "你確定要拒絕此用戶的關注請求嗎?",
"deny_confirm_accept_button": "是,拒絕",
"deny_confirm_cancel_button": "否,取消",
"deny_confirm_title": "拒絕關注請求",
"domain_muted": "取消封鎖域名",
"edit_profile": "編輯個人資料", "edit_profile": "編輯個人資料",
"favorites": "喜歡", "favorites": "喜歡",
"follow": "關注", "follow": "關注",
"follow_cancel": "取消請求",
"follow_progress": "請求中…", "follow_progress": "請求中…",
"follow_sent": "請求已發送!", "follow_sent": "請求已發送!",
"follow_tag": "關注話題標籤",
"follow_unfollow": "取消關注", "follow_unfollow": "取消關注",
"followed_tags": "已關注的話題標籤",
"followed_users": "已關注用戶",
"followees": "正在關注", "followees": "正在關注",
"followers": "關注者", "followers": "關注者",
"following": "正在關注!", "following": "正在關注!",
@ -811,21 +1165,37 @@
"mention": "提及", "mention": "提及",
"message": "消息", "message": "消息",
"mute": "靜音", "mute": "靜音",
"mute_confirm": "你確定要靜音 {user} 嗎?",
"mute_confirm_accept_button": "是,靜音",
"mute_confirm_cancel_button": "否,不要靜音",
"mute_confirm_title": "靜音用戶",
"mute_domain": "封鎖域名",
"mute_progress": "靜音中…", "mute_progress": "靜音中…",
"muted": "已靜音", "muted": "已靜音",
"not_following_any_hashtags": "你沒有關注任何話題標籤",
"note": "私人備注",
"per_day": "每天", "per_day": "每天",
"remote_follow": "跨站關注", "remote_follow": "跨站關注",
"remove_follower": "移除關注者",
"replies": "貼文和回覆",
"report": "報告", "report": "報告",
"requested_by": "已請求關注你",
"show_repeats": "顯示轉發", "show_repeats": "顯示轉發",
"statuses": "文", "statuses": "文",
"subscribe": "訂閱", "subscribe": "訂閱",
"unblock": "取消封鎖", "unblock": "取消封鎖",
"unblock_progress": "取消封鎖中…", "unblock_progress": "取消封鎖中…",
"unfollow_confirm": "你確定要取消關注 {user} 嗎?",
"unfollow_confirm_accept_button": "是,取消關注",
"unfollow_confirm_cancel_button": "否,不要取消關注",
"unfollow_confirm_title": "取消關注用戶",
"unfollow_tag": "取消關注話題標籤",
"unmute": "取消靜音", "unmute": "取消靜音",
"unmute_progress": "取消靜音中…", "unmute_progress": "取消靜音中…",
"unsubscribe": "退訂" "unsubscribe": "退訂"
}, },
"user_profile": { "user_profile": {
"field_validated": "鏈結已驗證",
"profile_does_not_exist": "抱歉,此個人資料不存在。", "profile_does_not_exist": "抱歉,此個人資料不存在。",
"profile_loading_error": "抱歉,載入個人資料時出錯。", "profile_loading_error": "抱歉,載入個人資料時出錯。",
"timeline_title": "用戶時間線" "timeline_title": "用戶時間線"
@ -833,7 +1203,7 @@
"user_reporting": { "user_reporting": {
"add_comment_description": "此報告會發送給你的實例管理員。你可以在下面提供更多詳細信息解釋報告的緣由:", "add_comment_description": "此報告會發送給你的實例管理員。你可以在下面提供更多詳細信息解釋報告的緣由:",
"additional_comments": "其它評論", "additional_comments": "其它評論",
"forward_description": "這個賬號是從另外一個服務器。同時發送一個報告到那裡", "forward_description": "這個帳號是來由另外一個伺服器。需要同時發送一個報告到那裡嗎",
"forward_to": "轉發 {0}", "forward_to": "轉發 {0}",
"generic_error": "當處理你的請求時,發生了一個錯誤。", "generic_error": "當處理你的請求時,發生了一個錯誤。",
"submit": "提交", "submit": "提交",

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