diff --git a/lib/federation/activity_pub/relay.ex b/lib/federation/activity_pub/relay.ex
index b722eca62..3bc9e9212 100644
--- a/lib/federation/activity_pub/relay.ex
+++ b/lib/federation/activity_pub/relay.ex
@@ -13,7 +13,7 @@ defmodule Mobilizon.Federation.ActivityPub.Relay do
alias Mobilizon.Federation.ActivityPub.{Actions, Activity, Transmogrifier}
alias Mobilizon.Federation.ActivityPub.Actor, as: ActivityPubActor
- alias Mobilizon.Federation.WebFinger
+ alias Mobilizon.Federation.{NodeInfo, WebFinger}
alias Mobilizon.GraphQL.API.Follows
alias Mobilizon.Service.Workers.Background
import Mobilizon.Federation.ActivityPub.Utils, only: [create_full_domain_string: 1]
@@ -192,10 +192,10 @@ defmodule Mobilizon.Federation.ActivityPub.Relay do
check_actor(address)
!is_nil(host) ->
- uri
- |> create_full_domain_string()
- |> then(&Kernel.<>("relay@", &1))
- |> check_actor()
+ case NodeInfo.application_actor(host) do
+ nil -> check_actor("relay@#{host}")
+ actor_url when is_binary(actor_url) -> {:ok, actor_url}
+ end
true ->
{:error, :bad_url}
diff --git a/lib/federation/node_info.ex b/lib/federation/node_info.ex
new file mode 100644
index 000000000..688abdac8
--- /dev/null
+++ b/lib/federation/node_info.ex
@@ -0,0 +1,33 @@
+defmodule Mobilizon.Federation.NodeInfo do
+ @moduledoc """
+ Performs NodeInfo requests
+ """
+
+ alias Mobilizon.Service.HTTP.WebfingerClient
+ require Logger
+
+ @application_uri "https://www.w3.org/ns/activitystreams#Application"
+ @env Application.compile_env(:mobilizon, :env)
+
+ @spec application_actor(String.t()) :: String.t() | nil
+ def application_actor(host) do
+ prefix = if @env !== :dev, do: "https", else: "http"
+
+ case WebfingerClient.get("#{prefix}://#{host}/.well-known/nodeinfo") do
+ {:ok, %{body: body, status: code}} when code in 200..299 ->
+ extract_application_actor(body)
+
+ err ->
+ Logger.debug("Failed to fetch NodeInfo data #{inspect(err)}")
+ nil
+ end
+ end
+
+ defp extract_application_actor(body) do
+ body
+ |> Enum.find(%{rel: @application_uri, href: nil}, fn %{rel: rel, href: href} ->
+ rel == @application_uri and is_binary(href)
+ end)
+ |> Map.get(:href)
+ end
+end
diff --git a/lib/web/controllers/node_info_controller.ex b/lib/web/controllers/node_info_controller.ex
index f9a09b7f8..71e7b79aa 100644
--- a/lib/web/controllers/node_info_controller.ex
+++ b/lib/web/controllers/node_info_controller.ex
@@ -7,13 +7,17 @@ defmodule Mobilizon.Web.NodeInfoController do
use Mobilizon.Web, :controller
alias Mobilizon.Config
+ alias Mobilizon.Federation.ActivityPub.Relay
alias Mobilizon.Service.Statistics
@node_info_supported_versions ["2.0", "2.1"]
@node_info_schema_uri "http://nodeinfo.diaspora.software/ns/schema/"
+ @application_uri "https://www.w3.org/ns/activitystreams#Application"
@spec schemas(Plug.Conn.t(), any) :: Plug.Conn.t()
def schemas(conn, _params) do
+ relay = Relay.get_actor()
+
links =
@node_info_supported_versions
|> Enum.map(fn version ->
@@ -22,6 +26,12 @@ defmodule Mobilizon.Web.NodeInfoController do
href: url(~p"/.well-known/nodeinfo/#{version}")
}
end)
+ |> Kernel.++([
+ %{
+ rel: @application_uri,
+ href: relay.url
+ }
+ ])
json(conn, %{
links: links
diff --git a/src/i18n/gl.json b/src/i18n/gl.json
index 249f65549..8eef41278 100644
--- a/src/i18n/gl.json
+++ b/src/i18n/gl.json
@@ -45,7 +45,7 @@
"Accept": "Aceptar",
"Accepted": "Aceptado",
"Accessibility": "Accesibilidade",
- "Accessible only by link": "",
+ "Accessible only by link": "Só accesible con ligazón",
"Accessible only to members": "Accesible só para membros",
"Accessible through link": "Accesible por ligazón",
"Account": "Conta",
@@ -64,15 +64,15 @@
"Add a todo": "Engadir tarefas pendentes",
"Add an address": "Engadir un enderezo",
"Add an instance": "Engadir unha instancia",
- "Add link": "",
+ "Add link": "Engadir ligazón",
"Add new…": "Engadir novo…",
- "Add picture": "",
+ "Add picture": "Engadir imaxe",
"Add some tags": "Engadir etiquetas",
"Add to my calendar": "Engadir ó meu calendario",
"Additional comments": "Comentarios adicionais",
"Admin": "Admin",
- "Admin dashboard": "",
- "Admin settings": "",
+ "Admin dashboard": "Taboleiro de Admin",
+ "Admin settings": "Axustes de Admin",
"Admin settings successfully saved.": "Gardáronse os axustes de Admin.",
"Administration": "Administración",
"Administrator": "Administradora",
@@ -93,15 +93,16 @@
"An event from one of my groups has been published": "Publicouse un evento nun dos meus grupos",
"An event from one of my groups has been updated or deleted": "Actualizouse ou eliminouse un evento nun dos meus grupos",
"An instance is an installed version of the Mobilizon software running on a server. An instance can be run by anyone using the {mobilizon_software} or other federated apps, aka the “fediverse”. This instance's name is {instance_name}. Mobilizon is a federated network of multiple instances (just like email servers), users registered on different instances may communicate even though they didn't register on the same instance.": "Unha instancia é unha versión do software Mobilizon instalada nun servidor. Calquera persoa pode instalar unha instancia usando o {mobilizon_software} ou outras apps federadas, coñecidas como \"fediverso\". O nome desta instancia é {instance_name}. Mobilizon é unha rede federada de múltiples instancias (como os servidores de correo), usuarias rexistradas en diferentes servidores que poden comunicarse incluso se non están rexistradas na mesma instancia.",
+ "An “application programming interface” or “API” is a communication protocol that allows software components to communicate with each other. The Mobilizon API, for example, can allow third-party software tools to communicate with Mobilizon instances to carry out certain actions, such as posting events, automatically and remotely.": "Unha \"interface de programación de aplicacións\" ou \"API\" é un protocolo de comunicación que permite aos compoñentes do software comunicarse entre eles. A API de Mobilizon, por exemplo, pode permitir que ferramentas de terceiras partes se comuniquen con instancias Mobilizon para realizar certas accións, como publicar eventos de xeito automático e remoto.",
"And {number} comments": "E {number} comentarios",
"Announcements and mentions notifications are always sent straight away.": "As notificacións de mencións e anuncios sempre son enviadas de todas formas.",
"Anonymous participant": "Participante anónimo",
"Anonymous participants will be asked to confirm their participation through e-mail.": "Ós participantes anónimos pediráselle que confirmen a súa participación a través de email.",
"Anonymous participations": "Participacións anónimas",
"Any day": "Calquera día",
- "Any type": "",
+ "Any type": "Calquera tipo",
"Anyone can join freely": "Calquera pode unirse",
- "Anyone can request being a member, but an administrator needs to approve the membership.": "",
+ "Anyone can request being a member, but an administrator needs to approve the membership.": "Calquera pode solicitar membresía, pero a administración ten que aprobar a solicitude.",
"Anyone wanting to be a member from your group will be able to from your group page.": "Calquera que queira ser membro do teu grupo pode facelo desde a páxina do grupo.",
"Application": "Aplicación",
"Apply filters": "Aplicar filtros",
@@ -118,12 +119,12 @@
"Are you sure you want to delete this entire discussion?": "Tes a certeza de querer eliminar o debate completo?",
"Are you sure you want to delete this event? This action cannot be reverted.": "¿Tes a certeza de que queres eliminar este evento? Esta acción non é reversible.",
"Are you sure you want to delete this post? This action cannot be reverted.": "Tes certeza de querer eliminar a publicación? Esta acción non ten volta.",
- "Are you sure you want to leave the group {groupName}? You'll loose access to this group's private content. This action cannot be undone.": "",
+ "Are you sure you want to leave the group {groupName}? You'll loose access to this group's private content. This action cannot be undone.": "Tes certeza de querer deixar o grupo {groupName}? Non poderás acceder ao contido privado do grupo. Esta acción non ten volta atrás.",
"As the event organizer has chosen to manually validate participation requests, your participation will be really confirmed only once you receive an email stating it's being accepted.": "Como a organización do evento escolleu validar manualmente as solicitudes, a túa participación estará realmente confirmada cando recibas un correo informándote.",
"Ask your instance admin to {enable_feature}.": "Pídelle á administración da instancia que {enable_feature}.",
"Assigned to": "Asignado a",
"Atom feed for events and posts": "Fonte Atom para eventos e publicacións",
- "Attending": "",
+ "Attending": "Participan",
"Avatar": "Avatar",
"Back to group list": "",
"Back to previous page": "Volver á páxina anterior",
@@ -139,7 +140,7 @@
"Booking": "Reservas",
"Breadcrumbs": "Breadcrumbs",
"Browser notifications": "Notificacións do navegador",
- "Bullet list": "",
+ "Bullet list": "Lista de puntos",
"By others": "Por outras",
"By {group}": "Por {group}",
"By {username}": "Por {username}",
@@ -147,10 +148,10 @@
"Cancel": "Cancelar",
"Cancel anonymous participation": "Cancelar participación anónima",
"Cancel creation": "Cancelar creación",
- "Cancel discussion title edition": "",
+ "Cancel discussion title edition": "Desbotar a edición do título da conversa",
"Cancel edition": "Cancelar edición",
- "Cancel follow request": "",
- "Cancel membership request": "",
+ "Cancel follow request": "Desbotar solicitude de seguimento",
+ "Cancel membership request": "Desbotar a solicitude de membresía",
"Cancel my participation request…": "Cancelar a miña solicitude de participación…",
"Cancel my participation…": "Cancelar a miña participación…",
"Cancelled": "Cancelado",
@@ -164,21 +165,21 @@
"Change timezone": "Cambiar zona horaria",
"Change user email": "Cambiar correo da usuaria",
"Check your inbox (and your junk mail folder).": "Comproba a caixa de correo (e o cartafol de spam).",
- "Choose the source of the instance's Privacy Policy": "",
- "Choose the source of the instance's Terms": "",
+ "Choose the source of the instance's Privacy Policy": "Escolle a orixe da Política de Privacidade da instancia",
+ "Choose the source of the instance's Terms": "Elixe a orixe dos Termos da instancia",
"City or region": "Cidade ou rexión",
"Clear": "Baleirar",
- "Clear address field": "",
- "Clear date filter field": "",
+ "Clear address field": "Limpar campo de enderezo",
+ "Clear date filter field": "Limpar campo de data no filtro",
"Clear participation data for all events": "Eliminar os datos de participación para todos os eventos",
"Clear participation data for this event": "Eliminar os datos de participación para este evento",
- "Clear timezone field": "",
+ "Clear timezone field": "Limpar o campo de zona horaria",
"Click for more information": "Preme para saber máis",
"Click to upload": "Preme para subir",
"Close": "Pechar",
"Close comments for all (except for admins)": "Pechar comentarios para todos (excepto admins)",
"Closed": "Pechado",
- "Comment body": "",
+ "Comment body": "Corpo do comentario",
"Comment deleted": "Comentario eliminado",
"Comment from {'@'}{username} reported": "Denuncia sobre o comentario de {'@'}{username}",
"Comment text can't be empty": "O texto do comentario non pode estar baleiro",
@@ -212,7 +213,7 @@
"Create discussion": "Crear conversa",
"Create event": "Crear evento",
"Create group": "Crear grupo",
- "Create identity": "",
+ "Create identity": "Crear identidade",
"Create my event": "Crear o meu evento",
"Create my group": "Crear o meu grupo",
"Create my profile": "Crear o meu perfil",
@@ -235,7 +236,7 @@
"Date and time settings": "Axustes de data e hora",
"Date parameters": "Parámetros da data",
"Decline": "Rexeitar",
- "Decrease": "",
+ "Decrease": "Diminuir",
"Default": "Por omisión",
"Default Mobilizon privacy policy": "Política de privacidade por omisión para Mobilizon",
"Default Mobilizon terms": "Termos Mobilizon por omisión",
@@ -263,7 +264,7 @@
"Didn't receive the instructions?": "Non recibiches as instruccións?",
"Disabled": "Desactivado",
"Discussions": "Comentando",
- "Discussions list": "",
+ "Discussions list": "Lista de conversas",
"Display name": "Mostrar nome",
"Display participation price": "Mostrar prezo da participación",
"Displayed nickname": "Nome mostrado",
@@ -272,7 +273,7 @@
"Do you really want to suspend the account « {emailAccount} » ?": "Tes certeza de querer suspender a conta « {emailAccount} » ?",
"Do you wish to {create_event} or {explore_events}?": "Queres {create_event} ou {explore_events}?",
"Do you wish to {create_group} or {explore_groups}?": "Queres {create_group} ou {explore_groups}?",
- "Does the event needs to be confirmed later or is it cancelled?": "",
+ "Does the event needs to be confirmed later or is it cancelled?": "Precísase confirmar posteriormente o evento ou se foi cancelado?",
"Domain": "Dominio",
"Draft": "Borrador",
"Drafts": "Borradores",
@@ -323,12 +324,12 @@
"Event already passed": "O evento xa rematou",
"Event cancelled": "Evento cancelado",
"Event creation": "Evento creado",
- "Event description body": "",
+ "Event description body": "Corpo da descrición do evento",
"Event edition": "Edición do evento",
"Event list": "Lista de eventos",
"Event metadata": "Metadatos do evento",
"Event page settings": "Páxina de axustes do evento",
- "Event timezone will default to the timezone of the event's address if there is one, or to your own timezone setting.": "",
+ "Event timezone will default to the timezone of the event's address if there is one, or to your own timezone setting.": "A zona horaria do evento terá por defecto a zona horaria do enderezo do evento (se está indicada), ou a túa zona horaria nos axustes.",
"Event to be confirmed": "Evento agardando confirmación",
"Event {eventTitle} deleted": "Eliminado o evento {eventTitle}",
"Event {eventTitle} reported": "Denunciado o evento {eventTitle}",
@@ -341,7 +342,7 @@
"Explore": "Descubre",
"Explore events": "Descubrir eventos",
"Explore!": "Descubre!",
- "Export": "",
+ "Export": "Exportar",
"Failed to get location.": "Non se obtivo a localización.",
"Failed to save admin settings": "Fallo ó gardar os axustes de admin",
"Featured events": "Eventos destacados",
@@ -356,19 +357,19 @@
"Find an instance": "Atopar unha instancia",
"Find another instance": "Atopa outra instancia",
"Find or add an element": "Atopa ou engade un elemento",
- "First steps": "",
+ "First steps": "Primeiros pasos",
"Follow": "Seguir",
"Follower": "Seguidora",
"Followers": "Seguidoras",
"Followers will receive new public events and posts.": "As seguidoras recibirán os novos eventos públicos e publicacións.",
- "Following the group will allow you to be informed of the {group_upcoming_public_events}, whereas joining the group means you will {access_to_group_private_content_as_well}, including group discussions, group resources and members-only posts.": "",
+ "Following the group will allow you to be informed of the {group_upcoming_public_events}, whereas joining the group means you will {access_to_group_private_content_as_well}, including group discussions, group resources and members-only posts.": "Ao seguir o grupo poderás recibir información sobre {group_upcoming_public_events}, mentras que ao unirte ao grupo poderás {access_to_group_private_content_as_well}, incluíndo conversas do grupo, recursos do grupo e publicacións só para membros.",
"Followings": "Seguindo",
"For instance: London": "Por exemplo: Allariz",
"For instance: London, Taekwondo, Architecture…": "Por exemplo: Leiro, Natación, Arquitectura…",
"Forgot your password ?": "¿Esqueceches o contrasinal?",
"Forgot your password?": "Esqueceches o contrasinal?",
"Framadate poll": "Enquisa Framadate",
- "From my groups": "",
+ "From my groups": "Dos meus grupos",
"From the {startDate} at {startTime} to the {endDate}": "Desde o {startDate} ás {startTime} ata o {endDate}",
"From the {startDate} at {startTime} to the {endDate} at {endTime}": "Desde o {startDate} ás {startTime} ata o {endDate} ás {endTime}",
"From the {startDate} to the {endDate}": "Desde o {startDate} ata o {endDate}",
@@ -378,7 +379,7 @@
"General": "Xeral",
"General information": "Información xeral",
"General settings": "Axustes xerais",
- "Geolocation was not determined in time.": "",
+ "Geolocation was not determined in time.": "Non se obtivo a xeolocalización a tempo.",
"Getting location": "Obtendo localización",
"Getting there": "Chegar alí",
"Glossary": "Glosario",
@@ -392,10 +393,10 @@
"Group URL": "URL do grupo",
"Group activity": "Actividade do grupo",
"Group address": "Enderezo do grupo",
- "Group description body": "",
+ "Group description body": "Corpo da descrición do grupo",
"Group display name": "Nome mostrado do grupo",
"Group name": "Nome do grupo",
- "Group profiles": "",
+ "Group profiles": "Perfís do grupo",
"Group settings": "Axustes do grupo",
"Group settings saved": "Gardáronse os axustes",
"Group short description": "Descrición curta do grupo",
@@ -405,9 +406,9 @@
"Groups": "Grupos",
"Groups are not enabled on this instance.": "Os grupos non están activados nesta instancia.",
"Groups are spaces for coordination and preparation to better organize events and manage your community.": "Os grupos son espazos de coordinación e preparación, para organizar os eventos e xestionar a comunidade.",
- "Heading Level 1": "",
- "Heading Level 2": "",
- "Heading Level 3": "",
+ "Heading Level 1": "Cabeceira Nivel 1",
+ "Heading Level 2": "Cabeceira Nivel 2",
+ "Heading Level 3": "Cabeceira Nivel 3",
"Headline picture": "Imaxe de cabeceira",
"Hide replies": "Agochar respostas",
"Home": "Inicio",
@@ -437,11 +438,11 @@
"If you have opted for manual validation of participants, Mobilizon will send you an email to inform you of new participations to be processed. You can choose the frequency of these notifications below.": "Se optaches pola validación manual das participantes, Mobilizon enviarache un correo para informarte das novas solicitudes a tratar. Podes escoller a frecuencia destas notificacións.",
"If you want, you may send a message to the event organizer here.": "Se o desexas, aquí podes enviar unha mensaxe á organización do evento.",
"Ignore": "Ignorar",
- "In person": "",
+ "In person": "En persoa",
"In the following context, an application is a software, either provided by the Mobilizon team or by a 3rd-party, used to interact with your instance.": "No seguinte contexto, unha aplicación é un software, proporcionado polo equipo Mobilizon ou por terceiros, utilizado para interactuar coa túa instancia.",
- "In the past": "",
+ "In the past": "No pasado",
"In this instance's network": "Na rede desta instancia",
- "Increase": "",
+ "Increase": "Aumentar",
"Instance": "Instancia",
"Instance Long Description": "Descrición longa da instancia",
"Instance Name": "Nome da instancia",
@@ -464,7 +465,7 @@
"Instances following you": "Instancias que te seguen",
"Instances you follow": "Instancias que segues",
"Integrate this event with 3rd-party tools and show metadata for the event.": "Integrar este evento en ferramentas de terceiras parte e mostrar metadatos do evento.",
- "Interact": "",
+ "Interact": "Interactuar",
"Interact with a remote content": "Interactuar cun evento remoto",
"Invite a new member": "Convida a un novo membro",
"Invite member": "Convida a persoa",
@@ -492,7 +493,7 @@
"Least recently published": "Publicado máis antigo",
"Leave": "Saír",
"Leave event": "Deixar o evento",
- "Leave group": "",
+ "Leave group": "Deixar o grupo",
"Leaving event \"{title}\"": "Saíndo do evento \"{title}\"",
"Legal": "Legal",
"Let's define a few settings": "Define algúns parámetros",
@@ -504,7 +505,8 @@
"Load more activities": "Cargar máis actividades",
"Loading comments…": "Cargando comentarios…",
"Local": "Local",
- "Local time ({timezone})": "",
+ "Local time ({timezone})": "Hora local ({timezone})",
+ "Local times ({timezone})": "Horas locais ({timezone})",
"Locality": "Localidade",
"Location": "Localización",
"Log in": "Acceder",
@@ -535,7 +537,7 @@
"Mobilizon uses a system of profiles to compartiment your activities. You will be able to create as many profiles as you want.": "Mobilizon utiliza un sistema de perfís para organizar as túas actividades. Poderás crear tantos perfís como queiras.",
"Mobilizon version": "Versión Mobilizon",
"Mobilizon will send you an email when the events you are attending have important changes: date and time, address, confirmation or cancellation, etc.": "Mobilizón enviarache un correo cando os eventos nos que participes teñan cambios importantes: data e hora, enderezos, confirmación ou cancelación, etc.",
- "Moderate new members": "",
+ "Moderate new members": "Moderar novos membros",
"Moderated comments (shown after approval)": "Comentarios moderados (mostrados após aprobación)",
"Moderation": "Moderación",
"Moderation log": "Rexistro da moderación",
@@ -551,7 +553,7 @@
"My identities": "Identidades",
"NOTE! The default terms have not been checked over by a lawyer and thus are unlikely to provide full legal protection for all situations for an instance admin using them. They are also not specific to all countries and jurisdictions. If you are unsure, please check with a lawyer.": "AVISO! Os termos por omisión non foron revisados por avogados e dificilmente proporcionan cobertura legal completa para todas as situacións que se dean nun instancia. Tampouco son específicas para todos os países e xurisdicións. Se non estás segura, consúltaas cun avogado.",
"Name": "Nome",
- "Navigated to {pageTitle}": "",
+ "Navigated to {pageTitle}": "Ir a {pageTitle}",
"New discussion": "Novo debate",
"New email": "Novo correo",
"New folder": "Novo cartafol",
@@ -629,7 +631,7 @@
"On {date} from {startTime} to {endTime}": "O {date} desde {startTime} ás {endTime}",
"On {date} starting at {startTime}": "O {date} comezando ás {startTime}",
"On {instance} and other federated instances": "En {instance} e outras instancias federadas",
- "Online": "",
+ "Online": "En liña",
"Online ticketing": "Entradas por internet",
"Only accessible through link": "Accesible só a través da ligazón",
"Only accessible through link (private)": "Só accesible desde a ligazón {private}",
@@ -638,13 +640,13 @@
"Only group members can access discussions": "Só os membros do grupo poden acceder ás conversas",
"Only group moderators can create, edit and delete events.": "Só os moderadores do grupo poden crear, editar e eliminar eventos.",
"Only group moderators can create, edit and delete posts.": "Só as moderadoras do grupo poden crear, editar e eliminar publicacións.",
- "Only registered users may fetch remote events from their URL.": "",
+ "Only registered users may fetch remote events from their URL.": "Só as usuarias rexistradas poden recibir elementos remotos co seu URL.",
"Open": "Abrir",
"Open a topic on our forum": "Abrir un tema no noso foro",
"Open an issue on our bug tracker (advanced users)": "Abrir un informe no noso seguimento de fallos (usuarias avanzadas)",
"Opened reports": "Denuncias abertas",
"Or": "Ou",
- "Ordered list": "",
+ "Ordered list": "Lista ordenada",
"Organized": "Organizado",
"Organized by": "Organizado por",
"Organized by {name}": "Organizado por {name}",
@@ -670,8 +672,8 @@
"Participation confirmation": "Confirmación da participación",
"Participation notifications": "Notificacións da participación",
"Participation requested!": "Participación solicitada!",
- "Participation with account": "",
- "Participation without account": "",
+ "Participation with account": "Participación coa conta",
+ "Participation without account": "Participación sen conta",
"Participations": "Participacións",
"Password": "Contrasinal",
"Password (confirmation)": "Contrasinal (confirmación)",
@@ -693,19 +695,19 @@
"Please make sure the address is correct and that the page hasn't been moved.": "Comproba ben o enderezo e que a páxina non foi movida a outro lugar.",
"Please read the {fullRules} published by {instance}'s administrators.": "Por favor le as {fullRules} publicadas pola administración de {instance}.",
"Post": "Publicación",
- "Post URL": "",
+ "Post URL": "URL da publicación",
"Post a comment": "Comenta",
"Post a reply": "Publica unha resposta",
- "Post body": "",
+ "Post body": "Corpo da publicación",
"Post {eventTitle} reported": "Denunciado o evento {eventTitle}",
"Postal Code": "Código Postal",
"Posts": "Publicacións",
- "Powered by Mobilizon": "",
+ "Powered by Mobilizon": "Grazas a Mobilizon",
"Powered by {mobilizon}. © 2018 - {date} The Mobilizon Contributors - Made with the financial support of {contributors}.": "Funciona grazas a {mobilizon}. © 2018 - {date} The Mobilizon Contributors - Co soporte financieiro das {contributors}.",
"Preferences": "Preferencias",
"Previous": "Anterior",
"Previous email": "Correo anterior",
- "Previous month": "",
+ "Previous month": "Mes anterior",
"Previous page": "Páxina anterior",
"Price sheet": "Tarifa",
"Privacy": "Privacidade",
@@ -727,7 +729,7 @@
"Public preview": "Vista previa pública",
"Publication date": "Data de publicación",
"Publish": "Publicar",
- "Published by {name}": "",
+ "Published by {name}": "Publicado por {name}",
"Published events with {comments} comments and {participations} confirmed participations": "Eventos publicados con {comments} comentarios e {participations} participacións confirmadas",
"Push": "Push",
"Quote": "Citar",
@@ -737,9 +739,9 @@
"Receive one email for each activity": "Recibir un correo por cada actividade",
"Receive one email per request": "Recibir un correo por solicitude",
"Redirecting in progress…": "Redireccionando…",
- "Redirecting to Mobilizon": "",
+ "Redirecting to Mobilizon": "Redirixindo a Mobilizon",
"Redirecting to content…": "Redirixindo ó contido…",
- "Redo": "",
+ "Redo": "Volver facer",
"Refresh profile": "Actualiza perfil",
"Regenerate new links": "Recrear novas ligazóns",
"Region": "Rexión",
@@ -767,7 +769,7 @@
"Report this comment": "Denunciar este comentario",
"Report this event": "Denunciar este evento",
"Report this group": "Denunciar este grupo",
- "Report this post": "",
+ "Report this post": "Denuncia esta publicación",
"Reported": "Denunciado",
"Reported by": "Denunciado por",
"Reported by someone on {domain}": "Foi denunciado por alguén desde {domain}",
@@ -775,7 +777,7 @@
"Reported group": "Grupo denunciado",
"Reported identity": "Identidade denunciada",
"Reports": "Denuncias",
- "Reports list": "",
+ "Reports list": "Lista de denuncias",
"Request for participation confirmation sent": "Solicitar o envío da confirmación de participación",
"Resend confirmation email": "Reenviar correo de confirmación",
"Resent confirmation email": "Reenviado o correo de confirmación",
@@ -806,7 +808,7 @@
"Send": "Enviar",
"Send email": "Enviar correo",
"Send notification e-mails": "Enviar emails de notificacións",
- "Send password reset": "",
+ "Send password reset": "Enviar restablecemento de contrasinal",
"Send the confirmation email again": "Enviar o correo de confirmación outra vez",
"Send the report": "Enviar a denuncia",
"Set an URL to a page with your own privacy policy.": "Establece o URL da páxina coa túa política de privacidade.",
@@ -815,20 +817,22 @@
"Share": "Compartir",
"Share this event": "Compartir este evento",
"Share this group": "Compartir este grupo",
- "Share this post": "",
+ "Share this post": "Comparte esta publicación",
"Short bio": "Bio curta",
"Show map": "Mostrar mapa",
"Show me where I am": "Mostra onde me atopo",
"Show remaining number of places": "Mostrar o número de prazas restantes",
"Show the time when the event begins": "Mostrar a hora á que comeza o evento",
"Show the time when the event ends": "Mostar a hora na que remata o evento",
- "Showing events before": "",
- "Showing events starting on": "",
+ "Showing events before": "Mostrando eventos antes do",
+ "Showing events starting on": "Mostrando eventos a partir do",
"Sign Language": "Idioma de signos",
"Sign in with": "Acceder con",
"Sign up": "Rexistro",
"Since you are a new member, private content can take a few minutes to appear.": "Como es un novo membro, o contido privado podería tardar uns minutos en aparecer.",
- "Skip to main content": "",
+ "Skip to main content": "Ir directamente ao contido",
+ "Smoke free": "Libre de fume",
+ "Smoking allowed": "Permítese fumar",
"Social": "Social",
"Some terms, technical or otherwise, used in the text below may cover concepts that are difficult to grasp. We have provided a glossary here to help you understand them better:": "Algúns termos, técnicos ou doutro tipo, utilizados no texto poderían referirse a conceptos difíciles de entender. Aquí tes un glosario para axudarche a entendelos mellor:",
"Starts on…": "Comeza o…",
@@ -839,7 +843,7 @@
"Suspend": "Suspender",
"Suspend group": "Suspende grupo",
"Suspended": "Suspendida",
- "Tag search": "",
+ "Tag search": "Buscar etiqueta",
"Task lists": "Listas de tarefas",
"Technical details": "Detalles técnicos",
"Tentative": "Provisional",
@@ -847,7 +851,7 @@
"Terms": "Termos",
"Terms of service": "Termos do servizo",
"Text": "Texto",
- "That you follow or of which you are a member": "",
+ "That you follow or of which you are a member": "Que sigues ou do que es membro",
"The Big Blue Button video teleconference URL": "URL da videoconferencia utilizando The Big Blue Button",
"The Google Meet video teleconference URL": "URL da videoconferencia a través de Google Meet",
"The Jitsi Meet video teleconference URL": "URL da videoconferencia usando Jitsi Meet",
@@ -867,7 +871,7 @@
"The event has been updated": "O evento foi actualizado",
"The event has been updated and published": "O evento foi actualizado e publicado",
"The event hasn't got a sign language interpreter": "O evento non ten intérprete de lingua de signos",
- "The event is fully online": "",
+ "The event is fully online": "Evento totalmente en liña",
"The event live video contains subtitles": "O vídeo do evento en directo contén subtítulos",
"The event live video does not contain subtitles": "O vídeo do evento en directo non contén subtítulos",
"The event organiser has chosen to validate manually participations. Do you want to add a little note to explain why you want to participate to this event?": "O organizador do evento escolleu validar manualmente as participacións. Desexas engadir unha nota explicando a razón pola que queres participar no evento?",
@@ -882,7 +886,7 @@
"The event {event} was updated by {profile}.": "{profile} actualizou o evento {evento}.",
"The events you created are not shown here.": "Os eventos que ti creaches non se mostran aquí.",
"The geolocation prompt was denied.": "",
- "The group can now be joined by anyone, but new members need to be approved by an administrator.": "",
+ "The group can now be joined by anyone, but new members need to be approved by an administrator.": "Agora calquera pode unirse ao grupo, pero os novos membros teñen que ser aprobados pola administración.",
"The group can now be joined by anyone.": "Agora calquera pode unirse ao grupo.",
"The group can now only be joined with an invite.": "Agora só se pode acceder ao grupo cun convite.",
"The group will be publicly listed in search results and may be suggested in the explore section. Only public informations will be shown on it's page.": "Este grupo aparecerá en resultados de buscas e podería ser suxerido na sección descubrir. Só se mostrará información pública nesta páxina.",
@@ -933,7 +937,7 @@
"This month": "Este mes",
"This post is accessible only for members. You have access to it for moderation purposes only because you are an instance moderator.": "Esta publicación só é accesible para membros. Ti tes acceso a ela para poder moderala xa que es moderadora da instancia.",
"This post is accessible only through it's link. Be careful where you post this link.": "Este evento só é accesible coa súa ligazón. Ten tino de onde publicas esta ligazón.",
- "This profile is from another instance, the informations shown here may be incomplete.": "",
+ "This profile is from another instance, the informations shown here may be incomplete.": "Este perfil pertence a outra instancia, a información que ves podería estar incompleta.",
"This profile was not found": "",
"This setting will be used to display the website and send you emails in the correct language.": "Este axuste usarase para mostrar o sitio web e enviarche os correos no idioma correcto.",
"This user was not found": "",
@@ -941,8 +945,8 @@
"This week": "Esta semana",
"This weekend": "Este fin de semana",
"This will delete / anonymize all content (events, comments, messages, participations…) created from this identity.": "Esto eliminará / anonimazará todo o contido (eventos, comentarios, mensaxes, participacións...) creado con esta identidade.",
- "Time in your timezone ({timezone})": "",
- "Times in your timezone ({timezone})": "",
+ "Time in your timezone ({timezone})": "Hora na túa zona horaria ({timezone})",
+ "Times in your timezone ({timezone})": "Horas na túa zona horaria ({timezone})",
"Timezone": "Zona horaria",
"Timezone detected as {timezone}.": "Zona horaria detectada como {timezone}.",
"Title": "Título",
@@ -973,24 +977,24 @@
"Unable to load event for participation. The error details are provided below:": "Non se puido cargar a participación no evento. Aquí abaixo tes detalles do erro:",
"Unable to save your participation in this browser.": "Non se puido gardar a túa participación neste navegador.",
"Unable to update the profile. The avatar picture may be too heavy.": "Non se puido actualizar o perfil. A imaxe do avatar podería ser demasiado grande.",
- "Underline": "",
- "Undo": "",
+ "Underline": "Subliñar",
+ "Undo": "Desfacer",
"Unfollow": "Deixar de seguir",
"Unfortunately, your participation request was rejected by the organizers.": "Desgraciadamente a túa solicitude de participación foi rexeitada pola organización.",
"Unknown": "Descoñecido",
"Unknown actor": "Actor descoñecido",
"Unknown error.": "Erro descoñecido.",
"Unknown value for the openness setting.": "Axuste descoñecido para o acceso ao grupo.",
- "Unlogged participation": "",
+ "Unlogged participation": "Participación sen rexistrarse",
"Unsaved changes": "Cambios non gardados",
"Unsubscribe to browser push notifications": "Retirar subscrición ás notificacións push do navegdor",
"Unsuspend": "Reactivar",
"Upcoming": "Próximamente",
"Upcoming events": "Eventos próximos",
- "Upcoming events from your groups": "",
+ "Upcoming events from your groups": "Eventos previstos para os teus grupos",
"Update": "Actualizar",
"Update app": "Actualizar app",
- "Update discussion title": "",
+ "Update discussion title": "Actualiza o título da conversa",
"Update event {name}": "Actualizar evento {name}",
"Update group": "Actualizar grupo",
"Update my event": "Actualizar o meu evento",
@@ -1002,7 +1006,7 @@
"User settings": "Axustes da usuaria",
"Username": "Identificador",
"Users": "Usuarias",
- "Validating account": "",
+ "Validating account": "Validando a conta",
"Validating email": "Validando o correo",
"Video Conference": "Videoconferencia",
"View a reply": "|Ver unha resposta|Ver {totalReplies} respostas",
@@ -1012,7 +1016,7 @@
"View all posts": "Ver publicacións",
"View event page": "Ver páxina do evento",
"View everything": "Velo todo",
- "View full profile": "",
+ "View full profile": "Ver perfil completo",
"View less": "Ver menos",
"View more": "Ver máis",
"View page on {hostname} (in a new window)": "Ver páxina en {hostname} (nova ventá)",
@@ -1040,12 +1044,13 @@
"What can I do to help?": "Que podo facer para axudar?",
"Wheelchair accessibility": "Accesible con cadeira de rodas",
"When a moderator from the group creates an event and attributes it to the group, it will show up here.": "Aquí aparecerá un evento cando un moderador do grupo o cree e o atribúa ó grupo.",
- "When the event is private, you'll need to share the link around.": "",
- "When the post is private, you'll need to share the link around.": "",
+ "When the event is private, you'll need to share the link around.": "Se o evento é privado, deberás compartir ti a ligazón.",
+ "When the post is private, you'll need to share the link around.": "Se a publicación é privada, deberás compartir ti a ligazón.",
+ "Whether smoking is prohibited during the event": "Se está prohibido fumar durante o evento",
"Whether the event is accessible with a wheelchair": "Se o evento é accesible ou non con cadeira de rodas",
"Whether the event is interpreted in sign language": "Se o evento está interpretado en lingua de signos",
"Whether the event live video is subtitled": "Se o evento está subtitulado ou non",
- "Who can post a comment?": "",
+ "Who can post a comment?": "Quen pode comentar?",
"Who can view this event and participate": "Quen pode ver e participar neste evento",
"Who can view this post": "Quen pode ver esta publicación",
"Who published {number} events": "Que publicaron {number} eventos",
@@ -1055,7 +1060,7 @@
"Yesterday": "Onte",
"You accepted the invitation to join the group.": "Aceptaches o convite para unirte ao grupo.",
"You added the member {member}.": "Engadiches a {member}.",
- "You approved {member}'s membership.": "",
+ "You approved {member}'s membership.": "Aprobaches a membresía de {member}.",
"You archived the discussion {discussion}.": "Arquivaches o debate {discussion}.",
"You are not an administrator for this group.": "Non es administradora deste grupo.",
"You are not part of any group.": "Non formas parte de ningún grupo.",
@@ -1084,9 +1089,9 @@
"You demoted {member} to simple member.": "Degradaches a {member] a membresía básica.",
"You didn't create or join any event yet.": "Aínda non te uniches nin creaches un evento.",
"You don't follow any instances yet.": "Aínda non segues ningunha instancia.",
- "You don't have any upcoming events. Maybe try another filter?": "",
+ "You don't have any upcoming events. Maybe try another filter?": "Non tes eventos previstos. Queres probar con outro filtro?",
"You excluded member {member}.": "Excluíches a {member}.",
- "You have attended {count} events in the past.": "",
+ "You have attended {count} events in the past.": "Non participaches en ningún evento no pasado.|Participaches nun evento no pasado.|Participaches en {count} eventos no pasado.",
"You have been invited by {invitedBy} to the following group:": "Foches convidada por {invitedBy} ó seguinte grupo:",
"You have been removed from this group's members.": "Sacáronte deste grupo.",
"You have cancelled your participation": "Cancelaches a túa participación",
@@ -1126,7 +1131,7 @@
"You will be able to add an avatar and set other options in your account settings.": "Poderás engadir un avatar e establecer outras opcións nos axustes da conta.",
"You will be redirected to the original instance": "Vas ser redirixida á instancia orixinal",
"You will find here all the events you have created or of which you are a participant, as well as events organized by groups you follow or are a member of.": "Aquí atoparás tódolos eventos que creaches ou dos que es partícipe, tamén os eventos organizados por grupos que segues ou aos que pertences.",
- "You will receive notifications about this group's public activity depending on %{notification_settings}.": "",
+ "You will receive notifications about this group's public activity depending on %{notification_settings}.": "Vas recibir notificacións sobre a actividade pública deste grupo dependendo dos %{notification_settings}.",
"You wish to participate to the following event": "Queres participar no seguinte evento",
"You'll get a weekly recap every Monday for upcoming events, if you have any.": "Recibirás un resumen semanal cada Luns para os próximos eventos, se os tes.",
"You'll need to change the URLs where there were previously entered.": "Precisarás cambiar os URLs alá onde fosen previamente utilizados.",
@@ -1146,7 +1151,7 @@
"Your email is being changed": "Estase cambiando o teu correo",
"Your email will only be used to confirm that you're a real person and send you eventual updates for this event. It will NOT be transmitted to other instances or to the event organizer.": "O teu correo só se utilizará para confirmar que es unha persoa real e enviarche posibles actualizacións para o evento. NON será transferido a outras instancias ou á organización do evento.",
"Your federated identity": "A túa identidade federada",
- "Your membership was approved by {profile}.": "",
+ "Your membership was approved by {profile}.": "{profile} aprobou a túa membresía.",
"Your participation has been confirmed": "A túa participación foi confirmada",
"Your participation has been rejected": "A túa participación foi rexeitada",
"Your participation has been requested": "A túa participación foi solicitada",
@@ -1157,7 +1162,7 @@
"Your participation still has to be approved by the organisers.": "A participación aínda debe ser aprobada pola organización.",
"Your participation will be validated once you click the confirmation link into the email, and after the organizer manually validates your participation.": "A túa participación validarase unha vez premas na ligazón de confirmación do correo, e após a organización validará manualmente a participación.",
"Your participation will be validated once you click the confirmation link into the email.": "A túa participación será validada unha vez premas na ligazón de confirmación do correo.",
- "Your position was not available.": "",
+ "Your position was not available.": "A túa posición non estaba dispoñible.",
"Your profile will be shown as contact.": "O teu perfil será mostrado como contacto.",
"Your timezone is currently set to {timezone}.": "Zona horaria actual establecida a {timezone}.",
"Your timezone was detected as {timezone}.": "Zona horaria detectada como {timezone}.",
@@ -1170,7 +1175,7 @@
"[This comment has been deleted]": "[Este comentario foi eliminado]",
"[deleted]": "[eliminado]",
"a non-existent report": "denuncia non existente",
- "access to the group's private content as well": "",
+ "access to the group's private content as well": "accede tamén ao contido privado do grupo",
"and {number} groups": "e {number} grupos",
"any distance": "calquera distancia",
"as {identity}": "como {identity}",
@@ -1185,7 +1190,7 @@
"explore the events": "descubre os eventos",
"explore the groups": "atopar grupos",
"full rules": "normas completas",
- "group's upcoming public events": "",
+ "group's upcoming public events": "Próximos eventos públicos do grupo",
"https://mensuel.framapad.org/p/some-secret-token": "https://mensuel.framapad.org/p/some-secret-token",
"iCal Feed": "Fonte iCal",
"instance rules": "normas da instancia",
@@ -1198,21 +1203,21 @@
"terms of service": "termos do servizo",
"tool designed to serve you": "ferramenta creada para servirte",
"with another identity…": "con outra identidade…",
- "your notification settings": "",
+ "your notification settings": "axustes das túas notificacións",
"{'@'}{username}": "{'@'}{username}",
"{approved} / {total} seats": "{approved} / {total} prazas",
"{available}/{capacity} available places": "Non quedan prazas|{available}/{capacity} prazas dispoñibles",
"{count} km": "{count} km",
"{count} members": "Sen membros|Un membro|{count} membros",
- "{count} members or followers": "",
+ "{count} members or followers": "Sen membros ou seguidoras|Un membro ou seguidora|{count} membros ou seguidoras",
"{count} participants": "Sen participantes | Un participante | {count} participantes",
"{count} requests waiting": "{count} solicitudes agardando",
"{folder} - Resources": "{folder} - Recursos",
"{group} activity timeline": "Cronoloxía de actividade de {group}",
"{group} events": "Eventos de {group}",
- "{group} posts": "",
+ "{group} posts": "{group} publicacións",
"{group}'s events": "Eventos de {group}",
- "{group}'s todolists": "",
+ "{group}'s todolists": "Tarefas pendentes de {group}",
"{instanceName} is an instance of the {mobilizon} software.": "{instanceName} é unha instancia do software {mobilizon}.",
"{instanceName} is an instance of {mobilizon_link}, a free software built with the community.": "{instanceName} é unha instancia de {mobilizon_link}, software libre feito para a comunidade.",
"{member} accepted the invitation to join the group.": "{member} aceptou o convite para unirse ao grupo.",
@@ -1239,11 +1244,11 @@
"{number} organized events": "Sen eventos organizados|Un evento organizado|{number} eventos organizados",
"{number} participations": "Sen participacións|Unha participación|{number} participacións",
"{number} posts": "Sen publicacións|Unha publicación|{number} publicacións",
- "{number} seats left": "",
+ "{number} seats left": "Quedan {number} asentos",
"{old_group_name} was renamed to {group}.": "{old_group_name} mudou de nome a {group}.",
"{profile} (by default)": "{profile} (by default)",
"{profile} added the member {member}.": "{profile} engadiu a {member}.",
- "{profile} approved {member}'s membership.": "",
+ "{profile} approved {member}'s membership.": "{profile} aprobou a membresía de {member}.",
"{profile} archived the discussion {discussion}.": "{profile} arquivou o debate {discussion}.",
"{profile} created the discussion {discussion}.": "{profile} creou o debate {discussion}.",
"{profile} created the folder {resource}.": "{profile} creou o cartafol {resource}.",
@@ -1273,7 +1278,7 @@
"{profile} replied to the discussion {discussion}.": "{profile} respondeu ao debate {discussion}.",
"{profile} updated the group {group}.": "{profile} actualizou o grupo {group}.",
"{profile} updated the member {member}.": "{profile} actualizou a participante {member].",
- "{timezoneLongName} ({timezoneShortName})": "",
+ "{timezoneLongName} ({timezoneShortName})": "{timezoneLongName} ({timezoneShortName})",
"{title} ({count} todos)": "{title} ({count} pendentes)",
"{username} was invited to {group}": "{username} foi convidada a {group}",
"© The OpenStreetMap Contributors": "© The OpenStreetMap Contributors"
diff --git a/test/web/controllers/nodeinfo_controller_test.exs b/test/web/controllers/nodeinfo_controller_test.exs
index 08eca37a8..88bec3b2f 100644
--- a/test/web/controllers/nodeinfo_controller_test.exs
+++ b/test/web/controllers/nodeinfo_controller_test.exs
@@ -2,12 +2,16 @@ defmodule Mobilizon.Web.NodeInfoControllerTest do
use Mobilizon.Web.ConnCase
alias Mobilizon.Config
+ alias Mobilizon.Federation.ActivityPub.Relay
use Mobilizon.Web, :verified_routes
test "Get node info schemas", %{conn: conn} do
conn = get(conn, url(~p"/.well-known/nodeinfo"))
+ relay = Relay.get_actor()
+ relay_url = relay.url
+
assert json_response(conn, 200) == %{
"links" => [
%{
@@ -17,6 +21,10 @@ defmodule Mobilizon.Web.NodeInfoControllerTest do
%{
"href" => url(~p"/.well-known/nodeinfo/2.1"),
"rel" => "http://nodeinfo.diaspora.software/ns/schema/2.1"
+ },
+ %{
+ "href" => relay_url,
+ "rel" => "https://www.w3.org/ns/activitystreams#Application"
}
]
}