From b7f6ddeaf12215d4f2fd131c7c2b9270c24230d7 Mon Sep 17 00:00:00 2001 From: "Renato \"Lond\" Cerqueira" Date: Mon, 22 Jan 2018 14:20:58 +0100 Subject: Weblate translations (#6323) * Translated using Weblate (Galician) Currently translated at 100.0% (56 of 56 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/gl/ * Translated using Weblate (Dutch) Currently translated at 100.0% (543 of 543 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/nl/ * Translated using Weblate (Galician) Currently translated at 100.0% (62 of 62 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/gl/ * Translated using Weblate (Galician) Currently translated at 100.0% (543 of 543 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/gl/ * Translated using Weblate (Galician) Currently translated at 100.0% (260 of 260 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/gl/ * Translated using Weblate (Galician) Currently translated at 100.0% (260 of 260 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/gl/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 100.0% (62 of 62 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/pt_BR/ * Translated using Weblate (Catalan) Currently translated at 95.2% (517 of 543 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ca/ * Translated using Weblate (Catalan) Currently translated at 99.6% (259 of 260 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ca/ * Translated using Weblate (Dutch) Currently translated at 97.1% (543 of 559 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/nl/ * Translated using Weblate (Galician) Currently translated at 100.0% (559 of 559 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/gl/ * Translated using Weblate (Japanese) Currently translated at 99.1% (554 of 559 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ja/ * Translated using Weblate (French) Currently translated at 100.0% (260 of 260 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fr/ * Translated using Weblate (French) Currently translated at 100.0% (260 of 260 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fr/ * Translated using Weblate (French) Currently translated at 100.0% (260 of 260 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fr/ * Translated using Weblate (Portuguese (Brazil)) Currently translated at 99.8% (558 of 559 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/pt_BR/ * Translated using Weblate (Polish) Currently translated at 99.8% (558 of 559 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/pl/ * Translated using Weblate (Catalan) Currently translated at 94.6% (529 of 559 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ca/ * Translated using Weblate (Catalan) Currently translated at 95.3% (533 of 559 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ca/ * Translated using Weblate (Dutch) Currently translated at 98.2% (55 of 56 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/nl/ * Translated using Weblate (Dutch) Currently translated at 100.0% (260 of 260 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/nl/ * Translated using Weblate (Dutch) Currently translated at 98.3% (550 of 559 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/nl/ * Translated using Weblate (Catalan) Currently translated at 95.3% (533 of 559 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ca/ * Translated using Weblate (Japanese) Currently translated at 0.0% (0 of 56 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ja/ * Translated using Weblate (Japanese) Currently translated at 1.7% (1 of 56 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ja/ * Translated using Weblate (Japanese) Currently translated at 100.0% (260 of 260 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ja/ * Translated using Weblate (Japanese) Currently translated at 1.7% (52 of 56 strings) Translation: Mastodon/Preferences Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/simple_form/ja/ * Translated using Weblate (Japanese) Currently translated at 99.8% (558 of 559 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ja/ * Translated using Weblate (Japanese) Currently translated at 99.8% (558 of 559 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ja/ * Translated using Weblate (Galician) Currently translated at 100.0% (261 of 261 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/gl/ * Translated using Weblate (Galician) Currently translated at 100.0% (261 of 261 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/gl/ * Translated using Weblate (Polish) Currently translated at 100.0% (261 of 261 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/pl/ * Translated using Weblate (Catalan) Currently translated at 99.6% (260 of 261 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ca/ * Translated using Weblate (Japanese) Currently translated at 99.6% (260 of 261 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ja/ * Translated using Weblate (Japanese) Currently translated at 99.8% (558 of 559 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/ja/ * Translated using Weblate (Japanese) Currently translated at 99.6% (260 of 261 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/ja/ * Translated using Weblate (French) Currently translated at 100.0% (62 of 62 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/fr/ * Translated using Weblate (French) Currently translated at 100.0% (62 of 62 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/fr/ * Translated using Weblate (French) Currently translated at 100.0% (261 of 261 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fr/ * Translated using Weblate (French) Currently translated at 100.0% (261 of 261 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fr/ * Translated using Weblate (French) Currently translated at 99.2% (555 of 559 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fr/ * Translated using Weblate (French) Currently translated at 99.8% (558 of 559 strings) Translation: Mastodon/Backend Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/backend/fr/ * Translated using Weblate (French) Currently translated at 100.0% (62 of 62 strings) Translation: Mastodon/Devise Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/devise/fr/ * Translated using Weblate (French) Currently translated at 100.0% (261 of 261 strings) Translation: Mastodon/React Translate-URL: https://weblate.joinmastodon.org/projects/mastodon/frontend/fr/ * Normalize translations Ran i18n-tasks normalize && yarn manage:translations * Add back values removed by weblate --- app/javascript/mastodon/locales/ar.json | 6 +++- app/javascript/mastodon/locales/bg.json | 6 +++- app/javascript/mastodon/locales/ca.json | 10 +++++-- app/javascript/mastodon/locales/de.json | 6 +++- .../mastodon/locales/defaultMessages.json | 34 ++++++++++++++++++++-- app/javascript/mastodon/locales/en.json | 3 ++ app/javascript/mastodon/locales/eo.json | 6 +++- app/javascript/mastodon/locales/es.json | 6 +++- app/javascript/mastodon/locales/fa.json | 6 +++- app/javascript/mastodon/locales/fi.json | 6 +++- app/javascript/mastodon/locales/fr.json | 34 ++++++++++++---------- app/javascript/mastodon/locales/gl.json | 12 +++++--- app/javascript/mastodon/locales/he.json | 6 +++- app/javascript/mastodon/locales/hr.json | 6 +++- app/javascript/mastodon/locales/hu.json | 6 +++- app/javascript/mastodon/locales/hy.json | 5 +++- app/javascript/mastodon/locales/id.json | 6 +++- app/javascript/mastodon/locales/io.json | 6 +++- app/javascript/mastodon/locales/it.json | 6 +++- app/javascript/mastodon/locales/ja.json | 20 ++++++++----- app/javascript/mastodon/locales/ko.json | 6 +++- app/javascript/mastodon/locales/nl.json | 10 +++++-- app/javascript/mastodon/locales/no.json | 6 +++- app/javascript/mastodon/locales/oc.json | 6 +++- app/javascript/mastodon/locales/pl.json | 6 +++- app/javascript/mastodon/locales/pt-BR.json | 6 +++- app/javascript/mastodon/locales/pt.json | 6 +++- app/javascript/mastodon/locales/ru.json | 6 +++- app/javascript/mastodon/locales/sk.json | 6 +++- app/javascript/mastodon/locales/sr-Latn.json | 6 +++- app/javascript/mastodon/locales/sr.json | 6 +++- app/javascript/mastodon/locales/sv.json | 6 +++- app/javascript/mastodon/locales/th.json | 6 +++- app/javascript/mastodon/locales/tr.json | 6 +++- app/javascript/mastodon/locales/uk.json | 6 +++- app/javascript/mastodon/locales/whitelist_hy.json | 2 ++ app/javascript/mastodon/locales/zh-HK.json | 6 +++- app/javascript/mastodon/locales/zh-TW.json | 6 +++- 38 files changed, 239 insertions(+), 65 deletions(-) create mode 100644 app/javascript/mastodon/locales/whitelist_hy.json (limited to 'app') diff --git a/app/javascript/mastodon/locales/ar.json b/app/javascript/mastodon/locales/ar.json index 795b27707..f43d7ca00 100644 --- a/app/javascript/mastodon/locales/ar.json +++ b/app/javascript/mastodon/locales/ar.json @@ -139,6 +139,7 @@ "loading_indicator.label": "تحميل ...", "media_gallery.toggle_visible": "عرض / إخفاء", "missing_indicator.label": "تعذر العثور عليه", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "هل تود إخفاء الإخطارات القادمة من هذا المستخدم ؟", "navigation_bar.blocks": "الحسابات المحجوبة", "navigation_bar.community_timeline": "الخيط العام المحلي", @@ -174,7 +175,8 @@ "onboarding.page_four.home": "تعرض الصفحة الرئيسية منشورات جميع الأشخاص الذين تتابعهم.", "onboarding.page_four.notifications": "فعندما يتفاعل شخص ما معك، عمود الإخطارات يخبرك.", "onboarding.page_one.federation": "ماستدون شبكة من خوادم مستقلة متلاحمة تهدف إلى إنشاء أكبر شبكة اجتماعية موحدة. تسمى هذه السرفيرات بمثيلات خوادم.", - "onboarding.page_one.handle": "أنت الآن على {domain}، واحد من مجموع مثيلات الخوادم المستقلة. اسم المستخدم الكامل الخاص بك هو {handle}", + "onboarding.page_one.full_handle": "Your full handle", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "مرحبا بك في ماستدون !", "onboarding.page_six.admin": "مدير(ة) مثيل الخادم هذا {admin}.", "onboarding.page_six.almost_done": "أنهيت تقريبا ...", @@ -197,6 +199,8 @@ "privacy.public.short": "للعامة", "privacy.unlisted.long": "لا تقم بإدراجه على الخيوط العامة", "privacy.unlisted.short": "غير مدرج", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", "relative_time.just_now": "الآن", diff --git a/app/javascript/mastodon/locales/bg.json b/app/javascript/mastodon/locales/bg.json index c0a24dacb..8188ae2c0 100644 --- a/app/javascript/mastodon/locales/bg.json +++ b/app/javascript/mastodon/locales/bg.json @@ -139,6 +139,7 @@ "loading_indicator.label": "Зареждане...", "media_gallery.toggle_visible": "Toggle visibility", "missing_indicator.label": "Not found", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Hide notifications from this user?", "navigation_bar.blocks": "Blocked users", "navigation_bar.community_timeline": "Local timeline", @@ -174,7 +175,8 @@ "onboarding.page_four.home": "The home timeline shows posts from people you follow.", "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.", "onboarding.page_one.federation": "Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.", - "onboarding.page_one.handle": "You are on {domain}, so your full handle is {handle}", + "onboarding.page_one.full_handle": "Your full handle", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "Welcome to Mastodon!", "onboarding.page_six.admin": "Your instance's admin is {admin}.", "onboarding.page_six.almost_done": "Almost done...", @@ -197,6 +199,8 @@ "privacy.public.short": "Public", "privacy.unlisted.long": "Do not show in public timelines", "privacy.unlisted.short": "Unlisted", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", "relative_time.just_now": "now", diff --git a/app/javascript/mastodon/locales/ca.json b/app/javascript/mastodon/locales/ca.json index 3eb0e3d26..a37f38fd1 100644 --- a/app/javascript/mastodon/locales/ca.json +++ b/app/javascript/mastodon/locales/ca.json @@ -50,7 +50,7 @@ "column_header.unpin": "Deslligar", "column_subheading.navigation": "Navegació", "column_subheading.settings": "Configuració", - "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", + "compose_form.hashtag_warning": "Aquest toot no es mostrarà en cap etiqueta ja que no està llistat. Només els toots públics poden ser cercats per etiqueta.", "compose_form.lock_disclaimer": "El teu compte no està bloquejat {locked}. Tothom pot seguir-te i veure els teus missatges a seguidors.", "compose_form.lock_disclaimer.lock": "bloquejat", "compose_form.placeholder": "En què estàs pensant?", @@ -139,6 +139,7 @@ "loading_indicator.label": "Carregant...", "media_gallery.toggle_visible": "Alternar visibilitat", "missing_indicator.label": "No trobat", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Amagar notificacions d'aquest usuari?", "navigation_bar.blocks": "Usuaris bloquejats", "navigation_bar.community_timeline": "Línia de temps Local", @@ -174,7 +175,8 @@ "onboarding.page_four.home": "La línia de temps d'Inici mostra missatges de les persones que segueixes.", "onboarding.page_four.notifications": "La columna Notificacions mostra quan algú interactua amb tu.", "onboarding.page_one.federation": "Mastodon és una xarxa de servidors independents que s'uneixen per fer una més gran xarxa social. A aquests servidors els hi diem instàncies.", - "onboarding.page_one.handle": "Ets a {domain}, per tant el teu usuari complert és {handle}", + "onboarding.page_one.full_handle": "El teu usuari complet", + "onboarding.page_one.handle_hint": "Això és el que els hi diries als teus amics que cerquin.", "onboarding.page_one.welcome": "Benvingut a Mastodon!", "onboarding.page_six.admin": "L'administrador de la teva instància és {admin}.", "onboarding.page_six.almost_done": "Quasi fet...", @@ -197,6 +199,8 @@ "privacy.public.short": "Públic", "privacy.unlisted.long": "No publicar en línies de temps públiques", "privacy.unlisted.short": "No llistat", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "fa {number} dies", "relative_time.hours": "fa {number} hores", "relative_time.just_now": "ara", @@ -223,7 +227,7 @@ "status.media_hidden": "Multimèdia amagat", "status.mention": "Esmentar @{name}", "status.more": "Més", - "status.mute": "Mute @{name}", + "status.mute": "Silenciar @{name}", "status.mute_conversation": "Silenciar conversació", "status.open": "Ampliar aquest estat", "status.pin": "Fixat en el perfil", diff --git a/app/javascript/mastodon/locales/de.json b/app/javascript/mastodon/locales/de.json index 9b6c857e4..4e6b721da 100644 --- a/app/javascript/mastodon/locales/de.json +++ b/app/javascript/mastodon/locales/de.json @@ -139,6 +139,7 @@ "loading_indicator.label": "Wird geladen …", "media_gallery.toggle_visible": "Sichtbarkeit umschalten", "missing_indicator.label": "Nicht gefunden", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Benachrichtigungen von diesem Account verbergen?", "navigation_bar.blocks": "Blockierte Profile", "navigation_bar.community_timeline": "Lokale Zeitleiste", @@ -174,7 +175,8 @@ "onboarding.page_four.home": "Die Startseite zeigt dir Beiträge von Leuten, denen du folgst.", "onboarding.page_four.notifications": "Wenn jemand mit dir interagiert, bekommst du eine Mitteilung.", "onboarding.page_one.federation": "Mastodon ist ein soziales Netzwerk, das aus unabhängigen Servern besteht. Diese Server nennen wir auch Instanzen.", - "onboarding.page_one.handle": "Du bist auf der Instanz {domain}, also ist dein vollständiger Profilname im Netzwerk {handle}", + "onboarding.page_one.full_handle": "Your full handle", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "Willkommen bei Mastodon!", "onboarding.page_six.admin": "Für deine Instanz ist {admin} zuständig.", "onboarding.page_six.almost_done": "Fast fertig …", @@ -197,6 +199,8 @@ "privacy.public.short": "Öffentlich", "privacy.unlisted.long": "Nicht in öffentlichen Zeitleisten anzeigen", "privacy.unlisted.short": "Nicht gelistet", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", "relative_time.just_now": "now", diff --git a/app/javascript/mastodon/locales/defaultMessages.json b/app/javascript/mastodon/locales/defaultMessages.json index 797054d57..2788a7a14 100644 --- a/app/javascript/mastodon/locales/defaultMessages.json +++ b/app/javascript/mastodon/locales/defaultMessages.json @@ -136,6 +136,10 @@ { "defaultMessage": "Not found", "id": "missing_indicator.label" + }, + { + "defaultMessage": "This resource could not be found", + "id": "missing_indicator.sublabel" } ], "path": "app/javascript/mastodon/components/missing_indicator.json" @@ -255,6 +259,19 @@ ], "path": "app/javascript/mastodon/components/status_content.json" }, + { + "descriptors": [ + { + "defaultMessage": "Loading…", + "id": "regeneration_indicator.label" + }, + { + "defaultMessage": "Your home feed is being prepared!", + "id": "regeneration_indicator.sublabel" + } + ], + "path": "app/javascript/mastodon/components/status_list.json" + }, { "descriptors": [ { @@ -1213,6 +1230,15 @@ ], "path": "app/javascript/mastodon/features/public_timeline/index.json" }, + { + "descriptors": [ + { + "defaultMessage": "A look inside...", + "id": "standalone.public_title" + } + ], + "path": "app/javascript/mastodon/features/standalone/community_timeline/index.json" + }, { "descriptors": [ { @@ -1446,8 +1472,12 @@ "id": "onboarding.page_one.federation" }, { - "defaultMessage": "You are on {domain}, so your full handle is {handle}", - "id": "onboarding.page_one.handle" + "defaultMessage": "Your full handle", + "id": "onboarding.page_one.full_handle" + }, + { + "defaultMessage": "This is what you would tell your friends to search for.", + "id": "onboarding.page_one.handle_hint" }, { "defaultMessage": "Write posts from the compose column. You can upload images, change privacy settings, and add content warnings with the icons below.", diff --git a/app/javascript/mastodon/locales/en.json b/app/javascript/mastodon/locales/en.json index 02d12677a..1e952b7b7 100644 --- a/app/javascript/mastodon/locales/en.json +++ b/app/javascript/mastodon/locales/en.json @@ -139,6 +139,7 @@ "loading_indicator.label": "Loading...", "media_gallery.toggle_visible": "Toggle visibility", "missing_indicator.label": "Not found", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Hide notifications from this user?", "navigation_bar.blocks": "Blocked users", "navigation_bar.community_timeline": "Local timeline", @@ -198,6 +199,8 @@ "privacy.public.short": "Public", "privacy.unlisted.long": "Do not post to public timelines", "privacy.unlisted.short": "Unlisted", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", "relative_time.just_now": "now", diff --git a/app/javascript/mastodon/locales/eo.json b/app/javascript/mastodon/locales/eo.json index eab8c09a6..694b35ad2 100644 --- a/app/javascript/mastodon/locales/eo.json +++ b/app/javascript/mastodon/locales/eo.json @@ -139,6 +139,7 @@ "loading_indicator.label": "Ŝarganta…", "media_gallery.toggle_visible": "Baskuli videblecon", "missing_indicator.label": "Ne trovita", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Hide notifications from this user?", "navigation_bar.blocks": "Blokitaj uzantoj", "navigation_bar.community_timeline": "Loka tempolinio", @@ -174,7 +175,8 @@ "onboarding.page_four.home": "La hejma tempolinio enhavas la mesaĝojn de ĉiuj uzantoj, kiuj vi sekvas.", "onboarding.page_four.notifications": "La sciiga kolumno informas vin kiam iu interagas kun vi.", "onboarding.page_one.federation": "Mastodono estas reto de nedependaj serviloj, unuiĝintaj por krei pligrandan socian retejon. Ni nomas tiujn servilojn instancoj.", - "onboarding.page_one.handle": "Vi estas ĉe {domain}, unu el la multaj instancoj de Mastodono. Via kompleta uznomo do estas {handle}", + "onboarding.page_one.full_handle": "Your full handle", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "Bonvenon al Mastodono!", "onboarding.page_six.admin": "Via instancestro estas {admin}.", "onboarding.page_six.almost_done": "Estas preskaŭ finita…", @@ -197,6 +199,8 @@ "privacy.public.short": "Publika", "privacy.unlisted.long": "Ne vidigi en publikaj tempolinioj", "privacy.unlisted.short": "Nelistigita", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}t", "relative_time.hours": "{number}h", "relative_time.just_now": "nun", diff --git a/app/javascript/mastodon/locales/es.json b/app/javascript/mastodon/locales/es.json index 8a8110b1e..cc131fba1 100644 --- a/app/javascript/mastodon/locales/es.json +++ b/app/javascript/mastodon/locales/es.json @@ -139,6 +139,7 @@ "loading_indicator.label": "Cargando…", "media_gallery.toggle_visible": "Cambiar visibilidad", "missing_indicator.label": "No encontrado", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Ocultar notificaciones de este usuario?", "navigation_bar.blocks": "Usuarios bloqueados", "navigation_bar.community_timeline": "Historia local", @@ -174,7 +175,8 @@ "onboarding.page_four.home": "La línea de tiempo principal muestra toots de gente que sigues.", "onboarding.page_four.notifications": "Las notificaciones se muestran cuando alguien interactúa contigo.", "onboarding.page_one.federation": "Mastodon es una red de servidores federados que conforman una red social aún más grande. Llamamos a estos servidores instancias.", - "onboarding.page_one.handle": "Estás en {domain}, así que tu nombre de usuario completo es {handle}", + "onboarding.page_one.full_handle": "Your full handle", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "¡Bienvenido a Mastodon!", "onboarding.page_six.admin": "El administrador de tu instancia es {admin}.", "onboarding.page_six.almost_done": "Ya casi…", @@ -197,6 +199,8 @@ "privacy.public.short": "Público", "privacy.unlisted.long": "No mostrar en la historia federada", "privacy.unlisted.short": "Sin federar", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", "relative_time.just_now": "ahora", diff --git a/app/javascript/mastodon/locales/fa.json b/app/javascript/mastodon/locales/fa.json index 8c52ffdb4..6846da66d 100644 --- a/app/javascript/mastodon/locales/fa.json +++ b/app/javascript/mastodon/locales/fa.json @@ -139,6 +139,7 @@ "loading_indicator.label": "بارگیری...", "media_gallery.toggle_visible": "تغییر پیدایی", "missing_indicator.label": "پیدا نشد", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "اعلان‌های این کاربر پنهان شود؟", "navigation_bar.blocks": "کاربران مسدودشده", "navigation_bar.community_timeline": "نوشته‌های محلی", @@ -174,7 +175,8 @@ "onboarding.page_four.home": "ستون «خانه» نوشته‌های کسانی را نشان می‌دهد که شما پی می‌گیرید.", "onboarding.page_four.notifications": "ستون «اعلان‌ها» ارتباط‌های شما با دیگران را نشان می‌دهد.", "onboarding.page_one.federation": "ماستدون شبکه‌ای از سرورهای مستقل است که با پیوستن به یکدیگر یک شبکهٔ اجتماعی بزرگ را تشکیل می‌دهند.", - "onboarding.page_one.handle": "شما روی سرور {domain} هستید، بنابراین شناسهٔ کامل شما {handle} است", + "onboarding.page_one.full_handle": "Your full handle", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "به ماستدون خوش آمدید!", "onboarding.page_six.admin": "نشانی مسئول سرور شما {admin} است.", "onboarding.page_six.almost_done": "الان تقریباً آماده‌اید...", @@ -197,6 +199,8 @@ "privacy.public.short": "عمومی", "privacy.unlisted.long": "عمومی، ولی فهرست نکن", "privacy.unlisted.short": "فهرست‌نشده", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", "relative_time.just_now": "الان", diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 74ab699c4..eb81e7eb4 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -139,6 +139,7 @@ "loading_indicator.label": "Ladataan...", "media_gallery.toggle_visible": "Toggle visibility", "missing_indicator.label": "Not found", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Hide notifications from this user?", "navigation_bar.blocks": "Blocked users", "navigation_bar.community_timeline": "Paikallinen aikajana", @@ -174,7 +175,8 @@ "onboarding.page_four.home": "The home timeline shows posts from people you follow.", "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.", "onboarding.page_one.federation": "Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.", - "onboarding.page_one.handle": "You are on {domain}, so your full handle is {handle}", + "onboarding.page_one.full_handle": "Your full handle", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "Welcome to Mastodon!", "onboarding.page_six.admin": "Your instance's admin is {admin}.", "onboarding.page_six.almost_done": "Almost done...", @@ -197,6 +199,8 @@ "privacy.public.short": "Public", "privacy.unlisted.long": "Do not show in public timelines", "privacy.unlisted.short": "Unlisted", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", "relative_time.just_now": "now", diff --git a/app/javascript/mastodon/locales/fr.json b/app/javascript/mastodon/locales/fr.json index e77107fc5..66592eecd 100644 --- a/app/javascript/mastodon/locales/fr.json +++ b/app/javascript/mastodon/locales/fr.json @@ -36,7 +36,7 @@ "column.favourites": "Favoris", "column.follow_requests": "Demandes de suivi", "column.home": "Accueil", - "column.lists": "Lists", + "column.lists": "Listes", "column.mutes": "Comptes masqués", "column.notifications": "Notifications", "column.pins": "Pouets épinglés", @@ -50,7 +50,7 @@ "column_header.unpin": "Retirer", "column_subheading.navigation": "Navigation", "column_subheading.settings": "Paramètres", - "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", + "compose_form.hashtag_warning": "Ce pouet ne sera pas listé dans les recherches par hashtag car sa visibilité est réglée sur \"non-listé\". Seuls les pouets avec une visibilité \"publique\" peuvent être recherchés par hashtag.", "compose_form.lock_disclaimer": "Votre compte n’est pas {locked}. Tout le monde peut vous suivre et voir vos pouets privés.", "compose_form.lock_disclaimer.lock": "verrouillé", "compose_form.placeholder": "Qu’avez-vous en tête ?", @@ -73,7 +73,7 @@ "confirmations.unfollow.confirm": "Ne plus suivre", "confirmations.unfollow.message": "Voulez-vous arrêter de suivre {name} ?", "embed.instructions": "Intégrez ce statut à votre site en copiant le code ci-dessous.", - "embed.preview": "Il apparaîtra comme cela :", + "embed.preview": "Il apparaîtra comme cela :", "emoji_button.activity": "Activités", "emoji_button.custom": "Personnalisés", "emoji_button.flags": "Drapeaux", @@ -89,12 +89,12 @@ "emoji_button.symbols": "Symboles", "emoji_button.travel": "Lieux et voyages", "empty_column.community": "Le fil public local est vide. Écrivez donc quelque chose pour le remplir !", - "empty_column.hashtag": "Il n’y a encore aucun contenu associé à ce hashtag", + "empty_column.hashtag": "Il n’y a encore aucun contenu associé à ce hashtag.", "empty_column.home": "Vous ne suivez encore personne. Visitez {public} ou bien utilisez la recherche pour vous connecter à d’autres utilisateur⋅ice⋅s.", "empty_column.home.public_timeline": "le fil public", "empty_column.list": "Il n'y a rien dans cette liste pour l'instant. Dès que des personnes de cette liste publierons de nouveaux statuts, ils apparaîtront ici.", "empty_column.notifications": "Vous n’avez pas encore de notification. Interagissez avec d’autres utilisateur⋅ice⋅s pour débuter la conversation.", - "empty_column.public": "Il n’y a rien ici ! Écrivez quelque chose publiquement, ou bien suivez manuellement des utilisateur⋅ice⋅s d’autres instances pour remplir le fil public.", + "empty_column.public": "Il n’y a rien ici ! Écrivez quelque chose publiquement, ou bien suivez manuellement des utilisateur⋅ice·s d’autres instances pour remplir le fil public", "follow_request.authorize": "Accepter", "follow_request.reject": "Rejeter", "getting_started.appsshort": "Applications", @@ -121,10 +121,10 @@ "keyboard_shortcuts.legend": "pour afficher cette légende", "keyboard_shortcuts.mention": "pour mentionner l'auteur", "keyboard_shortcuts.reply": "pour répondre", - "keyboard_shortcuts.search": "to focus search", + "keyboard_shortcuts.search": "pour cibler la recherche", "keyboard_shortcuts.toot": "pour démarrer un tout nouveau pouet", - "keyboard_shortcuts.unfocus": "to un-focus compose textarea/search", - "keyboard_shortcuts.up": "to move up in the list", + "keyboard_shortcuts.unfocus": "pour recentrer composer textarea/search", + "keyboard_shortcuts.up": "pour remonter dans la liste", "lightbox.close": "Fermer", "lightbox.next": "Suivant", "lightbox.previous": "Précédent", @@ -139,6 +139,7 @@ "loading_indicator.label": "Chargement…", "media_gallery.toggle_visible": "Modifier la visibilité", "missing_indicator.label": "Non trouvé", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Masquer les notifications de cet utilisateur ?", "navigation_bar.blocks": "Comptes bloqués", "navigation_bar.community_timeline": "Fil public local", @@ -154,14 +155,14 @@ "navigation_bar.preferences": "Préférences", "navigation_bar.public_timeline": "Fil public global", "notification.favourite": "{name} a ajouté à ses favoris :", - "notification.follow": "{name} vous suit.", + "notification.follow": "{name} vous suit", "notification.mention": "{name} vous a mentionné⋅e :", "notification.reblog": "{name} a partagé votre statut :", "notifications.clear": "Nettoyer", "notifications.clear_confirmation": "Voulez-vous vraiment supprimer toutes vos notifications ?", "notifications.column_settings.alert": "Notifications locales", "notifications.column_settings.favourite": "Favoris :", - "notifications.column_settings.follow": "Nouveaux⋅elles abonné⋅e⋅s :", + "notifications.column_settings.follow": "Nouveaux⋅elles abonné⋅e·s :", "notifications.column_settings.mention": "Mentions :", "notifications.column_settings.push": "Notifications push", "notifications.column_settings.push_meta": "Cet appareil", @@ -171,15 +172,16 @@ "onboarding.done": "Effectué", "onboarding.next": "Suivant", "onboarding.page_five.public_timelines": "Le fil public global affiche les posts de tou⋅te⋅s les utilisateur⋅ice⋅s suivi⋅es par les membres de {domain}. Le fil public local est identique mais se limite aux utilisateur⋅ice⋅s de {domain}.", - "onboarding.page_four.home": "L’Accueil affiche les posts de tou⋅te⋅s les utilisateur⋅ice⋅s que vous suivez", - "onboarding.page_four.notifications": "Les Notifications vous informent lorsque quelqu’un interagit avec vous", + "onboarding.page_four.home": "L’Accueil affiche les posts de tou⋅te·s les utilisateur⋅ice·s que vous suivez.", + "onboarding.page_four.notifications": "Les Notifications vous informent lorsque quelqu’un interagit avec vous.", "onboarding.page_one.federation": "Mastodon est un réseau social qui appartient à tou⋅te⋅s.", - "onboarding.page_one.handle": "Vous êtes sur {domain}, une des nombreuses instances indépendantes de Mastodon. Votre nom d’utilisateur⋅ice complet est {handle}", + "onboarding.page_one.full_handle": "Votre pleine maîtrise", + "onboarding.page_one.handle_hint": "C'est ce que vous diriez à vos amis de rechercher.", "onboarding.page_one.welcome": "Bienvenue sur Mastodon !", "onboarding.page_six.admin": "L’administrateur⋅ice de votre instance est {admin}", "onboarding.page_six.almost_done": "Nous y sommes presque…", "onboarding.page_six.appetoot": "Bon appouétit !", - "onboarding.page_six.apps_available": "De nombreuses {apps} sont disponibles pour iOS, Android et autres. Et maintenant… Bon appouétit !", + "onboarding.page_six.apps_available": "De nombreuses {apps} sont disponibles pour iOS, Android et autres.", "onboarding.page_six.github": "Mastodon est un logiciel libre, gratuit et open-source. Vous pouvez rapporter des bogues, suggérer des fonctionnalités, ou contribuer à son développement sur {github}.", "onboarding.page_six.guidelines": "règles de la communauté", "onboarding.page_six.read_guidelines": "S’il vous plaît, n’oubliez pas de lire les {guidelines} !", @@ -197,6 +199,8 @@ "privacy.public.short": "Public", "privacy.unlisted.long": "Ne pas afficher dans les fils publics", "privacy.unlisted.short": "Non-listé", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number} j", "relative_time.hours": "{number} h", "relative_time.just_now": "à l’instant", @@ -223,7 +227,7 @@ "status.media_hidden": "Média caché", "status.mention": "Mentionner", "status.more": "Plus", - "status.mute": "Mute @{name}", + "status.mute": "Masquer @{name}", "status.mute_conversation": "Masquer la conversation", "status.open": "Déplier ce statut", "status.pin": "Épingler sur le profil", diff --git a/app/javascript/mastodon/locales/gl.json b/app/javascript/mastodon/locales/gl.json index 77f6b82ab..562bc0593 100644 --- a/app/javascript/mastodon/locales/gl.json +++ b/app/javascript/mastodon/locales/gl.json @@ -50,7 +50,7 @@ "column_header.unpin": "Soltar", "column_subheading.navigation": "Navegación", "column_subheading.settings": "Axustes", - "compose_form.hashtag_warning": "This toot won't be listed under any hashtag as it is unlisted. Only public toots can be searched by hashtag.", + "compose_form.hashtag_warning": "Esta mensaxe non será listada baixo ningunha etiqueta xa que está marcada como non listada. Só os toots públicos poden buscarse por etiquetas.", "compose_form.lock_disclaimer": "A súa conta non está {locked}. Calquera pode seguila para ver as súas mensaxes só-para-seguidoras.", "compose_form.lock_disclaimer.lock": "bloqueado", "compose_form.placeholder": "A qué andas?", @@ -139,6 +139,7 @@ "loading_indicator.label": "Cargando...", "media_gallery.toggle_visible": "Dar visibilidade", "missing_indicator.label": "Non atopado", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Esconder notificacións deste usuario?", "navigation_bar.blocks": "Usuarios bloqueados", "navigation_bar.community_timeline": "Liña temporal local", @@ -156,7 +157,7 @@ "notification.favourite": "{name} marcou como favorito o seu estado", "notification.follow": "{name} está a seguila", "notification.mention": "{name} mencionoute", - "notification.reblog": "{name} promocionou o seu estado", + "notification.reblog": "{name} promoveu o seu estado", "notifications.clear": "Limpar notificacións", "notifications.clear_confirmation": "Estás seguro de que queres limpar permanentemente todas as túas notificacións?", "notifications.column_settings.alert": "Notificacións de escritorio", @@ -174,7 +175,8 @@ "onboarding.page_four.home": "A liña de tempo local mostra as publicacións das persoas que segues.", "onboarding.page_four.notifications": "A columna de notificacións mostra cando alguén interactúa contigo.", "onboarding.page_one.federation": "Mastodon é unha rede de servidores independentes que se unen para facer unha rede social máis grande. Chamamos instancias a estes servidores.", - "onboarding.page_one.handle": "Estás en {domain}, polo que o teu nome de usuario completo é {handle}", + "onboarding.page_one.full_handle": "O seu alcume completo", + "onboarding.page_one.handle_hint": "Esto é o que lle debe dicir a quen queira seguila.", "onboarding.page_one.welcome": "Benvido a Mastodon!", "onboarding.page_six.admin": "O administrador da túa instancia é {admin}.", "onboarding.page_six.almost_done": "Case feito...", @@ -197,6 +199,8 @@ "privacy.public.short": "Pública", "privacy.unlisted.long": "Non publicar en liñas temporais públicas", "privacy.unlisted.short": "Non listada", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", "relative_time.just_now": "agora", @@ -223,7 +227,7 @@ "status.media_hidden": "Medios ocultos", "status.mention": "Mencionar @{name}", "status.more": "Máis", - "status.mute": "Mute @{name}", + "status.mute": "Acalar @{name}", "status.mute_conversation": "Acalar conversa", "status.open": "Expandir este estado", "status.pin": "Fixar no perfil", diff --git a/app/javascript/mastodon/locales/he.json b/app/javascript/mastodon/locales/he.json index 2eb186173..d6665295f 100644 --- a/app/javascript/mastodon/locales/he.json +++ b/app/javascript/mastodon/locales/he.json @@ -139,6 +139,7 @@ "loading_indicator.label": "טוען...", "media_gallery.toggle_visible": "נראה\\בלתי נראה", "missing_indicator.label": "לא נמצא", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "להסתיר הודעות מחשבון זה?", "navigation_bar.blocks": "חסימות", "navigation_bar.community_timeline": "ציר זמן מקומי", @@ -174,7 +175,8 @@ "onboarding.page_four.home": "ציר זמן הבית מראה הודעות מהנעקבים שלך.", "onboarding.page_four.notifications": "טור ההתראות מראה כשמישהו מתייחס להודעות שלך.", "onboarding.page_one.federation": "מסטודון היא רשת של שרתים עצמאיים מצורפים ביחד לכדי רשת חברתית אחת גדולה. אנחנו מכנים את השרתים האלו קהילות.", - "onboarding.page_one.handle": "אתם בקהילה {domain}, ולכן מזהה המשתמש המלא שלכם הוא {handle}", + "onboarding.page_one.full_handle": "Your full handle", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "ברוכים הבאים למסטודון!", "onboarding.page_six.admin": "הקהילה מנוהלת בידי {admin}.", "onboarding.page_six.almost_done": "כמעט סיימנו...", @@ -197,6 +199,8 @@ "privacy.public.short": "פומבי", "privacy.unlisted.long": "לא יופיע בפידים הציבוריים המשותפים", "privacy.unlisted.short": "לא לפיד הכללי", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", "relative_time.just_now": "כרגע", diff --git a/app/javascript/mastodon/locales/hr.json b/app/javascript/mastodon/locales/hr.json index 00dea67f7..c49ae160f 100644 --- a/app/javascript/mastodon/locales/hr.json +++ b/app/javascript/mastodon/locales/hr.json @@ -139,6 +139,7 @@ "loading_indicator.label": "Učitavam...", "media_gallery.toggle_visible": "Preklopi vidljivost", "missing_indicator.label": "Nije nađen", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Hide notifications from this user?", "navigation_bar.blocks": "Blokirani korisnici", "navigation_bar.community_timeline": "Lokalni timeline", @@ -174,7 +175,8 @@ "onboarding.page_four.home": "The home timeline prikazuje postove ljudi koje slijediš.", "onboarding.page_four.notifications": "Stupac za notifikacije pokazuje poruke drugih upućene tebi.", "onboarding.page_one.federation": "Mastodon čini mreža neovisnih servera udruženih u jednu veću socialnu mrežu. Te servere nazivamo instancama.", - "onboarding.page_one.handle": "Ti si na {domain}, i tvoja puna handle je {handle}", + "onboarding.page_one.full_handle": "Your full handle", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "Dobro došli na Mastodon!", "onboarding.page_six.admin": "Administrator tvoje instance je {admin}.", "onboarding.page_six.almost_done": "Još malo pa gotovo...", @@ -197,6 +199,8 @@ "privacy.public.short": "Javno", "privacy.unlisted.long": "Ne prikazuj u javnim timelineovima", "privacy.unlisted.short": "Unlisted", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", "relative_time.just_now": "now", diff --git a/app/javascript/mastodon/locales/hu.json b/app/javascript/mastodon/locales/hu.json index e1048519b..0ed43ae6b 100644 --- a/app/javascript/mastodon/locales/hu.json +++ b/app/javascript/mastodon/locales/hu.json @@ -139,6 +139,7 @@ "loading_indicator.label": "Betöltés...", "media_gallery.toggle_visible": "Toggle visibility", "missing_indicator.label": "Not found", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Hide notifications from this user?", "navigation_bar.blocks": "Blocked users", "navigation_bar.community_timeline": "Local timeline", @@ -174,7 +175,8 @@ "onboarding.page_four.home": "The home timeline shows posts from people you follow.", "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.", "onboarding.page_one.federation": "Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.", - "onboarding.page_one.handle": "You are on {domain}, so your full handle is {handle}", + "onboarding.page_one.full_handle": "Your full handle", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "Welcome to Mastodon!", "onboarding.page_six.admin": "Your instance's admin is {admin}.", "onboarding.page_six.almost_done": "Almost done...", @@ -197,6 +199,8 @@ "privacy.public.short": "Public", "privacy.unlisted.long": "Do not show in public timelines", "privacy.unlisted.short": "Unlisted", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", "relative_time.just_now": "now", diff --git a/app/javascript/mastodon/locales/hy.json b/app/javascript/mastodon/locales/hy.json index 152f0c525..f46db5b00 100644 --- a/app/javascript/mastodon/locales/hy.json +++ b/app/javascript/mastodon/locales/hy.json @@ -139,6 +139,7 @@ "loading_indicator.label": "Բեռնվում է…", "media_gallery.toggle_visible": "Ցուցադրել/թաքցնել", "missing_indicator.label": "Չգտնվեց", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Թաքցնե՞լ ցանուցումներն այս օգտատիրոջից։", "navigation_bar.blocks": "Արգելափակված օգտատերեր", "navigation_bar.community_timeline": "Տեղական հոսք", @@ -198,6 +199,8 @@ "privacy.public.short": "Հրապարակային", "privacy.unlisted.long": "Չթթել հրապարակային հոսքերում", "privacy.unlisted.short": "Ծածուկ", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}օր", "relative_time.hours": "{number}ժ", "relative_time.just_now": "նոր", @@ -260,4 +263,4 @@ "video.pause": "Դադար տալ", "video.play": "Նվագել", "video.unmute": "Միացնել ձայնը" -} \ No newline at end of file +} diff --git a/app/javascript/mastodon/locales/id.json b/app/javascript/mastodon/locales/id.json index 0942bc33c..6edf855d3 100644 --- a/app/javascript/mastodon/locales/id.json +++ b/app/javascript/mastodon/locales/id.json @@ -139,6 +139,7 @@ "loading_indicator.label": "Tunggu sebentar...", "media_gallery.toggle_visible": "Tampil/Sembunyikan", "missing_indicator.label": "Tidak ditemukan", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Hide notifications from this user?", "navigation_bar.blocks": "Pengguna diblokir", "navigation_bar.community_timeline": "Linimasa lokal", @@ -174,7 +175,8 @@ "onboarding.page_four.home": "Linimasa beranda menampilkan postingan dari orang-orang yang anda ikuti.", "onboarding.page_four.notifications": "Kolom notifikasi menampilkan ketika seseorang berinteraksi dengan anda.", "onboarding.page_one.federation": "Mastodon adalah jaringan dari beberapa server independen yang bergabung untuk membuat jejaring sosial yang besar.", - "onboarding.page_one.handle": "Ada berada dalam {domain}, jadi nama user lengkap anda adalah {handle}", + "onboarding.page_one.full_handle": "Your full handle", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "Selamat datang di Mastodon!", "onboarding.page_six.admin": "Admin serveer anda adalah {admin}.", "onboarding.page_six.almost_done": "Hampir selesei...", @@ -197,6 +199,8 @@ "privacy.public.short": "Publik", "privacy.unlisted.long": "Tidak ditampilkan di linimasa publik", "privacy.unlisted.short": "Tak Terdaftar", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", "relative_time.just_now": "now", diff --git a/app/javascript/mastodon/locales/io.json b/app/javascript/mastodon/locales/io.json index cfd8e299f..7aa7cb144 100644 --- a/app/javascript/mastodon/locales/io.json +++ b/app/javascript/mastodon/locales/io.json @@ -139,6 +139,7 @@ "loading_indicator.label": "Kargante...", "media_gallery.toggle_visible": "Chanjar videbleso", "missing_indicator.label": "Ne trovita", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Hide notifications from this user?", "navigation_bar.blocks": "Blokusita uzeri", "navigation_bar.community_timeline": "Lokala tempolineo", @@ -174,7 +175,8 @@ "onboarding.page_four.home": "The home timeline shows posts from people you follow.", "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.", "onboarding.page_one.federation": "Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.", - "onboarding.page_one.handle": "You are on {domain}, so your full handle is {handle}", + "onboarding.page_one.full_handle": "Your full handle", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "Welcome to Mastodon!", "onboarding.page_six.admin": "Your instance's admin is {admin}.", "onboarding.page_six.almost_done": "Almost done...", @@ -197,6 +199,8 @@ "privacy.public.short": "Publike", "privacy.unlisted.long": "Ne montrar en publika tempolinei", "privacy.unlisted.short": "Ne enlistigota", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", "relative_time.just_now": "now", diff --git a/app/javascript/mastodon/locales/it.json b/app/javascript/mastodon/locales/it.json index e14fa410c..61467df16 100644 --- a/app/javascript/mastodon/locales/it.json +++ b/app/javascript/mastodon/locales/it.json @@ -139,6 +139,7 @@ "loading_indicator.label": "Carico...", "media_gallery.toggle_visible": "Imposta visibilità", "missing_indicator.label": "Non trovato", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Hide notifications from this user?", "navigation_bar.blocks": "Utenti bloccati", "navigation_bar.community_timeline": "Timeline locale", @@ -174,7 +175,8 @@ "onboarding.page_four.home": "The home timeline shows posts from people you follow.", "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.", "onboarding.page_one.federation": "Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.", - "onboarding.page_one.handle": "You are on {domain}, so your full handle is {handle}", + "onboarding.page_one.full_handle": "Your full handle", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "Welcome to Mastodon!", "onboarding.page_six.admin": "Your instance's admin is {admin}.", "onboarding.page_six.almost_done": "Almost done...", @@ -197,6 +199,8 @@ "privacy.public.short": "Pubblico", "privacy.unlisted.long": "Non mostrare sulla timeline pubblica", "privacy.unlisted.short": "Non elencato", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", "relative_time.just_now": "now", diff --git a/app/javascript/mastodon/locales/ja.json b/app/javascript/mastodon/locales/ja.json index e7f15691c..13756f95c 100644 --- a/app/javascript/mastodon/locales/ja.json +++ b/app/javascript/mastodon/locales/ja.json @@ -1,5 +1,5 @@ { - "account.block": "ブロック", + "account.block": "@{name}さんをブロック", "account.block_domain": "{domain}全体を非表示", "account.disclaimer_full": "以下の情報は不正確な可能性があります。", "account.edit_profile": "プロフィールを編集", @@ -11,18 +11,18 @@ "account.media": "メディア", "account.mention": "返信", "account.moved_to": "{name}さんは引っ越しました:", - "account.mute": "ミュート", - "account.mute_notifications": "@{name}さんからの通知を受け取る", + "account.mute": "@{name}さんをミュート", + "account.mute_notifications": "@{name}さんからの通知を受け取らない", "account.posts": "投稿", - "account.report": "通報", - "account.requested": "承認待ち", + "account.report": "@{name}さんを通報", + "account.requested": "フォロー承認待ちです。クリックしてキャンセル。", "account.share": "@{name}さんのプロフィールを共有する", "account.show_reblogs": "@{name}さんからのブーストを表示", - "account.unblock": "ブロック解除", + "account.unblock": "@{name}さんのブロック解除", "account.unblock_domain": "{domain}を表示", "account.unfollow": "フォロー解除", "account.unmute": "ミュート解除", - "account.unmute_notifications": "@{name}さんからの通知を受け取らない", + "account.unmute_notifications": "@{name}さんからの通知を受け取る", "account.view_full_profile": "全ての情報を見る", "boost_modal.combo": "次からは{combo}を押せば、これをスキップできます", "bundle_column_error.body": "コンポーネントの読み込み中に問題が発生しました。", @@ -139,6 +139,7 @@ "loading_indicator.label": "読み込み中...", "media_gallery.toggle_visible": "表示切り替え", "missing_indicator.label": "見つかりません", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "このユーザーからの通知を隠しますか?", "navigation_bar.blocks": "ブロックしたユーザー", "navigation_bar.community_timeline": "ローカルタイムライン", @@ -174,7 +175,8 @@ "onboarding.page_four.home": "「ホーム」タイムラインではあなたがフォローしている人の投稿を表示します。", "onboarding.page_four.notifications": "「通知」ではあなたへの他の人からの関わりを表示します。", "onboarding.page_one.federation": "Mastodonは誰でも参加できるSNSです。", - "onboarding.page_one.handle": "今あなたは数あるMastodonインスタンスの1つである{domain}にいます。あなたのフルハンドルは{handle}です", + "onboarding.page_one.full_handle": "あなたのフルハンドル", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "Mastodonへようこそ!", "onboarding.page_six.admin": "あなたのインスタンスの管理者は{admin}です。", "onboarding.page_six.almost_done": "以上です。", @@ -197,6 +199,8 @@ "privacy.public.short": "公開", "privacy.unlisted.long": "公開TLで表示しない", "privacy.unlisted.short": "未収載", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}日前", "relative_time.hours": "{number}時間前", "relative_time.just_now": "今", diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index 31e5e377e..18d8a80a7 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -139,6 +139,7 @@ "loading_indicator.label": "불러오는 중...", "media_gallery.toggle_visible": "표시 전환", "missing_indicator.label": "찾을 수 없습니다", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "이 사용자로부터의 알림을 뮤트하시겠습니까?", "navigation_bar.blocks": "차단한 사용자", "navigation_bar.community_timeline": "로컬 타임라인", @@ -174,7 +175,8 @@ "onboarding.page_four.home": "홈 타임라인에서는 내가 팔로우 중인 사람들의 포스트를 표시합니다.", "onboarding.page_four.notifications": "알림에서는 다른 사람들과의 연결을 표시합니다.", "onboarding.page_one.federation": "Mastodon은 누구나 참가할 수 있는 SNS입니다.", - "onboarding.page_one.handle": "여러분은 지금 수많은 Mastodon 인스턴스 중 하나인 {domain}에 있습니다. 당신의 유저 이름은 {handle} 입니다.", + "onboarding.page_one.full_handle": "Your full handle", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "Mastodon에 어서 오세요!", "onboarding.page_six.admin": "이 인스턴스의 관리자는 {admin}입니다.", "onboarding.page_six.almost_done": "이상입니다.", @@ -197,6 +199,8 @@ "privacy.public.short": "공개", "privacy.unlisted.long": "공개 타임라인에 표시하지 않음", "privacy.unlisted.short": "타임라인에 비표시", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}일 전", "relative_time.hours": "{number}시간 전", "relative_time.just_now": "방금", diff --git a/app/javascript/mastodon/locales/nl.json b/app/javascript/mastodon/locales/nl.json index 6dc7292f1..060aa229e 100644 --- a/app/javascript/mastodon/locales/nl.json +++ b/app/javascript/mastodon/locales/nl.json @@ -139,6 +139,7 @@ "loading_indicator.label": "Laden…", "media_gallery.toggle_visible": "Media wel/niet tonen", "missing_indicator.label": "Niet gevonden", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Verberg meldingen van deze persoon?", "navigation_bar.blocks": "Geblokkeerde gebruikers", "navigation_bar.community_timeline": "Lokale tijdlijn", @@ -174,9 +175,10 @@ "onboarding.page_four.home": "Deze tijdlijn laat toots zien van mensen die jij volgt.", "onboarding.page_four.notifications": "De kolom met meldingen toont alle interacties die je met andere Mastodon-gebruikers hebt.", "onboarding.page_one.federation": "Mastodon is een netwerk van onafhankelijke servers die samen een groot sociaal netwerk vormen.", - "onboarding.page_one.handle": "Je bevindt je nu op {domain}, dus is jouw volledige Mastodon-adres {handle}", + "onboarding.page_one.full_handle": "Your full handle", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "Welkom op Mastodon!", - "onboarding.page_six.admin": "De beheerder van jouw Mastodon-server is {admin}.", + "onboarding.page_six.admin": "De beheerder van jouw Mastodonserver is {admin}.", "onboarding.page_six.almost_done": "Bijna klaar...", "onboarding.page_six.appetoot": "Veel succes!", "onboarding.page_six.apps_available": "Er zijn {apps} beschikbaar voor iOS, Android en andere platformen.", @@ -185,7 +187,7 @@ "onboarding.page_six.read_guidelines": "Vergeet niet de {guidelines} van {domain} te lezen!", "onboarding.page_six.various_app": "mobiele apps", "onboarding.page_three.profile": "Bewerk jouw profiel om jouw avatar, bio en weergavenaam te veranderen. Daar vind je ook andere instellingen.", - "onboarding.page_three.search": "Gebruik de zoekbalk linksboven om andere mensen op Mastodon te vinden en om te zoeken op hashtags, zoals {illustration} en {introductions}. Om iemand te vinden die niet op deze Mastodon-server zit, moet je het volledige Mastodon-adres van deze persoon invoeren.", + "onboarding.page_three.search": "Gebruik de zoekbalk linksboven om andere mensen op Mastodon te vinden en om te zoeken op hashtags, zoals {illustration} en {introductions}. Om iemand te vinden die niet op deze Mastodonserver zit, moet je het volledige Mastodonadres van deze persoon invoeren.", "onboarding.page_two.compose": "Schrijf berichten (wij noemen dit toots) in het tekstvak in de linkerkolom. Je kan met de pictogrammen daaronder afbeeldingen uploaden, privacy-instellingen veranderen en je tekst een waarschuwing meegeven.", "onboarding.skip": "Overslaan", "privacy.change": "Zichtbaarheid toot aanpassen", @@ -197,6 +199,8 @@ "privacy.public.short": "Openbaar", "privacy.unlisted.long": "Niet op openbare tijdlijnen tonen", "privacy.unlisted.short": "Minder openbaar", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", "relative_time.just_now": "nu", diff --git a/app/javascript/mastodon/locales/no.json b/app/javascript/mastodon/locales/no.json index 5fbc51ff3..6bd57c222 100644 --- a/app/javascript/mastodon/locales/no.json +++ b/app/javascript/mastodon/locales/no.json @@ -139,6 +139,7 @@ "loading_indicator.label": "Laster...", "media_gallery.toggle_visible": "Veksle synlighet", "missing_indicator.label": "Ikke funnet", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Hide notifications from this user?", "navigation_bar.blocks": "Blokkerte brukere", "navigation_bar.community_timeline": "Lokal tidslinje", @@ -174,7 +175,8 @@ "onboarding.page_four.home": "Hjem er tidslinjen med alle brukere som du følger.", "onboarding.page_four.notifications": "Kolonnen med varsler viser når noen interakterer med deg.", "onboarding.page_one.federation": "Mastdodon er et nettverk med uavhengige servere som sammarbeider om å danne et stort sosialt nettverk. Vi kaller disse serverene instanser.", - "onboarding.page_one.handle": "Du er på {domain}, så ditt fulle brukernavn er {handle}", + "onboarding.page_one.full_handle": "Your full handle", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "Velkommen til Mastodon!", "onboarding.page_six.admin": "Administratoren på din instans er {admin}.", "onboarding.page_six.almost_done": "Snart ferdig...", @@ -197,6 +199,8 @@ "privacy.public.short": "Offentlig", "privacy.unlisted.long": "Ikke vis i offentlige tidslinjer", "privacy.unlisted.short": "Uoppført", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", "relative_time.just_now": "now", diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index 6ebd40f5b..f7da5d92b 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -139,6 +139,7 @@ "loading_indicator.label": "Cargament…", "media_gallery.toggle_visible": "Modificar la visibilitat", "missing_indicator.label": "Pas trobat", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Rescondre las notificacions d’aquesta persona ?", "navigation_bar.blocks": "Personas blocadas", "navigation_bar.community_timeline": "Flux public local", @@ -174,7 +175,8 @@ "onboarding.page_four.home": "Lo flux d’acuèlh mòstra los estatuts del mond que seguètz.", "onboarding.page_four.notifications": "La colomna de notificacions vos fa veire quand qualqu’un interagís amb vos.", "onboarding.page_one.federation": "Mastodon es un malhum de servidors independents que comunican per construire un malhum mai larg. Òm los apèla instàncias.", - "onboarding.page_one.handle": "Sètz sus {domain}, doncas vòstre identificant complet es {handle}", + "onboarding.page_one.full_handle": "Your full handle", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "Benvengut a Mastodon !", "onboarding.page_six.admin": "Vòstre administrator d’instància es {admin}.", "onboarding.page_six.almost_done": "Gaireben acabat…", @@ -197,6 +199,8 @@ "privacy.public.short": "Public", "privacy.unlisted.long": "Mostrar pas dins los fluxes publics", "privacy.unlisted.short": "Pas-listat", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "fa {number} d", "relative_time.hours": "fa {number} h", "relative_time.just_now": "ara", diff --git a/app/javascript/mastodon/locales/pl.json b/app/javascript/mastodon/locales/pl.json index 42fef2d17..81ec79776 100644 --- a/app/javascript/mastodon/locales/pl.json +++ b/app/javascript/mastodon/locales/pl.json @@ -139,6 +139,7 @@ "loading_indicator.label": "Ładowanie…", "media_gallery.toggle_visible": "Przełącz widoczność", "missing_indicator.label": "Nie znaleziono", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Chcesz ukryć powiadomienia od tego użytkownika?", "navigation_bar.blocks": "Zablokowani użytkownicy", "navigation_bar.community_timeline": "Lokalna oś czasu", @@ -174,7 +175,8 @@ "onboarding.page_four.home": "Główna oś czasu wyświetla publiczne wpisy.", "onboarding.page_four.notifications": "Kolumna powiadomień wyświetla, gdy ktoś dokonuje interakcji z tobą.", "onboarding.page_one.federation": "Mastodon jest siecią niezależnych serwerów połączonych w jeden portal społecznościowy. Nazywamy te serwery instancjami.", - "onboarding.page_one.handle": "Jesteś na domenie {domain}, więc Twój pełny adres to {handle}", + "onboarding.page_one.full_handle": "Twój pełny adres", + "onboarding.page_one.handle_hint": "Należy go podać znajomym, aby mogli Cię odnaleźć.", "onboarding.page_one.welcome": "Witamy w Mastodon!", "onboarding.page_six.admin": "Administratorem tej instancji jest {admin}.", "onboarding.page_six.almost_done": "Prawie gotowe…", @@ -197,6 +199,8 @@ "privacy.public.short": "Publiczny", "privacy.unlisted.long": "Niewidoczny na publicznych osiach czasu", "privacy.unlisted.short": "Niewidoczny", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number} dni", "relative_time.hours": "{number} godz.", "relative_time.just_now": "teraz", diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index 381b80639..d70202413 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -139,6 +139,7 @@ "loading_indicator.label": "Carregando...", "media_gallery.toggle_visible": "Esconder/Mostrar", "missing_indicator.label": "Não encontrado", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Esconder notificações deste usuário?", "navigation_bar.blocks": "Usuários bloqueados", "navigation_bar.community_timeline": "Local", @@ -174,7 +175,8 @@ "onboarding.page_four.home": "A página inicial mostra postagens de pessoas que você segue.", "onboarding.page_four.notifications": "A coluna de notificações te mostra quando alguém interage com você.", "onboarding.page_one.federation": "Mastodon é uma rede d servidores independentes se juntando para fazer uma grande rede social. Nós chamamos estes servidores de instâncias.", - "onboarding.page_one.handle": "Você está no {domain}, então o seu nome de usuário completo é {handle}", + "onboarding.page_one.full_handle": "Your full handle", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "Seja bem-vindo(a) ao Mastodon!", "onboarding.page_six.admin": "O administrador de sua instância é {admin}.", "onboarding.page_six.almost_done": "Quase acabando...", @@ -197,6 +199,8 @@ "privacy.public.short": "Pública", "privacy.unlisted.long": "Não publicar em feeds públicos", "privacy.unlisted.short": "Não listada", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", "relative_time.just_now": "agora", diff --git a/app/javascript/mastodon/locales/pt.json b/app/javascript/mastodon/locales/pt.json index f566f551b..97a46b9a1 100644 --- a/app/javascript/mastodon/locales/pt.json +++ b/app/javascript/mastodon/locales/pt.json @@ -139,6 +139,7 @@ "loading_indicator.label": "A carregar...", "media_gallery.toggle_visible": "Esconder/Mostrar", "missing_indicator.label": "Não encontrado", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Esconder notificações deste utilizador?", "navigation_bar.blocks": "Utilizadores bloqueados", "navigation_bar.community_timeline": "Local", @@ -174,7 +175,8 @@ "onboarding.page_four.home": "A timeline home mostra as publicações de pessoas que tu segues.", "onboarding.page_four.notifications": "A coluna de notificações mostra-te quando alguém interage contigo.", "onboarding.page_one.federation": "Mastodon é uma rede de servidores independentes ligados entre si para fazer uma grande rede social. Nós chamamos instâncias a estes servidores.", - "onboarding.page_one.handle": "Tu estás em {domain}, por isso o teu endereço completo de utilizador é {handle}", + "onboarding.page_one.full_handle": "Your full handle", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "Bem-vindo(a) ao Mastodon!", "onboarding.page_six.admin": "O administrador da tua instância é {admin}.", "onboarding.page_six.almost_done": "Quase pronto...", @@ -197,6 +199,8 @@ "privacy.public.short": "Público", "privacy.unlisted.long": "Não publicar nos feeds públicos", "privacy.unlisted.short": "Não listar", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", "relative_time.just_now": "agora", diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index 0fec70df0..29dbe84c5 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -139,6 +139,7 @@ "loading_indicator.label": "Загрузка...", "media_gallery.toggle_visible": "Показать/скрыть", "missing_indicator.label": "Не найдено", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Hide notifications from this user?", "navigation_bar.blocks": "Список блокировки", "navigation_bar.community_timeline": "Локальная лента", @@ -174,7 +175,8 @@ "onboarding.page_four.home": "Домашняя лента показывает посты от тех, на кого Вы подписаны.", "onboarding.page_four.notifications": "Колонка уведомлений сообщает о взаимодействии с Вами других людей.", "onboarding.page_one.federation": "Mastodon - это сеть независимых серверов, которые вместе образуют единую социальную сеть. Мы называем эти сервера узлами.", - "onboarding.page_one.handle": "Вы находитесь на {domain}, поэтому Ваше полное имя пользователя - {handle}", + "onboarding.page_one.full_handle": "Your full handle", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "Добро пожаловать в Mastodon!", "onboarding.page_six.admin": "Админ Вашего узла - {admin}.", "onboarding.page_six.almost_done": "Почти готово...", @@ -197,6 +199,8 @@ "privacy.public.short": "Публичный", "privacy.unlisted.long": "Не показывать в лентах", "privacy.unlisted.short": "Скрытый", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}д", "relative_time.hours": "{number}ч", "relative_time.just_now": "только что", diff --git a/app/javascript/mastodon/locales/sk.json b/app/javascript/mastodon/locales/sk.json index c38bfd3c6..465976aa5 100644 --- a/app/javascript/mastodon/locales/sk.json +++ b/app/javascript/mastodon/locales/sk.json @@ -139,6 +139,7 @@ "loading_indicator.label": "Nahrávam...", "media_gallery.toggle_visible": "Zapnúť/Vypnúť viditeľnosť", "missing_indicator.label": "Nenájdené", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Hide notifications from this user?", "navigation_bar.blocks": "Blokovaní používatelia", "navigation_bar.community_timeline": "Lokálna časová os", @@ -174,7 +175,8 @@ "onboarding.page_four.home": "Domovská časová os zobrazí správy od ľudí ktorých sleduješ.", "onboarding.page_four.notifications": "Stĺpec s notifikáciami zobrazí keď budeš s niekým komunikovať.", "onboarding.page_one.federation": "Mastodon je sieť nezávislých serverov spojením ktorých vzniká jedna veľká federovaná sociálna sieť.", - "onboarding.page_one.handle": "Ty si na {domain}, takže tvoje celý nickname je {handle}", + "onboarding.page_one.full_handle": "Your full handle", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "Vitajte v Mastodon!", "onboarding.page_six.admin": "Správca tohto servera je {admin}.", "onboarding.page_six.almost_done": "Takmer hotovo...", @@ -197,6 +199,8 @@ "privacy.public.short": "Verejne", "privacy.unlisted.long": "Neposielať do verejných časových osí", "privacy.unlisted.short": "Verejne mimo osí", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", "relative_time.just_now": "now", diff --git a/app/javascript/mastodon/locales/sr-Latn.json b/app/javascript/mastodon/locales/sr-Latn.json index 88631e332..cd48967cb 100644 --- a/app/javascript/mastodon/locales/sr-Latn.json +++ b/app/javascript/mastodon/locales/sr-Latn.json @@ -139,6 +139,7 @@ "loading_indicator.label": "Učitavam...", "media_gallery.toggle_visible": "Uključi/isključi vidljivost", "missing_indicator.label": "Nije pronađeno", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Sakrij obaveštenja od ovog korisnika?", "navigation_bar.blocks": "Blokirani korisnici", "navigation_bar.community_timeline": "Lokalna lajna", @@ -174,7 +175,8 @@ "onboarding.page_four.home": "Početna lajna prikazuje statuse ljudi koje Vi pratite.", "onboarding.page_four.notifications": "Kolona sa obaveštenjima Vam prikazuje kada neko priča sa Vama.", "onboarding.page_one.federation": "Mastodont je mreža nezavisnih servera koji se uvezuju da naprave jednu veću društvenu mrežu. Ove servere zovemo instancama.", - "onboarding.page_one.handle": "Vi ste na domenu {domain}, pa je Vaša puna identifikacija {handle}", + "onboarding.page_one.full_handle": "Your full handle", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "Dobrodošli na Mastodont!", "onboarding.page_six.admin": "Administrator Vaše instance je {admin}.", "onboarding.page_six.almost_done": "Još malo, pa gotovo...", @@ -197,6 +199,8 @@ "privacy.public.short": "Javno", "privacy.unlisted.long": "Ne objavljuj na javnim lajnama", "privacy.unlisted.short": "Neizlistano", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", "relative_time.just_now": "sada", diff --git a/app/javascript/mastodon/locales/sr.json b/app/javascript/mastodon/locales/sr.json index e65c02ab7..595a70ea6 100644 --- a/app/javascript/mastodon/locales/sr.json +++ b/app/javascript/mastodon/locales/sr.json @@ -139,6 +139,7 @@ "loading_indicator.label": "Учитавам...", "media_gallery.toggle_visible": "Укључи/искључи видљивост", "missing_indicator.label": "Није пронађено", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Сакриј обавештења од овог корисника?", "navigation_bar.blocks": "Блокирани корисници", "navigation_bar.community_timeline": "Локална лајна", @@ -174,7 +175,8 @@ "onboarding.page_four.home": "Почетна лајна приказује статусе људи које Ви пратите.", "onboarding.page_four.notifications": "Колона са обавештењима Вам приказује када неко прича са Вама.", "onboarding.page_one.federation": "Мастодонт је мрежа независних сервера који се увезују да направе једну већу друштвену мрежу. Ове сервере зовемо инстанцама.", - "onboarding.page_one.handle": "Ви сте на домену {domain}, па је Ваша пуна идентификација {handle}", + "onboarding.page_one.full_handle": "Your full handle", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "Добродошли на Мастодонт!", "onboarding.page_six.admin": "Администратор Ваше инстанце је {admin}.", "onboarding.page_six.almost_done": "Још мало, па готово...", @@ -197,6 +199,8 @@ "privacy.public.short": "Јавно", "privacy.unlisted.long": "Не објављуј на јавним лајнама", "privacy.unlisted.short": "Неизлистано", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", "relative_time.just_now": "сада", diff --git a/app/javascript/mastodon/locales/sv.json b/app/javascript/mastodon/locales/sv.json index edfa9b8c2..4e3175306 100644 --- a/app/javascript/mastodon/locales/sv.json +++ b/app/javascript/mastodon/locales/sv.json @@ -139,6 +139,7 @@ "loading_indicator.label": "Laddar...", "media_gallery.toggle_visible": "Växla synlighet", "missing_indicator.label": "Hittades inte", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Hide notifications from this user?", "navigation_bar.blocks": "Blockerade användare", "navigation_bar.community_timeline": "Lokal tidslinje", @@ -174,7 +175,8 @@ "onboarding.page_four.home": "Hemmatidslinjen visar inlägg från personer du följer.", "onboarding.page_four.notifications": "Meddelandekolumnen visar när någon interagerar med dig.", "onboarding.page_one.federation": "Mastodon är ett nätverk av oberoende servrar som ansluter för att skapa ett större socialt nätverk. Vi kallar dessa servrar instanser.", - "onboarding.page_one.handle": "Du är på {domain}, så din fulla hantering är {handle}", + "onboarding.page_one.full_handle": "Your full handle", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "Välkommen till Mastodon!", "onboarding.page_six.admin": "Din instansadmin är {admin}.", "onboarding.page_six.almost_done": "Snart klart...", @@ -197,6 +199,8 @@ "privacy.public.short": "Publik", "privacy.unlisted.long": "Skicka inte till publik tidslinje", "privacy.unlisted.short": "Olistad", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", "relative_time.just_now": "now", diff --git a/app/javascript/mastodon/locales/th.json b/app/javascript/mastodon/locales/th.json index 06323ebfc..740fb80e7 100644 --- a/app/javascript/mastodon/locales/th.json +++ b/app/javascript/mastodon/locales/th.json @@ -139,6 +139,7 @@ "loading_indicator.label": "Loading...", "media_gallery.toggle_visible": "Toggle visibility", "missing_indicator.label": "Not found", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Hide notifications from this user?", "navigation_bar.blocks": "Blocked users", "navigation_bar.community_timeline": "Local timeline", @@ -174,7 +175,8 @@ "onboarding.page_four.home": "The home timeline shows posts from people you follow.", "onboarding.page_four.notifications": "The notifications column shows when someone interacts with you.", "onboarding.page_one.federation": "Mastodon is a network of independent servers joining up to make one larger social network. We call these servers instances.", - "onboarding.page_one.handle": "You are on {domain}, so your full handle is {handle}", + "onboarding.page_one.full_handle": "Your full handle", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "Welcome to Mastodon!", "onboarding.page_six.admin": "Your instance's admin is {admin}.", "onboarding.page_six.almost_done": "Almost done...", @@ -197,6 +199,8 @@ "privacy.public.short": "Public", "privacy.unlisted.long": "Do not post to public timelines", "privacy.unlisted.short": "Unlisted", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", "relative_time.just_now": "now", diff --git a/app/javascript/mastodon/locales/tr.json b/app/javascript/mastodon/locales/tr.json index ce6434ca6..8805e52f4 100644 --- a/app/javascript/mastodon/locales/tr.json +++ b/app/javascript/mastodon/locales/tr.json @@ -139,6 +139,7 @@ "loading_indicator.label": "Yükleniyor...", "media_gallery.toggle_visible": "Görünürlüğü değiştir", "missing_indicator.label": "Bulunamadı", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Hide notifications from this user?", "navigation_bar.blocks": "Engellenen kullanıcılar", "navigation_bar.community_timeline": "Yerel zaman tüneli", @@ -174,7 +175,8 @@ "onboarding.page_four.home": "Takip ettiğiniz insanlardan gelen gönderileri gosteren zaman tünelidir", "onboarding.page_four.notifications": "Herkimse sizinle iletişime geçtiğinde gelen bildirimleri gösterir.", "onboarding.page_one.federation": "Mastodon, geniş bir sosyal ağ kurmak için birleşen bağımsız sunuculardan oluşan bir ağdır.", - "onboarding.page_one.handle": "{domain} sunucundasınız, bu yüzden tüm kontrol {handle}", + "onboarding.page_one.full_handle": "Your full handle", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "Mastodon'a hoş geldiniz.", "onboarding.page_six.admin": "{admin}, şu anda bulunduğunuz sunucunun yöneticisidir.", "onboarding.page_six.almost_done": "Neredeyse tamam...", @@ -197,6 +199,8 @@ "privacy.public.short": "Herkese açık", "privacy.unlisted.long": "Herkese açık zaman tüneline gönderme", "privacy.unlisted.short": "Listelenmemiş", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", "relative_time.just_now": "now", diff --git a/app/javascript/mastodon/locales/uk.json b/app/javascript/mastodon/locales/uk.json index 46d22ac83..2cdaba0ac 100644 --- a/app/javascript/mastodon/locales/uk.json +++ b/app/javascript/mastodon/locales/uk.json @@ -139,6 +139,7 @@ "loading_indicator.label": "Завантаження...", "media_gallery.toggle_visible": "Показати/приховати", "missing_indicator.label": "Не знайдено", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Hide notifications from this user?", "navigation_bar.blocks": "Заблоковані користувачі", "navigation_bar.community_timeline": "Локальна стрічка", @@ -174,7 +175,8 @@ "onboarding.page_four.home": "Домашня стрічка показує пости користувачів, на яких Ви підписані.", "onboarding.page_four.notifications": "Колонка сповіщень показує моменти, коли хтось звертається до Вас.", "onboarding.page_one.federation": "Mastodon - це мережа незалежних серверів, які разом образовують єдину соціальну мережу. Ми называємо ці сервери інстанціями.", - "onboarding.page_one.handle": "Ви знаходитесь на домені {domain}, тому Ваш повний нік - {handle}", + "onboarding.page_one.full_handle": "Your full handle", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "Ласкаво просимо до Mastodon!", "onboarding.page_six.admin": "Адміністратором Вашої інстанції є {admin}.", "onboarding.page_six.almost_done": "Майже готово...", @@ -197,6 +199,8 @@ "privacy.public.short": "Публічний", "privacy.unlisted.long": "Не показувати у публічних стрічках", "privacy.unlisted.short": "Прихований", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", "relative_time.just_now": "now", diff --git a/app/javascript/mastodon/locales/whitelist_hy.json b/app/javascript/mastodon/locales/whitelist_hy.json new file mode 100644 index 000000000..0d4f101c7 --- /dev/null +++ b/app/javascript/mastodon/locales/whitelist_hy.json @@ -0,0 +1,2 @@ +[ +] diff --git a/app/javascript/mastodon/locales/zh-HK.json b/app/javascript/mastodon/locales/zh-HK.json index 7745da622..0a3ae423d 100644 --- a/app/javascript/mastodon/locales/zh-HK.json +++ b/app/javascript/mastodon/locales/zh-HK.json @@ -139,6 +139,7 @@ "loading_indicator.label": "載入中...", "media_gallery.toggle_visible": "打開或關上", "missing_indicator.label": "找不到內容", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Hide notifications from this user?", "navigation_bar.blocks": "被你封鎖的用戶", "navigation_bar.community_timeline": "本站時間軸", @@ -174,7 +175,8 @@ "onboarding.page_four.home": "「主頁」顯示你所關注用戶的文章", "onboarding.page_four.notifications": "「通知」欄顯示你和其他人的互動。", "onboarding.page_one.federation": "Mastodon(萬象社交)是由一批獨立網站組成的龐大網絡,我們將這些獨立又互連網站稱為「服務站」(instance)", - "onboarding.page_one.handle": "你的帳戶在 {domain} 上面,由 {handle} 代理", + "onboarding.page_one.full_handle": "Your full handle", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "歡迎使用 Mastodon(萬象社交)", "onboarding.page_six.admin": "你服務站的管理員是{admin}", "onboarding.page_six.almost_done": "差不多了……", @@ -197,6 +199,8 @@ "privacy.public.short": "公共", "privacy.unlisted.long": "公開,但不在公共時間軸顯示", "privacy.unlisted.short": "公開", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", "relative_time.just_now": "now", diff --git a/app/javascript/mastodon/locales/zh-TW.json b/app/javascript/mastodon/locales/zh-TW.json index 65b174ab5..1201fe3c7 100644 --- a/app/javascript/mastodon/locales/zh-TW.json +++ b/app/javascript/mastodon/locales/zh-TW.json @@ -139,6 +139,7 @@ "loading_indicator.label": "讀取中...", "media_gallery.toggle_visible": "切換可見性", "missing_indicator.label": "找不到", + "missing_indicator.sublabel": "This resource could not be found", "mute_modal.hide_notifications": "Hide notifications from this user?", "navigation_bar.blocks": "封鎖的使用者", "navigation_bar.community_timeline": "本地時間軸", @@ -174,7 +175,8 @@ "onboarding.page_four.home": "家時間軸顯示所有你關注的人的貼文。", "onboarding.page_four.notifications": "通知欄顯示別人和你的互動。", "onboarding.page_one.federation": "Mastodon 是由獨立的伺服器連結起來,形成的大社群網路。我們把這些伺服器稱為副本。", - "onboarding.page_one.handle": "你在 {domain} 上,所以你的帳號全名是 {handle}", + "onboarding.page_one.full_handle": "Your full handle", + "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", "onboarding.page_one.welcome": "歡迎來到 Mastodon !", "onboarding.page_six.admin": "你的副本的管理員是 {admin} 。", "onboarding.page_six.almost_done": "快好了…", @@ -197,6 +199,8 @@ "privacy.public.short": "公開貼", "privacy.unlisted.long": "不要貼到公開時間軸", "privacy.unlisted.short": "不列出來", + "regeneration_indicator.label": "Loading…", + "regeneration_indicator.sublabel": "Your home feed is being prepared!", "relative_time.days": "{number}d", "relative_time.hours": "{number}h", "relative_time.just_now": "now", -- cgit From 8cc65cde274055a8c6e89a0de2d8811880d4b55d Mon Sep 17 00:00:00 2001 From: Akihiko Odaki Date: Mon, 22 Jan 2018 22:22:14 +0900 Subject: Resolve URL for local account in follow authorization success view (#6324) --- app/views/authorize_follows/success.html.haml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/authorize_follows/success.html.haml b/app/views/authorize_follows/success.html.haml index f0b495689..63ff3bcf1 100644 --- a/app/views/authorize_follows/success.html.haml +++ b/app/views/authorize_follows/success.html.haml @@ -12,5 +12,5 @@ .post-follow-actions %div= link_to t('authorize_follow.post_follow.web'), web_url("accounts/#{@account.id}"), class: 'button button--block' - %div= link_to t('authorize_follow.post_follow.return'), @account.url, class: 'button button--block' + %div= link_to t('authorize_follow.post_follow.return'), TagManager.instance.url_for(@account), class: 'button button--block' %div= t('authorize_follow.post_follow.close') -- cgit From 17cecd75cadfd9914ffc233de01d41204ef7802c Mon Sep 17 00:00:00 2001 From: Akihiko Odaki Date: Mon, 22 Jan 2018 22:24:22 +0900 Subject: Rename FetchRemoteResourceService to ResolveURLService (#6328) The service used to be named FetchRemoteResourceService resolves local URL as well. --- app/services/fetch_remote_resource_service.rb | 90 ---------------------- app/services/resolve_url_service.rb | 90 ++++++++++++++++++++++ app/services/search_service.rb | 14 ++-- .../services/fetch_remote_resource_service_spec.rb | 53 ------------- spec/services/resolve_url_service_spec.rb | 53 +++++++++++++ spec/services/search_service_spec.rb | 6 +- 6 files changed, 153 insertions(+), 153 deletions(-) delete mode 100644 app/services/fetch_remote_resource_service.rb create mode 100644 app/services/resolve_url_service.rb delete mode 100644 spec/services/fetch_remote_resource_service_spec.rb create mode 100644 spec/services/resolve_url_service_spec.rb (limited to 'app') diff --git a/app/services/fetch_remote_resource_service.rb b/app/services/fetch_remote_resource_service.rb deleted file mode 100644 index 6d40796f2..000000000 --- a/app/services/fetch_remote_resource_service.rb +++ /dev/null @@ -1,90 +0,0 @@ -# frozen_string_literal: true - -class FetchRemoteResourceService < BaseService - include JsonLdHelper - - attr_reader :url - - def call(url) - @url = url - - return process_local_url if local_url? - - process_url unless fetched_atom_feed.nil? - end - - private - - def process_url - case type - when 'Person' - FetchRemoteAccountService.new.call(atom_url, body, protocol) - when 'Note' - FetchRemoteStatusService.new.call(atom_url, body, protocol) - end - end - - def fetched_atom_feed - @_fetched_atom_feed ||= FetchAtomService.new.call(url) - end - - def atom_url - fetched_atom_feed.first - end - - def body - fetched_atom_feed.second[:prefetched_body] - end - - def protocol - fetched_atom_feed.third - end - - def type - return json_data['type'] if protocol == :activitypub - - case xml_root - when 'feed' - 'Person' - when 'entry' - 'Note' - end - end - - def json_data - @_json_data ||= body_to_json(body) - end - - def xml_root - xml_data.root.name - end - - def xml_data - @_xml_data ||= Nokogiri::XML(body, nil, 'utf-8') - end - - def local_url? - TagManager.instance.local_url?(@url) - end - - def process_local_url - recognized_params = Rails.application.routes.recognize_path(@url) - - return unless recognized_params[:action] == 'show' - - if recognized_params[:controller] == 'stream_entries' - status = StreamEntry.find_by(id: recognized_params[:id])&.status - check_local_status(status) - elsif recognized_params[:controller] == 'statuses' - status = Status.find_by(id: recognized_params[:id]) - check_local_status(status) - elsif recognized_params[:controller] == 'accounts' - Account.find_local(recognized_params[:username]) - end - end - - def check_local_status(status) - return if status.nil? - status if status.public_visibility? || status.unlisted_visibility? - end -end diff --git a/app/services/resolve_url_service.rb b/app/services/resolve_url_service.rb new file mode 100644 index 000000000..1f2b24524 --- /dev/null +++ b/app/services/resolve_url_service.rb @@ -0,0 +1,90 @@ +# frozen_string_literal: true + +class ResolveURLService < BaseService + include JsonLdHelper + + attr_reader :url + + def call(url) + @url = url + + return process_local_url if local_url? + + process_url unless fetched_atom_feed.nil? + end + + private + + def process_url + case type + when 'Person' + FetchRemoteAccountService.new.call(atom_url, body, protocol) + when 'Note' + FetchRemoteStatusService.new.call(atom_url, body, protocol) + end + end + + def fetched_atom_feed + @_fetched_atom_feed ||= FetchAtomService.new.call(url) + end + + def atom_url + fetched_atom_feed.first + end + + def body + fetched_atom_feed.second[:prefetched_body] + end + + def protocol + fetched_atom_feed.third + end + + def type + return json_data['type'] if protocol == :activitypub + + case xml_root + when 'feed' + 'Person' + when 'entry' + 'Note' + end + end + + def json_data + @_json_data ||= body_to_json(body) + end + + def xml_root + xml_data.root.name + end + + def xml_data + @_xml_data ||= Nokogiri::XML(body, nil, 'utf-8') + end + + def local_url? + TagManager.instance.local_url?(@url) + end + + def process_local_url + recognized_params = Rails.application.routes.recognize_path(@url) + + return unless recognized_params[:action] == 'show' + + if recognized_params[:controller] == 'stream_entries' + status = StreamEntry.find_by(id: recognized_params[:id])&.status + check_local_status(status) + elsif recognized_params[:controller] == 'statuses' + status = Status.find_by(id: recognized_params[:id]) + check_local_status(status) + elsif recognized_params[:controller] == 'accounts' + Account.find_local(recognized_params[:username]) + end + end + + def check_local_status(status) + return if status.nil? + status if status.public_visibility? || status.unlisted_visibility? + end +end diff --git a/app/services/search_service.rb b/app/services/search_service.rb index 85ad94463..5f763b8f7 100644 --- a/app/services/search_service.rb +++ b/app/services/search_service.rb @@ -8,7 +8,7 @@ class SearchService < BaseService default_results.tap do |results| if url_query? - results.merge!(remote_resource_results) unless remote_resource.nil? + results.merge!(url_resource_results) unless url_resource.nil? elsif query.present? results[:accounts] = AccountSearchService.new.call(query, limit, account, resolve: resolve) results[:hashtags] = Tag.search_for(query.gsub(/\A#/, ''), limit) unless query.start_with?('@') @@ -24,15 +24,15 @@ class SearchService < BaseService query =~ /\Ahttps?:\/\// end - def remote_resource_results - { remote_resource_symbol => [remote_resource] } + def url_resource_results + { url_resource_symbol => [url_resource] } end - def remote_resource - @_remote_resource ||= FetchRemoteResourceService.new.call(query) + def url_resource + @_url_resource ||= ResolveURLService.new.call(query) end - def remote_resource_symbol - remote_resource.class.name.downcase.pluralize.to_sym + def url_resource_symbol + url_resource.class.name.downcase.pluralize.to_sym end end diff --git a/spec/services/fetch_remote_resource_service_spec.rb b/spec/services/fetch_remote_resource_service_spec.rb deleted file mode 100644 index b80fb2475..000000000 --- a/spec/services/fetch_remote_resource_service_spec.rb +++ /dev/null @@ -1,53 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -describe FetchRemoteResourceService do - subject { described_class.new } - - describe '#call' do - it 'returns nil when there is no atom url' do - url = 'http://example.com/missing-atom' - service = double - allow(FetchAtomService).to receive(:new).and_return service - allow(service).to receive(:call).with(url).and_return(nil) - - result = subject.call(url) - expect(result).to be_nil - end - - it 'fetches remote accounts for feed types' do - url = 'http://example.com/atom-feed' - service = double - allow(FetchAtomService).to receive(:new).and_return service - feed_url = 'http://feed-url' - feed_content = 'contents' - allow(service).to receive(:call).with(url).and_return([feed_url, { prefetched_body: feed_content }]) - - account_service = double - allow(FetchRemoteAccountService).to receive(:new).and_return(account_service) - allow(account_service).to receive(:call) - - _result = subject.call(url) - - expect(account_service).to have_received(:call).with(feed_url, feed_content, nil) - end - - it 'fetches remote statuses for entry types' do - url = 'http://example.com/atom-entry' - service = double - allow(FetchAtomService).to receive(:new).and_return service - feed_url = 'http://feed-url' - feed_content = 'contents' - allow(service).to receive(:call).with(url).and_return([feed_url, { prefetched_body: feed_content }]) - - account_service = double - allow(FetchRemoteStatusService).to receive(:new).and_return(account_service) - allow(account_service).to receive(:call) - - _result = subject.call(url) - - expect(account_service).to have_received(:call).with(feed_url, feed_content, nil) - end - end -end diff --git a/spec/services/resolve_url_service_spec.rb b/spec/services/resolve_url_service_spec.rb new file mode 100644 index 000000000..1e9be4c07 --- /dev/null +++ b/spec/services/resolve_url_service_spec.rb @@ -0,0 +1,53 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe ResolveURLService do + subject { described_class.new } + + describe '#call' do + it 'returns nil when there is no atom url' do + url = 'http://example.com/missing-atom' + service = double + allow(FetchAtomService).to receive(:new).and_return service + allow(service).to receive(:call).with(url).and_return(nil) + + result = subject.call(url) + expect(result).to be_nil + end + + it 'fetches remote accounts for feed types' do + url = 'http://example.com/atom-feed' + service = double + allow(FetchAtomService).to receive(:new).and_return service + feed_url = 'http://feed-url' + feed_content = 'contents' + allow(service).to receive(:call).with(url).and_return([feed_url, { prefetched_body: feed_content }]) + + account_service = double + allow(FetchRemoteAccountService).to receive(:new).and_return(account_service) + allow(account_service).to receive(:call) + + _result = subject.call(url) + + expect(account_service).to have_received(:call).with(feed_url, feed_content, nil) + end + + it 'fetches remote statuses for entry types' do + url = 'http://example.com/atom-entry' + service = double + allow(FetchAtomService).to receive(:new).and_return service + feed_url = 'http://feed-url' + feed_content = 'contents' + allow(service).to receive(:call).with(url).and_return([feed_url, { prefetched_body: feed_content }]) + + account_service = double + allow(FetchRemoteStatusService).to receive(:new).and_return(account_service) + allow(account_service).to receive(:call) + + _result = subject.call(url) + + expect(account_service).to have_received(:call).with(feed_url, feed_content, nil) + end + end +end diff --git a/spec/services/search_service_spec.rb b/spec/services/search_service_spec.rb index 3ffcc389b..957b60c7d 100644 --- a/spec/services/search_service_spec.rb +++ b/spec/services/search_service_spec.rb @@ -26,7 +26,7 @@ describe SearchService do context 'that does not find anything' do it 'returns the empty results' do service = double(call: nil) - allow(FetchRemoteResourceService).to receive(:new).and_return(service) + allow(ResolveURLService).to receive(:new).and_return(service) results = subject.call(@query, 10) expect(service).to have_received(:call).with(@query) @@ -38,7 +38,7 @@ describe SearchService do it 'includes the account in the results' do account = Account.new service = double(call: account) - allow(FetchRemoteResourceService).to receive(:new).and_return(service) + allow(ResolveURLService).to receive(:new).and_return(service) results = subject.call(@query, 10) expect(service).to have_received(:call).with(@query) @@ -50,7 +50,7 @@ describe SearchService do it 'includes the status in the results' do status = Status.new service = double(call: status) - allow(FetchRemoteResourceService).to receive(:new).and_return(service) + allow(ResolveURLService).to receive(:new).and_return(service) results = subject.call(@query, 10) expect(service).to have_received(:call).with(@query) -- cgit From 613e7c7521252bd85e473d9c63cbc8b8e1a733a8 Mon Sep 17 00:00:00 2001 From: Akihiko Odaki Date: Mon, 22 Jan 2018 22:25:09 +0900 Subject: Rename ResolveRemoteAccountService to ResolveAccountService (#6327) The service used to be named ResolveRemoteAccountService resolves local accounts as well. --- app/controllers/activitypub/inboxes_controller.rb | 2 +- app/controllers/authorize_follows_controller.rb | 2 +- app/controllers/concerns/signature_verification.rb | 2 +- app/models/account.rb | 2 +- app/models/form/migration.rb | 2 +- app/services/account_search_service.rb | 2 +- app/services/concerns/author_extractor.rb | 2 +- app/services/follow_service.rb | 2 +- app/services/process_mentions_service.rb | 6 +- app/services/resolve_account_service.rb | 208 +++++++++++++++++++++ app/services/resolve_remote_account_service.rb | 208 --------------------- app/workers/import/relationship_worker.rb | 2 +- app/workers/resolve_account_worker.rb | 11 ++ app/workers/resolve_remote_account_worker.rb | 11 -- .../authorize_follows_controller_spec.rb | 4 +- .../settings/imports_controller_spec.rb | 4 +- spec/models/account_spec.rb | 8 +- spec/services/account_search_service_spec.rb | 4 +- spec/services/resolve_account_service_spec.rb | 133 +++++++++++++ .../resolve_remote_account_service_spec.rb | 133 ------------- 20 files changed, 374 insertions(+), 374 deletions(-) create mode 100644 app/services/resolve_account_service.rb delete mode 100644 app/services/resolve_remote_account_service.rb create mode 100644 app/workers/resolve_account_worker.rb delete mode 100644 app/workers/resolve_remote_account_worker.rb create mode 100644 spec/services/resolve_account_service_spec.rb delete mode 100644 spec/services/resolve_remote_account_service_spec.rb (limited to 'app') diff --git a/app/controllers/activitypub/inboxes_controller.rb b/app/controllers/activitypub/inboxes_controller.rb index 76553a162..7d0bc74d3 100644 --- a/app/controllers/activitypub/inboxes_controller.rb +++ b/app/controllers/activitypub/inboxes_controller.rb @@ -28,7 +28,7 @@ class ActivityPub::InboxesController < Api::BaseController def upgrade_account if signed_request_account.ostatus? signed_request_account.update(last_webfingered_at: nil) - ResolveRemoteAccountWorker.perform_async(signed_request_account.acct) + ResolveAccountWorker.perform_async(signed_request_account.acct) end Pubsubhubbub::UnsubscribeWorker.perform_async(signed_request_account.id) if signed_request_account.subscribed? diff --git a/app/controllers/authorize_follows_controller.rb b/app/controllers/authorize_follows_controller.rb index 7afe664d1..775d5f23f 100644 --- a/app/controllers/authorize_follows_controller.rb +++ b/app/controllers/authorize_follows_controller.rb @@ -41,7 +41,7 @@ class AuthorizeFollowsController < ApplicationController end def account_from_remote_follow - ResolveRemoteAccountService.new.call(acct_without_prefix) + ResolveAccountService.new.call(acct_without_prefix) end def acct_param_is_url? diff --git a/app/controllers/concerns/signature_verification.rb b/app/controllers/concerns/signature_verification.rb index 2baafb5bf..f289228d3 100644 --- a/app/controllers/concerns/signature_verification.rb +++ b/app/controllers/concerns/signature_verification.rb @@ -114,7 +114,7 @@ module SignatureVerification def account_from_key_id(key_id) if key_id.start_with?('acct:') - ResolveRemoteAccountService.new.call(key_id.gsub(/\Aacct:/, '')) + ResolveAccountService.new.call(key_id.gsub(/\Aacct:/, '')) elsif !ActivityPub::TagManager.instance.local_uri?(key_id) account = ActivityPub::TagManager.instance.uri_to_resource(key_id, Account) account ||= ActivityPub::FetchRemoteKeyService.new.call(key_id, id: false) diff --git a/app/models/account.rb b/app/models/account.rb index 5900fee4a..13692d0d7 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -163,7 +163,7 @@ class Account < ApplicationRecord def refresh! return if local? - ResolveRemoteAccountService.new.call(acct) + ResolveAccountService.new.call(acct) end def unsuspend! diff --git a/app/models/form/migration.rb b/app/models/form/migration.rb index b74987337..c2a8655e1 100644 --- a/app/models/form/migration.rb +++ b/app/models/form/migration.rb @@ -20,6 +20,6 @@ class Form::Migration private def set_account - self.account = (ResolveRemoteAccountService.new.call(acct) if account.nil? && acct.present?) + self.account = (ResolveAccountService.new.call(acct) if account.nil? && acct.present?) end end diff --git a/app/services/account_search_service.rb b/app/services/account_search_service.rb index 3be110665..3860a9cbd 100644 --- a/app/services/account_search_service.rb +++ b/app/services/account_search_service.rb @@ -18,7 +18,7 @@ class AccountSearchService < BaseService return [] if query_blank_or_hashtag? || limit < 1 if resolving_non_matching_remote_account? - [ResolveRemoteAccountService.new.call("#{query_username}@#{query_domain}")].compact + [ResolveAccountService.new.call("#{query_username}@#{query_domain}")].compact else search_results_and_exact_match.compact.uniq.slice(0, limit) end diff --git a/app/services/concerns/author_extractor.rb b/app/services/concerns/author_extractor.rb index c2366188a..1e00eb803 100644 --- a/app/services/concerns/author_extractor.rb +++ b/app/services/concerns/author_extractor.rb @@ -18,6 +18,6 @@ module AuthorExtractor acct = "#{username}@#{domain}" end - ResolveRemoteAccountService.new.call(acct, update_profile) + ResolveAccountService.new.call(acct, update_profile) end end diff --git a/app/services/follow_service.rb b/app/services/follow_service.rb index ac0207a0a..60a389afd 100644 --- a/app/services/follow_service.rb +++ b/app/services/follow_service.rb @@ -9,7 +9,7 @@ class FollowService < BaseService # @param [true, false, nil] reblogs Whether or not to show reblogs, defaults to true def call(source_account, uri, reblogs: nil) reblogs = true if reblogs.nil? - target_account = uri.is_a?(Account) ? uri : ResolveRemoteAccountService.new.call(uri) + target_account = uri.is_a?(Account) ? uri : ResolveAccountService.new.call(uri) raise ActiveRecord::RecordNotFound if target_account.nil? || target_account.id == source_account.id || target_account.suspended? raise Mastodon::NotPermittedError if target_account.blocking?(source_account) || source_account.blocking?(target_account) diff --git a/app/services/process_mentions_service.rb b/app/services/process_mentions_service.rb index 46401f298..8e285e1f7 100644 --- a/app/services/process_mentions_service.rb +++ b/app/services/process_mentions_service.rb @@ -16,7 +16,7 @@ class ProcessMentionsService < BaseService if mention_undeliverable?(status, mentioned_account) begin - mentioned_account = resolve_remote_account_service.call($1) + mentioned_account = resolve_account_service.call($1) rescue Goldfinger::Error, HTTP::Error mentioned_account = nil end @@ -63,7 +63,7 @@ class ProcessMentionsService < BaseService ).as_json).sign!(status.account)) end - def resolve_remote_account_service - ResolveRemoteAccountService.new + def resolve_account_service + ResolveAccountService.new end end diff --git a/app/services/resolve_account_service.rb b/app/services/resolve_account_service.rb new file mode 100644 index 000000000..fd6d30605 --- /dev/null +++ b/app/services/resolve_account_service.rb @@ -0,0 +1,208 @@ +# frozen_string_literal: true + +class ResolveAccountService < BaseService + include OStatus2::MagicKey + include JsonLdHelper + + DFRN_NS = 'http://purl.org/macgirvin/dfrn/1.0' + + # Find or create a local account for a remote user. + # When creating, look up the user's webfinger and fetch all + # important information from their feed + # @param [String] uri User URI in the form of username@domain + # @return [Account] + def call(uri, update_profile = true, redirected = nil) + @username, @domain = uri.split('@') + @update_profile = update_profile + + return Account.find_local(@username) if TagManager.instance.local_domain?(@domain) + + @account = Account.find_remote(@username, @domain) + + return @account unless webfinger_update_due? + + Rails.logger.debug "Looking up webfinger for #{uri}" + + @webfinger = Goldfinger.finger("acct:#{uri}") + + confirmed_username, confirmed_domain = @webfinger.subject.gsub(/\Aacct:/, '').split('@') + + if confirmed_username.casecmp(@username).zero? && confirmed_domain.casecmp(@domain).zero? + @username = confirmed_username + @domain = confirmed_domain + elsif redirected.nil? + return call("#{confirmed_username}@#{confirmed_domain}", update_profile, true) + else + Rails.logger.debug 'Requested and returned acct URIs do not match' + return + end + + return if links_missing? + return Account.find_local(@username) if TagManager.instance.local_domain?(@domain) + + RedisLock.acquire(lock_options) do |lock| + if lock.acquired? + @account = Account.find_remote(@username, @domain) + + if activitypub_ready? || @account&.activitypub? + handle_activitypub + else + handle_ostatus + end + end + end + + @account + rescue Goldfinger::Error => e + Rails.logger.debug "Webfinger query for #{uri} unsuccessful: #{e}" + nil + end + + private + + def links_missing? + !(activitypub_ready? || ostatus_ready?) + end + + def ostatus_ready? + !(@webfinger.link('http://schemas.google.com/g/2010#updates-from').nil? || + @webfinger.link('salmon').nil? || + @webfinger.link('http://webfinger.net/rel/profile-page').nil? || + @webfinger.link('magic-public-key').nil? || + canonical_uri.nil? || + hub_url.nil?) + end + + def webfinger_update_due? + @account.nil? || @account.possibly_stale? + end + + def activitypub_ready? + !@webfinger.link('self').nil? && + ['application/activity+json', 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"'].include?(@webfinger.link('self').type) && + !actor_json.nil? && + actor_json['inbox'].present? + end + + def handle_ostatus + create_account if @account.nil? + update_account + update_account_profile if update_profile? + end + + def update_profile? + @update_profile + end + + def handle_activitypub + return if actor_json.nil? + + @account = ActivityPub::ProcessAccountService.new.call(@username, @domain, actor_json) + rescue Oj::ParseError + nil + end + + def create_account + Rails.logger.debug "Creating new remote account for #{@username}@#{@domain}" + + @account = Account.new(username: @username, domain: @domain) + @account.suspended = true if auto_suspend? + @account.silenced = true if auto_silence? + @account.private_key = nil + end + + def update_account + @account.last_webfingered_at = Time.now.utc + @account.protocol = :ostatus + @account.remote_url = atom_url + @account.salmon_url = salmon_url + @account.url = url + @account.public_key = public_key + @account.uri = canonical_uri + @account.hub_url = hub_url + @account.save! + end + + def auto_suspend? + domain_block&.suspend? + end + + def auto_silence? + domain_block&.silence? + end + + def domain_block + return @domain_block if defined?(@domain_block) + @domain_block = DomainBlock.find_by(domain: @domain) + end + + def atom_url + @atom_url ||= @webfinger.link('http://schemas.google.com/g/2010#updates-from').href + end + + def salmon_url + @salmon_url ||= @webfinger.link('salmon').href + end + + def actor_url + @actor_url ||= @webfinger.link('self').href + end + + def url + @url ||= @webfinger.link('http://webfinger.net/rel/profile-page').href + end + + def public_key + @public_key ||= magic_key_to_pem(@webfinger.link('magic-public-key').href) + end + + def canonical_uri + return @canonical_uri if defined?(@canonical_uri) + + author_uri = atom.at_xpath('/xmlns:feed/xmlns:author/xmlns:uri') + + if author_uri.nil? + owner = atom.at_xpath('/xmlns:feed').at_xpath('./dfrn:owner', dfrn: DFRN_NS) + author_uri = owner.at_xpath('./xmlns:uri') unless owner.nil? + end + + @canonical_uri = author_uri.nil? ? nil : author_uri.content + end + + def hub_url + return @hub_url if defined?(@hub_url) + + hubs = atom.xpath('//xmlns:link[@rel="hub"]') + @hub_url = hubs.empty? || hubs.first['href'].nil? ? nil : hubs.first['href'] + end + + def atom_body + return @atom_body if defined?(@atom_body) + + response = Request.new(:get, atom_url).perform + + raise Mastodon::UnexpectedResponseError, response unless response.code == 200 + + @atom_body = response.to_s + end + + def actor_json + return @actor_json if defined?(@actor_json) + + json = fetch_resource(actor_url, false) + @actor_json = supported_context?(json) && json['type'] == 'Person' ? json : nil + end + + def atom + return @atom if defined?(@atom) + @atom = Nokogiri::XML(atom_body) + end + + def update_account_profile + RemoteProfileUpdateWorker.perform_async(@account.id, atom_body.force_encoding('UTF-8'), false) + end + + def lock_options + { redis: Redis.current, key: "resolve:#{@username}@#{@domain}" } + end +end diff --git a/app/services/resolve_remote_account_service.rb b/app/services/resolve_remote_account_service.rb deleted file mode 100644 index d7d0be210..000000000 --- a/app/services/resolve_remote_account_service.rb +++ /dev/null @@ -1,208 +0,0 @@ -# frozen_string_literal: true - -class ResolveRemoteAccountService < BaseService - include OStatus2::MagicKey - include JsonLdHelper - - DFRN_NS = 'http://purl.org/macgirvin/dfrn/1.0' - - # Find or create a local account for a remote user. - # When creating, look up the user's webfinger and fetch all - # important information from their feed - # @param [String] uri User URI in the form of username@domain - # @return [Account] - def call(uri, update_profile = true, redirected = nil) - @username, @domain = uri.split('@') - @update_profile = update_profile - - return Account.find_local(@username) if TagManager.instance.local_domain?(@domain) - - @account = Account.find_remote(@username, @domain) - - return @account unless webfinger_update_due? - - Rails.logger.debug "Looking up webfinger for #{uri}" - - @webfinger = Goldfinger.finger("acct:#{uri}") - - confirmed_username, confirmed_domain = @webfinger.subject.gsub(/\Aacct:/, '').split('@') - - if confirmed_username.casecmp(@username).zero? && confirmed_domain.casecmp(@domain).zero? - @username = confirmed_username - @domain = confirmed_domain - elsif redirected.nil? - return call("#{confirmed_username}@#{confirmed_domain}", update_profile, true) - else - Rails.logger.debug 'Requested and returned acct URIs do not match' - return - end - - return if links_missing? - return Account.find_local(@username) if TagManager.instance.local_domain?(@domain) - - RedisLock.acquire(lock_options) do |lock| - if lock.acquired? - @account = Account.find_remote(@username, @domain) - - if activitypub_ready? || @account&.activitypub? - handle_activitypub - else - handle_ostatus - end - end - end - - @account - rescue Goldfinger::Error => e - Rails.logger.debug "Webfinger query for #{uri} unsuccessful: #{e}" - nil - end - - private - - def links_missing? - !(activitypub_ready? || ostatus_ready?) - end - - def ostatus_ready? - !(@webfinger.link('http://schemas.google.com/g/2010#updates-from').nil? || - @webfinger.link('salmon').nil? || - @webfinger.link('http://webfinger.net/rel/profile-page').nil? || - @webfinger.link('magic-public-key').nil? || - canonical_uri.nil? || - hub_url.nil?) - end - - def webfinger_update_due? - @account.nil? || @account.possibly_stale? - end - - def activitypub_ready? - !@webfinger.link('self').nil? && - ['application/activity+json', 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"'].include?(@webfinger.link('self').type) && - !actor_json.nil? && - actor_json['inbox'].present? - end - - def handle_ostatus - create_account if @account.nil? - update_account - update_account_profile if update_profile? - end - - def update_profile? - @update_profile - end - - def handle_activitypub - return if actor_json.nil? - - @account = ActivityPub::ProcessAccountService.new.call(@username, @domain, actor_json) - rescue Oj::ParseError - nil - end - - def create_account - Rails.logger.debug "Creating new remote account for #{@username}@#{@domain}" - - @account = Account.new(username: @username, domain: @domain) - @account.suspended = true if auto_suspend? - @account.silenced = true if auto_silence? - @account.private_key = nil - end - - def update_account - @account.last_webfingered_at = Time.now.utc - @account.protocol = :ostatus - @account.remote_url = atom_url - @account.salmon_url = salmon_url - @account.url = url - @account.public_key = public_key - @account.uri = canonical_uri - @account.hub_url = hub_url - @account.save! - end - - def auto_suspend? - domain_block&.suspend? - end - - def auto_silence? - domain_block&.silence? - end - - def domain_block - return @domain_block if defined?(@domain_block) - @domain_block = DomainBlock.find_by(domain: @domain) - end - - def atom_url - @atom_url ||= @webfinger.link('http://schemas.google.com/g/2010#updates-from').href - end - - def salmon_url - @salmon_url ||= @webfinger.link('salmon').href - end - - def actor_url - @actor_url ||= @webfinger.link('self').href - end - - def url - @url ||= @webfinger.link('http://webfinger.net/rel/profile-page').href - end - - def public_key - @public_key ||= magic_key_to_pem(@webfinger.link('magic-public-key').href) - end - - def canonical_uri - return @canonical_uri if defined?(@canonical_uri) - - author_uri = atom.at_xpath('/xmlns:feed/xmlns:author/xmlns:uri') - - if author_uri.nil? - owner = atom.at_xpath('/xmlns:feed').at_xpath('./dfrn:owner', dfrn: DFRN_NS) - author_uri = owner.at_xpath('./xmlns:uri') unless owner.nil? - end - - @canonical_uri = author_uri.nil? ? nil : author_uri.content - end - - def hub_url - return @hub_url if defined?(@hub_url) - - hubs = atom.xpath('//xmlns:link[@rel="hub"]') - @hub_url = hubs.empty? || hubs.first['href'].nil? ? nil : hubs.first['href'] - end - - def atom_body - return @atom_body if defined?(@atom_body) - - response = Request.new(:get, atom_url).perform - - raise Mastodon::UnexpectedResponseError, response unless response.code == 200 - - @atom_body = response.to_s - end - - def actor_json - return @actor_json if defined?(@actor_json) - - json = fetch_resource(actor_url, false) - @actor_json = supported_context?(json) && json['type'] == 'Person' ? json : nil - end - - def atom - return @atom if defined?(@atom) - @atom = Nokogiri::XML(atom_body) - end - - def update_account_profile - RemoteProfileUpdateWorker.perform_async(@account.id, atom_body.force_encoding('UTF-8'), false) - end - - def lock_options - { redis: Redis.current, key: "resolve:#{@username}@#{@domain}" } - end -end diff --git a/app/workers/import/relationship_worker.rb b/app/workers/import/relationship_worker.rb index ed4c962c1..1dd8bf8fb 100644 --- a/app/workers/import/relationship_worker.rb +++ b/app/workers/import/relationship_worker.rb @@ -7,7 +7,7 @@ class Import::RelationshipWorker def perform(account_id, target_account_uri, relationship) from_account = Account.find(account_id) - target_account = ResolveRemoteAccountService.new.call(target_account_uri) + target_account = ResolveAccountService.new.call(target_account_uri) return if target_account.nil? diff --git a/app/workers/resolve_account_worker.rb b/app/workers/resolve_account_worker.rb new file mode 100644 index 000000000..cd7c4d7dd --- /dev/null +++ b/app/workers/resolve_account_worker.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +class ResolveAccountWorker + include Sidekiq::Worker + + sidekiq_options queue: 'pull', unique: :until_executed + + def perform(uri) + ResolveAccountService.new.call(uri) + end +end diff --git a/app/workers/resolve_remote_account_worker.rb b/app/workers/resolve_remote_account_worker.rb deleted file mode 100644 index 5dd84ccb6..000000000 --- a/app/workers/resolve_remote_account_worker.rb +++ /dev/null @@ -1,11 +0,0 @@ -# frozen_string_literal: true - -class ResolveRemoteAccountWorker - include Sidekiq::Worker - - sidekiq_options queue: 'pull', unique: :until_executed - - def perform(uri) - ResolveRemoteAccountService.new.call(uri) - end -end diff --git a/spec/controllers/authorize_follows_controller_spec.rb b/spec/controllers/authorize_follows_controller_spec.rb index 26e46a23c..b1cbef7ea 100644 --- a/spec/controllers/authorize_follows_controller_spec.rb +++ b/spec/controllers/authorize_follows_controller_spec.rb @@ -30,7 +30,7 @@ describe AuthorizeFollowsController do it 'renders error when account cant be found' do service = double - allow(ResolveRemoteAccountService).to receive(:new).and_return(service) + allow(ResolveAccountService).to receive(:new).and_return(service) allow(service).to receive(:call).with('missing@hostname').and_return(nil) get :show, params: { acct: 'acct:missing@hostname' } @@ -54,7 +54,7 @@ describe AuthorizeFollowsController do it 'sets account from acct uri' do account = Account.new service = double - allow(ResolveRemoteAccountService).to receive(:new).and_return(service) + allow(ResolveAccountService).to receive(:new).and_return(service) allow(service).to receive(:call).with('found@hostname').and_return(account) get :show, params: { acct: 'acct:found@hostname' } diff --git a/spec/controllers/settings/imports_controller_spec.rb b/spec/controllers/settings/imports_controller_spec.rb index 4810be701..59b10e0da 100644 --- a/spec/controllers/settings/imports_controller_spec.rb +++ b/spec/controllers/settings/imports_controller_spec.rb @@ -17,7 +17,7 @@ RSpec.describe Settings::ImportsController, type: :controller do describe 'POST #create' do it 'redirects to settings path with successful following import' do service = double(call: nil) - allow(ResolveRemoteAccountService).to receive(:new).and_return(service) + allow(ResolveAccountService).to receive(:new).and_return(service) post :create, params: { import: { type: 'following', @@ -30,7 +30,7 @@ RSpec.describe Settings::ImportsController, type: :controller do it 'redirects to settings path with successful blocking import' do service = double(call: nil) - allow(ResolveRemoteAccountService).to receive(:new).and_return(service) + allow(ResolveAccountService).to receive(:new).and_return(service) post :create, params: { import: { type: 'blocking', diff --git a/spec/models/account_spec.rb b/spec/models/account_spec.rb index 9c1492c90..a8b24d0e2 100644 --- a/spec/models/account_spec.rb +++ b/spec/models/account_spec.rb @@ -185,8 +185,8 @@ RSpec.describe Account, type: :model do expect(account.refresh!).to be_nil end - it 'calls not ResolveRemoteAccountService#call' do - expect_any_instance_of(ResolveRemoteAccountService).not_to receive(:call).with(acct) + it 'calls not ResolveAccountService#call' do + expect_any_instance_of(ResolveAccountService).not_to receive(:call).with(acct) account.refresh! end end @@ -194,8 +194,8 @@ RSpec.describe Account, type: :model do context 'domain is present' do let(:domain) { 'example.com' } - it 'calls ResolveRemoteAccountService#call' do - expect_any_instance_of(ResolveRemoteAccountService).to receive(:call).with(acct).once + it 'calls ResolveAccountService#call' do + expect_any_instance_of(ResolveAccountService).to receive(:call).with(acct).once account.refresh! end end diff --git a/spec/services/account_search_service_spec.rb b/spec/services/account_search_service_spec.rb index 4685e619f..9bb27edad 100644 --- a/spec/services/account_search_service_spec.rb +++ b/spec/services/account_search_service_spec.rb @@ -123,7 +123,7 @@ describe AccountSearchService do describe 'when there is a domain but no exact match' do it 'follows the remote account when resolve is true' do service = double(call: nil) - allow(ResolveRemoteAccountService).to receive(:new).and_return(service) + allow(ResolveAccountService).to receive(:new).and_return(service) results = subject.call('newuser@remote.com', 10, nil, resolve: true) expect(service).to have_received(:call).with('newuser@remote.com') @@ -131,7 +131,7 @@ describe AccountSearchService do it 'does not follow the remote account when resolve is false' do service = double(call: nil) - allow(ResolveRemoteAccountService).to receive(:new).and_return(service) + allow(ResolveAccountService).to receive(:new).and_return(service) results = subject.call('newuser@remote.com', 10, nil, resolve: false) expect(service).not_to have_received(:call) diff --git a/spec/services/resolve_account_service_spec.rb b/spec/services/resolve_account_service_spec.rb new file mode 100644 index 000000000..5f1b4467b --- /dev/null +++ b/spec/services/resolve_account_service_spec.rb @@ -0,0 +1,133 @@ +require 'rails_helper' + +RSpec.describe ResolveAccountService do + subject { described_class.new } + + before do + stub_request(:get, "https://quitter.no/.well-known/host-meta").to_return(request_fixture('.host-meta.txt')) + stub_request(:get, "https://example.com/.well-known/webfinger?resource=acct:catsrgr8@example.com").to_return(status: 404) + stub_request(:get, "https://redirected.com/.well-known/host-meta").to_return(request_fixture('redirected.host-meta.txt')) + stub_request(:get, "https://example.com/.well-known/host-meta").to_return(status: 404) + stub_request(:get, "https://quitter.no/.well-known/webfinger?resource=acct:gargron@quitter.no").to_return(request_fixture('webfinger.txt')) + stub_request(:get, "https://redirected.com/.well-known/webfinger?resource=acct:gargron@redirected.com").to_return(request_fixture('webfinger.txt')) + stub_request(:get, "https://redirected.com/.well-known/webfinger?resource=acct:hacker1@redirected.com").to_return(request_fixture('webfinger-hacker1.txt')) + stub_request(:get, "https://redirected.com/.well-known/webfinger?resource=acct:hacker2@redirected.com").to_return(request_fixture('webfinger-hacker2.txt')) + stub_request(:get, "https://quitter.no/.well-known/webfinger?resource=acct:catsrgr8@quitter.no").to_return(status: 404) + stub_request(:get, "https://quitter.no/api/statuses/user_timeline/7477.atom").to_return(request_fixture('feed.txt')) + stub_request(:get, "https://quitter.no/avatar/7477-300-20160211190340.png").to_return(request_fixture('avatar.txt')) + stub_request(:get, "https://localdomain.com/.well-known/host-meta").to_return(request_fixture('localdomain-hostmeta.txt')) + stub_request(:get, "https://localdomain.com/.well-known/webfinger?resource=acct:foo@localdomain.com").to_return(status: 404) + stub_request(:get, "https://webdomain.com/.well-known/webfinger?resource=acct:foo@localdomain.com").to_return(request_fixture('localdomain-webfinger.txt')) + stub_request(:get, "https://webdomain.com/users/foo.atom").to_return(request_fixture('localdomain-feed.txt')) + end + + it 'raises error if no such user can be resolved via webfinger' do + expect(subject.call('catsrgr8@quitter.no')).to be_nil + end + + it 'raises error if the domain does not have webfinger' do + expect(subject.call('catsrgr8@example.com')).to be_nil + end + + it 'prevents hijacking existing accounts' do + account = subject.call('hacker1@redirected.com') + expect(account.salmon_url).to_not eq 'https://hacker.com/main/salmon/user/7477' + end + + it 'prevents hijacking inexisting accounts' do + expect(subject.call('hacker2@redirected.com')).to be_nil + end + + context 'with an OStatus account' do + it 'returns an already existing remote account' do + old_account = Fabricate(:account, username: 'gargron', domain: 'quitter.no') + returned_account = subject.call('gargron@quitter.no') + + expect(old_account.id).to eq returned_account.id + end + + it 'returns a new remote account' do + account = subject.call('gargron@quitter.no') + + expect(account.username).to eq 'gargron' + expect(account.domain).to eq 'quitter.no' + expect(account.remote_url).to eq 'https://quitter.no/api/statuses/user_timeline/7477.atom' + end + + it 'follows a legitimate account redirection' do + account = subject.call('gargron@redirected.com') + + expect(account.username).to eq 'gargron' + expect(account.domain).to eq 'quitter.no' + expect(account.remote_url).to eq 'https://quitter.no/api/statuses/user_timeline/7477.atom' + end + + it 'returns a new remote account' do + account = subject.call('foo@localdomain.com') + + expect(account.username).to eq 'foo' + expect(account.domain).to eq 'localdomain.com' + expect(account.remote_url).to eq 'https://webdomain.com/users/foo.atom' + end + end + + context 'with an ActivityPub account' do + before do + stub_request(:get, "https://ap.example.com/.well-known/webfinger?resource=acct:foo@ap.example.com").to_return(request_fixture('activitypub-webfinger.txt')) + stub_request(:get, "https://ap.example.com/users/foo").to_return(request_fixture('activitypub-actor.txt')) + stub_request(:get, "https://ap.example.com/users/foo.atom").to_return(request_fixture('activitypub-feed.txt')) + stub_request(:get, %r{https://ap.example.com/users/foo/\w+}).to_return(status: 404) + end + + it 'fallback to OStatus if actor json could not be fetched' do + stub_request(:get, "https://ap.example.com/users/foo").to_return(status: 404) + + account = subject.call('foo@ap.example.com') + + expect(account.ostatus?).to eq true + expect(account.remote_url).to eq 'https://ap.example.com/users/foo.atom' + end + + it 'fallback to OStatus if actor json did not have inbox_url' do + stub_request(:get, "https://ap.example.com/users/foo").to_return(request_fixture('activitypub-actor-noinbox.txt')) + + account = subject.call('foo@ap.example.com') + + expect(account.ostatus?).to eq true + expect(account.remote_url).to eq 'https://ap.example.com/users/foo.atom' + end + + it 'returns new remote account' do + account = subject.call('foo@ap.example.com') + + expect(account.activitypub?).to eq true + expect(account.domain).to eq 'ap.example.com' + expect(account.inbox_url).to eq 'https://ap.example.com/users/foo/inbox' + end + + pending + end + + it 'processes one remote account at a time using locks' do + wait_for_start = true + fail_occurred = false + return_values = [] + + threads = Array.new(5) do + Thread.new do + true while wait_for_start + begin + return_values << described_class.new.call('foo@localdomain.com') + rescue ActiveRecord::RecordNotUnique + fail_occurred = true + end + end + end + + wait_for_start = false + threads.each(&:join) + + expect(fail_occurred).to be false + expect(return_values).to_not include(nil) + end +end diff --git a/spec/services/resolve_remote_account_service_spec.rb b/spec/services/resolve_remote_account_service_spec.rb deleted file mode 100644 index d0bb6a137..000000000 --- a/spec/services/resolve_remote_account_service_spec.rb +++ /dev/null @@ -1,133 +0,0 @@ -require 'rails_helper' - -RSpec.describe ResolveRemoteAccountService do - subject { described_class.new } - - before do - stub_request(:get, "https://quitter.no/.well-known/host-meta").to_return(request_fixture('.host-meta.txt')) - stub_request(:get, "https://example.com/.well-known/webfinger?resource=acct:catsrgr8@example.com").to_return(status: 404) - stub_request(:get, "https://redirected.com/.well-known/host-meta").to_return(request_fixture('redirected.host-meta.txt')) - stub_request(:get, "https://example.com/.well-known/host-meta").to_return(status: 404) - stub_request(:get, "https://quitter.no/.well-known/webfinger?resource=acct:gargron@quitter.no").to_return(request_fixture('webfinger.txt')) - stub_request(:get, "https://redirected.com/.well-known/webfinger?resource=acct:gargron@redirected.com").to_return(request_fixture('webfinger.txt')) - stub_request(:get, "https://redirected.com/.well-known/webfinger?resource=acct:hacker1@redirected.com").to_return(request_fixture('webfinger-hacker1.txt')) - stub_request(:get, "https://redirected.com/.well-known/webfinger?resource=acct:hacker2@redirected.com").to_return(request_fixture('webfinger-hacker2.txt')) - stub_request(:get, "https://quitter.no/.well-known/webfinger?resource=acct:catsrgr8@quitter.no").to_return(status: 404) - stub_request(:get, "https://quitter.no/api/statuses/user_timeline/7477.atom").to_return(request_fixture('feed.txt')) - stub_request(:get, "https://quitter.no/avatar/7477-300-20160211190340.png").to_return(request_fixture('avatar.txt')) - stub_request(:get, "https://localdomain.com/.well-known/host-meta").to_return(request_fixture('localdomain-hostmeta.txt')) - stub_request(:get, "https://localdomain.com/.well-known/webfinger?resource=acct:foo@localdomain.com").to_return(status: 404) - stub_request(:get, "https://webdomain.com/.well-known/webfinger?resource=acct:foo@localdomain.com").to_return(request_fixture('localdomain-webfinger.txt')) - stub_request(:get, "https://webdomain.com/users/foo.atom").to_return(request_fixture('localdomain-feed.txt')) - end - - it 'raises error if no such user can be resolved via webfinger' do - expect(subject.call('catsrgr8@quitter.no')).to be_nil - end - - it 'raises error if the domain does not have webfinger' do - expect(subject.call('catsrgr8@example.com')).to be_nil - end - - it 'prevents hijacking existing accounts' do - account = subject.call('hacker1@redirected.com') - expect(account.salmon_url).to_not eq 'https://hacker.com/main/salmon/user/7477' - end - - it 'prevents hijacking inexisting accounts' do - expect(subject.call('hacker2@redirected.com')).to be_nil - end - - context 'with an OStatus account' do - it 'returns an already existing remote account' do - old_account = Fabricate(:account, username: 'gargron', domain: 'quitter.no') - returned_account = subject.call('gargron@quitter.no') - - expect(old_account.id).to eq returned_account.id - end - - it 'returns a new remote account' do - account = subject.call('gargron@quitter.no') - - expect(account.username).to eq 'gargron' - expect(account.domain).to eq 'quitter.no' - expect(account.remote_url).to eq 'https://quitter.no/api/statuses/user_timeline/7477.atom' - end - - it 'follows a legitimate account redirection' do - account = subject.call('gargron@redirected.com') - - expect(account.username).to eq 'gargron' - expect(account.domain).to eq 'quitter.no' - expect(account.remote_url).to eq 'https://quitter.no/api/statuses/user_timeline/7477.atom' - end - - it 'returns a new remote account' do - account = subject.call('foo@localdomain.com') - - expect(account.username).to eq 'foo' - expect(account.domain).to eq 'localdomain.com' - expect(account.remote_url).to eq 'https://webdomain.com/users/foo.atom' - end - end - - context 'with an ActivityPub account' do - before do - stub_request(:get, "https://ap.example.com/.well-known/webfinger?resource=acct:foo@ap.example.com").to_return(request_fixture('activitypub-webfinger.txt')) - stub_request(:get, "https://ap.example.com/users/foo").to_return(request_fixture('activitypub-actor.txt')) - stub_request(:get, "https://ap.example.com/users/foo.atom").to_return(request_fixture('activitypub-feed.txt')) - stub_request(:get, %r{https://ap.example.com/users/foo/\w+}).to_return(status: 404) - end - - it 'fallback to OStatus if actor json could not be fetched' do - stub_request(:get, "https://ap.example.com/users/foo").to_return(status: 404) - - account = subject.call('foo@ap.example.com') - - expect(account.ostatus?).to eq true - expect(account.remote_url).to eq 'https://ap.example.com/users/foo.atom' - end - - it 'fallback to OStatus if actor json did not have inbox_url' do - stub_request(:get, "https://ap.example.com/users/foo").to_return(request_fixture('activitypub-actor-noinbox.txt')) - - account = subject.call('foo@ap.example.com') - - expect(account.ostatus?).to eq true - expect(account.remote_url).to eq 'https://ap.example.com/users/foo.atom' - end - - it 'returns new remote account' do - account = subject.call('foo@ap.example.com') - - expect(account.activitypub?).to eq true - expect(account.domain).to eq 'ap.example.com' - expect(account.inbox_url).to eq 'https://ap.example.com/users/foo/inbox' - end - - pending - end - - it 'processes one remote account at a time using locks' do - wait_for_start = true - fail_occurred = false - return_values = [] - - threads = Array.new(5) do - Thread.new do - true while wait_for_start - begin - return_values << described_class.new.call('foo@localdomain.com') - rescue ActiveRecord::RecordNotUnique - fail_occurred = true - end - end - end - - wait_for_start = false - threads.each(&:join) - - expect(fail_occurred).to be false - expect(return_values).to_not include(nil) - end -end -- cgit From 69f13e7bca90f4855e05a49dd69bba66f843134a Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 23 Jan 2018 05:06:29 +0100 Subject: Fix regression from #6199: Make entire column header clickable (#6334) --- app/javascript/styles/mastodon/components.scss | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'app') diff --git a/app/javascript/styles/mastodon/components.scss b/app/javascript/styles/mastodon/components.scss index 55cb40c32..bfca34f4d 100644 --- a/app/javascript/styles/mastodon/components.scss +++ b/app/javascript/styles/mastodon/components.scss @@ -2393,7 +2393,6 @@ .column-header { display: flex; - padding: 15px; font-size: 16px; background: lighten($ui-base-color, 4%); flex: 0 0 auto; @@ -2408,7 +2407,7 @@ flex: auto; margin: 0; border: none; - padding: 0; + padding: 15px; color: inherit; background: transparent; font: inherit; @@ -2433,7 +2432,6 @@ .column-header__buttons { height: 48px; display: flex; - margin: -15px; margin-left: 0; } -- cgit From 2fc27250769f3bd3c12fb0eb89ed4131aa2ead3b Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 23 Jan 2018 14:30:28 +0100 Subject: Fix e-mail icon for reblog being stretched (#6336) --- app/javascript/images/mailer/icon_cached.png | Bin 754 -> 582 bytes 1 file changed, 0 insertions(+), 0 deletions(-) (limited to 'app') diff --git a/app/javascript/images/mailer/icon_cached.png b/app/javascript/images/mailer/icon_cached.png index e62c064c8..210833d34 100644 Binary files a/app/javascript/images/mailer/icon_cached.png and b/app/javascript/images/mailer/icon_cached.png differ -- cgit From 4ec9d8b4d9b58766b7356d3173e9cdebf2dbae15 Mon Sep 17 00:00:00 2001 From: ThibG Date: Tue, 23 Jan 2018 14:31:31 +0100 Subject: Display deleted users' role as “Suspended” (#6339) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Follow-up to 6eb60260b1b771e8cd42d3b58b82b2781a067991 which missed a spot where the same error occurs. --- app/views/admin/accounts/show.html.haml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'app') diff --git a/app/views/admin/accounts/show.html.haml b/app/views/admin/accounts/show.html.haml index 5f5d0995c..dbbf5fc09 100644 --- a/app/views/admin/accounts/show.html.haml +++ b/app/views/admin/accounts/show.html.haml @@ -18,7 +18,10 @@ %tr %th= t('admin.accounts.role') %td - = t("admin.accounts.roles.#{@account.user&.role}") + - if @account.user.nil? + = t("admin.accounts.moderation.suspended") + - else + = t("admin.accounts.roles.#{@account.user&.role}") = table_link_to 'angle-double-up', t('admin.accounts.promote'), promote_admin_account_role_path(@account.id), method: :post, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:promote, @account.user) = table_link_to 'angle-double-down', t('admin.accounts.demote'), demote_admin_account_role_path(@account.id), method: :post, data: { confirm: t('admin.accounts.are_you_sure') } if can?(:demote, @account.user) %tr -- cgit From 1cc44cba81ee7e020f4db58e6b1e6821f47a9641 Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Tue, 23 Jan 2018 20:52:30 +0100 Subject: Fix #6331 (#6341) UserTrackingConcern is circumvented by SessionsController#create because it calls warden, which calls the User#update_tracked_fields! method directly. Move returning user logic to that method. --- app/controllers/concerns/user_tracking_concern.rb | 16 --------------- app/models/user.rb | 25 ++++++++++++++++++++--- 2 files changed, 22 insertions(+), 19 deletions(-) (limited to 'app') diff --git a/app/controllers/concerns/user_tracking_concern.rb b/app/controllers/concerns/user_tracking_concern.rb index a2510e55f..be10705fc 100644 --- a/app/controllers/concerns/user_tracking_concern.rb +++ b/app/controllers/concerns/user_tracking_concern.rb @@ -3,7 +3,6 @@ module UserTrackingConcern extend ActiveSupport::Concern - REGENERATE_FEED_DAYS = 14 UPDATE_SIGN_IN_HOURS = 24 included do @@ -14,25 +13,10 @@ module UserTrackingConcern def set_user_activity return unless user_needs_sign_in_update? - - # Mark as signed-in today current_user.update_tracked_fields!(request) - ActivityTracker.record('activity:logins', current_user.id) - - # Regenerate feed if needed - regenerate_feed! if user_needs_feed_update? end def user_needs_sign_in_update? user_signed_in? && (current_user.current_sign_in_at.nil? || current_user.current_sign_in_at < UPDATE_SIGN_IN_HOURS.hours.ago) end - - def user_needs_feed_update? - current_user.last_sign_in_at < REGENERATE_FEED_DAYS.days.ago - end - - def regenerate_feed! - Redis.current.setnx("account:#{current_user.account_id}:regeneration", true) && Redis.current.expire("account:#{current_user.account_id}:regeneration", 1.day.seconds) - RegenerationWorker.perform_async(current_user.account_id) - end end diff --git a/app/models/user.rb b/app/models/user.rb index f6a533f84..40c298b1a 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -129,7 +129,7 @@ class User < ApplicationRecord new_user = !confirmed? super - update_statistics! if new_user + prepare_new_user! if new_user end def confirm! @@ -137,7 +137,12 @@ class User < ApplicationRecord skip_confirmation! save! - update_statistics! if new_user + prepare_new_user! if new_user + end + + def update_tracked_fields!(request) + super + prepare_returning_user! end def promote! @@ -220,9 +225,23 @@ class User < ApplicationRecord filtered_languages.reject!(&:blank?) end - def update_statistics! + def prepare_new_user! BootstrapTimelineWorker.perform_async(account_id) ActivityTracker.increment('activity:accounts:local') UserMailer.welcome(self).deliver_later end + + def prepare_returning_user! + ActivityTracker.record('activity:logins', id) + regenerate_feed! if needs_feed_update? + end + + def regenerate_feed! + Redis.current.setnx("account:#{account_id}:regeneration", true) && Redis.current.expire("account:#{account_id}:regeneration", 1.day.seconds) + RegenerationWorker.perform_async(account_id) + end + + def needs_feed_update? + last_sign_in_at < ACTIVE_DURATION.ago + end end -- cgit From daefbd66a653b11a17be73b7b0a4ca200b466cec Mon Sep 17 00:00:00 2001 From: Eugen Rochko Date: Wed, 24 Jan 2018 04:03:51 +0100 Subject: Fix style of legacy column headers (#6342) * Fix regression from #6199: Style of legacy column headers * Fix tests * Clean up variables --- .../features/ui/components/__tests__/column-test.js | 4 ++-- .../mastodon/features/ui/components/column_header.js | 20 +++++++++++--------- 2 files changed, 13 insertions(+), 11 deletions(-) (limited to 'app') diff --git a/app/javascript/mastodon/features/ui/components/__tests__/column-test.js b/app/javascript/mastodon/features/ui/components/__tests__/column-test.js index 1e5e1d8dc..11cc1b6e8 100644 --- a/app/javascript/mastodon/features/ui/components/__tests__/column-test.js +++ b/app/javascript/mastodon/features/ui/components/__tests__/column-test.js @@ -21,13 +21,13 @@ describe('', () => {
); - wrapper.find(ColumnHeader).simulate('click'); + wrapper.find(ColumnHeader).find('button').simulate('click'); expect(global.requestAnimationFrame.mock.calls.length).toEqual(1); }); it('does not try to scroll if there is no scrollable content', () => { const wrapper = mount(); - wrapper.find(ColumnHeader).simulate('click'); + wrapper.find(ColumnHeader).find('button').simulate('click'); expect(global.requestAnimationFrame.mock.calls.length).toEqual(0); }); }); diff --git a/app/javascript/mastodon/features/ui/components/column_header.js b/app/javascript/mastodon/features/ui/components/column_header.js index fdf9aab1a..e8bdd8054 100644 --- a/app/javascript/mastodon/features/ui/components/column_header.js +++ b/app/javascript/mastodon/features/ui/components/column_header.js @@ -1,5 +1,6 @@ import React from 'react'; import PropTypes from 'prop-types'; +import classNames from 'classnames'; export default class ColumnHeader extends React.PureComponent { @@ -16,19 +17,20 @@ export default class ColumnHeader extends React.PureComponent { } render () { - const { type, active, columnHeaderId } = this.props; + const { icon, type, active, columnHeaderId } = this.props; + let iconElement = ''; - let icon = ''; - - if (this.props.icon) { - icon = ; + if (icon) { + iconElement = ; } return ( -
- {icon} - {type} -
+

+ +

); } -- cgit From 7650506b39dd3821811b8eecaddb08d461d926c0 Mon Sep 17 00:00:00 2001 From: Quenty31 <33203663+Quenty31@users.noreply.github.com> Date: Wed, 24 Jan 2018 13:29:03 +0100 Subject: l10n Occitan language update (#6346) * Small changes * update for email templates * Digest changed * Update oc.yml waiting to finish * Update oc.yml * Update oc.yml * Update oc.yml * Update oc.json --- app/javascript/mastodon/locales/oc.json | 52 ++++++++++++++++----------------- config/locales/devise.oc.yml | 33 ++++++++++++++++----- config/locales/oc.yml | 42 ++++++++++++++++++++++---- config/locales/simple_form.oc.yml | 2 +- 4 files changed, 88 insertions(+), 41 deletions(-) (limited to 'app') diff --git a/app/javascript/mastodon/locales/oc.json b/app/javascript/mastodon/locales/oc.json index f7da5d92b..104ba48c5 100644 --- a/app/javascript/mastodon/locales/oc.json +++ b/app/javascript/mastodon/locales/oc.json @@ -1,13 +1,13 @@ { "account.block": "Blocar @{name}", "account.block_domain": "Tot amagar del domeni {domain}", - "account.disclaimer_full": "Aquelas informacions de perfil pòdon èsser incompletas.", + "account.disclaimer_full": "Aquelas informacions de perfil pòdon èsser incomplètas.", "account.edit_profile": "Modificar lo perfil", "account.follow": "Sègre", "account.followers": "Seguidors", "account.follows": "Abonaments", "account.follows_you": "Vos sèc", - "account.hide_reblogs": "Rescondre los partages de @{name}", + "account.hide_reblogs": "Rescondre los partatges de @{name}", "account.media": "Mèdias", "account.mention": "Mencionar @{name}", "account.moved_to": "{name} a mudat los catons a :", @@ -17,13 +17,13 @@ "account.report": "Senhalar @{name}", "account.requested": "Invitacion mandada. Clicatz per anullar", "account.share": "Partejar lo perfil a @{name}", - "account.show_reblogs": "Mostrar los partages de @{name}", + "account.show_reblogs": "Mostrar los partatges de @{name}", "account.unblock": "Desblocar @{name}", "account.unblock_domain": "Desblocar {domain}", "account.unfollow": "Quitar de sègre", "account.unmute": "Quitar de rescondre @{name}", "account.unmute_notifications": "Mostrar las notificacions de @{name}", - "account.view_full_profile": "Veire lo perfil complet", + "account.view_full_profile": "Veire lo perfil complèt", "boost_modal.combo": "Podètz botar {combo} per passar aquò lo còp que ven", "bundle_column_error.body": "Quicòm a fach mèuca pendent lo cargament d’aqueste compausant.", "bundle_column_error.retry": "Tornar ensajar", @@ -67,7 +67,7 @@ "confirmations.delete_list.confirm": "Suprimir", "confirmations.delete_list.message": "Sètz segur de voler suprimir aquesta lista per totjorn ?", "confirmations.domain_block.confirm": "Amagar tot lo domeni", - "confirmations.domain_block.message": "Sètz segur segur de voler blocar completament {domain} ? De còps cal pas que blocar o rescondre unas personas solament.", + "confirmations.domain_block.message": "Sètz segur segur de voler blocar complètament {domain} ? De còps cal pas que blocar o rescondre unas personas solament.", "confirmations.mute.confirm": "Rescondre", "confirmations.mute.message": "Sètz segur de voler rescondre {name} ?", "confirmations.unfollow.confirm": "Quitar de sègre", @@ -80,7 +80,7 @@ "emoji_button.food": "Beure e manjar", "emoji_button.label": "Inserir un emoji", "emoji_button.nature": "Natura", - "emoji_button.not_found": "Cap emoji ! (╯°□°)╯︵ ┻━┻", + "emoji_button.not_found": "Cap d’emoji ! (╯°□°)╯︵ ┻━┻", "emoji_button.objects": "Objèctes", "emoji_button.people": "Gents", "emoji_button.recent": "Sovent utilizats", @@ -108,23 +108,23 @@ "home.column_settings.show_reblogs": "Mostrar los partatges", "home.column_settings.show_replies": "Mostrar las responsas", "home.settings": "Paramètres de la colomna", - "keyboard_shortcuts.back": "per anar enrèire", - "keyboard_shortcuts.boost": "per partejar", - "keyboard_shortcuts.column": "per centrar un estatut a una colomna", - "keyboard_shortcuts.compose": "per anar al camp tèxte", + "keyboard_shortcuts.back": "anar enrèire", + "keyboard_shortcuts.boost": "partejar", + "keyboard_shortcuts.column": "centrar un estatut a una colomna", + "keyboard_shortcuts.compose": "anar al camp tèxte", "keyboard_shortcuts.description": "Descripcion", - "keyboard_shortcuts.down": "per far davalar dins la lista", - "keyboard_shortcuts.enter": "per dobrir los estatuts", - "keyboard_shortcuts.favourite": "per apondre als favorits", + "keyboard_shortcuts.down": "far davalar dins la lista", + "keyboard_shortcuts.enter": "dobrir los estatuts", + "keyboard_shortcuts.favourite": "apondre als favorits", "keyboard_shortcuts.heading": "Acorchis clavièr", "keyboard_shortcuts.hotkey": "Acorchis", - "keyboard_shortcuts.legend": "per mostrar aquesta legenda", - "keyboard_shortcuts.mention": "per mencionar l’autor", - "keyboard_shortcuts.reply": "per respondre", - "keyboard_shortcuts.search": "per anar a la recèrca", - "keyboard_shortcuts.toot": "per començar un estatut tot novèl", - "keyboard_shortcuts.unfocus": "per quitar lo camp tèxte/de recèrca", - "keyboard_shortcuts.up": "per far montar dins la lista", + "keyboard_shortcuts.legend": "mostrar aquesta legenda", + "keyboard_shortcuts.mention": "mencionar l’autor", + "keyboard_shortcuts.reply": "respondre", + "keyboard_shortcuts.search": "anar a la recèrca", + "keyboard_shortcuts.toot": "començar un estatut tot novèl", + "keyboard_shortcuts.unfocus": "quitar lo camp tèxte/de recèrca", + "keyboard_shortcuts.up": "far montar dins la lista", "lightbox.close": "Tampar", "lightbox.next": "Seguent", "lightbox.previous": "Precedent", @@ -175,8 +175,8 @@ "onboarding.page_four.home": "Lo flux d’acuèlh mòstra los estatuts del mond que seguètz.", "onboarding.page_four.notifications": "La colomna de notificacions vos fa veire quand qualqu’un interagís amb vos.", "onboarding.page_one.federation": "Mastodon es un malhum de servidors independents que comunican per construire un malhum mai larg. Òm los apèla instàncias.", - "onboarding.page_one.full_handle": "Your full handle", - "onboarding.page_one.handle_hint": "This is what you would tell your friends to search for.", + "onboarding.page_one.full_handle": "Vòstre escais-nom complèt", + "onboarding.page_one.handle_hint": "Vos cal dire a vòstres amics de cercar aquò.", "onboarding.page_one.welcome": "Benvengut a Mastodon !", "onboarding.page_six.admin": "Vòstre administrator d’instància es {admin}.", "onboarding.page_six.almost_done": "Gaireben acabat…", @@ -187,7 +187,7 @@ "onboarding.page_six.read_guidelines": "Mercés de legir la {guidelines} de {domain} !", "onboarding.page_six.various_app": "aplicacions per mobil", "onboarding.page_three.profile": "Modificatz vòstre perfil per cambiar vòstre avatar, bio e escais-nom. I a enlà totas las preferéncias.", - "onboarding.page_three.search": "Emplegatz la barra de recèrca per trobar de mond e engachatz las etiquetas coma {illustration} e {introductions}. Per trobar una persona d’una autra instància, picatz son identificant complet.", + "onboarding.page_three.search": "Emplegatz la barra de recèrca per trobar de mond e engachatz las etiquetas coma {illustration} e {introductions}. Per trobar una persona d’una autra instància, picatz son identificant complèt.", "onboarding.page_two.compose": "Escrivètz un estatut dempuèi la colomna per compausar. Podètz mandar un imatge, cambiar la confidencialitat e ajustar un avertiment amb las icònas cai-jos.", "onboarding.skip": "Passar", "privacy.change": "Ajustar la confidencialitat del messatge", @@ -199,8 +199,8 @@ "privacy.public.short": "Public", "privacy.unlisted.long": "Mostrar pas dins los fluxes publics", "privacy.unlisted.short": "Pas-listat", - "regeneration_indicator.label": "Loading…", - "regeneration_indicator.sublabel": "Your home feed is being prepared!", + "regeneration_indicator.label": "Cargament…", + "regeneration_indicator.sublabel": "Sèm a preparar vòstre flux d’acuèlh !", "relative_time.days": "fa {number} d", "relative_time.hours": "fa {number} h", "relative_time.just_now": "ara", @@ -257,7 +257,7 @@ "video.close": "Tampar la vidèo", "video.exit_fullscreen": "Sortir plen ecran", "video.expand": "Agrandir la vidèo", - "video.fullscreen": "Ecran complet", + "video.fullscreen": "Ecran complèt", "video.hide": "Amagar la vidèo", "video.mute": "Copar lo son", "video.pause": "Pausa", diff --git a/config/locales/devise.oc.yml b/config/locales/devise.oc.yml index de87ac1e2..bd2437f3f 100644 --- a/config/locales/devise.oc.yml +++ b/config/locales/devise.oc.yml @@ -17,28 +17,45 @@ oc: unconfirmed: Vos cal confirmar vòstra adreça de corrièl abans de contunhar. mailer: confirmation_instructions: - subject: Mercés de confirmar vòstra inscripcion sus %{instance} + action: Verificar l’adreça de corrièl + explanation: Venètz de crear un compte sus %{host} amb aquesta adreça de corrièl. Vos manca pas qu’un clic per l’activar. S’èra pas vosautre mercés de far pas cas a aqueste messatge. + extra_html: Pensatz tanben de gaitar las règlas de l’instància e nòstres tèrmes e condicions d’utilizacion. + subject: 'Mastodon : consignas de confirmacion per %{instance}' + title: Verificatz l’adreça de corrièl email_changed: + explanation: 'L’adreça per aqueste compte es ara :' + extra: S’avètz pas demandat aqueste cambiament d’adreça, poiriá arribar que qualqu’un mai aguèsse agut accès a vòstre compte. Mercés de cambiar sulpic vòstre senhal o de contactar vòstre administrator d’instància se l’accès a vòstre compte vos es barrat. subject: 'Mastodon : corrièl cambiat' + title: Nòva adreça de corrièl password_change: + explanation: Lo senhal per vòstre compte a cambiat. + extra: S’avètz pas demandat aqueste cambiament de senhal, poiriá arribar que qualqu’un mai aguèsse agut accès a vòstre compte. Mercés de cambiar sulpic vòstre senhal o de contactar vòstre administrator d’instància se l’accès a vòstre compte vos es barrat. subject: Mastodon : senhal cambiat + title: Senhal cambiat reconfirmation_instructions: - subject: 'Mastodon : Confirmatz l’adreça per %{instance}' + explanation: Confirmar la nòva adreça per cambiar lo corrièl. + extra: S’avètz pas res demandat, fasquètz pas cas a aqueste corrièl. Vòstre corrièl per Mastodon cambiarà pas se clicatz pas lo ligam dessús. + subject: 'Mastodon : confirmatz l’adreça per %{instance}' + title: Verificatz l’adreça de corrièl reset_password_instructions: - subject: Mastodon : instruccions per reïnicializar lo senhal + action: Cambiament de senhal + explanation: Avètz demandat un nòu senhal per vòstre compte + extra: S’avètz pas res demandat, fasquètz pas cas a aqueste corrièl. Vòstre senhal cambiarà pas se clicatz pas lo ligam e que ne causissètz pas un novèl. + subject: Mastodon : consignas per reïnicializar lo senhal + title: Reïnicializacion del senhal unlock_instructions: - subject: Mastodon : instuccions de desblocatge + subject: Mastodon : consignas de desblocatge omniauth_callbacks: failure: Fracàs al moment de vos autentificar de %{kind} perque "%{reason}". success: Sètz ben autentificat dempuèi lo compte %{kind}. passwords: no_token: Podètz pas accedir a aquesta pagina sens venir d’un corriel de reïnicializacion de senhal. S’es lo cas, mercés de verificar qu’avètz ben utilizat l’URL donada de manièra complèta. - send_instructions: Recebretz un corrièl amb las instruccions per reĩnicializar vòstre senhal dins una estona. Mercés de verificar tanben vòstre dorsièr de corrièls indesirables. + send_instructions: Recebretz un corrièl amb las consignas per reĩnicializar vòstre senhal dins una estona. Mercés de verificar tanben vòstre dorsièr de corrièls indesirables. send_paranoid_instructions: Se vòstra adreça de corrièl existís dins nòstra basa de donadas, recebretz un ligam per reĩnicializar vòstre senhal dins una estona. Mercés de verificar tanben vòstre dorsièr de corrièls indesirables. updated: Vòstre senhal es ben estat cambiat. Sètz ara connectat. updated_not_active: Vòstre senhal es ben estat cambiat. registrations: - destroyed: Adiu ! Vòstra inscripcion es estada anullada amb succès. Esperem vos tornar veire lèu. + destroyed: Adieu-siatz ! Vòstra inscripcion es estada anullada amb succès. Esperem vos tornar veire lèu. signed_up: La benvenguda ! Sètz ben marcat al malhum. signed_up_but_inactive: Sètz ben marcat. Pasmens, avèm pas pogut vos connectar perque vòstre compte es pas encara validat. signed_up_but_locked: Sètz ben marcat. Pasmens, avèm pas pogut vos connectar perque vòstre compte es pas encara blocat. @@ -50,8 +67,8 @@ oc: signed_in: Connectat amb succès. signed_out: Desconnectat amb succès. unlocks: - send_instructions: Recebretz un corrièl amb las instruccions per o desblocar dins una estona. Mercés de verificar tanben vòstre dorsièr de corrièls indesirables. - send_paranoid_instructions: Se vòstre compte existís recebretz un corrièl amb las instruccions per o desblocar dins una estona. Mercés de verificar tanben vòstre dorsièr de corrièls indesirables. + send_instructions: Recebretz un corrièl amb las consignas per o desblocar dins una estona. Mercés de verificar tanben vòstre dorsièr de corrièls indesirables. + send_paranoid_instructions: Se vòstre compte existís recebretz un corrièl amb las consignas per o desblocar dins una estona. Mercés de verificar tanben vòstre dorsièr de corrièls indesirables. unlocked: Vòstre compte es estat desblocat amb succès. Mercés de vos connectar per contunhar. errors: messages: diff --git a/config/locales/oc.yml b/config/locales/oc.yml index beb5d1f87..f517e64ef 100644 --- a/config/locales/oc.yml +++ b/config/locales/oc.yml @@ -159,7 +159,7 @@ oc: unsuspend_account: "%{name} restabliguèt lo compte a %{target}" update_custom_emoji: "%{name} metèt a jorn l’emoji %{target}" update_status: "%{name} metèt a jorn l’estatut a %{target}" - title: Audit log + title: Audit dels jornals custom_emojis: by_domain: Domeni copied_msg: Còpia locala de l’emoji ben creada @@ -167,7 +167,7 @@ oc: copy_failed_msg: Fracàs de la còpia locala de l’emoji created_msg: Emoji ben creat ! delete: Suprimir - destroyed_msg: Emojo ben suprimit ! + destroyed_msg: Emoji ben suprimit ! disable: Desactivar disabled_msg: Aqueste emoji es ben desactivat emoji: Emoji @@ -282,13 +282,13 @@ oc: desc_html: Afichat sus las pagina d’acuèlh quand las inscripcions son tampadas.
Podètz utilizar de balisas HTML title: Messatge de barradura de las inscripcions deletion: - desc_html: Autorizar lo monde a suprimir lor compte + desc_html: Autorizar lo mond a suprimir lor compte title: Possibilitat de suprimir lo compte min_invite_role: disabled: Degun title: Autorizat amb invitacions open: - desc_html: Autorizar lo monde a se marcar + desc_html: Autorizar lo mond a se marcar title: Inscripcions show_staff_badge: desc_html: Mostrar lo badge Personal sus la pagina de perfil @@ -338,9 +338,12 @@ oc: body: "%{reporter} a senhalat %{target}" subject: Novèl senhalament per %{instance} (#%{id}) application_mailer: + notification_preferences: Cambiar las preferéncias de corrièl salutation: "%{name}," settings: 'Cambiar las preferéncias de corrièl : %{link}' view: 'Veire :' + view_profile: Veire lo perfil + view_status: Veire los estatuts applications: created: Aplicacion ben creada destroyed: Aplication ben suprimida @@ -535,12 +538,12 @@ oc: max_uses: one: 1 persona other: "%{count} personas" - max_uses_prompt: Cap limit + max_uses_prompt: Cap de limit prompt: Generatz e partejatz los ligams per donar accès a aquesta instància table: expires_at: Expirats uses: Usatges - title: Convidar de monde + title: Convidar de mond landing_strip_html: "%{name} utiliza %{link_to_root_path}. Podètz lo/la sègre o interagir amb el o ela s’avètz un compte ont que siasque sul fediverse." landing_strip_signup_html: S’es pas lo cas, podètz vos marcar aquí. lists: @@ -567,21 +570,27 @@ oc: subject: one: "Una nòva notificacion dempuèi vòstra darrièra visita \U0001F418" other: "%{count} nòvas notificacions dempuèi vòstra darrièra visita \U0001F418" + title: Pendent vòstra abséncia… favourite: body: "%{name} a mes vòstre estatut en favorit :" subject: "%{name} a mes vòstre estatut en favorit" + title: Novèl apondut als favorits follow: body: "%{name} vos sèc ara !" subject: "%{name} vos sèc ara" + title: Nòu seguidor follow_request: body: "%{name} a demandat a vos sègre" subject: 'Demanda d’abonament : %{name}' + title: Novèla demanda d’abonament mention: body: "%{name} vos a mencionat dins :" subject: "%{name} vos a mencionat" + title: Novèla mencion reblog: body: "%{name} a tornat partejar vòstre estatut :" subject: "%{name} a tornat partejar vòstre estatut" + title: Novèl partatge number: human: decimal_units: @@ -629,12 +638,14 @@ oc: blackberry: Blackberry chrome: Chrome edge: Microsoft Edge + electron: Electron firefox: Firefox generic: Navigator desconegut ie: Internet Explorer micro_messenger: MicroMessenger nokia: Nokia S40 Ovi Browser opera: Opera + otter: Otter phantom_js: PhantomJS qq: QQ Browser safari: Safari @@ -786,6 +797,25 @@ oc: recovery_instructions_html: Se vos arriba de perdre vòstre mobil, podètz utilizar un dels còdis de recuperacion cai-jos per poder tornar accedir a vòstre compte. Gardatz los còdis en seguretat, per exemple, imprimissètz los e gardatz los amb vòstres documents importants. setup: Paramètres wrong_code: Lo còdi picat es invalid ! L’ora es la bona sul servidor e lo mobil ? + user_mailer: + welcome: + edit_profile_action: Configuracion del perfil + edit_profile_step: Podètz personalizar lo perfil en mandar un avatard, cambiar l’escais-nom e mai. Se volètz repassar las demandas d’abonaments abans que los nòus seguidors pòscan veire vòstre perfil, podètz clavar vòstre compte. + explanation: Vaquí qualques astúcias per vos preparar + final_action: Començar de publicar + final_step: 'Començatz de publicar ! Quitament s’avètz pas de seguidors los autres pòdon veire vòstres messatges publics, per exemple pel flux d’actualitat local e per las etiquetas. Benlèu que volètz vos presentar amb l’etiquetas #introductions.' + full_handle: Vòstre escais-nom complèt + full_handle_hint: Es aquò que vos cal donar a vòstres amics per que pòscan vos escriure o sègre a partir d’una autra instància. + review_preferences_action: Cambiar las preferéncias + review_preferences_step: Pensatz de configurar vòstras preferéncias, tal coma los corrièls que volètz recebrer o lo nivèl de confidencialitat de vòstres tuts per defaut. O se l’animacion vos dòna pas enveja de rendre, podètz activar la lectura automatica dels GIF. + subject: Benvengut a Mastodon + tip_bridge_html: Se venètz de Twitter, podètz trobar vòstres amics sus Mastodon en utilizant l‘aplicacion de Pont. Aquò fonciona pas que s’utilizan lo Pont tanben ! + tip_federated_timeline: Lo flux d’actualitat federat es una vista generala del malhum Mastodon. Mas aquò inclutz solament lo mond que vòstres vesins sègon, doncas es pas complèt. + tip_following: Seguètz l’administrator del servidor per defaut. Per trobar de mond mai interessant, agachatz lo flux d’actualitat local e lo global. + tip_local_timeline: Lo flux d’actualitat local es una vista del mond de %{instance}. Son vòstres vesins dirèctes ! + tip_mobile_webapp: Se vòstre navigator mobil nos permet d’apondre Mastodon a l’ecran d‘acuèlh, podètz recebre de notificacions. Aquò se compòrta coma una aplicacion nativa ! + tips: Astúcias + title: Vos desirem la benvenguda a bòrd %{name} ! users: invalid_email: L’adreça de corrièl es invalida invalid_otp_token: Còdi d’autentificacion en dos temps invalid diff --git a/config/locales/simple_form.oc.yml b/config/locales/simple_form.oc.yml index 06c23ace2..aa26d036d 100644 --- a/config/locales/simple_form.oc.yml +++ b/config/locales/simple_form.oc.yml @@ -4,7 +4,7 @@ oc: hints: defaults: avatar: PNG, GIF o JPG. Maximum 2 Mo. Serà retalhat en 120x120px - digest: Enviat aprèp un long moment d’inactivitat amb un resumit de las mencions qu’avètz recebudas pendent vòstra abséncia + digest: Solament enviat aprèp un long moment d’inactivitat e solament s’avètz recebut de messatges personals pendent vòstra abséncia display_name: one: Demòra encara 1 caractèr other: Demòran encara %{count} caractèrs -- cgit From 8cd2828e91edb0f6ede8b68bf04540c3c8432a38 Mon Sep 17 00:00:00 2001 From: abcang Date: Wed, 24 Jan 2018 21:29:46 +0900 Subject: Fix hide and show media button on admin page (#6347) --- app/javascript/packs/admin.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'app') diff --git a/app/javascript/packs/admin.js b/app/javascript/packs/admin.js index 993827db5..2bf1514a9 100644 --- a/app/javascript/packs/admin.js +++ b/app/javascript/packs/admin.js @@ -28,13 +28,13 @@ delegate(document, batchCheckboxClassName, 'change', () => { }); delegate(document, '.media-spoiler-show-button', 'click', () => { - [].forEach.call(document.querySelectorAll('.activity-stream .media-spoiler-wrapper'), (content) => { - content.classList.add('media-spoiler-wrapper__visible'); + [].forEach.call(document.querySelectorAll('button.media-spoiler'), (element) => { + element.click(); }); }); delegate(document, '.media-spoiler-hide-button', 'click', () => { - [].forEach.call(document.querySelectorAll('.activity-stream .media-spoiler-wrapper'), (content) => { - content.classList.remove('media-spoiler-wrapper__visible'); + [].forEach.call(document.querySelectorAll('.spoiler-button.spoiler-button--visible button'), (element) => { + element.click(); }); }); -- cgit From a3c0a2037314f105e807f9ede4210066a1524229 Mon Sep 17 00:00:00 2001 From: abcang Date: Wed, 24 Jan 2018 22:37:46 +0900 Subject: Fix initial_state me in push_notification_register (#6349) --- app/javascript/mastodon/actions/push_notifications/registerer.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'app') diff --git a/app/javascript/mastodon/actions/push_notifications/registerer.js b/app/javascript/mastodon/actions/push_notifications/registerer.js index 5f47a5501..51e68cad1 100644 --- a/app/javascript/mastodon/actions/push_notifications/registerer.js +++ b/app/javascript/mastodon/actions/push_notifications/registerer.js @@ -1,6 +1,7 @@ import api from '../../api'; import { pushNotificationsSetting } from '../../settings'; import { setBrowserSupport, setSubscription, clearSubscription } from './setter'; +import { me } from '../../initial_state'; // Taken from https://www.npmjs.com/package/web-push const urlBase64ToUint8Array = (base64String) => { @@ -35,7 +36,7 @@ const subscribe = (registration) => const unsubscribe = ({ registration, subscription }) => subscription ? subscription.unsubscribe().then(() => registration) : registration; -const sendSubscriptionToBackend = (getState, subscription, me) => { +const sendSubscriptionToBackend = (getState, subscription) => { const params = { subscription }; if (me) { @@ -54,7 +55,6 @@ const supportsPushNotifications = ('serviceWorker' in navigator && 'PushManager' export function register () { return (dispatch, getState) => { dispatch(setBrowserSupport(supportsPushNotifications)); - const me = getState().getIn(['meta', 'me']); if (me && !pushNotificationsSetting.get(me)) { const alerts = getState().getIn(['push_notifications', 'alerts']); @@ -85,13 +85,13 @@ export function register () { } else { // Something went wrong, try to subscribe again return unsubscribe({ registration, subscription }).then(subscribe).then( - subscription => sendSubscriptionToBackend(getState, subscription, me)); + subscription => sendSubscriptionToBackend(getState, subscription)); } } // No subscription, try to subscribe return subscribe(registration).then( - subscription => sendSubscriptionToBackend(getState, subscription, me)); + subscription => sendSubscriptionToBackend(getState, subscription)); }) .then(subscription => { // If we got a PushSubscription (and not a subscription object from the backend) @@ -140,7 +140,6 @@ export function saveSettings() { api(getState).put(`/api/web/push_subscriptions/${subscription.get('id')}`, { data, }).then(() => { - const me = getState().getIn(['meta', 'me']); if (me) { pushNotificationsSetting.set(me, data); } -- cgit