diff --git a/README.md b/README.md
index 815b72e..dcfb33c 100644
--- a/README.md
+++ b/README.md
@@ -12,3 +12,5 @@ _none_
- 0001-confirm-favorite: opens a "confirmation" modal on favorites, identical to reposts. (TODO: undo formatting changes)
- 0002-move-notifications: moves toast notifications to the bottom of the screen
+- 0003-en_3pp: adds "English (3rd Person)" locale
+ - If you want to use this without the patch, copy this over the one's en.json: https://codeberg.org/tachikoma/tachikoma-fe/src/branch/0003-en_3pp/src/i18n/en_3pp.json
diff --git a/akkoma-fe/0001-confirm-favorite.patch b/akkoma-fe/0001-confirm-favorite.patch
index 52de84d..dccbf15 100644
--- a/akkoma-fe/0001-confirm-favorite.patch
+++ b/akkoma-fe/0001-confirm-favorite.patch
@@ -1,96 +1,61 @@
diff --git a/src/components/favorite_button/favorite_button.js b/src/components/favorite_button/favorite_button.js
-index d15699f7..e5f1a3c5 100644
+index d15699f7..cca8a479 100644
--- a/src/components/favorite_button/favorite_button.js
+++ b/src/components/favorite_button/favorite_button.js
-@@ -1,41 +1,60 @@
--import { mapGetters } from 'vuex'
--import { library } from '@fortawesome/fontawesome-svg-core'
--import { faStar } from '@fortawesome/free-solid-svg-icons'
--import {
-- faStar as faStarRegular
--} from '@fortawesome/free-regular-svg-icons'
-+import ConfirmModal from "../confirm_modal/confirm_modal.vue";
-+import { mapGetters } from "vuex";
-+import { library } from "@fortawesome/fontawesome-svg-core";
-+import { faStar } from "@fortawesome/free-solid-svg-icons";
-+import { faStar as faStarRegular } from "@fortawesome/free-regular-svg-icons";
-
--library.add(
-- faStar,
-- faStarRegular
--)
-+library.add(faStar, faStarRegular);
+@@ -1,4 +1,5 @@
+ import { mapGetters } from 'vuex'
++import ConfirmModal from '../confirm_modal/confirm_modal.vue'
+ import { library } from '@fortawesome/fontawesome-svg-core'
+ import { faStar } from '@fortawesome/free-solid-svg-icons'
+ import {
+@@ -12,13 +13,24 @@ library.add(
const FavoriteButton = {
-- props: ['status', 'loggedIn'],
-- data () {
-+ props: ["status", "loggedIn"],
+ props: ['status', 'loggedIn'],
+ components: {
-+ ConfirmModal,
++ ConfirmModal
+ },
-+ data() {
+ data () {
return {
- animated: false
-- }
+ animated: false,
-+ showingConfirmDialog: false,
-+ };
++ showingConfirmDialog: false
+ }
},
methods: {
-- favorite () {
-+ favorite() {
-+ if (!this.status.favorited && this.shouldConfirmFavorite) {
-+ this.showConfirmDialog();
+ favorite () {
++ if (!this.status.repeated && this.shouldConfirmFavorite) {
++ this.showConfirmDialog()
+ } else {
-+ this.doFavorite();
++ this.doFavorite()
+ }
+ },
-+ doFavorite() {
++ doFavorite () {
if (!this.status.favorited) {
-- this.$store.dispatch('favorite', { id: this.status.id })
-+ this.$store.dispatch("favorite", { id: this.status.id });
+ this.$store.dispatch('favorite', { id: this.status.id })
} else {
-- this.$store.dispatch('unfavorite', { id: this.status.id })
-+ this.$store.dispatch("unfavorite", { id: this.status.id });
- }
-- this.animated = true
-+ this.animated = true;
+@@ -28,12 +40,21 @@ const FavoriteButton = {
setTimeout(() => {
-- this.animated = false
-- }, 500)
-- }
-+ this.animated = false;
-+ }, 500);
-+ this.hideConfirmDialog();
+ this.animated = false
+ }, 500)
+ },
-+ showConfirmDialog() {
-+ this.showingConfirmDialog = true;
-+ },
-+ hideConfirmDialog() {
-+ this.showingConfirmDialog = false;
++ showConfirmDialog () {
++ this.showingConfirmDialog = true
+ },
++ hideConfirmDialog () {
++ this.showingConfirmDialog = false
+ }
},
computed: {
-- ...mapGetters(['mergedConfig']),
-- remoteInteractionLink () {
-- return this.$store.getters.remoteInteractionLink({ statusId: this.status.id })
-- }
-- }
--}
-+ ...mapGetters(["mergedConfig"]),
-+ shouldConfirmFavorite() {
-+ return this.mergedConfig.modalOnFavorite;
+ ...mapGetters(['mergedConfig']),
+ remoteInteractionLink () {
+ return this.$store.getters.remoteInteractionLink({ statusId: this.status.id })
+ },
-+ remoteInteractionLink() {
-+ return this.$store.getters.remoteInteractionLink({
-+ statusId: this.status.id,
-+ });
-+ },
-+ },
-+};
-
--export default FavoriteButton
-+export default FavoriteButton;
++ shouldConfirmRepeat () {
++ return this.mergedConfig.modalOnRepeat
+ }
+ }
+ }
diff --git a/src/components/favorite_button/favorite_button.vue b/src/components/favorite_button/favorite_button.vue
index 16bf441e..06ed7d59 100644
--- a/src/components/favorite_button/favorite_button.vue
@@ -130,6 +95,29 @@ index 64950f8a..b09c6d9f 100644
{{ $t('settings.confirm_dialogs_unfollow') }}
+diff --git a/src/i18n/en.json b/src/i18n/en.json
+index 965cddb0..ed140e5a 100644
+--- a/src/i18n/en.json
++++ b/src/i18n/en.json
+@@ -510,6 +510,7 @@
+ "confirm_dialogs_deny_follow": "Rejecting a follow request",
+ "confirm_dialogs_mute": "Muting someone",
+ "confirm_dialogs_repeat": "Repeating a post",
++ "confirm_dialogs_favorite": "Favoriting a post",
+ "confirm_dialogs_unfollow": "Unfollowing someone",
+ "confirm_new_password": "Confirm new password",
+ "confirmation_dialogs": "Confirmation options",
+@@ -975,6 +976,10 @@
+ "expand": "Expand",
+ "external_source": "External source",
+ "favorites": "Favorites",
++ "favorite_confirm": "Do you really want to favorite this post?",
++ "favorite_confirm_accept_button": "Yes, favorite it",
++ "favorite_confirm_cancel_button": "No, don't favorite",
++ "favorite_confirm_title": "Confirm favorite",
+ "hide_attachment": "Hide attachment",
+ "hide_content": "Hide content",
+ "hide_full_subject": "Hide full content warning",
diff --git a/src/modules/config.js b/src/modules/config.js
index 551b5bb6..0e78c749 100644
--- a/src/modules/config.js
diff --git a/akkoma-fe/0003-en_3pp.patch b/akkoma-fe/0003-en_3pp.patch
new file mode 100644
index 0000000..e3b8ddd
--- /dev/null
+++ b/akkoma-fe/0003-en_3pp.patch
@@ -0,0 +1,1261 @@
+diff --git a/src/i18n/en_3pp.json b/src/i18n/en_3pp.json
+new file mode 100644
+index 00000000..441f15fc
+--- /dev/null
++++ b/src/i18n/en_3pp.json
+@@ -0,0 +1,1223 @@
++{
++ "about": {
++ "bubble_instances": "Local Bubble Instances",
++ "bubble_instances_description": "Instances chosen by the admins to represent the local area of this instance",
++ "mrf": {
++ "federation": "Federation",
++ "keyword": {
++ "ftl_removal": "Removal from \"The Whole Known Network\" Timeline",
++ "is_replaced_by": "→",
++ "keyword_policies": "Keyword policies",
++ "reject": "Reject",
++ "replace": "Replace"
++ },
++ "mrf_policies": "Enabled MRF policies",
++ "mrf_policies_desc": "MRF policies manipulate the federation behaviour of the instance. The following policies are enabled:",
++ "simple": {
++ "accept": "Accept",
++ "accept_desc": "This instance only accepts messages from the following instances:",
++ "ftl_removal": "Removal from \"Known Network\" Timeline",
++ "ftl_removal_desc": "This instance removes these instances from \"Known Network\" timeline:",
++ "instance": "Instance",
++ "media_nsfw": "Media force-set as sensitive",
++ "media_nsfw_desc": "This instance forces media to be set sensitive in posts on the following instances:",
++ "media_removal": "Media Removal",
++ "media_removal_desc": "This instance removes media from posts on the following instances:",
++ "not_applicable": "N/A",
++ "quarantine": "Quarantine",
++ "quarantine_desc": "This instance will not send posts to the following instances:",
++ "reason": "Reason",
++ "reject": "Reject",
++ "reject_desc": "This instance will not accept messages from the following instances:",
++ "simple_policies": "Instance-specific policies"
++ }
++ },
++ "staff": "Staff"
++ },
++ "announcements": {
++ "all_day_prompt": "This is an all-day event",
++ "cancel_edit_action": "Cancel",
++ "close_error": "Close",
++ "delete_action": "Delete",
++ "edit_action": "Edit",
++ "end_time_display": "Ends at {time}",
++ "end_time_prompt": "End time: ",
++ "inactive_message": "This announcement is inactive",
++ "mark_as_read_action": "Mark as read",
++ "page_header": "Announcements",
++ "post_action": "Post",
++ "post_error": "Error: {error}",
++ "post_form_header": "Post announcement",
++ "post_placeholder": "Announcement content",
++ "published_time_display": "Published at {time}",
++ "start_time_display": "Starts at {time}",
++ "start_time_prompt": "Start time: ",
++ "submit_edit_action": "Submit",
++ "title": "Announcement"
++ },
++ "chats": {
++ "chats": "Chats",
++ "delete": "Delete",
++ "delete_confirm": "Does it really want to delete this message?",
++ "empty_chat_list_placeholder": "That one doesn't have any chats yet. Start a new chat!",
++ "empty_message_error": "Cannot post empty message",
++ "error_loading_chat": "Something went wrong when loading the chat.",
++ "error_sending_message": "Something went wrong when sending the message.",
++ "message_user": "Message {nickname}",
++ "more": "More",
++ "new": "New Chat",
++ "you": "[self]:"
++ },
++ "display_date": {
++ "today": "Today"
++ },
++ "domain_mute_card": {
++ "mute": "Mute",
++ "mute_progress": "Muting…",
++ "unmute": "Unmute",
++ "unmute_progress": "Unmuting…"
++ },
++ "emoji": {
++ "add_emoji": "Insert emoji",
++ "custom": "Custom emoji",
++ "emoji": "Emoji",
++ "keep_open": "Keep picker open",
++ "load_all": "Loading all {emojiAmount} emoji",
++ "load_all_hint": "Loaded first {saneAmount} emoji, loading all emoji may cause performance issues.",
++ "search_emoji": "Search for an emoji",
++ "stickers": "Stickers",
++ "unicode": "Unicode emoji",
++ "recent": "Recently used"
++ },
++ "errors": {
++ "storage_unavailable": "Pleroma could not access browser storage. Its login and local settings won't be saved and it might encounter unexpected issues. Try enabling cookies."
++ },
++ "exporter": {
++ "export": "Export",
++ "processing": "Processing, you'll soon be asked to download your file"
++ },
++ "features_panel": {
++ "media_proxy": "Media proxy",
++ "scope_options": "Scope options",
++ "text_limit": "Text limit",
++ "title": "Features",
++ "upload_limit": "Upload limit",
++ "who_to_follow": "Who to follow"
++ },
++ "file_type": {
++ "audio": "Audio",
++ "file": "File",
++ "image": "Image",
++ "video": "Video"
++ },
++ "finder": {
++ "error_fetching_user": "Error fetching user",
++ "find_user": "Find user"
++ },
++ "general": {
++ "apply": "Apply",
++ "cancel": "Cancel",
++ "close": "Close",
++ "confirm": "Confirm",
++ "disable": "Disable",
++ "dismiss": "Dismiss",
++ "enable": "Enable",
++ "error_retry": "Please try again",
++ "flash_content": "Click to show Flash content using Ruffle (Experimental, may not work).",
++ "flash_fail": "Failed to load flash content, see console for details.",
++ "flash_security": "Note that this can be potentially dangerous since Flash content is still arbitrary code.",
++ "generic_error": "An error occured",
++ "loading": "Loading…",
++ "more": "More",
++ "optional": "optional",
++ "peek": "Peek",
++ "retry": "Try again",
++ "role": {
++ "admin": "Doll",
++ "moderator": "Doll User"
++ },
++ "scope_in_timeline": {
++ "direct": "Direct",
++ "local": "Local - only this instance can see this post",
++ "private": "Followers-only",
++ "public": "Public",
++ "unlisted": "Unlisted"
++ },
++ "show_less": "Show less",
++ "show_more": "Show more",
++ "submit": "Submit",
++ "verify": "Verify"
++ },
++ "image_cropper": {
++ "cancel": "Cancel",
++ "crop_picture": "Crop picture",
++ "save": "Save",
++ "save_without_cropping": "Save without cropping"
++ },
++ "importer": {
++ "error": "An error occured while importing this file.",
++ "submit": "Submit",
++ "success": "Imported successfully."
++ },
++ "interactions": {
++ "favs_repeats": "Repeats and favorites",
++ "follows": "New follows",
++ "load_older": "Load older interactions",
++ "moves": "User migrates"
++ },
++ "languages": {
++ "ar": "Arabic",
++ "az": "Azerbaijani",
++ "bg": "Bulgarian",
++ "cs": "Czech",
++ "da": "Danish",
++ "de": "German",
++ "el": "Greek",
++ "en": "English",
++ "en_3pp": "English (3rd Person)",
++ "eo": "Esperanto",
++ "es": "Spanish",
++ "fa": "Persian",
++ "fi": "Finnish",
++ "fr": "French",
++ "ga": "Irish",
++ "he": "Hebrew",
++ "hi": "Hindi",
++ "hu": "Hungarian",
++ "id": "Indonesian",
++ "it": "Italian",
++ "ja": "Japanese",
++ "ko": "Korean",
++ "lt": "Lithuanian",
++ "lv": "Latvian",
++ "nl": "Dutch",
++ "pl": "Polish",
++ "pt": "Portuguese",
++ "ru": "Russian",
++ "sk": "Slovak",
++ "sv": "Swedish",
++ "tr": "Turkish",
++ "translated_from": {
++ "ar": "Translated from @:languages.ar",
++ "az": "Translated from @:languages.az",
++ "bg": "Translated from @:languages.bg",
++ "cs": "Translated from @:languages.cs",
++ "da": "Translated from @:languages.da",
++ "de": "Translated from @:languages.de",
++ "el": "Translated from @:languages.el",
++ "en": "Translated from @:languages.en",
++ "eo": "Translated from @:languages.eo",
++ "es": "Translated from @:languages.es",
++ "fa": "Translated from @:languages.fa",
++ "fi": "Translated from @:languages.fi",
++ "fr": "Translated from @:languages.fr",
++ "ga": "Translated from @:languages.ga",
++ "he": "Translated from @:languages.he",
++ "hi": "Translated from @:languages.hi",
++ "hu": "Translated from @:languages.hu",
++ "id": "Translated from @:languages.id",
++ "it": "Translated from @:languages.it",
++ "ja": "Translated from @:languages.ja",
++ "ko": "Translated from @:languages.ko",
++ "lt": "Translated from @:languages.lt",
++ "lv": "Translated from @:languages.lv",
++ "nl": "Translated from @:languages.nl",
++ "pl": "Translated from @:languages.pl",
++ "pt": "Translated from @:languages.pt",
++ "ru": "Translated from @:languages.ru",
++ "sk": "Translated from @:languages.sk",
++ "sv": "Translated from @:languages.sv",
++ "tr": "Translated from @:languages.tr",
++ "uk": "Translated from @:languages.uk",
++ "zh": "Translated from @:languages.zh"
++ },
++ "uk": "Ukrainian",
++ "zh": "Chinese"
++ },
++ "lists": {
++ "create": "Create",
++ "delete": "Delete list",
++ "following_only": "Limit to Following",
++ "lists": "Lists",
++ "new": "New List",
++ "save": "Save changes",
++ "search": "Search users",
++ "title": "List title"
++ },
++ "login": {
++ "authentication_code": "Authentication code",
++ "description": "Log in with OAuth",
++ "enter_recovery_code": "Enter a recovery code",
++ "enter_two_factor_code": "Enter a two-factor code",
++ "heading": {
++ "recovery": "Two-factor recovery",
++ "totp": "Two-factor authentication"
++ },
++ "hint": "Log in to join the discussion",
++ "login": "Log in",
++ "logout": "Log out",
++ "logout_confirm": "Is it sure it wants to log out?",
++ "logout_confirm_accept_button": "Log out",
++ "logout_confirm_cancel_button": "Cancel",
++ "logout_confirm_title": "Log out",
++ "password": "Password",
++ "placeholder": "myusername",
++ "recovery_code": "Recovery code",
++ "register": "Register",
++ "username": "Username"
++ },
++ "media_modal": {
++ "counter": "{current} / {total}",
++ "hide": "Close media viewer",
++ "next": "Next",
++ "previous": "Previous"
++ },
++ "moderation": {
++ "moderation": "Moderation",
++ "reports": {
++ "add_note": "Add note",
++ "close": "Close",
++ "delete_note": "Delete",
++ "delete_note_accept": "Yes, delete it",
++ "delete_note_cancel": "No, keep it",
++ "delete_note_confirm": "Is it sure it wants to delete this note?",
++ "delete_note_title": "Confirm deletion",
++ "no_content": "No description given",
++ "no_reports": "No reports to show",
++ "note_placeholder": "Leave a note",
++ "notes": "{ count } note | { count } notes",
++ "reopen": "Reopen",
++ "report": "Report on",
++ "reports": "Reports",
++ "resolve": "Resolve",
++ "show_closed": "Show closed",
++ "statuses": "{ count } post| { count } posts",
++ "tag_policy_notice": "Enable the TagPolicy MRF to set post restrictions",
++ "tags": "Set post restrictions"
++ },
++ "statuses": "Posts",
++ "users": "Users"
++ },
++ "nav": {
++ "about": "About",
++ "administration": "Administration",
++ "announcements": "Announcements",
++ "back": "Back",
++ "bookmarks": "Bookmarks",
++ "bubble_timeline": "Bubble timeline",
++ "bubble_timeline_description": "Posts from instances close to this one, as recommended by the admins",
++ "chats": "Chats",
++ "dms": "Direct messages",
++ "friend_requests": "Follow requests",
++ "home_timeline": "Home timeline",
++ "home_timeline_description": "Posts from people that one follows",
++ "interactions": "Interactions",
++ "lists": "Lists",
++ "mentions": "Mentions",
++ "moderation": "Moderation",
++ "preferences": "Preferences",
++ "public_timeline_description": "Public posts from this instance",
++ "public_tl": "Public timeline",
++ "search": "Search",
++ "timeline": "Timeline",
++ "timelines": "Timelines",
++ "twkn": "Known Network",
++ "twkn_timeline_description": "Posts from the entire network",
++ "user_search": "User Search",
++ "who_to_follow": "Who to follow"
++ },
++ "notifications": {
++ "broken_favorite": "Unknown post, searching for it…",
++ "error": "Error fetching notifications: {0}",
++ "favorited_you": "favorited its post",
++ "follow_request": "wants to follow that one",
++ "followed_you": "followed that one",
++ "load_older": "Load older notifications",
++ "migrated_to": "migrated to",
++ "no_more_notifications": "No more notifications",
++ "notifications": "Notifications",
++ "poll_ended": "poll has ended",
++ "reacted_with": "reacted with {0}",
++ "read": "Read!",
++ "repeated_you": "repeated its post"
++ },
++ "password_reset": {
++ "check_email": "Check the registered email for a link to reset the password.",
++ "forgot_password": "Forgot password?",
++ "instruction": "Enter that one's email address or username. The hive will send that one a link to reset its password.",
++ "password_reset": "Password reset",
++ "password_reset_disabled": "Password reset is disabled. Please contact the instance administrator.",
++ "password_reset_required": "That one must reset its password to log in.",
++ "password_reset_required_but_mailer_is_disabled": "That one must reset its password, but password reset is disabled. Please contact the instance administrator.",
++ "placeholder": "email or username",
++ "return_home": "Return to the home page",
++ "too_many_requests": "That one has reached the limit of attempts, try again later."
++ },
++ "polls": {
++ "add_option": "Add option",
++ "add_poll": "Add poll",
++ "expired": "Poll ended {0} ago",
++ "expires_in": "Poll ends in {0}",
++ "expiry": "Poll age",
++ "multiple_choices": "Multiple choices",
++ "not_enough_options": "Too few unique options in poll",
++ "option": "Option",
++ "people_voted_count": "{count} person voted | {count} people voted",
++ "single_choice": "Single choice",
++ "type": "Poll type",
++ "vote": "Vote",
++ "votes": "votes",
++ "votes_count": "{count} vote | {count} votes"
++ },
++ "post_status": {
++ "account_not_locked_warning": "That one's account is not {0}. Anyone can follow it to view its follower-only posts.",
++ "account_not_locked_warning_link": "locked",
++ "attachments_sensitive": "Mark attachments as sensitive",
++ "content_type": {
++ "text/bbcode": "BBCode",
++ "text/html": "HTML",
++ "text/markdown": "Markdown",
++ "text/plain": "Plain text",
++ "text/x.misskeymarkdown": "MFM"
++ },
++ "content_warning": "Content Warning (optional)",
++ "toggle_content_warning": "Toggle content warning",
++ "default": "awawawawawawawawawawa",
++ "direct_warning_to_all": "This post will be visible to all the mentioned users.",
++ "direct_warning_to_first_only": "This post will only be visible to the mentioned users at the beginning of the message.",
++ "edit_remote_warning": "Changes made to the post may not be visible on some instances!",
++ "edit_status": "Edit Status",
++ "edit_unsupported_warning": "Polls and mentions will not be changed by editing.",
++ "empty_status_error": "Can't send a post with no content and no files",
++ "media_description": "Media description",
++ "media_description_error": "Failed to update media, try again",
++ "media_not_sensitive_warning": "This post has a Content Warning, but the attachments are not marked as sensitive!",
++ "new_status": "New meow",
++ "post": "Meow",
++ "posting": "Meowing",
++ "preview": "Preview",
++ "preview_empty": "Empty",
++ "scope": {
++ "direct": "Direct - post to mentioned users only",
++ "local": "Local - do not federate this post",
++ "private": "Followers-only - post to followers only",
++ "public": "Public - post to public timelines",
++ "unlisted": "Unlisted - do not post to public timelines"
++ },
++ "scope_notice": {
++ "local": "This post will not be visible on other instances",
++ "private": "This post will be visible to followers only",
++ "public": "This post will be visible to everyone",
++ "unlisted": "This post will not be visible in Public Timeline and The Whole Known Network"
++ }
++ },
++ "registration": {
++ "awaiting_email_confirmation": "The account has been registered and an email has been sent to the registered address. Please check the email to complete registration.",
++ "awaiting_email_confirmation_title": "Awaiting email confirmation",
++ "bio": "Bio",
++ "bio_placeholder": "e.g.\nHi! Welcome to its bio.\nThis one loves watching anime and playing games. It hopes we can be friends!",
++ "captcha": "CAPTCHA",
++ "email": "Email",
++ "email_language": "In which language does it want to receive emails from the server?",
++ "fullname": "Display name",
++ "fullname_placeholder": "e.g. Unit 41787-25Y",
++ "new_captcha": "Click the image to get a new captcha",
++ "password_confirm": "Password confirmation",
++ "reason": "Reason to register",
++ "reason_placeholder": "This instance approves registrations manually.\nLet the administration know why that one wants to register.",
++ "register": "Register",
++ "registration": "Registration",
++ "request_sent": "The registration request has been sent for approval. That one will receive an email when its account is approved.",
++ "request_sent_title": "Registration request sent",
++ "token": "Invite token",
++ "username_placeholder": "e.g. 41787",
++ "validations": {
++ "email_required": "cannot be left blank",
++ "fullname_required": "cannot be left blank",
++ "password_confirmation_match": "should be the same as password",
++ "password_confirmation_required": "cannot be left blank",
++ "password_required": "cannot be left blank",
++ "username_required": "cannot be left blank"
++ }
++ },
++ "remote_user_resolver": {
++ "error": "Not found.",
++ "remote_user_resolver": "Remote user resolver",
++ "searching_for": "Searching for"
++ },
++ "search": {
++ "hashtags": "Hashtags",
++ "no_results": "No results",
++ "people": "Creatures",
++ "people_talking": "{count} creatures talking",
++ "person_talking": "{count} creature talking"
++ },
++ "selectable_list": {
++ "select_all": "Select all"
++ },
++ "settings": {
++ "accent": "Accent",
++ "account_alias": "Account aliases",
++ "account_alias_table_head": "Alias",
++ "account_backup": "Account backup",
++ "account_backup_description": "This allows one to download an archive of its account information and its posts, but they cannot yet be imported into a Akkoma account.",
++ "account_backup_table_head": "Backup",
++ "account_privacy": "Privacy",
++ "add_alias_error": "Error adding alias: {error}",
++ "add_backup": "Create a new backup",
++ "add_backup_error": "Error adding a new backup: {error}",
++ "added_alias": "Alias is added.",
++ "added_backup": "Added a new backup.",
++ "allow_following_move": "Allow auto-follow when following account moves",
++ "always_show_post_button": "Always show floating New Post button",
++ "app_name": "App name",
++ "attachmentRadius": "Attachments",
++ "attachments": "Attachments",
++ "autohide_floating_post_button": "Automatically hide New Post button (mobile)",
++ "avatar": "Avatar",
++ "avatarAltRadius": "Avatars (notifications)",
++ "avatarRadius": "Avatars",
++ "avatar_size_instruction": "The recommended minimum size for avatar images is 150x150 pixels.",
++ "background": "Background",
++ "backup_not_ready": "This backup is not ready yet.",
++ "bio": "Bio",
++ "block_export": "Block export",
++ "block_export_button": "Export current blocks to a csv file",
++ "block_import": "Block import",
++ "block_import_error": "Error importing blocks",
++ "blocks_imported": "Blocks imported! Processing them will take a while.",
++ "blocks_tab": "Blocks",
++ "bot": "This is a bot account",
++ "btnRadius": "Buttons",
++ "cBlue": "Blue (Reply, follow)",
++ "cGreen": "Green (Retweet)",
++ "cOrange": "Orange (Favorite)",
++ "cRed": "Red (Cancel)",
++ "change_email": "Change email",
++ "change_email_error": "There was an issue changing the registered email.",
++ "change_password": "Change password",
++ "change_password_error": "There was an issue changing the password.",
++ "changed_email": "Email changed successfully!",
++ "changed_password": "Password changed successfully!",
++ "chatMessageRadius": "Chat message",
++ "checkboxRadius": "Checkboxes",
++ "collapse_subject": "Collapse posts with content warnings",
++ "columns": "Columns",
++ "composing": "Composing",
++ "confirm_dialogs": "Require confirmation for:",
++ "confirm_dialogs_approve_follow": "Accepting a follow request",
++ "confirm_dialogs_block": "Blocking someone",
++ "confirm_dialogs_delete": "Deleting a post",
++ "confirm_dialogs_deny_follow": "Rejecting a follow request",
++ "confirm_dialogs_mute": "Muting someone",
++ "confirm_dialogs_repeat": "Repeating a post",
++ "confirm_dialogs_favorite": "Favoriting a post",
++ "confirm_dialogs_unfollow": "Unfollowing someone",
++ "confirm_new_password": "Confirm new password",
++ "confirmation_dialogs": "Confirmation options",
++ "conversation_display": "Conversation display style",
++ "conversation_display_linear": "Linear-style",
++ "conversation_display_tree": "Tree-style",
++ "conversation_other_replies_button": "Show the \"other replies\" button",
++ "conversation_other_replies_button_below": "Below posts",
++ "conversation_other_replies_button_inside": "Inside posts",
++ "current_avatar": "Current avatar",
++ "current_mascot": "Current mascot",
++ "current_password": "Current password",
++ "data_import_export_tab": "Data import / export",
++ "default_vis": "Default visibility scope",
++ "delete_account": "Delete account",
++ "delete_account_description": "Permanently delete all data and deactivate this account.",
++ "delete_account_error": "There was an issue deleting the account. If this persists please contact the instance administrator.",
++ "delete_account_instructions": "Type the account password in the input below to confirm account deletion.",
++ "disable_sticky_headers": "Don't stick column headers to top of the screen",
++ "discoverable": "Allow discovery of this account in search results and other services",
++ "domain_mutes": "Domains",
++ "download_backup": "Download",
++ "email_language": "Language for receiving emails from the server",
++ "emoji_reactions_on_timeline": "Show emoji reactions on timeline",
++ "enable_web_push_notifications": "Enable web push notifications",
++ "enter_current_password_to_confirm": "Enter the current password to confirm that one's identity",
++ "expert_mode": "Show advanced",
++ "expire_posts_enabled": "Delete posts after a set amount of days",
++ "expire_posts_input_placeholder": "Number of days",
++ "export_theme": "Save preset",
++ "file_export_import": {
++ "backup_restore": "Settings backup",
++ "backup_settings": "Backup settings to file",
++ "backup_settings_theme": "Backup settings and theme to file",
++ "errors": {
++ "file_slightly_new": "File minor version is different, some settings might not load",
++ "file_too_new": "Incompatible major version: {fileMajor}, this PleromaFE (settings ver {feMajor}) is too old to handle it",
++ "file_too_old": "Incompatible major version: {fileMajor}, file version is too old and not supported (min. set. ver. {feMajor})",
++ "invalid_file": "The selected file is not a supported Pleroma settings backup. No changes were made."
++ },
++ "restore_settings": "Restore settings from file"
++ },
++ "filtering": "Filtering",
++ "filtering_explanation": "All posts containing these words will be muted, one per line",
++ "follow_export": "Follow export",
++ "follow_export_button": "Export current follows to a csv file",
++ "follow_import": "Follow import",
++ "follow_import_error": "Error importing followers",
++ "follows_imported": "Follows imported! Processing them will take a while.",
++ "foreground": "Foreground",
++ "fun": "Fun",
++ "general": "General",
++ "greentext": "Meme arrows",
++ "hide_all_muted_posts": "Hide muted posts",
++ "hide_attachments_in_convo": "Hide attachments in conversations",
++ "hide_attachments_in_tl": "Hide attachments in timeline",
++ "hide_bot_indication": "Hide bot indication in posts",
++ "hide_favorites_description": "Don't show list of its favorites (creatures still get notified)",
++ "hide_filtered_statuses": "Hide all filtered posts",
++ "hide_followers_count_description": "Don't show follower count",
++ "hide_followers_description": "Don't show who's following it",
++ "hide_follows_count_description": "Don't show follow count",
++ "hide_follows_description": "Don't show who it is following",
++ "hide_isp": "Hide instance-specific panel",
++ "hide_list_aliases_error_action": "Close",
++ "hide_media_previews": "Hide media previews",
++ "hide_muted_posts": "Hide posts of muted users",
++ "hide_muted_threads": "Hide muted threads",
++ "hide_post_stats": "Hide post statistics (e.g. the number of favorites)",
++ "hide_shoutbox": "Hide instance shoutbox",
++ "hide_site_favicon": "Hide instance favicon in top panel",
++ "hide_site_name": "Hide instance name in top panel",
++ "hide_threads_with_blocked_users": "Hide threads mentioning blocked users",
++ "hide_user_stats": "Hide user statistics (e.g. the number of followers)",
++ "hide_wallpaper": "Hide instance wallpaper",
++ "hide_wordfiltered_statuses": "Hide word-filtered posts",
++ "import_blocks_from_a_csv_file": "Import blocks from a csv file",
++ "import_followers_from_a_csv_file": "Import follows from a csv file",
++ "import_mutes_from_a_csv_file": "Import mutes from a csv file",
++ "import_theme": "Load preset",
++ "inputRadius": "Input fields",
++ "instance_default": "(default: {value})",
++ "instance_default_simple": "(default)",
++ "interface": "Interface",
++ "interfaceLanguage": "Interface language",
++ "invalid_theme_imported": "The selected file is not a supported Pleroma theme. No changes to this theme were made.",
++ "limited_availability": "Unavailable in this browser",
++ "links": "Links",
++ "list_aliases_error": "Error fetching aliases: {error}",
++ "list_backups_error": "Error fetching backup list: {error}",
++ "lock_account_description": "Restrict this account to approved followers only",
++ "permit_followback_description": "Automatically approve requests from already followed users",
++ "loop_video": "Loop videos",
++ "loop_video_silent_only": "Loop only videos without sound (i.e. Mastodon's \"gifs\")",
++ "mascot": "Mastodon FE Mascot",
++ "max_depth_in_thread": "Maximum number of levels in thread to display by default",
++ "max_thumbnails": "Maximum amount of thumbnails per post (empty = no limit)",
++ "mention_link_bolden_you": "Highlight mention of that one when it's mentioned",
++ "mention_link_display": "Display mention links",
++ "mention_link_display_full": "always as full names (e.g. {'@'}foo{'@'}example.org)",
++ "mention_link_display_full_for_remote": "as full names only for remote users (e.g. {'@'}foo{'@'}example.org)",
++ "mention_link_display_short": "always as short names (e.g. {'@'}foo)",
++ "mention_link_fade_domain": "Fade domains (e.g. {'@'}example.org in {'@'}foo{'@'}example.org)",
++ "mention_link_show_avatar": "Show user avatar beside the link",
++ "mention_link_show_tooltip": "Show full user names as tooltip for remote users",
++ "mention_links": "Mention links",
++ "mfa": {
++ "authentication_methods": "Authentication methods",
++ "confirm_and_enable": "Confirm & enable OTP",
++ "generate_new_recovery_codes": "Generate new recovery codes",
++ "otp": "OTP",
++ "recovery_codes": "Recovery codes.",
++ "recovery_codes_warning": "Write the codes down or save them somewhere secure - they will not be shown again. If one loses access to its 2FA app and recovery codes, it will be locked out of its account.",
++ "scan": {
++ "desc": "Using the two-factor app, scan this QR code or enter text key:",
++ "secret_code": "Key",
++ "title": "Scan"
++ },
++ "setup_otp": "Setup OTP",
++ "title": "Two-factor Authentication",
++ "verify": {
++ "desc": "To enable two-factor authentication, enter the code from the two-factor app:"
++ },
++ "wait_pre_setup_otp": "presetting OTP",
++ "waiting_a_recovery_codes": "Receiving backup codes…",
++ "warning_of_generate_new_codes": "When one generates new recovery codes, the old codes won't work anymore."
++ },
++ "minimal_scopes_mode": "Minimize post scope selection options",
++ "more_settings": "More settings",
++ "move_account": "Move account",
++ "move_account_error": "Error moving account: {error}",
++ "move_account_notes": "If one wants to move this account somewhere else, it must go to its target account and add an alias pointing here.",
++ "move_account_target": "Target account (e.g. {example})",
++ "moved_account": "Account is moved.",
++ "mute_bot_posts": "Mute non-sentient bot posts",
++ "mute_export": "Mute export",
++ "mute_export_button": "Export current mutes to a csv file",
++ "mute_import": "Mute import",
++ "mute_import_error": "Error importing mutes",
++ "mutes_and_blocks": "Mutes and Blocks",
++ "mutes_imported": "Mutes imported! Processing them will take a while.",
++ "mutes_tab": "Mutes",
++ "name": "Name",
++ "name_bio": "Name & bio",
++ "new_alias_target": "Add a new alias (e.g. {example})",
++ "new_email": "New email",
++ "new_password": "New password",
++ "no_blocks": "No blocks",
++ "no_mutes": "No mutes",
++ "no_rich_text_description": "Strip rich text formatting from all posts",
++ "notification_blocks": "Blocking a user stops all notifications as well as unsubscribes them.",
++ "notification_mutes": "To stop receiving notifications from a specific user, use a mute.",
++ "notification_setting_block_from_strangers": "Block notifications from users who it does not follow",
++ "notification_setting_filters": "Filters",
++ "notification_setting_hide_if_cw": "Hide the contents of push notifications if under a Content Warning",
++ "notification_setting_hide_notification_contents": "Hide the sender and contents of push notifications",
++ "notification_setting_privacy": "Privacy",
++ "notification_visibility": "Types of notifications to show",
++ "notification_visibility_emoji_reactions": "Reactions",
++ "notification_visibility_follows": "Follows",
++ "notification_visibility_likes": "Favorites",
++ "notification_visibility_mentions": "Mentions",
++ "notification_visibility_moves": "User Migrates",
++ "notification_visibility_polls": "Ends of polls that one voted in",
++ "notification_visibility_repeats": "Repeats",
++ "notifications": "Notifications",
++ "nsfw_clickthrough": "Hide sensitive/NSFW media",
++ "oauth_tokens": "OAuth tokens",
++ "pad_emoji": "Pad emoji with spaces when adding from picker",
++ "panelRadius": "Panels",
++ "pause_on_unfocused": "Pause when tab is not focused",
++ "play_videos_in_modal": "Play videos in a popup frame",
++ "post_look_feel": "Posts Look & Feel",
++ "post_status_content_type": "Default post content type",
++ "posts": "Meows",
++ "preload_images": "Preload images",
++ "presets": "Presets",
++ "profile_background": "Profile background",
++ "profile_banner": "Profile banner",
++ "profile_fields": {
++ "add_field": "Add field",
++ "label": "Profile metadata",
++ "name": "Label",
++ "value": "Content"
++ },
++ "profile_tab": "Profile",
++ "radii_help": "Set up interface edge rounding (in pixels)",
++ "refresh_token": "Refresh token",
++ "remove_alias": "Remove this alias",
++ "remove_backup": "Remove",
++ "render_mfm": "Render Misskey Markdown",
++ "render_mfm_on_hover": "Pause MFM animations until post hover",
++ "replies_in_timeline": "Replies in timeline",
++ "reply_visibility_all": "Show all replies",
++ "reply_visibility_following": "Only show replies directed at self or users its following",
++ "reply_visibility_following_short": "Show replies to its follows",
++ "reply_visibility_self": "Only show replies directed at self",
++ "reply_visibility_self_short": "Show replies to self only",
++ "reset_avatar": "Reset avatar",
++ "reset_avatar_confirm": "Does it really want to reset the avatar?",
++ "reset_background_confirm": "Does it really want to reset the background?",
++ "reset_banner_confirm": "Does it really want to reset the banner?",
++ "reset_profile_background": "Reset profile background",
++ "reset_profile_banner": "Reset profile banner",
++ "revoke_token": "Revoke",
++ "right_sidebar": "Reverse order of columns",
++ "save": "Save changes",
++ "saving_err": "Error saving settings",
++ "saving_ok": "Settings saved",
++ "scope_copy": "Copy scope when replying (DMs are always copied)",
++ "search_user_to_block": "Search whom it wants to block",
++ "search_user_to_mute": "Search whom it wants to mute",
++ "security": "Security",
++ "security_tab": "Security",
++ "sensitive_by_default": "Mark posts as sensitive by default",
++ "sensitive_if_subject": "Automatically mark images as sensitive if a content warning is specified",
++ "set_new_avatar": "Set new avatar",
++ "set_new_mascot": "Set new mascot",
++ "set_new_profile_background": "Set new profile background",
++ "set_new_profile_banner": "Set new profile banner",
++ "setting_changed": "Setting is different from default",
++ "setting_server_side": "This setting is tied to that one's profile and affects all sessions and clients",
++ "settings": "Settings",
++ "settings_profile": "Settings Profiles",
++ "settings_profile_creation": "Create new profile",
++ "settings_profile_creation_new_name_label": "Name",
++ "settings_profile_creation_submit": "Create",
++ "settings_profile_currently": "Currently using {name} (version: {version})",
++ "settings_profile_delete": "Delete",
++ "settings_profile_delete_confirm": "Does it really want to delete this profile?",
++ "settings_profile_force_sync": "Synchronize",
++ "settings_profile_in_use": "In use",
++ "settings_profile_use": "Use",
++ "settings_profiles_refresh": "Reload settings profiles",
++ "settings_profiles_show": "Show all settings profiles",
++ "settings_profiles_unshow": "Hide all settings profiles",
++ "show_admin_badge": "Show \"Doll\" badge in profile",
++ "show_moderator_badge": "Show \"Doll User\" badge in profile",
++ "show_nav_shortcuts": "Show extra navigation shortcuts in top panel",
++ "show_panel_nav_shortcuts": "Show timeline navigation shortcuts at the top of the panel",
++ "show_scrollbars": "Show side column's scrollbars",
++ "show_page_backgrounds": "Show page-specific backgrounds, e.g. for user profiles",
++ "show_wider_shortcuts": "Show wider gap between top panel shortcuts",
++ "show_yous": "Show ([loopback])s",
++ "stop_gifs": "Pause animated images until hovered over",
++ "streaming": "Automatically show new posts when scrolled to the top",
++ "style": {
++ "advanced_colors": {
++ "_tab_label": "Advanced",
++ "alert": "Alert background",
++ "alert_error": "Error",
++ "alert_neutral": "Neutral",
++ "alert_warning": "Warning",
++ "badge": "Badge background",
++ "badge_notification": "Notification",
++ "borders": "Borders",
++ "buttons": "Buttons",
++ "chat": {
++ "border": "Border",
++ "incoming": "Incoming",
++ "outgoing": "Outgoing"
++ },
++ "disabled": "Disabled",
++ "faint_text": "Faded text",
++ "highlight": "Highlighted elements",
++ "icons": "Icons",
++ "inputs": "Input fields",
++ "panel_header": "Panel header",
++ "poll": "Poll graph",
++ "popover": "Tooltips, menus, popovers",
++ "post": "Posts/User bios",
++ "pressed": "Pressed",
++ "selectedMenu": "Selected menu item",
++ "selectedPost": "Selected post",
++ "tabs": "Tabs",
++ "toggled": "Toggled",
++ "top_bar": "Top bar",
++ "underlay": "Underlay",
++ "wallpaper": "Wallpaper"
++ },
++ "common": {
++ "color": "Color",
++ "contrast": {
++ "context": {
++ "18pt": "for large (18pt+) text",
++ "text": "for text"
++ },
++ "hint": "Contrast ratio is {ratio}, it {level} {context}",
++ "level": {
++ "aa": "meets Level AA guideline (minimal)",
++ "aaa": "meets Level AAA guideline (recommended)",
++ "bad": "doesn't meet any accessibility guidelines"
++ }
++ },
++ "opacity": "Opacity"
++ },
++ "common_colors": {
++ "_tab_label": "Common",
++ "foreground_hint": "See \"Advanced\" tab for more detailed control",
++ "main": "Common colors",
++ "rgbo": "Icons, accents, badges"
++ },
++ "fonts": {
++ "_tab_label": "Fonts",
++ "components": {
++ "input": "Input fields",
++ "interface": "Interface",
++ "post": "Post text",
++ "postCode": "Monospaced text in a post (rich text)"
++ },
++ "custom": "Custom",
++ "family": "Font name",
++ "help": "Select font to use for elements of UI. For \"custom\" one must enter the exact font name as it appears in system.",
++ "size": "Size (in px)",
++ "weight": "Weight (boldness)"
++ },
++ "preview": {
++ "button": "Button",
++ "checkbox": "This one has skimmed over terms and conditions",
++ "content": "Content",
++ "error": "Example error",
++ "faint_link": "helpful manual",
++ "fine_print": "Read our {0} to learn nothing useful!",
++ "header": "Preview",
++ "header_faint": "This is fine",
++ "input": "Just arrived at Luna Nova Academy",
++ "link": "a nice lil' link",
++ "mono": "content",
++ "text": "A bunch of more {0} and {1}"
++ },
++ "radii": {
++ "_tab_label": "Roundness"
++ },
++ "shadows": {
++ "_tab_label": "Shadow and lighting",
++ "blur": "Blur",
++ "component": "Component",
++ "components": {
++ "avatar": "User avatar (in profile view)",
++ "avatarStatus": "User avatar (in post display)",
++ "button": "Button",
++ "buttonHover": "Button (hover)",
++ "buttonPressed": "Button (pressed)",
++ "buttonPressedHover": "Button (pressed+hover)",
++ "input": "Input field",
++ "panel": "Panel",
++ "panelHeader": "Panel header",
++ "popup": "Popups and tooltips",
++ "topBar": "Top bar"
++ },
++ "filter_hint": {
++ "always_drop_shadow": "Warning, this shadow always uses {0} when browser supports it.",
++ "avatar_inset": "Please note that combining both inset and non-inset shadows on avatars might give unexpected results with transparent avatars.",
++ "drop_shadow_syntax": "{0} does not support {1} parameter and {2} keyword.",
++ "inset_classic": "Inset shadows will be using {0}",
++ "spread_zero": "Shadows with spread > 0 will appear as if it was set to zero"
++ },
++ "hintV3": "For shadows one can also use the {0} notation to use other color slot.",
++ "inset": "Inset",
++ "override": "Override",
++ "shadow_id": "Shadow #{value}",
++ "spread": "Spread"
++ },
++ "switcher": {
++ "clear_all": "Clear all",
++ "clear_opacity": "Clear opacity",
++ "help": {
++ "fe_downgraded": "PleromaFE's version rolled back.",
++ "fe_upgraded": "PleromaFE's theme engine upgraded after version update.",
++ "future_version_imported": "File imported was made in newer version of FE.",
++ "migration_napshot_gone": "For whatever reason snapshot was missing, some stuff could look different than that one remembers.",
++ "migration_snapshot_ok": "Just to be safe, theme snapshot loaded. One can try loading theme data.",
++ "older_version_imported": "File imported was made in older version of FE.",
++ "snapshot_missing": "No theme snapshot was in the file so it could look different than originally envisioned.",
++ "snapshot_present": "Theme snapshot is loaded, so all values are overriden. One can load theme's actual data instead.",
++ "snapshot_source_mismatch": "Versions conflict: most likely FE was rolled back and updated again, if one changed theme using older version of FE it most likely want to use old version, otherwise use new version.",
++ "upgraded_from_v2": "PleromaFE has been upgraded, theme could look a little bit different than that one remembers.",
++ "v2_imported": "File imported was made for older FE. We try to maximize compatibility but there still could be inconsistencies."
++ },
++ "keep_as_is": "Keep as is",
++ "keep_color": "Keep colors",
++ "keep_fonts": "Keep fonts",
++ "keep_opacity": "Keep opacity",
++ "keep_roundness": "Keep roundness",
++ "keep_shadows": "Keep shadows",
++ "load_theme": "Load theme",
++ "reset": "Reset",
++ "save_load_hint": "\"Keep\" options preserve currently set options when selecting or loading themes, it also stores said options when exporting a theme. When all checkboxes unset, exporting theme will save everything.",
++ "use_snapshot": "Old version",
++ "use_source": "New version"
++ }
++ },
++ "subject_input_always_show": "Always show content warning field",
++ "subject_line_behavior": "Copy content warning when replying",
++ "subject_line_email": "Like email: \"re: warning\"",
++ "subject_line_mastodon": "Like mastodon: copy as is",
++ "subject_line_noop": "Do not copy",
++ "text": "Text",
++ "theme": "Theme",
++ "theme_help": "Use hex color codes (#rrggbb) to customize the color theme.",
++ "theme_help_v2_1": "One can also override certain component's colors and opacity by toggling the checkbox, use \"Clear all\" button to clear all overrides.",
++ "theme_help_v2_2": "Icons underneath some entries are background/text contrast indicators, hover over for detailed info. Please keep in mind that when using transparency contrast indicators show the worst possible case.",
++ "third_column_mode": "When there's enough space, show third column containing",
++ "third_column_mode_none": "Don't show third column at all",
++ "third_column_mode_notifications": "Notifications column",
++ "third_column_mode_postform": "Main post form and navigation",
++ "token": "Token",
++ "tooltipRadius": "Tooltips/alerts",
++ "translation_language": "Automatic Translation Language",
++ "tree_advanced": "Display extra buttons to open and close reply chains in threads",
++ "tree_fade_ancestors": "Display ancestors of the current post in faint text",
++ "type_domains_to_mute": "Search domains to mute",
++ "upload_a_photo": "Upload a photo",
++ "useStreamingApi": "Receive posts and notifications real-time",
++ "useStreamingApiWarning": "It's cool use it. If it breaks refresh we guess?",
++ "use_contain_fit": "Don't crop the attachment in thumbnails",
++ "use_one_click_nsfw": "Open NSFW attachments with just one click",
++ "user_mutes": "Users",
++ "user_profile_default_tab": "Default Tab on User Profile",
++ "user_profiles": "User Profiles",
++ "user_settings": "User Settings",
++ "user_accepts_direct_messages_from": "Accept DMs From",
++ "user_accepts_direct_messages_from_everybody": "Everybody",
++ "user_accepts_direct_messages_from_nobody": "Nobody",
++ "user_accepts_direct_messages_from_people_i_follow": "Creatures it follows",
++ "valid_until": "Valid until",
++ "values": {
++ "false": "no",
++ "true": "yes"
++ },
++ "version": {
++ "backend_version": "Backend version",
++ "frontend_version": "Frontend version",
++ "title": "Version"
++ },
++ "virtual_scrolling": "Optimize timeline rendering",
++ "use_blurhash": "Use blurhashes for NSFW thumbnails",
++ "word_filter": "Word filter",
++ "wordfilter": "Wordfilter"
++ },
++ "settings_profile": {
++ "creating": "Creating new setting profile \"{profile}\"...",
++ "synchronization_error": "Could not synchronize settings: {err}",
++ "synchronized": "Synchronized settings!",
++ "synchronizing": "Synchronizing setting profile \"{profile}\"..."
++ },
++ "status": {
++ "ancestor_follow": "See {numReplies} other reply under this post | See {numReplies} other replies under this post",
++ "ancestor_follow_with_icon": "{icon} {text}",
++ "attachment_stop_flash": "Stop Flash player",
++ "bookmark": "Bookmark",
++ "collapse_attachments": "Collapse attachments",
++ "copy_link": "Copy link to post",
++ "delete": "Delete post",
++ "delete_confirm": "Does it really want to delete this post?",
++ "delete_confirm_accept_button": "Yes, delete it",
++ "delete_confirm_cancel_button": "No, keep it",
++ "delete_confirm_title": "Confirm deletion",
++ "edit": "Edit",
++ "edit_history": "Edit History",
++ "edit_history_modal_title": "Edited {historyCount} time | Edited {historyCount} times",
++ "edited_at": "Edited {time}",
++ "expand": "Expand",
++ "external_source": "External source",
++ "favorites": "Favorites",
++ "favorite_confirm": "Does it really want to favorite this post?",
++ "favorite_confirm_accept_button": "Yes, favorite it",
++ "favorite_confirm_cancel_button": "No, don't favorite",
++ "favorite_confirm_title": "Confirm favorite",
++ "hide_attachment": "Hide attachment",
++ "hide_content": "Hide content",
++ "hide_full_subject": "Hide full content warning",
++ "many_attachments": "Post has {number} attachment | Post has {number} attachments",
++ "mentions": "Mentions",
++ "move_down": "Shift attachment right",
++ "move_up": "Shift attachment left",
++ "mute_conversation": "Mute conversation",
++ "nsfw": "NSFW",
++ "open_gallery": "Open gallery",
++ "override_translation_source_language": "Override source language",
++ "pin": "Pin on profile",
++ "pinned": "Pinned",
++ "plus_more": "+{number} more",
++ "redraft": "Delete & redraft",
++ "redraft_confirm": "Does it really want to delete and redraft this post? Interactions to the original post will not be preserved.",
++ "redraft_confirm_accept_button": "Yes, delete and redraft",
++ "redraft_confirm_cancel_button": "No, keep the original",
++ "redraft_confirm_title": "Confirm delete & redraft",
++ "remove_attachment": "Remove attachment",
++ "repeat_confirm": "Does it really want to repeat this post?",
++ "repeat_confirm_accept_button": "Yes, repeat it",
++ "repeat_confirm_cancel_button": "No, don't repeat",
++ "repeat_confirm_title": "Confirm repeat",
++ "repeats": "Repeats",
++ "replies_list": "Replies:",
++ "replies_list_with_others": "View {numReplies} more reply | View {numReplies} more replies",
++ "reply_to": "Reply to",
++ "show_all_attachments": "Show all attachments",
++ "show_all_conversation": "Show full conversation ({numStatus} other post) | Show full conversation ({numStatus} other posts)",
++ "show_all_conversation_with_icon": "{icon} {text}",
++ "show_attachment_description": "Preview description (open attachment for full description)",
++ "show_attachment_in_modal": "Show attachment in a window",
++ "show_content": "Show content",
++ "show_full_subject": "Show full content warning",
++ "show_only_conversation_under_this": "Only show replies to this post",
++ "status_deleted": "This post was deleted",
++ "status_unavailable": "Post unavailable",
++ "thread_follow": "View {numStatus} more reply | View {numStatus} more replies",
++ "thread_follow_with_icon": "{icon} {text}",
++ "thread_hide": "Hide this thread",
++ "thread_muted": "Thread muted",
++ "thread_muted_and_words": ", has words:",
++ "thread_show": "Show this thread",
++ "thread_show_full": "Show {numStatus} reply | Show all {numStatus} replies",
++ "thread_show_full_with_icon": "{icon} {text}",
++ "translate": "Translate",
++ "translated_from": "Translated from {language}",
++ "unbookmark": "Unbookmark",
++ "unmute_conversation": "Unmute conversation",
++ "unpin": "Unpin from profile",
++ "you": "([loopback])"
++ },
++ "time": {
++ "in_future": "in {0}",
++ "in_past": "{0} ago",
++ "now": "just now",
++ "now_short": "now",
++ "unit": {
++ "days": "{0} day | {0} days",
++ "days_short": "{0}d",
++ "hours": "{0} hour | {0} hours",
++ "hours_short": "{0}h",
++ "minutes": "{0} minute | {0} minutes",
++ "minutes_short": "{0}min",
++ "months": "{0} month | {0} months",
++ "months_short": "{0}mo",
++ "seconds": "{0} second | {0} seconds",
++ "seconds_short": "{0}s",
++ "weeks": "{0} week | {0} weeks",
++ "weeks_short": "{0}w",
++ "years": "{0} year | {0} years",
++ "years_short": "{0}y"
++ }
++ },
++ "timeline": {
++ "collapse": "Collapse",
++ "conversation": "Conversation",
++ "error": "Error fetching timeline: {0}",
++ "follow_tag": "Follow hashtag",
++ "load_older": "Load older posts",
++ "no_more_statuses": "No more posts",
++ "no_retweet_hint": "Post is marked as followers-only or direct and cannot be repeated or quoted",
++ "no_statuses": "No posts",
++ "reload": "Reload",
++ "repeated": "repeated",
++ "show_new": "Show new",
++ "socket_broke": "Realtime connection lost: CloseEvent code {0}",
++ "socket_reconnected": "Realtime connection established",
++ "follow_tag": "Follow hashtag",
++ "unfollow_tag": "Unfollow hashtag",
++ "up_to_date": "Up-to-date"
++ },
++ "toast": {
++ "no_translation_target_set": "No translation target language set - this may fail. Please set a target language in settings."
++ },
++ "tool_tip": {
++ "accept_follow_request": "Accept follow request",
++ "add_reaction": "Add Reaction",
++ "bookmark": "Bookmark",
++ "favorite": "Favorite",
++ "media_upload": "Upload media",
++ "quote": "Quote",
++ "reject_follow_request": "Reject follow request",
++ "repeat": "Repeat",
++ "reply": "Reply",
++ "user_settings": "User Settings"
++ },
++ "upload": {
++ "error": {
++ "base": "Upload failed.",
++ "default": "Try again later",
++ "file_too_big": "File too big [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]",
++ "message": "Upload failed: {0}"
++ },
++ "file_size_units": {
++ "B": "B",
++ "GiB": "GiB",
++ "KiB": "KiB",
++ "MiB": "MiB",
++ "TiB": "TiB"
++ }
++ },
++ "user_card": {
++ "admin_menu": {
++ "activate_account": "Activate account",
++ "deactivate_account": "Deactivate account",
++ "delete_account": "Delete account",
++ "delete_user": "Delete user",
++ "delete_user_data_and_deactivate_confirmation": "This will permanently delete the data from this account and deactivate it. Is it absolutely sure?",
++ "disable_any_subscription": "Disallow following user at all",
++ "disable_remote_subscription": "Disallow following user from remote instances",
++ "force_nsfw": "Mark all posts as NSFW",
++ "force_unlisted": "Force posts to be unlisted",
++ "grant_admin": "Grant Doll",
++ "grant_moderator": "Grant Doll User",
++ "moderation": "Moderation",
++ "quarantine": "Disallow user posts from federating",
++ "revoke_admin": "Revoke Doll",
++ "revoke_moderator": "Revoke Doll User",
++ "sandbox": "Force posts to be followers-only",
++ "strip_media": "Remove media from posts"
++ },
++ "approve": "Approve",
++ "approve_confirm": "Is it sure it wants to let this user follow it?",
++ "approve_confirm_accept_button": "Yes, accept",
++ "approve_confirm_cancel_button": "No, cancel",
++ "approve_confirm_title": "Approve follow request",
++ "block": "Block",
++ "block_confirm": "Is it sure it wants to block {user}?",
++ "block_confirm_accept_button": "Yes, block",
++ "block_confirm_cancel_button": "No, don't block",
++ "block_confirm_title": "Block user",
++ "block_progress": "Blocking…",
++ "blocked": "Blocked!",
++ "blocks_you": "Blocks that one!",
++ "bot": "Mechanical",
++ "deactivated": "Deactivated",
++ "deny": "Deny",
++ "deny_confirm": "Is it sure it wants to deny this user's follow request?",
++ "deny_confirm_accept_button": "Yes, deny",
++ "deny_confirm_cancel_button": "No, cancel",
++ "deny_confirm_title": "Deny follow request",
++ "domain_muted": "Unblock domain",
++ "edit_profile": "Edit profile",
++ "favorites": "Favorites",
++ "follow": "Follow",
++ "follow_cancel": "Cancel request",
++ "follow_progress": "Requesting…",
++ "follow_sent": "Request sent!",
++ "follow_unfollow": "Unfollow",
++ "followees": "Following",
++ "followers": "Followers",
++ "followed_tags": "Followed hashtags",
++ "followed_users": "Followed users",
++ "following": "Following!",
++ "follows_you": "Follows that one!",
++ "hidden": "Hidden",
++ "hide_repeats": "Hide repeats",
++ "highlight": {
++ "disabled": "No highlight",
++ "side": "Side stripe",
++ "solid": "Solid bg",
++ "striped": "Striped bg"
++ },
++ "its_you": "awawawa!!",
++ "media": "Media",
++ "mention": "Mention",
++ "message": "Message",
++ "mute": "Mute",
++ "mute_confirm": "Is it sure it wants to mute {user}?",
++ "mute_confirm_accept_button": "Yes, mute",
++ "mute_confirm_cancel_button": "No, don't mute",
++ "mute_confirm_title": "Mute user",
++ "mute_domain": "Block domain",
++ "mute_progress": "Muting…",
++ "muted": "Muted",
++ "note": "Private note",
++ "per_day": "per day",
++ "remote_follow": "Remote follow",
++ "remove_follower": "Remove follower",
++ "replies": "With Replies",
++ "report": "Report",
++ "requested_by": "Has requested to follow that one",
++ "show_repeats": "Show repeats",
++ "statuses": "Posts",
++ "subscribe": "Subscribe",
++ "unblock": "Unblock",
++ "unblock_progress": "Unblocking…",
++ "unfollow_confirm": "Is it sure it wants to unfollow {user}?",
++ "unfollow_confirm_accept_button": "Yes, unfollow",
++ "unfollow_confirm_cancel_button": "No, don't unfollow",
++ "unfollow_confirm_title": "Unfollow user",
++ "not_following_any_hashtags": "It is not following any hashtags",
++ "follow_tag": "Follow hashtag",
++ "unfollow_tag": "Unfollow hashtag",
++ "unmute": "Unmute",
++ "unmute_progress": "Unmuting…",
++ "unsubscribe": "Unsubscribe"
++ },
++ "user_profile": {
++ "profile_does_not_exist": "Sorry, this profile does not exist.",
++ "profile_loading_error": "Sorry, there was an error loading this profile.",
++ "timeline_title": "User timeline",
++ "field_validated": "Link Verified"
++ },
++ "user_reporting": {
++ "add_comment_description": "The report will be sent to the instance moderators. One can provide an explanation of why it is reporting this account below:",
++ "additional_comments": "Additional comments",
++ "forward_description": "The account is from another server. Send a copy of the report there as well?",
++ "forward_to": "Forward to {0}",
++ "generic_error": "An error occurred while processing the request.",
++ "submit": "Submit",
++ "title": "Reporting {0}"
++ },
++ "who_to_follow": {
++ "more": "More",
++ "who_to_follow": "Who to follow"
++ }
++}
+diff --git a/src/i18n/messages.js b/src/i18n/messages.js
+index 3282fd85..b5b9a8cd 100644
+--- a/src/i18n/messages.js
++++ b/src/i18n/messages.js
+@@ -13,6 +13,7 @@ const loaders = {
+ cs: () => import('./cs.json'),
+ de: () => import('./de.json'),
+ eo: () => import('./eo.json'),
++ en_3pp: () => import('./en_3pp.json'),
+ es: () => import('./es.json'),
+ et: () => import('./et.json'),
+ eu: () => import('./eu.json'),
+diff --git a/src/services/locale/locale.service.js b/src/services/locale/locale.service.js
+index 607cd447..ef7d8434 100644
+--- a/src/services/locale/locale.service.js
++++ b/src/services/locale/locale.service.js
+@@ -3,6 +3,7 @@ import ISO6391 from 'iso-639-1'
+ import _ from 'lodash'
+
+ const specialLanguageCodes = {
++ 'en_3pp': 'en',
+ 'ja_easy': 'ja',
+ 'zh_Hant': 'zh-HANT',
+ 'zh': 'zh-Hans'
+@@ -37,6 +38,7 @@ const internalToBackendLocale = code => internalToBrowserLocale(code).replace('_
+
+ const getLanguageName = (code) => {
+ const specialLanguageNames = {
++ 'en_3pp': 'English (3rd Person)',
+ 'ja_easy': 'やさしいにほんご',
+ 'zh': '简体中文',
+ 'zh_Hant': '繁體中文'
diff --git a/flake.nix b/flake.nix
index 8899edc..a5ffb47 100644
--- a/flake.nix
+++ b/flake.nix
@@ -73,6 +73,7 @@
patches = [
./akkoma-fe/0001-confirm-favorite.patch
./akkoma-fe/0002-move-notifications.patch
+ ./akkoma-fe/0003-en_3pp.patch
];
patchFlags = "-p1 -F5";
});