diff --git a/CHANGELOG.md b/CHANGELOG.md index 7164eb2656..588348a0fe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,8 +3,13 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - ## [Unreleased] +### Fixed +- Button to remove uploaded media in post status form is now properly placed and sized. +- Fixed shoutbox not working in mobile layout + + +## [2.2.3] - 2021-01-18 ### Added - Added Report button to status ellipsis menu for easier reporting @@ -12,6 +17,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Follows/Followers tabs on user profiles now display the content properly. - Handle punycode in screen names +### Changed +- Don't filter own posts when they hit your wordfilter +- Language picker now uses native language names + + ## [2.2.2] - 2020-12-22 ### Added - Mouseover titles for emojis in reaction picker diff --git a/src/App.scss b/src/App.scss index 2a1d7b1bc2..8b91f3dea1 100644 --- a/src/App.scss +++ b/src/App.scss @@ -178,6 +178,13 @@ a { &.-fullwidth { width: 100%; } + + &.-hover-highlight { + &:hover svg { + color: $fallback--lightText; + color: var(--lightText, $fallback--lightText); + } + } } input, textarea, .select, .input { diff --git a/src/components/interface_language_switcher/interface_language_switcher.vue b/src/components/interface_language_switcher/interface_language_switcher.vue index 524ec5e955..dc3bd4088c 100644 --- a/src/components/interface_language_switcher/interface_language_switcher.vue +++ b/src/components/interface_language_switcher/interface_language_switcher.vue @@ -12,11 +12,11 @@ v-model="language" > 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 31f204a00c..094961052a 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 b7ef21d77a..175a0219b2 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 695ae03b0a..223b163214 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 e063f09f10..30a657414d 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 4ead8790ca..040d6f4f76 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 f63acab832..a8d0dc3c90 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 53a3562a23..00021ce0c9 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 0000000000..5be99d81f4 --- /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 07425abd8f..0fb8f92aaf 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