import languagesObject from '../../i18n/messages'
+import localeService from '../../services/locale/locale.service.js'
import ISO6391 from 'iso-639-1'
import _ from 'lodash'
import { library } from '@fortawesome/fontawesome-svg-core'
@@ -42,12 +43,8 @@ library.add(
export default {
computed: {
- languageCodes () {
- return languagesObject.languages
- },
-
- languageNames () {
- return _.map(this.languageCodes, this.getLanguageName)
+ languages () {
+ return _.map(languagesObject.languages, (code) => ({ code: code, name: this.getLanguageName(code) })).sort((a, b) => a.name.localeCompare(b.name))
},
language: {
@@ -61,12 +58,13 @@ export default {
methods: {
getLanguageName (code) {
const specialLanguageNames = {
- 'ja': 'Japanese (日本語)',
- 'ja_easy': 'Japanese (やさしいにほんご)',
- 'zh': 'Simplified Chinese (简体中文)',
- 'zh_Hant': 'Traditional Chinese (繁體中文)'
+ 'ja_easy': 'やさしいにほんご',
+ 'zh': '简体中文',
+ 'zh_Hant': '繁體中文'
}
- return specialLanguageNames[code] || ISO6391.getName(code)
+ const languageName = specialLanguageNames[code] || ISO6391.getNativeName(code)
+ const browserLocale = localeService.internalToBrowserLocale(code)
+ return languageName.charAt(0).toLocaleUpperCase(browserLocale) + languageName.slice(1)
}
}
}
diff --git a/src/components/poll/poll_form.vue b/src/components/poll/poll_form.vue
index 31f204a0..09496105 100644
--- a/src/components/poll/poll_form.vue
+++ b/src/components/poll/poll_form.vue
@@ -21,20 +21,17 @@
@keydown.enter.stop.prevent="nextOption(index)"
>
-
-
-
+
+
-
{{ $t("polls.add_option") }}
-
+
-
+ >
+
+
.emoji-input {
+ & > .emoji-input {
flex: 1 1 auto;
- margin: 0 .2em .5em;
+ margin: 0 0.2em 0.5em;
min-width: 0;
}
- &>.icon-container {
+ .delete-field {
width: 20px;
align-self: center;
- margin: 0 .2em .5em;
+ margin: 0 0.2em 0.5em;
+ padding: 0 0.5em;
}
}
}
diff --git a/src/components/settings_modal/tabs/profile_tab.vue b/src/components/settings_modal/tabs/profile_tab.vue
index b7ef21d7..175a0219 100644
--- a/src/components/settings_modal/tabs/profile_tab.vue
+++ b/src/components/settings_modal/tabs/profile_tab.vue
@@ -124,24 +124,24 @@
:placeholder="$t('settings.profile_fields.value')"
>
-
-
+
-
{{ $t("settings.profile_fields.add_field") }}
-
+
diff --git a/src/components/side_drawer/side_drawer.vue b/src/components/side_drawer/side_drawer.vue
index 695ae03b..223b1632 100644
--- a/src/components/side_drawer/side_drawer.vue
+++ b/src/components/side_drawer/side_drawer.vue
@@ -109,7 +109,7 @@
v-if="chat"
@click="toggleDrawer"
>
-
+
- {{ visibleRole }}
+ {{ $t(`user_card.roles.${visibleRole}`) }}
0 aparecerão como se fossem definidas como 0.",
+ "spread_zero": "Sombras com difusão > 0 aparecerão como se fossem definidas como zero",
"inset_classic": "Sombras de inserção utilizarão {0}"
},
"components": {
@@ -313,7 +399,8 @@
"buttonPressed": "Botão (pressionado)",
"buttonPressedHover": "Botão (pressionado+em cima)",
"input": "Campo de entrada"
- }
+ },
+ "hintV3": "Para as sombras, também pode usar a notação {0} para usar outro espaço de cor."
},
"fonts": {
"_tab_label": "Fontes",
@@ -336,30 +423,143 @@
"button": "Botão",
"text": "Vários {0} e {1}",
"mono": "conteúdo",
- "input": "Acabei de chegar no Rio!",
+ "input": "Acabei de chegar a Lisboa.",
"faint_link": "manual útil",
"fine_print": "Leia nosso {0} para não aprender nada!",
- "header_faint": "Está ok!",
+ "header_faint": "Isto está bem",
"checkbox": "Li os termos e condições",
"link": "um belo link"
}
- }
+ },
+ "mfa": {
+ "scan": {
+ "secret_code": "Chave",
+ "title": "Scan",
+ "desc": "Utilizando a sua aplicação de dois fatores, faça scan deste código QR ou insira a chave de texto:"
+ },
+ "authentication_methods": "Métodos de autenticação",
+ "recovery_codes": "Códigos de recuperação.",
+ "generate_new_recovery_codes": "Gerar novos códigos de recuperação",
+ "confirm_and_enable": "Confirmar e ativar a palavra-passe de utilização única",
+ "otp": "Palavra-passe de utilização única",
+ "verify": {
+ "desc": "Para ativar a autenticação de dois fatores, introduza o código da sua aplicação de dois fatores:"
+ },
+ "recovery_codes_warning": "Anote os códigos ou armazene-os num lugar seguro - caso contrário, não os voltará a ver. Se perder acesso à sua aplicação de dois fatores e aos códigos de recuperação, a sua conta ficará bloqueada.",
+ "waiting_a_recovery_codes": "A receber códigos de recuperação…",
+ "warning_of_generate_new_codes": "Quando gera novos códigos de recuperação, os antigos deixam de funcionar.",
+ "title": "Autenticação de Dois Fatores",
+ "wait_pre_setup_otp": "pré-configuração de palavra-passe de utilização única",
+ "setup_otp": "Configurar palavra-passe de utilização única"
+ },
+ "security": "Segurança",
+ "mute_import_error": "Erro ao importar os silenciados",
+ "mute_import": "Importar silenciados",
+ "mute_export_button": "Exporta os silenciados para um ficheiro csv",
+ "mute_export": "Exportar silenciados",
+ "blocks_imported": "Lista de utilizadores bloqueados importada! O processo pode demorar alguns instantes.",
+ "block_import_error": "Erro ao importar a lista de utilizadores bloqueados",
+ "block_import": "Importar utilizadores bloqueados",
+ "block_export_button": "Exporta a tua lista de utilizadores bloqueados para um ficheiro csv",
+ "block_export": "Exportar utilizadores bloqueados",
+ "enter_current_password_to_confirm": "Introduza a sua palavra-passe atual para confirmar a sua identidade",
+ "mutes_and_blocks": "Silenciados e Bloqueados",
+ "chatMessageRadius": "Mensagem de texto",
+ "changed_email": "Endereço de e-mail modificado com sucesso!",
+ "change_email_error": "Ocorreu um erro ao modificar o seu endereço de e-mail.",
+ "change_email": "Mudar Endereço de E-mail",
+ "bot": "Esta uma conta robô",
+ "import_mutes_from_a_csv_file": "Importar silenciados de um ficheiro csv",
+ "mutes_imported": "Silenciados importados! Processá-los pode demorar alguns instantes.",
+ "allow_following_move": "Permitir seguimento automático quando a conta for migrada para outra instância",
+ "domain_mutes": "Domínios",
+ "discoverable": "Permitir a descoberta desta conta em resultados de busca e outros serviços",
+ "emoji_reactions_on_timeline": "Mostrar reações de emoji na timeline",
+ "hide_muted_posts": "Esconder posts de utilizadores silenciados",
+ "hide_follows_count_description": "Não mostrar o número de contas seguidas",
+ "hide_followers_count_description": "Não mostrar o número de seguidores",
+ "notification_visibility_emoji_reactions": "Reações",
+ "new_email": "Novo endereço de e-mail",
+ "profile_fields": {
+ "value": "Conteúdo",
+ "add_field": "Adicionar campo",
+ "label": "Metadados do perfil",
+ "name": "Etiqueta"
+ },
+ "import_blocks_from_a_csv_file": "Importar bloqueados a partir de um arquivo CSV",
+ "hide_wallpaper": "Esconder papel de parede da instância",
+ "notification_setting_privacy": "Privacidade",
+ "notification_setting_filters": "Filtros",
+ "fun": "Divertido",
+ "user_mutes": "Utilizadores",
+ "type_domains_to_mute": "Pesquisar domínios para silenciar",
+ "useStreamingApiWarning": "(não recomendado, experimental, pode omitir publicações)",
+ "useStreamingApi": "Receber publicações e notificações em tempo real",
+ "minimal_scopes_mode": "Minimizar as opções de publicação",
+ "search_user_to_mute": "Pesquisar utilizadores que pretende silenciar",
+ "search_user_to_block": "Pesquisa quais utilizadores desejas bloquear",
+ "notification_setting_hide_notification_contents": "Ocultar o remetente e o conteúdo das notificações push",
+ "version": {
+ "frontend_version": "Versão do Frontend",
+ "backend_version": "Versão do Backend",
+ "title": "Versão"
+ },
+ "notification_blocks": "Bloquear um utilizador previne todas as notificações, bem como as desativa.",
+ "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",
+ "greentext": "Texto verde (meme arrows)",
+ "virtual_scrolling": "Otimizar a apresentação da cronologia",
+ "reset_background_confirm": "Tens a certeza que desejas redefinir o fundo?",
+ "reset_banner_confirm": "Tens a certeza que desejas redefinir a imagem do cabeçalho?",
+ "reset_avatar_confirm": "Tens a certeza que desejas redefinir o avatar?",
+ "reset_profile_banner": "Redefinir imagem do cabeçalho do perfil",
+ "reset_profile_background": "Redefinir fundo de perfil",
+ "reset_avatar": "Redefinir avatar",
+ "autohide_floating_post_button": "Automaticamente ocultar o botão 'Nova Publicação' (telemóvel)",
+ "notification_visibility_moves": "Utilizador Migrado",
+ "accent": "Destaque",
+ "pad_emoji": "Preencher espaços ao adicionar emojis do seletor"
},
"timeline": {
"collapse": "Esconder",
"conversation": "Conversa",
"error_fetching": "Erro ao buscar atualizações",
"load_older": "Carregar postagens antigas",
- "no_retweet_hint": "Posts apenas para seguidores ou diretos não podem ser repetidos",
- "repeated": "Repetido",
+ "no_retweet_hint": "Posts apenas para seguidores ou diretos não podem ser partilhados",
+ "repeated": "partilhado",
"show_new": "Mostrar novas",
"up_to_date": "Atualizado",
"no_more_statuses": "Sem mais posts",
- "no_statuses": "Sem posts"
+ "no_statuses": "Sem posts",
+ "reload": "Recarregar",
+ "error": "Erro a obter a cronologia: {0}"
},
"status": {
"reply_to": "Responder a",
- "replies_list": "Respostas:"
+ "replies_list": "Respostas:",
+ "unbookmark": "Remover post dos Items Guardados",
+ "expand": "Expandir",
+ "nsfw": "NSFW (Não apropriado para trabalho)",
+ "status_deleted": "Esta publicação foi apagada",
+ "hide_content": "Ocultar o conteúdo",
+ "show_content": "Mostrar o conteúdo",
+ "hide_full_subject": "Ocultar o assunto completo",
+ "show_full_subject": "Mostrar o assunto completo",
+ "thread_muted_and_words": ", contém:",
+ "thread_muted": "Conversação silenciada",
+ "external_source": "Fonte externa",
+ "copy_link": "Copiar o link do post",
+ "status_unavailable": "Publicação indisponível",
+ "unmute_conversation": "Mostrar a conversação",
+ "mute_conversation": "Silenciar a conversação",
+ "delete_confirm": "Tens a certeza que desejas apagar a publicação?",
+ "bookmark": "Guardar",
+ "pin": "Fixar no perfil",
+ "pinned": "Afixado",
+ "unpin": "Desafixar do perfil",
+ "delete": "Eliminar publicação",
+ "repeats": "Partilhados",
+ "favorites": "Favoritos"
},
"user_card": {
"approve": "Aprovar",
@@ -377,21 +577,52 @@
"following": "Seguindo!",
"follows_you": "Segue você!",
"its_you": "É você!",
- "media": "Mídia",
+ "media": "Multimédia",
"mute": "Silenciar",
"muted": "Silenciado",
"per_day": "por dia",
"remote_follow": "Seguir remotamente",
"statuses": "Postagens",
"unblock": "Desbloquear",
- "unblock_progress": "Desbloqueando...",
- "block_progress": "Bloqueando...",
+ "unblock_progress": "A desbloquear…",
+ "block_progress": "A bloquear…",
"unmute": "Retirar silêncio",
- "unmute_progress": "Retirando silêncio...",
- "mute_progress": "Silenciando..."
+ "unmute_progress": "A retirar silêncio…",
+ "mute_progress": "A silenciar…",
+ "admin_menu": {
+ "delete_user_confirmation": "Tens a certeza? Esta ação não pode ser revertida.",
+ "delete_user": "Eliminar utilizador",
+ "quarantine": "Não permitir publicações de utilizadores de instâncias remotas",
+ "disable_any_subscription": "Não permitir que nenhum utilizador te siga",
+ "disable_remote_subscription": "Não permitir seguidores de instâncias remotas",
+ "sandbox": "Forçar publicações apenas para seguidores",
+ "force_unlisted": "Forçar publicações como não listadas",
+ "strip_media": "Eliminar ficheiros multimédia das publicações",
+ "force_nsfw": "Marcar todas as publicações como NSFW (não apropriado para o trabalho)",
+ "delete_account": "Eliminar Conta",
+ "deactivate_account": "Desativar conta",
+ "activate_account": "Ativar conta",
+ "revoke_moderator": "Revogar permissões de Moderador",
+ "grant_moderator": "Conceder permissões de Moderador",
+ "revoke_admin": "Revogar permissões de Admin",
+ "grant_admin": "Conceder permissões de Admin",
+ "moderation": "Moderação"
+ },
+ "show_repeats": "Mostrar partilhas",
+ "hide_repeats": "Ocultar partilhas",
+ "unsubscribe": "Retirar subscrição",
+ "subscribe": "Subscrever",
+ "report": "Denunciar",
+ "message": "Mensagem",
+ "mention": "Mencionar",
+ "hidden": "Ocultar",
+ "roles": {
+ "moderator": "Moderador",
+ "admin": "Admin"
+ }
},
"user_profile": {
- "timeline_title": "Linha do tempo do usuário",
+ "timeline_title": "Cronologia do Utilizador",
"profile_does_not_exist": "Desculpe, este perfil não existe.",
"profile_loading_error": "Desculpe, houve um erro ao carregar este perfil."
},
@@ -400,17 +631,22 @@
"who_to_follow": "Quem seguir"
},
"tool_tip": {
- "media_upload": "Envio de mídia",
- "repeat": "Repetir",
+ "media_upload": "Envio de multimédia",
+ "repeat": "Partilhar",
"reply": "Responder",
"favorite": "Favoritar",
- "user_settings": "Configurações do usuário"
+ "user_settings": "Configurações do usuário",
+ "bookmark": "Guardar",
+ "reject_follow_request": "Rejeitar o pedido de seguimento",
+ "accept_follow_request": "Aceitar o pedido de seguimento",
+ "add_reaction": "Adicionar Reação"
},
- "upload":{
+ "upload": {
"error": {
"base": "Falha no envio.",
"file_too_big": "Arquivo grande demais [{filesize}{filesizeunit} / {allowedsize}{allowedsizeunit}]",
- "default": "Tente novamente mais tarde"
+ "default": "Tente novamente mais tarde",
+ "message": "Falha ao enviar: {0}"
},
"file_size_units": {
"B": "B",
@@ -419,5 +655,179 @@
"GiB": "GiB",
"TiB": "TiB"
}
+ },
+ "about": {
+ "mrf": {
+ "simple": {
+ "quarantine": "Quarentena",
+ "reject": "Rejeitar",
+ "accept": "Aceitar",
+ "media_removal_desc": "Este domínio remove multimédia das publicações dos seguintes domínios:",
+ "media_removal": "Remoção de multimédia",
+ "ftl_removal_desc": "Este domínio remove os seguintes domínios da cronologia \"Rede conhecida por todos\":",
+ "quarantine_desc": "Este domínio apenas irá publicar nos seguintes domínios:",
+ "reject_desc": "Este domínio não aceitará mensagens dos seguintes domínios:",
+ "accept_desc": "Este domínio aceita apenas mensagens dos seguintes domínios:",
+ "simple_policies": "Políticas especificas do domínio",
+ "media_nsfw": "Forçar definição de multimédia como Sensível",
+ "ftl_removal": "Remoção da cronologia da \"Rede conhecida por todos\"",
+ "media_nsfw_desc": "Este domínio força a multimédia a ser marcada como sensível nos seguintes domínios:"
+ },
+ "keyword": {
+ "replace": "Substituir",
+ "reject": "Rejeitar",
+ "is_replaced_by": "→",
+ "keyword_policies": "Política de Palavras-Chave",
+ "ftl_removal": "Remoção da cronologia da \"Rede conhecida por todos\""
+ },
+ "federation": "Federação",
+ "mrf_policies": "Ativar Políticas MRF",
+ "mrf_policies_desc": "Políticas MRF manipulam o comportamento da federação nos domínios. As seguintes políticas estão ativadas:"
+ },
+ "staff": "Staff"
+ },
+ "remote_user_resolver": {
+ "searching_for": "A pesquisar por",
+ "error": "Não encontrado.",
+ "remote_user_resolver": "Resolução de utilizador remoto"
+ },
+ "emoji": {
+ "unicode": "Emoji Unicode",
+ "custom": "Emoji customizado",
+ "add_emoji": "Inserir emoji",
+ "search_emoji": "Pesquisar por um emoji",
+ "emoji": "Emoji",
+ "load_all": "A carregar todos os {emojiAmount} emojis",
+ "load_all_hint": "Carregado o primeiro emoji {saneAmount}, carregar todos os emojis pode causar problemas de desempenho.",
+ "keep_open": "Manter o seletor aberto",
+ "stickers": "Autocolantes"
+ },
+ "polls": {
+ "single_choice": "Escolha única",
+ "vote": "Vota",
+ "votes": "votos",
+ "option": "Opção",
+ "add_option": "Adicionar Opção",
+ "not_enough_options": "Demasiado poucas opções únicas na sondagem",
+ "expired": "A sondagem terminou há {0}",
+ "expires_in": "A sondagem termina em {0}",
+ "expiry": "Tempo para finalizar sondagem",
+ "multiple_choices": "Escolha múltipla",
+ "type": "Tipo de sondagem",
+ "add_poll": "Adicionar Sondagem"
+ },
+ "importer": {
+ "error": "Ocorreu um erro ao importar este ficheiro.",
+ "success": "Importado com sucesso.",
+ "submit": "Enviar"
+ },
+ "exporter": {
+ "processing": "A processar, brevemente ser-te-á pedido que descarregues o ficheiro",
+ "export": "Exportar"
+ },
+ "domain_mute_card": {
+ "mute_progress": "A silenciar…",
+ "mute": "Silenciar",
+ "unmute": "Remover silêncio",
+ "unmute_progress": "A remover o silêncio…"
+ },
+ "selectable_list": {
+ "select_all": "Seleccionar tudo"
+ },
+ "interactions": {
+ "load_older": "Carregar interações mais antigas",
+ "follows": "Novos seguidores",
+ "favs_repeats": "Gostos e Partilhas",
+ "moves": "O utilizador migra"
+ },
+ "errors": {
+ "storage_unavailable": "O Pleroma não conseguiu aceder ao armazenamento do navegador. A sua sessão ou definições locais não serão armazenadas e poderá encontrar problemas inesperados. Tente ativar as cookies."
+ },
+ "shoutbox": {
+ "title": "Chat Geral"
+ },
+ "chats": {
+ "chats": "Chats",
+ "empty_chat_list_placeholder": "Não tens conversações ainda. Inicia uma nova conversa!",
+ "error_sending_message": "Ocorreu algo de errado ao enviar a mensagem.",
+ "error_loading_chat": "Ocorreu algo de errado ao carregar o chat.",
+ "delete_confirm": "Desejas realmente apagar esta mensagem?",
+ "more": "Mais",
+ "empty_message_error": "Não podes publicar uma mensagem vazia",
+ "new": "Nova conversação",
+ "delete": "Apagar",
+ "message_user": "Mensagem de {nickname}",
+ "you": "Tu:"
+ },
+ "search": {
+ "hashtags": "Hashtags",
+ "no_results": "Sem resultados",
+ "person_talking": "{count} pessoa a falar",
+ "people_talking": "{0} pessoas a falar",
+ "people": "Pessoas"
+ },
+ "display_date": {
+ "today": "Hoje"
+ },
+ "file_type": {
+ "file": "Ficheiro",
+ "image": "Imagem",
+ "video": "Vídeo",
+ "audio": "Áudio"
+ },
+ "password_reset": {
+ "password_reset_required_but_mailer_is_disabled": "Deves repor a tua palavra-passe, porém, a reposição de palavra-passe está desativada. Contacta o administrador da tua instância.",
+ "password_reset_required": "Deves repor a tua palavra-passe para iniciar sessão.",
+ "password_reset_disabled": "A reposição da palavra-passe foi desativada. Contacta o administrador da tua instância.",
+ "too_many_requests": "Alcançaste o limite de tentativas, tenta novamente mais tarde.",
+ "return_home": "Voltar à página principal",
+ "check_email": "Verifica o teu endereço de e-mail para obter um link para repor a tua palavra-passe.",
+ "placeholder": "O teu endereço de e-mail ou nome de utilizador",
+ "instruction": "Introduz o teu endereço de e-mail ou nome de utilizador. Enviaremos um link para repores a tua palavra-passe.",
+ "password_reset": "Repor palavra-passe",
+ "forgot_password": "Esqueceu-se da palavra-passe?"
+ },
+ "user_reporting": {
+ "generic_error": "Ocorreu um erro ao processar o teu pedido.",
+ "submit": "Enviar",
+ "forward_to": "Encaminhar para {0}",
+ "forward_description": "A conta é de outro servidor. Enviar também uma cópia da denúncia à outra instância?",
+ "additional_comments": "Comentários adicionais",
+ "add_comment_description": "Esta denúncia será enviada aos moderadores desta instância. Podes fornecer uma explicação pela qual te encontras a denunciar esta conta abaixo:",
+ "title": "Denunciar {0}"
+ },
+ "time": {
+ "years_short": "{0}a",
+ "year_short": "{0}a",
+ "years": "{0} anos",
+ "year": "{0} ano",
+ "weeks_short": "{0}sem",
+ "week_short": "{0}sem",
+ "weeks": "{0} semanas",
+ "week": "{0} semana",
+ "seconds_short": "{0}s",
+ "second_short": "{0}s",
+ "seconds": "{0} segundos",
+ "second": "{0} segundo",
+ "now": "agora mesmo",
+ "now_short": "agora",
+ "months_short": "{0}m",
+ "month_short": "{0}m",
+ "months": "{0} meses",
+ "month": "{0} mês",
+ "minutes_short": "{0}min",
+ "minute_short": "{0}min",
+ "minutes": "{0} minutos",
+ "minute": "{0} minuto",
+ "in_past": "há {0}",
+ "in_future": "em {0}",
+ "hours_short": "{0}h",
+ "hour_short": "{0}h",
+ "hours": "{0} horas",
+ "hour": "{0} hora",
+ "days_short": "{0}d",
+ "day_short": "{0}d",
+ "days": "{0} dias",
+ "day": "{0} dia"
}
}
diff --git a/src/i18n/ru.json b/src/i18n/ru.json
index e063f09f..30a65741 100644
--- a/src/i18n/ru.json
+++ b/src/i18n/ru.json
@@ -183,14 +183,14 @@
"change_password": "Сменить пароль",
"change_password_error": "Произошла ошибка при попытке изменить пароль.",
"changed_password": "Пароль изменён успешно!",
- "collapse_subject": "Сворачивать посты с темой",
+ "collapse_subject": "Сворачивать статусы с темой",
"confirm_new_password": "Подтверждение нового пароля",
"current_avatar": "Текущий аватар",
"current_password": "Текущий пароль",
"current_profile_banner": "Текущий баннер профиля",
"data_import_export_tab": "Импорт / Экспорт данных",
"delete_account": "Удалить аккаунт",
- "delete_account_description": "Удалить ваш аккаунт и все ваши сообщения.",
+ "delete_account_description": "Удалить вашу учётную запись и все ваши сообщения.",
"delete_account_error": "Возникла ошибка в процессе удаления вашего аккаунта. Если это повторяется, свяжитесь с администратором вашего сервера.",
"delete_account_instructions": "Введите ваш пароль в поле ниже для подтверждения удаления.",
"export_theme": "Сохранить Тему",
@@ -238,7 +238,7 @@
"hide_followers_count_description": "Не показывать число моих подписчиков",
"show_admin_badge": "Показывать значок администратора в моем профиле",
"show_moderator_badge": "Показывать значок модератора в моем профиле",
- "nsfw_clickthrough": "Включить скрытие NSFW вложений и не показывать изображения в предпросмотре ссылок для NSFW статусов",
+ "nsfw_clickthrough": "Включить скрытие вложений и предпросмотра ссылок для NSFW статусов",
"oauth_tokens": "OAuth токены",
"token": "Токен",
"refresh_token": "Рефреш токен",
@@ -295,7 +295,14 @@
"use_source": "Новая версия",
"use_snapshot": "Старая версия",
"keep_as_is": "Оставить, как есть",
- "load_theme": "Загрузить тему"
+ "load_theme": "Загрузить тему",
+ "help": {
+ "fe_upgraded": "Движок тем для фронт-энда Pleroma был изменен после обновления.",
+ "older_version_imported": "Файл, который вы импортировали, был сделан в старой версии фронт-энда.",
+ "future_version_imported": "Файл, который вы импортировали, был сделан в новой версии фронт-энда.",
+ "v2_imported": "Файл, который вы импортировали, был сделан под старый фронт-энд. Мы стараемся улучшить совместимость, но все еще возможны несостыковки.",
+ "upgraded_from_v2": "Фронт-энд Pleroma был изменен. Выбранная тема может выглядеть слегка по-другому."
+ }
},
"common": {
"color": "Цвет",
@@ -330,7 +337,9 @@
"borders": "Границы",
"buttons": "Кнопки",
"inputs": "Поля ввода",
- "faint_text": "Маловажный текст"
+ "faint_text": "Маловажный текст",
+ "post": "Сообщения и описание пользователя",
+ "alert_neutral": "Нейтральный"
},
"radii": {
"_tab_label": "Скругление"
@@ -451,7 +460,19 @@
"virtual_scrolling": "Оптимизировать рендеринг ленты",
"hide_wallpaper": "Скрыть обои узла",
"accent": "Акцент",
- "upload_a_photo": "Загрузить фото"
+ "upload_a_photo": "Загрузить фото",
+ "notification_mutes": "Чтобы не получать уведомления от определённого пользователя, заглушите его.",
+ "reset_avatar_confirm": "Вы действительно хотите сбросить личный образ?",
+ "reset_profile_banner": "Сбросить личный баннер",
+ "reset_profile_background": "Сбросить личные обои",
+ "reset_avatar": "Сбросить личный образ",
+ "search_user_to_mute": "Искать, кого вы хотите заглушить",
+ "search_user_to_block": "Искать, кого вы хотите заблокировать",
+ "pad_emoji": "Выделять эмодзи пробелами при добавлении из панели",
+ "avatar_size_instruction": "Желательный наименьший размер личного образа 150 на 150 пикселей.",
+ "enable_web_push_notifications": "Включить web push-уведомления",
+ "notification_blocks": "Блокировка пользователя выключает все уведомления от него, а также отписывает вас от него.",
+ "notification_setting_hide_notification_contents": "Скрыть отправителя и содержимое push-уведомлений"
},
"timeline": {
"collapse": "Свернуть",
@@ -465,7 +486,7 @@
"error": "Ошибка при обновлении ленты: {0}"
},
"status": {
- "bookmark": "В закладки",
+ "bookmark": "Добавить в закладки",
"unbookmark": "Удалить из закладок",
"status_deleted": "Пост удален",
"reply_to": "Ответ",
@@ -473,7 +494,11 @@
"favorites": "Понравилось",
"unmute_conversation": "Прекратить игнорировать разговор",
"mute_conversation": "Игнорировать разговор",
- "thread_muted": "Разговор игнорируется"
+ "thread_muted": "Разговор игнорируется",
+ "external_source": "Перейти к источнику",
+ "delete_confirm": "Вы действительно хотите удалить данный статус?",
+ "delete": "Удалить",
+ "copy_link": "Скопировать ссылку"
},
"user_card": {
"block": "Заблокировать",
@@ -515,7 +540,12 @@
"media": "С вложениями",
"mention": "Упомянуть",
"show_repeats": "Показывать повторы",
- "hide_repeats": "Скрыть повторы"
+ "hide_repeats": "Скрыть повторы",
+ "report": "Пожаловаться",
+ "roles": {
+ "moderator": "Модератор",
+ "admin": "Администратор"
+ }
},
"user_profile": {
"timeline_title": "Лента пользователя"
@@ -584,7 +614,8 @@
"title": "Особенности",
"gopher": "Gopher",
"who_to_follow": "Предложения кого читать",
- "pleroma_chat_messages": "Pleroma Чат"
+ "pleroma_chat_messages": "Pleroma Чат",
+ "upload_limit": "Наибольший размер загружаемого файла"
},
"tool_tip": {
"accept_follow_request": "Принять запрос на чтение",
@@ -673,6 +704,7 @@
"you": "Вы:"
},
"remote_user_resolver": {
- "error": "Не найдено."
+ "error": "Не найдено.",
+ "searching_for": "Ищем"
}
}
diff --git a/src/i18n/uk.json b/src/i18n/uk.json
index 4ead8790..040d6f4f 100644
--- a/src/i18n/uk.json
+++ b/src/i18n/uk.json
@@ -25,11 +25,11 @@
},
"features_panel": {
"gopher": "Gopher",
- "pleroma_chat_messages": "Локальні балачки",
+ "pleroma_chat_messages": "Чати",
"chat": "Міні-чат",
"who_to_follow": "Кого відстежувати",
"title": "Особливості",
- "scope_options": "Параметри осягу",
+ "scope_options": "Параметри обсягу",
"media_proxy": "Посередник медіа-даних",
"text_limit": "Ліміт символів",
"upload_limit": "Обмеження завантажень"
@@ -39,9 +39,9 @@
"export": "Експорт"
},
"domain_mute_card": {
- "unmute_progress": "Вимикаю…",
+ "unmute_progress": "Вмикаю…",
"unmute": "Вимкнути заглушення",
- "mute_progress": "Вмикаю…",
+ "mute_progress": "Вимикаю…",
"mute": "Ігнорувати"
},
"shoutbox": {
@@ -51,13 +51,13 @@
"staff": "Адміністрація",
"mrf": {
"simple": {
- "media_nsfw_desc": "Даний інстанс примусово позначає медіа в наступних інстансах як NSFW:",
+ "media_nsfw_desc": "Даний інстанс примусово позначає медіа в наступних інстансах як дратівливий:",
"media_nsfw": "Примусове визначення медіа як дратівливого",
"media_removal_desc": "Поточний інстанс видаляє медіа з дописів на перелічених інстансах:",
"media_removal": "Видалення медіа",
- "ftl_removal_desc": "Цей інстанс видаляє перелічені інстанси з \"Усієї відомої мережі\":",
- "ftl_removal": "Видалення з \"Усієї відомої мережі\"",
- "quarantine_desc": "Поточний інстанс буде надсилати тільки публічні дописи наступним інстансам:",
+ "ftl_removal_desc": "Цей інстанс видаляє перелічені інстанси з Федеративної стрічки:",
+ "ftl_removal": "Видалення зі стрічки Федеративної мережі",
+ "quarantine_desc": "Поточний інстанс надсилатиме тільки публічні дописи наступним інстансам:",
"quarantine": "Карантин",
"reject_desc": "Поточний інстанс не прийматиме повідомлення з перелічених інстансів:",
"accept": "Прийняти",
@@ -66,7 +66,7 @@
"simple_policies": "Правила поточного інстансу"
},
"mrf_policies_desc": "Правила MRF розповсюджуються на даний інстанс. Наступні правила активні:",
- "mrf_policies": "Активні правила MRF (модуль переписування повідомлень)",
+ "mrf_policies": "Активувати правила MRF (модуль переписування повідомлень)",
"keyword": {
"is_replaced_by": "→",
"replace": "Замінити",
@@ -135,7 +135,7 @@
"error": "Помилка при оновленні сповіщень: {0}"
},
"nav": {
- "chats": "Локальні балачки",
+ "chats": "Чати",
"timelines": "Стрічки",
"twkn": "Уся відома мережа",
"about": "Інформація",
@@ -546,7 +546,8 @@
"disabled": "Вимкнено",
"selectedMenu": "Вибраний пункт меню",
"tabs": "Вкладки",
- "pressed": "Натиснуто"
+ "pressed": "Натиснуто",
+ "wallpaper": "Шпалери"
},
"common_colors": {
"rgbo": "Піктограми, акценти, значки",
@@ -602,7 +603,8 @@
"frontend_version": "Версія фронтенду",
"backend_version": "Версія бекенду",
"title": "Версія"
- }
+ },
+ "hide_wallpaper": "Сховати шпалери екземпляру"
},
"selectable_list": {
"select_all": "Вибрати все"
@@ -758,7 +760,11 @@
"unblock": "Розблокувати",
"remote_follow": "Підписатись",
"muted": "Заглушений",
- "mute": "Заглушити"
+ "mute": "Заглушити",
+ "roles": {
+ "moderator": "Модератор",
+ "admin": "Адміністратор"
+ }
},
"status": {
"copy_link": "Скопіювати посилання на допис",
diff --git a/src/i18n/zh_Hant.json b/src/i18n/zh_Hant.json
index f63acab8..a8d0dc3c 100644
--- a/src/i18n/zh_Hant.json
+++ b/src/i18n/zh_Hant.json
@@ -526,7 +526,8 @@
"mute_import": "靜音導入",
"mute_import_error": "導入靜音時出錯",
"mute_export_button": "將靜音導出到csv文件",
- "mute_export": "靜音導出"
+ "mute_export": "靜音導出",
+ "hide_wallpaper": "隱藏實例桌布"
},
"chats": {
"more": "更多",
diff --git a/src/services/entity_normalizer/entity_normalizer.service.js b/src/services/entity_normalizer/entity_normalizer.service.js
index 53a3562a..00021ce0 100644
--- a/src/services/entity_normalizer/entity_normalizer.service.js
+++ b/src/services/entity_normalizer/entity_normalizer.service.js
@@ -188,7 +188,12 @@ export const parseUser = (data) => {
output.follow_request_count = data.pleroma.follow_request_count
output.tags = data.pleroma.tags
- output.deactivated = data.pleroma.deactivated
+
+ // deactivated was changed to is_active in Pleroma 2.3.0
+ // so check if is_active is present
+ output.deactivated = typeof data.pleroma.is_active !== 'undefined'
+ ? !data.pleroma.is_active // new backend
+ : data.pleroma.deactivated // old backend
output.notification_settings = data.pleroma.notification_settings
output.unread_chat_count = data.pleroma.unread_chat_count
diff --git a/src/services/locale/locale.service.js b/src/services/locale/locale.service.js
new file mode 100644
index 00000000..5be99d81
--- /dev/null
+++ b/src/services/locale/locale.service.js
@@ -0,0 +1,12 @@
+const specialLanguageCodes = {
+ 'ja_easy': 'ja',
+ 'zh_Hant': 'zh-HANT'
+}
+
+const internalToBrowserLocale = code => specialLanguageCodes[code] || code
+
+const localeService = {
+ internalToBrowserLocale
+}
+
+export default localeService
diff --git a/src/services/style_setter/style_setter.js b/src/services/style_setter/style_setter.js
index 07425abd..0fb8f92a 100644
--- a/src/services/style_setter/style_setter.js
+++ b/src/services/style_setter/style_setter.js
@@ -242,9 +242,18 @@ export const generateShadows = (input, colors) => {
panelHeader: 'panel',
input: 'input'
}
- const inputShadows = input.shadows && !input.themeEngineVersion
- ? shadows2to3(input.shadows, input.opacity)
- : input.shadows || {}
+
+ const cleanInputShadows = Object.fromEntries(
+ Object.entries(input.shadows)
+ .map(([name, shadowSlot]) => [
+ name,
+ // defaulting color to black to avoid potential problems
+ shadowSlot.map(shadowDef => ({ color: '#000000', ...shadowDef }))
+ ])
+ )
+ const inputShadows = cleanInputShadows && !input.themeEngineVersion
+ ? shadows2to3(cleanInputShadows, input.opacity)
+ : cleanInputShadows || {}
const shadows = Object.entries({
...DEFAULT_SHADOWS,
...inputShadows