Merge branch 'send-notifications-when-participation-approval' into 'master'

Send Notifications when participation approval

See merge request framasoft/mobilizon!445
This commit is contained in:
Thomas Citharel 2020-06-08 14:17:50 +02:00
commit 1dc682ae4e
38 changed files with 2500 additions and 973 deletions

View File

@ -128,7 +128,7 @@ $mdi-font-path: "~@mdi/font/fonts";
body {
// background: #f7f8fa;
background: $body-background-color;
font-family: BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans",
font-family: BlinkMacSystemFont, Roboto, Oxygen, Ubuntu, Cantarell, "Segoe UI", "Fira Sans",
"Droid Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
/*main {*/

View File

@ -99,6 +99,7 @@ export const USER_SETTINGS_FRAGMENT = gql`
notificationOnDay
notificationEachWeek
notificationBeforeEvent
notificationPendingParticipation
}
`;
@ -119,12 +120,14 @@ export const SET_USER_SETTINGS = gql`
$notificationOnDay: Boolean
$notificationEachWeek: Boolean
$notificationBeforeEvent: Boolean
$notificationPendingParticipation: NotificationPendingParticipationEnum
) {
setUserSettings(
timezone: $timezone
notificationOnDay: $notificationOnDay
notificationEachWeek: $notificationEachWeek
notificationBeforeEvent: $notificationBeforeEvent
notificationPendingParticipation: $notificationPendingParticipation
) {
...UserSettingFragment
}

View File

@ -584,5 +584,15 @@
"Timezone": "Timezone",
"Select a timezone": "Select a timezone",
"Other": "Other",
"No moderation logs yet": "No moderation logs yet"
"No moderation logs yet": "No moderation logs yet",
"Participation notifications": "Participation notifications",
"We'll always send you emails to notify about important event updates": "We'll always send you emails to notify about important event updates",
"Like title or physical address update, start or end date change or event being confirmed or cancelled.": "Like title or physical address update, start or end date change or event being confirmed or cancelled.",
"Organizer notifications": "Organizer notifications",
"Notifications for manually approved participations to an event": "Notifications for manually approved participations to an event",
"We'll send you an email when there new participations requests.": "We'll send you an email when there new participations requests.",
"No notifications": "No notifications",
"Direct": "Direct",
"Every hour": "Every hour",
"Every day": "Every day"
}

File diff suppressed because it is too large Load Diff

View File

@ -19,9 +19,17 @@ export interface ICurrentUser {
settings: IUserSettings;
}
export enum INotificationPendingParticipationEnum {
NONE = "NONE",
DIRECT = "DIRECT",
ONE_DAY = "ONE_DAY",
ONE_HOUR = "ONE_HOUR",
}
export interface IUserSettings {
timezone: string;
notificationOnDay: string;
notificationEachWeek: string;
notificationBeforeEvent: string;
notificationPendingParticipation: INotificationPendingParticipationEnum;
}

View File

@ -1,63 +1,92 @@
<template>
<div v-if="loggedUser">
<div class="setting-title">
<h2>{{ $t("Participation notifications") }}</h2>
</div>
<div class="field">
<strong>{{
$t("We'll always send you emails to notifiy about important event updates")
}}</strong>
<p>
{{
$t(
"Like title or physical address update, start or end date change or event being confirmed or cancelled."
)
}}
</p>
</div>
<div class="field">
<b-checkbox v-model="notificationOnDay" @input="updateSetting({ notificationOnDay })">
<strong>{{ $t("Notification on the day of the event") }}</strong>
<p>
{{ $t("We'll use your timezone settings to send a recap of the morning of the event.") }}
</p>
<span v-if="loggedUser.settings.timezone">{{
$t("Your timezone is currently set to {timezone}.", {
timezone: loggedUser.settings.timezone,
})
}}</span>
<span v-else>{{ $t("You can pick your timezone into your preferences.") }}</span>
</b-checkbox>
</div>
<div class="field">
<b-checkbox v-model="notificationEachWeek" @input="updateSetting({ notificationEachWeek })">
<strong>{{ $t("Recap every week") }}</strong>
<p>
{{ $t("You'll get a weekly recap every Monday for upcoming events, if you have any.") }}
</p>
</b-checkbox>
</div>
<div class="field">
<b-checkbox
v-model="notificationBeforeEvent"
@input="updateSetting({ notificationBeforeEvent })"
>
<strong>{{ $t("Notification before the event") }}</strong>
<section>
<div class="setting-title">
<h2>{{ $t("Participation notifications") }}</h2>
</div>
<div class="field">
<strong>{{
$t("We'll always send you emails to notify about important event updates")
}}</strong>
<p>
{{
$t(
"We'll send you an email one hour before the event begins, to be sure you won't forget about it."
"Like title or physical address update, start or end date change or event being confirmed or cancelled."
)
}}
</p>
</b-checkbox>
</div>
</div>
<div class="field">
<b-checkbox v-model="notificationOnDay" @input="updateSetting({ notificationOnDay })">
<strong>{{ $t("Notification on the day of the event") }}</strong>
<p>
{{
$t("We'll use your timezone settings to send a recap of the morning of the event.")
}}
</p>
<span v-if="loggedUser.settings.timezone">{{
$t("Your timezone is currently set to {timezone}.", {
timezone: loggedUser.settings.timezone,
})
}}</span>
<span v-else>{{ $t("You can pick your timezone into your preferences.") }}</span>
</b-checkbox>
</div>
<div class="field">
<b-checkbox v-model="notificationEachWeek" @input="updateSetting({ notificationEachWeek })">
<strong>{{ $t("Recap every week") }}</strong>
<p>
{{ $t("You'll get a weekly recap every Monday for upcoming events, if you have any.") }}
</p>
</b-checkbox>
</div>
<div class="field">
<b-checkbox
v-model="notificationBeforeEvent"
@input="updateSetting({ notificationBeforeEvent })"
>
<strong>{{ $t("Notification before the event") }}</strong>
<p>
{{
$t(
"We'll send you an email one hour before the event begins, to be sure you won't forget about it."
)
}}
</p>
</b-checkbox>
</div>
</section>
<section>
<div class="setting-title">
<h2>{{ $t("Organizer notifications") }}</h2>
</div>
<div class="field">
<strong>{{ $t("Notifications for manually approved participations to an event") }}</strong>
<b-select
v-model="notificationPendingParticipation"
@input="updateSetting({ notificationPendingParticipation })"
>
<option
v-for="(value, key) in notificationPendingParticipationValues"
:value="key"
:key="key"
>{{ value }}</option
>
</b-select>
<p>
{{ $t("We'll send you an email when there new participations requests.") }}
</p>
</div>
</section>
</div>
</template>
<script lang="ts">
import { Component, Vue, Watch } from "vue-property-decorator";
import { USER_SETTINGS, SET_USER_SETTINGS } from "../../graphql/user";
import { ICurrentUser } from "../../types/current-user.model";
import {
ICurrentUser,
INotificationPendingParticipationEnum,
} from "../../types/current-user.model";
@Component({
apollo: {
@ -73,6 +102,19 @@ export default class Notifications extends Vue {
notificationBeforeEvent = false;
notificationPendingParticipation = INotificationPendingParticipationEnum.NONE;
notificationPendingParticipationValues: object = {};
mounted() {
this.notificationPendingParticipationValues = {
[INotificationPendingParticipationEnum.NONE]: this.$t("No notifications"),
[INotificationPendingParticipationEnum.DIRECT]: this.$t("Direct"),
[INotificationPendingParticipationEnum.ONE_HOUR]: this.$t("Every hour"),
[INotificationPendingParticipationEnum.ONE_DAY]: this.$t("Every day"),
};
}
async updateSetting(variables: object) {
await this.$apollo.mutate<{ setUserSettings: string }>({
mutation: SET_USER_SETTINGS,

View File

@ -504,14 +504,25 @@ defmodule Mobilizon.Federation.ActivityPub do
Audience.calculate_to_and_cc_from_mentions(participant),
{:ok, activity} <- create_activity(Map.merge(join_data, audience), local),
:ok <- maybe_federate(activity) do
if event.local && Mobilizon.Events.get_default_participant_role(event) === :participant &&
role == :participant do
accept(
:join,
participant,
true,
%{"actor" => event.organizer_actor.url}
)
if event.local do
cond do
Mobilizon.Events.get_default_participant_role(event) === :participant &&
role == :participant ->
accept(
:join,
participant,
true,
%{"actor" => event.organizer_actor.url}
)
Mobilizon.Events.get_default_participant_role(event) === :not_approved &&
role == :not_approved ->
Scheduler.pending_participation_notification(event)
{:ok, activity, participant}
true ->
{:ok, activity, participant}
end
else
{:ok, activity, participant}
end

View File

@ -117,6 +117,17 @@ defmodule Mobilizon.GraphQL.Schema.UserType do
field(:notification_before_event, :boolean,
description: "Whether this user will receive a notification right before event"
)
field(:notification_pending_participation, :notification_pending_participation_enum,
description: "When does the user receives a notification about new pending participations"
)
end
enum :notification_pending_participation_enum do
value(:none, as: :none)
value(:direct, as: :direct)
value(:one_hour, as: :one_hour)
value(:one_day, as: :one_day)
end
object :user_queries do
@ -231,6 +242,7 @@ defmodule Mobilizon.GraphQL.Schema.UserType do
arg(:notification_on_day, :boolean)
arg(:notification_each_week, :boolean)
arg(:notification_before_event, :boolean)
arg(:notification_pending_participation, :notification_pending_participation_enum)
resolve(&User.set_user_setting/3)
end
end

View File

@ -5,7 +5,7 @@ defmodule Mobilizon.Users.Setting do
use Ecto.Schema
import Ecto.Changeset
alias Mobilizon.Users.User
alias Mobilizon.Users.{NotificationPendingNotificationDelay, User}
@required_attrs [:user_id]
@ -13,7 +13,8 @@ defmodule Mobilizon.Users.Setting do
:timezone,
:notification_on_day,
:notification_each_week,
:notification_before_event
:notification_before_event,
:notification_pending_participation
]
@attrs @required_attrs ++ @optional_attrs
@ -24,6 +25,11 @@ defmodule Mobilizon.Users.Setting do
field(:notification_on_day, :boolean)
field(:notification_each_week, :boolean)
field(:notification_before_event, :boolean)
field(:notification_pending_participation, NotificationPendingNotificationDelay,
default: :none
)
belongs_to(:user, User, primary_key: true, type: :id, foreign_key: :id, define_field: false)
timestamps()

View File

@ -22,6 +22,8 @@ defmodule Mobilizon.Users do
defenum(UserRole, :user_role, [:administrator, :moderator, :user])
defenum(NotificationPendingNotificationDelay, none: 0, direct: 1, one_hour: 5, one_day: 10)
@doc """
Registers an user.
"""

View File

@ -3,10 +3,10 @@ defmodule Mobilizon.Service.Notifications.Scheduler do
Allows to insert jobs
"""
alias Mobilizon.{Actors, Users}
alias Mobilizon.Actors.Actor
alias Mobilizon.Events.{Event, Participant}
alias Mobilizon.Service.Workers.Notification
alias Mobilizon.Users
alias Mobilizon.Users.{Setting, User}
require Logger
@ -129,6 +129,61 @@ defmodule Mobilizon.Service.Notifications.Scheduler do
def weekly_notification(_), do: {:ok, nil}
def pending_participation_notification(%Event{
id: event_id,
organizer_actor_id: organizer_actor_id,
local: true
}) do
with %Actor{user_id: user_id} when not is_nil(user_id) <-
Actors.get_actor(organizer_actor_id),
%User{
settings: %Setting{
notification_pending_participation: notification_pending_participation,
timezone: timezone
}
} <- Users.get_user_with_settings!(user_id) do
send_at =
case notification_pending_participation do
:none ->
nil
:direct ->
:direct
:one_day ->
calculate_next_day_notification(Date.utc_today(), timezone)
:one_hour ->
DateTime.utc_now()
|> DateTime.shift_zone!(timezone)
|> (&%{&1 | minute: 0, second: 0, microsecond: {0, 0}}).()
end
params = %{
user_id: user_id,
event_id: event_id
}
cond do
# Sending directly
send_at == :direct ->
Notification.enqueue(:pending_participation_notification, params)
# Not sending
is_nil(send_at) ->
{:ok, nil}
# Sending to calculated time
true ->
Notification.enqueue(:pending_participation_notification, params, scheduled_at: send_at)
end
else
_ -> {:ok, nil}
end
end
def pending_participation_notification(_), do: {:ok, nil}
defp shift_zone(datetime, timezone) do
case DateTime.shift_zone(datetime, timezone) do
{:ok, shift_datetime} -> shift_datetime
@ -144,4 +199,15 @@ defmodule Mobilizon.Service.Notifications.Scheduler do
do: date,
else: calculate_first_day_of_week(Date.add(date, -1), locale)
end
defp calculate_next_day_notification(%Date{} = day, timezone) do
{:ok, send_at} = NaiveDateTime.new(day, ~T[18:00:00])
{:ok, send_at} = DateTime.from_naive(send_at, timezone)
if send_at < DateTime.utc_now() do
calculate_first_day_of_week(Date.add(day, 1), timezone)
else
send_at
end
end
end

View File

@ -80,6 +80,28 @@ defmodule Mobilizon.Service.Workers.Notification do
end
end
def perform(
%{
"op" => "pending_participation_notification",
"user_id" => user_id,
"event_id" => event_id
},
_job
) do
with %User{} = user <- Users.get_user(user_id),
{:ok, %Event{} = event} <- Events.get_event(event_id),
%Page{total: total} when total > 0 <-
Events.list_participants_for_event(event_id, [:not_approved]) do
user
|> Notification.pending_participation_notification(event, total)
|> Mailer.deliver_later()
else
err ->
require Logger
Logger.error(inspect(err))
end
end
defp shift_zone(datetime, timezone) do
case DateTime.shift_zone(datetime, timezone) do
{:ok, shift_datetime} -> shift_datetime

View File

@ -7,7 +7,7 @@ defmodule Mobilizon.Web.Email.Notification do
import Bamboo.Phoenix
import Mobilizon.Web.Gettext
alias Mobilizon.Events.Participant
alias Mobilizon.Events.{Event, Participant}
alias Mobilizon.Users.{Setting, User}
alias Mobilizon.Web.{Email, Gettext}
@ -80,4 +80,28 @@ defmodule Mobilizon.Web.Email.Notification do
|> assign(:subject, subject)
|> render(:notification_each_week)
end
def pending_participation_notification(
%User{locale: locale, email: email},
%Event{} = event,
total
) do
Gettext.put_locale(locale)
subject =
ngettext(
"One participation request for event %{title} to process",
"%{number_participation_requests} participation requests for event %{title} to process",
total,
number_participation_requests: total,
title: event.title
)
Email.base_email(to: email, subject: subject)
|> assign(:locale, locale)
|> assign(:event, event)
|> assign(:total, total)
|> assign(:subject, subject)
|> render(:pending_participation_notification)
end
end

View File

@ -0,0 +1,75 @@
<!-- HERO -->
<tr>
<td bgcolor="#424056" align="center" style="padding: 0px 10px 0px 10px;">
<!--[if (gte mso 9)|(IE)]>
<table align="center" border="0" cellspacing="0" cellpadding="0" width="600">
<tr>
<td align="center" valign="top" width="600">
<![endif]-->
<table border="0" cellpadding="0" cellspacing="0" width="100%" style="max-width: 600px;" >
<tr>
<td bgcolor="#ffffff" align="center" valign="top" style="padding: 40px 20px 20px 20px; border-radius: 4px 4px 0px 0px; color: #111111; font-family: 'Lato', Helvetica, Arial, sans-serif; font-size: 48px; font-weight: 400; line-height: 48px;">
<h1 style="font-size: 48px; font-weight: 400; margin: 0;">
<%= gettext "Pending participations to process" %>
</h1>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>
<!-- COPY BLOCK -->
<tr>
<td bgcolor="#f4f4f4" align="center" style="padding: 0px 10px 0px 10px;">
<!--[if (gte mso 9)|(IE)]>
<table align="center" border="0" cellspacing="0" cellpadding="0" width="600">
<tr>
<td align="center" valign="top" width="600">
<![endif]-->
<table border="0" cellpadding="0" cellspacing="0" width="100%" style="max-width: 600px;" >
<!-- COPY -->
<tr>
<td bgcolor="#ffffff" align="left" style="padding: 20px 30px 0px 30px; color: #666666; font-family: 'Lato', Helvetica, Arial, sans-serif; font-size: 18px; font-weight: 400; line-height: 25px;" >
<p style="margin: 0;">
<%= ngettext "You have one pending participation to process:", "You have %{number_participation_requests} participation requests to process:", @total, number_participation_requests: @total %>
</p>
</td>
</tr>
<tr>
<td bgcolor="#ffffff" align="left" style="padding: 20px 30px 0px 30px; color: #666666; font-family: 'Lato', Helvetica, Arial, sans-serif; font-size: 18px; font-weight: 400; line-height: 25px;" >
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td bgcolor="#ffffff" align="center" style="padding: 20px 30px 60px 30px;">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="center" style="border-radius: 3px;" bgcolor="#424056">
<a href="<%= page_url(Mobilizon.Web.Endpoint, :event, @event.uuid) <> "/participations" %>" target="_blank" style="font-size: 20px; font-family: Helvetica, Arial, sans-serif; color: #ffffff; text-decoration: none; color: #ffffff; text-decoration: none; padding: 15px 25px; border-radius: 2px; border: 1px solid #424056; display: inline-block;">
<%= gettext "Manage pending participation requests" %>
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td bgcolor="#ffffff" align="left" style="padding: 20px 30px 40px 30px; color: #777777; font-family: 'Lato', Helvetica, Arial, sans-serif; font-size: 14px; font-weight: 400; line-height: 20px;" >
<p style="margin: 0">
<%= gettext "You receive this email because you chose to get notifications for pending participations to your events. You may disable or change the configuration for these notification in your Mobilizon user settings." %>
</p>
</td>
</tr>
</table>
<!--[if (gte mso 9)|(IE)]>
</td>
</tr>
</table>
<![endif]-->
</td>
</tr>

View File

@ -0,0 +1,8 @@
<%= gettext "Pending participations to process" %>
==
<%= ngettext "You have one pending participation to process:", "You have %{number_participation_requests} participation requests to process:", @total, number_participation_requests: @total %>
<%= gettext "Manage pending participation requests" %> <%= page_url(Mobilizon.Web.Endpoint, :event, @event.uuid) <> "/participations" %>
<%= gettext "You receive this email because you chose to get notifications for pending participations to your events. You may disable or change the configuration for these notification in your Mobilizon user settings." %>

View File

@ -27,7 +27,7 @@ msgid "Feed for %{email} on Mobilizon"
msgstr ""
#, elixir-format
#: lib/web/templates/email/email.html.eex:155
#: lib/web/templates/email/email.html.eex:151
#: lib/web/templates/email/email.text.eex:16
msgid "%{instance} is a Mobilizon server."
msgstr "%{instance} هو خادم موبيليزون Mobilizon."
@ -48,7 +48,7 @@ msgid "Activate my account"
msgstr "تنشيط حسابي"
#, elixir-format
#: lib/web/templates/email/email.html.eex:124
#: lib/web/templates/email/email.html.eex:120
#: lib/web/templates/email/email.text.eex:14
msgid "Ask the community on Framacolibri"
msgstr "أطلب مِن المجتمَع على Framacolibri"
@ -76,7 +76,7 @@ msgid "Instructions to reset your password on %{instance}"
msgstr ""
#, elixir-format
#: lib/web/templates/email/email.html.eex:156
#: lib/web/templates/email/email.html.eex:152
msgid "Learn more about Mobilizon."
msgstr "تعلّم المزيد عن Mobilizon."
@ -86,7 +86,7 @@ msgid "Nearly here!"
msgstr ""
#, elixir-format
#: lib/web/templates/email/email.html.eex:121
#: lib/web/templates/email/email.html.eex:117
#: lib/web/templates/email/email.text.eex:12
msgid "Need some help? Something not working properly?"
msgstr ""
@ -305,23 +305,23 @@ msgid "You requested a new password for your account on %{instance}."
msgstr ""
#, elixir-format
#: lib/web/templates/email/email.html.eex:95
#: lib/web/templates/email/email.html.eex:91
msgid "In the meantime, please consider that the software is not (yet) finished. More information %{a_start}on our blog%{a_end}."
msgstr ""
#, elixir-format
#: lib/web/templates/email/email.html.eex:94
#: lib/web/templates/email/email.html.eex:90
msgid "Mobilizon is under development, we will add new features to this site during regular updates, until the release of %{b_start}version 1 of the software in the first half of 2020%{b_end}."
msgstr ""
#, elixir-format
#: lib/web/templates/email/email.html.eex:91
#: lib/web/templates/email/email.html.eex:87
#: lib/web/templates/email/email.text.eex:6
msgid "This is a demonstration site to test the beta version of Mobilizon."
msgstr ""
#, elixir-format
#: lib/web/templates/email/email.html.eex:89
#: lib/web/templates/email/email.html.eex:85
msgid "Warning"
msgstr "تنبيه"
@ -344,7 +344,7 @@ msgid "Event status has been set as tentative"
msgstr ""
#, elixir-format
#: lib/web/templates/email/email.html.eex:92
#: lib/web/templates/email/email.html.eex:88
msgid "%{b_start}Please do not use it in any real way%{b_end}"
msgstr ""
@ -677,7 +677,8 @@ msgid "Verify email address"
msgstr ""
#, elixir-format
#: lib/web/templates/email/on_day_notification.html.eex:70
#: lib/web/templates/email/notification_each_week.html.eex:70
#: lib/web/templates/email/notification_each_week.text.eex:14 lib/web/templates/email/on_day_notification.html.eex:70
#: lib/web/templates/email/on_day_notification.text.eex:14
msgid "If you need to cancel your participation, just access the event page through the link above and click on the participation button."
msgid_plural "If you need to cancel your participation, just access the event page through the links above and click on the participation button."
@ -776,3 +777,73 @@ msgstr ""
#: lib/web/templates/email/event_updated.html.eex:102
msgid "Physical address was removed"
msgstr ""
#, elixir-format
#: lib/web/email/notification.ex:70
msgid "One event planned this week"
msgid_plural "%{nb_events} events planned this week"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
#, elixir-format
#: lib/web/email/notification.ex:92
msgid "One participation request for event %{title} to process"
msgid_plural "%{number_participation_requests} participation requests for event %{title} to process"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
#, elixir-format
#: lib/web/templates/email/notification_each_week.html.eex:38
#: lib/web/templates/email/notification_each_week.text.eex:4
msgid "You have one event this week:"
msgid_plural "You have %{total} events this week:"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
#, elixir-format
#: lib/web/templates/email/pending_participation_notification.html.eex:38
#: lib/web/templates/email/pending_participation_notification.text.eex:4
msgid "You have one pending participation to process:"
msgid_plural "You have %{number_participation_requests} participation requests to process:"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
msgstr[4] ""
msgstr[5] ""
#, elixir-format
#: lib/web/templates/email/notification_each_week.html.eex:13
#: lib/web/templates/email/notification_each_week.text.eex:1
msgid "Events this week"
msgstr ""
#, elixir-format
#: lib/web/templates/email/pending_participation_notification.html.eex:51
#: lib/web/templates/email/pending_participation_notification.text.eex:6
msgid "Manage pending participation requests"
msgstr ""
#, elixir-format
#: lib/web/templates/email/pending_participation_notification.html.eex:13
#: lib/web/templates/email/pending_participation_notification.text.eex:1
msgid "Pending participations to process"
msgstr ""
#, elixir-format
#: lib/web/templates/email/pending_participation_notification.html.eex:64
#: lib/web/templates/email/pending_participation_notification.text.eex:8
msgid "You receive this email because you chose to get notifications for pending participations to your events. You may disable or change the configuration for these notification in your Mobilizon user settings."
msgstr ""

View File

@ -24,7 +24,7 @@ msgid "Feed for %{email} on Mobilizon"
msgstr ""
#, elixir-format
#: lib/web/templates/email/email.html.eex:155
#: lib/web/templates/email/email.html.eex:151
#: lib/web/templates/email/email.text.eex:16
msgid "%{instance} is a Mobilizon server."
msgstr ""
@ -45,7 +45,7 @@ msgid "Activate my account"
msgstr ""
#, elixir-format
#: lib/web/templates/email/email.html.eex:124
#: lib/web/templates/email/email.html.eex:120
#: lib/web/templates/email/email.text.eex:14
msgid "Ask the community on Framacolibri"
msgstr ""
@ -73,7 +73,7 @@ msgid "Instructions to reset your password on %{instance}"
msgstr ""
#, elixir-format
#: lib/web/templates/email/email.html.eex:156
#: lib/web/templates/email/email.html.eex:152
msgid "Learn more about Mobilizon."
msgstr ""
@ -83,7 +83,7 @@ msgid "Nearly here!"
msgstr ""
#, elixir-format
#: lib/web/templates/email/email.html.eex:121
#: lib/web/templates/email/email.html.eex:117
#: lib/web/templates/email/email.text.eex:12
msgid "Need some help? Something not working properly?"
msgstr ""
@ -302,23 +302,23 @@ msgid "You requested a new password for your account on %{instance}."
msgstr ""
#, elixir-format
#: lib/web/templates/email/email.html.eex:95
#: lib/web/templates/email/email.html.eex:91
msgid "In the meantime, please consider that the software is not (yet) finished. More information %{a_start}on our blog%{a_end}."
msgstr ""
#, elixir-format
#: lib/web/templates/email/email.html.eex:94
#: lib/web/templates/email/email.html.eex:90
msgid "Mobilizon is under development, we will add new features to this site during regular updates, until the release of %{b_start}version 1 of the software in the first half of 2020%{b_end}."
msgstr ""
#, elixir-format
#: lib/web/templates/email/email.html.eex:91
#: lib/web/templates/email/email.html.eex:87
#: lib/web/templates/email/email.text.eex:6
msgid "This is a demonstration site to test the beta version of Mobilizon."
msgstr ""
#, elixir-format
#: lib/web/templates/email/email.html.eex:89
#: lib/web/templates/email/email.html.eex:85
msgid "Warning"
msgstr ""
@ -341,7 +341,7 @@ msgid "Event status has been set as tentative"
msgstr ""
#, elixir-format
#: lib/web/templates/email/email.html.eex:92
#: lib/web/templates/email/email.html.eex:88
msgid "%{b_start}Please do not use it in any real way%{b_end}"
msgstr ""
@ -674,7 +674,8 @@ msgid "Verify email address"
msgstr ""
#, elixir-format
#: lib/web/templates/email/on_day_notification.html.eex:70
#: lib/web/templates/email/notification_each_week.html.eex:70
#: lib/web/templates/email/notification_each_week.text.eex:14 lib/web/templates/email/on_day_notification.html.eex:70
#: lib/web/templates/email/on_day_notification.text.eex:14
msgid "If you need to cancel your participation, just access the event page through the link above and click on the participation button."
msgid_plural "If you need to cancel your participation, just access the event page through the links above and click on the participation button."
@ -764,3 +765,61 @@ msgstr ""
#: lib/web/templates/email/event_updated.html.eex:102
msgid "Physical address was removed"
msgstr ""
#, elixir-format
#: lib/web/email/notification.ex:70
msgid "One event planned this week"
msgid_plural "%{nb_events} events planned this week"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#, elixir-format
#: lib/web/email/notification.ex:92
msgid "One participation request for event %{title} to process"
msgid_plural "%{number_participation_requests} participation requests for event %{title} to process"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#, elixir-format
#: lib/web/templates/email/notification_each_week.html.eex:38
#: lib/web/templates/email/notification_each_week.text.eex:4
msgid "You have one event this week:"
msgid_plural "You have %{total} events this week:"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#, elixir-format
#: lib/web/templates/email/pending_participation_notification.html.eex:38
#: lib/web/templates/email/pending_participation_notification.text.eex:4
msgid "You have one pending participation to process:"
msgid_plural "You have %{number_participation_requests} participation requests to process:"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#, elixir-format
#: lib/web/templates/email/notification_each_week.html.eex:13
#: lib/web/templates/email/notification_each_week.text.eex:1
msgid "Events this week"
msgstr ""
#, elixir-format
#: lib/web/templates/email/pending_participation_notification.html.eex:51
#: lib/web/templates/email/pending_participation_notification.text.eex:6
msgid "Manage pending participation requests"
msgstr ""
#, elixir-format
#: lib/web/templates/email/pending_participation_notification.html.eex:13
#: lib/web/templates/email/pending_participation_notification.text.eex:1
msgid "Pending participations to process"
msgstr ""
#, elixir-format
#: lib/web/templates/email/pending_participation_notification.html.eex:64
#: lib/web/templates/email/pending_participation_notification.text.eex:8
msgid "You receive this email because you chose to get notifications for pending participations to your events. You may disable or change the configuration for these notification in your Mobilizon user settings."
msgstr ""

View File

@ -28,7 +28,7 @@ msgid "Feed for %{email} on Mobilizon"
msgstr "Flux per %{email} a Mobilizon"
#, elixir-format
#: lib/web/templates/email/email.html.eex:155
#: lib/web/templates/email/email.html.eex:151
#: lib/web/templates/email/email.text.eex:16
msgid "%{instance} is a Mobilizon server."
msgstr "%{instance} és un servidor de Mobilizon."
@ -49,7 +49,7 @@ msgid "Activate my account"
msgstr "Activa el meu compte"
#, elixir-format
#: lib/web/templates/email/email.html.eex:124
#: lib/web/templates/email/email.html.eex:120
#: lib/web/templates/email/email.text.eex:14
msgid "Ask the community on Framacolibri"
msgstr "Pregunta a la comunitat a Framacolibri"
@ -77,7 +77,7 @@ msgid "Instructions to reset your password on %{instance}"
msgstr "Instruccions per canviar la contrasenya a %{instance}"
#, elixir-format
#: lib/web/templates/email/email.html.eex:156
#: lib/web/templates/email/email.html.eex:152
msgid "Learn more about Mobilizon."
msgstr "Per aprendre més de Mobilizon."
@ -87,7 +87,7 @@ msgid "Nearly here!"
msgstr "Hi ets a prop!"
#, elixir-format
#: lib/web/templates/email/email.html.eex:121
#: lib/web/templates/email/email.html.eex:117
#: lib/web/templates/email/email.text.eex:12
msgid "Need some help? Something not working properly?"
msgstr "Necessites ajuda? Alguna cosa no funciona?"
@ -319,14 +319,14 @@ msgid "You requested a new password for your account on %{instance}."
msgstr "Algú ha soŀlicitat a %{instance} una contrasenya nova."
#, elixir-format
#: lib/web/templates/email/email.html.eex:95
#: lib/web/templates/email/email.html.eex:91
msgid "In the meantime, please consider that the software is not (yet) finished. More information %{a_start}on our blog%{a_end}."
msgstr ""
"Mentrestant, tingues en compte que eaquest software encara no està acabat. "
"Pots trobar més info al %{a_start}nostre blog%{a_end}."
#, elixir-format
#: lib/web/templates/email/email.html.eex:94
#: lib/web/templates/email/email.html.eex:90
msgid "Mobilizon is under development, we will add new features to this site during regular updates, until the release of %{b_start}version 1 of the software in the first half of 2020%{b_end}."
msgstr ""
"Mobilizon està en desenvolupament. Hi anirem afegint funcionalitats dins de "
@ -334,13 +334,13 @@ msgstr ""
"meitat del 2020%{b_end}."
#, elixir-format
#: lib/web/templates/email/email.html.eex:91
#: lib/web/templates/email/email.html.eex:87
#: lib/web/templates/email/email.text.eex:6
msgid "This is a demonstration site to test the beta version of Mobilizon."
msgstr "Aquesta és una web de proves per provar la beta de Mobilizon."
#, elixir-format
#: lib/web/templates/email/email.html.eex:89
#: lib/web/templates/email/email.html.eex:85
msgid "Warning"
msgstr "Alerta"
@ -363,7 +363,7 @@ msgid "Event status has been set as tentative"
msgstr "S'ha posat l'estat a \"provisional\""
#, elixir-format
#: lib/web/templates/email/email.html.eex:92
#: lib/web/templates/email/email.html.eex:88
msgid "%{b_start}Please do not use it in any real way%{b_end}"
msgstr "%{b_start}No ho facis servir més que proves, sisplau%{b_end}"
@ -701,7 +701,8 @@ msgid "Verify email address"
msgstr ""
#, elixir-format
#: lib/web/templates/email/on_day_notification.html.eex:70
#: lib/web/templates/email/notification_each_week.html.eex:70
#: lib/web/templates/email/notification_each_week.text.eex:14 lib/web/templates/email/on_day_notification.html.eex:70
#: lib/web/templates/email/on_day_notification.text.eex:14
msgid "If you need to cancel your participation, just access the event page through the link above and click on the participation button."
msgid_plural "If you need to cancel your participation, just access the event page through the links above and click on the participation button."
@ -792,3 +793,57 @@ msgstr ""
#: lib/web/templates/email/event_updated.html.eex:102
msgid "Physical address was removed"
msgstr ""
#, elixir-format
#: lib/web/email/notification.ex:70
msgid "One event planned this week"
msgid_plural "%{nb_events} events planned this week"
msgstr[0] ""
msgstr[1] ""
#, elixir-format
#: lib/web/email/notification.ex:92
msgid "One participation request for event %{title} to process"
msgid_plural "%{number_participation_requests} participation requests for event %{title} to process"
msgstr[0] ""
msgstr[1] ""
#, elixir-format
#: lib/web/templates/email/notification_each_week.html.eex:38
#: lib/web/templates/email/notification_each_week.text.eex:4
msgid "You have one event this week:"
msgid_plural "You have %{total} events this week:"
msgstr[0] ""
msgstr[1] ""
#, elixir-format
#: lib/web/templates/email/pending_participation_notification.html.eex:38
#: lib/web/templates/email/pending_participation_notification.text.eex:4
msgid "You have one pending participation to process:"
msgid_plural "You have %{number_participation_requests} participation requests to process:"
msgstr[0] ""
msgstr[1] ""
#, elixir-format
#: lib/web/templates/email/notification_each_week.html.eex:13
#: lib/web/templates/email/notification_each_week.text.eex:1
msgid "Events this week"
msgstr ""
#, elixir-format
#: lib/web/templates/email/pending_participation_notification.html.eex:51
#: lib/web/templates/email/pending_participation_notification.text.eex:6
msgid "Manage pending participation requests"
msgstr ""
#, elixir-format
#: lib/web/templates/email/pending_participation_notification.html.eex:13
#: lib/web/templates/email/pending_participation_notification.text.eex:1
msgid "Pending participations to process"
msgstr ""
#, elixir-format
#: lib/web/templates/email/pending_participation_notification.html.eex:64
#: lib/web/templates/email/pending_participation_notification.text.eex:8
msgid "You receive this email because you chose to get notifications for pending participations to your events. You may disable or change the configuration for these notification in your Mobilizon user settings."
msgstr ""

View File

@ -24,7 +24,7 @@ msgid "Feed for %{email} on Mobilizon"
msgstr ""
#, elixir-format
#: lib/web/templates/email/email.html.eex:155
#: lib/web/templates/email/email.html.eex:151
#: lib/web/templates/email/email.text.eex:16
msgid "%{instance} is a Mobilizon server."
msgstr ""
@ -45,7 +45,7 @@ msgid "Activate my account"
msgstr ""
#, elixir-format
#: lib/web/templates/email/email.html.eex:124
#: lib/web/templates/email/email.html.eex:120
#: lib/web/templates/email/email.text.eex:14
msgid "Ask the community on Framacolibri"
msgstr ""
@ -73,7 +73,7 @@ msgid "Instructions to reset your password on %{instance}"
msgstr ""
#, elixir-format
#: lib/web/templates/email/email.html.eex:156
#: lib/web/templates/email/email.html.eex:152
msgid "Learn more about Mobilizon."
msgstr ""
@ -83,7 +83,7 @@ msgid "Nearly here!"
msgstr ""
#, elixir-format
#: lib/web/templates/email/email.html.eex:121
#: lib/web/templates/email/email.html.eex:117
#: lib/web/templates/email/email.text.eex:12
msgid "Need some help? Something not working properly?"
msgstr ""
@ -302,23 +302,23 @@ msgid "You requested a new password for your account on %{instance}."
msgstr ""
#, elixir-format
#: lib/web/templates/email/email.html.eex:95
#: lib/web/templates/email/email.html.eex:91
msgid "In the meantime, please consider that the software is not (yet) finished. More information %{a_start}on our blog%{a_end}."
msgstr ""
#, elixir-format
#: lib/web/templates/email/email.html.eex:94
#: lib/web/templates/email/email.html.eex:90
msgid "Mobilizon is under development, we will add new features to this site during regular updates, until the release of %{b_start}version 1 of the software in the first half of 2020%{b_end}."
msgstr ""
#, elixir-format
#: lib/web/templates/email/email.html.eex:91
#: lib/web/templates/email/email.html.eex:87
#: lib/web/templates/email/email.text.eex:6
msgid "This is a demonstration site to test the beta version of Mobilizon."
msgstr ""
#, elixir-format
#: lib/web/templates/email/email.html.eex:89
#: lib/web/templates/email/email.html.eex:85
msgid "Warning"
msgstr ""
@ -341,7 +341,7 @@ msgid "Event status has been set as tentative"
msgstr ""
#, elixir-format
#: lib/web/templates/email/email.html.eex:92
#: lib/web/templates/email/email.html.eex:88
msgid "%{b_start}Please do not use it in any real way%{b_end}"
msgstr ""
@ -674,7 +674,8 @@ msgid "Verify email address"
msgstr ""
#, elixir-format
#: lib/web/templates/email/on_day_notification.html.eex:70
#: lib/web/templates/email/notification_each_week.html.eex:70
#: lib/web/templates/email/notification_each_week.text.eex:14 lib/web/templates/email/on_day_notification.html.eex:70
#: lib/web/templates/email/on_day_notification.text.eex:14
msgid "If you need to cancel your participation, just access the event page through the link above and click on the participation button."
msgid_plural "If you need to cancel your participation, just access the event page through the links above and click on the participation button."
@ -764,3 +765,61 @@ msgstr ""
#: lib/web/templates/email/event_updated.html.eex:102
msgid "Physical address was removed"
msgstr ""
#, elixir-format
#: lib/web/email/notification.ex:70
msgid "One event planned this week"
msgid_plural "%{nb_events} events planned this week"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#, elixir-format
#: lib/web/email/notification.ex:92
msgid "One participation request for event %{title} to process"
msgid_plural "%{number_participation_requests} participation requests for event %{title} to process"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#, elixir-format
#: lib/web/templates/email/notification_each_week.html.eex:38
#: lib/web/templates/email/notification_each_week.text.eex:4
msgid "You have one event this week:"
msgid_plural "You have %{total} events this week:"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#, elixir-format
#: lib/web/templates/email/pending_participation_notification.html.eex:38
#: lib/web/templates/email/pending_participation_notification.text.eex:4
msgid "You have one pending participation to process:"
msgid_plural "You have %{number_participation_requests} participation requests to process:"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
#, elixir-format
#: lib/web/templates/email/notification_each_week.html.eex:13
#: lib/web/templates/email/notification_each_week.text.eex:1
msgid "Events this week"
msgstr ""
#, elixir-format
#: lib/web/templates/email/pending_participation_notification.html.eex:51
#: lib/web/templates/email/pending_participation_notification.text.eex:6
msgid "Manage pending participation requests"
msgstr ""
#, elixir-format
#: lib/web/templates/email/pending_participation_notification.html.eex:13
#: lib/web/templates/email/pending_participation_notification.text.eex:1
msgid "Pending participations to process"
msgstr ""
#, elixir-format
#: lib/web/templates/email/pending_participation_notification.html.eex:64
#: lib/web/templates/email/pending_participation_notification.text.eex:8
msgid "You receive this email because you chose to get notifications for pending participations to your events. You may disable or change the configuration for these notification in your Mobilizon user settings."
msgstr ""

View File

@ -29,7 +29,7 @@ msgid "Feed for %{email} on Mobilizon"
msgstr "Feed für %{email} auf Mobilizon"
#, elixir-format
#: lib/web/templates/email/email.html.eex:155
#: lib/web/templates/email/email.html.eex:151
#: lib/web/templates/email/email.text.eex:16
msgid "%{instance} is a Mobilizon server."
msgstr "%{instance} ist ein Mobilizon-Server."
@ -51,7 +51,7 @@ msgid "Activate my account"
msgstr "Aktiviere meinen Account"
#, elixir-format
#: lib/web/templates/email/email.html.eex:124
#: lib/web/templates/email/email.html.eex:120
#: lib/web/templates/email/email.text.eex:14
msgid "Ask the community on Framacolibri"
msgstr "Frag die Gemeinschaft auf Framacolibri"
@ -79,7 +79,7 @@ msgid "Instructions to reset your password on %{instance}"
msgstr "Anweisungen um dein Passwort auf %{instance} zurückzusetzen"
#, elixir-format
#: lib/web/templates/email/email.html.eex:156
#: lib/web/templates/email/email.html.eex:152
msgid "Learn more about Mobilizon."
msgstr "Lerne mehr über Mobilizon."
@ -89,7 +89,7 @@ msgid "Nearly here!"
msgstr "Fast hier!"
#, elixir-format
#: lib/web/templates/email/email.html.eex:121
#: lib/web/templates/email/email.html.eex:117
#: lib/web/templates/email/email.text.eex:12
msgid "Need some help? Something not working properly?"
msgstr "Brauchst Du Hilfe? Funktioniert etwas nicht richtig?"
@ -324,14 +324,14 @@ msgstr ""
"Du hast ein neues Passwort für deinen Account auf %{instance} angefragt."
#, elixir-format
#: lib/web/templates/email/email.html.eex:95
#: lib/web/templates/email/email.html.eex:91
msgid "In the meantime, please consider that the software is not (yet) finished. More information %{a_start}on our blog%{a_end}."
msgstr ""
"Bitte beachte in der Zwischenzeit, dass diese Software (noch) fertiggestellt "
"ist. Weitere Informationen %{a_start}in unserem Blog%{a_end}."
#, elixir-format
#: lib/web/templates/email/email.html.eex:94
#: lib/web/templates/email/email.html.eex:90
msgid "Mobilizon is under development, we will add new features to this site during regular updates, until the release of %{b_start}version 1 of the software in the first half of 2020%{b_end}."
msgstr ""
"Mobilizon befindet sich in der Entwicklung, wir werden neue Funktionen "
@ -339,13 +339,13 @@ msgstr ""
"in der ersten Hälfte von 2020 veröffentlicht wird%{b_end}."
#, elixir-format
#: lib/web/templates/email/email.html.eex:91
#: lib/web/templates/email/email.html.eex:87
#: lib/web/templates/email/email.text.eex:6
msgid "This is a demonstration site to test the beta version of Mobilizon."
msgstr "Dies ist eine Demo-Seite, um die Beta-Version von Mobilizon zu testen."
#, elixir-format
#: lib/web/templates/email/email.html.eex:89
#: lib/web/templates/email/email.html.eex:85
msgid "Warning"
msgstr "Warnung"
@ -368,7 +368,7 @@ msgid "Event status has been set as tentative"
msgstr "Veranstaltung wurde als vorläufig markiert"
#, elixir-format
#: lib/web/templates/email/email.html.eex:92
#: lib/web/templates/email/email.html.eex:88
msgid "%{b_start}Please do not use it in any real way%{b_end}"
msgstr ""
@ -708,7 +708,8 @@ msgid "Verify email address"
msgstr "Bestätig E-Mail Adresse"
#, elixir-format
#: lib/web/templates/email/on_day_notification.html.eex:70
#: lib/web/templates/email/notification_each_week.html.eex:70
#: lib/web/templates/email/notification_each_week.text.eex:14 lib/web/templates/email/on_day_notification.html.eex:70
#: lib/web/templates/email/on_day_notification.text.eex:14
msgid "If you need to cancel your participation, just access the event page through the link above and click on the participation button."
msgid_plural "If you need to cancel your participation, just access the event page through the links above and click on the participation button."
@ -799,3 +800,57 @@ msgstr ""
#: lib/web/templates/email/event_updated.html.eex:102
msgid "Physical address was removed"
msgstr ""
#, elixir-format
#: lib/web/email/notification.ex:70
msgid "One event planned this week"
msgid_plural "%{nb_events} events planned this week"
msgstr[0] ""
msgstr[1] ""
#, elixir-format
#: lib/web/email/notification.ex:92
msgid "One participation request for event %{title} to process"
msgid_plural "%{number_participation_requests} participation requests for event %{title} to process"
msgstr[0] ""
msgstr[1] ""
#, elixir-format
#: lib/web/templates/email/notification_each_week.html.eex:38
#: lib/web/templates/email/notification_each_week.text.eex:4
msgid "You have one event this week:"
msgid_plural "You have %{total} events this week:"
msgstr[0] ""
msgstr[1] ""
#, elixir-format
#: lib/web/templates/email/pending_participation_notification.html.eex:38
#: lib/web/templates/email/pending_participation_notification.text.eex:4
msgid "You have one pending participation to process:"
msgid_plural "You have %{number_participation_requests} participation requests to process:"
msgstr[0] ""
msgstr[1] ""
#, elixir-format
#: lib/web/templates/email/notification_each_week.html.eex:13
#: lib/web/templates/email/notification_each_week.text.eex:1
msgid "Events this week"
msgstr ""
#, elixir-format
#: lib/web/templates/email/pending_participation_notification.html.eex:51
#: lib/web/templates/email/pending_participation_notification.text.eex:6
msgid "Manage pending participation requests"
msgstr ""
#, elixir-format
#: lib/web/templates/email/pending_participation_notification.html.eex:13
#: lib/web/templates/email/pending_participation_notification.text.eex:1
msgid "Pending participations to process"
msgstr ""
#, elixir-format
#: lib/web/templates/email/pending_participation_notification.html.eex:64
#: lib/web/templates/email/pending_participation_notification.text.eex:8
msgid "You receive this email because you chose to get notifications for pending participations to your events. You may disable or change the configuration for these notification in your Mobilizon user settings."
msgstr ""

View File

@ -10,7 +10,7 @@ msgid "Feed for %{email} on Mobilizon"
msgstr ""
#, elixir-format
#: lib/web/templates/email/email.html.eex:155
#: lib/web/templates/email/email.html.eex:151
#: lib/web/templates/email/email.text.eex:16
msgid "%{instance} is a Mobilizon server."
msgstr ""
@ -31,7 +31,7 @@ msgid "Activate my account"
msgstr ""
#, elixir-format
#: lib/web/templates/email/email.html.eex:124
#: lib/web/templates/email/email.html.eex:120
#: lib/web/templates/email/email.text.eex:14
msgid "Ask the community on Framacolibri"
msgstr ""
@ -59,7 +59,7 @@ msgid "Instructions to reset your password on %{instance}"
msgstr ""
#, elixir-format
#: lib/web/templates/email/email.html.eex:156
#: lib/web/templates/email/email.html.eex:152
msgid "Learn more about Mobilizon."
msgstr ""
@ -69,7 +69,7 @@ msgid "Nearly here!"
msgstr ""
#, elixir-format
#: lib/web/templates/email/email.html.eex:121
#: lib/web/templates/email/email.html.eex:117
#: lib/web/templates/email/email.text.eex:12
msgid "Need some help? Something not working properly?"
msgstr ""
@ -288,23 +288,23 @@ msgid "You requested a new password for your account on %{instance}."
msgstr ""
#, elixir-format
#: lib/web/templates/email/email.html.eex:95
#: lib/web/templates/email/email.html.eex:91
msgid "In the meantime, please consider that the software is not (yet) finished. More information %{a_start}on our blog%{a_end}."
msgstr ""
#, elixir-format
#: lib/web/templates/email/email.html.eex:94