From 77b1a601e0d0cf4019096be5526fef2ebddb47a4 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Wed, 31 Mar 2021 11:55:19 +0200 Subject: [PATCH 01/85] Change the URL to the main documentation Signed-off-by: Thomas Citharel --- UPGRADE.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/UPGRADE.md b/UPGRADE.md index 9e5d24b59..257e16eb9 100644 --- a/UPGRADE.md +++ b/UPGRADE.md @@ -16,7 +16,7 @@ Staying on source releases means: * You can change things in Mobilizon's code and recompile right away to test changes ## Releases -If you want to migrate to releases, [we provide a full guide](https://tcit.frama.io/documentation/administration/upgrading/source_to_release/). You may do this at any time. +If you want to migrate to releases, [we provide a full guide](https://docs.joinmobilizon.org/administration/upgrading/source_to_release/). You may do this at any time. ## Source install To stay on a source release, you just need to check the following things: From 2de1c08bc8b5f780d0302ee403b0d50207ce7056 Mon Sep 17 00:00:00 2001 From: cornerot Date: Tue, 6 Apr 2021 16:36:55 +0000 Subject: [PATCH 02/85] Added "ru" lang to langs.json --- js/src/i18n/langs.json | 1 + 1 file changed, 1 insertion(+) diff --git a/js/src/i18n/langs.json b/js/src/i18n/langs.json index d38d4bc6e..f79f45afa 100644 --- a/js/src/i18n/langs.json +++ b/js/src/i18n/langs.json @@ -22,6 +22,7 @@ "pl": "Polski", "pt": "Português", "pt_BR": "Português brasileiro", + "ru": "Русский", "sl": "Slovenščina", "sv": "Svenska", "zh_Hant": "繁體字" From dbe42de804bf836a74b6515b1779ab60d42c364c Mon Sep 17 00:00:00 2001 From: deadmorose Date: Wed, 31 Mar 2021 16:01:07 +0000 Subject: [PATCH 03/85] Translated using Weblate (Russian) Currently translated at 100.0% (169 of 169 strings) Translation: Mobilizon/Backend errors Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend-errors/ru/ --- priv/gettext/ru/LC_MESSAGES/errors.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/priv/gettext/ru/LC_MESSAGES/errors.po b/priv/gettext/ru/LC_MESSAGES/errors.po index aec3ff811..4e3828492 100644 --- a/priv/gettext/ru/LC_MESSAGES/errors.po +++ b/priv/gettext/ru/LC_MESSAGES/errors.po @@ -8,7 +8,7 @@ ## to merge POT files into PO files. msgid "" msgstr "" -"PO-Revision-Date: 2021-03-29 18:51+0000\n" +"PO-Revision-Date: 2021-03-31 16:01+0000\n" "Last-Translator: deadmorose \n" "Language-Team: Russian \n" @@ -443,12 +443,12 @@ msgstr "Не найдено человека с именем пользоват #: lib/graphql/resolvers/post.ex:167 lib/graphql/resolvers/post.ex:200 #, elixir-format msgid "Post ID is not a valid ID" -msgstr "ID публикации имеет недопустимое значение" +msgstr "ID поста имеет недопустимое значение" #: lib/graphql/resolvers/post.ex:170 lib/graphql/resolvers/post.ex:203 #, elixir-format msgid "Post doesn't exist" -msgstr "Публикация не существует" +msgstr "Пост не существует" #: lib/graphql/resolvers/member.ex:83 #, elixir-format @@ -761,7 +761,7 @@ msgstr "Этот электронный адрес уже используетс #: lib/graphql/error.ex:88 #, elixir-format msgid "Post not found" -msgstr "Публикация не найдена" +msgstr "Пост не найден" #: lib/graphql/error.ex:75 #, elixir-format From c89f17d5981abc9a1cfc2588dbb662b045712710 Mon Sep 17 00:00:00 2001 From: deadmorose Date: Wed, 31 Mar 2021 16:10:55 +0000 Subject: [PATCH 04/85] Translated using Weblate (Russian) Currently translated at 66.1% (649 of 981 strings) Translation: Mobilizon/Frontend Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/ru/ --- js/src/i18n/ru.json | 65 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/js/src/i18n/ru.json b/js/src/i18n/ru.json index b1042a911..a8679f269 100644 --- a/js/src/i18n/ru.json +++ b/js/src/i18n/ru.json @@ -1,7 +1,11 @@ { "(Masked)": "(Скрыто)", + "(this folder)": "(эта папка)", + "(this link)": "(эта ссылка)", "@{group}": "@{group}", "@{username} ({role})": "@{username} ({role})", + "A place for your code of conduct, rules or guidelines. You can use HTML tags.": "Тут можно разместить общие правила, положения или руководства. Вы можете использовать HTML-теги.", + "A place to explain who you are and the things that set your instance apart. You can use HTML tags.": "Тут можно подробно описать кто вы и что делает этот узел особенным. Вы можете использовать HTML-теги.", "A user-friendly, emancipatory and ethical tool for gathering, organising, and mobilising.": "Удобный, свободный и этичный инструмент для объединения, организации и мобилизации.", "A validation email was sent to {email}": "Письмо с подтверждением было отправлено на адрес {email}", "API": "API", @@ -19,6 +23,7 @@ "Actor": "Агент", "Add": "Добавить", "Add a group": "Добавить группу", + "Add a new post": "Добавить новый пост", "Add a note": "Добавить заметку", "Add a todo": "Добавить в список задач", "Add an address": "Добавить адрес", @@ -39,6 +44,7 @@ "Anonymous participant": "Анонимный участник", "Anonymous participants will be asked to confirm their participation through e-mail.": "Анонимные участники получат запрос на подтверждение своего участия по электронной почте.", "Anonymous participations": "Анонимное участие", + "Any day": "В любой день", "Application": "Приложение", "Are you really sure you want to delete your whole account? You'll lose everything. Identities, settings, events created, messages and participations will be gone forever.": "Вы действительно уверены, что хотите удалить свою учетную запись? Вы потеряете всё. Идентификаторы, настройки, созданные мероприятия, сообщения и история исчезнут навсегда.", "Are you sure you want to delete this comment? This action cannot be undone.": "Вы действительно хотите удалить этот комментарий? Это действие не может быть отменено.", @@ -55,6 +61,8 @@ "Bold": "Жирный", "By @{group}": "Из @{group}", "By @{username}": "От @{username}", + "By {author}": "Автор {author}", + "Can be an email or a link, or just plain text.": "Может быть адресом электронной почты, ссылкой или простым текстом.", "Cancel": "Отмена", "Cancel anonymous participation": "Отменить анонимное участие", "Cancel creation": "Отменить создание", @@ -86,6 +94,8 @@ "Country": "Страна", "Create": "Создать", "Create a calc": "Создать таблицу", + "Create a discussion": "Начать обсуждение", + "Create a folder": "Создать папку", "Create a new event": "Создать новое мероприятие", "Create a new group": "Создать новую группу", "Create a new identity": "Создать новый идентификатор", @@ -97,6 +107,7 @@ "Create my group": "Создать мою группу", "Create my profile": "Создать мой профиль", "Create resource": "Создать ресурс", + "Create the discussion": "Начать обсуждение", "Create token": "Создать токен", "Current identity has been changed to {identityName} in order to manage this event.": "Текущий идентификатор был изменен на {identityName}, чтобы иметь возможность управлять этим событием.", "Current page": "Текущая страница", @@ -111,13 +122,17 @@ "Date parameters": "Параметры даты", "Decline": "Отклонить", "Default": "По умолчанию", + "Default Mobilizon privacy policy": "Политика конфиденциальности Mobilizon по умолчанию", + "Default Mobilizon terms": "Условия использования Mobilizon по умолчанию", "Delete": "Удалить", "Delete Comment": "Удалить комментарий", "Delete Event": "Удалить мероприятие", "Delete account": "Удалить учётную запись", + "Delete conversation": "Удалить беседу", "Delete event": "Удалить мероприятие", "Delete everything": "Удалить всё", "Delete my account": "Удалить мою учётную запись", + "Delete post": "Удалить пост", "Delete this identity": "Удалить этот идентификатор", "Delete your identity": "Удалить ваш идентификатор", "Delete {eventTitle}": "Удалить {eventTitle}", @@ -131,6 +146,7 @@ "Discussions": "Обсуждения", "Display name": "Отображаемое имя", "Display participation price": "Показать стоимость участия", + "Displayed on homepage and meta tags. Describe what Mobilizon is and what makes this instance special in a single paragraph.": "Отображается на главной странице и в метатегах. Опишите в одном абзаце, что такое Mobilizon и что делает этот узел особенным.", "Do not receive any mail": "Не получать электронные письма", "Domain": "Домен", "Draft": "Черновик", @@ -138,6 +154,7 @@ "Due on": "Выполнить к", "Duplicate": "Копировать", "Edit": "Редактировать", + "Edit post": "Редактировать пост", "Eg: Stockholm, Dance, Chess…": "Например: Москва, танцы, шахматы…", "Either on the {instance} instance or on another instance.": "На узле {instance}, либо на другом.", "Either the account is already validated, either the validation token is incorrect.": "Учетная запись уже подтверждена или токен проверки недействителен.", @@ -150,7 +167,11 @@ "Ends on…": "Заканчивается в…", "Enter the link URL": "Введите URL ссылки", "Enter your email address below, and we'll email you instructions on how to change your password.": "Введите ниже свой адрес электронной почты, и мы пришлём вам инструкции по изменению пароля.", + "Enter your own privacy policy. HTML tags allowed. The {mobilizon_privacy_policy} is provided as template.": "Введите свою политику конфиденциальности. Вы можете использовать HTML-теги. {mobilizon_privacy_policy} используется в качестве шаблона.", + "Enter your own terms. HTML tags allowed. The {mobilizon_terms} are provided as template.": "Введите свои собственные условия. Вы можете использовать HTML-теги. {mobilizon_terms} используется в качестве шаблона.", "Error while changing email": "Произошла ошибка при изменении адреса электронной почты", + "Error while login with {provider}. Retry or login another way.": "Не удалось войти через {provider}. Повторите попытку или войдите другим способом.", + "Error while login with {provider}. This login provider doesn't exist.": "Не удалось войти через {provider}. Такого провайдера аутентификации не существует.", "Error while validating account": "Ошибка подтверждения учётной записи", "Error while validating participation request": "Произошла ошибка при проверке заявки на участие", "Event": "Мероприятие", @@ -171,10 +192,12 @@ "Failed to save admin settings": "Не удалось сохранить настройки администратора", "Featured events": "Избранные мероприятия", "Federation": "Федерализация", + "Fetch more": "Загрузить больше", "Find an address": "Найти адрес", "Find an instance": "Найти узел", "Followers": "Подписчики", "Followings": "Подписки", + "For instance: London": "Например: Москва", "For instance: London, Taekwondo, Architecture…": "Например: Москва, йога, архитектура…", "Forgot your password ?": "Забыли свой пароль?", "Forgot your password?": "Забыли свой пароль?", @@ -189,6 +212,9 @@ "Go": "Идти", "Group Members": "Участники группы", "Group name": "Название группы", + "Group settings": "Настройки группы", + "Group short description": "Краткое описание группы", + "Group visibility": "Видимость группы", "Group {displayName} created": "Группа {displayName} создана", "Groups": "Группы", "Headline picture": "Заглавное изображение", @@ -213,11 +239,13 @@ "If you want, you may send a message to the event organizer here.": "Здесь вы можете отправить сообщение организатору мероприятия.", "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.": "Приложение в этом контексте - это программное обеспечение, предоставленное командой Mobilizon или третьей стороной, которое используется для взаимодействия с вашим узлом.", "Instance": "Узел", + "Instance Long Description": "Подробное описание узла", "Instance Name": "Имя узла", "Instance Privacy Policy": "Политика конфиденциальности узла", "Instance Privacy Policy Source": "Источник политики конфиденциальности узла", "Instance Privacy Policy URL": "URL-адрес политики конфиденциальности узла", "Instance Rules": "Правила узла", + "Instance Short Description": "Краткое описание узла", "Instance Terms": "Условия использования узла", "Instance Terms Source": "Условия использования этого узла", "Instance Terms URL": "URL условий использования узла", @@ -228,8 +256,10 @@ "Instances": "Узлы", "Invite a new member": "Пригласить нового участника", "Invite member": "Пригласить участника", + "Invited": "Приглашён", "Italic": "Курсив", "Join {instance}, a Mobilizon instance": "Присоединиться к {instance}, узлу Mobilizon", + "Key words": "Ключевые слова", "Language": "Язык", "Last published event": "Последнее опубликованное мероприятие", "Last week": "На прошлой неделе", @@ -255,6 +285,7 @@ "Login status": "Статус входа", "Manage participations": "Управление участниками", "Mark as resolved": "Отметить как решённое", + "Member": "Участник", "Members": "Участники", "Message": "Сообщение", "Mobilizon": "Mobilizon", @@ -267,18 +298,24 @@ "Moderation log": "Журнал модерации", "Moderator": "Модератор", "Move": "Переместить", + "Move \"{resourceName}\"": "Переместить \"{resourceName}\"", + "Move resource to {folder}": "Переместить ресурс в {folder}", "My account": "Моя учётная запись", "My events": "Мои мероприятия", "My groups": "Мои группы", "My identities": "Мои идентификаторы", + "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.": "ВНИМАНИЕ! Условия по умолчанию не были проверены юристом и, вероятно, не обеспечивают полную правовую защиту во всех ситуациях для администратора узла, использующего их. Они также не подходит для каждого государства и правовой системы. Если вы не уверены, проконсультируйтесь с юристом.", "Name": "Имя", + "New discussion": "Новое обсуждение", "New email": "Новый адрес электронной почты", "New folder": "Новая папка", "New link": "Новая ссылка", "New note": "Новая заметка", "New password": "Новый пароль", "New profile": "Новый профиль", + "Next month": "В следующем месяце", "Next page": "Следующая страница", + "Next week": "На следующей неделе", "No address defined": "Адрес не указан", "No closed reports yet": "Пока нет закрытых отчётов", "No comment": "Нет комментариев", @@ -291,6 +328,7 @@ "No instance to approve|Approve instance|Approve {number} instances": "Нет узлов для одобрения | Одобрить узел | Одобрить {number} узлов", "No instance to reject|Reject instance|Reject {number} instances": "Нет узлов для отклонения | Отклонить узел | Отклонить {number} узлов", "No instance to remove|Remove instance|Remove {number} instances": "Нет узлов для удаления | Удалить узел | Удалить {number} узлов", + "No member matches the filters": "Ни один участник не соответствует критериям", "No message": "Нет сообщений", "No moderation logs yet": "Журналов модерации пока нет", "No one is going to this event": "Никто не идёт на это мероприятие|Один человек пойдёт|{going} людей пойдут", @@ -299,8 +337,10 @@ "No participant to approve|Approve participant|Approve {number} participants": "Нет участников для одобрения | Принять участника | Принять {number} участников", "No participant to reject|Reject participant|Reject {number} participants": "Нет участников для отклонения | Отклонить участника | Отклонить {number} участников", "No profile matches the filters": "Ни один профиль не соответствует критериям", + "No profiles found": "Профили не найдены", "No public upcoming events": "Нет предстоящих публичных мероприятий", "No resolved reports yet": "Решённых отчётов пока нет", + "No resources in this folder": "В этой папке нет ресурсов", "No resources selected": "Ресурсы не выбраны|Выбран один ресурс|Выбрано {count} ресурсов", "No results for \"{queryText}\"": "Нет результатов по запросу \"{queryText}\"", "No rules defined yet.": "Правила еще не определены.", @@ -319,7 +359,9 @@ "On {date} ending at {endTime}": "{date}, заканчивается в {endTime}", "On {date} from {startTime} to {endTime}": "{date} c {startTime} до {endTime}", "On {date} starting at {startTime}": "{date}, начало в {startTime}", + "Only accessible through link": "Доступно только по ссылке", "Only accessible through link (private)": "Доступно только по ссылке (приватно)", + "Only accessible to members of the group": "Доступно только участникам группы", "Only alphanumeric lowercased characters and underscores are supported.": "Допустимы только буквенно-цифровые символы нижнего регистра и подчеркивания.", "Open": "Открыть", "Opened reports": "Открытые отчёты", @@ -335,6 +377,7 @@ "Otherwise this identity will just be removed from the group administrators.": "В противном случае этот идентификатор будет удалён у администраторов группы.", "Page": "Страница", "Page limited to my group (asks for auth)": "Страница предназначена только для моей группы (требуется авторизация)", + "Parent folder": "Родительская папка", "Participant": "Участник", "Participants": "Участники", "Participate": "Принять участие", @@ -356,9 +399,11 @@ "Please do not use it in any real way.": "Пожалуйста, используйте это только для тестовых целей.", "Please enter your password to confirm this action.": "Введите свой пароль, чтобы подтвердить это действие.", "Please make sure the address is correct and that the page hasn't been moved.": "Убедитесь, что адрес правильный и страница не была перемещена.", + "Post": "Пост", "Post a comment": "Оставить комментарий", "Post a reply": "Ответить", "Postal Code": "Почтовый индекс", + "Posts": "Посты", "Powered by {mobilizon}. © 2018 - {date} The Mobilizon Contributors - Made with the financial support of {contributors}.": "На основе {mobilizon}. © 2018 - {date} Участники Mobilizon - Создан благодаря финансовой поддержке {contributors}.", "Preferences": "Предпочтения", "Previous page": "Предыдущая страница", @@ -377,9 +422,11 @@ "Publish": "Опубликовать", "Published events with {comments} comments and {participations} confirmed participations": "Опубликованные мероприятия с {comments} комментариями и {participations} подтвержденными участниками", "RSS/Atom Feed": "RSS/Atom новостная лента", + "Radius": "Радиус", "Recap every week": "Подводить итоги каждую неделю", "Receive one email per request": "Получать электронное письмо на каждый запрос", "Region": "Область", + "Register an account on {instanceName}!": "Зарегистрируйте аккаунт на {instanceName}!", "Register on this instance": "Зарегистрируйтесь на этом узле", "Registration is allowed, anyone can register.": "Регистрация разрешена, зарегистрироваться может любой желающий.", "Registration is closed.": "Регистрация закрыта.", @@ -391,6 +438,7 @@ "Reopen": "Открыть заново", "Reply": "Ответ", "Report": "Отчёт", + "Report #{reportNumber}": "Отчёт #{reportNumber}", "Report this comment": "Пожаловаться на этот комментарий", "Report this event": "Пожаловаться на это мероприятие", "Reported": "Уведомлено", @@ -404,6 +452,7 @@ "Resource provided is not an URL": "Указанный ресурс не является URL-адресом", "Resources": "Ресурсы", "Restricted": "Ограниченный", + "Right now": "Прямо сейчас", "Role": "Роль", "Rules": "Правила", "SSL and it's successor TLS are encryption technologies to secure data communications when using the service. You can recognize an encrypted connection in your browser's address line when the URL begins with {https} and the lock icon is displayed in your browser's address bar.": "SSL и его преемник TLS - это технологии шифрования для защиты передачи данных при использовании сервиса. Вы можете увидеть в браузере, что соединение зашифровано, если адрес начинается с {https}, а в адресной строке есть значок замка.", @@ -426,6 +475,7 @@ "Show remaining number of places": "Показать оставшееся количество мест", "Show the time when the event begins": "Показать время начала мероприятия", "Show the time when the event ends": "Показать время окончания мероприятия", + "Sign in with": "Войти в систему с", "Sign up": "Зарегистрироваться", "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:": "Некоторые термины, технические или иные, используемые в приведенном ниже тексте, могут охватывать трудные для понимания концепции. Мы подготовили глоссарий чтобы помочь вам лучше их освоить:", "Starts on…": "Начало…", @@ -468,6 +518,9 @@ "This information is saved only on your computer. Click for details": "Эта информация сохраняется только на вашем компьютере. Нажмите, чтобы узнать подробности", "This instance isn't opened to registrations, but you can register on other instances.": "Этот узел не позволяет регистрироваться, но вы можете зарегистрироваться на других.", "This is a demonstration site to test Mobilizon.": "Это демонстрационная площадка для тестирования Mobilizon.", + "This month": "В этом месяце", + "This week": "На этой неделе", + "This weekend": "На эти выходные", "This will delete / anonymize all content (events, comments, messages, participations…) created from this identity.": "Это приведет к удалению / анонимизации всего контента (событий, комментариев, сообщений, участия…), созданного с помощью этого идентификатора.", "Timezone": "Часовой пояс", "Timezone detected as {timezone}.": "Часовой пояс определен как {timezone}.", @@ -475,9 +528,12 @@ "To activate more notifications, head over to the notification settings.": "Перейдите в настройки уведомлений, чтобы включить дополнительные уведомления.", "To confirm, type your event title \"{eventTitle}\"": "Для подтверждения введите название мероприятия \"{eventTitle}\"", "To confirm, type your identity username \"{preferredUsername}\"": "Для подтверждения введите имя пользователя \"{preferredUsername}\" идентификатора", + "Today": "Сегодня", + "Tomorrow": "Завтра", "Transfer to {outsideDomain}": "Перенос в {outsideDomain}", "Type": "Тип", "URL": "URL-адрес", + "URL copied to clipboard": "URL скопирован в буфер обмена", "Unfortunately, this instance isn't opened to registrations": "К сожалению, регистрация на этом узле закрыта", "Unfortunately, your participation request was rejected by the organizers.": "К сожалению, ваша заявка на участие была отклонена организаторами.", "Unknown": "Неизвестный", @@ -489,7 +545,9 @@ "Upcoming": "Предстоящие", "Upcoming events": "Предстоящие мероприятия", "Update event {name}": "Обновить мероприятие {name}", + "Update group": "Обновить группу", "Update my event": "Обновить моё мероприятие", + "Update post": "Обновить пост", "Updated": "Обновлено", "Use my location": "Использовать моё местоположение", "User": "Пользователь", @@ -499,6 +557,7 @@ "View event page": "Просмотреть страницу мероприятия", "View everything": "Посмотреть всё", "View page on {hostname} (in a new window)": "Просмотреть страницу на {hostname} (в новом окне)", + "Visible everywhere on the web": "Видно всем в Интернете", "Visible everywhere on the web (public)": "Видно во всем Интернете (публично)", "Waiting for organization team approval.": "Ожидает одобрения организаторами.", "Warning": "Предупреждение", @@ -513,6 +572,7 @@ "Welcome back!": "С возвращением!", "Welcome to Mobilizon, {username}!": "Добро пожаловать в Mobilizon, {username}!", "Who can view this event and participate": "Кто может просматривать и участвовать в мероприятии", + "Who can view this post": "Кто может видеть этот пост", "Who published {number} events": "Которые опубликовали {number} мероприятий", "Write something…": "Напиши что-нибудь…", "You are participating in this event anonymously": "Вы участвуете в этом мероприятии анонимно", @@ -520,6 +580,7 @@ "You can add tags by hitting the Enter key or by adding a comma": "Вы можете добавлять тэги, нажимая клавишу Enter или разделяя слова запятой", "You can pick your timezone into your preferences.": "Вы можете изменить часовой пояс по своему усмотрению.", "You can try another search term or drag and drop the marker on the map": "Вы можете попробовать другие критерии поиска или перетащить маркер на карту", + "You can't change your password because you are registered through {provider}.": "Вы не можете изменить свой пароль, потому что вы зарегистрированы через {provider}.", "You don't follow any instances yet.": "Вы пока не подписаны ни на один узел.", "You have been disconnected": "Вы были отключены", "You have been invited by {invitedBy} to the following group:": "Вы были приглашены пользователем {invitedBy} в следующую группу:", @@ -538,6 +599,7 @@ "Your account is being validated": "Ваша учетная запись проверяется", "Your account is nearly ready, {username}": "Ваш аккаунт почти готов, {username}", "Your current email is {email}. You use it to log in.": "Ваш текущий адрес электронной почты{email}. Вы используете его для входа в систему.", + "Your email address was automatically set based on your {provider} account.": "Ваш адрес электронной почты был автоматически установлен на основе вашей учётной записи {provider}.", "Your email has been changed": "Ваш адрес электронной почты был изменен", "Your email is being changed": "Ваш адрес электронной почты меняется", "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.": "Ваш адрес электронной почты будет использоваться только для подтверждения того, что вы настоящий человек, и для отправки вам возможных новостей об этом мероприятии. Он НЕ будет передан другим узлам или организатору мероприятия.", @@ -553,7 +615,9 @@ "[This comment has been deleted]": "[Этот комментарий был удалён]", "[deleted]": "[удалено]", "a non-existent report": "несуществующий отчет", + "any distance": "любое расстояние", "as {identity}": "как {identity}", + "contact uninformed": "контакт не уведомлен", "default Mobilizon privacy policy": "Политика конфиденциальности Mobilizon по умолчанию", "default Mobilizon terms": "условия использования Mobilizon по умолчанию", "e.g. 10 Rue Jangot": "например: Садовая 10", @@ -578,6 +642,7 @@ "{moderator} marked {report} as resolved": "{moderator} пометил {report} как решённый", "{moderator} reopened {report}": "{moderator} повторно открыл {report}", "{moderator} suspended profile {profile}": "{moderator} заблокировал профиль {profile}", + "{nb} km": "{nb} км", "{number} organized events": "Нет организованных мероприятий|Организованно одно мероприятие|Организованно {number} мероприятий", "{number} participations": "Нет участников|Один участник|{number} участников", "{profile} (by default)": "{profile} (по умолчанию)", From c3d4834e127f906c6ac78e8abfe3dd5bbb67c30c Mon Sep 17 00:00:00 2001 From: deadmorose Date: Thu, 1 Apr 2021 12:04:34 +0000 Subject: [PATCH 05/85] Translated using Weblate (Russian) Currently translated at 74.0% (726 of 981 strings) Translation: Mobilizon/Frontend Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/ru/ --- js/src/i18n/ru.json | 81 +++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 79 insertions(+), 2 deletions(-) diff --git a/js/src/i18n/ru.json b/js/src/i18n/ru.json index a8679f269..50179d891 100644 --- a/js/src/i18n/ru.json +++ b/js/src/i18n/ru.json @@ -1,11 +1,20 @@ { + "#{tag}": "#{tag}", "(Masked)": "(Скрыто)", "(this folder)": "(эта папка)", "(this link)": "(эта ссылка)", + "+ Add a resource": "+ Добавить ресурс", + "+ Create an event": "+ Создать мероприятие", + "+ Post a public message": "+ Опубликовать публичное сообщение", + "+ Start a discussion": "+ Начать обсуждение", + "{contact} will be displayed as contact.": "{contact} будет отображаться как контакт.|{contact} будут отображаться как контакты.", "@{group}": "@{group}", "@{username} ({role})": "@{username} ({role})", + "A cookie is a small file containing information that is sent to your computer when you visit a website. When you visit the site again, the cookie allows that site to recognize your browser. Cookies may store user preferences and other information. You can configure your browser to refuse all cookies. However, this may result in some website features or services partially working. Local storage works the same way but allows you to store more data.": "Cookie - это небольшой файл, содержащий информацию, которая сохраняется на вашем компьютере при посещении веб-сайта. Когда вы снова посещаете эту страницу, cookie позволяет сайту распознавать ваш браузер. Cookie могут хранить настройки пользователя и другую информацию. Вы можете настроить свой браузер так, чтобы он не принимал файлы cookie. Однако это может привести к тому, что часть функционала веб-сайта не будет работать. Локальное хранилище работает так же, но позволяет хранить больше данных.", "A place for your code of conduct, rules or guidelines. You can use HTML tags.": "Тут можно разместить общие правила, положения или руководства. Вы можете использовать HTML-теги.", "A place to explain who you are and the things that set your instance apart. You can use HTML tags.": "Тут можно подробно описать кто вы и что делает этот узел особенным. Вы можете использовать HTML-теги.", + "A place to publish something to the whole world, your community or just your group members.": "Место для публикации чего-либо для всего мира, вашего сообщества или только участников вашей группы.", + "A place to store links to documents or resources of any type.": "Место для хранения ссылок на документы или ресурсы любого типа.", "A user-friendly, emancipatory and ethical tool for gathering, organising, and mobilising.": "Удобный, свободный и этичный инструмент для объединения, организации и мобилизации.", "A validation email was sent to {email}": "Письмо с подтверждением было отправлено на адрес {email}", "API": "API", @@ -16,12 +25,16 @@ "About this instance": "Об этом узле", "Accept": "Принять", "Accepted": "Принято", + "Accessible only to members": "Доступно только участникам", + "Accessible through link": "Доступно по ссылке", "Account": "Учётная запись", "Actions": "Действия", "Activated": "Активирован", "Active": "Активный", "Actor": "Агент", "Add": "Добавить", + "Add / Remove…": "Добавить / удалить…", + "Add a contact": "Добавить контакт", "Add a group": "Добавить группу", "Add a new post": "Добавить новый пост", "Add a note": "Добавить заметку", @@ -37,6 +50,7 @@ "Administrator": "Администратор", "All good, let's continue!": "Все хорошо, продолжим!", "All the places have already been taken": "Все места уже заняты", + "Allow all comments from users with accounts": "Разрешить все комментарии от авторизованных пользователей", "Allow registrations": "Разрешить регистрацию", "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.": "Узел - это программное обеспечение Mobilizon, установленное на сервере. Узел может быть запущен кем угодно, использующим {mobilizon_software} или другие федеративные приложения, называемые «Федиверзум». Имя этого узла - {instance_name}. Mobilizon - это федеративная сеть, состоящая из нескольких узлов (как почтовые серверы). Пользователи могут свободно общаться друг с другом, даже если они зарегистрированы на разных узлах.", "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 on your behalf, automatically and remotely.": "Интерфейс прикладного программирования» или «API» - это протокол связи, который позволяет программным компонентам взаимодействовать друг с другом. Например, API Mobilizon позволяет стороннему программному обеспечению взаимодействовать с узлами Mobilizon для выполнения определенных действий, таких как автоматическая публикация мероприятий от вашего имени.", @@ -47,8 +61,11 @@ "Any day": "В любой день", "Application": "Приложение", "Are you really sure you want to delete your whole account? You'll lose everything. Identities, settings, events created, messages and participations will be gone forever.": "Вы действительно уверены, что хотите удалить свою учетную запись? Вы потеряете всё. Идентификаторы, настройки, созданные мероприятия, сообщения и история исчезнут навсегда.", + "Are you sure you want to completely delete this group? All members - including remote ones - will be notified and removed from the group, and all of the group data (events, posts, discussions, todos…) will be irretrievably destroyed.": "Вы действительно хотите полностью удалить эту группу? Все участники, включая участников с других узлов, будут уведомлены и удалены из группы, а все данные группы (мероприятия, сообщения, обсуждения, задачи…) будут безвозвратно уничтожены.", "Are you sure you want to delete this comment? This action cannot be undone.": "Вы действительно хотите удалить этот комментарий? Это действие не может быть отменено.", "Are you sure you want to delete this event? This action cannot be undone. You may want to engage the discussion with the event creator or edit its event instead.": "Вы действительно хотите удалить это мероприятие? Это действие не может быть отменено. Вы можете обсудить мероприятие с его автором, или просто отредактировать его.", + "Are you sure you want to suspend this group? All members - including remote ones - will be notified and removed from the group, and all of the group data (events, posts, discussions, todos…) will be irretrievably destroyed.": "Вы действительно хотите заблокировать эту группу? Все участники, включая участников с других узлов, будут уведомлены и удалены из группы, а все данные группы (мероприятия, сообщения, обсуждения, задачи…) будут безвозвратно уничтожены.", + "Are you sure you want to suspend this group? As this group originates from instance {instance}, this will only remove local members and delete the local data, as well as rejecting all the future data.": "Вы действительно хотите заблокировать эту группу? Поскольку эта группа принадлежит узлу {instance}, то будут удалены только локальные члены и локальные данные. Так же это приведёт к запрету публикации любых данных этой группой.", "Are you sure you want to cancel the event creation? You'll lose all modifications.": "Вы уверены, что хотите отменить создание мероприятия? Все изменения будут потеряны.", "Are you sure you want to cancel the event edition? You'll lose all modifications.": "Вы уверены, что хотите отменить редактирование мероприятия? Все изменения будут потеряны.", "Are you sure you want to cancel your participation at event \"{title}\"?": "Вы действительно хотите отказаться от участия в мероприятии \"{title}\"?", @@ -56,12 +73,14 @@ "Assigned to": "Присвоен", "Avatar": "Аватар", "Back to previous page": "Вернуться на предыдущую страницу", + "Banner": "Баннер", "Before you can login, you need to click on the link inside it to validate your account.": "Перед тем как войти в систему, вы должны перейти по указанной в письме ссылке, чтобы подтвердить свою учетную запись.", "Begins on": "Начало", "Bold": "Жирный", "By @{group}": "Из @{group}", "By @{username}": "От @{username}", "By {author}": "Автор {author}", + "By {group}": "Автор: {group}", "Can be an email or a link, or just plain text.": "Может быть адресом электронной почты, ссылкой или простым текстом.", "Cancel": "Отмена", "Cancel anonymous participation": "Отменить анонимное участие", @@ -108,7 +127,10 @@ "Create my profile": "Создать мой профиль", "Create resource": "Создать ресурс", "Create the discussion": "Начать обсуждение", + "Create to-do lists for all the tasks you need to do, assign them and set due dates.": "Создавайте списки дел для каждой нужной вам задачи, назначайте их другим, и устанавливайте сроки выполнения.", "Create token": "Создать токен", + "Created by {name}": "Создано {name}", + "Created by {username}": "Создано {username}", "Current identity has been changed to {identityName} in order to manage this event.": "Текущий идентификатор был изменен на {identityName}, чтобы иметь возможность управлять этим событием.", "Current page": "Текущая страница", "Custom": "Пользовательский", @@ -131,6 +153,7 @@ "Delete conversation": "Удалить беседу", "Delete event": "Удалить мероприятие", "Delete everything": "Удалить всё", + "Delete group": "Удалить группу", "Delete my account": "Удалить мою учётную запись", "Delete post": "Удалить пост", "Delete this identity": "Удалить этот идентификатор", @@ -141,7 +164,9 @@ "Deleting event": "Удаление мероприятия", "Deleting my account will delete all of my identities.": "Удаление моей учетной записи приведет к удалению всех моих личных данных.", "Deleting your Mobilizon account": "Удаление моей учётной записи Mobilizon", + "Demote": "Понизить", "Description": "Описание", + "Didn't receive the instructions?": "Не получили инструкции?", "Disabled": "Отключено", "Discussions": "Обсуждения", "Display name": "Отображаемое имя", @@ -155,6 +180,7 @@ "Duplicate": "Копировать", "Edit": "Редактировать", "Edit post": "Редактировать пост", + "Edited {ago}": "Изменено {ago}", "Eg: Stockholm, Dance, Chess…": "Например: Москва, танцы, шахматы…", "Either on the {instance} instance or on another instance.": "На узле {instance}, либо на другом.", "Either the account is already validated, either the validation token is incorrect.": "Учетная запись уже подтверждена или токен проверки недействителен.", @@ -169,9 +195,11 @@ "Enter your email address below, and we'll email you instructions on how to change your password.": "Введите ниже свой адрес электронной почты, и мы пришлём вам инструкции по изменению пароля.", "Enter your own privacy policy. HTML tags allowed. The {mobilizon_privacy_policy} is provided as template.": "Введите свою политику конфиденциальности. Вы можете использовать HTML-теги. {mobilizon_privacy_policy} используется в качестве шаблона.", "Enter your own terms. HTML tags allowed. The {mobilizon_terms} are provided as template.": "Введите свои собственные условия. Вы можете использовать HTML-теги. {mobilizon_terms} используется в качестве шаблона.", + "Error": "Ошибка", "Error while changing email": "Произошла ошибка при изменении адреса электронной почты", "Error while login with {provider}. Retry or login another way.": "Не удалось войти через {provider}. Повторите попытку или войдите другим способом.", "Error while login with {provider}. This login provider doesn't exist.": "Не удалось войти через {provider}. Такого провайдера аутентификации не существует.", + "Error while reporting group {groupTitle}": "Ошибка при отправке отчёта о группе {groupTitle}", "Error while validating account": "Ошибка подтверждения учётной записи", "Error while validating participation request": "Произошла ошибка при проверке заявки на участие", "Event": "Мероприятие", @@ -185,12 +213,15 @@ "Event {eventTitle} deleted": "Мероприятие {eventTitle} удалено", "Event {eventTitle} reported": "Жалоба на мероприятие {eventTitle} отправлена", "Events": "Мероприятия", + "Events tagged with {tag}": "События с тегом {tag}", "Everything": "Всё", "Ex: mobilizon.fr": "Например: mobilizon.fr", "Ex: someone@mobilizon.org": "Например: user@mobilizon.org", "Explore": "Обзор", + "Explore events": "Обзор мероприятий", "Failed to save admin settings": "Не удалось сохранить настройки администратора", "Featured events": "Избранные мероприятия", + "Federated Group Name": "Имя федеративной группы", "Federation": "Федерализация", "Fetch more": "Загрузить больше", "Find an address": "Найти адрес", @@ -211,12 +242,17 @@ "Glossary": "Глоссарий", "Go": "Идти", "Group Members": "Участники группы", + "Group address": "Адрес группы", + "Group display name": "Отображаемое имя группы", "Group name": "Название группы", "Group settings": "Настройки группы", + "Group settings saved": "Настройки группы сохранены", "Group short description": "Краткое описание группы", "Group visibility": "Видимость группы", "Group {displayName} created": "Группа {displayName} создана", + "Group {groupTitle} reported": "Жалоба на группу {groupTitle} отправлена", "Groups": "Группы", + "Groups are spaces for coordination and preparation to better organize events and manage your community.": "Группы - это места для координации и подготовки, где вы занимаетесь организацией мероприятий и управлением своим сообществом.", "Headline picture": "Заглавное изображение", "Hide replies": "Скрыть ответы", "Home": "Домашняя страница", @@ -259,13 +295,18 @@ "Invited": "Приглашён", "Italic": "Курсив", "Join {instance}, a Mobilizon instance": "Присоединиться к {instance}, узлу Mobilizon", + "Join group": "Вступить в группу", + "Keep the entire conversation about a specific topic together on a single page.": "Храните всю беседу по определенной теме на одной странице.", "Key words": "Ключевые слова", "Language": "Язык", + "Last IP adress": "Последний IP-адрес", "Last published event": "Последнее опубликованное мероприятие", + "Last sign-in": "Последний вход", "Last week": "На прошлой неделе", "Latest posts": "Последние записи", "Learn more": "Узнать больше", "Learn more about Mobilizon": "Узнать больше о Mobilizon", + "Leave": "Покинуть", "Leave event": "Покинуть мероприятие", "Leaving event \"{title}\"": "Покинуть мероприятие \"{title}\"", "Legal": "Правовая информация", @@ -320,6 +361,7 @@ "No closed reports yet": "Пока нет закрытых отчётов", "No comment": "Нет комментариев", "No comments yet": "Пока нет комментариев", + "No discussions yet": "Пока нет обсуждений", "No end date": "Без даты окончания", "No events found": "Мероприятий не найдено", "No group found": "Группа не найдена", @@ -336,12 +378,15 @@ "No participant matches the filters": "Ни один участник не соответствует критериям", "No participant to approve|Approve participant|Approve {number} participants": "Нет участников для одобрения | Принять участника | Принять {number} участников", "No participant to reject|Reject participant|Reject {number} participants": "Нет участников для отклонения | Отклонить участника | Отклонить {number} участников", + "No posts found": "Публикаций не найдено", + "No posts yet": "Публикаций пока нет", "No profile matches the filters": "Ни один профиль не соответствует критериям", "No profiles found": "Профили не найдены", "No public upcoming events": "Нет предстоящих публичных мероприятий", "No resolved reports yet": "Решённых отчётов пока нет", "No resources in this folder": "В этой папке нет ресурсов", "No resources selected": "Ресурсы не выбраны|Выбран один ресурс|Выбрано {count} ресурсов", + "No resources yet": "Ресурсов пока нет", "No results for \"{queryText}\"": "Нет результатов по запросу \"{queryText}\"", "No rules defined yet.": "Правила еще не определены.", "None": "Никто", @@ -367,6 +412,7 @@ "Opened reports": "Открытые отчёты", "Or": "Или", "Organized": "Организованно", + "Organized by": "Организатор", "Organized by {name}": "Организатор: {name}", "Organizer": "Организатор", "Organizer notifications": "Уведомления организатора", @@ -392,18 +438,20 @@ "Password reset": "Сброс пароля", "Past events": "Прошедшие мероприятия", "Pending": "В ожидании", + "Pick": "Выбрать", "Pick a group": "Выберите группу", + "Pick a profile or a group": "Выберите профиль или группу", "Pick an identity": "Выберите идентификатор", "Please check your spam folder if you didn't receive the email.": "Если вы не получили письмо, проверьте папку со спамом.", "Please contact this instance's Mobilizon admin if you think this is a mistake.": "Если вы считаете, что произошла ошибка, обратитесь к администратору этого узла.", "Please do not use it in any real way.": "Пожалуйста, используйте это только для тестовых целей.", "Please enter your password to confirm this action.": "Введите свой пароль, чтобы подтвердить это действие.", "Please make sure the address is correct and that the page hasn't been moved.": "Убедитесь, что адрес правильный и страница не была перемещена.", - "Post": "Пост", + "Post": "Публикация", "Post a comment": "Оставить комментарий", "Post a reply": "Ответить", "Postal Code": "Почтовый индекс", - "Posts": "Посты", + "Posts": "Публикации", "Powered by {mobilizon}. © 2018 - {date} The Mobilizon Contributors - Made with the financial support of {contributors}.": "На основе {mobilizon}. © 2018 - {date} Участники Mobilizon - Создан благодаря финансовой поддержке {contributors}.", "Preferences": "Предпочтения", "Previous page": "Предыдущая страница", @@ -412,6 +460,7 @@ "Private event": "Приватное мероприятие", "Private feeds": "Приватная лента", "Profiles": "Профили", + "Promote": "Поднять", "Public": "Публичный", "Public RSS/Atom Feed": "Публичная RSS/Atom новостная лента", "Public comment moderation": "Модерация публичных комментариев", @@ -419,12 +468,14 @@ "Public feeds": "Публичные ленты", "Public iCal Feed": "Публичная iCal-лента", "Public page": "Публичная страница", + "Publication date": "Дата публикации", "Publish": "Опубликовать", "Published events with {comments} comments and {participations} confirmed participations": "Опубликованные мероприятия с {comments} комментариями и {participations} подтвержденными участниками", "RSS/Atom Feed": "RSS/Atom новостная лента", "Radius": "Радиус", "Recap every week": "Подводить итоги каждую неделю", "Receive one email per request": "Получать электронное письмо на каждый запрос", + "Refresh profile": "Обновить профиль", "Region": "Область", "Register an account on {instanceName}!": "Зарегистрируйте аккаунт на {instanceName}!", "Register on this instance": "Зарегистрируйтесь на этом узле", @@ -432,7 +483,10 @@ "Registration is closed.": "Регистрация закрыта.", "Registration is currently closed.": "Регистрация на данный момент закрыта.", "Registrations": "Регистрации", + "Registrations are restricted by allowlisting.": "Регистрация ограничена белым списком.", "Rejected": "Отклонено", + "Remember my participation in this browser": "Запомнить моё участие для этого браузера", + "Remove": "Удалить", "Rename": "Переименовать", "Rename resource": "Переименовать ресурс", "Reopen": "Открыть заново", @@ -441,12 +495,15 @@ "Report #{reportNumber}": "Отчёт #{reportNumber}", "Report this comment": "Пожаловаться на этот комментарий", "Report this event": "Пожаловаться на это мероприятие", + "Report this group": "Пожаловаться на эту группу", "Reported": "Уведомлено", "Reported by": "Сообщил", "Reported by someone on {domain}": "Об этом сообщил пользователь из {domain}", "Reported by {reporter}": "Сообщил {reporter}", + "Reported group": "Жалоба на группу", "Reported identity": "Идентификатор сообщившего", "Reports": "Отчеты", + "Resend confirmation email": "Отправить письмо с подтверждением ещё раз", "Reset my password": "Сбросить пароль", "Resolved": "Решено", "Resource provided is not an URL": "Указанный ресурс не является URL-адресом", @@ -462,6 +519,7 @@ "Search": "Поиск", "Search events, groups, etc.": "Искать мероприятия, группы и т. п.", "Searching…": "Поиск…", + "Search…": "Поиск…", "Select a language": "Выберите язык", "Select a timezone": "Выберите часовой пояс", "Send email": "Отправить электронное письмо", @@ -477,12 +535,14 @@ "Show the time when the event ends": "Показать время окончания мероприятия", "Sign in with": "Войти в систему с", "Sign up": "Зарегистрироваться", + "Since you are a new member, private content can take a few minutes to appear.": "Поскольку вы новый участник, может потребоваться несколько минут, чтобы приватный контент стал видимым.", "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:": "Некоторые термины, технические или иные, используемые в приведенном ниже тексте, могут охватывать трудные для понимания концепции. Мы подготовили глоссарий чтобы помочь вам лучше их освоить:", "Starts on…": "Начало…", "Status": "Статус", "Street": "Улица", "Submit": "Отправить", "Suspend": "Приостановить", + "Suspend group": "Приостановить группу", "Suspended": "Приостановлен", "Task lists": "Списки задач", "Tentative: Will be confirmed later": "Предварительно: будет подтверждено позже", @@ -501,7 +561,10 @@ "The event organizer didn't add any description.": "Организатор мероприятия не добавил описания.", "The event organizer manually approves participations. Since you've chosen to participate without an account, please explain why you want to participate to this event.": "Организатор мероприятия утверждает участие вручную. Поскольку вы выбрали участие без учётной записи, объясните, почему вы хотите участвовать в этом мероприятии.", "The event title will be ellipsed.": "Название этого мероприятие сокращено троеточием.", + "The event will show as attributed to this group.": "Событие будет отображаться как связанное с этой группой.", + "The event will show as attributed to your personal profile.": "Мероприятие будет отображаться как связанное с вашим личным профилем.", "The event will show the group as organizer.": "На мероприятии группа будет представлена как организатор.", + "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.": "Группа будет представлена в результатах поиска и может быть предложена в разделе «Обзор». На её странице будет отображаться только общедоступная информация.", "The instance administrator is the person or entity that runs this Mobilizon instance.": "Администратор узла - это физическое или юридическое лицо, которое управляет данным узлом Mobilizon.", "The page you're looking for doesn't exist.": "Страницы, которую вы ищете, не существует.", "The password was successfully changed": "Пароль был успешно изменен", @@ -518,6 +581,7 @@ "This information is saved only on your computer. Click for details": "Эта информация сохраняется только на вашем компьютере. Нажмите, чтобы узнать подробности", "This instance isn't opened to registrations, but you can register on other instances.": "Этот узел не позволяет регистрироваться, но вы можете зарегистрироваться на других.", "This is a demonstration site to test Mobilizon.": "Это демонстрационная площадка для тестирования Mobilizon.", + "This is like your federated username ({username}) for groups. It will allow the group to be found on the federation, and is guaranteed to be unique.": "Подобно федеративному имени пользователя ({username}) для групп. Это дает возможность найти группу во всей сети и гарантирует ее уникальность.", "This month": "В этом месяце", "This week": "На этой неделе", "This weekend": "На эти выходные", @@ -544,6 +608,7 @@ "Unsuspend": "Отменить приостановку", "Upcoming": "Предстоящие", "Upcoming events": "Предстоящие мероприятия", + "Update": "Обновить", "Update event {name}": "Обновить мероприятие {name}", "Update group": "Обновить группу", "Update my event": "Обновить моё мероприятие", @@ -554,6 +619,8 @@ "Username": "Имя пользователя", "Users": "Пользователи", "View a reply": "|Посмотреть один ответ|Посмотреть {totalReplies} ответов", + "View all": "Посмотреть всё", + "View all posts": "Просмотреть все публикации", "View event page": "Просмотреть страницу мероприятия", "View everything": "Посмотреть всё", "View page on {hostname} (in a new window)": "Просмотреть страницу на {hostname} (в новом окне)", @@ -574,6 +641,7 @@ "Who can view this event and participate": "Кто может просматривать и участвовать в мероприятии", "Who can view this post": "Кто может видеть этот пост", "Who published {number} events": "Которые опубликовали {number} мероприятий", + "Will allow to display and manage your participation status on the event page when using this device. Uncheck if you're using a public device.": "Это позволит вам просматривать и управлять своим статусом участия на странице мероприятия при использовании этого устройства. Снимите флажок, если вы используете общедоступное устройство.", "Write something…": "Напиши что-нибудь…", "You are participating in this event anonymously": "Вы участвуете в этом мероприятии анонимно", "You are participating in this event anonymously but didn't confirm participation": "Вы участвуете в этом мероприятии анонимно, но не подтвердили свое участие", @@ -584,6 +652,7 @@ "You don't follow any instances yet.": "Вы пока не подписаны ни на один узел.", "You have been disconnected": "Вы были отключены", "You have been invited by {invitedBy} to the following group:": "Вы были приглашены пользователем {invitedBy} в следующую группу:", + "You have been removed from this group's members.": "Вы были удалены из участников этой группы.", "You have cancelled your participation": "Вы отказались от участия", "You have one event in {days} days.": "У вас нет мероприятий в течение {days} дней | У вас одно мероприятие в течении {days} дней | У вас {count} мероприятий в течении {days} дней", "You have one event today.": "У вас сегодня нет мероприятий | У вас сегодня одно мероприятие. | У вас сегодня {count} мероприятий", @@ -593,6 +662,7 @@ "You will be redirected to the original instance": "Вы будете перенаправлены на исходный узел", "You wish to participate to the following event": "Вы хотите принять участие в следующем мероприятии", "You'll get a weekly recap every Monday for upcoming events, if you have any.": "Каждый понедельник вы будете получать сводку о предстоящих мероприятиях, в которых вы принимаете участие.", + "You'll need to transmit the group URL so people may access the group's profile. The group won't be findable in Mobilizon's search or regular search engines.": "Вы должны предоставить URL-адрес группы, чтобы другие могли получить доступ к её профилю. Группу нельзя будет найти ни в поиске Mobilizon, ни в обычных поисковых системах.", "You'll receive a confirmation email.": "Вы получите электронное письмо с подтверждением.", "Your account has been successfully deleted": "Ваша учетная запись была успешно удалена", "Your account has been validated": "Ваша учетная запись была подтверждена", @@ -610,11 +680,14 @@ "Your participation request has been validated": "Ваше участие подтверждено", "Your participation request is being validated": "Ваше участие проверяется", "Your participation status has been changed": "Ваш статус участия был изменен", + "Your profile will be shown as contact.": "Ваш профиль будет отображаться как контакт.", "Your timezone is currently set to {timezone}.": "Ваш часовой пояс в настоящее время установлен на {timezone}.", "Your timezone was detected as {timezone}.": "Ваш часовой пояс был определен как {timezone}.", + "[This comment has been deleted by it's author]": "[Этот комментарий был удален автором]", "[This comment has been deleted]": "[Этот комментарий был удалён]", "[deleted]": "[удалено]", "a non-existent report": "несуществующий отчет", + "and {number} groups": "и {number} групп", "any distance": "любое расстояние", "as {identity}": "как {identity}", "contact uninformed": "контакт не уведомлен", @@ -633,6 +706,8 @@ "{available}/{capacity} available places": "Мест нет|{available}/{capacity} свободных мест", "{count} participants": "Нет участников | Один участник | {count} участников", "{count} requests waiting": "{count} ожидающих рассмотрения заявок", + "{count} team members": "{count} членов команды", + "{group}'s events": "Мероприятия {group}", "{instanceName} is an instance of the {mobilizon} software.": "{instanceName} - это узел использующий ПО {mobilizon}.", "{moderator} added a note on {report}": "{moderator} добавил примечание к {report}", "{moderator} closed {report}": "{moderator} закрыл {report}", @@ -643,8 +718,10 @@ "{moderator} reopened {report}": "{moderator} повторно открыл {report}", "{moderator} suspended profile {profile}": "{moderator} заблокировал профиль {profile}", "{nb} km": "{nb} км", + "{number} members": "{number} участников", "{number} organized events": "Нет организованных мероприятий|Организованно одно мероприятие|Организованно {number} мероприятий", "{number} participations": "Нет участников|Один участник|{number} участников", + "{number} posts": "Нет публикаций|Одна публикация|{number} публикаций", "{profile} (by default)": "{profile} (по умолчанию)", "{title} ({count} todos)": "{title} ({count} незавершенных задач)", "© The OpenStreetMap Contributors": "© Авторы OpenStreetMap" From dd6d44207149be715f74152dcf8272ceb372037e Mon Sep 17 00:00:00 2001 From: Thomas Frenzel Date: Wed, 31 Mar 2021 20:29:29 +0000 Subject: [PATCH 06/85] Translated using Weblate (German) Currently translated at 100.0% (981 of 981 strings) Translation: Mobilizon/Frontend Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/de/ --- js/src/i18n/de.json | 100 ++++++++++++++++++++++++++++++++++++++------ 1 file changed, 88 insertions(+), 12 deletions(-) diff --git a/js/src/i18n/de.json b/js/src/i18n/de.json index 546ec5ef4..a9f184903 100644 --- a/js/src/i18n/de.json +++ b/js/src/i18n/de.json @@ -8,10 +8,11 @@ "+ Post a public message": "+ Schreibe eine öffentliche Nachricht", "+ Start a discussion": "+ Starte eine Diskussion", "Please do not use it in any real way.": "Bitte benutze diese Seite nicht für tatsächliche Veranstaltungsplanung.", - "{contact} will be displayed as contact.": "{contact} wird als Kontakt angezeigt.|{contact} wird als Kontakte angezeigt.", + "{contact} will be displayed as contact.": "{contact} wird als Kontakt angezeigt.|{contact} werden als Kontakte angezeigt.", "@{group}": "@{group}", "@{username}": "@{username}", "@{username} ({role})": "@{username} ({role})", + "@{username}'s follow request was accepted": "Die Folgeanfrage von @{username} wurde angenommen", "@{username}'s follow request was rejected": "@{username}'s Folgeanfrage wurde zurückgewiesen", "A cookie is a small file containing information that is sent to your computer when you visit a website. When you visit the site again, the cookie allows that site to recognize your browser. Cookies may store user preferences and other information. You can configure your browser to refuse all cookies. However, this may result in some website features or services partially working. Local storage works the same way but allows you to store more data.": "Ein Cookie ist eine kleine Datei mit Informationen, die an Ihren Computer gesendet wird, wenn Sie eine Website besuchen. Wenn Sie die Website erneut besuchen, ermöglicht das Cookie dieser Website, Ihren Browser zu erkennen. Cookies können Benutzereinstellungen und andere Informationen speichern. Sie können Ihren Browser so konfigurieren, dass er alle Cookies ablehnt. Dies kann jedoch dazu führen, dass einige Funktionen oder Dienste der Website nur eingeschränkt funktionieren. Die lokale Speicherung funktioniert auf die gleiche Weise, ermöglicht es Ihnen jedoch, mehr Daten zu speichern.", "A cookie is a small file containing informations that is sent to your computer when you visit a website. When you visit the site again, the cookie allows that site to recognize your browser. Cookies may store user preferences and other information. You can configure your browser to refuse all cookies. However, this may result in some website features or services partially working. Local storage works the same way but allows to store more data.": "Ein Cookie ist eine kleine Datei, die auf deinen Computer übertragen wird, wenn du eine Webseite aufrufst. Sie enthält Informationen, die es der Webseite ermöglichen, deinen Computer beim nächsten Besuch wiederzuerkennen. Cookies können auch genutzt werden, um nutzerspezifische Einstellungen oder andere Informationen zu speichern. Du kannst deinen Browser so einstellen, dass er alle Cookies ablehnt oder diese beim Schließen des Browsers löscht. Dies kann jedoch dazu führen, das einige Funktionalitäten von Webseiten oder Diensten nicht mehr vollständig funktionieren. Lokale Website-Daten erfüllen den selben Zweck, erlauben es einer Webseite aber, größere Datenmengen auf deinem Computer zu speichern.", @@ -42,6 +43,7 @@ "Actions": "Aktionen", "Activated": "Aktiviert", "Active": "Aktiv", + "Activity": "Ereignisse", "Actor": "Akteur", "Add": "Hinzufügen", "Add / Remove…": "Hinzufügen / Entfernen…", @@ -60,6 +62,7 @@ "Admin settings successfully saved.": "Admineinstellungen erfolgreich gespeichert.", "Administration": "Administration", "Administrator": "Administrator", + "All activities": "Alle Ereignisse", "All good, let's continue!": "Das passt, weiter geht's!", "All group members and other eventual server admins will still be able to view this information.": "Alle Gruppenmitglieder und andere Server-Administrator:innen können diese Information dennoch einsehen.", "All the places have already been taken": "Alle Plätze sind schon vergeben", @@ -72,9 +75,9 @@ "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.": "Als Instanz bezeichnen wir eine Installation der Mobilizon-Software auf einem Server. Eine Instanz kann von jedem mit Hilfe der {mobilizon_software} oder anderer kompatibler Software betrieben werden. Der Name dieser Instanz lautet „{instance_name}“. Diese Instanz ist Teil des „Fediverse“, einem Netzwerk aus vielen verbundenen Instanzen, die alle miteinander kommunizieren können. Nutzer von verschiedenen Instanzen können so - genau wie beim E-Mail-System - miteinander kommunizieren, auch wenn sie Accounts bei völlig verschiedenen Instanzen registriert haben.", "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 on your behalf, automatically and remotely.": "Eine Programmierschnittstelle, auch API genannt (von englisch „application programming interface“) definiert ein Kommunikationsprotokoll, das Softwarekomponenten erlaubt, miteinander zu interagieren. Die Mobilizon-API ermöglicht Drittanbietersoftware beispielsweise automatisiert bestimmte Aktionen auszuführen, z.B. das Erstellen von Veranstaltungen in Ihrem Namen.", "And {number} comments": "Und {number} Kommentare", - "Anonymous participant": "Anonymer Teilnehmer", + "Anonymous participant": "Anonyme*r Teilnehmer*in", "Anonymous participants will be asked to confirm their participation through e-mail.": "Anonyme Teilnehmer werden gebeten, ihre Teilnahme per E-Mail zu bestätigen.", - "Anonymous participations": "Anonyme Teilnehmer", + "Anonymous participations": "Anonyme Teilnehmer*innen", "Any day": "Egal wann", "Anyone can join freely": "Jeder kann frei beitreten", "Anyone wanting to be a member from your group will be able to from your group page.": "Jeder, der ein Mitglied Ihrer Gruppe werden möchte, kann dies von Ihrer Gruppenseite aus tun.", @@ -89,6 +92,7 @@ "Are you sure you want to cancel the event creation? You'll lose all modifications.": "Sind Sie sich sicher, dass Sie das Erstellen der Veranstaltung abbrechen möchten? Alle Änderungen werden verloren gehen.", "Are you sure you want to cancel the event edition? You'll lose all modifications.": "Sind Sie sich sicher, dass die Veranstaltung abrechen möchten? Sie verlieren dann alle Änderungen.", "Are you sure you want to cancel your participation at event \"{title}\"?": "Sind Sie sicher, dass Sie Ihre Teilnahme an der Veranstaltung \"{Titel}\" stornieren möchten?", + "Are you sure you want to delete this entire discussion?": "Sind Sie sicher, dass sie die gesamte Diskussion löschen wollen?", "Are you sure you want to delete this event? This action cannot be reverted.": "Sind Sie sicher, dass Sie diese Veranstaltung löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.", "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.": "Da der Veranstalter sich entschieden hat, die Teilnahmeanfragen manuell zu validieren, wird Ihre Teilnahme erst dann wirklich bestätigt, wenn Sie eine E-Mail erhalten, in der die Annahme bestätigt wird.", "Assigned to": "Zugewiesen an", @@ -101,6 +105,7 @@ "Bold": "Fett", "By @{group}": "Von @{group}", "By @{username}": "von @{username}", + "By others": "Von Anderen", "By {author}": "Von {author}", "By {group}": "Von {group}", "By {username} and {group}": "Nach {username} und {group}", @@ -130,9 +135,11 @@ "Click to upload": "Klicken zum Hochladen", "Close": "Schließen", "Close comments for all (except for admins)": "Kommentare für alle sperren (außer für Admins)", + "Close events": "Veranstaltungen in Ihrer Nähe", "Closed": "Geschlossen", "Comment deleted": "Kommentar gelöscht", "Comment from @{username} reported": "Kommentar von @{username} gemeldet", + "Comment text can't be empty": "Der Kommentar darf nicht leer sein", "Comments": "Kommentare", "Comments are closed for everybody else.": "Kommentare sind für alle anderen geschlossen.", "Comments have been closed.": "Die Kommentarfunktion wurde deaktiviert.", @@ -167,6 +174,7 @@ "Create my event": "Erstelle eine neue Veranstaltung", "Create my group": "Erstelle eine Gruppe", "Create my profile": "Erstelle mein Profil", + "Create new links": "Erstelle neue Links", "Create resource": "Ressource erstellen", "Create the discussion": "Beginne die Diskussion", "Create to-do lists for all the tasks you need to do, assign them and set due dates.": "Erstellen Sie To-Do-Listen für alle Aufgaben, die Sie erledigen müssen, weisen Sie diese zu und legen Sie Fälligkeitsdaten fest.", @@ -195,11 +203,13 @@ "Delete Event": "Veranstaltung löschen", "Delete account": "Account löschen", "Delete conversation": "Lösche Konversation", + "Delete discussion": "Diskussion löschen", "Delete event": "Veranstaltung löschen", "Delete everything": "Alles löschen", "Delete group": "Gruppe löschen", "Delete my account": "Mein Konto löschen", "Delete post": "Beitrag löschen", + "Delete this discussion": "Diese Diskussion löschen", "Delete this identity": "Diese Identität löschen", "Delete your identity": "Ihre Identität löschen", "Delete {eventTitle}": "Lösche {eventTitle}", @@ -235,7 +245,7 @@ "Either the account is already validated, either the validation token is incorrect.": "Das Konto ist bereits bestätigt oder der Bestätigungstoken ist abgelaufen.", "Either the email has already been changed, either the validation token is incorrect.": "Die E-Mail-Adresse wurde bereits geändert oder der Bestätigungstoken ist abgelaufen.", "Either the participation has already been validated, either the validation token is incorrect.": "Die Teilnahme wurde bereits bestätigt oder der Bestätigungstoken ist abgelaufen.", - "Either the participation request has already been validated, either the validation token is incorrect.": "Entweder wurde die Teilnahmeanfrage bereits validiert, oder das Validierungs-Token ist falsch.", + "Either the participation request has already been validated, either the validation token is incorrect.": "Die Teilnahmeanfrage wurde schon bestätigt, oder das Bestätigungs-Token ist nicht gültig.", "Email": "E-Mail", "Email address": "E-Mail-Adresse", "Email notifications": "E-Mail-Benachrichtigungen", @@ -299,8 +309,9 @@ "Forgot your password?": "Passwort vergessen?", "From a birthday party with friends and family to a march for climate change, right now, our gatherings are trapped inside the tech giants’ platforms. How can we organize, how can we click “Attend,” without providing private data to Facebook or locking ourselves up inside MeetUp?": "Von der Geburtstagsparty mit Freunden und Familie bis hin zu Demonstrationen gegen den Klimawandel, momentan sind unsere Veranstaltungen in den Platformen der Tech-Giganten gefangen. Wie können wir uns organisieren, wie können wir auf „Teilnehmen“ klicken ohne private Daten an Facebook zu geben oder abhängig von MeetUp zu sein?", "From the {startDate} at {startTime} to the {endDate}": "Vom {startDate} um {startTime} bis zum {endDate}", - "From the {startDate} at {startTime} to the {endDate} at {endTime}": "Vom {startDate} um {startTime} bis zum {endDate} um {endTime}", + "From the {startDate} at {startTime} to the {endDate} at {endTime}": "Vom {startDate} um {startTime} Uhr bis zum {endDate} um {endTime} Uhr", "From the {startDate} to the {endDate}": "Vom {startDate} bis zum {endDate}", + "From yourself": "Von Ihnen selbst", "Gather ⋅ Organize ⋅ Mobilize": "Treffen ⋅ Organisieren ⋅ Mobilisieren", "General": "Allgemein", "General information": "Allgemeine Informationen", @@ -311,7 +322,7 @@ "Go to the event page": "Zur Veranstaltungsseite", "Going as {name}": "Teilnehmen als {name}", "Group": "Gruppe", - "Group Followers": "Follower dieser Gruppe", + "Group Followers": "Follower*innen dieser Gruppe", "Group List": "Gruppenliste", "Group Members": "Gruppenmitglieder", "Group address": "Gruppenadresse", @@ -368,7 +379,7 @@ "Instance Short Description": "Kurzbeschreibung der Instanz", "Instance Slogan": "Slogan der Instanz", "Instance Terms": "Nutzungsbedingungen der Instanz", - "Instance Terms Source": "Herkunft der Nutzungsbedingungen der Instanz", + "Instance Terms Source": "Herkunft der Instanz-Regeln", "Instance Terms URL": "URL der Nutzungsbedingungen der Instanz", "Instance administrator": "Administrator der Instanz", "Instance configuration": "Einstellungen der Instanz", @@ -410,6 +421,7 @@ "Limited number of places": "Limitierte Anzahl an Plätzen", "List title": "Titel der Liste", "Load more": "Mehr anzeigen", + "Load more activities": "Mehr Ereignisse laden", "Loading comments…": "Lade Kommentare…", "Local": "Lokal", "Locality": "Ort", @@ -424,7 +436,7 @@ "Manage my notifications": "Meine Benachrichtigungen verwalten", "Manage my settings": "Meine Einstellungen verwalten", "Manage participations": "Teilnehmer verwalten", - "Manually approve new followers": "Neue Follower manuell genehmigen", + "Manually approve new followers": "Neue Follower*innen manuell genehmigen", "Manually invite new members": "Manuelles Einladen neuer Mitglieder", "Mark as resolved": "Als gelöst markieren", "Member": "Mitglied", @@ -464,6 +476,7 @@ "New members": "Neue Mitglieder", "New note": "Neue Notiz", "New password": "Neues Passwort", + "New post": "Neuer Beitrag", "New profile": "Neues Profil", "Next": "Nächste", "Next month": "Nächsten Monat", @@ -479,6 +492,7 @@ "No follower matches the filters": "Kein Follower passt zu diesen Filtern", "No group found": "Keine Gruppe gefunden", "No groups found": "Keine Gruppen gefunden", + "No information": "Keine Informationen", "No instance follows your instance yet.": "Noch keine Instanz folgt deiner Instanz.", "No instance to approve|Approve instance|Approve {number} instances": "Keine Instanz zu prüfen|Überprüfe Instanz|Überprüfe {number} Instanzen", "No instance to reject|Reject instance|Reject {number} instances": "Keine Instanz abzulehnen|Lehne Instanz ab|Lehne {number} Instanzen ab", @@ -514,6 +528,7 @@ "Nothing to see here": "Hier gibt es nichts zu sehen", "Notification before the event": "Benachrichtigung vor der Veranstaltung", "Notification on the day of the event": "Benachrichtigung am Tag der Veranstaltung", + "Notifications": "Benachrichtigungen", "Notifications for manually approved participations to an event": "Benachrichtigungen bei manuell bestätigten Teilnahmen an einer Veranstlatung", "Now, create your first profile:": "Erstellen Sie jetzt Ihr erstes Profil:", "Number of places": "Anzahl der Plätze", @@ -571,12 +586,13 @@ "Password reset": "Passwort zurücksetzen", "Past events": "Vergangene Veranstaltungen", "Pending": "Ausstehend", + "Personal feeds": "Persönliche Feeds", "Pick": "Wähle", "Pick a group": "Wählen Sie eine Gruppe", "Pick a profile or a group": "Wähle ein Profil der eine Gruppe", "Pick an identity": "Wählen Sie eine Identität", "Pick an instance": "Wähle eine Instanz", - "Please add as many details as possible to help identify the problem.": "Bitte gib uns so viele Details wie möglich, die uns helfen könnten, das Problem zu analysieren.", + "Please add as many details as possible to help identify the problem.": "Bitte geben Sie uns so viele Details wie möglich, die uns helfen könnten, das Problem zu analysieren.", "Please check your spam folder if you didn't receive the email.": "Bitte sehen Sie auch in Ihrem Spam-Ordner nach, wenn Sie keine E-Mail erhalten haben.", "Please contact this instance's Mobilizon admin if you think this is a mistake.": "Bitte kontaktieren Sie den Administrator dieser Mobilizon-Instanz, wenn Sie denken, dass dies ein Fehler ist.", "Please do not use it in any real way.": "Bitte nicht im praktischen Einsatz verwenden.", @@ -601,6 +617,7 @@ "Privacy policy": "Datenschutzerklärung", "Private event": "Private Veranstaltung", "Private feeds": "Private Feeds", + "Profile feeds": "Profil-Feeds", "Profiles": "Profile", "Profiles and federation": "Profile und Föderation", "Promote": "Promoten", @@ -623,6 +640,7 @@ "Redirecting to content…": "Weiterleitung zum Inhalt…", "Redirecting to event…": "Weiterleiten zur Veranstaltung…", "Refresh profile": "Profil aktualisieren", + "Regenerate new links": "Erstelle die Links neu", "Region": "Region", "Register": "Registrieren", "Register an account on Mobilizon!": "Erstelle einen Mobilizon-Account!", @@ -729,14 +747,21 @@ "The event organizer didn't add any description.": "Der Organisator hat keine Beschreibung hinzugefügt.", "The event organizer manually approves participations. Since you've chosen to participate without an account, please explain why you want to participate to this event.": "Der Organisator möchte Teilnahmen manuell bestätigen. Wenn Sie ohne Konto teilnehmen möchten, erklären Sie bitte warum Sie an der Veranstaltung interessiert sind.", "The event title will be ellipsed.": "Der Titel der Veranstaltung wird verkürzt dargestellt.", - "The event will show as attributed to this group.": "Das Ereignis wird als dieser Gruppe zugehörig angezeigt.", - "The event will show as attributed to your personal profile.": "Das Ereignis wird als Ihrem persönlichen Profil zugewiesen angezeigt.", + "The event will show as attributed to this group.": "Die Veranstaltung wird als dieser Gruppe zugehörig angezeigt.", + "The event will show as attributed to this profile.": "Die Veranstaltung wird als Ihrem Profil zugewiesen angezeigt.", + "The event will show as attributed to your personal profile.": "Die Veranstaltung wird als Ihrem persönlichen Profil zugewiesen angezeigt.", "The event will show the group as organizer.": "Bei diese Veranstaltung wird die Gruppe als Organisationsteam angezeigt.", "The event {event} was created by {profile}.": "Die Veranstaltung {event} wurde erstellt von {profile}.", "The event {event} was deleted by {profile}.": "Die Veranstaltung {event} wurde von {profile} gelöscht.", "The event {event} was updated by {profile}.": "Die Veranstaltung {event} wurde von {profile} aktualisiert.", "The events you created are not shown here.": "Die Veranstaltung, die Sie erstellt haben ist hier nicht gelistet.", + "The group can now be joined by anyone.": "Der Gruppe können nun alle beitreten.", + "The group can now only be joined with an invite.": "Der Gruppe kann nun ausschließlich durch Einladung beigetreten werden.", "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.": "Diese Gruppe wird öffentlich in Suchergebnissen sichtbar sein und könnte im Bereich „Entdecken“ auftauchen. Nur öffentliche Informationen werden auf der Gruppenseite angezeigt.", + "The group's avatar was changed.": "Der Profilbild der Gruppe wurde geändert.", + "The group's banner was changed.": "Das Gruppenbanner wurde geändert.", + "The group's physical address was changed.": "Die physische Adresse der Gruppe wurde geändert.", + "The group's short description was changed.": "Die Kurzbeschreibung der Gruppe wurde geändert.", "The instance administrator is the person or entity that runs this Mobilizon instance.": "Der Administrator der Instanz ist die Person oder Organisation, die diese Mobilizon-Instanz betreibt.", "The member was removed from the group {group}": "Das Mitglied wurde aus der Gruppe {group} entfernt", "The new email doesn't seem to be valid": "Die neue E-Mail-Adresse scheint ungültig zu sein", @@ -760,6 +785,8 @@ "There will be no way to recover your data.": "Es gibt keinen Weg Ihre Daten wiederherszustellen.", "There's no discussions yet": "Es gibt noch keine Diskussion", "These events may interest you": "Diese Veranstaltungen könnten Sie interessieren", + "These feeds contain event data for the events for which any of your profiles is a participant or creator. You should keep these private. You can find feeds for specific profiles on each profile edition page.": "Diese Feeds enthalten Veranstaltungsdaten für alle Veranstaltungen, für die irgendeines Ihrer Profile Teilnehmer*in oder Ersteller*in ist.", + "These feeds contain event data for the events for which this specific profile is a participant or creator. You should keep these private. You can find feeds for all of your profiles into your notification settings.": "Diese Feeds enthalten Veranstaltungsdaten für alle Veranstaltungen, für die dieses Profil Teilnehmer*in oder Ersteller*in ist.", "This Mobilizon instance and this event organizer allows anonymous participations, but requires validation through email confirmation.": "Diese Mobilizon-Instanz und der Organisator akzeptieren anonyme Teilnahmen, aber eine Bestätigung per E-Mail ist erforderlich.", "This URL is not supported": "Diese URL wird nicht unterstützt", "This email is already registered as participant for this event": "Diese E-Mail-Adresse ist bereits als Teilnehmer:in für die Veranstaltung registriert", @@ -812,6 +839,7 @@ "Unknown": "Unbekannt", "Unknown actor": "Unbekannter Akteur", "Unknown error.": "Unbekannter Fehler.", + "Unknown value for the openness setting.": "Unbekannter Wert für die Zugangsbeschränkungen.", "Unsaved changes": "Nicht gespeicherte Änderungen", "Unset group": "Auswahl der Gruppe aufheben", "Unsuspend": "Freigeben", @@ -839,6 +867,9 @@ "View event page": "Veranstaltungsseite anzeigen", "View everything": "Alles anzeigen", "View page on {hostname} (in a new window)": "Seite auf {hostname} anzeigen (in einem neuen Fenster)", + "Visibility was set to an unknown value.": "Die Sichtbarkeit wurde in unbekannt geändert.", + "Visibility was set to private.": "Die Sichtbarkeit wurde in privat geändert.", + "Visibility was set to public.": "Die Sichtbarkeit wurde in öffentlich geändert.", "Visible everywhere on the web": "Öffentlich sichtbar im gesamten Internet", "Visible everywhere on the web (public)": "Sichtbar im ganzen Internet (öffentlich)", "Waiting for organization team approval.": "Warte auf die Bestätigung des Organisationsteams.", @@ -874,6 +905,7 @@ "You accepted the invitation to join the group.": "Sie haben die Einladung zur Gruppe angenommen.", "You added the member {member}.": "Sie haben das Mitglied {member} hinzugefügt.", "You and one other person are going to this event": "Du gehst alleine zu dieser Veranstaltung | Du und eine weitere Person gehen zu dieser Veranstaltung | Du und {approved} weitere Personen gehen zu dieser Veranstaltung.", + "You archived the discussion {discussion}.": "Sie haben die Diskussion {discussion} archiviert.", "You are already a participant of this event.": "Du nimmst bereits an dieser Veranstaltung teil.", "You are already logged-in.": "Du bist bereits eingeloggt.", "You are not an administrator for this group.": "Sie sind kein Administrator dieser Gruppe.", @@ -881,16 +913,23 @@ "You are not part of any group.": "Sie sind kein Teil einer Gruppe.", "You are participating in this event anonymously": "Sie nehmen anonym an dieser Veranstaltung teil", "You are participating in this event anonymously but didn't confirm participation": "Sie nehmen an dieser Veranstaltung anonym teil, haben aber Ihre Teilnahme noch nicht bestätigt", - "You can add tags by hitting the Enter key or by adding a comma": "Sie können Tags hinzufügen, indem Sie Enter drücken oder durch ein Komma trennen", + "You can add tags by hitting the Enter key or by adding a comma": "Sie können Schlagworte hinzufügen, indem Sie Enter drücken oder durch ein Komma trennen", "You can pick your timezone into your preferences.": "Sie können Ihre Zeitzone in den Einstellungen festlegen.", "You can try another search term or drag and drop the marker on the map": "Sie können einen anderen Suchbegriff verwenden oder die Markierung auf der Karte verschieben", "You can't change your password because you are registered through {provider}.": "Sie können Ihr Passwort nicht ändern, weil Sie über {provider} angemeldet sind.", "You can't remove your last identity.": "Du kannst deine letzte Identität nicht löschen.", "You can't reset your password because you use a 3rd-party auth provider to login.": "Du kannst dein Passwort nicht zurücksetzen, weil du über einen Drittanbieter eingeloggt bist.", + "You created the discussion {discussion}.": "Sie haben die Diskussion {discussion} erstellt.", "You created the event {event}.": "Sie haben die Veranstaltung {event} erstellt.", + "You created the folder {resource}.": "Sie haben den Ordner {resource} erstellt.", + "You created the group {group}.": "Sie haben die Gruppe {group} erstellt.", "You created the post {post}.": "Sie haben den Beitrag {post} erstellt.", + "You created the resource {resource}.": "Sie haben die Ressource {resource} erstellt.", + "You deleted the discussion {discussion}.": "Sie haben die Diskussion {discussion} gelöscht.", "You deleted the event {event}.": "Sie haben die Veranstaltung {event} gelöscht.", + "You deleted the folder {resource}.": "Sie haben den Ordner {resource} gelöscht.", "You deleted the post {post}.": "Sie haben den Beitrag {post} gelöscht.", + "You deleted the resource {resource}.": "Sie haben die Ressource {resource} gelöscht.", "You demoted the member {member} to an unknown role.": "Sie haben {member} zu einer unbekannten Rolle zurückgestuft.", "You demoted {member} to moderator.": "Sie haben {member} zum/zur Moderator/in zurückgestuft.", "You demoted {member} to simple member.": "Sie haben {member} zu einem einfachen Mitglied zurückgestuft.", @@ -909,16 +948,30 @@ "You may also ask to {resend_confirmation_email}.": "Du kannst auch die {resend_confirmation_email}.", "You may clear all participation information for this device with the buttons below.": "Sie können alle Teilnahmeinformationen für dieses Gerät mit den Schaltflächen unten löschen.", "You may now close this window, or {return_to_event}.": "Sie können das Fenster jetzt schließe oder {return_to_event}.", + "You may show some members as contacts.": "Sie können einige Mitglieder als Kontakte anzeigen lassen.", + "You moved the folder {resource} into {new_path}.": "Sie haben den Ordner {resource} nach {new_path} verschoben.", + "You moved the folder {resource} to the root folder.": "Sie haben den Ordner {resource} in das Root-Verzeichnis verschoben.", + "You moved the resource {resource} into {new_path}.": "Sie haben die Ressource {resource} nach {new_path} verschoben.", + "You moved the resource {resource} to the root folder.": "Sie haben die Ressource {resource} in das Root-Verzeichnis verschoben.", "You need to create the group before you create an event.": "Sie müssen zunächst eine Gruppe anlegen, bevor Sie eine Veranstaltung anlegen können.", "You need to login.": "Sie müssen sich einloggen.", + "You posted a comment on the event {event}.": "Sie haben die Veranstaltung {event} kommentiert.", "You promoted the member {member} to an unknown role.": "Sie haben {member} einer unbekannten Rolle zugewiesen.", "You promoted {member} to administrator.": "Sie haben {member} zum/zur Administrator/in befördert.", "You promoted {member} to moderator.": "Sie haben {member} zum/zur Moderator/in befördert.", + "You renamed the discussion from {old_discussion} to {discussion}.": "Sie haben die Diskussion {old_discussion} in {discussion} umbenannt.", + "You renamed the folder from {old_resource_title} to {resource}.": "Sie haben den Ordner {old_resource_title} in {resource} umbenannt.", + "You renamed the resource from {old_resource_title} to {resource}.": "Sie haben die Ressource {old_resource_title} in {resource} umbenannt.", + "You replied to a comment on the event {event}.": "Sie haben auf ein Kommentar in der Veranstaltung {event} geantwortet.", + "You replied to the discussion {discussion}.": "Sie haben auf die Diskussion {discussion} geantwortet.", "You requested to join the group.": "Sie haben die angefragt der Gruppe beizutreten.", "You updated the event {event}.": "Sie haben die Veranstaltung {event} aktualisiert.", + "You updated the group {group}.": "Sie haben die Gruppe {group} aktualisiert.", "You updated the member {member}.": "Sie haben {member} aktualisiert.", "You updated the post {post}.": "Sie haben den Beitrag {post} aktualisiert.", + "You were demoted to an unknown role by {profile}.": "Sie wurden von {profile} in eine unbekannte Rolle zurückgestuft.", "You were demoted to moderator by {profile}.": "Sie wurden von {profile} zum/zur Moderator/in zurückgestuft.", + "You were demoted to simple member by {profile}.": "Sie wurden von {profile} zum einfachen Mitglied zurückgestuft.", "You were promoted to administrator by {profile}.": "Sie wurden von {profile} zum/zur Administrator/in befördert.", "You were promoted to an unknown role by {profile}.": "Sie wurden von {profile} zu einer unbekannten Rolle befördert.", "You were promoted to moderator by {profile}.": "Sie wurden von {profile} zum/zur Moderator/in befördert.", @@ -927,6 +980,7 @@ "You will find here all the events you have created or of which you are a participant.": "Hier finden Sie alle Ereignisse, die Sie erstellt haben oder an denen Sie beteiligt sind.", "You wish to participate to the following event": "Sie möchten an der folgenden Veranstaltung teilnehmen", "You'll get a weekly recap every Monday for upcoming events, if you have any.": "Sie erhalten jeden Montag eine Benachrichtigung über Ihre anstehenden Veranstaltungen.", + "You'll need to change the URLs where there were previously entered.": "Sie müssen die URLs überall dort ändern, wo sie zuvor eingetragen wurden.", "You'll need to transmit the group URL so people may access the group's profile.": "Du musst die Adresse (URL) der Gruppe weitergeben, um Leuten Zugriff auf das Gruppenprofil zu geben.", "You'll need to transmit the group URL so people may access the group's profile. The group won't be findable in Mobilizon's search or regular search engines.": "Sie müssen die Gruppen-URL übertragen, damit andere Personen auf das Profil der Gruppe zugreifen können. Die Gruppe wird nicht in der Mobilizonsuche oder in normalen Suchmaschinen gefunden.", "You'll receive a confirmation email.": "Sie erhalten eine Bestätigungsmail.", @@ -934,6 +988,7 @@ "Your account has been validated": "Ihr Account wurde validiert", "Your account is being validated": "Ihr Account wird validiert", "Your account is nearly ready, {username}": "Ihr Account ist fast bereit, {username}", + "Your city or region and the radius will only be used to suggest you events nearby. The event radius will consider the administrative center of the area.": "Ihr Ort, Landkreis oder Bundesland wird nur genutzt um Ihnen Veranstaltungen in Ihrer Nähe anzuzeigen. Der Veranstaltungsradius berücksichtigt den Verwaltungssitz des Gebietes.", "Your current email is {email}. You use it to log in.": "Ihre aktuelle E-Mail-Adresse ist {email}. Diese kann zum Anmelden verwendet werden.", "Your email": "Ihre E-Mail", "Your email address was automatically set based on your {provider} account.": "Ihre E-Mail-Adresse wurde automatisch basierend auf Ihrem {provider}-Account gesetzt.", @@ -1022,15 +1077,36 @@ "{number} organized events": "Keine organisierten Veranstaltungen|Eine organisierte Veranstaltung|{number} organisierte Veranstaltungen", "{number} participations": "Keine Teilnehmer|Ein Teilnehmer|{number} Teilnehmer", "{number} posts": "Keine Beiträge |Ein Beitrag|{number} Beiträge", + "{old_group_name} was renamed to {group}.": "{old_group_name} wurde in {group} umbenannt.", "{profile} (by default)": "{profile} (Standard)", "{profile} added the member {member}.": "{profile} hat das Mitglied {member} hinzugefügt.", + "{profile} archived the discussion {discussion}.": "{profile} hat die Diskussion {discussion} archiviert.", + "{profile} created the discussion {discussion}.": "{profile} hat die Diskussion {discussion} erstellt.", + "{profile} created the folder {resource}.": "{profile} hat den Ordner {resource} erstellt.", + "{profile} created the group {group}.": "{profile} hat die Gruppe {group} erstellt.", + "{profile} created the resource {resource}.": "{profile} hat die Ressource {resource} erstellt.", + "{profile} deleted the discussion {discussion}.": "{profile} hat die Diskussion {discussion} gelöscht.", + "{profile} deleted the folder {resource}.": "{profile} hat den Ordner {resource} gelöscht.", + "{profile} deleted the resource {resource}.": "{profile} hat die Ressource {resource} gelöscht.", "{profile} demoted {member} to an unknown role.": "{profile} hat {member} zu einer unbekannten Rolle zurückgestuft.", "{profile} demoted {member} to moderator.": "{profile} hat {member} zum/zur Moderator/in zurückgestuft.", "{profile} demoted {member} to simple member.": "{profile} hat {member} zu einem einfachen Mitglied zurückgestuft.", "{profile} excluded member {member}.": "{profile} hat {member} ausgeschlossen.", + "{profile} moved the folder {resource} into {new_path}.": "{profile} hat den Ordner {resource} nach {new_path} verschoben.", + "{profile} moved the folder {resource} to the root folder.": "{profile} hat den Ordner {resource} in das Root-Verzeichnis verschoben.", + "{profile} moved the resource {resource} into {new_path}.": "{profile} hat die Ressource {resource} nach {new_path} verschoben.", + "{profile} moved the resource {resource} to the root folder.": "{profile} hat die Ressource {resource} in das Root-Verzeichnis verschoben.", + "{profile} posted a comment on the event {event}.": "{profile} hat die Veranstaltung {event} kommentiert.", "{profile} promoted {member} to administrator.": "{profile} hat {member} zum/zur Administrator/in befördert.", "{profile} promoted {member} to an unknown role.": "{profile} hat {member} zu einer unbekannten Rolle befördert.", "{profile} promoted {member} to moderator.": "{profile} hat {member} zum/zur Moderator/in befördert.", + "{profile} quit the group.": "{profile} hat die Gruppe verlassen.", + "{profile} renamed the discussion from {old_discussion} to {discussion}.": "{profile} hat die Diskussion {old_discussion} in {discussion} umbenannt.", + "{profile} renamed the folder from {old_resource_title} to {resource}.": "{profile} hat den Ordner {old_resource_title} in {resource} umbenannt.", + "{profile} renamed the resource from {old_resource_title} to {resource}.": "{profile} hat die Ressource {old_resource_title} in {resource} umbenannt.", + "{profile} replied to a comment on the event {event}.": "{profile} hat auf ein Kommentar in der Veranstaltung {event} geantwortet.", + "{profile} replied to the discussion {discussion}.": "{profile} hat auf die Diskussion {discussion} geantwortet.", + "{profile} updated the group {group}.": "{profile} hat die Gruppe {group} aktualisiert.", "{profile} updated the member {member}.": "{profile} hat {member} aktualisiert.", "{title} ({count} todos)": "{title} ({count} To-dos)", "{username} was invited to {group}": "{username} wurde zu {group} eingeladen", From 077916474cea376451210cdb67096813e10fef2b Mon Sep 17 00:00:00 2001 From: Till Date: Wed, 31 Mar 2021 20:22:44 +0000 Subject: [PATCH 07/85] Translated using Weblate (German) Currently translated at 100.0% (981 of 981 strings) Translation: Mobilizon/Frontend Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/de/ --- js/src/i18n/de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/i18n/de.json b/js/src/i18n/de.json index a9f184903..77a014258 100644 --- a/js/src/i18n/de.json +++ b/js/src/i18n/de.json @@ -623,7 +623,7 @@ "Promote": "Promoten", "Public": "Öffentlich", "Public RSS/Atom Feed": "Öffentlicher RSS/Atom-Feed", - "Public comment moderation": "Öffentliche Kommentare", + "Public comment moderation": "Moderation öffentlicher Kommentare", "Public event": "Öffentliche Veranstaltung", "Public feeds": "Öffentliche Feeds", "Public iCal Feed": "Öffentlicher iCal-Feed", From 4e9d29d4a52d8e5f9dc0e5ad6de8a25a1f7b78e2 Mon Sep 17 00:00:00 2001 From: fluxx Date: Wed, 31 Mar 2021 20:22:27 +0000 Subject: [PATCH 08/85] Translated using Weblate (German) Currently translated at 100.0% (981 of 981 strings) Translation: Mobilizon/Frontend Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/de/ --- js/src/i18n/de.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/i18n/de.json b/js/src/i18n/de.json index 77a014258..980481ad3 100644 --- a/js/src/i18n/de.json +++ b/js/src/i18n/de.json @@ -483,7 +483,7 @@ "Next page": "Nächste Seite", "Next week": "Nächste Woche", "No address defined": "Keine Adresse festgelegt", - "No closed reports yet": "Noch keine geschlossenen Berichte", + "No closed reports yet": "Bisher keine geschlossenen Berichte", "No comment": "Kein Kommentar", "No comments yet": "Noch keine Kommentare", "No discussions yet": "Noch keine Diskussionen gestartet", From 1c67a7548f8b2e289d07aa3e32b84c42ad35c0a0 Mon Sep 17 00:00:00 2001 From: deadmorose Date: Thu, 1 Apr 2021 17:33:57 +0000 Subject: [PATCH 09/85] Translated using Weblate (Russian) Currently translated at 81.9% (804 of 981 strings) Translation: Mobilizon/Frontend Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/ru/ --- js/src/i18n/ru.json | 78 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) diff --git a/js/src/i18n/ru.json b/js/src/i18n/ru.json index 50179d891..8f05c5955 100644 --- a/js/src/i18n/ru.json +++ b/js/src/i18n/ru.json @@ -11,18 +11,23 @@ "@{group}": "@{group}", "@{username} ({role})": "@{username} ({role})", "A cookie is a small file containing information that is sent to your computer when you visit a website. When you visit the site again, the cookie allows that site to recognize your browser. Cookies may store user preferences and other information. You can configure your browser to refuse all cookies. However, this may result in some website features or services partially working. Local storage works the same way but allows you to store more data.": "Cookie - это небольшой файл, содержащий информацию, которая сохраняется на вашем компьютере при посещении веб-сайта. Когда вы снова посещаете эту страницу, cookie позволяет сайту распознавать ваш браузер. Cookie могут хранить настройки пользователя и другую информацию. Вы можете настроить свой браузер так, чтобы он не принимал файлы cookie. Однако это может привести к тому, что часть функционала веб-сайта не будет работать. Локальное хранилище работает так же, но позволяет хранить больше данных.", + "A federated software": "Федеративное программное обеспечение", "A place for your code of conduct, rules or guidelines. You can use HTML tags.": "Тут можно разместить общие правила, положения или руководства. Вы можете использовать HTML-теги.", "A place to explain who you are and the things that set your instance apart. You can use HTML tags.": "Тут можно подробно описать кто вы и что делает этот узел особенным. Вы можете использовать HTML-теги.", "A place to publish something to the whole world, your community or just your group members.": "Место для публикации чего-либо для всего мира, вашего сообщества или только участников вашей группы.", "A place to store links to documents or resources of any type.": "Место для хранения ссылок на документы или ресурсы любого типа.", + "A practical tool": "Удобный инструмент", + "A short tagline for your instance homepage. Defaults to \"Gather ⋅ Organize ⋅ Mobilize\"": "Короткий слоган для домашней страницы вашего узла. По умолчанию: \"Собирать ⋅ Организовывать ⋅ Мобилизовывать\"", "A user-friendly, emancipatory and ethical tool for gathering, organising, and mobilising.": "Удобный, свободный и этичный инструмент для объединения, организации и мобилизации.", "A validation email was sent to {email}": "Письмо с подтверждением было отправлено на адрес {email}", "API": "API", "Abandon editing": "Отменить изменения", "About": "О", "About Mobilizon": "О Mobilizon", + "About anonymous participation": "Об анонимном участии", "About this event": "Об этом мероприятии", "About this instance": "Об этом узле", + "About {instance}": "О {instance}", "Accept": "Принять", "Accepted": "Принято", "Accessible only to members": "Доступно только участникам", @@ -52,6 +57,7 @@ "All the places have already been taken": "Все места уже заняты", "Allow all comments from users with accounts": "Разрешить все комментарии от авторизованных пользователей", "Allow registrations": "Разрешить регистрацию", + "An ethical alternative": "Этичная альтернатива", "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.": "Узел - это программное обеспечение Mobilizon, установленное на сервере. Узел может быть запущен кем угодно, использующим {mobilizon_software} или другие федеративные приложения, называемые «Федиверзум». Имя этого узла - {instance_name}. Mobilizon - это федеративная сеть, состоящая из нескольких узлов (как почтовые серверы). Пользователи могут свободно общаться друг с другом, даже если они зарегистрированы на разных узлах.", "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 on your behalf, automatically and remotely.": "Интерфейс прикладного программирования» или «API» - это протокол связи, который позволяет программным компонентам взаимодействовать друг с другом. Например, API Mobilizon позволяет стороннему программному обеспечению взаимодействовать с узлами Mobilizon для выполнения определенных действий, таких как автоматическая публикация мероприятий от вашего имени.", "And {number} comments": "И {number} комментариев", @@ -59,6 +65,8 @@ "Anonymous participants will be asked to confirm their participation through e-mail.": "Анонимные участники получат запрос на подтверждение своего участия по электронной почте.", "Anonymous participations": "Анонимное участие", "Any day": "В любой день", + "Anyone can join freely": "Каждый может присоединиться", + "Anyone wanting to be a member from your group will be able to from your group page.": "Каждый, кто хочет стать участником вашей группы, сможет сделать это на странице этой группы.", "Application": "Приложение", "Are you really sure you want to delete your whole account? You'll lose everything. Identities, settings, events created, messages and participations will be gone forever.": "Вы действительно уверены, что хотите удалить свою учетную запись? Вы потеряете всё. Идентификаторы, настройки, созданные мероприятия, сообщения и история исчезнут навсегда.", "Are you sure you want to completely delete this group? All members - including remote ones - will be notified and removed from the group, and all of the group data (events, posts, discussions, todos…) will be irretrievably destroyed.": "Вы действительно хотите полностью удалить эту группу? Все участники, включая участников с других узлов, будут уведомлены и удалены из группы, а все данные группы (мероприятия, сообщения, обсуждения, задачи…) будут безвозвратно уничтожены.", @@ -70,6 +78,7 @@ "Are you sure you want to cancel the event edition? You'll lose all modifications.": "Вы уверены, что хотите отменить редактирование мероприятия? Все изменения будут потеряны.", "Are you sure you want to cancel your participation at event \"{title}\"?": "Вы действительно хотите отказаться от участия в мероприятии \"{title}\"?", "Are you sure you want to delete this event? This action cannot be reverted.": "Вы уверены, что хотите удалить это мероприятие? Это действие нельзя отменить.", + "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.": "Поскольку организатор мероприятия решил вручную подтверждать запросы на участие, ваше участие будет фактически подтверждено после того, как вы получите электронное письмо о том, что оно было одобрено.", "Assigned to": "Присвоен", "Avatar": "Аватар", "Back to previous page": "Вернуться на предыдущую страницу", @@ -88,13 +97,18 @@ "Cancel edition": "Отменить редактирование", "Cancel my participation request…": "Отменить мою заявку на участие…", "Cancel my participation…": "Отменить моё участие…", + "Cancelled": "Отменено", "Cancelled: Won't happen": "Отменено: Не состоится", "Change": "Изменить", "Change my email": "Изменить мой адрес электронной почты", "Change my identity…": "Изменить мой идентификатор…", "Change my password": "Изменить свой пароль", "Change timezone": "Изменить часовой пояс", + "Check your inbox (and your junk mail folder).": "Проверьте свою электронную почту (и папку со спамом).", "Clear": "Очистить", + "Clear participation data for all events": "Очистить данные об участии для всех мероприятий", + "Clear participation data for this event": "Очистить данные об участии в этом мероприятии", + "Click for more information": "Кликнете для получения дополнительной информации", "Click to upload": "Нажмите, чтобы загрузить", "Close": "Закрыть", "Close comments for all (except for admins)": "Закрыть комментарии для всех (кроме админов)", @@ -102,11 +116,13 @@ "Comment deleted": "Комментарий удален", "Comment from @{username} reported": "Жалоба на комментарий от @{username} отправлена", "Comments": "Комментарии", + "Comments are closed for everybody else.": "Комментарии закрыты для всех остальных.", "Confirm my participation": "Подтвердите мое участие", "Confirm my particpation": "Подтвердите мое участие", "Confirmed": "Подтверждённый", "Confirmed at": "Подтверждён в", "Confirmed: Will happen": "Подтверждено: Состоится", + "Congratulations, your account is now created!": "Поздравляем, ваша учетная запись создана!", "Contact": "Контакт", "Continue editing": "Продолжить редактирование", "Cookies and Local storage": "Файлы cookie и локальное хранилище", @@ -121,6 +137,7 @@ "Create a new list": "Создать новый список", "Create a pad": "Создать документ", "Create a videoconference": "Создать видеоконференцию", + "Create an account": "Создать учётную запись", "Create group": "Создать группу", "Create my event": "Создать мое мероприятие", "Create my group": "Создать мою группу", @@ -171,6 +188,7 @@ "Discussions": "Обсуждения", "Display name": "Отображаемое имя", "Display participation price": "Показать стоимость участия", + "Displayed nickname": "Отображаемый ник", "Displayed on homepage and meta tags. Describe what Mobilizon is and what makes this instance special in a single paragraph.": "Отображается на главной странице и в метатегах. Опишите в одном абзаце, что такое Mobilizon и что делает этот узел особенным.", "Do not receive any mail": "Не получать электронные письма", "Domain": "Домен", @@ -202,6 +220,7 @@ "Error while reporting group {groupTitle}": "Ошибка при отправке отчёта о группе {groupTitle}", "Error while validating account": "Ошибка подтверждения учётной записи", "Error while validating participation request": "Произошла ошибка при проверке заявки на участие", + "Ethical alternative to Facebook events, groups and pages, Mobilizon is a tool designed to serve you. Period.": "Mobilizon - это этичная альтернатива мероприятиям, группам и страницам Facebook. Это инструмент, созданный для вас. И точка.", "Event": "Мероприятие", "Event already passed": "Мероприятие уже прошло", "Event cancelled": "Мероприятие отменено", @@ -226,6 +245,7 @@ "Fetch more": "Загрузить больше", "Find an address": "Найти адрес", "Find an instance": "Найти узел", + "Find another instance": "Найти другой узел", "Followers": "Подписчики", "Followings": "Подписки", "For instance: London": "Например: Москва", @@ -241,6 +261,7 @@ "Getting location": "Получить местоположение", "Glossary": "Глоссарий", "Go": "Идти", + "Go to the event page": "Перейти на страницу мероприятия", "Group Members": "Участники группы", "Group address": "Адрес группы", "Group display name": "Отображаемое имя группы", @@ -272,6 +293,8 @@ "If allowed by organizer": "Если разрешено организатором", "If an account with this email exists, we just sent another confirmation email to {email}": "Если учетная запись с этим адресом электронной почты существует, мы отправим еще одно письмо с подтверждением на адрес {email}", "If this identity is the only administrator of some groups, you need to delete them before being able to delete this identity.": "Если этот идентификатор является единственным администратором некоторых групп, то сперва нужно удалить эти группы, прежде чем вы сможете удалить этот идентификатор.", + "If you are being asked for your federated indentity, it's composed of your username and your instance. For instance, the federated identity for your first profile is:": "Если вас спрашивают ваш федеративный идентификатор, то он состоит из вашего имени пользователя и имени вашего узла. Например, федеративный идентификатор для вашего первого профиля:", + "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.": "Если вы выбрали одобрение участников вручную, Mobilizon отправит вам электронное письмо о новых заявках на участие. Ниже вы можете выбрать, как часто вы желаете получать эти уведомления.", "If you want, you may send a message to the event organizer here.": "Здесь вы можете отправить сообщение организатору мероприятия.", "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.": "Приложение в этом контексте - это программное обеспечение, предоставленное командой Mobilizon или третьей стороной, которое используется для взаимодействия с вашим узлом.", "Instance": "Узел", @@ -282,14 +305,18 @@ "Instance Privacy Policy URL": "URL-адрес политики конфиденциальности узла", "Instance Rules": "Правила узла", "Instance Short Description": "Краткое описание узла", + "Instance Slogan": "Слоган узла", "Instance Terms": "Условия использования узла", "Instance Terms Source": "Условия использования этого узла", "Instance Terms URL": "URL условий использования узла", "Instance administrator": "Администратор узла", "Instance configuration": "Настройки узла", + "Instance languages": "Языки узла", "Instance rules": "Правила узла", "Instance settings": "Настройки узла", "Instances": "Узлы", + "Instances following you": "Узлы, подписанные на вас", + "Instances you follow": "Узлы, на которые вы подписаны", "Invite a new member": "Пригласить нового участника", "Invite member": "Пригласить участника", "Invited": "Приглашён", @@ -300,12 +327,14 @@ "Key words": "Ключевые слова", "Language": "Язык", "Last IP adress": "Последний IP-адрес", + "Last group created": "Последняя созданная группа", "Last published event": "Последнее опубликованное мероприятие", "Last sign-in": "Последний вход", "Last week": "На прошлой неделе", "Latest posts": "Последние записи", "Learn more": "Узнать больше", "Learn more about Mobilizon": "Узнать больше о Mobilizon", + "Learn more about {instance}": "Подробнее о {instance}", "Leave": "Покинуть", "Leave event": "Покинуть мероприятие", "Leaving event \"{title}\"": "Покинуть мероприятие \"{title}\"", @@ -315,6 +344,7 @@ "Limited number of places": "Ограниченное количество мест", "List title": "Заголовок списка", "Load more": "Загрузить больше", + "Loading comments…": "Загрузка комментариев…", "Local": "Местный", "Locality": "Местонахождение", "Location": "Местонахождение", @@ -324,14 +354,20 @@ "Login on Mobilizon!": "Авторизуйтесь на Mobilizon!", "Login on {instance}": "Войдите на узел {instance}", "Login status": "Статус входа", + "Main languages you/your moderators speak": "Основные языки, на которых говорите вы/ваши модераторы", "Manage participations": "Управление участниками", + "Manually invite new members": "Пригласите новых участников вручную", "Mark as resolved": "Отметить как решённое", "Member": "Участник", "Members": "Участники", "Message": "Сообщение", "Mobilizon": "Mobilizon", "Mobilizon is a federated network. You can interact with this event from a different server.": "Mobilizon - это федеративная сеть. Вы можете взаимодействовать с этим мероприятием с другого сервера.", + "Mobilizon is a federated software, meaning you can interact - depending on your admin's federation settings - with content from other instances, such as joining groups or events that were created elsewhere.": "Mobilizon - это федеративное программное обеспечение. Это означает, что в зависимости от настроек федерализации администратором, вы можете взаимодействовать с контентом на других узлах, например присоединяться к группам или мероприятиям, созданным в другом месте.", + "Mobilizon is a tool that helps you find, create and organise events.": "Mobilizon - это инструмент, который поможет вам находить, создавать и организовывать мероприятия.", + "Mobilizon is not a giant platform, but a multitude of interconnected Mobilizon websites.": "Mobilizon - это не огромная платформа, а множество взаимосвязанных узлов Mobilizon.", "Mobilizon software": "Программное обеспечение Mobilizon", + "Mobilizon uses a system of profiles to compartiment your activities. You will be able to create as many profiles as you want.": "Mobilizon использует разные профили для разных видов деятельности. Вы можете создать столько профилей, сколько захотите.", "Mobilizon version": "Версия Mobilizon", "Mobilizon will send you an email when the events you are attending have important changes: date and time, address, confirmation or cancellation, etc.": "Mobilizon отправит вам электронное письмо, если в мероприятиях, в которых вы участвуете, произошли важные изменения: дата и время, адрес, подтверждение или отмена и т.д.", "Moderated comments (shown after approval)": "Модерируемые комментарии (будут видны после одобрения)", @@ -351,9 +387,11 @@ "New email": "Новый адрес электронной почты", "New folder": "Новая папка", "New link": "Новая ссылка", + "New members": "Новые участники", "New note": "Новая заметка", "New password": "Новый пароль", "New profile": "Новый профиль", + "Next": "Следующий", "Next month": "В следующем месяце", "Next page": "Следующая страница", "Next week": "На следующей неделе", @@ -370,6 +408,7 @@ "No instance to approve|Approve instance|Approve {number} instances": "Нет узлов для одобрения | Одобрить узел | Одобрить {number} узлов", "No instance to reject|Reject instance|Reject {number} instances": "Нет узлов для отклонения | Отклонить узел | Отклонить {number} узлов", "No instance to remove|Remove instance|Remove {number} instances": "Нет узлов для удаления | Удалить узел | Удалить {number} узлов", + "No languages found": "Язык не найден", "No member matches the filters": "Ни один участник не соответствует критериям", "No message": "Нет сообщений", "No moderation logs yet": "Журналов модерации пока нет", @@ -397,6 +436,7 @@ "Notification before the event": "Уведомление перед мероприятием", "Notification on the day of the event": "Уведомление в день мероприятия", "Notifications for manually approved participations to an event": "Уведомления об участиях в мероприятиях, одобренных вручную", + "Now, create your first profile:": "Теперь создайте свой первый профиль:", "Number of places": "Количество мест", "OK": "OK", "Old password": "Прежний пароль", @@ -408,6 +448,7 @@ "Only accessible through link (private)": "Доступно только по ссылке (приватно)", "Only accessible to members of the group": "Доступно только участникам группы", "Only alphanumeric lowercased characters and underscores are supported.": "Допустимы только буквенно-цифровые символы нижнего регистра и подчеркивания.", + "Only group moderators can create, edit and delete posts.": "Только модераторы группы могут создавать, редактировать и удалять публикации.", "Open": "Открыть", "Opened reports": "Открытые отчёты", "Or": "Или", @@ -442,11 +483,13 @@ "Pick a group": "Выберите группу", "Pick a profile or a group": "Выберите профиль или группу", "Pick an identity": "Выберите идентификатор", + "Pick an instance": "Выберите узел", "Please check your spam folder if you didn't receive the email.": "Если вы не получили письмо, проверьте папку со спамом.", "Please contact this instance's Mobilizon admin if you think this is a mistake.": "Если вы считаете, что произошла ошибка, обратитесь к администратору этого узла.", "Please do not use it in any real way.": "Пожалуйста, используйте это только для тестовых целей.", "Please enter your password to confirm this action.": "Введите свой пароль, чтобы подтвердить это действие.", "Please make sure the address is correct and that the page hasn't been moved.": "Убедитесь, что адрес правильный и страница не была перемещена.", + "Please read the {fullRules} published by {instance}'s administrators.": "Пожалуйста, прочтите {fullRules}, опубликованные администраторами {instance}.", "Post": "Публикация", "Post a comment": "Оставить комментарий", "Post a reply": "Ответить", @@ -454,12 +497,14 @@ "Posts": "Публикации", "Powered by {mobilizon}. © 2018 - {date} The Mobilizon Contributors - Made with the financial support of {contributors}.": "На основе {mobilizon}. © 2018 - {date} Участники Mobilizon - Создан благодаря финансовой поддержке {contributors}.", "Preferences": "Предпочтения", + "Previous": "Предыдущий", "Previous page": "Предыдущая страница", "Privacy Policy": "Политика конфиденциальности", "Privacy policy": "Политика конфиденциальности", "Private event": "Приватное мероприятие", "Private feeds": "Приватная лента", "Profiles": "Профили", + "Profiles and federation": "Профили и федерализация", "Promote": "Поднять", "Public": "Публичный", "Public RSS/Atom Feed": "Публичная RSS/Atom новостная лента", @@ -475,6 +520,7 @@ "Radius": "Радиус", "Recap every week": "Подводить итоги каждую неделю", "Receive one email per request": "Получать электронное письмо на каждый запрос", + "Redirecting to content…": "Перенаправление к содержимому…", "Refresh profile": "Обновить профиль", "Region": "Область", "Register an account on {instanceName}!": "Зарегистрируйте аккаунт на {instanceName}!", @@ -503,6 +549,7 @@ "Reported group": "Жалоба на группу", "Reported identity": "Идентификатор сообщившего", "Reports": "Отчеты", + "Request for participation confirmation sent": "Запрос на подтверждение участия отправлен", "Resend confirmation email": "Отправить письмо с подтверждением ещё раз", "Reset my password": "Сбросить пароль", "Resolved": "Решено", @@ -522,6 +569,7 @@ "Search…": "Поиск…", "Select a language": "Выберите язык", "Select a timezone": "Выберите часовой пояс", + "Select languages": "Выберите языки", "Send email": "Отправить электронное письмо", "Send the confirmation email again": "Отправьте письмо с подтверждением еще раз", "Send the report": "Отправить отчёт", @@ -529,6 +577,7 @@ "Set an URL to a page with your own terms.": "Установите URL-адрес на страницу с вашими собственными условиями.", "Settings": "Настройки", "Share this event": "Поделиться этим мероприятием", + "Short bio": "Коротко о себе", "Show map": "Показать карту", "Show remaining number of places": "Показать оставшееся количество мест", "Show the time when the event begins": "Показать время начала мероприятия", @@ -545,6 +594,7 @@ "Suspend group": "Приостановить группу", "Suspended": "Приостановлен", "Task lists": "Списки задач", + "Tentative": "Предварительный", "Tentative: Will be confirmed later": "Предварительно: будет подтверждено позже", "Terms": "Условия", "Terms of service": "Условия обслуживания", @@ -566,6 +616,9 @@ "The event will show the group as organizer.": "На мероприятии группа будет представлена как организатор.", "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.": "Группа будет представлена в результатах поиска и может быть предложена в разделе «Обзор». На её странице будет отображаться только общедоступная информация.", "The instance administrator is the person or entity that runs this Mobilizon instance.": "Администратор узла - это физическое или юридическое лицо, которое управляет данным узлом Mobilizon.", + "The member was removed from the group {group}": "Участник удалён из группы {group}", + "The only way for your group to get new members is if an admininistrator invites them.": "Новые участники смогут вступать в вашу группу только по приглашению администратора.", + "The organiser has chosen to close comments.": "Организатор решил отключить комментарии.", "The page you're looking for doesn't exist.": "Страницы, которую вы ищете, не существует.", "The password was successfully changed": "Пароль был успешно изменен", "The report will be sent to the moderators of your instance. You can explain why you report this content below.": "Отчёт будет отправлен модераторам вашего узла. Вы можете объяснить причину своей жалобы ниже.", @@ -575,14 +628,21 @@ "There will be no way to recover your data.": "Восстановить ваши данные будет невозможно.", "These events may interest you": "Эти мероприятия могут вас заинтересовать", "This Mobilizon instance and this event organizer allows anonymous participations, but requires validation through email confirmation.": "Этот узел Mobilizon и этот организатор мероприятия допускают анонимное участие, но требуют подтверждения по электронной почте.", + "This URL is not supported": "Этот URL не поддерживается", "This event has been cancelled.": "Это мероприятие было отменено.", "This event is accessible only through it's link. Be careful where you post this link.": "Это мероприятие доступно только по ссылке. Будьте осторожны, когда публикуете её.", + "This group doesn't have a description yet.": "У этой группы ещё нет описания.", + "This group is invite-only": "Эта группа только для приглашённых", + "This identifier is unique to your profile. It allows others to find you.": "Этот идентификатор уникален для вашего профиля. Он даёт возможность другим найти вас.", "This identity is not a member of any group.": "Этот идентификатор не является членом какой-либо группы.", "This information is saved only on your computer. Click for details": "Эта информация сохраняется только на вашем компьютере. Нажмите, чтобы узнать подробности", "This instance isn't opened to registrations, but you can register on other instances.": "Этот узел не позволяет регистрироваться, но вы можете зарегистрироваться на других.", + "This instance, {instanceName} ({domain}), hosts your profile, so remember its name.": "Этот узел, {instanceName} ({domain}), содержит ваш профиль, поэтому запомните его имя.", "This is a demonstration site to test Mobilizon.": "Это демонстрационная площадка для тестирования Mobilizon.", "This is like your federated username ({username}) for groups. It will allow the group to be found on the federation, and is guaranteed to be unique.": "Подобно федеративному имени пользователя ({username}) для групп. Это дает возможность найти группу во всей сети и гарантирует ее уникальность.", "This month": "В этом месяце", + "This setting will be used to display the website and send you emails in the correct language.": "Этот параметр используется для отображения веб-сайта и отправки вам электронных писем на соответствующем языке.", + "This website isn't moderated and the data that you enter will be automatically destroyed every day at 00:01 (Paris timezone).": "Эта веб-сайт не модерируется, и любые введенные вами данные будут автоматически удаляться каждый день в 00:01 (время по Парижу).", "This week": "На этой неделе", "This weekend": "На эти выходные", "This will delete / anonymize all content (events, comments, messages, participations…) created from this identity.": "Это приведет к удалению / анонимизации всего контента (событий, комментариев, сообщений, участия…), созданного с помощью этого идентификатора.", @@ -592,12 +652,17 @@ "To activate more notifications, head over to the notification settings.": "Перейдите в настройки уведомлений, чтобы включить дополнительные уведомления.", "To confirm, type your event title \"{eventTitle}\"": "Для подтверждения введите название мероприятия \"{eventTitle}\"", "To confirm, type your identity username \"{preferredUsername}\"": "Для подтверждения введите имя пользователя \"{preferredUsername}\" идентификатора", + "To create and manage multiples identities from a same account": "Для создания и управления несколькими идентификаторами из одной учётной записи", + "To create and manage your events": "Для создания и управления вашими мероприятиями", + "To create or join an group and start organizing with other people": "Создавать группы и присоединяться к ним для объединения с другими людьми", + "To register for an event by choosing one of your identities": "Чтобы зарегистрироваться на мероприятие, выбрав один из ваших идентификаторов", "Today": "Сегодня", "Tomorrow": "Завтра", "Transfer to {outsideDomain}": "Перенос в {outsideDomain}", "Type": "Тип", "URL": "URL-адрес", "URL copied to clipboard": "URL скопирован в буфер обмена", + "Unable to detect timezone.": "Не удалось определить часовой пояс.", "Unfortunately, this instance isn't opened to registrations": "К сожалению, регистрация на этом узле закрыта", "Unfortunately, your participation request was rejected by the organizers.": "К сожалению, ваша заявка на участие была отклонена организаторами.", "Unknown": "Неизвестный", @@ -614,6 +679,7 @@ "Update my event": "Обновить моё мероприятие", "Update post": "Обновить пост", "Updated": "Обновлено", + "Uploaded media size": "Размер загруженного медиафайла", "Use my location": "Использовать моё местоположение", "User": "Пользователь", "Username": "Имя пользователя", @@ -631,6 +697,7 @@ "We just sent an email to {email}": "Мы отправили электронное письмо на адрес {email}", "We use your timezone to make sure you get notifications for an event at the correct time.": "Мы используем настройки вашего часового пояса, чтобы вы своевременно получали уведомления о мероприятиях.", "We will redirect you to your instance in order to interact with this event": "Вы будете перенаправлены на свой узел, чтобы иметь возможность взаимодействовать с этим событием", + "We will redirect you to your instance in order to interact with this group": "Мы перенаправим вас на ваш узел, чтобы вы могли взаимодействовать с этой группой", "We'll send you an email one hour before the event begins, to be sure you won't forget about it.": "Мы отправим вам электронное письмо за час до начала мероприятия, чтобы вы не забыли про него.", "We'll use your timezone settings to send a recap of the morning of the event.": "Мы используем настройки вашего часового пояса, чтобы утром отправить вам напоминание о мероприятии.", "Website": "Веб-сайт", @@ -638,11 +705,14 @@ "Welcome back {username}!": "С возвращением, {username}!", "Welcome back!": "С возвращением!", "Welcome to Mobilizon, {username}!": "Добро пожаловать в Mobilizon, {username}!", + "When a moderator from the group creates an event and attributes it to the group, it will show up here.": "Когда модератор группы создаёт событие и назначает его группе, оно появляется здесь.", "Who can view this event and participate": "Кто может просматривать и участвовать в мероприятии", "Who can view this post": "Кто может видеть этот пост", "Who published {number} events": "Которые опубликовали {number} мероприятий", + "Why create an account?": "Почему стоит создать учётную запись?", "Will allow to display and manage your participation status on the event page when using this device. Uncheck if you're using a public device.": "Это позволит вам просматривать и управлять своим статусом участия на странице мероприятия при использовании этого устройства. Снимите флажок, если вы используете общедоступное устройство.", "Write something…": "Напиши что-нибудь…", + "You are not an administrator for this group.": "Вы не являетесь администратором этой группы.", "You are participating in this event anonymously": "Вы участвуете в этом мероприятии анонимно", "You are participating in this event anonymously but didn't confirm participation": "Вы участвуете в этом мероприятии анонимно, но не подтвердили свое участие", "You can add tags by hitting the Enter key or by adding a comma": "Вы можете добавлять тэги, нажимая клавишу Enter или разделяя слова запятой", @@ -657,8 +727,11 @@ "You have one event in {days} days.": "У вас нет мероприятий в течение {days} дней | У вас одно мероприятие в течении {days} дней | У вас {count} мероприятий в течении {days} дней", "You have one event today.": "У вас сегодня нет мероприятий | У вас сегодня одно мероприятие. | У вас сегодня {count} мероприятий", "You have one event tomorrow.": "Завтра у вас нет мероприятий | Завтра у вас одно мероприятие. | Завтра у вас {count} мероприятий", + "You may clear all participation information for this device with the buttons below.": "Вы можете удалить всю информацию об участии для этого устройства с помощью кнопок ниже.", + "You may now close this window, or {return_to_event}.": "Теперь вы можете закрыть это окно, или {return_to_event}.", "You need to create the group before you create an event.": "Перед созданием мероприятия вам необходимо создать группу.", "You need to login.": "Вы должны авторизоваться.", + "You will be able to add an avatar and set other options in your account settings.": "Вы сможете добавить аватар и изменить другие параметры в настройках своей учётной записи.", "You will be redirected to the original instance": "Вы будете перенаправлены на исходный узел", "You wish to participate to the following event": "Вы хотите принять участие в следующем мероприятии", "You'll get a weekly recap every Monday for upcoming events, if you have any.": "Каждый понедельник вы будете получать сводку о предстоящих мероприятиях, в которых вы принимаете участие.", @@ -669,6 +742,7 @@ "Your account is being validated": "Ваша учетная запись проверяется", "Your account is nearly ready, {username}": "Ваш аккаунт почти готов, {username}", "Your current email is {email}. You use it to log in.": "Ваш текущий адрес электронной почты{email}. Вы используете его для входа в систему.", + "Your email": "Ваш адрес электронной почты", "Your email address was automatically set based on your {provider} account.": "Ваш адрес электронной почты был автоматически установлен на основе вашей учётной записи {provider}.", "Your email has been changed": "Ваш адрес электронной почты был изменен", "Your email is being changed": "Ваш адрес электронной почты меняется", @@ -680,9 +754,12 @@ "Your participation request has been validated": "Ваше участие подтверждено", "Your participation request is being validated": "Ваше участие проверяется", "Your participation status has been changed": "Ваш статус участия был изменен", + "Your participation status is saved only on this device and will be deleted one month after the event's passed.": "Ваш статус участия сохраняется только на этом устройстве и будет удалён через месяц после завершения мероприятия.", + "Your participation still has to be approved by the organisers.": "Ваша заявка всё ещё ожидает одобрения организаторов.", "Your profile will be shown as contact.": "Ваш профиль будет отображаться как контакт.", "Your timezone is currently set to {timezone}.": "Ваш часовой пояс в настоящее время установлен на {timezone}.", "Your timezone was detected as {timezone}.": "Ваш часовой пояс был определен как {timezone}.", + "Your timezone {timezone} isn't supported.": "Ваш часовой пояс {timezone} не поддерживается.", "[This comment has been deleted by it's author]": "[Этот комментарий был удален автором]", "[This comment has been deleted]": "[Этот комментарий был удалён]", "[deleted]": "[удалено]", @@ -724,5 +801,6 @@ "{number} posts": "Нет публикаций|Одна публикация|{number} публикаций", "{profile} (by default)": "{profile} (по умолчанию)", "{title} ({count} todos)": "{title} ({count} незавершенных задач)", + "{username} was invited to {group}": "{username} был приглашён в {group}", "© The OpenStreetMap Contributors": "© Авторы OpenStreetMap" } From 26c65dd11e5b255baa3b6a3680bb4e79fb347e13 Mon Sep 17 00:00:00 2001 From: Thomas Frenzel Date: Wed, 31 Mar 2021 20:37:12 +0000 Subject: [PATCH 10/85] Translated using Weblate (German) Currently translated at 100.0% (244 of 244 strings) Translation: Mobilizon/Backend Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/de/ --- priv/gettext/de/LC_MESSAGES/default.po | 506 +++++++++++++------------ 1 file changed, 256 insertions(+), 250 deletions(-) diff --git a/priv/gettext/de/LC_MESSAGES/default.po b/priv/gettext/de/LC_MESSAGES/default.po index 922df94bd..c233406d6 100644 --- a/priv/gettext/de/LC_MESSAGES/default.po +++ b/priv/gettext/de/LC_MESSAGES/default.po @@ -3,8 +3,8 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-09-24 14:39+0000\n" -"PO-Revision-Date: 2021-02-08 11:01+0000\n" -"Last-Translator: Valentin Bachem \n" +"PO-Revision-Date: 2021-04-01 21:14+0000\n" +"Last-Translator: Thomas Frenzel \n" "Language-Team: German \n" "Language: de\n" @@ -12,272 +12,272 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.4.2\n" +"X-Generator: Weblate 4.5.1\n" -#, elixir-format #: lib/web/templates/email/password_reset.html.eex:48 +#, elixir-format msgid "If you didn't request this, please ignore this email. Your password won't change until you access the link below and create a new one." msgstr "" "Wenn Du diese E-Mail nicht angefordert hast, ignoriere sie bitte. Dein " "Passwort wird sich nicht ändern, solange Du den Link unten nicht besuchst " "und ein neues erstellst." -#, elixir-format #: lib/web/templates/email/report.html.eex:74 +#, elixir-format msgid "%{title} by %{creator}" msgstr "%{title} von %{creator}" -#, elixir-format #: lib/web/templates/email/registration_confirmation.html.eex:58 +#, elixir-format msgid "Activate my account" msgstr "Mein Konto aktivieren" -#, elixir-format #: lib/web/templates/email/email.html.eex:117 #: lib/web/templates/email/email.text.eex:9 +#, elixir-format msgid "Ask the community on Framacolibri" msgstr "Richte deine Fragen an die Gemeinschaft auf Framacolibri" -#, elixir-format #: lib/web/templates/email/report.text.eex:15 +#, elixir-format msgid "Comments" msgstr "Kommentare" -#, elixir-format #: lib/web/templates/email/report.html.eex:72 #: lib/web/templates/email/report.text.eex:11 +#, elixir-format msgid "Event" msgstr "Veranstaltung" -#, elixir-format #: lib/web/email/user.ex:48 +#, elixir-format msgid "Instructions to reset your password on %{instance}" msgstr "Anweisungen um dein Passwort auf %{instance} zurückzusetzen" -#, elixir-format #: lib/web/templates/email/report.text.eex:21 +#, elixir-format msgid "Reason" msgstr "Begründung" -#, elixir-format #: lib/web/templates/email/password_reset.html.eex:61 +#, elixir-format msgid "Reset Password" msgstr "Passwort zurücksetzen" -#, elixir-format #: lib/web/templates/email/password_reset.html.eex:41 +#, elixir-format msgid "Resetting your password is easy. Just press the button below and follow the instructions. We'll have you up and running in no time." msgstr "" "Dein Passwort zurückzusetzen ist einfach. Klicke einfach auf den Button " "unten und folge den Anweisungen. Wir kümmern uns um den Rest." -#, elixir-format #: lib/web/email/user.ex:28 +#, elixir-format msgid "Instructions to confirm your Mobilizon account on %{instance}" msgstr "Anweisungen um deinen Mobilizon-Account auf %{instance} zu bestätigen" -#, elixir-format #: lib/web/email/admin.ex:24 +#, elixir-format msgid "New report on Mobilizon instance %{instance}" msgstr "Neue Meldung auf der Mobilizon-Instanz %{instance}" -#, elixir-format #: lib/web/templates/email/before_event_notification.html.eex:51 #: lib/web/templates/email/before_event_notification.text.eex:4 +#, elixir-format msgid "Go to event page" msgstr "Gehe zur Veranstaltungs-Seite" -#, elixir-format #: lib/web/templates/email/report.text.eex:1 +#, elixir-format msgid "New report from %{reporter} on %{instance}" msgstr "Neue Meldung von %{reporter} auf %{instance}" -#, elixir-format #: lib/web/templates/email/event_participation_approved.text.eex:1 +#, elixir-format msgid "Participation approved" msgstr "Teilnahme bestätigt" -#, elixir-format #: lib/web/templates/email/password_reset.html.eex:13 #: lib/web/templates/email/password_reset.text.eex:1 +#, elixir-format msgid "Password reset" msgstr "Passwort zurückgesetzt" -#, elixir-format #: lib/web/templates/email/password_reset.text.eex:7 +#, elixir-format msgid "Resetting your password is easy. Just click the link below and follow the instructions. We'll have you up and running in no time." msgstr "" "Dein Passwort zurückzusetzen ist einfach. Klicke einfach auf den Button " "unten und folge den Anweisungen. Wir kümmern uns um den Rest." -#, elixir-format #: lib/web/templates/email/registration_confirmation.text.eex:5 +#, elixir-format msgid "You created an account on %{host} with this email address. You are one click away from activating it. If this wasn't you, please ignore this email." msgstr "" "Du hast einen Account auf %{host} mit dieser E-Mail-Adresse. Du bist nur ein " "Klick von der Aktivierung entfernt. Wenn Du das nicht warst, ignoriere diese " "E-Mail bitte." -#, elixir-format #: lib/web/email/participation.ex:112 +#, elixir-format msgid "Your participation to event %{title} has been approved" msgstr "Deine Teilnahme an der Veranstaltung %{title}wurde akzeptiert" -#, elixir-format #: lib/web/email/participation.ex:70 +#, elixir-format msgid "Your participation to event %{title} has been rejected" msgstr "Deine Teilnahme an der Veranstaltung %{title}wurde abgelehnt" -#, elixir-format #: lib/web/email/event.ex:37 +#, elixir-format msgid "Event %{title} has been updated" msgstr "Veranstaltung %{title} wurde aktualisiert" -#, elixir-format #: lib/web/templates/email/event_updated.text.eex:15 +#, elixir-format msgid "New title: %{title}" msgstr "Neuer Titel: %{title}" -#, elixir-format #: lib/web/templates/email/password_reset.text.eex:5 +#, elixir-format msgid "You requested a new password for your account on %{instance}." msgstr "" "Du hast ein neues Passwort für deinen Account auf %{instance} angefragt." -#, elixir-format #: lib/web/templates/email/email.html.eex:85 +#, elixir-format msgid "Warning" msgstr "Warnung" -#, elixir-format #: lib/web/email/participation.ex:135 +#, elixir-format msgid "Confirm your participation to event %{title}" msgstr "Meine Teilnahme an der Veranstaltung %{title} zusagen" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:75 +#, elixir-format msgctxt "terms" msgid "An internal ID for your current selected identity" msgstr "Eine interne ID für deine aktuell ausgewählte Identität" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:74 +#, elixir-format msgctxt "terms" msgid "An internal user ID" msgstr "Ein interne Benutzer ID" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:37 +#, elixir-format msgctxt "terms" msgid "Any of the information we collect from you may be used in the following ways:" msgstr "" "Alle Informationen, die wir über Sie sammeln, können wie folgt verwendet " "werden:" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:9 +#, elixir-format msgctxt "terms" msgid "Basic account information" msgstr "Grundlegende Kontoinformationen" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:25 +#, elixir-format msgctxt "terms" msgid "Do not share any dangerous information over Mobilizon." msgstr "Teile keine gefährlichen Informationen über Mobilizon." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:90 +#, elixir-format msgctxt "terms" msgid "Do we disclose any information to outside parties?" msgstr "Geben wir Informationen an Dritte weiter?" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:68 +#, elixir-format msgctxt "terms" msgid "Do we use cookies?" msgstr "Benutzen wir Cookies?" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:51 +#, elixir-format msgctxt "terms" msgid "How do we protect your information?" msgstr "Wie schützen wir deinen Informationen?" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:29 +#, elixir-format msgctxt "terms" msgid "IPs and other metadata" msgstr "IPs und anderen Metadaten" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:17 +#, elixir-format msgctxt "terms" msgid "Published events and comments" msgstr "Veröffentlichte Veranstaltungen und Kommentare" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:64 +#, elixir-format msgctxt "terms" msgid "Retain the IP addresses associated with registered users no more than 12 months." msgstr "" "Bewahren Sie die IP-Adressen, die mit registrierten Benutzern verbunden " "sind, nicht länger als 12 Monate auf." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:76 +#, elixir-format msgctxt "terms" msgid "Tokens to authenticate you" msgstr "Tokens, um dich zu authentifizieren" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:31 +#, elixir-format msgctxt "terms" msgid "We also may retain server logs which include the IP address of every request to our server." msgstr "" "Wir können auch Serverprotokolle mit den IP-Adressen der Anfragen an unseren " "Server aufbewahren." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:70 +#, elixir-format msgctxt "terms" msgid "We store the following information on your device when you connect:" msgstr "" "Wir speichern auf deines Gerät die folgenden Informationen wann Du einloggst " ":" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:58 +#, elixir-format msgctxt "terms" msgid "We will make a good faith effort to:" msgstr "Wir werden uns nach besten Wissen und Gewissen dazu bemühen:" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:35 +#, elixir-format msgctxt "terms" msgid "What do we use your information for?" msgstr "Für was nutzen wir deine Informationen?" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:57 +#, elixir-format msgctxt "terms" msgid "What is our data retention policy?" msgstr "Was ist unsere Richtlinie zur Datenspeicherung?" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:67 +#, elixir-format msgctxt "terms" msgid "You may irreversibly delete your account at any time." msgstr "Du kannst jederzeit dein Konto löschen." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:115 +#, elixir-format msgctxt "terms" msgid "Changes to our Privacy Policy" msgstr "Änderungen unserer Datenschutzerklärung" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:106 +#, elixir-format msgctxt "terms" msgid "If this server is in the EU or the EEA: Our site, products and services are all directed to people who are at least 16 years old. If you are under the age of 16, per the requirements of the GDPR (General Data Protection Regulation) do not use this site." msgstr "" @@ -288,8 +288,8 @@ msgstr "" "General_Data_Protection_Regulation\">General Data Protection Regulation) " "diese Website nicht nutzen." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:109 +#, elixir-format msgctxt "terms" msgid "If this server is in the USA: Our site, products and services are all directed to people who are at least 13 years old. If you are under the age of 13, per the requirements of COPPA (Children's Online Privacy Protection Act) do not use this site." msgstr "" @@ -300,30 +300,30 @@ msgstr "" "27s_Online_Privacy_Protection_Act\">Children's Online Privacy Protection " "Act) nicht nutzen." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:117 +#, elixir-format msgctxt "terms" msgid "If we decide to change our privacy policy, we will post those changes on this page." msgstr "" "Wenn wir beschließen unsere Datenschutzerklärung zu ändern, werden wir diese " "Änderungen auf dieser Seite veröffentlichen." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:112 +#, elixir-format msgctxt "terms" msgid "Law requirements can be different if this server is in another jurisdiction." msgstr "" "Die gesetzlichen Anforderungen können unterschiedlich sein, wenn sich dieser " "Server in einer anderen Gerichtsbarkeit befindet." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:103 +#, elixir-format msgctxt "terms" msgid "Site usage by children" msgstr "Nutzung der Website durch Kinder" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:47 +#, elixir-format msgctxt "terms" msgid "The email address you provide may be used to send you information, updates and notifications about other people\n interacting with your content or sending you messages and to respond to inquiries, and/or other requests or\n questions." msgstr "" @@ -334,8 +334,8 @@ msgstr "" "Beantwortung von Anfragen, und/oder anderen Bitten oder \n" "Fragen." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:45 +#, elixir-format msgctxt "terms" msgid "To aid moderation of the community, for example comparing your IP address with other known ones to determine ban\n evasion or other violations." msgstr "" @@ -343,8 +343,8 @@ msgstr "" "Ihrer IP-Adresse mit anderen bekannten IP-Adressen, um eine Ban\n" " Umgehung oder andere Verstöße zu ermitteln." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:43 +#, elixir-format msgctxt "terms" msgid "To provide the core functionality of Mobilizon. Depending on this instance's policy you may only be able to\n interact with other people's content and post your own content if you are logged in." msgstr "" @@ -353,89 +353,89 @@ msgstr "" " mit den Inhalten anderer Personen interagieren und eigene Inhalte " "veröffentlichen, wenn Sie eingeloggt sind." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:6 +#, elixir-format msgctxt "terms" msgid "What information do we collect?" msgstr "Welche Informationen sammeln wir ?" -#, elixir-format #: lib/web/email/user.ex:176 +#, elixir-format msgid "Mobilizon on %{instance}: confirm your email address" msgstr "Mobilizon auf %{instance}: Bestätige deine E-Mail Adresse" -#, elixir-format #: lib/web/email/user.ex:152 +#, elixir-format msgid "Mobilizon on %{instance}: email changed" msgstr "Mobilizon auf %{instance}: E-Mail geändert" -#, elixir-format #: lib/web/email/notification.ex:47 +#, elixir-format msgid "One event planned today" msgid_plural "%{nb_events} events planned today" msgstr[0] "Ein Event wurde heute geplannt" msgstr[1] "%{nb_events} wurden heute geplannt" -#, elixir-format #: lib/web/templates/email/on_day_notification.html.eex:38 #: lib/web/templates/email/on_day_notification.text.eex:4 +#, elixir-format msgid "You have one event today:" msgid_plural "You have %{total} events today:" msgstr[0] "Du hast heute ein Event:" msgstr[1] "Du hast heute %{total} Events:" -#, elixir-format #: lib/web/templates/email/group_invite.text.eex:3 +#, elixir-format msgid "%{inviter} just invited you to join their group %{group}" msgstr "%{inviter} hat dich gerade in die Gruppe %{group} eingeladen" -#, elixir-format #: lib/web/templates/email/group_invite.html.eex:13 #: lib/web/templates/email/group_invite.text.eex:1 +#, elixir-format msgid "Come along!" msgstr "Komm rein!" -#, elixir-format #: lib/web/email/notification.ex:24 +#, elixir-format msgid "Don't forget to go to %{title}" msgstr "Vergesse nicht zu %{title} gehen" -#, elixir-format #: lib/web/templates/email/before_event_notification.html.eex:38 #: lib/web/templates/email/before_event_notification.text.eex:3 +#, elixir-format msgid "Get ready for %{title}" msgstr "Mach dich bereit für %{title}" -#, elixir-format #: lib/web/templates/email/group_invite.html.eex:59 +#, elixir-format msgid "See my groups" msgstr "Zeige meine Gruppen" -#, elixir-format #: lib/web/templates/email/group_invite.html.eex:45 #: lib/web/templates/email/group_invite.text.eex:5 +#, elixir-format msgid "To accept this invitation, head over to your groups." msgstr "Um diese Einladung anzunehmen, gehen Sie zu Ihren Gruppen." -#, elixir-format #: lib/web/templates/email/before_event_notification.text.eex:5 +#, elixir-format msgid "View the event on: %{link}" msgstr "Zeige die aktualisierte Veranstaltung unter: %{link}" -#, elixir-format #: lib/web/email/group.ex:33 +#, elixir-format msgid "You have been invited by %{inviter} to join group %{group}" msgstr "Du wurdest von %{inviter} eingeladen, der Gruppe %{group} beizutreten" -#, elixir-format #: lib/web/email/notification.ex:71 +#, elixir-format msgid "One event planned this week" msgid_plural "%{nb_events} events planned this week" msgstr[0] "Ein Event ist für diese Woche geplant" msgstr[1] "%{nb_events} Events sind für diese Woche geplant" -#, elixir-format #: lib/web/email/notification.ex:93 +#, elixir-format msgid "One participation request for event %{title} to process" msgid_plural "%{number_participation_requests} participation requests for event %{title} to process" msgstr[0] "Eine Teilnahmeanfrage für die Veranstaltung %{title} zu bearbeiten" @@ -443,21 +443,21 @@ msgstr[1] "" "%{number_participation_requests} Teilnahmeanfragen für Veranstaltung %{title}" " zu bearbeiten" -#, elixir-format #: lib/web/templates/email/notification_each_week.html.eex:38 #: lib/web/templates/email/notification_each_week.text.eex:3 +#, elixir-format msgid "You have one event this week:" msgid_plural "You have %{total} events this week:" msgstr[0] "Du hast diese Woche eine Veranstaltung:" msgstr[1] "Du hast diese Woche %{total} Veranstaltungen:" -#, elixir-format #: lib/service/metadata/utils.ex:52 +#, elixir-format msgid "The event organizer didn't add any description." msgstr "Der Eventorganisator hat keine Beschreibung hinzugefügt." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:54 +#, elixir-format msgctxt "terms" msgid "We implement a variety of security measures to maintain the safety of your personal information when you enter, submit, or access your personal information. Among other things, your browser session, as well as the traffic between your applications and the API, are secured with SSL/TLS, and your password is hashed using a strong one-way algorithm." msgstr "" @@ -468,8 +468,8 @@ msgstr "" "gesichert, und Ihr Passwort wird mit einem starken Einweg-Algorithmus " "gehasht." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:94 +#, elixir-format msgctxt "terms" msgid "No. We do not sell, trade, or otherwise transfer to outside parties your personally identifiable information. This does not include trusted third parties who assist us in operating our site, conducting our business, or servicing you, so long as those parties agree to keep this information confidential. We may also release your information when we believe release is appropriate to comply with the law, enforce our site policies, or protect ours or others rights, property, or safety." msgstr "" @@ -483,20 +483,20 @@ msgstr "" "einzuhalten, unsere Website-Richtlinien durchzusetzen oder unsere oder die " "Rechte, das Eigentum oder die Sicherheit anderer zu schützen." -#, elixir-format #: lib/web/templates/api/terms.html.eex:23 +#, elixir-format msgctxt "terms" msgid "Accepting these Terms" msgstr "Akzeptiere die AGB/Bedigungen" -#, elixir-format #: lib/web/templates/api/terms.html.eex:27 +#, elixir-format msgctxt "terms" msgid "Changes to these Terms" msgstr "Änderung dieser Bedingungen" -#, elixir-format #: lib/web/templates/api/terms.html.eex:85 +#, elixir-format msgctxt "terms" msgid "A lot of the content on the Service is from you and others, and we don't review, verify or authenticate it, and it may include inaccuracies or false information. We make no representations, warranties, or guarantees relating to the quality, suitability, truth, accuracy or completeness of any content contained in the Service. You acknowledge sole responsibility for and assume all risk arising from your use of or reliance on any content." msgstr "" @@ -509,8 +509,8 @@ msgstr "" "gesamte Risiko an, das sich aus Ihrer Nutzung von oder Ihrem Vertrauen auf " "Inhalte ergibt." -#, elixir-format #: lib/web/templates/api/terms.html.eex:60 +#, elixir-format msgctxt "terms" msgid "Also, you agree that you will not do any of the following in connection with the Service or other users:" msgstr "" @@ -518,8 +518,8 @@ msgstr "" "Handlungen in Verbindung mit dem Dienst oder anderen Benutzern vornehmen " "werden:" -#, elixir-format #: lib/web/templates/api/terms.html.eex:65 +#, elixir-format msgctxt "terms" msgid "Circumvent or attempt to circumvent any filtering, security measures, rate limits or other features designed to protect the Service, users of the Service, or third parties." msgstr "" @@ -527,8 +527,8 @@ msgstr "" "Ratenbegrenzungen oder anderen Funktionen, die zum Schutz des Dienstes, der " "Benutzer des Dienstes oder Dritter vorgesehen sind." -#, elixir-format #: lib/web/templates/api/terms.html.eex:64 +#, elixir-format msgctxt "terms" msgid "Collect any personal information about other users, or intimidate, threaten, stalk or otherwise harass other users of the Service;" msgstr "" @@ -536,16 +536,16 @@ msgstr "" "Benutzer des Dienstes einzuschüchtern, zu bedrohen, zu belästigen oder " "anderweitig zu schikanieren;" -#, elixir-format #: lib/web/templates/api/terms.html.eex:55 +#, elixir-format msgctxt "terms" msgid "Content that is illegal or unlawful, that would otherwise create liability;" msgstr "" "Inhalte, die illegal oder ungesetzlich sind, die sonst eine Haftung " "begründen würden;" -#, elixir-format #: lib/web/templates/api/terms.html.eex:56 +#, elixir-format msgctxt "terms" msgid "Content that may infringe or violate any patent, trademark, trade secret, copyright, right of privacy, right of publicity or other intellectual or other right of any party;" msgstr "" @@ -554,40 +554,40 @@ msgstr "" "ein sonstiges geistiges oder sonstiges Recht einer Partei verletzen oder " "beeinträchtigen können;" -#, elixir-format #: lib/web/templates/api/terms.html.eex:42 +#, elixir-format msgctxt "terms" msgid "Creating Accounts" msgstr "Account erstellen" -#, elixir-format #: lib/web/templates/api/terms.html.eex:89 +#, elixir-format msgctxt "terms" msgid "Entire Agreement" msgstr "Gesamte Vereinbarung" -#, elixir-format #: lib/web/templates/api/terms.html.eex:92 +#, elixir-format msgctxt "terms" msgid "Feedback" msgstr "Rückmeldung" -#, elixir-format #: lib/web/templates/api/terms.html.eex:83 +#, elixir-format msgctxt "terms" msgid "Hyperlinks and Third Party Content" msgstr "Hyperlinks und Inhalte von Drittanbietern" -#, elixir-format #: lib/web/templates/api/terms.html.eex:88 +#, elixir-format msgctxt "terms" msgid "If you breach any of these Terms, we have the right to suspend or disable your access to or use of the Service." msgstr "" "Wenn Sie gegen eine dieser Bedingungen verstoßen, haben wir das Recht, Ihren " "Zugang zu oder Ihre Nutzung des Dienstes auszusetzen oder zu sperren." -#, elixir-format #: lib/web/templates/api/terms.html.eex:63 +#, elixir-format msgctxt "terms" msgid "Impersonate or post on behalf of any person or entity or otherwise misrepresent your affiliation with a person or entity;" msgstr "" @@ -595,8 +595,8 @@ msgstr "" "einer solchen zu posten oder anderweitig Ihre Zugehörigkeit zu einer " "natürlichen oder juristischen Person falsch darzustellen;" -#, elixir-format #: lib/web/templates/api/terms.html.eex:48 +#, elixir-format msgctxt "terms" msgid "Our Service allows you and other users to post, link and otherwise make available content. You are responsible for the content that you make available to the Service, including its legality, reliability, and appropriateness." msgstr "" @@ -605,26 +605,26 @@ msgstr "" "Inhalte verantwortlich, die Sie dem Dienst zur Verfügung stellen, " "einschließlich ihrer Rechtmäßigkeit, Zuverlässigkeit und Angemessenheit." -#, elixir-format #: lib/web/templates/api/terms.html.eex:39 +#, elixir-format msgctxt "terms" msgid "Privacy Policy" msgstr "Datenschutzerklärung" -#, elixir-format #: lib/web/templates/api/terms.html.eex:95 +#, elixir-format msgctxt "terms" msgid "Questions & Contact Information" msgstr "Fragen & Kontaktinformationen" -#, elixir-format #: lib/web/templates/api/terms.html.eex:87 +#, elixir-format msgctxt "terms" msgid "Termination" msgstr "Dauer" -#, elixir-format #: lib/web/templates/api/terms.html.eex:62 +#, elixir-format msgctxt "terms" msgid "Use the Service in any manner that could interfere with, disrupt, negatively affect or inhibit other users from fully enjoying the Service or that could damage, disable, overburden or impair the functioning of the Service;" msgstr "" @@ -633,14 +633,14 @@ msgstr "" "vollem Umfang zu genießen. Oder die Funktion des Dienstes beschädigen, " "deaktivieren, überlasten oder beeinträchtigen könnte;" -#, elixir-format #: lib/web/templates/api/terms.html.eex:47 +#, elixir-format msgctxt "terms" msgid "Your Content & Conduct" msgstr "Ihr Inhalt & Verhalten" -#, elixir-format #: lib/web/templates/api/terms.html.eex:84 +#, elixir-format msgctxt "terms" msgid "%{instance_name} makes no claim or representation regarding, and accepts no responsibility for third party websites accessible by hyperlink from the Service or websites linking to the Service. When you leave the Service, you should be aware that these Terms and our policies no longer govern. The inclusion of any link does not imply endorsement by %{instance_name} of the site. Use of any such linked website is at the user's own risk." msgstr "" @@ -653,8 +653,8 @@ msgstr "" "Die Nutzung einer solchen verlinkten Website erfolgt auf eigenes Risiko des " "Nutzers." -#, elixir-format #: lib/web/templates/api/terms.html.eex:68 +#, elixir-format msgctxt "terms" msgid "Finally, your use of the Service is also subject to acceptance of the instance's own specific rules regarding the code of conduct and moderation rules. Breaking those rules may also result in your account being disabled or suspended." msgstr "" @@ -663,16 +663,16 @@ msgstr "" "und der Moderationsregeln. Ein Verstoß gegen diese Regeln kann auch dazu " "führen, dass Ihr Konto deaktiviert oder gesperrt wird." -#, elixir-format #: lib/web/templates/api/terms.html.eex:81 +#, elixir-format msgctxt "terms" msgid "For full details about the Mobilizon software see here." msgstr "" "Für vollständige Informationen zur Mobilizion Software hier klicken." -#, elixir-format #: lib/web/templates/api/terms.html.eex:18 +#, elixir-format msgctxt "terms" msgid "Here are the important things you need to know about accessing and using the %{instance_name} (%{instance_url}) website and service (collectively, \"Service\"). These are our terms of service (\"Terms\"). Please read them carefully." msgstr "" @@ -682,8 +682,8 @@ msgstr "" "wissen müssen. Dies sind unsere Servicebedingungen (\"Bedingungen\"). Bitte " "lesen Sie sie sorgfältig durch." -#, elixir-format #: lib/web/templates/api/terms.html.eex:33 +#, elixir-format msgctxt "terms" msgid "If we make major changes, we will notify our users in a clear and prominent manner. Minor changes may only be highlighted in the footer of our website. It is your responsibility to check the website regularly for changes to these Terms." msgstr "" @@ -693,8 +693,8 @@ msgstr "" "in Ihrer Verantwortung, die Website regelmäßig auf Änderungen an diesen " "Bedingungen zu überprüfen." -#, elixir-format #: lib/web/templates/api/terms.html.eex:53 +#, elixir-format msgctxt "terms" msgid "In order to make %{instance_name} a great place for all of us, please do not post, link and otherwise make available on or through the Service any of the following:" msgstr "" @@ -702,16 +702,16 @@ msgstr "" "bitten wir Sie, Folgendes nicht zu posten, zu verlinken oder anderweitig auf " "oder durch den Dienst verfügbar zu machen:" -#, elixir-format #: lib/web/templates/api/terms.html.eex:57 +#, elixir-format msgctxt "terms" msgid "Private information of any third party (e.g., addresses, phone numbers, email addresses, Social Security numbers and credit card numbers); and" msgstr "" "Private Informationen von Dritten (z. B. Adressen, Telefonnummern, E-Mail-" "Adressen, Sozialversicherungsnummern und Kreditkartennummern); und" -#, elixir-format #: lib/web/templates/api/terms.html.eex:52 +#, elixir-format msgctxt "terms" msgid "Since Mobilizon is a distributed network, it is possible, depending on the visibility rules set to your content, that your content has been distributed to other Mobilizon instances. When you delete your content, we will request those other instances to also delete the content. Our responsibility on the content being deleted from those other instances ends here. If for some reason, some other instance does not delete the content, we cannot be held responsible." msgstr "" @@ -724,8 +724,8 @@ msgstr "" "Instanz den Inhalt nicht löscht, können wir nicht verantwortlich gemacht " "werden." -#, elixir-format #: lib/web/templates/api/terms.html.eex:90 +#, elixir-format msgctxt "terms" msgid "These Terms constitute the entire agreement between you and %{instance_name} regarding the use of the Service, superseding any prior agreements between you and %{instance_name} relating to your use of the Service." msgstr "" @@ -734,8 +734,8 @@ msgstr "" "alle früheren Vereinbarungen zwischen Ihnen und %{instance_name} in " "Bezug auf Ihre Nutzung des Dienstes." -#, elixir-format #: lib/web/templates/api/terms.html.eex:80 +#, elixir-format msgctxt "terms" msgid "This Service runs on a Mobilizon instance. This source code is licensed under an AGPLv3 license which means you are allowed to and even encouraged to take the source code, modify it and use it." msgstr "" @@ -745,16 +745,16 @@ msgstr "" "den Quellcode übernehmen, verändern und verwenden dürfen und sogar dazu " "aufgefordert werden." -#, elixir-format #: lib/web/templates/api/terms.html.eex:58 +#, elixir-format msgctxt "terms" msgid "Viruses, corrupted data or other harmful, disruptive or destructive files or code." msgstr "" "Viren, korrumpierte Daten oder andere schädliche, störende oder " "zerstörerische Dateien oder Codes." -#, elixir-format #: lib/web/templates/api/terms.html.eex:51 +#, elixir-format msgctxt "terms" msgid "You can remove the content that you posted by deleting it. Once you delete your content, it will not appear on the Service, but copies of your deleted content may remain in our system or backups for some period of time. Web server access logs might also be stored for some time in the system." msgstr "" @@ -764,30 +764,30 @@ msgstr "" "oder in Backups verbleiben. Webserver-Zugriffsprotokolle können ebenfalls " "für einige Zeit im System gespeichert werden." -#, elixir-format #: lib/web/templates/api/terms.html.eex:96 +#, elixir-format msgctxt "terms" msgid "Questions or comments about the Service may be directed to us at %{contact}" msgstr "" "Fragen oder Kommentare zum Dienst können an uns gerichtet werden unter " "%{contact}" -#, elixir-format #: lib/web/templates/api/terms.html.eex:79 +#, elixir-format msgctxt "terms" msgid "Source code" msgstr "Quellcode" -#, elixir-format #: lib/web/templates/api/terms.html.eex:93 +#, elixir-format msgctxt "terms" msgid "We love feedback. Please let us know what you think of the Service, these Terms and, in general, %{instance_name}." msgstr "" "Wir lieben Feedback. Bitte lass uns wissen, was du von unserem Dienst und " "den Bedigungen hälst %{instance_name}." -#, elixir-format #: lib/web/templates/api/terms.html.eex:74 +#, elixir-format msgctxt "terms" msgid "Instance administrators (and community moderators, given the relevant access) are responsible for monitoring and acting on flagged content and other user reports, and have the right and responsibility to remove or edit content that is not aligned to this Instance set of rules, or to suspend, block or ban (temporarily or permanently) any account, community, or instance for breaking these terms, or for other behaviours that they deem inappropriate, threatening, offensive, or harmful." msgstr "" @@ -801,16 +801,16 @@ msgstr "" "verstoßen oder ein anderes Verhalten zeigen, das sie für unangemessen, " "bedrohlich, beleidigend oder schädlich halten." -#, elixir-format #: lib/web/templates/api/terms.html.eex:6 +#, elixir-format msgctxt "terms" msgid "%{instance_name} will not use or transmit or resell your personal data" msgstr "" "%{instance_name} wird Ihre persönlichen Daten weder nutzen noch " "weitergeben oder weiterverkaufen" -#, elixir-format #: lib/web/templates/api/terms.html.eex:44 +#, elixir-format msgctxt "terms" msgid "If you discover or suspect any Service security breaches, please let us know as soon as possible. For security holes in the Mobilizon software itself, please contact its contributors directly." msgstr "" @@ -819,8 +819,8 @@ msgstr "" "Software selbst, wenden Sie sich bitte direkt an die Mitwirkenden." -#, elixir-format #: lib/web/templates/api/terms.html.eex:77 +#, elixir-format msgctxt "terms" msgid "Instance administrators should ensure that every community hosted on the instance is properly moderated according to the defined rules." msgstr "" @@ -828,8 +828,8 @@ msgstr "" "der Instanz gehostet wird, ordnungsgemäß nach den definierten Regeln " "moderiert wird." -#, elixir-format #: lib/web/templates/api/terms.html.eex:98 +#, elixir-format msgctxt "terms" msgid "Originally adapted from the Diaspora* and App.net privacy policies, also licensed under CC BY-SA." msgstr "" @@ -838,8 +838,8 @@ msgstr "" ">App.net Datenschutzrichtlinien, ebenfalls lizenziert unter CC BY-SA." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:119 +#, elixir-format msgctxt "terms" msgid "Originally adapted from the Mastodon and Discourse privacy policies, also licensed under CC BY-SA." msgstr "" @@ -848,22 +848,22 @@ msgstr "" ">Discourse Datenschutzrichtlinien, ebenfalls lizenziert unter CC BY-SA." -#, elixir-format #: lib/web/templates/api/terms.html.eex:3 +#, elixir-format msgctxt "terms" msgid "Short version" msgstr "Kurzfassung" -#, elixir-format #: lib/web/templates/api/terms.html.eex:9 +#, elixir-format msgctxt "terms" msgid "The service is provided without warranties and these terms may change in the future" msgstr "" "Der Dienst wird ohne Garantien bereitgestellt und diese Bedingungen können " "sich in Zukunft ändern" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:118 +#, elixir-format msgctxt "terms" msgid "This document is licensed under CC BY-SA. It was last updated June 18, 2020." msgstr "" @@ -871,8 +871,8 @@ msgstr "" "licenses/by-sa/4.0/\">CC BY-SA. Es wurde zuletzt am 18. Juni 2020 " "aktualisiert." -#, elixir-format #: lib/web/templates/api/terms.html.eex:97 +#, elixir-format msgctxt "terms" msgid "This document is licensed under CC BY-SA. It was last updated June 22, 2020." msgstr "" @@ -880,88 +880,88 @@ msgstr "" "licenses/by-sa/4.0/\">CC BY-SA. Es wurde zuletzt am 22. Juni 2020 " "aktualisiert." -#, elixir-format #: lib/web/templates/api/terms.html.eex:8 +#, elixir-format msgctxt "terms" msgid "You must respect other people and %{instance_name}'s rules when using the service" msgstr "" "Sie müssen andere Personen und die Regeln von %{instance_name} " "respektieren, wenn Sie den Dienst nutzen" -#, elixir-format #: lib/web/templates/api/terms.html.eex:7 +#, elixir-format msgctxt "terms" msgid "You must respect the law when using %{instance_name}" msgstr "" "Sie müssen das Gesetz respektieren, wenn Sie %{instance_name} " "verwenden" -#, elixir-format #: lib/web/templates/api/terms.html.eex:5 +#, elixir-format msgctxt "terms" msgid "Your content is yours" msgstr "Ihr Inhalt gehört Ihnen" -#, elixir-format #: lib/web/templates/email/anonymous_participation_confirmation.html.eex:51 +#, elixir-format msgid "Confirm my e-mail address" msgstr "Bestätigen Sie meine E-Mail Adresse" -#, elixir-format #: lib/web/templates/email/anonymous_participation_confirmation.html.eex:13 #: lib/web/templates/email/anonymous_participation_confirmation.text.eex:1 +#, elixir-format msgid "Confirm your e-mail" msgstr "Bestätigen Sie Ihre E-Mail Adresse" -#, elixir-format #: lib/web/templates/email/anonymous_participation_confirmation.text.eex:3 +#, elixir-format msgid "Hi there! You just registered to join this event: « %{title} ». Please confirm the e-mail address you provided:" msgstr "" "Hallo zusammen! Sie haben sich soeben für die Teilnahme an dieser " "Veranstaltung registriert: \" %{title} ». Bitte bestätigen Sie die von Ihnen " "angegebene E-Mail Adresse:" -#, elixir-format #: lib/web/templates/email/email.html.eex:114 #: lib/web/templates/email/email.text.eex:8 +#, elixir-format msgid "Need help? Is something not working as expected?" msgstr "Brauchst Du Hilfe? Funktioniert etwas nicht richtig?" -#, elixir-format #: lib/web/templates/email/registration_confirmation.html.eex:38 +#, elixir-format msgid "You created an account on %{host} with this email address. You are one click away from activating it." msgstr "" "Du hast einen Account auf %{host} mit dieser E-Mail-Adresse. Du bist " "nur ein Klick von der Aktivierung entfernt." -#, elixir-format #: lib/web/templates/email/report.html.eex:13 +#, elixir-format msgid "New report on %{instance}" msgstr "Neue Meldung auf %{instance}" -#, elixir-format #: lib/web/templates/email/email_changed_old.html.eex:38 +#, elixir-format msgid "The email address for your account on %{host} is being changed to:" msgstr "Die E-Mail-Adresse für Ihr Konto auf %{host} wird geändert in:" -#, elixir-format #: lib/web/templates/email/password_reset.html.eex:38 +#, elixir-format msgid "You requested a new password for your account on %{instance}." msgstr "" "Du hast ein neues Passwort für deinen Account auf %{instance} " "angefragt." -#, elixir-format #: lib/web/templates/email/email.text.eex:5 +#, elixir-format msgid "Please do not use it for real purposes." msgstr "Bitte verwenden Sie es nicht für reale Zwecke." -#, elixir-format #: lib/web/templates/email/anonymous_participation_confirmation.html.eex:63 #: lib/web/templates/email/anonymous_participation_confirmation.text.eex:6 lib/web/templates/email/event_updated.html.eex:133 #: lib/web/templates/email/event_updated.text.eex:24 lib/web/templates/email/notification_each_week.html.eex:70 #: lib/web/templates/email/notification_each_week.text.eex:11 lib/web/templates/email/on_day_notification.html.eex:70 #: lib/web/templates/email/on_day_notification.text.eex:14 +#, elixir-format msgid "Would you wish to cancel your attendance, visit the event page through the link above and click the « Attending » button." msgid_plural "Would you wish to cancel your attendance to one or several events, visit the event pages through the links above and click the « Attending » button." msgstr[0] "" @@ -972,74 +972,74 @@ msgstr[1] "" "gehe einfach über obenstehenden Link auf die Veranstaltungs-Seite und klicke " "auf den Teilnahme-Button." -#, elixir-format #: lib/web/templates/email/pending_participation_notification.html.eex:38 #: lib/web/templates/email/pending_participation_notification.text.eex:4 +#, elixir-format msgid "You have one pending attendance request to process:" msgid_plural "You have %{number_participation_requests} attendance requests to process:" msgstr[0] "Sie haben eine ausstehende Anwesenheitsanforderung zu bearbeiten:" msgstr[1] "Sie haben %{Anzahl_Teilnahmeanträge} Teilnahmeanträge zu bearbeiten:" -#, elixir-format #: lib/web/templates/email/email.text.eex:11 +#, elixir-format msgid "%{instance} is powered by Mobilizon." msgstr "%{instance} ist ein Mobilizon-Server." -#, elixir-format #: lib/web/templates/email/email.html.eex:142 +#, elixir-format msgid "%{instance} is powered by Mobilizon." msgstr "%{instance} ist ein Mobilizon-Server." -#, elixir-format #: lib/web/templates/email/pending_participation_notification.html.eex:13 #: lib/web/templates/email/pending_participation_notification.text.eex:1 +#, elixir-format msgid "A request is pending!" msgstr "Es liegt eine Anfrage vor!" -#, elixir-format #: lib/web/templates/email/before_event_notification.html.eex:13 #: lib/web/templates/email/before_event_notification.text.eex:1 +#, elixir-format msgid "An event is upcoming!" msgstr "Eine Veranstaltung steht an!" -#, elixir-format #: lib/web/templates/email/email_changed_new.html.eex:13 #: lib/web/templates/email/email_changed_new.text.eex:1 +#, elixir-format msgid "Confirm new email" msgstr "Neue E-Mail bestätigen" -#, elixir-format #: lib/web/templates/email/event_updated.html.eex:84 +#, elixir-format msgid "End" msgstr "Ende" -#, elixir-format #: lib/web/templates/email/event_updated.text.eex:21 +#, elixir-format msgid "End %{ends_on}" msgstr "Ende %{ends_on}" -#, elixir-format #: lib/web/templates/email/event_updated.html.eex:13 #: lib/web/templates/email/event_updated.text.eex:1 +#, elixir-format msgid "Event update!" msgstr "Veranstaltung aktualisiert!" -#, elixir-format #: lib/web/templates/email/report.html.eex:88 +#, elixir-format msgid "Flagged comments" msgstr "Markierte Kommentare" -#, elixir-format #: lib/web/templates/email/event_participation_approved.html.eex:45 #: lib/web/templates/email/event_participation_approved.text.eex:7 +#, elixir-format msgid "Good news: one of the event organizers just approved your request. Update your calendar, because you're on the guest list now!" msgstr "" "Gute Nachrichten: Einer der Organisatoren hat gerade Ihre Anfrage genehmigt. " "Aktualisieren Sie Ihren Kalender, denn Sie stehen jetzt auf der Gästeliste!" -#, elixir-format #: lib/web/templates/email/email_changed_new.html.eex:38 #: lib/web/templates/email/email_changed_new.text.eex:3 +#, elixir-format msgid "Hi there! It seems like you wanted to change the email address linked to your account on %{instance}. If you still wish to do so, please click the button below to confirm the change. You will then be able to log in to %{instance} with this new email address." msgstr "" "Hallo zusammen! Es scheint, dass Sie die mit Ihrem Konto verknüpfte E-Mail-" @@ -1048,16 +1048,16 @@ msgstr "" "bestätigen. Sie können sich dann mit dieser neuen E-Mail-Adresse bei " "%{instance} anmelden." -#, elixir-format #: lib/web/templates/email/email_changed_old.text.eex:3 +#, elixir-format msgid "Hi there! Just a quick note to confirm that the email address linked to your account on %{host} has been changed from this one to:" msgstr "" "Hallo zusammen! Nur eine kurze Notiz, um zu bestätigen, dass die mit Ihrem " "Konto auf %{host} verknüpfte E-Mail-Adresse von dieser zu geändert wurde:" -#, elixir-format #: lib/web/templates/email/email_changed_old.html.eex:41 #: lib/web/templates/email/email_changed_old.html.eex:65 lib/web/templates/email/email_changed_old.text.eex:5 +#, elixir-format msgid "If you did not trigger this change yourself, it is likely that someone has gained access to your %{host} account. Please log in and change your password immediately. If you cannot login, contact the admin on %{host}." msgstr "" "Wenn Sie diese Änderung nicht selbst ausgelöst haben, ist es wahrscheinlich, " @@ -1065,180 +1065,180 @@ msgstr "" "Sie sich an und ändern Sie Ihr Passwort sofort. Wenn Sie sich nicht anmelden " "können, wenden Sie sich an den Admin auf %{host}." -#, elixir-format #: lib/web/templates/email/password_reset.text.eex:12 +#, elixir-format msgid "If you didn't trigger the change yourself, please ignore this message. Your password won't be changed until you click the link above." msgstr "" "Wenn Sie die Änderung nicht selbst ausgelöst haben, ignorieren Sie bitte " "diese Meldung. Ihr Passwort wird erst dann geändert, wenn Sie auf den obigen " "Link klicken." -#, elixir-format #: lib/web/templates/email/anonymous_participation_confirmation.html.eex:70 #: lib/web/templates/email/anonymous_participation_confirmation.text.eex:4 lib/web/templates/email/registration_confirmation.html.eex:45 +#, elixir-format msgid "If you didn't trigger this email, you may safely ignore it." msgstr "Wenn Du dies nicht angefragt hast, ignoriere diese E-Mail." -#, elixir-format #: lib/web/templates/email/before_event_notification.html.eex:63 #: lib/web/templates/email/before_event_notification.text.eex:6 +#, elixir-format msgid "If you wish to cancel your attendance, visit the event page through the link above and click the « Attending » button." msgstr "" "Wenn Du deine Teilnahme absagen musst, gehe einfach über obenstehenden Link " "auf die Veranstaltungs-Seite und klicke auf den Teilnahme-Button." -#, elixir-format #: lib/web/templates/email/email.html.eex:143 #: lib/web/templates/email/email.text.eex:11 +#, elixir-format msgid "Learn more about Mobilizon here!" msgstr "Lerne mehr über Mobilizon!" -#, elixir-format #: lib/web/templates/email/event_updated.html.eex:94 +#, elixir-format msgid "Location" msgstr "Ort" -#, elixir-format #: lib/web/templates/email/event_updated.html.eex:104 +#, elixir-format msgid "Location address was removed" msgstr "Adresse wurde entfernt" -#, elixir-format #: lib/web/templates/email/pending_participation_notification.html.eex:51 #: lib/web/templates/email/pending_participation_notification.text.eex:6 +#, elixir-format msgid "Manage pending requests" msgstr "Ausstehende Anfragen verwalten" -#, elixir-format #: lib/web/templates/email/registration_confirmation.html.eex:13 #: lib/web/templates/email/registration_confirmation.text.eex:1 +#, elixir-format msgid "Nearly there!" msgstr "Fast hier!" -#, elixir-format #: lib/web/templates/email/email_changed_old.html.eex:13 #: lib/web/templates/email/email_changed_old.text.eex:1 +#, elixir-format msgid "New email confirmation" msgstr "Neue E-Mail Bestätigung" -#, elixir-format #: lib/web/templates/email/report.html.eex:106 +#, elixir-format msgid "Reasons for report" msgstr "Gründe für Benachrichtigung" -#, elixir-format #: lib/web/templates/email/report.html.eex:39 +#, elixir-format msgid "Someone on %{instance} reported the following content for you to analyze:" msgstr "" "Jemand auf %{instance} hat den folgenden Inhalt gemeldet, den Sie " "analysieren können:" -#, elixir-format #: lib/web/templates/email/event_participation_rejected.html.eex:13 #: lib/web/templates/email/event_participation_rejected.text.eex:1 +#, elixir-format msgid "Sorry! You're not going." msgstr "Schade! Sie sind nicht dabei." -#, elixir-format #: lib/web/templates/email/event_updated.html.eex:74 +#, elixir-format msgid "Start" msgstr "Start" -#, elixir-format #: lib/web/templates/email/event_updated.text.eex:18 +#, elixir-format msgid "Start %{begins_on}" msgstr "Start %{begins_on}" -#, elixir-format #: lib/web/templates/email/event_updated.text.eex:3 +#, elixir-format msgid "There have been changes for %{title} so we'd thought we'd let you know." msgstr "" "Es gibt Änderungen für %{title}. Wir dachten daher, das könnte für Dich " "interessant sein." -#, elixir-format #: lib/web/templates/email/event_updated.html.eex:55 #: lib/web/templates/email/event_updated.text.eex:11 +#, elixir-format msgid "This event has been cancelled by its organizers. Sorry!" msgstr "" "Diese Veranstaltung wurde von den Veranstaltern abgesagt. Entschuldigung!" -#, elixir-format #: lib/web/templates/email/event_updated.html.eex:51 #: lib/web/templates/email/event_updated.text.eex:7 +#, elixir-format msgid "This event has been confirmed" msgstr "Veranstaltung wurde bestätigt" -#, elixir-format #: lib/web/templates/email/event_updated.html.eex:53 #: lib/web/templates/email/event_updated.text.eex:9 +#, elixir-format msgid "This event has yet to be confirmed: organizers will let you know if they do confirm it." msgstr "" "Diese Veranstaltung muss noch bestätigt werden: Die Organisatorinnen werden " "Dich nach der Bestätigung informieren." -#, elixir-format #: lib/web/templates/email/event_participation_rejected.html.eex:45 #: lib/web/templates/email/event_participation_rejected.text.eex:7 +#, elixir-format msgid "Unfortunately, the organizers rejected your request." msgstr "Leider hat der Organisator deine Teilnahme abgelehnt." -#, elixir-format #: lib/web/templates/email/email_changed_new.html.eex:51 +#, elixir-format msgid "Verify your email address" msgstr "Bestätig E-Mail Adresse" -#, elixir-format #: lib/web/templates/email/report.html.eex:126 +#, elixir-format msgid "View report" msgstr "Meldung ansehen" -#, elixir-format #: lib/web/templates/email/report.text.eex:24 +#, elixir-format msgid "View report:" msgstr "Meldung ansehen:" -#, elixir-format #: lib/web/templates/email/event_participation_approved.html.eex:58 #: lib/web/templates/email/event_participation_confirmed.html.eex:58 +#, elixir-format msgid "Visit event page" msgstr "Besuche die Event Seite" -#, elixir-format #: lib/web/templates/email/event_updated.html.eex:121 +#, elixir-format msgid "Visit the updated event page" msgstr "Besuchen Sie die aktualisierte Veranstaltungsseite" -#, elixir-format #: lib/web/templates/email/event_updated.text.eex:23 +#, elixir-format msgid "Visit the updated event page: %{link}" msgstr "Zeige die aktualisierte Veranstaltung unter: %{link}" -#, elixir-format #: lib/web/templates/email/notification_each_week.html.eex:13 #: lib/web/templates/email/notification_each_week.text.eex:1 +#, elixir-format msgid "What's up this week?" msgstr "Was gibt's diese Woche?" -#, elixir-format #: lib/web/templates/email/on_day_notification.html.eex:13 #: lib/web/templates/email/on_day_notification.text.eex:1 +#, elixir-format msgid "What's up today?" msgstr "Was gibt's heute?" -#, elixir-format #: lib/web/templates/email/event_participation_approved.html.eex:70 #: lib/web/templates/email/event_participation_approved.text.eex:11 lib/web/templates/email/event_participation_confirmed.html.eex:70 #: lib/web/templates/email/event_participation_confirmed.text.eex:6 +#, elixir-format msgid "Would you wish to update or cancel your attendance, simply access the event page through the link above and click on the Attending button." msgstr "" "Möchten Sie Ihre Teilnahme aktualisieren oder stornieren, rufen Sie einfach " "die Veranstaltungsseite über den obigen Link auf und klicken Sie auf die " "Schaltfläche \"Teilnehmen\"." -#, elixir-format #: lib/web/templates/email/pending_participation_notification.html.eex:64 #: lib/web/templates/email/pending_participation_notification.text.eex:8 +#, elixir-format msgid "You are receiving this email because you chose to get notifications for pending attendance requests to your events. You can disable or change your notification settings in your user account settings under « Notifications »." msgstr "" "Sie erhalten diese E-Mail, weil Sie sich dafür entschieden haben, " @@ -1247,133 +1247,133 @@ msgstr "" "in den Einstellungen Ihres Benutzerkontos unter \" Benachrichtigungen \" " "deaktivieren oder ändern." -#, elixir-format #: lib/web/templates/email/event_participation_rejected.text.eex:5 +#, elixir-format msgid "You issued a request to attend %{title}." msgstr "Sie haben eine Anfrage zur Teilnahme an %{title} gestellt." -#, elixir-format #: lib/web/templates/email/event_participation_approved.text.eex:5 #: lib/web/templates/email/event_participation_confirmed.text.eex:3 +#, elixir-format msgid "You recently requested to attend %{title}." msgstr "Du hast angefragt, an der Veranstaltung %{title} teilzunehmen." -#, elixir-format #: lib/web/templates/email/event_participation_approved.html.eex:13 #: lib/web/templates/email/event_participation_confirmed.html.eex:13 lib/web/templates/email/event_participation_confirmed.text.eex:1 +#, elixir-format msgid "You're going!" msgstr "Sie sind dabei!" -#, elixir-format #: lib/web/templates/email/email_changed_new.html.eex:64 #: lib/web/templates/email/email_changed_new.text.eex:5 +#, elixir-format msgid "If you didn't trigger the change yourself, please ignore this message." msgstr "" "Wenn Sie die Änderung nicht selbst ausgelöst haben, ignorieren Sie bitte " "diese Meldung." -#, elixir-format #: lib/web/templates/email/email.html.eex:89 +#, elixir-format msgid "Please do not use it for real purposes." msgstr "Bitte verwenden Sie es nicht für reale Zwecke." -#, elixir-format #: lib/web/templates/email/group_member_removal.html.eex:45 #: lib/web/templates/email/group_member_removal.text.eex:5 +#, elixir-format msgid "If you feel this is an error, you may contact the group's administrators so that they can add you back." msgstr "" "Wenn Sie der Meinung sind, dass dies ein Fehler ist, können Sie sich an die " "Administratoren der Gruppe wenden, damit diese Sie wieder hinzufügen können." -#, elixir-format #: lib/web/templates/email/group_member_removal.html.eex:13 #: lib/web/templates/email/group_member_removal.text.eex:1 +#, elixir-format msgid "So long, and thanks for the fish!" msgstr "Macht's gut und danke für den Fisch!" -#, elixir-format #: lib/web/email/group.ex:63 +#, elixir-format msgid "You have been removed from group %{group}" msgstr "Sie wurden aus der Gruppe %{group} entfernt" -#, elixir-format #: lib/web/templates/email/group_member_removal.text.eex:3 +#, elixir-format msgid "You have been removed from group %{group}. You will not be able to access this group's private content anymore." msgstr "" "Du wurdest aus der Gruppe %{group} entfernt. Sie werden nicht mehr auf den " "privaten Inhalt dieser Gruppe zugreifen können." -#, elixir-format #: lib/web/templates/email/group_invite.html.eex:38 +#, elixir-format msgid "%{inviter} just invited you to join their group %{link_start}%{group}%{link_end}" msgstr "" "%{inviter} hat Sie gerade eingeladen, seiner Gruppe beizutreten " "%{link_start}%{group}%{link_end}" -#, elixir-format #: lib/web/templates/email/group_member_removal.html.eex:38 +#, elixir-format msgid "You have been removed from group %{link_start}%{group}%{link_end}. You will not be able to access this group's private content anymore." msgstr "" "Sie wurden aus der Gruppe %{link_start}%{group}%{link_end} entfernt. " "Sie werden nicht mehr auf den privaten Inhalt dieser Gruppe zugreifen können." -#, elixir-format #: lib/web/templates/email/group_suspension.html.eex:54 #: lib/web/templates/email/group_suspension.text.eex:7 +#, elixir-format msgid "As this group was located on another instance, it will continue to work for other instances than this one." msgstr "" "Da sich diese Gruppe auf einer anderen Instanz befand, funktioniert sie auch " "weiterhin für andere Instanzen als diese." -#, elixir-format #: lib/web/templates/email/group_suspension.html.eex:46 #: lib/web/templates/email/group_suspension.text.eex:5 +#, elixir-format msgid "As this group was located on this instance, all of it's data has been irretrievably deleted." msgstr "" "Da sich diese Gruppe auf dieser Instanz befand, wurden alle ihre Daten " "unwiederbringlich gelöscht." -#, elixir-format #: lib/web/templates/email/group_deletion.html.eex:38 #: lib/web/templates/email/group_deletion.text.eex:3 +#, elixir-format msgid "The administrator %{author} deleted group %{group}. All of the group's events, discussions, posts and todos have been deleted." msgstr "" "Der Administrator %{author} hat die Gruppe %{group} gelöscht. Alle " "Ereignisse, Diskussionen, Beiträge und ToDos der Gruppe wurden gelöscht." -#, elixir-format #: lib/web/templates/email/group_suspension.html.eex:13 #: lib/web/templates/email/group_suspension.text.eex:1 +#, elixir-format msgid "The group %{group} has been suspended on %{instance}!" msgstr "Die Gruppe %{group} wurde auf %{instance} suspendiert!" -#, elixir-format #: lib/web/templates/email/group_deletion.html.eex:13 #: lib/web/templates/email/group_deletion.text.eex:1 +#, elixir-format msgid "The group %{group} was deleted on %{instance}!" msgstr "Die Gruppe %{group} wurde auf %{instance} gelöscht!" -#, elixir-format #: lib/web/templates/email/group_suspension.html.eex:38 #: lib/web/templates/email/group_suspension.text.eex:3 +#, elixir-format msgid "Your instance's moderation team has decided to suspend %{group_name} (%{group_address}). You are no longer a member of this group." msgstr "" "Das Moderationsteam Ihrer Instanz hat beschlossen, %{group_name} " "(%{group_address}) zu suspendieren. Sie sind nicht länger ein Mitglied " "dieser Gruppe." -#, elixir-format #: lib/web/email/group.ex:136 +#, elixir-format msgid "The group %{group} has been deleted on %{instance}" msgstr "Die Gruppe %{group} wurde auf %{instance} gelöscht" -#, elixir-format #: lib/web/email/group.ex:97 +#, elixir-format msgid "The group %{group} has been suspended on %{instance}" msgstr "Die Gruppe %{group} wurde auf %{instance} ausgesetzt" -#, elixir-format #: lib/web/templates/api/terms.html.eex:24 +#, elixir-format msgctxt "terms" msgid "By accessing or using the Service, this means you agree to be bound by all the terms below. If these terms are in any way unclear, please let us know by contacting %{contact}." msgstr "" @@ -1382,8 +1382,8 @@ msgstr "" "diese Bedingungen in irgendeiner Weise unklar sein, teilen Sie uns dies " "bitte mit, indem Sie sich an %{contact} wenden." -#, elixir-format #: lib/web/templates/api/terms.html.eex:40 +#, elixir-format msgctxt "terms" msgid "For information about how we collect and use information about users of the Service, please check our privacy policy." msgstr "" @@ -1391,22 +1391,22 @@ msgstr "" "sammeln und verwenden, finden Sie in unserer Datenschutzrichtlinie." -#, elixir-format #: lib/web/templates/api/terms.html.eex:36 +#, elixir-format msgctxt "terms" msgid "If you continue to use the Service after the revised Terms go into effect, you accept the revised Terms." msgstr "" "Wenn Sie den Dienst nach Inkrafttreten der überarbeiteten Bedingungen " "weiterhin nutzen, akzeptieren Sie die überarbeiteten Bedingungen." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:78 +#, elixir-format msgctxt "terms" msgid "If you delete this information, you need to login again." msgstr "Wenn Sie diese Informationen löschen, müssen Sie sich erneut anmelden." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:80 +#, elixir-format msgctxt "terms" msgid "If you're not connected, we don't store any information on your device, unless you participate in an event anonymously. In this specific case we store the hash of an unique identifier for the event and participation status in your browser so that we may display participation status. Deleting this information will only stop displaying participation status in your browser." msgstr "" @@ -1417,31 +1417,31 @@ msgstr "" "Teilnahmestatus anzeigen können. Wenn Sie diese Informationen löschen, wird " "lediglich die Anzeige des Teilnahmestatus in Ihrem Browser beendet." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:87 +#, elixir-format msgctxt "terms" msgid "Note: This information is stored in your localStorage and not your cookies." msgstr "" "Hinweis: Diese Informationen werden in Ihrem lokalem Speicher und nicht in " "Ihren Cookies gespeichert." -#, elixir-format #: lib/web/templates/api/terms.html.eex:71 +#, elixir-format msgctxt "terms" msgid "Our responsibility" msgstr "Unsere Verantwortung" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:61 +#, elixir-format msgctxt "terms" msgid "Retain server logs containing the IP address of all requests to this server, insofar as such logs are kept, no more than 90 days." msgstr "" "Serverprotokolle mit den IP-Adressen aller Anfragen an diesen Server werden " "nach 90 Tagen gelöscht, sofern solche Protokolle geführt werden." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:3 #: lib/web/templates/api/terms.html.eex:15 +#, elixir-format msgctxt "terms" msgid "Some terms, technical or otherwise, used in the text below may cover concepts that are difficult to grasp. We have provided a glossary to help you understand them better." msgstr "" @@ -1450,16 +1450,16 @@ msgstr "" "\"/glossary\">Glossar bereitgestellt, um Ihnen das Verständnis zu " "erleichtern." -#, elixir-format #: lib/web/templates/api/terms.html.eex:45 +#, elixir-format msgctxt "terms" msgid "We are not liable for any loss you may incur as a result of someone else using your email or password, either with or without your knowledge." msgstr "" "Wir haften nicht für Verluste, die Ihnen dadurch entstehen, dass jemand " "anderes Ihre E-Mail oder Ihr Passwort mit oder ohne Ihr Wissen verwendet." -#, elixir-format #: lib/web/templates/api/terms.html.eex:50 +#, elixir-format msgctxt "terms" msgid "We cannot be held responsible should a programming or administrative error make your content visible to a larger audience than intended. Aside from our limited right to your content, you retain all of your rights to the content you post, link and otherwise make available on or through the Service." msgstr "" @@ -1469,8 +1469,8 @@ msgstr "" "Ihren Inhalten behalten Sie alle Rechte an den Inhalten, die Sie im oder " "über den Dienst veröffentlichen, verlinken oder anderweitig verfügbar machen." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:10 +#, elixir-format msgctxt "terms" msgid "We collect information from you when you register on this instance and gather data when you participate in the platform by reading, writing, and interacting with content shared here. If you register on this instance, you will be asked to enter an email address, a password (hashed) and at least an username. Your email address will be verified by an email containing a unique link. Once the link is activated, we know you control that email address. You may also enter additional profile information such as a display name and biography, and upload a profile picture and header image. The username, display name, biography, profile picture and header image are always listed publicly. You may however visit this instance without registering." msgstr "" @@ -1488,8 +1488,8 @@ msgstr "" "Headerbild werden immer öffentlich aufgelistet. Sie können diese " "Instanz jedoch auch ohne Registrierung besuchen." -#, elixir-format #: lib/web/templates/api/terms.html.eex:30 +#, elixir-format msgctxt "terms" msgid "We reserve the right to modify these Terms at any time. For instance, we may need to change these Terms if we come out with a new feature." msgstr "" @@ -1497,8 +1497,8 @@ msgstr "" "Beispiel kann es sein, dass wir diese Bedingungen ändern müssen, wenn wir " "eine neue Funktion einführen." -#, elixir-format #: lib/web/templates/api/terms.html.eex:20 +#, elixir-format msgctxt "terms" msgid "When we say “we”, “our”, or “us” in this document, we are referring to the owners, operators and administrators of this Mobilizon instance. The Mobilizon software is provided by the team of Mobilizon contributors, supported by Framasoft, a French not-for-profit organization advocating for Free/Libre Software. Unless explicitly stated, this Mobilizon instance is an independent service using Mobilizon's source code. You may find more information about this instance on the \"About this instance\" page." msgstr "" @@ -1512,8 +1512,8 @@ msgstr "" "Weitere Informationen über diese Instanz finden Sie auf der Seite \"Über diese Instanz\"." -#, elixir-format #: lib/web/templates/api/terms.html.eex:43 +#, elixir-format msgctxt "terms" msgid "When you create an account you agree to maintain the security and confidentiality of your password and accept all risks of unauthorized access to your account data and any other information you provide to %{instance_name}." msgstr "" @@ -1523,8 +1523,8 @@ msgstr "" "alle anderen Informationen, die Sie %{instance_name} zur Verfügung " "stellen." -#, elixir-format #: lib/web/templates/api/terms.html.eex:49 +#, elixir-format msgctxt "terms" msgid "When you post, link or otherwise make available content to the Service, you grant us the right and license to display and distribute your content on or through the Service (including via applications). We may format your content for display throughout the Service, but we will not edit or revise the substance of your content itself. The displaying and distribution of your content happens only according to the visibility rules you have set for the content. We will not modify the visibility of the content you have set." msgstr "" @@ -1538,8 +1538,8 @@ msgstr "" "werden die Sichtbarkeit der Inhalte, die Sie eingestellt haben, nicht " "verändern." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:19 +#, elixir-format msgctxt "terms" msgid "Your events and comments are delivered to other instances that follow your own, meaning they are delivered to different instances and copies are stored there. When you delete events or comments, this is likewise delivered to these other instances. All interactions related to event features - such as joining an event - or group features - such as managing resources - are federated as well. Please keep in mind that the operators of the instance and any receiving instances may view such messages and information, and that recipients may screenshot, copy or otherwise re-share them." msgstr "" @@ -1554,8 +1554,8 @@ msgstr "" "solche Nachrichten und Informationen sehen können und dass die Empfänger " "Screenshots machen, sie kopieren oder anderweitig weitergeben können." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:99 +#, elixir-format msgctxt "terms" msgid "Your content may be downloaded by other instances in the network. Your public events and comments are delivered to the instances following your own instance. Content created through a group is forwarded to all the instances of all the members of the group, insofar as these members reside on a different instance than this one." msgstr "" @@ -1566,200 +1566,206 @@ msgstr "" "weitergeleitet, sofern sich diese Mitglieder auf einer anderen Instanz als " "dieser befinden." -#, elixir-format #: lib/web/templates/email/event_participation_confirmed.text.eex:4 +#, elixir-format msgid "You have confirmed your participation. Update your calendar, because you're on the guest list now!" msgstr "" "Sie haben Ihre Teilnahme bestätigt. Aktualisieren Sie Ihren Kalender, denn " "Sie stehen jetzt auf der Gästeliste!" -#, elixir-format #: lib/web/templates/email/event_participation_approved.html.eex:38 #: lib/web/templates/email/event_participation_confirmed.html.eex:38 +#, elixir-format msgid "You recently requested to attend %{title}." msgstr "Du hast angefragt, an der Veranstaltung %{title} teilzunehmen." -#, elixir-format #: lib/web/email/participation.ex:91 +#, elixir-format msgid "Your participation to event %{title} has been confirmed" msgstr "Deine Teilnahme an der Veranstaltung %{title}wurde akzeptiert" -#, elixir-format #: lib/web/templates/email/report.html.eex:41 +#, elixir-format msgid "%{reporter} reported the following content." msgstr "%{reporter} hat den folgenden Inhalt gemeldet." -#, elixir-format #: lib/web/templates/email/report.text.eex:5 +#, elixir-format msgid "Group %{group} was reported" msgstr "Gruppe %{group} wurde gemeldet" -#, elixir-format #: lib/web/templates/email/report.html.eex:51 +#, elixir-format msgid "Group reported" msgstr "Gruppe wurde gemeldet" -#, elixir-format #: lib/web/templates/email/report.text.eex:7 +#, elixir-format msgid "Profile %{profile} was reported" msgstr "Profil %{profile} wurde gemeldet" -#, elixir-format #: lib/web/templates/email/report.html.eex:56 +#, elixir-format msgid "Profile reported" msgstr "Profil gemeldet" -#, elixir-format #: lib/web/templates/email/event_participation_confirmed.html.eex:45 +#, elixir-format msgid "You have now confirmed your participation. Update your calendar, because you're on the guest list now!" msgstr "" "Sie haben nun Ihre Teilnahme bestätigt. Aktualisieren Sie Ihren Kalender, " "denn Sie stehen jetzt auf der Gästeliste!" -#, elixir-format #: lib/mobilizon/posts/post.ex:94 +#, elixir-format msgid "A text is required for the post" msgstr "Für die Stelle wird ein Text benötigt" -#, elixir-format #: lib/mobilizon/posts/post.ex:93 +#, elixir-format msgid "A title is required for the post" msgstr "Für die Stelle wird ein Titel benötigt" -#, elixir-format #: lib/web/templates/email/instance_follow.text.eex:3 +#, elixir-format msgid "%{name} (%{domain}) just requested to follow your instance." msgstr "%{name} (%{domain}) hat soeben angefordert, Ihrer Instanz zu folgen." -#, elixir-format #: lib/web/email/follow.ex:54 +#, elixir-format msgid "%{name} requests to follow your instance" msgstr "%{name} bittet darum, Ihrer Instanz zu folgen" -#, elixir-format #: lib/web/templates/email/instance_follow.html.eex:38 +#, elixir-format msgid "%{name} (%{domain}) just requested to follow your instance. If you accept, this instance will receive all of your instance's public events." msgstr "" "%{name} (%{domain}) hat gerade angefordert, Ihrer Instanz zu folgen. " "Wenn Sie akzeptieren, erhält diese Instanz alle öffentlichen Ereignisse " "Ihrer Instanz." -#, elixir-format #: lib/web/templates/email/instance_follow.text.eex:4 +#, elixir-format msgid "If you accept, this instance will receive all of your public events." msgstr "" "Wenn Sie akzeptieren, erhält diese Instanz alle Ihre öffentlichen Ereignisse." -#, elixir-format #: lib/web/email/follow.ex:48 +#, elixir-format msgid "Instance %{name} (%{domain}) requests to follow your instance" msgstr "Instanz %{name} (%{domain}) bittet darum, Ihrer Instanz zu folgen" -#, elixir-format #: lib/web/templates/email/instance_follow.html.eex:66 +#, elixir-format msgid "See the federation settings" msgstr "Siehe in den Einstellungen für die Föderation" -#, elixir-format #: lib/web/templates/email/instance_follow.html.eex:52 #: lib/web/templates/email/instance_follow.text.eex:6 +#, elixir-format msgid "To accept this invitation, head over to the instance's admin settings." msgstr "" "Um diese Einladung anzunehmen, gehen Sie zu den Admin-Einstellungen der " "Instanz." -#, elixir-format #: lib/web/templates/email/instance_follow.html.eex:13 #: lib/web/templates/email/instance_follow.text.eex:1 +#, elixir-format msgid "Want to connect?" msgstr "Sie wollen sich verbinden?" -#, elixir-format #: lib/web/templates/email/instance_follow.html.eex:45 #: lib/web/templates/email/instance_follow.text.eex:5 +#, elixir-format msgid "Note: %{name} (%{domain}) following you doesn't necessarily imply that you follow this instance, but you can ask to follow them too." msgstr "" "Hinweis: Wenn %{name} (%{domain}) Ihnen folgt, bedeutet das nicht unbedingt, " "dass Sie dieser Instanz folgen, aber Sie können darum bitten, ihnen " "ebenfalls zu folgen." -#, elixir-format #: lib/web/templates/email/anonymous_participation_confirmation.html.eex:38 +#, elixir-format msgid "Hi there! You just registered to join this event: « %{title} ». Please confirm the e-mail address you provided:" msgstr "" "Hallo zusammen! Sie haben sich soeben für die Teilnahme an dieser " "Veranstaltung registriert: \" %{title} \". Bitte bestätigen Sie die " "von Ihnen angegebene E-Mail Adresse:" -#, elixir-format #: lib/web/templates/email/event_participation_rejected.html.eex:38 +#, elixir-format msgid "You issued a request to attend %{title}." msgstr "Sie haben eine Anfrage zur Teilnahme an %{title} gestellt." -#, elixir-format #: lib/web/templates/email/event_updated.html.eex:64 +#, elixir-format msgid "Event title" msgstr "Veranstaltung" -#, elixir-format #: lib/web/templates/email/event_updated.html.eex:38 +#, elixir-format msgid "There have been changes for %{title} so we'd thought we'd let you know." msgstr "" "Es gibt Änderungen für %{title}, also dachten wir, das ist für Dich " "interessant." -#, elixir-format #: lib/web/templates/error/500_page.html.eex:7 +#, elixir-format msgid "This page is not correct" msgstr "Diese Seite ist nicht korrekt" -#, elixir-format #: lib/web/templates/error/500_page.html.eex:50 +#, elixir-format msgid "We're sorry, but something went wrong on our end." msgstr "Es tut uns leid, aber auf unserer Seite ist etwas schief gelaufen." -#, elixir-format #: lib/web/templates/email/email.html.eex:88 #: lib/web/templates/email/email.text.eex:4 +#, elixir-format msgid "This is a demonstration site to test Mobilizon." msgstr "Dies ist eine Demo-Seite, um die Beta-Version von Mobilizon zu testen." -#, elixir-format #: lib/service/metadata/actor.ex:53 lib/service/metadata/actor.ex:60 +#, elixir-format msgid "%{name}'s feed" msgstr "Feed von %{name}" -#, elixir-format #: lib/service/export/feed.ex:77 +#, elixir-format msgid "%{actor}'s private events feed on %{instance}" msgstr "Privater Veranstaltungsfeed von %{actor} auf %{instance}" -#, elixir-format #: lib/service/export/feed.ex:72 +#, elixir-format msgid "%{actor}'s public events feed on %{instance}" msgstr "Öffentlicher Veranstaltungsfeed von %{actor} auf %{instance}" -#, elixir-format #: lib/service/export/feed.ex:203 +#, elixir-format msgid "Feed for %{email} on %{instance}" msgstr "Feed für %{email} auf %{instance}" -#, elixir-format #: lib/web/templates/error/500_page.html.eex:57 +#, elixir-format msgid "If the issue persists, you may contact the server administrator at %{contact}." msgstr "" +"Falls das Problem bestehen bleibt, kontaktieren Sie den/die " +"Server-Administrator/in unter %{contact}." -#, elixir-format #: lib/web/templates/error/500_page.html.eex:55 +#, elixir-format msgid "If the issue persists, you may try to contact the server administrator." msgstr "" +"Falls das Problem bestehen bleibt, versuchen Sie den/die " +"Server-Administrator/in zu kontaktieren." -#, elixir-format #: lib/web/templates/error/500_page.html.eex:68 -msgid "Technical details" -msgstr "" - #, elixir-format +msgid "Technical details" +msgstr "Technische Details" + #: lib/web/templates/error/500_page.html.eex:52 +#, elixir-format msgid "The Mobilizon server %{instance} seems to be temporarily down." -msgstr "Der Mobilizon-Server scheint vorübergehend nicht erreichbar zu sein." +msgstr "" +"Der Mobilizon-Server %{instance} scheint vorübergehend nicht erreichbar zu " +"sein." From 301bdb815bad3c638cb0f817004db8f22a746770 Mon Sep 17 00:00:00 2001 From: deadmorose Date: Fri, 2 Apr 2021 17:42:10 +0000 Subject: [PATCH 11/85] Translated using Weblate (Russian) Currently translated at 100.0% (981 of 981 strings) Translation: Mobilizon/Frontend Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/ru/ --- js/src/i18n/ru.json | 177 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) diff --git a/js/src/i18n/ru.json b/js/src/i18n/ru.json index 8f05c5955..17171757e 100644 --- a/js/src/i18n/ru.json +++ b/js/src/i18n/ru.json @@ -9,7 +9,10 @@ "+ Start a discussion": "+ Начать обсуждение", "{contact} will be displayed as contact.": "{contact} будет отображаться как контакт.|{contact} будут отображаться как контакты.", "@{group}": "@{group}", + "@{username}": "@{username}", "@{username} ({role})": "@{username} ({role})", + "@{username}'s follow request was accepted": "Запрос на подписку от @{username} принят", + "@{username}'s follow request was rejected": "Запрос на подписку от @{username} отклонён", "A cookie is a small file containing information that is sent to your computer when you visit a website. When you visit the site again, the cookie allows that site to recognize your browser. Cookies may store user preferences and other information. You can configure your browser to refuse all cookies. However, this may result in some website features or services partially working. Local storage works the same way but allows you to store more data.": "Cookie - это небольшой файл, содержащий информацию, которая сохраняется на вашем компьютере при посещении веб-сайта. Когда вы снова посещаете эту страницу, cookie позволяет сайту распознавать ваш браузер. Cookie могут хранить настройки пользователя и другую информацию. Вы можете настроить свой браузер так, чтобы он не принимал файлы cookie. Однако это может привести к тому, что часть функционала веб-сайта не будет работать. Локальное хранилище работает так же, но позволяет хранить больше данных.", "A federated software": "Федеративное программное обеспечение", "A place for your code of conduct, rules or guidelines. You can use HTML tags.": "Тут можно разместить общие правила, положения или руководства. Вы можете использовать HTML-теги.", @@ -36,6 +39,7 @@ "Actions": "Действия", "Activated": "Активирован", "Active": "Активный", + "Activity": "Активность", "Actor": "Агент", "Add": "Добавить", "Add / Remove…": "Добавить / удалить…", @@ -53,10 +57,12 @@ "Admin settings successfully saved.": "Настройки администратора успешно сохранены.", "Administration": "Администрация", "Administrator": "Администратор", + "All activities": "Все действия", "All good, let's continue!": "Все хорошо, продолжим!", "All the places have already been taken": "Все места уже заняты", "Allow all comments from users with accounts": "Разрешить все комментарии от авторизованных пользователей", "Allow registrations": "Разрешить регистрацию", + "An error has occured. Sorry about that. You may try to reload the page.": "Произошла ошибка. Приносим вам тысячу извинений. Вы можете попробовать перезагрузить страницу.", "An ethical alternative": "Этичная альтернатива", "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.": "Узел - это программное обеспечение Mobilizon, установленное на сервере. Узел может быть запущен кем угодно, использующим {mobilizon_software} или другие федеративные приложения, называемые «Федиверзум». Имя этого узла - {instance_name}. Mobilizon - это федеративная сеть, состоящая из нескольких узлов (как почтовые серверы). Пользователи могут свободно общаться друг с другом, даже если они зарегистрированы на разных узлах.", "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 on your behalf, automatically and remotely.": "Интерфейс прикладного программирования» или «API» - это протокол связи, который позволяет программным компонентам взаимодействовать друг с другом. Например, API Mobilizon позволяет стороннему программному обеспечению взаимодействовать с узлами Mobilizon для выполнения определенных действий, таких как автоматическая публикация мероприятий от вашего имени.", @@ -77,9 +83,11 @@ "Are you sure you want to cancel the event creation? You'll lose all modifications.": "Вы уверены, что хотите отменить создание мероприятия? Все изменения будут потеряны.", "Are you sure you want to cancel the event edition? You'll lose all modifications.": "Вы уверены, что хотите отменить редактирование мероприятия? Все изменения будут потеряны.", "Are you sure you want to cancel your participation at event \"{title}\"?": "Вы действительно хотите отказаться от участия в мероприятии \"{title}\"?", + "Are you sure you want to delete this entire discussion?": "Вы уверены, что хотите полностью удалить это обсуждение?", "Are you sure you want to delete this event? This action cannot be reverted.": "Вы уверены, что хотите удалить это мероприятие? Это действие нельзя отменить.", "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.": "Поскольку организатор мероприятия решил вручную подтверждать запросы на участие, ваше участие будет фактически подтверждено после того, как вы получите электронное письмо о том, что оно было одобрено.", "Assigned to": "Присвоен", + "Atom feed for events and posts": "Atom лента для мероприятий и публикаций", "Avatar": "Аватар", "Back to previous page": "Вернуться на предыдущую страницу", "Banner": "Баннер", @@ -88,6 +96,7 @@ "Bold": "Жирный", "By @{group}": "Из @{group}", "By @{username}": "От @{username}", + "By others": "Другими", "By {author}": "Автор {author}", "By {group}": "Автор: {group}", "Can be an email or a link, or just plain text.": "Может быть адресом электронной почты, ссылкой или простым текстом.", @@ -105,6 +114,7 @@ "Change my password": "Изменить свой пароль", "Change timezone": "Изменить часовой пояс", "Check your inbox (and your junk mail folder).": "Проверьте свою электронную почту (и папку со спамом).", + "City or region": "Город, регион или область", "Clear": "Очистить", "Clear participation data for all events": "Очистить данные об участии для всех мероприятий", "Clear participation data for this event": "Очистить данные об участии в этом мероприятии", @@ -112,9 +122,11 @@ "Click to upload": "Нажмите, чтобы загрузить", "Close": "Закрыть", "Close comments for all (except for admins)": "Закрыть комментарии для всех (кроме админов)", + "Close events": "Ближайшие мероприятия", "Closed": "Закрыто", "Comment deleted": "Комментарий удален", "Comment from @{username} reported": "Жалоба на комментарий от @{username} отправлена", + "Comment text can't be empty": "Комментарий не может быть пустым", "Comments": "Комментарии", "Comments are closed for everybody else.": "Комментарии закрыты для всех остальных.", "Confirm my participation": "Подтвердите мое участие", @@ -126,6 +138,7 @@ "Contact": "Контакт", "Continue editing": "Продолжить редактирование", "Cookies and Local storage": "Файлы cookie и локальное хранилище", + "Copy details to clipboard": "Копировать подробности в буфер обмена", "Country": "Страна", "Create": "Создать", "Create a calc": "Создать таблицу", @@ -138,10 +151,12 @@ "Create a pad": "Создать документ", "Create a videoconference": "Создать видеоконференцию", "Create an account": "Создать учётную запись", + "Create event": "Создать мероприятие", "Create group": "Создать группу", "Create my event": "Создать мое мероприятие", "Create my group": "Создать мою группу", "Create my profile": "Создать мой профиль", + "Create new links": "Создать новые ссылки", "Create resource": "Создать ресурс", "Create the discussion": "Начать обсуждение", "Create to-do lists for all the tasks you need to do, assign them and set due dates.": "Создавайте списки дел для каждой нужной вам задачи, назначайте их другим, и устанавливайте сроки выполнения.", @@ -168,11 +183,13 @@ "Delete Event": "Удалить мероприятие", "Delete account": "Удалить учётную запись", "Delete conversation": "Удалить беседу", + "Delete discussion": "Удалить обсуждение", "Delete event": "Удалить мероприятие", "Delete everything": "Удалить всё", "Delete group": "Удалить группу", "Delete my account": "Удалить мою учётную запись", "Delete post": "Удалить пост", + "Delete this discussion": "Удалить это обсуждение", "Delete this identity": "Удалить этот идентификатор", "Delete your identity": "Удалить ваш идентификатор", "Delete {eventTitle}": "Удалить {eventTitle}", @@ -191,6 +208,8 @@ "Displayed nickname": "Отображаемый ник", "Displayed on homepage and meta tags. Describe what Mobilizon is and what makes this instance special in a single paragraph.": "Отображается на главной странице и в метатегах. Опишите в одном абзаце, что такое Mobilizon и что делает этот узел особенным.", "Do not receive any mail": "Не получать электронные письма", + "Do you wish to {create_event} or {explore_events}?": "Вы хотите {create_event} или {explore_events}?", + "Do you wish to {create_group} or {explore_groups}?": "Вы хотите {create_group} или {explore_groups}}?", "Domain": "Домен", "Draft": "Черновик", "Drafts": "Черновики", @@ -214,6 +233,9 @@ "Enter your own privacy policy. HTML tags allowed. The {mobilizon_privacy_policy} is provided as template.": "Введите свою политику конфиденциальности. Вы можете использовать HTML-теги. {mobilizon_privacy_policy} используется в качестве шаблона.", "Enter your own terms. HTML tags allowed. The {mobilizon_terms} are provided as template.": "Введите свои собственные условия. Вы можете использовать HTML-теги. {mobilizon_terms} используется в качестве шаблона.", "Error": "Ошибка", + "Error details copied!": "Подробности об ошибке скопированы!", + "Error message": "Сообщение об ошибке", + "Error stacktrace": "Стектрейс ошибки", "Error while changing email": "Произошла ошибка при изменении адреса электронной почты", "Error while login with {provider}. Retry or login another way.": "Не удалось войти через {provider}. Повторите попытку или войдите другим способом.", "Error while login with {provider}. This login provider doesn't exist.": "Не удалось войти через {provider}. Такого провайдера аутентификации не существует.", @@ -246,7 +268,9 @@ "Find an address": "Найти адрес", "Find an instance": "Найти узел", "Find another instance": "Найти другой узел", + "Follower": "Подписчик", "Followers": "Подписчики", + "Followers will receive new public events and posts.": "Подписчики будут оповещены о новых публичных мероприятиях и публикациях.", "Followings": "Подписки", "For instance: London": "Например: Москва", "For instance: London, Taekwondo, Architecture…": "Например: Москва, йога, архитектура…", @@ -255,13 +279,16 @@ "From the {startDate} at {startTime} to the {endDate}": "От {startDate}, {startTime} до {endDate}", "From the {startDate} at {startTime} to the {endDate} at {endTime}": "От {startDate}, {startTime} до {endDate}, {endTime}", "From the {startDate} to the {endDate}": "От {startDate} до {endDate}", + "From yourself": "От себя", "Gather ⋅ Organize ⋅ Mobilize": "Объединять ⋅ Организовывать ⋅ Мобилизовывать", "General": "Общий", "General information": "Общая информация", "Getting location": "Получить местоположение", + "Getting there": "Как туда добраться", "Glossary": "Глоссарий", "Go": "Идти", "Go to the event page": "Перейти на страницу мероприятия", + "Group Followers": "Группа подписчиков", "Group Members": "Участники группы", "Group address": "Адрес группы", "Group display name": "Отображаемое имя группы", @@ -273,6 +300,7 @@ "Group {displayName} created": "Группа {displayName} создана", "Group {groupTitle} reported": "Жалоба на группу {groupTitle} отправлена", "Groups": "Группы", + "Groups are not enabled on this instance.": "Группы не включены на этом узле.", "Groups are spaces for coordination and preparation to better organize events and manage your community.": "Группы - это места для координации и подготовки, где вы занимаетесь организацией мероприятий и управлением своим сообществом.", "Headline picture": "Заглавное изображение", "Hide replies": "Скрыть ответы", @@ -287,6 +315,8 @@ "I participate": "Я участвую", "I want to allow people to participate without an account.": "Я хочу разрешить участие людям без учетной записи.", "I want to approve every participation request": "Я хочу одобрять каждую заявку на участие", + "ICS feed for events": "ICS лента для мероприятий", + "ICS/WebCal Feed": "ICS/WebCal лента", "Identity {displayName} created": "Идентификатор {displayName} создан", "Identity {displayName} deleted": "Идентификатор {displayName} удалён", "Identity {displayName} updated": "Идентификатор {displayName} обновлён", @@ -320,6 +350,7 @@ "Invite a new member": "Пригласить нового участника", "Invite member": "Пригласить участника", "Invited": "Приглашён", + "It is possible that the content is not accessible on this instance, because this instance has blocked the profiles or groups behind this content.": "Контент может быть недоступен на этом узле, потому что узел заблокировал профили или группы, которым этот контент принадлежит.", "Italic": "Курсив", "Join {instance}, a Mobilizon instance": "Присоединиться к {instance}, узлу Mobilizon", "Join group": "Вступить в группу", @@ -329,6 +360,7 @@ "Last IP adress": "Последний IP-адрес", "Last group created": "Последняя созданная группа", "Last published event": "Последнее опубликованное мероприятие", + "Last published events": "Последние опубликованные мероприятия", "Last sign-in": "Последний вход", "Last week": "На прошлой неделе", "Latest posts": "Последние записи", @@ -344,6 +376,7 @@ "Limited number of places": "Ограниченное количество мест", "List title": "Заголовок списка", "Load more": "Загрузить больше", + "Load more activities": "Загрузить больше действий", "Loading comments…": "Загрузка комментариев…", "Local": "Местный", "Locality": "Местонахождение", @@ -356,6 +389,7 @@ "Login status": "Статус входа", "Main languages you/your moderators speak": "Основные языки, на которых говорите вы/ваши модераторы", "Manage participations": "Управление участниками", + "Manually approve new followers": "Одобрять новых подписчиков вручную", "Manually invite new members": "Пригласите новых участников вручную", "Mark as resolved": "Отметить как решённое", "Member": "Участник", @@ -390,6 +424,7 @@ "New members": "Новые участники", "New note": "Новая заметка", "New password": "Новый пароль", + "New post": "Новая публикация", "New profile": "Новый профиль", "Next": "Следующий", "Next month": "В следующем месяце", @@ -402,8 +437,10 @@ "No discussions yet": "Пока нет обсуждений", "No end date": "Без даты окончания", "No events found": "Мероприятий не найдено", + "No follower matches the filters": "Ни один подписчик не соответствует критериям", "No group found": "Группа не найдена", "No groups found": "Группы не найдены", + "No information": "Нет информации", "No instance follows your instance yet.": "Ни один узел еще не подписан на ваш узел.", "No instance to approve|Approve instance|Approve {number} instances": "Нет узлов для одобрения | Одобрить узел | Одобрить {number} узлов", "No instance to reject|Reject instance|Reject {number} instances": "Нет узлов для отклонения | Отклонить узел | Отклонить {number} узлов", @@ -412,6 +449,7 @@ "No member matches the filters": "Ни один участник не соответствует критериям", "No message": "Нет сообщений", "No moderation logs yet": "Журналов модерации пока нет", + "No more activity to display.": "Больше нет действия для отображения.", "No one is going to this event": "Никто не идёт на это мероприятие|Один человек пойдёт|{going} людей пойдут", "No open reports yet": "Пока нет открытых отчётов", "No participant matches the filters": "Ни один участник не соответствует критериям", @@ -435,6 +473,7 @@ "Nothing to see here": "Здесь ничего нет", "Notification before the event": "Уведомление перед мероприятием", "Notification on the day of the event": "Уведомление в день мероприятия", + "Notifications": "Уведомления", "Notifications for manually approved participations to an event": "Уведомления об участиях в мероприятиях, одобренных вручную", "Now, create your first profile:": "Теперь создайте свой первый профиль:", "Number of places": "Количество мест", @@ -444,12 +483,16 @@ "On {date} ending at {endTime}": "{date}, заканчивается в {endTime}", "On {date} from {startTime} to {endTime}": "{date} c {startTime} до {endTime}", "On {date} starting at {startTime}": "{date}, начало в {startTime}", + "On {instance}": "На {instance}", "Only accessible through link": "Доступно только по ссылке", "Only accessible through link (private)": "Доступно только по ссылке (приватно)", "Only accessible to members of the group": "Доступно только участникам группы", "Only alphanumeric lowercased characters and underscores are supported.": "Допустимы только буквенно-цифровые символы нижнего регистра и подчеркивания.", + "Only group members can access discussions": "Только участники группы имеют доступ к обсуждениям", "Only group moderators can create, edit and delete posts.": "Только модераторы группы могут создавать, редактировать и удалять публикации.", "Open": "Открыть", + "Open a topic on our forum": "Откройте тему на нашем форуме", + "Open an issue on our bug tracker (advanced users)": "Сообщить о проблеме в нашем багтрекере (для опытных пользователей)", "Opened reports": "Открытые отчёты", "Or": "Или", "Organized": "Организованно", @@ -479,11 +522,13 @@ "Password reset": "Сброс пароля", "Past events": "Прошедшие мероприятия", "Pending": "В ожидании", + "Personal feeds": "Личные ленты", "Pick": "Выбрать", "Pick a group": "Выберите группу", "Pick a profile or a group": "Выберите профиль или группу", "Pick an identity": "Выберите идентификатор", "Pick an instance": "Выберите узел", + "Please add as many details as possible to help identify the problem.": "Сообщите нам как можно больше подробностей, чтобы мы смогли идентифицировать проблему.", "Please check your spam folder if you didn't receive the email.": "Если вы не получили письмо, проверьте папку со спамом.", "Please contact this instance's Mobilizon admin if you think this is a mistake.": "Если вы считаете, что произошла ошибка, обратитесь к администратору этого узла.", "Please do not use it in any real way.": "Пожалуйста, используйте это только для тестовых целей.", @@ -503,6 +548,7 @@ "Privacy policy": "Политика конфиденциальности", "Private event": "Приватное мероприятие", "Private feeds": "Приватная лента", + "Profile feeds": "Ленты профиля", "Profiles": "Профили", "Profiles and federation": "Профили и федерализация", "Promote": "Поднять", @@ -522,6 +568,7 @@ "Receive one email per request": "Получать электронное письмо на каждый запрос", "Redirecting to content…": "Перенаправление к содержимому…", "Refresh profile": "Обновить профиль", + "Regenerate new links": "Восстановить новые ссылки", "Region": "Область", "Register an account on {instanceName}!": "Зарегистрируйте аккаунт на {instanceName}!", "Register on this instance": "Зарегистрируйтесь на этом узле", @@ -530,6 +577,7 @@ "Registration is currently closed.": "Регистрация на данный момент закрыта.", "Registrations": "Регистрации", "Registrations are restricted by allowlisting.": "Регистрация ограничена белым списком.", + "Reject": "Отклонить", "Rejected": "Отклонено", "Remember my participation in this browser": "Запомнить моё участие для этого браузера", "Remove": "Удалить", @@ -556,6 +604,7 @@ "Resource provided is not an URL": "Указанный ресурс не является URL-адресом", "Resources": "Ресурсы", "Restricted": "Ограниченный", + "Return to the group page": "Вернуться на страницу группы", "Right now": "Прямо сейчас", "Role": "Роль", "Rules": "Правила", @@ -568,6 +617,7 @@ "Searching…": "Поиск…", "Search…": "Поиск…", "Select a language": "Выберите язык", + "Select a radius": "Выберите радиус", "Select a timezone": "Выберите часовой пояс", "Select languages": "Выберите языки", "Send email": "Отправить электронное письмо", @@ -594,6 +644,7 @@ "Suspend group": "Приостановить группу", "Suspended": "Приостановлен", "Task lists": "Списки задач", + "Technical details": "Технические подробности", "Tentative": "Предварительный", "Tentative: Will be confirmed later": "Предварительно: будет подтверждено позже", "Terms": "Условия", @@ -612,21 +663,40 @@ "The event organizer manually approves participations. Since you've chosen to participate without an account, please explain why you want to participate to this event.": "Организатор мероприятия утверждает участие вручную. Поскольку вы выбрали участие без учётной записи, объясните, почему вы хотите участвовать в этом мероприятии.", "The event title will be ellipsed.": "Название этого мероприятие сокращено троеточием.", "The event will show as attributed to this group.": "Событие будет отображаться как связанное с этой группой.", + "The event will show as attributed to this profile.": "Мероприятие будет отображаться как связанное с этим профилем.", "The event will show as attributed to your personal profile.": "Мероприятие будет отображаться как связанное с вашим личным профилем.", "The event will show the group as organizer.": "На мероприятии группа будет представлена как организатор.", + "The event {event} was created by {profile}.": "Мероприятие {event} было создано пользователем {profile}.", + "The event {event} was deleted by {profile}.": "Мероприятие {event} было удалено пользователем {profile}.", + "The event {event} was updated by {profile}.": "Мероприятие {event} было обновлено пользователем {profile}.", + "The events you created are not shown here.": "Созданные вами мероприятия здесь не отображаются.", + "The group can now be joined by anyone.": "Теперь каждый может присоединиться к группе.", + "The group can now only be joined with an invite.": "Теперь к группе можно присоединиться только по приглашению.", "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.": "Группа будет представлена в результатах поиска и может быть предложена в разделе «Обзор». На её странице будет отображаться только общедоступная информация.", + "The group's avatar was changed.": "Аватар группы был изменён.", + "The group's banner was changed.": "Баннер группы был изменён.", + "The group's physical address was changed.": "Физический адрес группы был изменён.", + "The group's short description was changed.": "Краткое описание группы было изменено.", "The instance administrator is the person or entity that runs this Mobilizon instance.": "Администратор узла - это физическое или юридическое лицо, которое управляет данным узлом Mobilizon.", "The member was removed from the group {group}": "Участник удалён из группы {group}", "The only way for your group to get new members is if an admininistrator invites them.": "Новые участники смогут вступать в вашу группу только по приглашению администратора.", "The organiser has chosen to close comments.": "Организатор решил отключить комментарии.", "The page you're looking for doesn't exist.": "Страницы, которую вы ищете, не существует.", "The password was successfully changed": "Пароль был успешно изменен", + "The post {post} was created by {profile}.": "Публикация {post} была создана пользователем {profile}.", + "The post {post} was deleted by {profile}.": "Публикация {post} была удалена пользователем {profile}.", + "The post {post} was updated by {profile}.": "Публикация {post} была обновлена пользователем {profile}.", "The report will be sent to the moderators of your instance. You can explain why you report this content below.": "Отчёт будет отправлен модераторам вашего узла. Вы можете объяснить причину своей жалобы ниже.", + "The technical details of the error can help developers solve the problem more easily. Please add them to your feedback.": "Технические подробности ошибки могут помочь разработчикам быстрее решить проблему. Пожалуйста, добавьте их в свой отзыв.", "The {default_privacy_policy} will be used. They will be translated in the user's language.": "Будет использоваться {default_privacy_policy}. Они будут переведены на язык пользователя.", "The {default_terms} will be used. They will be translated in the user's language.": "Будут использоваться {default_terms}. Они будут переведены на язык пользователя.", "There are {participants} participants.": "Имеется {participants} участников.", + "There is no activity yet. Start doing some things to see activity appear here.": "Пока нет действий. Действия появятся здесь, после того, как вы сделаете что-либо.", "There will be no way to recover your data.": "Восстановить ваши данные будет невозможно.", + "There's no discussions yet": "Пока нет обсуждений", "These events may interest you": "Эти мероприятия могут вас заинтересовать", + "These feeds contain event data for the events for which any of your profiles is a participant or creator. You should keep these private. You can find feeds for specific profiles on each profile edition page.": "Эти ленты содержат данные о мероприятиях, участником или создателем которых является любой из ваших профилей. Вы должны держать их в секрете. Вы можете найти ленты для конкретного профиля на его странице с настройками.", + "These feeds contain event data for the events for which this specific profile is a participant or creator. You should keep these private. You can find feeds for all of your profiles into your notification settings.": "Эти ленты содержат данные о мероприятиях, участником или создателем которых является данный профиль. Вы должны держать их в секрете. Вы можете найти ленты для всех ваших профилей в настройках уведомлений.", "This Mobilizon instance and this event organizer allows anonymous participations, but requires validation through email confirmation.": "Этот узел Mobilizon и этот организатор мероприятия допускают анонимное участие, но требуют подтверждения по электронной почте.", "This URL is not supported": "Этот URL не поддерживается", "This event has been cancelled.": "Это мероприятие было отменено.", @@ -660,14 +730,19 @@ "Tomorrow": "Завтра", "Transfer to {outsideDomain}": "Перенос в {outsideDomain}", "Type": "Тип", + "Type or select a date…": "Введите или выберите дату…", "URL": "URL-адрес", "URL copied to clipboard": "URL скопирован в буфер обмена", + "Unable to copy to clipboard": "Невозможно скопировать в буфер обмена", "Unable to detect timezone.": "Не удалось определить часовой пояс.", + "Unable to load event for participation. The error details are provided below:": "Не удалось загрузить мероприятие для участия. Подробная информация об ошибке представлена ниже:", + "Unable to save your participation in this browser.": "Невозможно сохранить статус вашего участия в этом браузере.", "Unfortunately, this instance isn't opened to registrations": "К сожалению, регистрация на этом узле закрыта", "Unfortunately, your participation request was rejected by the organizers.": "К сожалению, ваша заявка на участие была отклонена организаторами.", "Unknown": "Неизвестный", "Unknown actor": "Неизвестный агент", "Unknown error.": "Неизвестная ошибка.", + "Unknown value for the openness setting.": "Неизвестное значение ограничений доступа.", "Unsaved changes": "Несохранённые изменения", "Unset group": "Отменить выбор группы", "Unsuspend": "Отменить приостановку", @@ -686,14 +761,19 @@ "Users": "Пользователи", "View a reply": "|Посмотреть один ответ|Посмотреть {totalReplies} ответов", "View all": "Посмотреть всё", + "View all events": "Посмотреть все мероприятия", "View all posts": "Просмотреть все публикации", "View event page": "Просмотреть страницу мероприятия", "View everything": "Посмотреть всё", "View page on {hostname} (in a new window)": "Просмотреть страницу на {hostname} (в новом окне)", + "Visibility was set to an unknown value.": "Видимость изменена на неизвестное значение.", + "Visibility was set to private.": "Видимость изменена на приватную.", + "Visibility was set to public.": "Видимость изменена на публичную.", "Visible everywhere on the web": "Видно всем в Интернете", "Visible everywhere on the web (public)": "Видно во всем Интернете (публично)", "Waiting for organization team approval.": "Ожидает одобрения организаторами.", "Warning": "Предупреждение", + "We improve this software thanks to your feedback. To let us know about this issue, two possibilities (both unfortunately require user account creation):": "Мы улучшаем это программное обеспечение благодаря вашим отзывам. У вас есть два способа сообщить нам об этой проблеме (оба, увы, требуют создания учетной записи пользователя):", "We just sent an email to {email}": "Мы отправили электронное письмо на адрес {email}", "We use your timezone to make sure you get notifications for an event at the correct time.": "Мы используем настройки вашего часового пояса, чтобы вы своевременно получали уведомления о мероприятиях.", "We will redirect you to your instance in order to interact with this event": "Вы будете перенаправлены на свой узел, чтобы иметь возможность взаимодействовать с этим событием", @@ -705,21 +785,44 @@ "Welcome back {username}!": "С возвращением, {username}!", "Welcome back!": "С возвращением!", "Welcome to Mobilizon, {username}!": "Добро пожаловать в Mobilizon, {username}!", + "What can I do to help?": "Чем я могу помочь?", "When a moderator from the group creates an event and attributes it to the group, it will show up here.": "Когда модератор группы создаёт событие и назначает его группе, оно появляется здесь.", "Who can view this event and participate": "Кто может просматривать и участвовать в мероприятии", "Who can view this post": "Кто может видеть этот пост", "Who published {number} events": "Которые опубликовали {number} мероприятий", "Why create an account?": "Почему стоит создать учётную запись?", "Will allow to display and manage your participation status on the event page when using this device. Uncheck if you're using a public device.": "Это позволит вам просматривать и управлять своим статусом участия на странице мероприятия при использовании этого устройства. Снимите флажок, если вы используете общедоступное устройство.", + "Within {number} kilometers of {place}": "|В пределах километра от {place}|В пределах {number} километров от {place}", "Write something…": "Напиши что-нибудь…", + "Yesterday": "Вчера", + "You accepted the invitation to join the group.": "Вы приняли приглашение присоединиться к группе.", + "You added the member {member}.": "Вы добавили участника {member}.", + "You archived the discussion {discussion}.": "Вы отправили {discussion} обсуждение в архив.", "You are not an administrator for this group.": "Вы не являетесь администратором этой группы.", + "You are not part of any group.": "Вы не состоите ни в одной группе.", "You are participating in this event anonymously": "Вы участвуете в этом мероприятии анонимно", "You are participating in this event anonymously but didn't confirm participation": "Вы участвуете в этом мероприятии анонимно, но не подтвердили свое участие", "You can add tags by hitting the Enter key or by adding a comma": "Вы можете добавлять тэги, нажимая клавишу Enter или разделяя слова запятой", "You can pick your timezone into your preferences.": "Вы можете изменить часовой пояс по своему усмотрению.", "You can try another search term or drag and drop the marker on the map": "Вы можете попробовать другие критерии поиска или перетащить маркер на карту", "You can't change your password because you are registered through {provider}.": "Вы не можете изменить свой пароль, потому что вы зарегистрированы через {provider}.", + "You created the discussion {discussion}.": "Вы создали обсуждение {discussion}.", + "You created the event {event}.": "Вы создали мероприятие {event}.", + "You created the folder {resource}.": "Вы создали папку {resource}.", + "You created the group {group}.": "Вы создали группу {group}.", + "You created the post {post}.": "Вы создали публикацию {post}.", + "You created the resource {resource}.": "Вы создали ресурс {resource}.", + "You deleted the discussion {discussion}.": "Вы удалили обсуждение {discussion}.", + "You deleted the event {event}.": "Вы удалили мероприятие {event}.", + "You deleted the folder {resource}.": "Вы удалили папку {resource}.", + "You deleted the post {post}.": "Вы удалили публикацию {post}.", + "You deleted the resource {resource}.": "Вы удалили ресурс {resource}.", + "You demoted the member {member} to an unknown role.": "Вы понизили статус {member} до неизвестной роли.", + "You demoted {member} to moderator.": "Вы понизили статус {member} до модератора.", + "You demoted {member} to simple member.": "Вы понизили статус {member} до обычного участника.", + "You didn't create or join any event yet.": "Вы ещё не создали и не участвовали ни в одном мероприятии.", "You don't follow any instances yet.": "Вы пока не подписаны ни на один узел.", + "You excluded member {member}.": "Вы исключили участника {member}.", "You have been disconnected": "Вы были отключены", "You have been invited by {invitedBy} to the following group:": "Вы были приглашены пользователем {invitedBy} в следующую группу:", "You have been removed from this group's members.": "Вы были удалены из участников этой группы.", @@ -727,20 +830,49 @@ "You have one event in {days} days.": "У вас нет мероприятий в течение {days} дней | У вас одно мероприятие в течении {days} дней | У вас {count} мероприятий в течении {days} дней", "You have one event today.": "У вас сегодня нет мероприятий | У вас сегодня одно мероприятие. | У вас сегодня {count} мероприятий", "You have one event tomorrow.": "Завтра у вас нет мероприятий | Завтра у вас одно мероприятие. | Завтра у вас {count} мероприятий", + "You invited {member}.": "Вы пригласили {member}.", "You may clear all participation information for this device with the buttons below.": "Вы можете удалить всю информацию об участии для этого устройства с помощью кнопок ниже.", "You may now close this window, or {return_to_event}.": "Теперь вы можете закрыть это окно, или {return_to_event}.", + "You may show some members as contacts.": "Вы можете просматривать некоторых участников как контакты.", + "You moved the folder {resource} into {new_path}.": "Вы переместили папку {resource} в {new_path}.", + "You moved the folder {resource} to the root folder.": "Вы переместили папку {resource} в корневую папку.", + "You moved the resource {resource} into {new_path}.": "Вы переместили ресурс {resource} в {new_path}.", + "You moved the resource {resource} to the root folder.": "Вы переместили ресурс {resource} в корневую папку.", "You need to create the group before you create an event.": "Перед созданием мероприятия вам необходимо создать группу.", "You need to login.": "Вы должны авторизоваться.", + "You posted a comment on the event {event}.": "Вы оставили комментарий к мероприятию {event}.", + "You promoted the member {member} to an unknown role.": "Вы повысили статус {member} до неизвестной роли.", + "You promoted {member} to administrator.": "Вы повысили статус {member} до администратора.", + "You promoted {member} to moderator.": "Вы повысили статус {member} до модератора.", + "You renamed the discussion from {old_discussion} to {discussion}.": "Вы переименовали обсуждение с {old_discussion} в {discussion}.", + "You renamed the folder from {old_resource_title} to {resource}.": "Вы переименовали папку с {old_resource_title} в {resource}.", + "You renamed the resource from {old_resource_title} to {resource}.": "Вы переименовали ресурс с {old_resource_title} в {resource}.", + "You replied to a comment on the event {event}.": "Вы ответили на комментарий к мероприятию {event}.", + "You replied to the discussion {discussion}.": "Вы ответили на обсуждение {discussion}.", + "You requested to join the group.": "Вы попросили присоединиться к группе.", + "You updated the event {event}.": "Вы обновили мероприятие {event}.", + "You updated the group {group}.": "Вы обновили группу {group}.", + "You updated the member {member}.": "Вы обновили участника {member}.", + "You updated the post {post}.": "Вы обновили публикацию {post}.", + "You were demoted to an unknown role by {profile}.": "{profile} понизил ваш статус до неизвестной роли.", + "You were demoted to moderator by {profile}.": "{profile} понизил ваш статус до модератора.", + "You were demoted to simple member by {profile}.": "{profile} понизил ваш статус до обычного участника.", + "You were promoted to administrator by {profile}.": "{profile} повысил ваш статус до администратора.", + "You were promoted to an unknown role by {profile}.": "{profile} повысил ваш статус до неизвестной роли.", + "You were promoted to moderator by {profile}.": "{profile} повысил ваш статус до модератора.", "You will be able to add an avatar and set other options in your account settings.": "Вы сможете добавить аватар и изменить другие параметры в настройках своей учётной записи.", "You will be redirected to the original instance": "Вы будете перенаправлены на исходный узел", + "You will find here all the events you have created or of which you are a participant.": "Здесь вы найдёте все мероприятия, которые вы создали или в которых участвовали.", "You wish to participate to the following event": "Вы хотите принять участие в следующем мероприятии", "You'll get a weekly recap every Monday for upcoming events, if you have any.": "Каждый понедельник вы будете получать сводку о предстоящих мероприятиях, в которых вы принимаете участие.", + "You'll need to change the URLs where there were previously entered.": "Вы должны изменить URL-адреса там, где они были введены ранее.", "You'll need to transmit the group URL so people may access the group's profile. The group won't be findable in Mobilizon's search or regular search engines.": "Вы должны предоставить URL-адрес группы, чтобы другие могли получить доступ к её профилю. Группу нельзя будет найти ни в поиске Mobilizon, ни в обычных поисковых системах.", "You'll receive a confirmation email.": "Вы получите электронное письмо с подтверждением.", "Your account has been successfully deleted": "Ваша учетная запись была успешно удалена", "Your account has been validated": "Ваша учетная запись была подтверждена", "Your account is being validated": "Ваша учетная запись проверяется", "Your account is nearly ready, {username}": "Ваш аккаунт почти готов, {username}", + "Your city or region and the radius will only be used to suggest you events nearby. The event radius will consider the administrative center of the area.": "Ваш город, регион или область будут использоваться только для рекомендации вам ближайших мероприятий. Радиус мероприятия считается относительно административного центра области.", "Your current email is {email}. You use it to log in.": "Ваш текущий адрес электронной почты{email}. Вы используете его для входа в систему.", "Your email": "Ваш адрес электронной почты", "Your email address was automatically set based on your {provider} account.": "Ваш адрес электронной почты был автоматически установлен на основе вашей учётной записи {provider}.", @@ -756,10 +888,13 @@ "Your participation status has been changed": "Ваш статус участия был изменен", "Your participation status is saved only on this device and will be deleted one month after the event's passed.": "Ваш статус участия сохраняется только на этом устройстве и будет удалён через месяц после завершения мероприятия.", "Your participation still has to be approved by the organisers.": "Ваша заявка всё ещё ожидает одобрения организаторов.", + "Your participation will be validated once you click the confirmation link into the email, and after the organizer manually validates your participation.": "Ваше участие будет подтверждено, когда вы перейдете по ссылке в электронном письме, а также после того, как организатор вручную одобрит ваше участие.", + "Your participation will be validated once you click the confirmation link into the email.": "Ваше участие будет подтверждено, как только вы перейдете по ссылке в электронном письме.", "Your profile will be shown as contact.": "Ваш профиль будет отображаться как контакт.", "Your timezone is currently set to {timezone}.": "Ваш часовой пояс в настоящее время установлен на {timezone}.", "Your timezone was detected as {timezone}.": "Ваш часовой пояс был определен как {timezone}.", "Your timezone {timezone} isn't supported.": "Ваш часовой пояс {timezone} не поддерживается.", + "Your upcoming events": "Ваши предстоящие мероприятия", "[This comment has been deleted by it's author]": "[Этот комментарий был удален автором]", "[This comment has been deleted]": "[Этот комментарий был удалён]", "[deleted]": "[удалено]", @@ -768,24 +903,36 @@ "any distance": "любое расстояние", "as {identity}": "как {identity}", "contact uninformed": "контакт не уведомлен", + "create a group": "создать группу", + "create an event": "создать мероприятие", "default Mobilizon privacy policy": "Политика конфиденциальности Mobilizon по умолчанию", "default Mobilizon terms": "условия использования Mobilizon по умолчанию", "e.g. 10 Rue Jangot": "например: Садовая 10", + "explore the events": "просмотреть мероприятия", + "explore the groups": "просмотреть группы", "full rules": "полные правила", "iCal Feed": "iCal лента", "instance rules": "правила узла", "more than 1360 contributors": "более 1360 участников", "profile@instance": "профиль@узел", "report #{report_number}": "отчёт #{report_number}", + "return to the event's page": "вернуться на страницу мероприятия", "terms of service": "условия обслуживания", "with another identity…": "с другим идентификатором…", "{approved} / {total} seats": "{approved} / {total} мест", "{available}/{capacity} available places": "Мест нет|{available}/{capacity} свободных мест", + "{count} km": "{count} км", "{count} participants": "Нет участников | Один участник | {count} участников", "{count} requests waiting": "{count} ожидающих рассмотрения заявок", "{count} team members": "{count} членов команды", + "{group} activity timeline": "История активности {group}", "{group}'s events": "Мероприятия {group}", "{instanceName} is an instance of the {mobilizon} software.": "{instanceName} - это узел использующий ПО {mobilizon}.", + "{instanceName} is an instance of {mobilizon_link}, a free software built with the community.": "{instanceName} — это узел {mobilizon_link}, бесплатного программного обеспечения, созданного при участии сообщества.", + "{member} accepted the invitation to join the group.": "{member} принял приглашение присоединиться к группе.", + "{member} rejected the invitation to join the group.": "{member} отклонил приглашение присоединиться к группе.", + "{member} requested to join the group.": "{member} попросил присоединиться к группе.", + "{member} was invited by {profile}.": "{member} был приглашен пользователем {profile}.", "{moderator} added a note on {report}": "{moderator} добавил примечание к {report}", "{moderator} closed {report}": "{moderator} закрыл {report}", "{moderator} deleted an event named \"{title}\"": "{moderator} удалил мероприятие с названием \"{title}\"", @@ -799,7 +946,37 @@ "{number} organized events": "Нет организованных мероприятий|Организованно одно мероприятие|Организованно {number} мероприятий", "{number} participations": "Нет участников|Один участник|{number} участников", "{number} posts": "Нет публикаций|Одна публикация|{number} публикаций", + "{old_group_name} was renamed to {group}.": "{old_group_name} переименована в {group}.", "{profile} (by default)": "{profile} (по умолчанию)", + "{profile} added the member {member}.": "{profile} добавил участника {member}.", + "{profile} archived the discussion {discussion}.": "{profile} отправил обсуждение {discussion} в архив.", + "{profile} created the discussion {discussion}.": "{profile} создал обсуждение {discussion}.", + "{profile} created the folder {resource}.": "{profile} создал папку {resource}.", + "{profile} created the group {group}.": "{profile} создал группу {group}.", + "{profile} created the resource {resource}.": "{profile} создал ресурс {resource}.", + "{profile} deleted the discussion {discussion}.": "{profile} удалил обсуждение {discussion}.", + "{profile} deleted the folder {resource}.": "{profile} удалил папку {resource}.", + "{profile} deleted the resource {resource}.": "{profile} удалил ресурс {resource}.", + "{profile} demoted {member} to an unknown role.": "{profile} понизил статус {member} до неизвестной роли.", + "{profile} demoted {member} to moderator.": "{profile} понизил статус {member} до модератора.", + "{profile} demoted {member} to simple member.": "{profile} понизил статус {member} до обычного участника.", + "{profile} excluded member {member}.": "{profile} исключил участника {member}.", + "{profile} moved the folder {resource} into {new_path}.": "{profile} переместил папку {resource} в {new_path}.", + "{profile} moved the folder {resource} to the root folder.": "{profile} переместил папку {resource} в корневую папку.", + "{profile} moved the resource {resource} into {new_path}.": "{profile} переместил ресурс {resource} в {new_path}.", + "{profile} moved the resource {resource} to the root folder.": "{profile} переместил ресурс {resource} в корневую папку.", + "{profile} posted a comment on the event {event}.": "{profile} оставил комментарий к мероприятию {event}.", + "{profile} promoted {member} to administrator.": "{profile} повысил статус {member} до администратора.", + "{profile} promoted {member} to an unknown role.": "{profile} повысил статус {member} до неизвестной роли.", + "{profile} promoted {member} to moderator.": "{profile} повысил статус {member} до модератора.", + "{profile} quit the group.": "{profile} покинул группу.", + "{profile} renamed the discussion from {old_discussion} to {discussion}.": "{profile} переименовал обсуждение с {old_discussion} в {discussion}.", + "{profile} renamed the folder from {old_resource_title} to {resource}.": "{profile} переименовал папку с {old_resource_title} в {resource}.", + "{profile} renamed the resource from {old_resource_title} to {resource}.": "{profile} переименовал ресурс с {old_resource_title} в {resource}.", + "{profile} replied to a comment on the event {event}.": "{profile} ответил на комментарий к мероприятию {event}.", + "{profile} replied to the discussion {discussion}.": "{profile} ответил на обсуждение {обсуждение}.", + "{profile} updated the group {group}.": "{profile} обновил группу {group}.", + "{profile} updated the member {member}.": "{profile} обновил участника {member}.", "{title} ({count} todos)": "{title} ({count} незавершенных задач)", "{username} was invited to {group}": "{username} был приглашён в {group}", "© The OpenStreetMap Contributors": "© Авторы OpenStreetMap" From c530f289dc38458074a51cd74076fdaf2c083c3d Mon Sep 17 00:00:00 2001 From: Slimane Selyan AMIRI Date: Fri, 2 Apr 2021 16:32:36 +0000 Subject: [PATCH 12/85] Translated using Weblate (Kabyle) Currently translated at 18.6% (183 of 981 strings) Translation: Mobilizon/Frontend Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/kab/ --- js/src/i18n/kab.json | 186 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 185 insertions(+), 1 deletion(-) diff --git a/js/src/i18n/kab.json b/js/src/i18n/kab.json index 0967ef424..bd22764ef 100644 --- a/js/src/i18n/kab.json +++ b/js/src/i18n/kab.json @@ -1 +1,185 @@ -{} +{ + "About": "Γef", + "Accept": "Qbel", + "Accepted": "Yettwaqbel", + "Account": "Amiḍan", + "Actions": "Actions", + "Activated": "Irmed", + "Active": "Urmid", + "Activity": "Armud", + "Add": "Rnu", + "Add a group": "Rnu agraw", + "Add a note": "Rnu tazmilt", + "Admin": "Anedbal", + "Administration": "Tadbelt", + "Administrator": "Anedbal", + "Application": "Application", + "Avatar": "Avaṭar", + "Banner": "Aγarrac", + "Bold": "Tira tazurant", + "Cancel": "Annuler", + "Cancelled": "Ittwasefsex", + "Change": "Beddel", + "Change my password": "Abeddel n awal-iw uffir", + "City or region": "Tiγremt neγ tamnaḍt", + "Clear": "Sfeḍ", + "Click for more information": "Sit i wugar n telɣut", + "Close": "Mdel", + "Closed": "Yemdel", + "Comments": "Iwenniten", + "Confirmed": "Yettwaqbel", + "Contact": "Anermes", + "Country": "Country", + "Create": "Rnu", + "Create a new list": "Rnu tabdert tamaynut", + "Create an account": "Rnu amiḍan", + "Create group": "Snulfu-d agraw", + "Custom": "Udmawan", + "Custom URL": "URL yugnen", + "Dashboard": "Tafelwit n usenqed", + "Date": "Azemz", + "Date and time": "Azemz aked usrag", + "Decline": "Agwi", + "Default": "Amezwar", + "Delete": "Kkes", + "Delete Comment": "Kkes awennit", + "Delete Event": "Kkes tadyant", + "Delete account": "Kkes amiḍan", + "Delete event": "Kkes tadyant", + "Demote": "Ṣubb deg usellun", + "Description": "Asnummel", + "Disabled": "Yensa", + "Display name": "Isem n uskan", + "Domain": "Taɣult", + "Draft": "Arewway", + "Drafts": "Irewwayen", + "Duplicate": "Sisleg", + "Edit": "Édition", + "Email": "Imayl", + "Email address": "Tansa imayl", + "Email notifications": "Ilɣa s yimayl", + "Enabled": "Irmed", + "Error": "Tuccḍa", + "Error message": "Izen n tuccḍa", + "Event": "Événement", + "Events": "Tidyanin", + "Everything": "Kulec", + "Explore": "Snirem", + "Forgot your password?": "Tettuḍ awal uffir?", + "General": "Amatu", + "Glossary": "Amawal n yilɣiten", + "Go": "Ddu", + "Group name": "Isem n ugraw", + "Group settings": "Iγewwaṛen nu graw", + "Groups": "Igrawen", + "Hide replies": "Ffer tiririyin", + "Home": "Asnubeg", + "Invited": "Yettwancad", + "Italic": "Uknan", + "Language": "Tutlayt", + "Last week": "Dduṛt yezrin", + "Leave": "Eǧǧ", + "Legal": "Usḍif", + "License": "Licence", + "Load more": "Sali ugar", + "Local": "Adigan", + "Locality": "Amḍiq", + "Location": "Adig", + "Log in": "Qqen", + "Log out": "Tuffɣa", + "Login": "Aseqdac", + "Member": "Amedraw", + "Members": "Imttekkiyen", + "Message": "Izen", + "Moderator": "Amaẓrag", + "Move": "Senkez", + "Name": "Isem", + "New folder": "Akaram amaynut", + "New note": "Tazmilt tamaynut", + "New password": "Awal uffir amaynut", + "New profile": "Nouveau profil", + "Next": "Uḍfir", + "Next month": "Aggur d-iteddun", + "Next page": "Asebtar ameḍfir", + "Next week": "Dduṛt d-iteddun", + "No languages found": "Ulac tutlaying i yettwafen", + "None": "Ula d yiwen", + "Notes": "Tizmilin", + "Notifications": "Ilɣa", + "OK": "IH", + "Old password": "Awal uffir aqbuṛ", + "Open": "Ldi", + "Organizer": "Sefrek", + "Other": "Nniḍen", + "Page": "Asebtar", + "Parent folder": "Akaram agejdan", + "Participant": "Imttekki", + "Password": "Mot de passe", + "Password reset": "Awennez n wawal uffir", + "Pending": "Ittraǧu", + "Post": "Amagrad", + "Post a comment": "Aru awennit", + "Posts": "Imagraden", + "Preferences": "Ismenyifen", + "Previous": "Précédent", + "Previous page": "Asebtar ssabeq", + "Privacy Policy": "Tasertit tabaḍnit", + "Privacy policy": "Tasertit n tbaḍnit", + "Public": "Azayez", + "Publish": "Suffeɣ-d", + "Radius": "Aɣar n yiri", + "Region": "Tamnaḍt", + "Reject": "Agi", + "Rejected": "Yerrad", + "Remove": "Kkes", + "Rename": "Beddel isem", + "Reopen": "Ldi i tikkelt-nniḍen", + "Reply": "Err", + "Report": "Aneqqis", + "Report this comment": "Sillef awennit agi", + "Reports": "Ineqqisen", + "Reset my password": "Wennez awal-iw uffir", + "Resources": "Tiɣbula", + "Restricted": "Yesεa tilas", + "Role": "Tamlilt", + "Rules": "Ilugan", + "SSL/TLS": "SSL/TLS", + "Save": "Sekles", + "Save draft": "Sekles arewway", + "Search": "Nadi", + "Searching…": "Anadi…", + "Search…": "Ffeɣ seg unadi…", + "Send email": "Azen imayl", + "Settings": "Iɣewwaṛen", + "Sign in with": "Kcem s", + "Status": "État", + "Street": "Abrid", + "Submit": "Azen", + "Suspend": "Ḥbes di leεḍil", + "Suspended": "Yeḥbes", + "Tentative": "Aɛraḍ", + "Terms": "Tiwtilin", + "Text": "Aḍris", + "This month": "Aggur-a", + "This week": "Ddurt-a", + "Timezone": "Iẓdi usrig", + "Title": "Azwel", + "Today": "Ass-a", + "Tomorrow": "Azekka", + "Type": "Anaw", + "URL": "URL", + "Unknown": "Arussin", + "Update": "Leqqem", + "Update group": "Leqqem agraw", + "Updated": "Yettwalqem", + "User": "Aseqdac", + "Username": "Isem n useqdac", + "Users": "Iseqdacen", + "View all": "Sken akk", + "Warning": "Ɣur-k", + "Website": "Asmel n web", + "Welcome back!": "Anṣuf i tikkelt-nniḍen!", + "Yesterday": "Iḍelli", + "Your email": "Imayl-ik", + "[deleted]": "[yettwakkes]" +} From af396ac0727ca4d9c179d1057aaac62d91c7e05d Mon Sep 17 00:00:00 2001 From: Kristijan Tkalec Date: Sat, 3 Apr 2021 15:19:52 +0000 Subject: [PATCH 13/85] Translated using Weblate (Slovenian) Currently translated at 100.0% (981 of 981 strings) Translation: Mobilizon/Frontend Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/sl/ --- js/src/i18n/sl.json | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/js/src/i18n/sl.json b/js/src/i18n/sl.json index 278f938d4..3ab97fd3d 100644 --- a/js/src/i18n/sl.json +++ b/js/src/i18n/sl.json @@ -127,6 +127,7 @@ "Closed": "Zaprto", "Comment deleted": "Komentar je izbrisan", "Comment from @{username} reported": "Prijavljen je bil komentar uporabnika @{username}", + "Comment text can't be empty": "Besedilo komentarja ne sme biti prazno", "Comments": "Komentarji", "Comments are closed for everybody else.": "Komentarji so zaprti za vse ostale.", "Confirm my participation": "Potrdi mojo udeležbo", @@ -141,14 +142,14 @@ "Copy details to clipboard": "Kopiraj podrobnosti v odložišče", "Country": "Država", "Create": "Ustvari", - "Create a calc": "Ustvari tabelo", + "Create a calc": "Ustvari preglednico", "Create a discussion": "Ustvari razpravo", "Create a folder": "Ustvari mapo", "Create a new event": "Ustvari nov dogodek", "Create a new group": "Ustvari novo skupino", "Create a new identity": "Ustvari novo identiteto", "Create a new list": "Ustvari nov seznam", - "Create a pad": "Ustvari zapisnik", + "Create a pad": "Ustvari beležko", "Create a videoconference": "Ustvari videokonferenco", "Create an account": "Ustvari račun", "Create event": "Ustvari dogodek", @@ -156,6 +157,7 @@ "Create my event": "Ustvari moj dogodek", "Create my group": "Ustvari mojo skupino", "Create my profile": "Ustvari moj profil", + "Create new links": "Ustvari nove povezave", "Create resource": "Ustvari vir", "Create the discussion": "Ustvari razpravo", "Create to-do lists for all the tasks you need to do, assign them and set due dates.": "Ustvarite sezname opravil za vse naloge, ki jih morate opraviti, jih dodelite in določite roke.", @@ -212,8 +214,8 @@ "Domain": "Domena", "Draft": "Osnutek", "Drafts": "Osnutki", - "Due on": "Do", - "Duplicate": "Podvojiti", + "Due on": "Zapade", + "Duplicate": "Podvoji", "Edit": "Uredi", "Edit post": "Uredi objavo", "Edited {ago}": "Urejeno {ago}", @@ -423,6 +425,7 @@ "New members": "Novi člani", "New note": "Nova opomba", "New password": "Novo geslo", + "New post": "Nova objava", "New profile": "Nov profil", "Next": "Naslednje", "Next month": "Naslednji mesec", @@ -471,6 +474,7 @@ "Nothing to see here": "Tukaj ni ničesar za videti", "Notification before the event": "Obvestilo pred dogodkom", "Notification on the day of the event": "Obvestilo na dan dogodka", + "Notifications": "Obvestila", "Notifications for manually approved participations to an event": "Obvestila o ročno odobrenih udeležbah na dogodku", "Now, create your first profile:": "Ustvarite svoj prvi profil:", "Number of places": "Število mest", @@ -498,7 +502,7 @@ "Organizer": "Organizator", "Organizer notifications": "Obvestila organizatorja", "Organizers": "Organizatorji", - "Other": "Ostali", + "Other": "Ostalo", "Other notification options:": "Druge možnosti obveščanja:", "Other software may also support this.": "To lahko podpira tudi druga programska oprema.", "Otherwise this identity will just be removed from the group administrators.": "V nasprotnem primeru bo ta identiteta odstranjena samo iz skupine skrbnikov.", @@ -519,6 +523,7 @@ "Password reset": "Ponastavitev gesla", "Past events": "Pretekli dogodki", "Pending": "Na čakanju", + "Personal feeds": "Osebni viri", "Pick": "Izberi", "Pick a group": "Izberi skupino", "Pick a profile or a group": "Izberi profil ali skupino", @@ -531,7 +536,7 @@ "Please enter your password to confirm this action.": "Vnesite svoje geslo, da potrdite to dejanje.", "Please make sure the address is correct and that the page hasn't been moved.": "Prepričajte se, da je naslov pravilen in da stran ni bila premaknjena.", "Please read the {fullRules} published by {instance}'s administrators.": "Preberite {fullRules}, ki so jih objavili skrbniki vozlišča {instance}.", - "Post": "Objavi", + "Post": "Objava", "Post a comment": "Objavi komentar", "Post a reply": "Objavi odgovor", "Postal Code": "Poštna številka", @@ -544,6 +549,7 @@ "Privacy policy": "Politika zasebnosti", "Private event": "Zasebni dogodek", "Private feeds": "Zasebni viri", + "Profile feeds": "Viri profilov", "Profiles": "Profili", "Profiles and federation": "Profili in federacija", "Promote": "Povišaj", @@ -563,6 +569,7 @@ "Receive one email per request": "Na zahtevo prejmi eno e-pošto", "Redirecting to content…": "Preusmeritev na vsebino …", "Refresh profile": "Osveži profil", + "Regenerate new links": "Obnovi nove povezave", "Region": "Regija", "Register an account on {instanceName}!": "Registrirajte račun na {instanceName}!", "Register on this instance": "Registriraj se na tem vozlišču", @@ -657,6 +664,7 @@ "The event organizer manually approves participations. Since you've chosen to participate without an account, please explain why you want to participate to this event.": "Organizator dogodka ročno odobri udeležbe. Ker ste se odločili za udeležbo brez računa, pojasnite, zakaj želite sodelovati na tem dogodku.", "The event title will be ellipsed.": "Naslov dogodka bo zatemnjen.", "The event will show as attributed to this group.": "Dogodek bo prikazan kot dodeljen tej skupini.", + "The event will show as attributed to this profile.": "Dogodek bo prikazan kot dodeljen temu profilu.", "The event will show as attributed to your personal profile.": "Dogodek bo prikazan kot pripisan vašemu osebnemu profilu.", "The event will show the group as organizer.": "Na dogodku bo skupina prikazana kot organizator.", "The event {event} was created by {profile}.": "Dogodek {event} je ustvaril/a {profil}.", @@ -667,7 +675,7 @@ "The group can now only be joined with an invite.": "Skupini se lahko pridružite le z vabilom.", "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.": "Skupina bo javno navedena v rezultatih iskanja in bo morda predlagana v razdelku za raziskovanje. Na tej strani bodo prikazane samo javne informacije.", "The group's avatar was changed.": "Podoba skupine je bila spremenjena.", - "The group's banner was changed.": "Spremenjena je bila oznaka skupine.", + "The group's banner was changed.": "Naslovnica skupine je bila spremenjena.", "The group's physical address was changed.": "Fizični naslov skupine je bil spremenjen.", "The group's short description was changed.": "Kratek opis skupine je bil spremenjen.", "The instance administrator is the person or entity that runs this Mobilizon instance.": "Skrbnik vozlišča je fizična ali pravna oseba, ki vodi to Mobilizon vozlišče.", @@ -688,6 +696,8 @@ "There will be no way to recover your data.": "Vaših podatkov ne bo mogoče obnoviti.", "There's no discussions yet": "Ni še nobenih razprav", "These events may interest you": "Ti dogodki vas lahko zanimajo", + "These feeds contain event data for the events for which any of your profiles is a participant or creator. You should keep these private. You can find feeds for specific profiles on each profile edition page.": "Viri vsebujejo podatke za dogodke, pri katerih je kateri koli od vaših profilov udeleženec ali ustvarjalec. Ti viri naj bodo zasebni. Viri za posamezne profile so na voljo na strani za urejanje profila.", + "These feeds contain event data for the events for which this specific profile is a participant or creator. You should keep these private. You can find feeds for all of your profiles into your notification settings.": "Viri vsebujejo podatke za dogodke, pri katerih je ta profil udeleženec ali ustvarjalec. Ti viri naj bodo zasebni. Viri za vse svoje profile so na voljo v nastavitvah obveščanja.", "This Mobilizon instance and this event organizer allows anonymous participations, but requires validation through email confirmation.": "To Mobilizon vozlišče in organizator dogodkov omogočata anonimne udeležbe, vendar zahtevata potrditev po e-pošti.", "This URL is not supported": "Ta URL ni podprt", "This event has been cancelled.": "Ta dogodek je bil preklican.", @@ -824,6 +834,7 @@ "You invited {member}.": "Povabili ste {member}.", "You may clear all participation information for this device with the buttons below.": "Vse podatke o udeležbi za to napravo lahko počistite s spodnjimi gumbi.", "You may now close this window, or {return_to_event}.": "Zdaj lahko zaprete to okno ali {return_to_event}.", + "You may show some members as contacts.": "Nekatere člane lahko prikažete kot stike.", "You moved the folder {resource} into {new_path}.": "Premaknili ste mapo {resource} v {new_path}.", "You moved the folder {resource} to the root folder.": "Premaknili ste mapo {resource} v korensko mapo.", "You moved the resource {resource} into {new_path}.": "Vir {resource} ste premaknili v {new_path}.", @@ -855,6 +866,7 @@ "You will find here all the events you have created or of which you are a participant.": "Tu boste našli vse dogodke, ki ste jih ustvarili ali pri katerih sodelujete.", "You wish to participate to the following event": "Želite se udeležiti naslednjega dogodka", "You'll get a weekly recap every Monday for upcoming events, if you have any.": "Vsak ponedeljek boste dobili tedenski povzetek prihajajočih dogodkov.", + "You'll need to change the URLs where there were previously entered.": "Spremeniti boste morali naslove URL, ki so bili predhodno vneseni.", "You'll need to transmit the group URL so people may access the group's profile. The group won't be findable in Mobilizon's search or regular search engines.": "Morali boste poslati URL skupine, da bodo lahko ljudje dostopali do profila skupine. Skupine ne bo mogoče najti v iskalnikih Mobilizon ali običajnih iskalnikih.", "You'll receive a confirmation email.": "Prejeli boste potrditveno e-pošto.", "Your account has been successfully deleted": "Vaš račun je uspešno izbrisan", From 2238f2980ef10c9e60a2e514a1d8d0019cad3cfd Mon Sep 17 00:00:00 2001 From: deadmorose Date: Tue, 6 Apr 2021 17:30:34 +0000 Subject: [PATCH 14/85] Translated using Weblate (Russian) Currently translated at 100.0% (981 of 981 strings) Translation: Mobilizon/Frontend Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/ru/ --- js/src/i18n/ru.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/js/src/i18n/ru.json b/js/src/i18n/ru.json index 17171757e..578ef133d 100644 --- a/js/src/i18n/ru.json +++ b/js/src/i18n/ru.json @@ -55,7 +55,7 @@ "Additional comments": "Дополнительные комментарии", "Admin": "Админ", "Admin settings successfully saved.": "Настройки администратора успешно сохранены.", - "Administration": "Администрация", + "Administration": "Администрирование", "Administrator": "Администратор", "All activities": "Все действия", "All good, let's continue!": "Все хорошо, продолжим!", @@ -281,7 +281,7 @@ "From the {startDate} to the {endDate}": "От {startDate} до {endDate}", "From yourself": "От себя", "Gather ⋅ Organize ⋅ Mobilize": "Объединять ⋅ Организовывать ⋅ Мобилизовывать", - "General": "Общий", + "General": "Общая", "General information": "Общая информация", "Getting location": "Получить местоположение", "Getting there": "Как туда добраться", @@ -405,8 +405,8 @@ "Mobilizon version": "Версия Mobilizon", "Mobilizon will send you an email when the events you are attending have important changes: date and time, address, confirmation or cancellation, etc.": "Mobilizon отправит вам электронное письмо, если в мероприятиях, в которых вы участвуете, произошли важные изменения: дата и время, адрес, подтверждение или отмена и т.д.", "Moderated comments (shown after approval)": "Модерируемые комментарии (будут видны после одобрения)", - "Moderation": "На модерации", - "Moderation log": "Журнал модерации", + "Moderation": "Модерирование", + "Moderation log": "Журнал модерирования", "Moderator": "Модератор", "Move": "Переместить", "Move \"{resourceName}\"": "Переместить \"{resourceName}\"", @@ -448,7 +448,7 @@ "No languages found": "Язык не найден", "No member matches the filters": "Ни один участник не соответствует критериям", "No message": "Нет сообщений", - "No moderation logs yet": "Журналов модерации пока нет", + "No moderation logs yet": "Журналов модерования пока нет", "No more activity to display.": "Больше нет действия для отображения.", "No one is going to this event": "Никто не идёт на это мероприятие|Один человек пойдёт|{going} людей пойдут", "No open reports yet": "Пока нет открытых отчётов", @@ -541,7 +541,7 @@ "Postal Code": "Почтовый индекс", "Posts": "Публикации", "Powered by {mobilizon}. © 2018 - {date} The Mobilizon Contributors - Made with the financial support of {contributors}.": "На основе {mobilizon}. © 2018 - {date} Участники Mobilizon - Создан благодаря финансовой поддержке {contributors}.", - "Preferences": "Предпочтения", + "Preferences": "Персональные настройки", "Previous": "Предыдущий", "Previous page": "Предыдущая страница", "Privacy Policy": "Политика конфиденциальности", @@ -873,7 +873,7 @@ "Your account is being validated": "Ваша учетная запись проверяется", "Your account is nearly ready, {username}": "Ваш аккаунт почти готов, {username}", "Your city or region and the radius will only be used to suggest you events nearby. The event radius will consider the administrative center of the area.": "Ваш город, регион или область будут использоваться только для рекомендации вам ближайших мероприятий. Радиус мероприятия считается относительно административного центра области.", - "Your current email is {email}. You use it to log in.": "Ваш текущий адрес электронной почты{email}. Вы используете его для входа в систему.", + "Your current email is {email}. You use it to log in.": "Ваш адрес электронной почты {email}. Вы используете его для входа в систему.", "Your email": "Ваш адрес электронной почты", "Your email address was automatically set based on your {provider} account.": "Ваш адрес электронной почты был автоматически установлен на основе вашей учётной записи {provider}.", "Your email has been changed": "Ваш адрес электронной почты был изменен", From defb09aef1a539071817a290d8c4f994684cf34c Mon Sep 17 00:00:00 2001 From: deadmorose Date: Wed, 7 Apr 2021 12:44:00 +0000 Subject: [PATCH 15/85] Translated using Weblate (Russian) Currently translated at 100.0% (981 of 981 strings) Translation: Mobilizon/Frontend Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/ru/ --- js/src/i18n/ru.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/i18n/ru.json b/js/src/i18n/ru.json index 578ef133d..d8815fe62 100644 --- a/js/src/i18n/ru.json +++ b/js/src/i18n/ru.json @@ -450,7 +450,7 @@ "No message": "Нет сообщений", "No moderation logs yet": "Журналов модерования пока нет", "No more activity to display.": "Больше нет действия для отображения.", - "No one is going to this event": "Никто не идёт на это мероприятие|Один человек пойдёт|{going} людей пойдут", + "No one is going to this event": "Пока никто не участвует|Один человек пойдёт|{going} людей пойдут", "No open reports yet": "Пока нет открытых отчётов", "No participant matches the filters": "Ни один участник не соответствует критериям", "No participant to approve|Approve participant|Approve {number} participants": "Нет участников для одобрения | Принять участника | Принять {number} участников", From b22c12da0d31ca53f323bfff36807ceb64ab3928 Mon Sep 17 00:00:00 2001 From: deadmorose Date: Wed, 7 Apr 2021 12:53:08 +0000 Subject: [PATCH 16/85] Translated using Weblate (Russian) Currently translated at 100.0% (981 of 981 strings) Translation: Mobilizon/Frontend Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/ru/ --- js/src/i18n/ru.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/src/i18n/ru.json b/js/src/i18n/ru.json index d8815fe62..e0bbdbe76 100644 --- a/js/src/i18n/ru.json +++ b/js/src/i18n/ru.json @@ -209,7 +209,7 @@ "Displayed on homepage and meta tags. Describe what Mobilizon is and what makes this instance special in a single paragraph.": "Отображается на главной странице и в метатегах. Опишите в одном абзаце, что такое Mobilizon и что делает этот узел особенным.", "Do not receive any mail": "Не получать электронные письма", "Do you wish to {create_event} or {explore_events}?": "Вы хотите {create_event} или {explore_events}?", - "Do you wish to {create_group} or {explore_groups}?": "Вы хотите {create_group} или {explore_groups}}?", + "Do you wish to {create_group} or {explore_groups}?": "Вы хотите {create_group} или {explore_groups}?", "Domain": "Домен", "Draft": "Черновик", "Drafts": "Черновики", @@ -909,7 +909,7 @@ "default Mobilizon terms": "условия использования Mobilizon по умолчанию", "e.g. 10 Rue Jangot": "например: Садовая 10", "explore the events": "просмотреть мероприятия", - "explore the groups": "просмотреть группы", + "explore the groups": "посмотреть существующие группы", "full rules": "полные правила", "iCal Feed": "iCal лента", "instance rules": "правила узла", From c7ca9bd805c0ac099635d737b3cdd0d888a5dcbd Mon Sep 17 00:00:00 2001 From: deadmorose Date: Wed, 7 Apr 2021 13:03:03 +0000 Subject: [PATCH 17/85] Translated using Weblate (Russian) Currently translated at 100.0% (981 of 981 strings) Translation: Mobilizon/Frontend Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/ru/ --- js/src/i18n/ru.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/i18n/ru.json b/js/src/i18n/ru.json index e0bbdbe76..fa43c2542 100644 --- a/js/src/i18n/ru.json +++ b/js/src/i18n/ru.json @@ -909,7 +909,7 @@ "default Mobilizon terms": "условия использования Mobilizon по умолчанию", "e.g. 10 Rue Jangot": "например: Садовая 10", "explore the events": "просмотреть мероприятия", - "explore the groups": "посмотреть существующие группы", + "explore the groups": "посмотреть группы", "full rules": "полные правила", "iCal Feed": "iCal лента", "instance rules": "правила узла", From 523d2b3e4f5fba45e636fb86b0c09dbf61afacef Mon Sep 17 00:00:00 2001 From: deadmorose Date: Wed, 7 Apr 2021 13:08:59 +0000 Subject: [PATCH 18/85] Translated using Weblate (Russian) Currently translated at 100.0% (981 of 981 strings) Translation: Mobilizon/Frontend Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/ru/ --- js/src/i18n/ru.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/i18n/ru.json b/js/src/i18n/ru.json index fa43c2542..dffd0c373 100644 --- a/js/src/i18n/ru.json +++ b/js/src/i18n/ru.json @@ -585,7 +585,7 @@ "Rename resource": "Переименовать ресурс", "Reopen": "Открыть заново", "Reply": "Ответ", - "Report": "Отчёт", + "Report": "Жалоба", "Report #{reportNumber}": "Отчёт #{reportNumber}", "Report this comment": "Пожаловаться на этот комментарий", "Report this event": "Пожаловаться на это мероприятие", From 25f365c3940430769c7a15a97ba9019106239f73 Mon Sep 17 00:00:00 2001 From: deadmorose Date: Wed, 7 Apr 2021 15:34:39 +0000 Subject: [PATCH 19/85] Translated using Weblate (Russian) Currently translated at 100.0% (981 of 981 strings) Translation: Mobilizon/Frontend Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/ru/ --- js/src/i18n/ru.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/src/i18n/ru.json b/js/src/i18n/ru.json index dffd0c373..fba225915 100644 --- a/js/src/i18n/ru.json +++ b/js/src/i18n/ru.json @@ -640,8 +640,8 @@ "Status": "Статус", "Street": "Улица", "Submit": "Отправить", - "Suspend": "Приостановить", - "Suspend group": "Приостановить группу", + "Suspend": "Заблокировать", + "Suspend group": "Заблокировать группу", "Suspended": "Приостановлен", "Task lists": "Списки задач", "Technical details": "Технические подробности", From 356f69cef2ff21cf232df1fd1221b9d625bf3f57 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Wed, 31 Mar 2021 10:06:13 +0200 Subject: [PATCH 20/85] Fix accessing a discussion without being a member Signed-off-by: Thomas Citharel --- js/src/views/Discussions/Discussion.vue | 27 ++++++++++++++++++++----- lib/graphql/resolvers/discussion.ex | 1 + 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/js/src/views/Discussions/Discussion.vue b/js/src/views/Discussions/Discussion.vue index 56618e6c2..da3b1e9f3 100644 --- a/js/src/views/Discussions/Discussion.vue +++ b/js/src/views/Discussions/Discussion.vue @@ -18,7 +18,7 @@ }" >{{ discussion.actor.name }} - +
  • {{ $t("Discussions") }} - +
  • + + {{ error }} +

    @@ -60,8 +63,16 @@

    - -
    + +
    {{ $t("Fetch more") }} - + @@ -217,6 +228,7 @@ export default class discussion extends mixins(GroupMixin) { RouteName = RouteName; usernameWithDomain = usernameWithDomain; + error: string | null = null; async reply(): Promise { if (this.newComment === "") return; @@ -422,6 +434,11 @@ export default class discussion extends mixins(GroupMixin) { if (errors[0].message.includes("No such discussion")) { await this.$router.push({ name: RouteName.PAGE_NOT_FOUND }); } + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + if (errors[0].code === "unauthorized") { + this.error = errors[0].message; + } } mounted(): void { diff --git a/lib/graphql/resolvers/discussion.ex b/lib/graphql/resolvers/discussion.ex index 328b0d718..fe7ba3c02 100644 --- a/lib/graphql/resolvers/discussion.ex +++ b/lib/graphql/resolvers/discussion.ex @@ -60,6 +60,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Discussion do {:ok, discussion} else nil -> {:error, dgettext("errors", "Discussion not found")} + {:member, false} -> {:error, :unauthorized} end end From 569a4b635640b318bc656d238d5ffeea52c2b499 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Wed, 31 Mar 2021 10:06:36 +0200 Subject: [PATCH 21/85] Fix reloading the members list after excluding a member Signed-off-by: Thomas Citharel --- js/src/views/Group/GroupMembers.vue | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/js/src/views/Group/GroupMembers.vue b/js/src/views/Group/GroupMembers.vue index 0911e762b..6e4aa5665 100644 --- a/js/src/views/Group/GroupMembers.vue +++ b/js/src/views/Group/GroupMembers.vue @@ -376,6 +376,12 @@ export default class GroupMembers extends mixins(GroupMixin) { async removeMember(memberId: string): Promise { const { roles, MEMBERS_PER_PAGE, group, page } = this; + const variables = { + name: usernameWithDomain(group), + page, + limit: MEMBERS_PER_PAGE, + roles, + }; try { await this.$apollo.mutate<{ removeMember: IMember }>({ mutation: REMOVE_MEMBER, @@ -386,14 +392,7 @@ export default class GroupMembers extends mixins(GroupMixin) { refetchQueries: [ { query: GROUP_MEMBERS, - variables() { - return { - name: usernameWithDomain(group), - page, - limit: MEMBERS_PER_PAGE, - roles, - }; - }, + variables, }, ], }); From c4f8fe0fe8b9a8a521074f138a7539e5a0f57f17 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Wed, 31 Mar 2021 14:51:36 +0200 Subject: [PATCH 22/85] Fix comments closed message when not connected Signed-off-by: Thomas Citharel --- js/src/components/Comment/CommentTree.vue | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/js/src/components/Comment/CommentTree.vue b/js/src/components/Comment/CommentTree.vue index d845ebc54..2e6b1db65 100644 --- a/js/src/components/Comment/CommentTree.vue +++ b/js/src/components/Comment/CommentTree.vue @@ -39,7 +39,7 @@
    - {{ + {{ $t("The organiser has chosen to close comments.") }}

    -

    +
    {{ $t("No comments yet") }}
    @@ -350,11 +350,15 @@ export default class CommentTree extends Vue { } get isAbleToComment(): boolean { - if (this.currentActor?.id) { + if (this.isConnected) { return this.areCommentsClosed || this.isEventOrganiser; } return false; } + + get isConnected(): boolean { + return this.currentActor?.id != undefined; + } } From 386dbbb3a62ac9f499fa56bf22f9283315c85a3b Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Wed, 31 Mar 2021 17:51:09 +0200 Subject: [PATCH 23/85] Fix path issue when fetching favicon for resources Signed-off-by: Thomas Citharel --- lib/service/rich_media/favicon.ex | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/service/rich_media/favicon.ex b/lib/service/rich_media/favicon.ex index 12768b2de..ddbbb2691 100644 --- a/lib/service/rich_media/favicon.ex +++ b/lib/service/rich_media/favicon.ex @@ -60,12 +60,16 @@ defmodule Mobilizon.Service.RichMedia.Favicon do uri = URI.parse(url) cond do - is_nil(image_uri.host) -> "#{uri.scheme}://#{uri.host}#{path}" + is_nil(image_uri.host) -> "#{uri.scheme}://#{uri.host}#{correct_path(path)}" is_nil(image_uri.scheme) -> "#{uri.scheme}:#{path}" true -> path end end + # Sometimes paths have "/" in front, sometimes not + defp correct_path("/" <> _ = path), do: path + defp correct_path(path), do: "/#{path}" + @spec find_favicon_link_tag(String.t()) :: {:ok, tuple()} | {:error, any()} defp find_favicon_link_tag(html) do with {:ok, html} <- Floki.parse_document(html), From fa99c09c57d348c3b6039364a6756ee1f6ae7ad3 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Wed, 31 Mar 2021 18:32:37 +0200 Subject: [PATCH 24/85] Use tasks to process refreshing elements Signed-off-by: Thomas Citharel --- lib/federation/activity_pub/refresher.ex | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/federation/activity_pub/refresher.ex b/lib/federation/activity_pub/refresher.ex index 57f67ba09..f28dd623b 100644 --- a/lib/federation/activity_pub/refresher.ex +++ b/lib/federation/activity_pub/refresher.ex @@ -114,7 +114,10 @@ defmodule Mobilizon.Federation.ActivityPub.Refresher do Logger.debug(inspect(items)) - Enum.each(items, &handling_element/1) + items + |> Enum.map(fn item -> Task.async(fn -> handling_element(item) end) end) + |> Task.await_many() + Logger.debug("Finished processing a collection") :ok end From ca14745d40ae3e59af15b2accff4f6bc63e9a3bb Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Thu, 8 Apr 2021 09:53:40 +0200 Subject: [PATCH 25/85] Bump deps Signed-off-by: Thomas Citharel --- js/package.json | 2 +- js/yarn.lock | 388 +++++++++++++++++++++++------------------------- mix.exs | 2 +- mix.lock | 32 ++-- 4 files changed, 205 insertions(+), 219 deletions(-) diff --git a/js/package.json b/js/package.json index 57cd063e7..56379822f 100644 --- a/js/package.json +++ b/js/package.json @@ -83,7 +83,7 @@ "eslint-plugin-prettier": "^3.1.3", "eslint-plugin-vue": "^7.0.0", "jest-junit": "^12.0.0", - "mock-apollo-client": "^0.5", + "mock-apollo-client": "^0.6", "prettier": "2.2.1", "prettier-eslint": "^12.0.0", "sass": "^1.29.0", diff --git a/js/yarn.lock b/js/yarn.lock index cdd808507..cdc2a080d 100644 --- a/js/yarn.lock +++ b/js/yarn.lock @@ -28,9 +28,9 @@ zen-observable "0.8.11" "@apollo/client@^3.0.0": - version "3.3.13" - resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.3.13.tgz#0aadde13b80ce129d1261161413a9de2b0dec70e" - integrity sha512-usiVmXiOq0J/GpyIOIhlF8ItHpiPJObC7zoxLYPoOYj3G3OB0hCIcUKs3aTJ3ATW7u8QxvYgRaJg72NN7E1WOg== + version "3.3.14" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.3.14.tgz#b077f42e17941dbf4c62c4f41bf83c0828872d09" + integrity sha512-z7YwMvF9grmpWUG+26e3gPcBAOA/r/Ci5gwK7JVm3bGYG9kKqG8MF6sMXEbuwTsFseE4duSp0icJ6tdzxJhhlA== dependencies: "@graphql-typed-document-node/core" "^3.0.0" "@types/zen-observable" "^0.8.0" @@ -66,24 +66,23 @@ integrity sha512-3eJJ841uKxeV8dcN/2yGEUy+RfgQspPEgQat85umsE1rotuquQ2AbIub4S6j7c50a2d+4myc+zSlnXeIHrOnhQ== "@babel/core@^7.1.0", "@babel/core@^7.11.0", "@babel/core@^7.8.4": - version "7.13.13" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.13.13.tgz#bc44c4a2be2288ec4ddf56b66fc718019c76ac29" - integrity sha512-1xEs9jZAyKIouOoCmpsgk/I26PoKyvzQ2ixdRpRzfbcp1fL+ozw7TUgdDgwonbTovqRaTfRh50IXuw4QrWO0GA== + version "7.13.14" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.13.14.tgz#8e46ebbaca460a63497c797e574038ab04ae6d06" + integrity sha512-wZso/vyF4ki0l0znlgM4inxbdrUvCb+cVz8grxDq+6C9k6qbqoIJteQOKicaKjCipU3ISV+XedCqpL2RJJVehA== dependencies: "@babel/code-frame" "^7.12.13" "@babel/generator" "^7.13.9" "@babel/helper-compilation-targets" "^7.13.13" - "@babel/helper-module-transforms" "^7.13.12" + "@babel/helper-module-transforms" "^7.13.14" "@babel/helpers" "^7.13.10" "@babel/parser" "^7.13.13" "@babel/template" "^7.12.13" "@babel/traverse" "^7.13.13" - "@babel/types" "^7.13.13" + "@babel/types" "^7.13.14" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.1.2" - lodash "^4.17.19" semver "^6.3.0" source-map "^0.5.0" @@ -199,10 +198,10 @@ dependencies: "@babel/types" "^7.13.12" -"@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.13.12": - version "7.13.12" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.13.12.tgz#600e58350490828d82282631a1422268e982ba96" - integrity sha512-7zVQqMO3V+K4JOOj40kxiCrMf6xlQAkewBB0eu2b03OO/Q21ZutOzjpfD79A5gtE/2OWi1nv625MrDlGlkbknQ== +"@babel/helper-module-transforms@^7.13.0", "@babel/helper-module-transforms@^7.13.14": + version "7.13.14" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz#e600652ba48ccb1641775413cb32cfa4e8b495ef" + integrity sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g== dependencies: "@babel/helper-module-imports" "^7.13.12" "@babel/helper-replace-supers" "^7.13.12" @@ -210,8 +209,8 @@ "@babel/helper-split-export-declaration" "^7.12.13" "@babel/helper-validator-identifier" "^7.12.11" "@babel/template" "^7.12.13" - "@babel/traverse" "^7.13.0" - "@babel/types" "^7.13.12" + "@babel/traverse" "^7.13.13" + "@babel/types" "^7.13.14" "@babel/helper-optimise-call-expression@^7.12.13": version "7.12.13" @@ -916,10 +915,10 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.13", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4": - version "7.13.13" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.13.tgz#dcd8b815b38f537a3697ce84c8e3cc62197df96f" - integrity sha512-kt+EpC6qDfIaqlP+DIbIJOclYy/A1YXs9dAf/ljbi+39Bcbc073H6jKVpXEr/EoIh5anGn5xq/yRVzKl+uIc9w== +"@babel/types@^7.0.0", "@babel/types@^7.12.1", "@babel/types@^7.12.13", "@babel/types@^7.13.0", "@babel/types@^7.13.12", "@babel/types@^7.13.13", "@babel/types@^7.13.14", "@babel/types@^7.3.0", "@babel/types@^7.4.0", "@babel/types@^7.4.4": + version "7.13.14" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.13.14.tgz#c35a4abb15c7cd45a2746d78ab328e362cbace0d" + integrity sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ== dependencies: "@babel/helper-validator-identifier" "^7.12.11" lodash "^4.17.19" @@ -1240,9 +1239,9 @@ fastq "^1.6.0" "@popperjs/core@^2.8.3": - version "2.9.1" - resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.9.1.tgz#7f554e7368c9ab679a11f4a042ca17149d70cf12" - integrity sha512-DvJbbn3dUgMxDnJLH+RZQPnXak1h4ZVYQ7CWiFWjQwBFkVajT4rfw2PdpHLTSTwxrYfnoEXkuBiwkDm6tPMQeA== + version "2.9.2" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.9.2.tgz#adea7b6953cbb34651766b0548468e743c6a2353" + integrity sha512-VZMYa7+fXHdwIq1TDhSXoVmSPEGM/aa+6Aiq3nVVJ9bXr24zScr+NlKFKC3iPljA7ho/GAZr+d2jOf5GIRC30Q== "@rollup/plugin-node-resolve@^7.1.1": version "7.1.3" @@ -1692,12 +1691,12 @@ integrity sha512-HrCIVMLjE1MOozVoD86622S7aunluLb2PJdPfb3nYiEtohm8mIB/vyv0Fd37AdeMFrTUQXEunw78YloMA3Qilg== "@typescript-eslint/eslint-plugin@^4.14.1": - version "4.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.19.0.tgz#56f8da9ee118fe9763af34d6a526967234f6a7f0" - integrity sha512-CRQNQ0mC2Pa7VLwKFbrGVTArfdVDdefS+gTw0oC98vSI98IX5A8EVH4BzJ2FOB0YlCmm8Im36Elad/Jgtvveaw== + version "4.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.21.0.tgz#3fce2bfa76d95c00ac4f33dff369cb593aab8878" + integrity sha512-FPUyCPKZbVGexmbCFI3EQHzCZdy2/5f+jv6k2EDljGdXSRc0cKvbndd2nHZkSLqCNOPk0jB6lGzwIkglXcYVsQ== dependencies: - "@typescript-eslint/experimental-utils" "4.19.0" - "@typescript-eslint/scope-manager" "4.19.0" + "@typescript-eslint/experimental-utils" "4.21.0" + "@typescript-eslint/scope-manager" "4.21.0" debug "^4.1.1" functional-red-black-tree "^1.0.1" lodash "^4.17.15" @@ -1716,15 +1715,15 @@ eslint-scope "^5.0.0" eslint-utils "^2.0.0" -"@typescript-eslint/experimental-utils@4.19.0": - version "4.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.19.0.tgz#9ca379919906dc72cb0fcd817d6cb5aa2d2054c6" - integrity sha512-9/23F1nnyzbHKuoTqFN1iXwN3bvOm/PRIXSBR3qFAYotK/0LveEOHr5JT1WZSzcD6BESl8kPOG3OoDRKO84bHA== +"@typescript-eslint/experimental-utils@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.21.0.tgz#0b0bb7c15d379140a660c003bdbafa71ae9134b6" + integrity sha512-cEbgosW/tUFvKmkg3cU7LBoZhvUs+ZPVM9alb25XvR0dal4qHL3SiUqHNrzoWSxaXA9gsifrYrS1xdDV6w/gIA== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/scope-manager" "4.19.0" - "@typescript-eslint/types" "4.19.0" - "@typescript-eslint/typescript-estree" "4.19.0" + "@typescript-eslint/scope-manager" "4.21.0" + "@typescript-eslint/types" "4.21.0" + "@typescript-eslint/typescript-estree" "4.21.0" eslint-scope "^5.0.0" eslint-utils "^2.0.0" @@ -1740,32 +1739,32 @@ eslint-visitor-keys "^1.1.0" "@typescript-eslint/parser@^4.14.1": - version "4.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.19.0.tgz#4ae77513b39f164f1751f21f348d2e6cb2d11128" - integrity sha512-/uabZjo2ZZhm66rdAu21HA8nQebl3lAIDcybUoOxoI7VbZBYavLIwtOOmykKCJy+Xq6Vw6ugkiwn8Js7D6wieA== + version "4.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.21.0.tgz#a227fc2af4001668c3e3f7415d4feee5093894c1" + integrity sha512-eyNf7QmE5O/l1smaQgN0Lj2M/1jOuNg2NrBm1dqqQN0sVngTLyw8tdCbih96ixlhbF1oINoN8fDCyEH9SjLeIA== dependencies: - "@typescript-eslint/scope-manager" "4.19.0" - "@typescript-eslint/types" "4.19.0" - "@typescript-eslint/typescript-estree" "4.19.0" + "@typescript-eslint/scope-manager" "4.21.0" + "@typescript-eslint/types" "4.21.0" + "@typescript-eslint/typescript-estree" "4.21.0" debug "^4.1.1" -"@typescript-eslint/scope-manager@4.19.0": - version "4.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.19.0.tgz#5e0b49eca4df7684205d957c9856f4e720717a4f" - integrity sha512-GGy4Ba/hLXwJXygkXqMzduqOMc+Na6LrJTZXJWVhRrSuZeXmu8TAnniQVKgj8uTRKe4igO2ysYzH+Np879G75g== +"@typescript-eslint/scope-manager@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.21.0.tgz#c81b661c4b8af1ec0c010d847a8f9ab76ab95b4d" + integrity sha512-kfOjF0w1Ix7+a5T1knOw00f7uAP9Gx44+OEsNQi0PvvTPLYeXJlsCJ4tYnDj5PQEYfpcgOH5yBlw7K+UEI9Agw== dependencies: - "@typescript-eslint/types" "4.19.0" - "@typescript-eslint/visitor-keys" "4.19.0" + "@typescript-eslint/types" "4.21.0" + "@typescript-eslint/visitor-keys" "4.21.0" "@typescript-eslint/types@3.10.1": version "3.10.1" resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-3.10.1.tgz#1d7463fa7c32d8a23ab508a803ca2fe26e758727" integrity sha512-+3+FCUJIahE9q0lDi1WleYzjCwJs5hIsbugIgnbB+dSCYUxl8L6PwmsyOPFZde2hc1DlTo/xnkOgiTLSyAbHiQ== -"@typescript-eslint/types@4.19.0": - version "4.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.19.0.tgz#5181d5d2afd02e5b8f149ebb37ffc8bd7b07a568" - integrity sha512-A4iAlexVvd4IBsSTNxdvdepW0D4uR/fwxDrKUa+iEY9UWvGREu2ZyB8ylTENM1SH8F7bVC9ac9+si3LWNxcBuA== +"@typescript-eslint/types@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.21.0.tgz#abdc3463bda5d31156984fa5bc316789c960edef" + integrity sha512-+OQaupjGVVc8iXbt6M1oZMwyKQNehAfLYJJ3SdvnofK2qcjfor9pEM62rVjBknhowTkh+2HF+/KdRAc/wGBN2w== "@typescript-eslint/typescript-estree@3.10.1": version "3.10.1" @@ -1781,13 +1780,13 @@ semver "^7.3.2" tsutils "^3.17.1" -"@typescript-eslint/typescript-estree@4.19.0": - version "4.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.19.0.tgz#8a709ffa400284ab72df33376df085e2e2f61147" - integrity sha512-3xqArJ/A62smaQYRv2ZFyTA+XxGGWmlDYrsfZG68zJeNbeqRScnhf81rUVa6QG4UgzHnXw5VnMT5cg75dQGDkA== +"@typescript-eslint/typescript-estree@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.21.0.tgz#3817bd91857beeaeff90f69f1f112ea58d350b0a" + integrity sha512-ZD3M7yLaVGVYLw4nkkoGKumb7Rog7QID9YOWobFDMQKNl+vPxqVIW/uDk+MDeGc+OHcoG2nJ2HphwiPNajKw3w== dependencies: - "@typescript-eslint/types" "4.19.0" - "@typescript-eslint/visitor-keys" "4.19.0" + "@typescript-eslint/types" "4.21.0" + "@typescript-eslint/visitor-keys" "4.21.0" debug "^4.1.1" globby "^11.0.1" is-glob "^4.0.1" @@ -1801,12 +1800,12 @@ dependencies: eslint-visitor-keys "^1.1.0" -"@typescript-eslint/visitor-keys@4.19.0": - version "4.19.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.19.0.tgz#cbea35109cbd9b26e597644556be4546465d8f7f" - integrity sha512-aGPS6kz//j7XLSlgpzU2SeTqHPsmRYxFztj2vPuMMFJXZudpRSehE3WCV+BaxwZFvfAqMoSd86TEuM0PQ59E/A== +"@typescript-eslint/visitor-keys@4.21.0": + version "4.21.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.21.0.tgz#990a9acdc124331f5863c2cf21c88ba65233cd8d" + integrity sha512-dH22dROWGi5Z6p+Igc8bLVLmwy7vEe8r+8c+raPQU0LxgogPUrRAtRGtvBWmlr9waTu3n+QLt/qrS/hWzk1x5w== dependencies: - "@typescript-eslint/types" "4.19.0" + "@typescript-eslint/types" "4.21.0" eslint-visitor-keys "^2.0.0" "@vue/babel-helper-vue-jsx-merge-props@^1.2.1": @@ -1820,9 +1819,9 @@ integrity sha512-hz4R8tS5jMn8lDq6iD+yWL6XNB699pGIVLk7WSJnn1dbpjaazsjZQkieJoRX6gW5zpYSCFqQ7jUquPNY65tQYA== "@vue/babel-plugin-jsx@^1.0.3": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.0.3.tgz#ad5ee86ebc9fc40900add9914534e223c719eace" - integrity sha512-+52ZQFmrM0yh61dQlgwQlfHZXmYbswbQEL25SOSt9QkjegAdfIGu87oELw0l8H6cuJYazZCiNjPR9eU++ZIbxg== + version "1.0.4" + resolved "https://registry.yarnpkg.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.0.4.tgz#077826ca0eccd77cb6ad698254f5821ded5c5189" + integrity sha512-Vu5gsabUdsiWc4vQarg46xWJGs8pMEJyyMQAKA1vO+F4+aR4/jaxWxPCOvZ7XvVyy+ecSbwQp/qIyDVje360UQ== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/plugin-syntax-jsx" "^7.0.0" @@ -2441,9 +2440,9 @@ ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.4, ajv uri-js "^4.2.2" ajv@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.0.1.tgz#dac101898a87f8ebb57fea69617e8096523c628c" - integrity sha512-46ZA4TalFcLLqX1dEU3dhdY38wAtDydJ4e7QQTVekLUTzXkb1LfqU6VOBXC/a9wiv4T094WURqJH6ZitF92Kqw== + version "8.0.5" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.0.5.tgz#f07d6fdeffcdbb80485570ce3f1bc845fcc812b9" + integrity sha512-RkiLa/AeJx7+9OvniQ/qeWu0w74A8DiPPBclQ6ji3ZQkv5KamO+QGpqmi7O4JIw3rHGUXZ6CoP9tsAkn3gyazg== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -2540,9 +2539,9 @@ anymatch@^2.0.0: normalize-path "^2.1.1" anymatch@~3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz#c55ecf02185e2469259399310c173ce31233b142" - integrity sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg== + version "3.1.2" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.2.tgz#c0557c096af32f106198f4f4e2a383537e378716" + integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg== dependencies: normalize-path "^3.0.0" picomatch "^2.0.4" @@ -3030,9 +3029,9 @@ babylon@^6.18.0: integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ== balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== base64-js@^1.0.2: version "1.5.1" @@ -3294,11 +3293,11 @@ bser@2.1.1: node-int64 "^0.4.0" buefy@^0.9.0: - version "0.9.4" - resolved "https://registry.yarnpkg.com/buefy/-/buefy-0.9.4.tgz#01e2e2cf1e61b914239a5f2570e5ea8ed6786927" - integrity sha512-LRSIYVNrKTPQhmNRegASkntX+ObtZ7aSSA/3cybDKXzGtPNy8g8cl2tp79Rl8/LBVH/KkRT5rmmzJ21nxz9IcQ== + version "0.9.6" + resolved "https://registry.yarnpkg.com/buefy/-/buefy-0.9.6.tgz#83c026c4a6f8fdcab80ded59181efc20873e3a99" + integrity sha512-qoYtbTf78xvC5fcRsuUKqUizJCAk2rg6LiAzON8X1G0GTsHkCWRWBHsJmU/jk1/6B+TQ10pSGkQgB+OLrREeXg== dependencies: - bulma "0.9.1" + bulma "0.9.2" buffer-crc32@~0.2.3: version "0.2.13" @@ -3354,10 +3353,10 @@ bulma-divider@^0.2.0: resolved "https://registry.yarnpkg.com/bulma-divider/-/bulma-divider-0.2.0.tgz#a9b4d9fe8b270c7cb7573023c575062bc62616f3" integrity sha512-REe3k56GECRfDaqFjC8cwLhV4RxXmV0RubuzDJqwior9wlJcdHlN0qfW0tvUX+qphikaTQegIeRuhjRIAqkjkw== -bulma@0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/bulma/-/bulma-0.9.1.tgz#2bf0e25062a22166db5c92e8c3dcb4605ab040d8" - integrity sha512-LSF69OumXg2HSKl2+rN0/OEXJy7WFEb681wtBlNS/ulJYR27J3rORHibdXZ6GVb/vyUzzYK/Arjyh56wjbFedA== +bulma@0.9.2: + version "0.9.2" + resolved "https://registry.yarnpkg.com/bulma/-/bulma-0.9.2.tgz#340011e119c605f19b8ca886bfea595f1deaf23c" + integrity sha512-e14EF+3VSZ488yL/lJH0tR8mFWiEQVCMi/BQUMi2TGMBOk+zrDg4wryuwm/+dRSHJw0gMawp2tsW7X1JYUCE3A== bytes@3.0.0: version "3.0.0" @@ -3519,9 +3518,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001181: - version "1.0.30001204" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001204.tgz#256c85709a348ec4d175e847a3b515c66e79f2aa" - integrity sha512-JUdjWpcxfJ9IPamy2f5JaRDCaqJOxDzOSKtbdx4rH9VivMd1vIzoPumsJa9LoMIi4Fx2BV2KZOxWhNkBjaYivQ== + version "1.0.30001208" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001208.tgz#a999014a35cebd4f98c405930a057a0d75352eb9" + integrity sha512-OE5UE4+nBOro8Dyvv0lfx+SRtfVIOM9uhKqFmJeUbGriqhhStgp1A0OyBpgy3OUF8AhYCT+PVwPC1gMl2ZcQMA== capture-exit@^2.0.0: version "2.0.0" @@ -4034,9 +4033,9 @@ copy-webpack-plugin@^5.1.1: webpack-log "^2.0.0" core-js-compat@^3.6.5, core-js-compat@^3.8.1, core-js-compat@^3.9.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.9.1.tgz#4e572acfe90aff69d76d8c37759d21a5c59bb455" - integrity sha512-jXAirMQxrkbiiLsCx9bQPJFA6llDadKMpYrBJQJ3/c4/vsPP/fAf29h24tviRlvwUL6AmY5CHLu2GvjuYviQqA== + version "3.10.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.10.1.tgz#62183a3a77ceeffcc420d907a3e6fc67d9b27f1c" + integrity sha512-ZHQTdTPkqvw2CeHiZC970NNJcnwzT6YIueDMASKt+p3WbZsLXOcoD392SkcWhkC0wBBHhlfhqGKKsNCQUozYtg== dependencies: browserslist "^4.16.3" semver "7.0.0" @@ -4052,9 +4051,9 @@ core-js@^2.4.0, core-js@^2.5.0: integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ== core-js@^3.6.4, core-js@^3.6.5: - version "3.9.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.9.1.tgz#cec8de593db8eb2a85ffb0dbdeb312cb6e5460ae" - integrity sha512-gSjRvzkxQc1zjM/5paAmL4idJBFzuJoo+jDjF1tStYFMV2ERfD02HhahhCGXUyHxQRG4yFKVSdO6g62eoRMcDg== + version "3.10.1" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.10.1.tgz#e683963978b6806dcc6c0a4a8bd4ab0bdaf3f21a" + integrity sha512-pwCxEXnj27XG47mu7SXAwhLP3L5CrlvCB91ANUkIz40P27kUcvNfSdvyZJ9CLHiVoKSp+TTChMQMSKQEH/IQxA== core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -4220,9 +4219,9 @@ css-tree@1.0.0-alpha.37: source-map "^0.6.1" css-tree@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.2.tgz#9ae393b5dafd7dae8a622475caec78d3d8fbd7b5" - integrity sha512-wCoWush5Aeo48GLhfHPbmvZs59Z+M7k5+B1xDnXbdWNcEF423DoFdqSWE0PM5aNk5nI5cp1q7ms36zGApY/sKQ== + version "1.1.3" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== dependencies: mdn-data "2.0.14" source-map "^0.6.1" @@ -4247,10 +4246,10 @@ cssesc@^3.0.0: resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== -cssnano-preset-default@^4.0.0, cssnano-preset-default@^4.0.7: - version "4.0.7" - resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz#51ec662ccfca0f88b396dcd9679cdb931be17f76" - integrity sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA== +cssnano-preset-default@^4.0.0, cssnano-preset-default@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.8.tgz#920622b1fc1e95a34e8838203f1397a504f2d3ff" + integrity sha512-LdAyHuq+VRyeVREFmuxUZR1TXjQm8QQU/ktoo/x7bz+SdOge1YKc5eMN6pRW7YWBmyq59CqYba1dJ5cUukEjLQ== dependencies: css-declaration-sorter "^4.0.1" cssnano-util-raw-cache "^4.0.1" @@ -4280,7 +4279,7 @@ cssnano-preset-default@^4.0.0, cssnano-preset-default@^4.0.7: postcss-ordered-values "^4.1.2" postcss-reduce-initial "^4.0.3" postcss-reduce-transforms "^4.0.2" - postcss-svgo "^4.0.2" + postcss-svgo "^4.0.3" postcss-unique-selectors "^4.0.1" cssnano-util-get-arguments@^4.0.0: @@ -4306,12 +4305,12 @@ cssnano-util-same-parent@^4.0.0: integrity sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q== cssnano@^4.0.0, cssnano@^4.1.10: - version "4.1.10" - resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz#0ac41f0b13d13d465487e111b778d42da631b8b2" - integrity sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ== + version "4.1.11" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.11.tgz#c7b5f5b81da269cb1fd982cb960c1200910c9a99" + integrity sha512-6gZm2htn7xIPJOHY824ERgj8cNPgPxyCSnkXc4v7YvNW+TdVfzgngHcEhy/8D11kUWRUMbke+tC+AUcUsnMz2g== dependencies: cosmiconfig "^5.0.0" - cssnano-preset-default "^4.0.7" + cssnano-preset-default "^4.0.8" is-resolvable "^1.0.0" postcss "^7.0.0" @@ -4412,9 +4411,9 @@ date-fns@^1.27.2: integrity sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw== date-fns@^2.16.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.19.0.tgz#65193348635a28d5d916c43ec7ce6fbd145059e1" - integrity sha512-X3bf2iTPgCAQp9wvjOQytnf5vO5rESYRXlPIVcgSbtT5OTScPcsf9eZU+B/YIkKAtYr5WeCii58BgATrNitlWg== + version "2.20.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.20.0.tgz#df00ba9177fbea22d88010b5844ecc91e9e03ceb" + integrity sha512-nmA7y6aDH5+fknfJ0G77HQzUSfTPpq4ifq+c9blP9d+X9zs3kNjxC+t3pcbBMGTp262a6PJB3RVjLlxIgoMI+Q== de-indent@^1.0.2: version "1.0.2" @@ -4702,9 +4701,9 @@ domelementtype@1, domelementtype@^1.3.1: integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== domelementtype@^2.0.1: - version "2.1.0" - resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.1.0.tgz#a851c080a6d1c3d94344aed151d99f669edf585e" - integrity sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w== + version "2.2.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.2.0.tgz#9a0b6c2782ed6a1c7323d42267183df9bd8b1d57" + integrity sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A== domexception@^1.0.1: version "1.0.1" @@ -4807,9 +4806,9 @@ ejs@^2.6.1: integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== electron-to-chromium@^1.3.649: - version "1.3.701" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.701.tgz#5e796ed7ce88cd77bc7bf831cf311ef6b067c389" - integrity sha512-Zd9ofdIMYHYhG1gvnejQDvC/kqSeXQvtXF0yRURGxgwGqDZm9F9Fm3dYFnm5gyuA7xpXfBlzVLN1sz0FjxpKfw== + version "1.3.710" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.710.tgz#b33d316e5d6de92b916e766d8a478d19796ffe11" + integrity sha512-b3r0E2o4yc7mNmBeJviejF1rEx49PUBi+2NPa7jHEX3arkAXnVgLhR0YmV8oi6/Qf3HH2a8xzQmCjHNH0IpXWQ== elegant-spinner@^1.0.1: version "1.0.1" @@ -5812,10 +5811,10 @@ fs-minipass@^2.0.0: dependencies: minipass "^3.0.0" -fs-monkey@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.1.tgz#4a82f36944365e619f4454d9fff106553067b781" - integrity sha512-fcSa+wyTqZa46iWweI7/ZiUfegOZl0SG8+dltIwFXo7+zYU9J9kpS3NB6pZcSlJdhvIwp81Adx2XhZorncxiaA== +fs-monkey@1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3" + integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q== fs-write-stream-atomic@^1.0.8: version "1.0.10" @@ -6238,9 +6237,9 @@ hex-color-regex@^1.1.0: integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== highlight.js@^10.7.1, highlight.js@~10.7.0: - version "10.7.1" - resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.1.tgz#a8ec4152db24ea630c90927d6cae2a45f8ecb955" - integrity sha512-S6G97tHGqJ/U8DsXcEdnACbirtbx58Bx9CzIVeYli8OuswCfYI/LsXH2EiGcoGio1KAC3x4mmUwulOllJ2ZyRA== + version "10.7.2" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.2.tgz#89319b861edc66c48854ed1e6da21ea89f847360" + integrity sha512-oFLl873u4usRM9K63j4ME9u3etNF0PLiJhSQ8rdfuL51Wn3zkD6drf9ZW0dOzjnZI22YYG24z30JcmfCZjMgYg== hmac-drbg@^1.0.1: version "1.0.1" @@ -6271,9 +6270,9 @@ hoopy@^0.1.4: integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== hosted-git-info@^2.1.4: - version "2.8.8" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz#7539bd4bc1e0e0a895815a2e0262420b12858488" - integrity sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg== + version "2.8.9" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" + integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== hpack.js@^2.1.6: version "2.1.6" @@ -6295,11 +6294,6 @@ hsla-regex@^1.0.0: resolved "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz#c1ce7a3168c8c6614033a4b5f7877f3b225f9c38" integrity sha1-wc56MWjIxmFAM6S194d/OyJfnDg= -html-comment-regex@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz#97d4688aeb5c81886a364faa0cad1dda14d433a7" - integrity sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ== - html-encoding-sniffer@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz#e70d84b94da53aa375e11fe3a351be6642ca46f8" @@ -6811,9 +6805,9 @@ is-directory@^0.3.1: integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE= is-docker@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.1.1.tgz#4125a88e44e450d384e09047ede71adc2d144156" - integrity sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw== + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.0.tgz#b037c8815281edaad6c2562648a5f5f18839d5f7" + integrity sha512-K4GwB4i/HzhAzwP/XSlspzRdFTI9N8OxJOyOU7Y5Rz+p+WBokXWVWblaJeBkggthmoSV0OoGTH5thJNvplpkvQ== is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" @@ -6999,13 +6993,6 @@ is-string@^1.0.5: resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.5.tgz#40493ed198ef3ff477b8c7f92f644ec82a5cd3a6" integrity sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ== -is-svg@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz#9321dbd29c212e5ca99c4fa9794c714bcafa2f75" - integrity sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ== - dependencies: - html-comment-regex "^1.1.0" - is-symbol@^1.0.2, is-symbol@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz#38e1014b9e6329be0de9d24a414fd7441ec61937" @@ -8221,11 +8208,11 @@ media-typer@0.3.0: integrity sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g= memfs@^3.1.2: - version "3.2.0" - resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.2.0.tgz#f9438e622b5acd1daa8a4ae160c496fdd1325b26" - integrity sha512-f/xxz2TpdKv6uDn6GtHee8ivFyxwxmPuXatBb1FBwxYNuVpbM3k/Y1Z+vC0mH/dIXXrukYfe3qe5J32Dfjg93A== + version "3.2.2" + resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.2.2.tgz#5de461389d596e3f23d48bb7c2afb6161f4df40e" + integrity sha512-RE0CwmIM3CEvpcdK3rZ19BC4E6hv9kADkMN5rPduRak58cNArWLi/9jFLsa4rhsjfVxMP3v0jO7FHXq7SvFY5Q== dependencies: - fs-monkey "1.0.1" + fs-monkey "1.0.3" memory-fs@^0.4.1: version "0.4.1" @@ -8336,17 +8323,17 @@ miller-rabin@^4.0.0: bn.js "^4.0.0" brorand "^1.0.1" -mime-db@1.46.0, "mime-db@>= 1.43.0 < 2": - version "1.46.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz#6267748a7f799594de3cbc8cde91def349661cee" - integrity sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ== +mime-db@1.47.0, "mime-db@>= 1.43.0 < 2": + version "1.47.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.47.0.tgz#8cb313e59965d3c05cfbf898915a267af46a335c" + integrity sha512-QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw== mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24: - version "2.1.29" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.29.tgz#1d4ab77da64b91f5f72489df29236563754bb1b2" - integrity sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ== + version "2.1.30" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.30.tgz#6e7be8b4c479825f85ed6326695db73f9305d62d" + integrity sha512-crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg== dependencies: - mime-db "1.46.0" + mime-db "1.47.0" mime@1.6.0: version "1.6.0" @@ -8486,10 +8473,10 @@ mkdirp@^1.0.4: resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== -mock-apollo-client@^0.5: - version "0.5.0" - resolved "https://registry.yarnpkg.com/mock-apollo-client/-/mock-apollo-client-0.5.0.tgz#8f0d6a1ba0d349ebde87a1dcd85c7fd353076922" - integrity sha512-qdMUt1NhmNXLjHd/IaHbvbX5LaEE91WZB4glfj7AfUUs413/z148kBuXKg6XpMZqvJr+XdR/9i1V+YGY7UnCKA== +mock-apollo-client@^0.6: + version "0.6.0" + resolved "https://registry.yarnpkg.com/mock-apollo-client/-/mock-apollo-client-0.6.0.tgz#ff1760f18798789931e421c6668bfc0e7f1f0649" + integrity sha512-HPo6yVkAE+uxIpB8oPO9ISM86hFDwefrHKz5uOowecT/hR79e/NbXAl372LOQ1lWYVNVgCaP3RIMgWEhVFWtjw== moment@2.24.0: version "2.24.0" @@ -9678,12 +9665,11 @@ postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: uniq "^1.0.1" util-deprecate "^1.0.2" -postcss-svgo@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz#17b997bc711b333bab143aaed3b8d3d6e3d38258" - integrity sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw== +postcss-svgo@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.3.tgz#343a2cdbac9505d416243d496f724f38894c941e" + integrity sha512-NoRbrcMWTtUghzuKSoIm6XV+sJdvZ7GZSc3wdBN0W19FTtp2ko8NqLsgoh/m9CzNhU3KLPvQmjIwtaNFkaFTvw== dependencies: - is-svg "^3.0.0" postcss "^7.0.0" postcss-value-parser "^3.0.0" svgo "^1.0.0" @@ -9885,9 +9871,9 @@ promise-inflight@^1.0.1: integrity sha1-mEcocL8igTL8vdhoEputEsPAKeM= prompts@^2.0.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.0.tgz#4aa5de0723a231d1ee9121c40fdf663df73f61d7" - integrity sha512-awZAKrk3vN6CroQukBL+R9051a4R3zCZBlJm/HBfrSZ8iTpYix3VX1vU4mveiLpiwmOJT4wokTF9m6HUk4KqWQ== + version "2.4.1" + resolved "https://registry.yarnpkg.com/prompts/-/prompts-2.4.1.tgz#befd3b1195ba052f9fd2fde8a486c4e82ee77f61" + integrity sha512-EQyfIuO2hPDsX1L/blblV+H7I0knhgAd82cVneCwcdND9B8AuCDuRcBH6yIcG4dFzlOUqbazQqwGjx5xmsNLuQ== dependencies: kleur "^3.0.3" sisteransi "^1.0.5" @@ -9918,9 +9904,9 @@ prosemirror-commands@^1.1.4: prosemirror-transform "^1.0.0" prosemirror-dropcursor@^1.3.2: - version "1.3.3" - resolved "https://registry.yarnpkg.com/prosemirror-dropcursor/-/prosemirror-dropcursor-1.3.3.tgz#583d6a82b4960d468132c07c40803cc1d697fda4" - integrity sha512-zavE+wh+qkDcP7LaWn+jXVujGyQzBYSmM8E2HSngQ3KaaR+HJYgEBYGs9ynLHqKWLlLCXsxWdVYPV49v4caFyg== + version "1.3.4" + resolved "https://registry.yarnpkg.com/prosemirror-dropcursor/-/prosemirror-dropcursor-1.3.4.tgz#a7f799ff9ecb520d3e1dbb3cb39d27ce41066618" + integrity sha512-eVmpMG5+fmvANT3xDzRirmG240rB/piI31ExIfW0Mkvo5/cYC/lm1fFMAOzjO22uc5OQXiodRqOnyE05+g3UqA== dependencies: prosemirror-state "^1.0.0" prosemirror-transform "^1.1.0" @@ -9962,9 +9948,9 @@ prosemirror-keymap@^1.0.0, prosemirror-keymap@^1.1.2, prosemirror-keymap@^1.1.4: w3c-keyname "^2.2.0" prosemirror-model@^1.0.0, prosemirror-model@^1.1.0, prosemirror-model@^1.13.1, prosemirror-model@^1.8.1: - version "1.13.3" - resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.13.3.tgz#3ccfde73b9c9e706933c72bdf7462906509ff1c9" - integrity sha512-wujIYYQEcxdkbKmIJiekVjqtylKxuoEcc+w2PnN7Itc58m/75J4rCUz2dibygVQJFi3gZrD2DNFLjOS6LP4w1g== + version "1.14.0" + resolved "https://registry.yarnpkg.com/prosemirror-model/-/prosemirror-model-1.14.0.tgz#44042a16942dfc5dcd79daf6ec37b0efcfef53c8" + integrity sha512-+9J7YE2qD2lsRgaI5aF7u6LynBoHxb/8sW1gaMKRAhK+yeQ+motBIaxb2GxRWSadDWMOq5haAImSTBo6jDkv2A== dependencies: orderedmap "^1.1.0" @@ -9996,9 +9982,9 @@ prosemirror-tables@^1.1.1: prosemirror-view "^1.13.3" prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transform@^1.2.1, prosemirror-transform@^1.2.8: - version "1.2.12" - resolved "https://registry.yarnpkg.com/prosemirror-transform/-/prosemirror-transform-1.2.12.tgz#4398b568faf75a1540fbf5c659ca436a8657ed6f" - integrity sha512-S73syqLcGBq6QiPaF7vriB8kpvK/aIFsnErrriKaFLSiE/GxMgBc62TPhNQAeGQr7/9GCDApIReTsJFcMt4o2w== + version "1.3.2" + resolved "https://registry.yarnpkg.com/prosemirror-transform/-/prosemirror-transform-1.3.2.tgz#5620ebe7379e6fae4f34ecc881886cb22ce96579" + integrity sha512-/G6d/u9Mf6Bv3H1XR8VxhpjmUO75LYmnvj+s3ZfZpakU1hnQbsvCEybml1B3f2IWUAAQRFkbO1PnsbFhLZsYsw== dependencies: prosemirror-model "^1.0.0" @@ -10362,9 +10348,9 @@ renderkid@^2.0.4: strip-ansi "^3.0.0" repeat-element@^1.1.2: - version "1.1.3" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz#782e0d825c0c5a3bb39731f84efee6b742e6b1ce" - integrity sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g== + version "1.1.4" + resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" + integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== repeat-string@^1.6.1: version "1.6.1" @@ -11175,9 +11161,9 @@ sshpk@^1.7.0: tweetnacl "~0.14.0" ssri@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz#2a3c41b28dd45b62b63676ecb74001265ae9edd8" - integrity sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA== + version "6.0.2" + resolved "https://registry.yarnpkg.com/ssri/-/ssri-6.0.2.tgz#157939134f20464e7301ddba3e90ffa8f7728ac5" + integrity sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q== dependencies: figgy-pudding "^3.5.1" @@ -11195,9 +11181,9 @@ stable@^0.1.8: integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== stack-utils@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.4.tgz#4b600971dcfc6aed0cbdf2a8268177cc916c87c8" - integrity sha512-IPDJfugEGbfizBwBZRZ3xpccMdRyP5lqsBWXGQWimVjua/ccLCeMOAVjlc1R7LxFjo5sEDhyNIXd8mo/AiDS9w== + version "1.0.5" + resolved "https://registry.yarnpkg.com/stack-utils/-/stack-utils-1.0.5.tgz#a19b0b01947e0029c8e451d5d61a498f5bb1471b" + integrity sha512-KZiTzuV3CnSnSvgMRrARVCj+Ht7rMbauGDK0LdVFRGyenwdylpajAp4Q0i6SX8rEmbTpMMf6ryq2gb8pPq2WgQ== dependencies: escape-string-regexp "^2.0.0" @@ -11559,9 +11545,9 @@ symbol-tree@^3.2.2: integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== table@^6.0.4: - version "6.0.8" - resolved "https://registry.yarnpkg.com/table/-/table-6.0.8.tgz#b63f35af8d90601de282a3292226007a9429644f" - integrity sha512-OBAdezyozae8IvjHGXBDHByVkLCcsmffXUSj8LXkNb0SluRd4ug3GFCjk6JynZONIPhOkyr0Nnvbq1rlIspXyQ== + version "6.0.9" + resolved "https://registry.yarnpkg.com/table/-/table-6.0.9.tgz#790a12bf1e09b87b30e60419bafd6a1fd85536fb" + integrity sha512-F3cLs9a3hL1Z7N4+EkSscsel3z55XT950AvB05bwayrNg5T1/gykXtigioTAjbltvbMSJvvhFCbnf6mX+ntnJQ== dependencies: ajv "^8.0.1" is-boolean-object "^1.1.0" @@ -11735,9 +11721,9 @@ tiptap-commands@^1.17.1: tiptap-utils "^1.13.1" tiptap-extensions@^1.34.0: - version "1.35.1" - resolved "https://registry.yarnpkg.com/tiptap-extensions/-/tiptap-extensions-1.35.1.tgz#6227362b08dbad8d0ab0141b508876deca276c55" - integrity sha512-aCYvEKPUUtHBALBFQ9n70Iy/nfu/8DHHYkeXMgUJuwLLJ6LrJQBqUnV5EGRwPxNalNdqTdXjV+2z5flZfisovQ== + version "1.35.2" + resolved "https://registry.yarnpkg.com/tiptap-extensions/-/tiptap-extensions-1.35.2.tgz#83dd6ee703ae8c83b58c7608f97253fcc4f1a94c" + integrity sha512-TIMbHVJe0/3aVeTeCmqGbatDkfxduPYFOffNCmuKR+h6oQNzTu6rLVhRzoNqktfxIoi/b44SiDPorTjSN72dCw== dependencies: lowlight "^1.17.0" prosemirror-collab "^1.2.2" @@ -11747,7 +11733,7 @@ tiptap-extensions@^1.34.0: prosemirror-tables "^1.1.1" prosemirror-transform "^1.2.8" prosemirror-view "^1.16.5" - tiptap "^1.32.1" + tiptap "^1.32.2" tiptap-commands "^1.17.1" tiptap-utils "^1.13.1" @@ -11760,10 +11746,10 @@ tiptap-utils@^1.13.1: prosemirror-state "^1.3.3" prosemirror-tables "^1.1.1" -tiptap@^1.32.0, tiptap@^1.32.1: - version "1.32.1" - resolved "https://registry.yarnpkg.com/tiptap/-/tiptap-1.32.1.tgz#92b47008d163e31d25d44dc18809a7e928fe1daf" - integrity sha512-jXET6IAuvE67GdpcGdNE/RQ7I1eoeULXSrbriAa5fnyTUJQsDICd31/8LVaCh10OV1qkvQVCg/6oL1lQdakBLA== +tiptap@^1.32.0, tiptap@^1.32.2: + version "1.32.2" + resolved "https://registry.yarnpkg.com/tiptap/-/tiptap-1.32.2.tgz#cd6259e853652bfc6860758ff44ebb695d5edd1c" + integrity sha512-5IwVj8nGo8y5V3jbdtoEd7xNUsi8Q0N6WV2Nfs70olqz3fldXkiImBrDhZJ4Anx8vhyP6PIBttrg0prFVmwIvw== dependencies: prosemirror-commands "^1.1.4" prosemirror-dropcursor "^1.3.2" @@ -11956,9 +11942,9 @@ tslib@^1.10.0, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0, tslib@^1.9.3: integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.1.0.tgz#da60860f1c2ecaa5703ab7d39bc05b6bf988b97a" - integrity sha512-hcVC3wYEziELGGmEEXue7D75zbwIIVUMWAVbHItGPx0ziyXxrOMQx4rQEVEV45Ut/1IotuEvwqPopzIOkDMf0A== + version "2.2.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" + integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== tslint@^5.20.1: version "5.20.1" @@ -12068,9 +12054,9 @@ typescript@^3.9.3: integrity sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w== typescript@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.3.tgz#39062d8019912d43726298f09493d598048c1ce3" - integrity sha512-qOcYwxaByStAWrBf4x0fibwZvMRG+r4cQoTjbPtUlrWjBHbmCAww1i448U0GJ+3cNNEtebDteo/cHOR3xJ4wEw== + version "4.2.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.2.4.tgz#8610b59747de028fda898a8aef0e103f156d0961" + integrity sha512-V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg== uglify-js@3.4.x: version "3.4.10" @@ -13088,14 +13074,14 @@ xtend@^4.0.0, xtend@~4.0.1: integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== y18n@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.1.tgz#8db2b83c31c5d75099bb890b23f3094891e247d4" - integrity sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ== + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== y18n@^5.0.5: - version "5.0.5" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" - integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== yallist@^2.1.2: version "2.1.2" diff --git a/mix.exs b/mix.exs index 1ff25a1aa..2c30e4023 100644 --- a/mix.exs +++ b/mix.exs @@ -148,7 +148,7 @@ defmodule Mobilizon.Mixfile do {:phoenix_live_reload, "~> 1.2", only: [:dev, :e2e]}, {:ex_machina, "~> 2.3", only: [:dev, :test]}, {:excoveralls, "~> 0.14.0", only: :test}, - {:ex_doc, "~> 0.23", only: [:dev, :test], runtime: false}, + {:ex_doc, "~> 0.23", only: [:dev, :test], runtime: false, override: true}, {:mix_test_watch, "~> 1.0", only: :dev, runtime: false}, {:ex_unit_notifier, "~> 1.0", only: :test}, {:dialyxir, "~> 1.1", only: [:dev], runtime: false}, diff --git a/mix.lock b/mix.lock index 1f965663f..1250cfda4 100644 --- a/mix.lock +++ b/mix.lock @@ -20,28 +20,28 @@ "cowlib": {:hex, :cowlib, "2.9.1", "61a6c7c50cf07fdd24b2f45b89500bb93b6686579b069a89f88cb211e1125c78", [:rebar3], [], "hexpm", "e4175dc240a70d996156160891e1c62238ede1729e45740bdd38064dad476170"}, "credo": {:hex, :credo, "1.5.5", "e8f422026f553bc3bebb81c8e8bf1932f498ca03339856c7fec63d3faac8424b", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2.8", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "dd8623ab7091956a855dc9f3062486add9c52d310dfd62748779c4315d8247de"}, "dataloader": {:hex, :dataloader, "1.0.8", "114294362db98a613f231589246aa5b0ce847412e8e75c4c94f31f204d272cbf", [:mix], [{:ecto, ">= 3.4.3 and < 4.0.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "eaf3c2aa2bc9dbd2f1e960561d616b7f593396c4754185b75904f6d66c82a667"}, - "db_connection": {:hex, :db_connection, "2.3.1", "4c9f3ed1ef37471cbdd2762d6655be11e38193904d9c5c1c9389f1b891a3088e", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}], "hexpm", "abaab61780dde30301d840417890bd9f74131041afd02174cf4e10635b3a63f5"}, + "db_connection": {:hex, :db_connection, "2.4.0", "d04b1b73795dae60cead94189f1b8a51cc9e1f911c234cc23074017c43c031e5", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ad416c21ad9f61b3103d254a71b63696ecadb6a917b36f563921e0de00d7d7c8"}, "decimal": {:hex, :decimal, "2.0.0", "a78296e617b0f5dd4c6caf57c714431347912ffb1d0842e998e9792b5642d697", [:mix], [], "hexpm", "34666e9c55dea81013e77d9d87370fe6cb6291d1ef32f46a1600230b1d44f577"}, "dialyxir": {:hex, :dialyxir, "1.1.0", "c5aab0d6e71e5522e77beff7ba9e08f8e02bad90dfbeffae60eaf0cb47e29488", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "07ea8e49c45f15264ebe6d5b93799d4dd56a44036cf42d0ad9c960bc266c0b9a"}, "earmark": {:hex, :earmark, "1.4.14", "d04572cef64dd92726a97d92d714e38d6e130b024ea1b3f8a56e7de66ec04e50", [:mix], [{:earmark_parser, ">= 1.4.12", [hex: :earmark_parser, repo: "hexpm", optional: false]}], "hexpm", "df338b8b1852ee425180b276c56c6941cb12220e04fe8718fe4acbdd35fd699f"}, "earmark_parser": {:hex, :earmark_parser, "1.4.12", "b245e875ec0a311a342320da0551da407d9d2b65d98f7a9597ae078615af3449", [:mix], [], "hexpm", "711e2cc4d64abb7d566d43f54b78f7dc129308a63bc103fbd88550d2174b3160"}, - "ecto": {:hex, :ecto, "3.5.8", "8ebf12be6016cb99313348ba7bb4612f4114b9a506d6da79a2adc7ef449340bc", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "ea0be182ea8922eb7742e3ae8e71b67ee00ae177de1bf76210299a5f16ba4c77"}, + "ecto": {:hex, :ecto, "3.6.0", "df6b00f7278b458108044da4cff365dde31f6f2f621cf7dc0bf857b26be3bd20", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3035603f5b308ea7731b854493e5b5c1565e4d1e073186c3963b9689304f1d08"}, "ecto_autoslug_field": {:hex, :ecto_autoslug_field, "2.0.1", "2177c1c253f6dd3efd4b56d1cb76104d0a6ef044c6b9a7a0ad6d32665c4111e5", [:mix], [{:ecto, ">= 2.1.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:slugger, ">= 0.2.0", [hex: :slugger, repo: "hexpm", optional: false]}], "hexpm", "a3cc73211f2e75b89a03332183812ebe1ac08be2e25a1df5aa3d1422f92c45c3"}, "ecto_enum": {:hex, :ecto_enum, "1.4.0", "d14b00e04b974afc69c251632d1e49594d899067ee2b376277efd8233027aec8", [:mix], [{:ecto, ">= 3.0.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:ecto_sql, "> 3.0.0", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:mariaex, ">= 0.0.0", [hex: :mariaex, repo: "hexpm", optional: true]}, {:postgrex, ">= 0.0.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "8fb55c087181c2b15eee406519dc22578fa60dd82c088be376d0010172764ee4"}, "ecto_shortuuid": {:hex, :ecto_shortuuid, "0.1.3", "d36aede64edf256e4b769be2ad15a8ad5d9d1ff8ad46befe39e8cb4489abcd05", [:mix], [{:ecto, "~> 2.2 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:shortuuid, "~> 2.1.1", [hex: :shortuuid, repo: "hexpm", optional: false]}], "hexpm", "d215c8ced7125265de94d55abc696125942caef33439cf281fafded9744a4294"}, - "ecto_sql": {:hex, :ecto_sql, "3.5.4", "a9e292c40bd79fff88885f95f1ecd7b2516e09aa99c7dd0201aa84c54d2358e4", [:mix], [{:db_connection, "~> 2.2", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.5.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.3.0 or ~> 0.4.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "1fff1a28a898d7bbef263f1f3ea425b04ba9f33816d843238c84eff883347343"}, + "ecto_sql": {:hex, :ecto_sql, "3.6.0", "5cb277b086618a644f2c5450316202a885716bb7726b9f13b74cb0708bea3a8f", [:mix], [{:db_connection, "~> 2.2", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.6.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.4.0 or ~> 0.5.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "b3486d6e29ee4a0e7a381390c9c289bfbbaf5dc1971e269c579799d2300e5bd5"}, "elixir_feed_parser": {:hex, :elixir_feed_parser, "2.1.0", "bb96fb6422158dc7ad59de62ef211cc69d264acbbe63941a64a5dce97bbbc2e6", [:mix], [{:timex, "~> 3.4", [hex: :timex, repo: "hexpm", optional: false]}], "hexpm", "2d3c62fe7b396ee3b73d7160bc8fadbd78bfe9597c98c7d79b3f1038d9cba28f"}, "elixir_make": {:hex, :elixir_make, "0.6.2", "7dffacd77dec4c37b39af867cedaabb0b59f6a871f89722c25b28fcd4bd70530", [:mix], [], "hexpm", "03e49eadda22526a7e5279d53321d1cced6552f344ba4e03e619063de75348d9"}, "erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"}, "eternal": {:hex, :eternal, "1.2.2", "d1641c86368de99375b98d183042dd6c2b234262b8d08dfd72b9eeaafc2a1abd", [:mix], [], "hexpm", "2c9fe32b9c3726703ba5e1d43a1d255a4f3f2d8f8f9bc19f094c7cb1a7a9e782"}, - "ex_cldr": {:hex, :ex_cldr, "2.19.0", "61e789016dff00f24a28b26632f6240efe8257ad4f651741e889d8929a0fd075", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.5", [hex: :certifi, repo: "hexpm", optional: true]}, {:cldr_utils, "~> 2.12", [hex: :cldr_utils, repo: "hexpm", optional: false]}, {:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:gettext, "~> 0.13", [hex: :gettext, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "fccdb406d66da75991e37e4b7b59aa2e1c8242f41822924f9560453610123d84"}, - "ex_cldr_calendars": {:hex, :ex_cldr_calendars, "1.12.0", "0cf7c804937a93baa9c3b471667ad05c478942865cc457e8397b5d83fc6f2c7a", [:mix], [{:calendar_interval, "~> 0.2", [hex: :calendar_interval, repo: "hexpm", optional: true]}, {:earmark, "~> 1.0", [hex: :earmark, repo: "hexpm", optional: false]}, {:ex_cldr_numbers, "~> 2.16", [hex: :ex_cldr_numbers, repo: "hexpm", optional: false]}, {:ex_cldr_units, "~> 3.3", [hex: :ex_cldr_units, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "edcb91ec52ee4e24a928e2bcf6d3354da465eced42887fbdb3f878a7a329963f"}, - "ex_cldr_currencies": {:hex, :ex_cldr_currencies, "2.8.0", "b2ecc94e9fa4b8ec07614830f4d6e811e5df5e7679c6d2be92f4fe4f31184913", [:mix], [{:ex_cldr, "~> 2.18", [hex: :ex_cldr, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "a39780667b73bfd3d2bd08e61981bca23a97912b86f3236042850ecb062f48eb"}, - "ex_cldr_dates_times": {:hex, :ex_cldr_dates_times, "2.6.4", "d383e033aaa7295dd4964bca95baff62ee259eca2e32d550cc470495e3d8a012", [:mix], [{:calendar_interval, "~> 0.2", [hex: :calendar_interval, repo: "hexpm", optional: true]}, {:ex_cldr_calendars, "~> 1.11", [hex: :ex_cldr_calendars, repo: "hexpm", optional: false]}, {:ex_cldr_numbers, "~> 2.16", [hex: :ex_cldr_numbers, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "23c6d4cfdd1e00a6cd8c9ffb5ae5da909489e77f0f8d854856087ea5d5f666c5"}, + "ex_cldr": {:hex, :ex_cldr, "2.20.0", "571a4b490c333809be59cc984a21be2deaab1db9e2418e323d5935aec8b1394a", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.5", [hex: :certifi, repo: "hexpm", optional: true]}, {:cldr_utils, "~> 2.15", [hex: :cldr_utils, repo: "hexpm", optional: false]}, {:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:gettext, "~> 0.13", [hex: :gettext, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "06147e4a27be62e6fe92db14cf5048c645927bfc530aa1cc6af8c92d65e32427"}, + "ex_cldr_calendars": {:hex, :ex_cldr_calendars, "1.13.0", "6bea6f3c54d74c0ed131dd17e1cff68e02b7053f24c2fac91f129e5221ff723a", [:mix], [{:calendar_interval, "~> 0.2", [hex: :calendar_interval, repo: "hexpm", optional: true]}, {:earmark, "~> 1.0", [hex: :earmark, repo: "hexpm", optional: false]}, {:ex_cldr_numbers, "~> 2.17", [hex: :ex_cldr_numbers, repo: "hexpm", optional: false]}, {:ex_cldr_units, "~> 3.5", [hex: :ex_cldr_units, repo: "hexpm", optional: true]}, {:ex_doc, "~> 0.21", [hex: :ex_doc, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "d07ab6b2164b6a0861de6ecb600747aab61c94a0b9c001e36c2e0b731eeb567a"}, + "ex_cldr_currencies": {:hex, :ex_cldr_currencies, "2.9.0", "2505e2e4a87c88f6e5304f14b3c95bec1cf8b109f335b24b203a8505523584fa", [:mix], [{:ex_cldr, "~> 2.20", [hex: :ex_cldr, repo: "hexpm", optional: false]}, {:ex_doc, "~> 0.18", [hex: :ex_doc, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "9c8c5518ee4a0ac40a0ca282ae9c20de87412bdf8f57121338bac3571d3b9ed5"}, + "ex_cldr_dates_times": {:hex, :ex_cldr_dates_times, "2.7.0", "c8fc77e075e7408fd414b2a4396e2023901032a3c20d94035b8cee54a10f28c9", [:mix], [{:calendar_interval, "~> 0.2", [hex: :calendar_interval, repo: "hexpm", optional: true]}, {:ex_cldr_calendars, "~> 1.13", [hex: :ex_cldr_calendars, repo: "hexpm", optional: false]}, {:ex_cldr_numbers, "~> 2.17", [hex: :ex_cldr_numbers, repo: "hexpm", optional: false]}, {:ex_doc, "~> 0.18", [hex: :ex_doc, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "e21e8c6f9440c91d6111cb39ac96a423d833206ce8d1b24bbdeddd12b2b9427d"}, "ex_cldr_languages": {:hex, :ex_cldr_languages, "0.2.2", "d7dab93272443b70e18e6aef0f62974418baaca3a3b31a66d51921ec1547113c", [:mix], [{:ex_cldr, "~> 2.2 and >= 2.2.1", [hex: :ex_cldr, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "d9cbf4bf643365b0042e774520ddfcbc31618efd5a5383fac98f75149961622c"}, - "ex_cldr_numbers": {:hex, :ex_cldr_numbers, "2.16.1", "aea1cecbf19dfb6ac82658d05685015172866cf1a4ce0778f58157442ccf015d", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:ex_cldr, "~> 2.18", [hex: :ex_cldr, repo: "hexpm", optional: false]}, {:ex_cldr_currencies, "~> 2.8", [hex: :ex_cldr_currencies, repo: "hexpm", optional: false]}, {:ex_doc, "~> 0.18", [hex: :ex_doc, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "ba7a6f9f50aaa7759d05e508a333747cf670c823b2857780b025f3c421f4f1d3"}, + "ex_cldr_numbers": {:hex, :ex_cldr_numbers, "2.17.0", "e79d4161ca82ce8d40bec5bb7dc83d457e81d03e39042e5b62ff48b2cc3c35f3", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:ex_cldr, "~> 2.20", [hex: :ex_cldr, repo: "hexpm", optional: false]}, {:ex_cldr_currencies, "~> 2.9", [hex: :ex_cldr_currencies, repo: "hexpm", optional: false]}, {:ex_doc, "~> 0.18", [hex: :ex_doc, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "c6b7ee62e97cefc6d3c47896608f8152cc65ea40238ea99cd92c6f04acdd1627"}, "ex_crypto": {:hex, :ex_crypto, "0.10.0", "af600a89b784b36613a989da6e998c1b200ff1214c3cfbaf8deca4aa2f0a1739", [:mix], [{:poison, ">= 2.0.0", [hex: :poison, repo: "hexpm", optional: false]}], "hexpm", "ccc7472cfe8a0f4565f97dce7e9280119bf15a5ea51c6535e5b65f00660cde1c"}, - "ex_doc": {:hex, :ex_doc, "0.24.1", "15673de99154f93ca7f05900e4e4155ced1ee0cd34e0caeee567900a616871a4", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "07972f17bdf7dc7b5bd76ec97b556b26178ed3f056e7ec9288eb7cea7f91cce2"}, + "ex_doc": {:hex, :ex_doc, "0.24.2", "e4c26603830c1a2286dae45f4412a4d1980e1e89dc779fcd0181ed1d5a05c8d9", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}, {:makeup_erlang, "~> 0.1", [hex: :makeup_erlang, repo: "hexpm", optional: false]}], "hexpm", "e134e1d9e821b8d9e4244687fb2ace58d479b67b282de5158333b0d57c6fb7da"}, "ex_ical": {:hex, :ex_ical, "0.2.0", "4b928b554614704016cc0c9ee226eb854da9327a1cc460457621ceacb1ac29a6", [:mix], [{:timex, "~> 3.1", [hex: :timex, repo: "hexpm", optional: false]}], "hexpm", "db76473b2ae0259e6633c6c479a5a4d8603f09497f55c88f9ef4d53d2b75befb"}, "ex_machina": {:hex, :ex_machina, "2.7.0", "b792cc3127fd0680fecdb6299235b4727a4944a09ff0fa904cc639272cd92dc7", [:mix], [{:ecto, "~> 2.2 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_sql, "~> 3.0", [hex: :ecto_sql, repo: "hexpm", optional: true]}], "hexpm", "419aa7a39bde11894c87a615c4ecaa52d8f107bbdd81d810465186f783245bf8"}, "ex_optimizer": {:hex, :ex_optimizer, "0.1.1", "62da37e206fc2233ff7a4e54e40eae365c40f96c81992fcd15b782eb25169b80", [:mix], [{:file_info, "~> 0.0.4", [hex: :file_info, repo: "hexpm", optional: false]}], "hexpm", "e6f5c059bcd58b66be2f6f257fdc4f69b74b0fa5c9ddd669486af012e4b52286"}, @@ -55,9 +55,9 @@ "fast_sanitize": {:hex, :fast_sanitize, "0.2.2", "3cbbaebaea6043865dfb5b4ecb0f1af066ad410a51470e353714b10c42007b81", [:mix], [{:fast_html, "~> 2.0", [hex: :fast_html, repo: "hexpm", optional: false]}, {:plug, "~> 1.8", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "69f204db9250afa94a0d559d9110139850f57de2b081719fbafa1e9a89e94466"}, "file_info": {:hex, :file_info, "0.0.4", "2e0e77f211e833f38ead22cb29ce53761d457d80b3ffe0ffe0eb93880b0963b2", [:mix], [{:mimetype_parser, "~> 0.1.2", [hex: :mimetype_parser, repo: "hexpm", optional: false]}], "hexpm", "50e7ad01c2c8b9339010675fe4dc4a113b8d6ca7eddce24d1d74fd0e762781a5"}, "file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"}, - "floki": {:hex, :floki, "0.30.0", "22ebbe681a5d3777cdd830ca091b1b806d33c3449c26312eadca7f7be685c0c8", [:mix], [{:html_entities, "~> 0.5.0", [hex: :html_entities, repo: "hexpm", optional: false]}], "hexpm", "a9e128a4ca9bb71f11affa315b6768a9ad326d5996ff1e92acf1d7a01a10076a"}, + "floki": {:hex, :floki, "0.30.1", "75d35526d3a1459920b6e87fdbc2e0b8a3670f965dd0903708d2b267e0904c55", [:mix], [{:html_entities, "~> 0.5.0", [hex: :html_entities, repo: "hexpm", optional: false]}], "hexpm", "e9c03524447d1c4cbfccd672d739b8c18453eee377846b119d4fd71b1a176bb8"}, "gen_smtp": {:hex, :gen_smtp, "1.1.1", "bf9303c31735100631b1d708d629e4c65944319d1143b5c9952054f4a1311d85", [:rebar3], [{:hut, "1.3.0", [hex: :hut, repo: "hexpm", optional: false]}, {:ranch, ">= 1.7.0", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "51bc50cc017efd4a4248cbc39ea30fb60efa7d4a49688986fafad84434ff9ab7"}, - "geo": {:hex, :geo, "3.3.7", "d0354e099bdecc4138d1e01ac4d5aee8bccdb7cb8c9f840b6eb7b5ebbc328111", [:mix], [{:jason, "~> 1.2", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "ec57118fd9de27c52d4a046e75ee6f0ecb1cdc28cab03642228ed1aa09bb30bc"}, + "geo": {:hex, :geo, "3.3.8", "ea52f985960089c5a278a93cba4de973971de2bd4e407b74f56455d6824e1b8a", [:mix], [{:jason, "~> 1.2", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "55c206b113b5ff2e766c4c03643165c4c388dc09502a557334c26d9e15fb4acd"}, "geo_postgis": {:hex, :geo_postgis, "3.3.1", "45bc96b9121d0647341685dc9d44956d61338707482d655c803500676b0413a1", [:mix], [{:geo, "~> 3.3", [hex: :geo, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:poison, "~> 2.2 or ~> 3.0 or ~> 4.0", [hex: :poison, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.14", [hex: :postgrex, repo: "hexpm", optional: false]}], "hexpm", "3c3957d8750e3effd565f068ee658ef0e881f9a07084a23f6c5ef8262d09b8e9"}, "geohax": {:hex, :geohax, "0.4.1", "87efd3c4bb00d9dd237cef917004b635417859f51dfe716ba0864b8c61eb7e0e", [:mix], [], "hexpm", "ce6aff24726f3824caf59aa8b903a1be99ac05820b53c23196d5ac36b13a1fa3"}, "geolix": {:hex, :geolix, "2.0.0", "7e65764bedfc98d08a3ddb24c417657c9d438eff163280b45fbb7de289626acd", [:mix], [], "hexpm", "8742bf588ed0bb7def2c443204d09d355990846c6efdff96ded66aac24c301df"}, @@ -87,7 +87,7 @@ "makeup_erlang": {:hex, :makeup_erlang, "0.1.1", "3fcb7f09eb9d98dc4d208f49cc955a34218fc41ff6b84df7c75b3e6e533cc65f", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "174d0809e98a4ef0b3309256cbf97101c6ec01c4ab0b23e926a9e17df2077cbb"}, "meck": {:hex, :meck, "0.8.13", "ffedb39f99b0b99703b8601c6f17c7f76313ee12de6b646e671e3188401f7866", [:rebar3], [], "hexpm", "d34f013c156db51ad57cc556891b9720e6a1c1df5fe2e15af999c84d6cebeb1a"}, "metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"}, - "mime": {:hex, :mime, "1.5.0", "203ef35ef3389aae6d361918bf3f952fa17a09e8e43b5aa592b93eba05d0fb8d", [:mix], [], "hexpm", "55a94c0f552249fc1a3dd9cd2d3ab9de9d3c89b559c2bd01121f824834f24746"}, + "mime": {:hex, :mime, "1.6.0", "dabde576a497cef4bbdd60aceee8160e02a6c89250d6c0b29e56c0dfb00db3d2", [:mix], [], "hexpm", "31a1a8613f8321143dde1dafc36006a17d28d02bdfecb9e95a880fa7aabd19a7"}, "mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"}, "mimetype_parser": {:hex, :mimetype_parser, "0.1.3", "628ac9fe56aa7edcedb534d68397dd66674ab82493c8ebe39acb9a19b666099d", [:mix], [], "hexpm", "7d8f80c567807ce78cd93c938e7f4b0a20b1aaaaab914bf286f68457d9f7a852"}, "mix_test_watch": {:hex, :mix_test_watch, "1.0.2", "34900184cbbbc6b6ed616ed3a8ea9b791f9fd2088419352a6d3200525637f785", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}], "hexpm", "47ac558d8b06f684773972c6d04fcc15590abdb97aeb7666da19fcbfdc441a07"}, @@ -99,7 +99,7 @@ "nimble_pool": {:hex, :nimble_pool, "0.1.0", "ffa9d5be27eee2b00b0c634eb649aa27f97b39186fec3c493716c2a33e784ec6", [:mix], [], "hexpm", "343a1eaa620ddcf3430a83f39f2af499fe2370390d4f785cd475b4df5acaf3f9"}, "oauth2": {:hex, :oauth2, "2.0.0", "338382079fe16c514420fa218b0903f8ad2d4bfc0ad0c9f988867dfa246731b0", [:mix], [{:hackney, "~> 1.13", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "881b8364ac7385f9fddc7949379cbe3f7081da37233a1aa7aab844670a91e7e7"}, "oauther": {:hex, :oauther, "1.1.1", "7d8b16167bb587ecbcddd3f8792beb9ec3e7b65c1f8ebd86b8dd25318d535752", [:mix], [], "hexpm", "9374f4302045321874cccdc57eb975893643bd69c3b22bf1312dab5f06e5788e"}, - "oban": {:hex, :oban, "2.5.0", "e9ee2cbec7eb90285f9d92ca80985395ccf992d957af36b693c146e5fa4a38f3", [:mix], [{:ecto_sql, ">= 3.4.3", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.14", [hex: :postgrex, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "235025eb030023880036a178ef413821c1f045eb0cbcce05911f74854f4bef0e"}, + "oban": {:hex, :oban, "2.6.1", "7466e25934be6c3f696c624ed0779459dd2add03d19f9865a478d3b47b77e814", [:mix], [{:ecto_sql, ">= 3.4.3", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.14", [hex: :postgrex, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3e86eaab8fdd1c1af64f7cfd46ad4352d19696709eb2068de239e40894a254ea"}, "parse_trans": {:hex, :parse_trans, "3.3.1", "16328ab840cc09919bd10dab29e431da3af9e9e7e7e6f0089dd5a2d2820011d8", [:rebar3], [], "hexpm", "07cd9577885f56362d414e8c4c4e6bdf10d43a8767abb92d24cbe8b24c54888b"}, "phoenix": {:hex, :phoenix, "1.5.8", "71cfa7a9bb9a37af4df98939790642f210e35f696b935ca6d9d9c55a884621a4", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 2.13", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 1.0 or ~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.1.2 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "35ded0a32f4836168c7ab6c33b88822eccd201bcd9492125a9bea4c54332d955"}, "phoenix_ecto": {:hex, :phoenix_ecto, "4.2.1", "13f124cf0a3ce0f1948cf24654c7b9f2347169ff75c1123f44674afee6af3b03", [:mix], [{:ecto, "~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 2.15", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "478a1bae899cac0a6e02be1deec7e2944b7754c04e7d4107fc5a517f877743c0"}, @@ -123,11 +123,11 @@ "sobelow": {:hex, :sobelow, "0.11.1", "23438964486f8112b41e743bbfd402da3e5b296fdc9eacab29914b79c48916dd", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "9897363a7eff96f4809304a90aad819e2ad5e5d24db547af502885146746a53c"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"}, "telemetry": {:hex, :telemetry, "0.4.2", "2808c992455e08d6177322f14d3bdb6b625fbcfd233a73505870d8738a2f4599", [:rebar3], [], "hexpm", "2d1419bd9dda6a206d7b5852179511722e2b18812310d304620c7bd92a13fcef"}, - "tesla": {:hex, :tesla, "1.4.0", "1081bef0124b8bdec1c3d330bbe91956648fb008cf0d3950a369cda466a31a87", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:finch, "~> 0.3", [hex: :finch, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:gun, "~> 1.3", [hex: :gun, repo: "hexpm", optional: true]}, {:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "~> 4.4.0", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: true]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "bf1374a5569f5fca8e641363b63f7347d680d91388880979a33bc12a6eb3e0aa"}, - "timex": {:hex, :timex, "3.7.3", "df8a2ea814749d700d6878ab9eacac9fdb498ecee2f507cb0002ec172bc24d0f", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 1.0", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "8691c1d86ca3a7bc14a156e2199dc8927be95d1a8f0e3b69e4bb2d6262c53ac6"}, + "tesla": {:hex, :tesla, "1.4.1", "ff855f1cac121e0d16281b49e8f066c4a0d89965f98864515713878cca849ac8", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:finch, "~> 0.3", [hex: :finch, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:gun, "~> 1.3", [hex: :gun, repo: "hexpm", optional: true]}, {:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "~> 4.4.0", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: true]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "95f5de35922c8c4b3945bee7406f66eb680b0955232f78f5fb7e853aa1ce201a"}, + "timex": {:hex, :timex, "3.7.5", "3eca56e23bfa4e0848f0b0a29a92fa20af251a975116c6d504966e8a90516dfd", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 1.0", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "a15608dca680f2ef663d71c95842c67f0af08a0f3b1d00e17bbd22872e2874e4"}, "tzdata": {:hex, :tzdata, "1.1.0", "72f5babaa9390d0f131465c8702fa76da0919e37ba32baa90d93c583301a8359", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "18f453739b48d3dc5bcf0e8906d2dc112bb40baafe2c707596d89f3c8dd14034"}, "ueberauth": {:hex, :ueberauth, "0.6.3", "d42ace28b870e8072cf30e32e385579c57b9cc96ec74fa1f30f30da9c14f3cc0", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "afc293d8a1140d6591b53e3eaf415ca92842cb1d32fad3c450c6f045f7f91b60"}, - "ueberauth_discord": {:hex, :ueberauth_discord, "0.5.2", "afc5d68879575c365972fd4d7cf7b01c16f7d062fc6bf7e86e2595736ac41127", [:mix], [{:oauth2, "~> 1.0 or ~> 2.0", [hex: :oauth2, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.6.3", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "bbd7701d8fef02623fb106ed7c24427ed2327ef769bcb1d2eba5670e54716cdc"}, + "ueberauth_discord": {:hex, :ueberauth_discord, "0.6.0", "d6ec040e4195c4138b9a959c79024ab4c213ba1aed9fc08099ecff141a6486da", [:mix], [{:oauth2, "~> 1.0 or ~> 2.0", [hex: :oauth2, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.6.3", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "c5ea960191c1d6c3a974947cae4d57efa565a9a0796b8e82bee45fac7ae2fabc"}, "ueberauth_facebook": {:hex, :ueberauth_facebook, "0.8.1", "c254be4ab367c276773c2e41d3c0fe343ae118e244afc8d5a4e3e5c438951fdc", [:mix], [{:oauth2, "~> 1.0 or ~> 2.0", [hex: :oauth2, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.6.0", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "c2cf210ef45bd20611234ef17517f9d1dff6b31d3fb6ad96789143eb0943f540"}, "ueberauth_github": {:hex, :ueberauth_github, "0.8.0", "2216c8cdacee0de6245b422fb397921b64a29416526985304e345dab6a799d17", [:mix], [{:oauth2, "~> 1.0 or ~> 2.0", [hex: :oauth2, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.6.0", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "b65ccc001a7b0719ba069452f3333d68891f4613ae787a340cce31e2a43307a3"}, "ueberauth_gitlab_strategy": {:git, "https://github.com/tcitworld/ueberauth_gitlab.git", "9fc5d30b5d87ff7cdef293a1c128f25777dcbe59", [branch: "upgrade-deps"]}, From 1a43bfb6205e15863a40a24614b52bb3fd5817b6 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Thu, 8 Apr 2021 09:53:46 +0200 Subject: [PATCH 26/85] Fix js unit tests Signed-off-by: Thomas Citharel --- .../components/Comment/CommentTree.spec.ts | 11 +++++--- .../__snapshots__/CommentTree.spec.ts.snap | 25 +++++++++++-------- .../ParticipationSection.spec.ts | 2 +- .../ParticipationWithoutAccount.spec.ts | 2 +- js/tests/unit/specs/components/navbar.spec.ts | 2 +- js/tests/unit/specs/mocks/config.ts | 21 ++++++++++++++++ js/tests/unit/specs/mocks/event.ts | 17 +++++++++++++ 7 files changed, 63 insertions(+), 17 deletions(-) diff --git a/js/tests/unit/specs/components/Comment/CommentTree.spec.ts b/js/tests/unit/specs/components/Comment/CommentTree.spec.ts index 8706f02ef..44d1b635b 100644 --- a/js/tests/unit/specs/components/Comment/CommentTree.spec.ts +++ b/js/tests/unit/specs/components/Comment/CommentTree.spec.ts @@ -37,7 +37,7 @@ describe("CommentTree", () => { let requestHandlers: Record; const generateWrapper = (handlers = {}, baseData = {}) => { - const cache = new InMemoryCache({ addTypename: false }); + const cache = new InMemoryCache({ addTypename: true }); mockClient = createMockClient({ cache, @@ -88,10 +88,13 @@ describe("CommentTree", () => { it("renders a comment tree", async () => { generateWrapper(); - expect(wrapper.findComponent({ name: "b-notification" }).text()).toBe( - "The organiser has chosen to close comments." - ); + expect(wrapper.exists()).toBe(true); expect(wrapper.find(".loading").text()).toBe("Loading comments…"); + + await wrapper.vm.$nextTick(); + await wrapper.vm.$nextTick(); // because of the + + expect(wrapper.find(".no-comments").text()).toBe("No comments yet"); expect(wrapper.html()).toMatchSnapshot(); }); diff --git a/js/tests/unit/specs/components/Comment/__snapshots__/CommentTree.spec.ts.snap b/js/tests/unit/specs/components/Comment/__snapshots__/CommentTree.spec.ts.snap index 48a66f29d..6754048a5 100644 --- a/js/tests/unit/specs/components/Comment/__snapshots__/CommentTree.spec.ts.snap +++ b/js/tests/unit/specs/components/Comment/__snapshots__/CommentTree.spec.ts.snap @@ -2,21 +2,26 @@ exports[`CommentTree renders a comment tree 1`] = `
    - The organiser has chosen to close comments. -

    - Loading comments… -

    -
    -`; - -exports[`CommentTree renders a comment tree 2`] = ` -
    - The organiser has chosen to close comments. + +
    No comments yet
    +
    +
    +`; + +exports[`CommentTree renders a comment tree 2`] = ` +
    + + + + + + +
    No comments yet
    `; diff --git a/js/tests/unit/specs/components/Participation/ParticipationSection.spec.ts b/js/tests/unit/specs/components/Participation/ParticipationSection.spec.ts index 2d6eb7657..2b20839bb 100644 --- a/js/tests/unit/specs/components/Participation/ParticipationSection.spec.ts +++ b/js/tests/unit/specs/components/Participation/ParticipationSection.spec.ts @@ -42,7 +42,7 @@ describe("ParticipationSection", () => { customProps: Record = {}, baseData: Record = {} ) => { - const cache = new InMemoryCache({ addTypename: false }); + const cache = new InMemoryCache({ addTypename: true }); mockClient = createMockClient({ cache, diff --git a/js/tests/unit/specs/components/Participation/ParticipationWithoutAccount.spec.ts b/js/tests/unit/specs/components/Participation/ParticipationWithoutAccount.spec.ts index f69fa7009..5c7923183 100644 --- a/js/tests/unit/specs/components/Participation/ParticipationWithoutAccount.spec.ts +++ b/js/tests/unit/specs/components/Participation/ParticipationWithoutAccount.spec.ts @@ -65,7 +65,7 @@ describe("ParticipationWithoutAccount", () => { customProps: Record = {}, baseData: Record = {} ) => { - const cache = new InMemoryCache({ addTypename: false }); + const cache = new InMemoryCache({ addTypename: true }); mockClient = createMockClient({ cache, diff --git a/js/tests/unit/specs/components/navbar.spec.ts b/js/tests/unit/specs/components/navbar.spec.ts index b96fa4124..f2123eed1 100644 --- a/js/tests/unit/specs/components/navbar.spec.ts +++ b/js/tests/unit/specs/components/navbar.spec.ts @@ -25,7 +25,7 @@ describe("App component", () => { let requestHandlers: Record; const createComponent = (handlers = {}, baseData = {}) => { - const cache = new InMemoryCache({ addTypename: false }); + const cache = new InMemoryCache({ addTypename: true }); mockClient = createMockClient({ cache, diff --git a/js/tests/unit/specs/mocks/config.ts b/js/tests/unit/specs/mocks/config.ts index 271d71ce3..856288302 100644 --- a/js/tests/unit/specs/mocks/config.ts +++ b/js/tests/unit/specs/mocks/config.ts @@ -1,37 +1,49 @@ export const configMock = { data: { config: { + __typename: "Config", anonymous: { + __typename: "Anonymous", actorId: "1", eventCreation: { + __typename: "AnonymousEventCreation", allowed: false, validation: { + __typename: "AnonymousEventCreationValidation", captcha: { + __typename: "AnonymousEventCreationValidationCaptcha", enabled: false, }, email: { + __typename: "AnonymousEventCreationValidationEmail", confirmationRequired: true, enabled: true, }, }, }, participation: { + __typename: "AnonymousParticipation", allowed: true, validation: { + __typename: "AnonymousParticipationValidation", captcha: { + __typename: "AnonymousParticipationValidationCaptcha", enabled: false, }, email: { + __typename: "AnonymousParticipationValidationEmail", confirmationRequired: true, enabled: true, }, }, }, reports: { + __typename: "AnonymousReports", allowed: false, }, }, auth: { + __typename: "Auth", ldap: false, oauthProviders: [], }, @@ -39,24 +51,30 @@ export const configMock = { demoMode: false, description: "Mobilizon.fr est l'instance Mobilizon de Framasoft.", features: { + __typename: "Features", eventCreation: true, groups: true, }, geocoding: { + __typename: "Geocoding", autocomplete: true, provider: "Elixir.Mobilizon.Service.Geospatial.Pelias", }, languages: ["fr"], location: { + __typename: "Lonlat", latitude: 48.8717, longitude: 2.32075, }, maps: { + __typename: "Maps", tiles: { + __typename: "Tiles", attribution: "© The OpenStreetMap Contributors", endpoint: "https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png", }, routing: { + __typename: "Routing", type: "OPENSTREETMAP", }, }, @@ -65,16 +83,19 @@ export const configMock = { registrationsOpen: true, resourceProviders: [ { + __typename: "ResourceProvider", endpoint: "https://lite.framacalc.org/", software: "calc", type: "ethercalc", }, { + __typename: "ResourceProvider", endpoint: "https://hebdo.framapad.org/p/", software: "pad", type: "etherpad", }, { + __typename: "ResourceProvider", endpoint: "https://framatalk.org/", software: "visio", type: "jitsi", diff --git a/js/tests/unit/specs/mocks/event.ts b/js/tests/unit/specs/mocks/event.ts index 5c284b037..5d74e8a8b 100644 --- a/js/tests/unit/specs/mocks/event.ts +++ b/js/tests/unit/specs/mocks/event.ts @@ -12,6 +12,7 @@ export const fetchEventBasicMock = { uuid: "f37910ea-fd5a-4756-9679-00971f3f4106", joinOptions: EventJoinOptions.FREE, participantStats: { + __typename: "ParticipantStats", notApproved: 0, notConfirmed: 0, rejected: 0, @@ -28,18 +29,26 @@ export const fetchEventBasicMock = { export const joinEventResponseMock = { data: { joinEvent: { + __typename: "Participant", id: "5", role: ParticipantRole.NOT_APPROVED, insertedAt: "2020-12-07T09:33:41Z", metadata: { + __typename: "ParticipantMetadata", cancellationToken: "some token", message: "a message long enough", }, event: { + __typename: "Event", id: "1", uuid: "f37910ea-fd5a-4756-9679-00971f3f4106", }, actor: { + __typename: "Person", + preferredUsername: "some_actor", + name: "Some actor", + avatar: null, + domain: null, id: "1", }, }, @@ -73,7 +82,9 @@ export const eventCommentThreadsMock = { totalReplies: 5, updatedAt: "2020-12-03T09:02:00Z", actor: { + __typename: "Person", avatar: { + __typename: "Media", id: "78", url: "http://someavatar.url.me", }, @@ -97,7 +108,9 @@ export const eventCommentThreadsMock = { totalReplies: 0, updatedAt: "2020-12-03T11:02:00Z", actor: { + __typename: "Person", avatar: { + __typename: "Media", id: "78", url: "http://someavatar.url.me", }, @@ -123,6 +136,7 @@ export const newCommentForEventMock = { export const newCommentForEventResponse: DataMock = { data: { createComment: { + __typename: "Comment", id: "79", uuid: "e37910ea-fd5a-4756-9679-01171f3f4444", url: @@ -134,8 +148,11 @@ export const newCommentForEventResponse: DataMock = { updatedAt: "2020-12-03T13:02:00Z", originComment: null, inReplyToComment: null, + replies: [], actor: { + __typename: "Person", avatar: { + __typename: "Media", id: "78", url: "http://someavatar.url.me", }, From 00c8be4d8c67f6b235438efaa74d7e2d2914e620 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Thu, 8 Apr 2021 10:04:06 +0200 Subject: [PATCH 27/85] Fix an issue with default bot type value Signed-off-by: Thomas Citharel --- lib/mobilizon/actors/bot.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mobilizon/actors/bot.ex b/lib/mobilizon/actors/bot.ex index 8312f44b7..7946ec14f 100644 --- a/lib/mobilizon/actors/bot.ex +++ b/lib/mobilizon/actors/bot.ex @@ -23,7 +23,7 @@ defmodule Mobilizon.Actors.Bot do schema "bots" do field(:source, :string) - field(:type, :string, default: :ics) + field(:type, :string, default: "ics") belongs_to(:actor, Actor) belongs_to(:user, User) From 944e4dceee594860e0181c26cb7ec189269bfe3e Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Thu, 8 Apr 2021 10:45:14 +0200 Subject: [PATCH 28/85] Fix ex_doc override https://github.com/elixir-cldr/cldr_currencies/issues/3 Signed-off-by: Thomas Citharel --- mix.exs | 2 +- mix.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/mix.exs b/mix.exs index 2c30e4023..1ff25a1aa 100644 --- a/mix.exs +++ b/mix.exs @@ -148,7 +148,7 @@ defmodule Mobilizon.Mixfile do {:phoenix_live_reload, "~> 1.2", only: [:dev, :e2e]}, {:ex_machina, "~> 2.3", only: [:dev, :test]}, {:excoveralls, "~> 0.14.0", only: :test}, - {:ex_doc, "~> 0.23", only: [:dev, :test], runtime: false, override: true}, + {:ex_doc, "~> 0.23", only: [:dev, :test], runtime: false}, {:mix_test_watch, "~> 1.0", only: :dev, runtime: false}, {:ex_unit_notifier, "~> 1.0", only: :test}, {:dialyxir, "~> 1.1", only: [:dev], runtime: false}, diff --git a/mix.lock b/mix.lock index 1250cfda4..dfaad220a 100644 --- a/mix.lock +++ b/mix.lock @@ -36,7 +36,7 @@ "eternal": {:hex, :eternal, "1.2.2", "d1641c86368de99375b98d183042dd6c2b234262b8d08dfd72b9eeaafc2a1abd", [:mix], [], "hexpm", "2c9fe32b9c3726703ba5e1d43a1d255a4f3f2d8f8f9bc19f094c7cb1a7a9e782"}, "ex_cldr": {:hex, :ex_cldr, "2.20.0", "571a4b490c333809be59cc984a21be2deaab1db9e2418e323d5935aec8b1394a", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.5", [hex: :certifi, repo: "hexpm", optional: true]}, {:cldr_utils, "~> 2.15", [hex: :cldr_utils, repo: "hexpm", optional: false]}, {:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:gettext, "~> 0.13", [hex: :gettext, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "06147e4a27be62e6fe92db14cf5048c645927bfc530aa1cc6af8c92d65e32427"}, "ex_cldr_calendars": {:hex, :ex_cldr_calendars, "1.13.0", "6bea6f3c54d74c0ed131dd17e1cff68e02b7053f24c2fac91f129e5221ff723a", [:mix], [{:calendar_interval, "~> 0.2", [hex: :calendar_interval, repo: "hexpm", optional: true]}, {:earmark, "~> 1.0", [hex: :earmark, repo: "hexpm", optional: false]}, {:ex_cldr_numbers, "~> 2.17", [hex: :ex_cldr_numbers, repo: "hexpm", optional: false]}, {:ex_cldr_units, "~> 3.5", [hex: :ex_cldr_units, repo: "hexpm", optional: true]}, {:ex_doc, "~> 0.21", [hex: :ex_doc, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "d07ab6b2164b6a0861de6ecb600747aab61c94a0b9c001e36c2e0b731eeb567a"}, - "ex_cldr_currencies": {:hex, :ex_cldr_currencies, "2.9.0", "2505e2e4a87c88f6e5304f14b3c95bec1cf8b109f335b24b203a8505523584fa", [:mix], [{:ex_cldr, "~> 2.20", [hex: :ex_cldr, repo: "hexpm", optional: false]}, {:ex_doc, "~> 0.18", [hex: :ex_doc, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "9c8c5518ee4a0ac40a0ca282ae9c20de87412bdf8f57121338bac3571d3b9ed5"}, + "ex_cldr_currencies": {:hex, :ex_cldr_currencies, "2.9.1", "692d9d8262bd9c423d601d5ce6ae294df85f8652664e723e2cfd68d97bd72a10", [:mix], [{:ex_cldr, "~> 2.20", [hex: :ex_cldr, repo: "hexpm", optional: false]}, {:ex_doc, "~> 0.18", [hex: :ex_doc, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "1bc6f9eabef1e79e98cb9f8b14dc5657c17ddcbea31e800440fd52a6e45e20ac"}, "ex_cldr_dates_times": {:hex, :ex_cldr_dates_times, "2.7.0", "c8fc77e075e7408fd414b2a4396e2023901032a3c20d94035b8cee54a10f28c9", [:mix], [{:calendar_interval, "~> 0.2", [hex: :calendar_interval, repo: "hexpm", optional: true]}, {:ex_cldr_calendars, "~> 1.13", [hex: :ex_cldr_calendars, repo: "hexpm", optional: false]}, {:ex_cldr_numbers, "~> 2.17", [hex: :ex_cldr_numbers, repo: "hexpm", optional: false]}, {:ex_doc, "~> 0.18", [hex: :ex_doc, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "e21e8c6f9440c91d6111cb39ac96a423d833206ce8d1b24bbdeddd12b2b9427d"}, "ex_cldr_languages": {:hex, :ex_cldr_languages, "0.2.2", "d7dab93272443b70e18e6aef0f62974418baaca3a3b31a66d51921ec1547113c", [:mix], [{:ex_cldr, "~> 2.2 and >= 2.2.1", [hex: :ex_cldr, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "d9cbf4bf643365b0042e774520ddfcbc31618efd5a5383fac98f75149961622c"}, "ex_cldr_numbers": {:hex, :ex_cldr_numbers, "2.17.0", "e79d4161ca82ce8d40bec5bb7dc83d457e81d03e39042e5b62ff48b2cc3c35f3", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:ex_cldr, "~> 2.20", [hex: :ex_cldr, repo: "hexpm", optional: false]}, {:ex_cldr_currencies, "~> 2.9", [hex: :ex_cldr_currencies, repo: "hexpm", optional: false]}, {:ex_doc, "~> 0.18", [hex: :ex_doc, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "c6b7ee62e97cefc6d3c47896608f8152cc65ea40238ea99cd92c6f04acdd1627"}, From bd53bfc46bdbe53011be61e7dad27da92b0e390d Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Thu, 8 Apr 2021 16:41:49 +0200 Subject: [PATCH 29/85] Fix usage of is_bitstring instead of is_binary Signed-off-by: Thomas Citharel --- lib/federation/activity_pub/refresher.ex | 2 +- lib/federation/activity_pub/relay.ex | 2 +- lib/federation/activity_pub/utils.ex | 4 ++-- lib/federation/activity_stream/converter/event.ex | 2 +- lib/federation/activity_stream/converter/media.ex | 2 +- lib/federation/activity_stream/converter/utils.ex | 2 +- lib/graphql/resolvers/admin.ex | 12 +++++++++--- lib/graphql/resolvers/participant.ex | 2 +- lib/mobilizon/admin/admin.ex | 2 +- lib/service/geospatial/provider.ex | 2 +- 10 files changed, 19 insertions(+), 13 deletions(-) diff --git a/lib/federation/activity_pub/refresher.ex b/lib/federation/activity_pub/refresher.ex index f28dd623b..6f485ba4b 100644 --- a/lib/federation/activity_pub/refresher.ex +++ b/lib/federation/activity_pub/refresher.ex @@ -127,7 +127,7 @@ defmodule Mobilizon.Federation.ActivityPub.Refresher do do: process_collection(first, on_behalf_of) defp process_collection(%{"type" => "OrderedCollection", "first" => first}, on_behalf_of) - when is_bitstring(first) do + when is_binary(first) do Logger.debug("OrderedCollection has a first property pointing to an URI") with {:ok, data} <- Fetcher.fetch(first, on_behalf_of: on_behalf_of) do diff --git a/lib/federation/activity_pub/relay.ex b/lib/federation/activity_pub/relay.ex index 13a8b2f12..be98b908b 100644 --- a/lib/federation/activity_pub/relay.ex +++ b/lib/federation/activity_pub/relay.ex @@ -126,7 +126,7 @@ defmodule Mobilizon.Federation.ActivityPub.Relay do end end - defp fetch_object(object) when is_bitstring(object), do: {object, object} + defp fetch_object(object) when is_binary(object), do: {object, object} @spec fetch_actor(String.t()) :: {:ok, String.t()} | {:error, String.t()} # Dirty hack diff --git a/lib/federation/activity_pub/utils.ex b/lib/federation/activity_pub/utils.ex index 988d32333..b21a5bdcc 100644 --- a/lib/federation/activity_pub/utils.ex +++ b/lib/federation/activity_pub/utils.ex @@ -26,7 +26,7 @@ defmodule Mobilizon.Federation.ActivityPub.Utils do # Some implementations send the actor URI as the actor field, others send the entire actor object, # so figure out what the actor's URI is based on what we have. def get_url(%{"id" => id}), do: id - def get_url(id) when is_bitstring(id), do: id + def get_url(id) when is_binary(id), do: id def get_url(ids) when is_list(ids), do: get_url(hd(ids)) def get_url(_), do: nil @@ -223,7 +223,7 @@ defmodule Mobilizon.Federation.ActivityPub.Utils do end end - def get_actor(%{"actor" => %{"id" => id}}) when is_bitstring(id) do + def get_actor(%{"actor" => %{"id" => id}}) when is_binary(id) do id end diff --git a/lib/federation/activity_stream/converter/event.ex b/lib/federation/activity_stream/converter/event.ex index e1b8efa87..d2e932358 100644 --- a/lib/federation/activity_stream/converter/event.ex +++ b/lib/federation/activity_stream/converter/event.ex @@ -155,7 +155,7 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Event do end @spec get_address(map | binary | nil) :: integer | nil - defp get_address(address_url) when is_bitstring(address_url) do + defp get_address(address_url) when is_binary(address_url) do get_address(%{"id" => address_url}) end diff --git a/lib/federation/activity_stream/converter/media.ex b/lib/federation/activity_stream/converter/media.ex index 40ddb90b4..0f1b350e2 100644 --- a/lib/federation/activity_stream/converter/media.ex +++ b/lib/federation/activity_stream/converter/media.ex @@ -38,7 +38,7 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Media do %{"type" => "Document", "url" => media_url, "name" => name}, actor_id ) - when is_bitstring(media_url) do + when is_binary(media_url) do with {:ok, %{body: body}} <- Tesla.get(media_url, opts: @http_options), {:ok, %{name: name, url: url, content_type: content_type, size: size}} <- Upload.store(%{body: body, name: name}), diff --git a/lib/federation/activity_stream/converter/utils.ex b/lib/federation/activity_stream/converter/utils.ex index beb08fe03..79c604a63 100644 --- a/lib/federation/activity_stream/converter/utils.ex +++ b/lib/federation/activity_stream/converter/utils.ex @@ -94,7 +94,7 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Utils do end end - defp fetch_tag(tag) when is_bitstring(tag), do: [tag_without_hash(tag)] + defp fetch_tag(tag) when is_binary(tag), do: [tag_without_hash(tag)] defp tag_without_hash("#" <> tag_title), do: tag_title defp tag_without_hash(tag_title), do: tag_title diff --git a/lib/graphql/resolvers/admin.ex b/lib/graphql/resolvers/admin.ex index b8485d0ae..9bdbe4901 100644 --- a/lib/graphql/resolvers/admin.ex +++ b/lib/graphql/resolvers/admin.ex @@ -321,7 +321,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Admin do {:ok, _activity, follow} -> {:ok, follow} - {:error, {:error, err}} when is_bitstring(err) -> + {:error, {:error, err}} when is_binary(err) -> {:error, err} end end @@ -336,7 +336,10 @@ defmodule Mobilizon.GraphQL.Resolvers.Admin do {:ok, _activity, follow} -> {:ok, follow} - {:error, {:error, err}} when is_bitstring(err) -> + {:error, {:error, err}} when is_binary(err) -> + {:error, err} + + {:error, err} when is_binary(err) -> {:error, err} end end @@ -351,7 +354,10 @@ defmodule Mobilizon.GraphQL.Resolvers.Admin do {:ok, _activity, follow} -> {:ok, follow} - {:error, {:error, err}} when is_bitstring(err) -> + {:error, {:error, err}} when is_binary(err) -> + {:error, err} + + {:error, err} when is_binary(err) -> {:error, err} end end diff --git a/lib/graphql/resolvers/participant.ex b/lib/graphql/resolvers/participant.ex index e41137597..ede77f0dd 100644 --- a/lib/graphql/resolvers/participant.ex +++ b/lib/graphql/resolvers/participant.ex @@ -264,7 +264,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Participant do @spec valid_email?(String.t() | nil) :: boolean defp valid_email?(email) when is_nil(email), do: false - defp valid_email?(email) when is_bitstring(email) do + defp valid_email?(email) when is_binary(email) do email |> String.trim() |> Checker.valid?() diff --git a/lib/mobilizon/admin/admin.ex b/lib/mobilizon/admin/admin.ex index 66bcc6c5b..b307ef6af 100644 --- a/lib/mobilizon/admin/admin.ex +++ b/lib/mobilizon/admin/admin.ex @@ -78,7 +78,7 @@ defmodule Mobilizon.Admin do defp stringify_struct(struct), do: struct def get_admin_setting_value(group, name, fallback \\ nil) - when is_bitstring(group) and is_bitstring(name) do + when is_binary(group) and is_binary(name) do case Repo.get_by(Setting, group: group, name: name) do nil -> fallback diff --git a/lib/service/geospatial/provider.ex b/lib/service/geospatial/provider.ex index 2bc7b7f4c..4d9fadd11 100644 --- a/lib/service/geospatial/provider.ex +++ b/lib/service/geospatial/provider.ex @@ -74,7 +74,7 @@ defmodule Mobilizon.Service.Geospatial.Provider do %Geo.Point{coordinates: {x, y}, srid: srid} end - def coordinates([x, y], srid) when is_bitstring(x) and is_bitstring(y) do + def coordinates([x, y], srid) when is_binary(x) and is_binary(y) do %Geo.Point{coordinates: {String.to_float(x), String.to_float(y)}, srid: srid} end From 5a1f0f39556163c902ad711a148d196a44ab6cb8 Mon Sep 17 00:00:00 2001 From: deadmorose Date: Thu, 8 Apr 2021 18:32:07 +0000 Subject: [PATCH 30/85] Translated using Weblate (Russian) Currently translated at 100.0% (981 of 981 strings) Translation: Mobilizon/Frontend Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/ru/ --- js/src/i18n/ru.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/js/src/i18n/ru.json b/js/src/i18n/ru.json index fba225915..a795fa7df 100644 --- a/js/src/i18n/ru.json +++ b/js/src/i18n/ru.json @@ -220,9 +220,9 @@ "Edited {ago}": "Изменено {ago}", "Eg: Stockholm, Dance, Chess…": "Например: Москва, танцы, шахматы…", "Either on the {instance} instance or on another instance.": "На узле {instance}, либо на другом.", - "Either the account is already validated, either the validation token is incorrect.": "Учетная запись уже подтверждена или токен проверки недействителен.", - "Either the email has already been changed, either the validation token is incorrect.": "Адрес электронной почты уже был изменен или токен проверки недействителен.", - "Either the participation request has already been validated, either the validation token is incorrect.": "Заявка на участие уже подтверждена или токен проверки недействителен.", + "Either the account is already validated, either the validation token is incorrect.": "Учетная запись уже активирована или проверочный токен недействителен.", + "Either the email has already been changed, either the validation token is incorrect.": "Адрес электронной почты уже был изменён или проверочный токен недействителен.", + "Either the participation request has already been validated, either the validation token is incorrect.": "Заявка на участие уже подтверждена или проверочный токен недействителен.", "Email": "Электронная почта", "Email address": "Адрес электронной почты", "Email notifications": "Уведомления по электронной почте", From b34958d3aff044796a06ca4b63fb46feba52677c Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Fri, 9 Apr 2021 10:19:25 +0200 Subject: [PATCH 31/85] Refactor Webfinger module, use XRD host-meta to find webfinger endpoint Signed-off-by: Thomas Citharel --- lib/federation/activity_pub/activity_pub.ex | 2 +- lib/federation/activity_pub/relay.ex | 2 +- lib/federation/web_finger/web_finger.ex | 179 +++++++++++++----- lib/service/http/host_meta_client.ex | 24 +++ mix.exs | 1 + mix.lock | 2 + .../federation/web_finger/web_finger_test.exs | 20 +- .../vcr_cassettes/webfinger/friendica.json | 73 ++++++- .../vcr_cassettes/webfinger/mastodon.json | 64 +++++-- .../vcr_cassettes/webfinger/peertube.json | 83 ++++++-- .../vcr_cassettes/webfinger/pleroma.json | 105 ++++++++-- .../controllers/webfinger_controller_test.exs | 4 +- 12 files changed, 442 insertions(+), 117 deletions(-) create mode 100644 lib/service/http/host_meta_client.ex diff --git a/lib/federation/activity_pub/activity_pub.ex b/lib/federation/activity_pub/activity_pub.ex index 651aa768a..608955b0b 100644 --- a/lib/federation/activity_pub/activity_pub.ex +++ b/lib/federation/activity_pub/activity_pub.ex @@ -654,7 +654,7 @@ defmodule Mobilizon.Federation.ActivityPub do @spec make_actor_from_nickname(String.t()) :: {:ok, %Actor{}} | {:error, any()} def make_actor_from_nickname(nickname) do case WebFinger.finger(nickname) do - {:ok, %{"url" => url}} when not is_nil(url) -> + {:ok, url} when is_binary(url) -> make_actor_from_url(url) _e -> diff --git a/lib/federation/activity_pub/relay.ex b/lib/federation/activity_pub/relay.ex index be98b908b..b0a8997c9 100644 --- a/lib/federation/activity_pub/relay.ex +++ b/lib/federation/activity_pub/relay.ex @@ -159,7 +159,7 @@ defmodule Mobilizon.Federation.ActivityPub.Relay do @spec finger_actor(String.t()) :: {:ok, String.t()} | {:error, String.t()} defp finger_actor(nickname) do case WebFinger.finger(nickname) do - {:ok, %{"url" => url}} when not is_nil(url) -> + {:ok, url} when is_binary(url) -> {:ok, url} _e -> diff --git a/lib/federation/web_finger/web_finger.ex b/lib/federation/web_finger/web_finger.ex index c0b44e6c9..fbde57e4b 100644 --- a/lib/federation/web_finger/web_finger.ex +++ b/lib/federation/web_finger/web_finger.ex @@ -12,26 +12,37 @@ defmodule Mobilizon.Federation.WebFinger do alias Mobilizon.Actors.Actor alias Mobilizon.Federation.ActivityPub alias Mobilizon.Federation.WebFinger.XmlBuilder - alias Mobilizon.Service.HTTP.WebfingerClient + alias Mobilizon.Service.HTTP.{HostMetaClient, WebfingerClient} alias Mobilizon.Web.Endpoint alias Mobilizon.Web.Router.Helpers, as: Routes require Jason require Logger + import SweetXml def host_meta do base_url = Endpoint.url() + %URI{host: host} = URI.parse(base_url) { :XRD, - %{xmlns: "http://docs.oasis-open.org/ns/xri/xrd-1.0"}, - { - :Link, - %{ - rel: "lrdd", - type: "application/xrd+xml", - template: "#{base_url}/.well-known/webfinger?resource={uri}" + %{ + xmlns: "http://docs.oasis-open.org/ns/xri/xrd-1.0", + "xmlns:hm": "http://host-meta.net/ns/1.0" + }, + [ + { + :"hm:Host", + host + }, + { + :Link, + %{ + rel: "lrdd", + type: "application/jrd+json", + template: "#{base_url}/.well-known/webfinger?resource={uri}" + } } - } + ] } |> XmlBuilder.to_doc() end @@ -56,29 +67,116 @@ defmodule Mobilizon.Federation.WebFinger do end @spec represent_actor(Actor.t()) :: struct() - def represent_actor(actor), do: represent_actor(actor, "JSON") + def represent_actor(%Actor{} = actor), do: represent_actor(actor, "JSON") @spec represent_actor(Actor.t(), String.t()) :: struct() - def represent_actor(actor, "JSON") do - %{ - "subject" => "acct:#{actor.preferred_username}@#{Endpoint.host()}", - "aliases" => [actor.url], - "links" => [ + def represent_actor(%Actor{} = actor, "JSON") do + links = + [ %{"rel" => "self", "type" => "application/activity+json", "href" => actor.url}, - %{ - "rel" => "https://webfinger.net/rel/profile-page/", - "type" => "text/html", - "href" => actor.url - }, %{ "rel" => "http://ostatus.org/schema/1.0/subscribe", "template" => "#{Routes.page_url(Endpoint, :interact, uri: nil)}{uri}" } ] + |> maybe_add_avatar(actor) + |> maybe_add_profile_page(actor) + + %{ + "subject" => "acct:#{actor.preferred_username}@#{Endpoint.host()}", + "aliases" => [actor.url], + "links" => links } end - defp webfinger_from_json(doc) do + defp maybe_add_avatar(data, %Actor{avatar: avatar}) when not is_nil(avatar) do + data ++ + [ + %{ + "rel" => "http://webfinger.net/rel/avatar", + "type" => avatar.content_type, + "href" => avatar.url + } + ] + end + + defp maybe_add_avatar(data, _actor), do: data + + defp maybe_add_profile_page(data, %Actor{type: :Group, url: url}) do + data ++ + [ + %{ + "rel" => "http://webfinger.net/rel/profile-page/", + "type" => "text/html", + "href" => url + } + ] + end + + defp maybe_add_profile_page(data, _actor), do: data + + @doc """ + Finger an actor to retreive it's ActivityPub ID/URL + + Fetches the Extensible Resource Descriptor endpoint `/.well-known/host-meta` to find the Webfinger endpoint (usually `/.well-known/webfinger?resource=`) with `find_webfinger_endpoint/1` and then performs a Webfinger query to get the ActivityPub ID associated to an actor. + """ + @spec finger(String.t()) :: {:ok, String.t()} | {:error, atom()} + def finger(actor) do + actor = String.trim_leading(actor, "@") + + with address when is_binary(address) <- apply_webfinger_endpoint(actor), + false <- address_invalid(address), + {:ok, %{body: body, status: code}} when code in 200..299 <- + WebfingerClient.get(address), + {:ok, %{"url" => url}} <- webfinger_from_json(body) do + {:ok, url} + else + e -> + Logger.debug("Couldn't finger #{actor}") + Logger.debug(inspect(e)) + {:error, e} + end + end + + @doc """ + Fetches the Extensible Resource Descriptor endpoint `/.well-known/host-meta` to find the Webfinger endpoint (usually `/.well-known/webfinger?resource=`) + """ + @spec find_webfinger_endpoint(String.t()) :: String.t() + def find_webfinger_endpoint(domain) when is_binary(domain) do + with {:ok, %{body: body}} <- fetch_document("http://#{domain}/.well-known/host-meta"), + link_template <- find_link_from_template(body) do + {:ok, link_template} + end + end + + @spec apply_webfinger_endpoint(String.t()) :: String.t() | {:error, :host_not_found} + defp apply_webfinger_endpoint(actor) do + with {:ok, domain} <- domain_from_federated_actor(actor) do + case find_webfinger_endpoint(domain) do + {:ok, link_template} -> + String.replace(link_template, "{uri}", "acct:#{actor}") + + _ -> + "http://#{domain}/.well-known/webfinger?resource=acct:#{actor}" + end + end + end + + @spec domain_from_federated_actor(String.t()) :: {:ok, String.t()} | {:error, :host_not_found} + defp domain_from_federated_actor(actor) do + case String.split(actor, "@") do + [_name, domain] -> + {:ok, domain} + + _e -> + host = URI.parse(actor).host + if is_nil(host), do: {:error, :host_not_found}, else: {:ok, host} + end + end + + @spec webfinger_from_json(map() | String.t()) :: + {:ok, map()} | {:error, :webfinger_information_not_json} + defp webfinger_from_json(doc) when is_map(doc) do data = Enum.reduce(doc["links"], %{"subject" => doc["subject"]}, fn link, data -> case {link["type"], link["rel"]} do @@ -97,31 +195,26 @@ defmodule Mobilizon.Federation.WebFinger do {:ok, data} end - def finger(actor) do - actor = String.trim_leading(actor, "@") + defp webfinger_from_json(_doc), do: {:error, :webfinger_information_not_json} - domain = - case String.split(actor, "@") do - [_name, domain] -> - domain + @spec find_link_from_template(String.t()) :: String.t() | {:error, :link_not_found} + defp find_link_from_template(doc) do + with res when res in [nil, ""] <- + xpath(doc, ~x"//Link[@rel=\"lrdd\"][@type=\"application/json\"]/@template"s), + res when res in [nil, ""] <- xpath(doc, ~x"//Link[@rel=\"lrdd\"]/@template"s), + do: {:error, :link_not_found} + end - _e -> - URI.parse(actor).host - end + @spec fetch_document(String.t()) :: Tesla.Env.result() + defp fetch_document(endpoint) do + with {:error, err} <- HostMetaClient.get(endpoint), do: {:error, err} + end - address = "http://#{domain}/.well-known/webfinger?resource=acct:#{actor}" - - Logger.debug(inspect(address)) - - with false <- is_nil(domain), - {:ok, %{body: body, status: code}} when code in 200..299 <- - WebfingerClient.get(address) do - webfinger_from_json(body) - else - e -> - Logger.debug(fn -> "Couldn't finger #{actor}" end) - Logger.debug(fn -> inspect(e) end) - {:error, e} + @spec address_invalid(String.t()) :: false | {:error, :invalid_address} + defp address_invalid(address) do + with %URI{host: host, scheme: scheme} <- URI.parse(address), + true <- is_nil(host) or is_nil(scheme) do + {:error, :invalid_address} end end end diff --git a/lib/service/http/host_meta_client.ex b/lib/service/http/host_meta_client.ex new file mode 100644 index 000000000..4ebe0cf2d --- /dev/null +++ b/lib/service/http/host_meta_client.ex @@ -0,0 +1,24 @@ +defmodule Mobilizon.Service.HTTP.HostMetaClient do + @moduledoc """ + Tesla HTTP Basic Client + with XML middleware + """ + + use Tesla + alias Mobilizon.Config + + @default_opts [ + recv_timeout: 20_000 + ] + + adapter(Tesla.Adapter.Hackney, @default_opts) + + plug(Tesla.Middleware.FollowRedirects) + + plug(Tesla.Middleware.Timeout, timeout: 10_000) + + plug(Tesla.Middleware.Headers, [ + {"User-Agent", Config.instance_user_agent()}, + {"Accept", "application/xrd+xml, application/xml, text/xml"} + ]) +end diff --git a/mix.exs b/mix.exs index 1ff25a1aa..000924be5 100644 --- a/mix.exs +++ b/mix.exs @@ -144,6 +144,7 @@ defmodule Mobilizon.Mixfile do {:slugger, "~> 0.3"}, {:sentry, "~> 8.0"}, {:html_entities, "~> 0.5"}, + {:sweet_xml, "~> 0.6.6"}, # Dev and test dependencies {:phoenix_live_reload, "~> 1.2", only: [:dev, :e2e]}, {:ex_machina, "~> 2.3", only: [:dev, :test]}, diff --git a/mix.lock b/mix.lock index dfaad220a..9123929f6 100644 --- a/mix.lock +++ b/mix.lock @@ -33,6 +33,7 @@ "elixir_feed_parser": {:hex, :elixir_feed_parser, "2.1.0", "bb96fb6422158dc7ad59de62ef211cc69d264acbbe63941a64a5dce97bbbc2e6", [:mix], [{:timex, "~> 3.4", [hex: :timex, repo: "hexpm", optional: false]}], "hexpm", "2d3c62fe7b396ee3b73d7160bc8fadbd78bfe9597c98c7d79b3f1038d9cba28f"}, "elixir_make": {:hex, :elixir_make, "0.6.2", "7dffacd77dec4c37b39af867cedaabb0b59f6a871f89722c25b28fcd4bd70530", [:mix], [], "hexpm", "03e49eadda22526a7e5279d53321d1cced6552f344ba4e03e619063de75348d9"}, "erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"}, + "erlsom": {:hex, :erlsom, "1.5.0", "c5a5cdd0ee0e8dca62bcc4b13ff08da24fdefc16ccd8b25282a2fda2ba1be24a", [:rebar3], [], "hexpm", "55a9dbf9cfa77fcfc108bd8e2c4f9f784dea228a8f4b06ea10b684944946955a"}, "eternal": {:hex, :eternal, "1.2.2", "d1641c86368de99375b98d183042dd6c2b234262b8d08dfd72b9eeaafc2a1abd", [:mix], [], "hexpm", "2c9fe32b9c3726703ba5e1d43a1d255a4f3f2d8f8f9bc19f094c7cb1a7a9e782"}, "ex_cldr": {:hex, :ex_cldr, "2.20.0", "571a4b490c333809be59cc984a21be2deaab1db9e2418e323d5935aec8b1394a", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.5", [hex: :certifi, repo: "hexpm", optional: true]}, {:cldr_utils, "~> 2.15", [hex: :cldr_utils, repo: "hexpm", optional: false]}, {:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:gettext, "~> 0.13", [hex: :gettext, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "06147e4a27be62e6fe92db14cf5048c645927bfc530aa1cc6af8c92d65e32427"}, "ex_cldr_calendars": {:hex, :ex_cldr_calendars, "1.13.0", "6bea6f3c54d74c0ed131dd17e1cff68e02b7053f24c2fac91f129e5221ff723a", [:mix], [{:calendar_interval, "~> 0.2", [hex: :calendar_interval, repo: "hexpm", optional: true]}, {:earmark, "~> 1.0", [hex: :earmark, repo: "hexpm", optional: false]}, {:ex_cldr_numbers, "~> 2.17", [hex: :ex_cldr_numbers, repo: "hexpm", optional: false]}, {:ex_cldr_units, "~> 3.5", [hex: :ex_cldr_units, repo: "hexpm", optional: true]}, {:ex_doc, "~> 0.21", [hex: :ex_doc, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "d07ab6b2164b6a0861de6ecb600747aab61c94a0b9c001e36c2e0b731eeb567a"}, @@ -122,6 +123,7 @@ "slugger": {:hex, :slugger, "0.3.0", "efc667ab99eee19a48913ccf3d038b1fb9f165fa4fbf093be898b8099e61b6ed", [:mix], [], "hexpm", "20d0ded0e712605d1eae6c5b4889581c3460d92623a930ddda91e0e609b5afba"}, "sobelow": {:hex, :sobelow, "0.11.1", "23438964486f8112b41e743bbfd402da3e5b296fdc9eacab29914b79c48916dd", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "9897363a7eff96f4809304a90aad819e2ad5e5d24db547af502885146746a53c"}, "ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"}, + "sweet_xml": {:hex, :sweet_xml, "0.6.6", "fc3e91ec5dd7c787b6195757fbcf0abc670cee1e4172687b45183032221b66b8", [:mix], [], "hexpm", "2e1ec458f892ffa81f9f8386e3f35a1af6db7a7a37748a64478f13163a1f3573"}, "telemetry": {:hex, :telemetry, "0.4.2", "2808c992455e08d6177322f14d3bdb6b625fbcfd233a73505870d8738a2f4599", [:rebar3], [], "hexpm", "2d1419bd9dda6a206d7b5852179511722e2b18812310d304620c7bd92a13fcef"}, "tesla": {:hex, :tesla, "1.4.1", "ff855f1cac121e0d16281b49e8f066c4a0d89965f98864515713878cca849ac8", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:finch, "~> 0.3", [hex: :finch, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:gun, "~> 1.3", [hex: :gun, repo: "hexpm", optional: true]}, {:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "~> 4.4.0", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: true]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "95f5de35922c8c4b3945bee7406f66eb680b0955232f78f5fb7e853aa1ce201a"}, "timex": {:hex, :timex, "3.7.5", "3eca56e23bfa4e0848f0b0a29a92fa20af251a975116c6d504966e8a90516dfd", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 1.0", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "a15608dca680f2ef663d71c95842c67f0af08a0f3b1d00e17bbd22872e2874e4"}, diff --git a/test/federation/web_finger/web_finger_test.exs b/test/federation/web_finger/web_finger_test.exs index 6aba2c594..19b9724d9 100644 --- a/test/federation/web_finger/web_finger_test.exs +++ b/test/federation/web_finger/web_finger_test.exs @@ -54,10 +54,7 @@ defmodule Mobilizon.Federation.WebFingerTest do describe "fingering" do test "a mastodon actor" do use_cassette "webfinger/mastodon" do - res = %{ - "subject" => "acct:" <> @mastodon_account, - "url" => "https://social.tcit.fr/users/#{@mastodon_account_username}" - } + res = "https://social.tcit.fr/users/#{@mastodon_account_username}" assert {:ok, res} == WebFinger.finger(@mastodon_account) end @@ -65,10 +62,7 @@ defmodule Mobilizon.Federation.WebFingerTest do test "a pleroma actor" do use_cassette "webfinger/pleroma" do - res = %{ - "subject" => "acct:" <> @pleroma_account, - "url" => "https://pleroma.soykaf.com/users/#{@pleroma_account_username}" - } + res = "https://pleroma.soykaf.com/users/#{@pleroma_account_username}" assert {:ok, res} == WebFinger.finger(@pleroma_account) end @@ -76,10 +70,7 @@ defmodule Mobilizon.Federation.WebFingerTest do test "a peertube actor" do use_cassette "webfinger/peertube" do - res = %{ - "subject" => "acct:" <> @peertube_account, - "url" => "https://framatube.org/accounts/#{@peertube_account_username}" - } + res = "https://framatube.org/accounts/#{@peertube_account_username}" assert {:ok, res} == WebFinger.finger(@peertube_account) end @@ -87,10 +78,7 @@ defmodule Mobilizon.Federation.WebFingerTest do test "a friendica actor" do use_cassette "webfinger/friendica" do - res = %{ - "subject" => "acct:" <> @friendica_account, - "url" => "https://squeet.me/profile/#{@friendica_account_username}" - } + res = "https://squeet.me/profile/#{@friendica_account_username}" assert {:ok, res} == WebFinger.finger(@friendica_account) end diff --git a/test/fixtures/vcr_cassettes/webfinger/friendica.json b/test/fixtures/vcr_cassettes/webfinger/friendica.json index 470269a07..dcbc3b4b0 100644 --- a/test/fixtures/vcr_cassettes/webfinger/friendica.json +++ b/test/fixtures/vcr_cassettes/webfinger/friendica.json @@ -3,28 +3,81 @@ "request": { "body": "", "headers": { + "User-Agent": "localhost - Mobilizon 1.1.0-32-gbd53bfc4-dirty", + "Accept": "application/xrd+xml, application/xml, text/xml" + }, + "method": "get", + "options": { + "recv_timeout": 20000 + }, + "request_body": "", + "url": "http://squeet.me/.well-known/host-meta" + }, + "response": { + "binary": false, + "body": "\n\n301 Moved Permanently\n\n

    Moved Permanently

    \n

    The document has moved here.

    \n
    \n
    Apache/2.4.25 (Debian) Server at squeet.me Port 80
    \n\n", + "headers": { + "Date": "Fri, 09 Apr 2021 08:08:52 GMT", + "Server": "Apache/2.4.25 (Debian)", + "Location": "https://squeet.me/.well-known/host-meta", + "Content-Length": "322", + "Content-Type": "text/html; charset=iso-8859-1" + }, + "status_code": 301, + "type": "ok" + } + }, + { + "request": { + "body": "", + "headers": { + "User-Agent": "localhost - Mobilizon 1.1.0-32-gbd53bfc4-dirty", + "Accept": "application/xrd+xml, application/xml, text/xml" + }, + "method": "get", + "options": { + "recv_timeout": 20000 + }, + "request_body": "", + "url": "https://squeet.me/.well-known/host-meta" + }, + "response": { + "binary": false, + "body": "\n\n \n squeet.me\n \n \n \n \n \n\t\n\n RSA.xlM2BNDH9hnO3W6vOUfJ5-tcUCaX-rx-kKydQd4ht21At4D4d1MrZ6nAQu7rnf5or9YZRhIpgvJvXBqWSo0zmALkUZUVrsS9WhH65I0qt24XNTPZJ1FdPDd7c1C131GzkymCbXBie3U2JaT7t0oimhWKUeA45gNfXk1T1l-7v4k.AQAB\n\n", + "headers": { + "Date": "Fri, 09 Apr 2021 08:08:52 GMT", + "Server": "Apache/2.4.25 (Debian)", + "X-Account-Management-Status": "none", + "Vary": "Accept-Encoding", + "Transfer-Encoding": "chunked", + "Content-Type": "text/xml;charset=UTF-8" + }, + "status_code": 200, + "type": "ok" + } + }, + { + "request": { + "body": "", + "headers": { + "User-Agent": "localhost - Mobilizon 1.1.0-32-gbd53bfc4-dirty", "Accept": "application/json, application/activity+json, application/jrd+json" }, "method": "get", "options": { - "follow_redirect": "true" + "recv_timeout": 20000 }, "request_body": "", - "url": "http://squeet.me/.well-known/webfinger?resource=acct:lain@squeet.me" + "url": "https://squeet.me/.well-known/webfinger?resource=acct:lain@squeet.me" }, "response": { "binary": false, - "body": "{\"subject\":\"acct:lain@squeet.me\",\"aliases\":[\"https:\\/\\/squeet.me\\/~lain\",\"https:\\/\\/squeet.me\\/profile\\/lain\"],\"links\":[{\"rel\":\"http:\\/\\/purl.org\\/macgirvin\\/dfrn\\/1.0\",\"href\":\"https:\\/\\/squeet.me\\/profile\\/lain\"},{\"rel\":\"http:\\/\\/schemas.google.com\\/g\\/2010#updates-from\",\"type\":\"application\\/atom+xml\",\"href\":\"https:\\/\\/squeet.me\\/dfrn_poll\\/lain\"},{\"rel\":\"http:\\/\\/webfinger.net\\/rel\\/profile-page\",\"type\":\"text\\/html\",\"href\":\"https:\\/\\/squeet.me\\/profile\\/lain\"},{\"rel\":\"self\",\"type\":\"application\\/activity+json\",\"href\":\"https:\\/\\/squeet.me\\/profile\\/lain\"},{\"rel\":\"http:\\/\\/microformats.org\\/profile\\/hcard\",\"type\":\"text\\/html\",\"href\":\"https:\\/\\/squeet.me\\/hcard\\/lain\"},{\"rel\":\"http:\\/\\/portablecontacts.net\\/spec\\/1.0\",\"href\":\"https:\\/\\/squeet.me\\/poco\\/lain\"},{\"rel\":\"http:\\/\\/webfinger.net\\/rel\\/avatar\",\"type\":\"image\\/jpeg\",\"href\":\"https:\\/\\/squeet.me\\/photo\\/profile\\/301.jpg\"},{\"rel\":\"http:\\/\\/joindiaspora.com\\/seed_location\",\"type\":\"text\\/html\",\"href\":\"https:\\/\\/squeet.me\"},{\"rel\":\"salmon\",\"href\":\"https:\\/\\/squeet.me\\/salmon\\/lain\"},{\"rel\":\"http:\\/\\/salmon-protocol.org\\/ns\\/salmon-replies\",\"href\":\"https:\\/\\/squeet.me\\/salmon\\/lain\"},{\"rel\":\"http:\\/\\/salmon-protocol.org\\/ns\\/salmon-mention\",\"href\":\"https:\\/\\/squeet.me\\/salmon\\/lain\\/mention\"},{\"rel\":\"http:\\/\\/ostatus.org\\/schema\\/1.0\\/subscribe\",\"template\":\"https:\\/\\/squeet.me\\/follow?url={uri}\"},{\"rel\":\"magic-public-key\",\"href\":\"data:application\\/magic-public-key,RSA.AMwa8FUs2fWEjX0xN7yRQgegQffhBpuKNC6fa5VNSVorFjGZhRrlPMn7TQOeihlc9lBz2OsHlIedbYn2uJ7yCs0.AQAB\"},{\"rel\":\"http:\\/\\/purl.org\\/openwebauth\\/v1\",\"type\":\"application\\/x-dfrn+json\",\"href\":\"https:\\/\\/squeet.me\\/owa\"}]}", + "body": "{\"subject\":\"acct:lain@squeet.me\",\"aliases\":[\"https:\\/\\/squeet.me\\/~lain\",\"https:\\/\\/squeet.me\\/profile\\/lain\"],\"links\":[{\"rel\":\"http:\\/\\/purl.org\\/macgirvin\\/dfrn\\/1.0\",\"href\":\"https:\\/\\/squeet.me\\/profile\\/lain\"},{\"rel\":\"http:\\/\\/schemas.google.com\\/g\\/2010#updates-from\",\"type\":\"application\\/atom+xml\",\"href\":\"https:\\/\\/squeet.me\\/dfrn_poll\\/lain\"},{\"rel\":\"http:\\/\\/webfinger.net\\/rel\\/profile-page\",\"type\":\"text\\/html\",\"href\":\"https:\\/\\/squeet.me\\/profile\\/lain\"},{\"rel\":\"self\",\"type\":\"application\\/activity+json\",\"href\":\"https:\\/\\/squeet.me\\/profile\\/lain\"},{\"rel\":\"http:\\/\\/microformats.org\\/profile\\/hcard\",\"type\":\"text\\/html\",\"href\":\"https:\\/\\/squeet.me\\/hcard\\/lain\"},{\"rel\":\"http:\\/\\/portablecontacts.net\\/spec\\/1.0\",\"href\":\"https:\\/\\/squeet.me\\/poco\\/lain\"},{\"rel\":\"http:\\/\\/webfinger.net\\/rel\\/avatar\",\"type\":\"image\\/jpeg\",\"href\":\"https:\\/\\/squeet.me\\/photo\\/abf2ee40bfcb044ac7fd1d143c82f63a-4.jpg?ts=1526641378\"},{\"rel\":\"http:\\/\\/joindiaspora.com\\/seed_location\",\"type\":\"text\\/html\",\"href\":\"https:\\/\\/squeet.me\"},{\"rel\":\"salmon\",\"href\":\"https:\\/\\/squeet.me\\/salmon\\/lain\"},{\"rel\":\"http:\\/\\/salmon-protocol.org\\/ns\\/salmon-replies\",\"href\":\"https:\\/\\/squeet.me\\/salmon\\/lain\"},{\"rel\":\"http:\\/\\/salmon-protocol.org\\/ns\\/salmon-mention\",\"href\":\"https:\\/\\/squeet.me\\/salmon\\/lain\\/mention\"},{\"rel\":\"http:\\/\\/ostatus.org\\/schema\\/1.0\\/subscribe\",\"template\":\"https:\\/\\/squeet.me\\/follow?url={uri}\"},{\"rel\":\"magic-public-key\",\"href\":\"data:application\\/magic-public-key,RSA.zBrwVSzZ9YSNfTE3vJFCB6BB9-EGm4o0Lp9rlU1JWisWMZmFGuU8yftNA56KGVz2UHPY6weUh51tifa4nvIKzQ.AQAB\"},{\"rel\":\"http:\\/\\/purl.org\\/openwebauth\\/v1\",\"type\":\"application\\/x-zot+json\",\"href\":\"https:\\/\\/squeet.me\\/owa\"}]}", "headers": { - "Date": "Tue, 13 Nov 2018 11:11:09 GMT", - "Server": "Apache", - "Expires": "Thu, 19 Nov 1981 08:52:00 GMT", - "Cache-Control": "no-store, no-cache, must-revalidate", - "Pragma": "no-cache", + "Date": "Fri, 09 Apr 2021 08:08:52 GMT", + "Server": "Apache/2.4.25 (Debian)", "X-Account-Management-Status": "none", "Access-Control-Allow-Origin": "*", - "Set-Cookie": "PHPSESSID=330arcps63iok272c5hqdsfhp3; path=/; secure; HttpOnly", - "Strict-Transport-Security": "max-age=31536000; includeSubDomains", "Transfer-Encoding": "chunked", "Content-Type": "application/json; charset=utf-8" }, diff --git a/test/fixtures/vcr_cassettes/webfinger/mastodon.json b/test/fixtures/vcr_cassettes/webfinger/mastodon.json index a9d77ba2c..99bc062cb 100644 --- a/test/fixtures/vcr_cassettes/webfinger/mastodon.json +++ b/test/fixtures/vcr_cassettes/webfinger/mastodon.json @@ -3,26 +3,26 @@ "request": { "body": "", "headers": { - "User-Agent": "localhost - Mobilizon 1.0.0-rc.2-5-g6701e6a4", - "Accept": "application/json, application/activity+json, application/jrd+json" + "User-Agent": "localhost - Mobilizon 1.1.0-32-gbd53bfc4-dirty", + "Accept": "application/xrd+xml, application/xml, text/xml" }, "method": "get", "options": { "recv_timeout": 20000 }, "request_body": "", - "url": "http://social.tcit.fr/.well-known/webfinger?resource=acct:tcit@social.tcit.fr" + "url": "http://social.tcit.fr/.well-known/host-meta" }, "response": { "binary": false, - "body": "\r\n301 Moved Permanently\r\n\r\n

    301 Moved Permanently

    \r\n
    nginx/1.19.3
    \r\n\r\n\r\n", + "body": "\r\n301 Moved Permanently\r\n\r\n

    301 Moved Permanently

    \r\n
    nginx/1.14.2
    \r\n\r\n\r\n", "headers": { - "Server": "nginx/1.19.3", - "Date": "Wed, 21 Oct 2020 09:07:41 GMT", + "Server": "nginx/1.14.2", + "Date": "Thu, 08 Apr 2021 18:59:56 GMT", "Content-Type": "text/html", - "Content-Length": "169", + "Content-Length": "185", "Connection": "keep-alive", - "Location": "https://social.tcit.fr/.well-known/webfinger?resource=acct:tcit@social.tcit.fr" + "Location": "https://social.tcit.fr/.well-known/host-meta" }, "status_code": 301, "type": "ok" @@ -32,7 +32,47 @@ "request": { "body": "", "headers": { - "User-Agent": "localhost - Mobilizon 1.0.0-rc.2-5-g6701e6a4", + "User-Agent": "localhost - Mobilizon 1.1.0-32-gbd53bfc4-dirty", + "Accept": "application/xrd+xml, application/xml, text/xml" + }, + "method": "get", + "options": { + "recv_timeout": 20000 + }, + "request_body": "", + "url": "https://social.tcit.fr/.well-known/host-meta" + }, + "response": { + "binary": false, + "body": "\n\n \n\n", + "headers": { + "Date": "Thu, 08 Apr 2021 18:59:56 GMT", + "Content-Type": "application/xrd+xml; charset=utf-8", + "Transfer-Encoding": "chunked", + "Connection": "keep-alive", + "Server": "Mastodon", + "X-Frame-Options": "DENY", + "X-Content-Type-Options": "nosniff", + "X-XSS-Protection": "1; mode=block", + "Referrer-Policy": "same-origin", + "Strict-Transport-Security": "max-age=63072000; includeSubDomains; preload", + "X-Clacks-Overhead": "GNU Natalie Nguyen", + "Vary": "Accept, Accept-Encoding, Origin", + "Cache-Control": "max-age=259200, public", + "ETag": "W/\"b397089bfee005b03360ba4435bb4aad\"", + "X-Request-Id": "41e837ba-21a6-4324-bda8-cac28a8d1778", + "X-Runtime": "0.004198", + "X-Cached": "MISS" + }, + "status_code": 200, + "type": "ok" + } + }, + { + "request": { + "body": "", + "headers": { + "User-Agent": "localhost - Mobilizon 1.1.0-32-gbd53bfc4-dirty", "Accept": "application/json, application/activity+json, application/jrd+json" }, "method": "get", @@ -46,7 +86,7 @@ "binary": false, "body": "{\"subject\":\"acct:tcit@social.tcit.fr\",\"aliases\":[\"https://social.tcit.fr/@tcit\",\"https://social.tcit.fr/users/tcit\"],\"links\":[{\"rel\":\"http://webfinger.net/rel/profile-page\",\"type\":\"text/html\",\"href\":\"https://social.tcit.fr/@tcit\"},{\"rel\":\"self\",\"type\":\"application/activity+json\",\"href\":\"https://social.tcit.fr/users/tcit\"},{\"rel\":\"http://ostatus.org/schema/1.0/subscribe\",\"template\":\"https://social.tcit.fr/authorize_interaction?uri={uri}\"}]}", "headers": { - "Date": "Wed, 21 Oct 2020 09:07:41 GMT", + "Date": "Thu, 08 Apr 2021 18:59:56 GMT", "Content-Type": "application/jrd+json; charset=utf-8", "Transfer-Encoding": "chunked", "Connection": "keep-alive", @@ -60,8 +100,8 @@ "Vary": "Accept, Accept-Encoding, Origin", "Cache-Control": "max-age=259200, public", "ETag": "W/\"37760e35c1537b8e02b6d4b4f9ebfe82\"", - "X-Request-Id": "429bb891-1033-498b-91bb-12835984223f", - "X-Runtime": "0.072046", + "X-Request-Id": "4c8384d6-d921-4ef6-8a18-1fcbf35ee6bc", + "X-Runtime": "0.009277", "X-Cached": "MISS" }, "status_code": 200, diff --git a/test/fixtures/vcr_cassettes/webfinger/peertube.json b/test/fixtures/vcr_cassettes/webfinger/peertube.json index bc97f4a06..53d979e2e 100644 --- a/test/fixtures/vcr_cassettes/webfinger/peertube.json +++ b/test/fixtures/vcr_cassettes/webfinger/peertube.json @@ -3,33 +3,88 @@ "request": { "body": "", "headers": { + "User-Agent": "localhost - Mobilizon 1.1.0-32-gbd53bfc4-dirty", + "Accept": "application/xrd+xml, application/xml, text/xml" + }, + "method": "get", + "options": { + "recv_timeout": 20000 + }, + "request_body": "", + "url": "http://framatube.org/.well-known/host-meta" + }, + "response": { + "binary": false, + "body": "\r\n301 Moved Permanently\r\n\r\n

    301 Moved Permanently

    \r\n
    nginx/1.14.2
    \r\n\r\n\r\n", + "headers": { + "Server": "nginx/1.14.2", + "Date": "Thu, 08 Apr 2021 18:59:59 GMT", + "Content-Type": "text/html", + "Content-Length": "185", + "Connection": "keep-alive", + "Location": "https://framatube.org/.well-known/host-meta" + }, + "status_code": 301, + "type": "ok" + } + }, + { + "request": { + "body": "", + "headers": { + "User-Agent": "localhost - Mobilizon 1.1.0-32-gbd53bfc4-dirty", + "Accept": "application/xrd+xml, application/xml, text/xml" + }, + "method": "get", + "options": { + "recv_timeout": 20000 + }, + "request_body": "", + "url": "https://framatube.org/.well-known/host-meta" + }, + "response": { + "binary": false, + "body": "\n\n \n", + "headers": { + "Server": "nginx/1.14.2", + "Date": "Thu, 08 Apr 2021 18:59:59 GMT", + "Content-Type": "application/xml; charset=utf-8", + "Content-Length": "219", + "Connection": "keep-alive", + "Tk": "N", + "Access-Control-Allow-Origin": "*", + "ETag": "W/\"db-l6RCFQ8UK40DPZ9VQ8G/SKn3A64\"" + }, + "status_code": 200, + "type": "ok" + } + }, + { + "request": { + "body": "", + "headers": { + "User-Agent": "localhost - Mobilizon 1.1.0-32-gbd53bfc4-dirty", "Accept": "application/json, application/activity+json, application/jrd+json" }, "method": "get", "options": { - "follow_redirect": "true" + "recv_timeout": 20000 }, "request_body": "", - "url": "http://framatube.org/.well-known/webfinger?resource=acct:framasoft@framatube.org" + "url": "https://framatube.org/.well-known/webfinger?resource=acct:framasoft@framatube.org" }, "response": { "binary": false, - "body": "{\"subject\":\"acct:framasoft@framatube.org\",\"aliases\":[\"https://framatube.org/accounts/framasoft\"],\"links\":[{\"rel\":\"self\",\"type\":\"application/activity+json\",\"href\":\"https://framatube.org/accounts/framasoft\"}]}", + "body": "{\"subject\":\"acct:framasoft@framatube.org\",\"aliases\":[\"https://framatube.org/accounts/framasoft\"],\"links\":[{\"rel\":\"self\",\"type\":\"application/activity+json\",\"href\":\"https://framatube.org/accounts/framasoft\"},{\"rel\":\"http://ostatus.org/schema/1.0/subscribe\",\"template\":\"https://framatube.org/remote-interaction?uri={uri}\"}]}", "headers": { - "Server": "nginx/1.10.3", - "Date": "Tue, 13 Nov 2018 11:11:11 GMT", + "Server": "nginx/1.14.2", + "Date": "Thu, 08 Apr 2021 18:59:59 GMT", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "207", + "Content-Length": "321", "Connection": "keep-alive", - "X-DNS-Prefetch-Control": "off", - "X-Frame-Options": "DENY", - "X-Download-Options": "noopen", - "X-Content-Type-Options": "nosniff", - "X-XSS-Protection": "1; mode=block", "Tk": "N", - "ETag": "W/\"cf-VoWlsif7OQ4xxqki7jRAnOPKRes\"", - "Strict-Transport-Security": "max-age=63072000; includeSubDomains; preload", - "X-Robots-Tag": "none" + "Access-Control-Allow-Origin": "*", + "ETag": "W/\"141-yxvvlAPayX5y2q2Yra8qYVtz4VU\"" }, "status_code": 200, "type": "ok" diff --git a/test/fixtures/vcr_cassettes/webfinger/pleroma.json b/test/fixtures/vcr_cassettes/webfinger/pleroma.json index bf129a2be..1d2b53997 100644 --- a/test/fixtures/vcr_cassettes/webfinger/pleroma.json +++ b/test/fixtures/vcr_cassettes/webfinger/pleroma.json @@ -3,38 +3,107 @@ "request": { "body": "", "headers": { + "User-Agent": "localhost - Mobilizon 1.1.0-32-gbd53bfc4-dirty", + "Accept": "application/xrd+xml, application/xml, text/xml" + }, + "method": "get", + "options": { + "recv_timeout": 20000 + }, + "request_body": "", + "url": "http://pleroma.soykaf.com/.well-known/host-meta" + }, + "response": { + "binary": false, + "body": "\r\n301 Moved Permanently\r\n\r\n

    301 Moved Permanently

    \r\n
    nginx/1.18.0 (Ubuntu)
    \r\n\r\n\r\n", + "headers": { + "Server": "nginx/1.18.0 (Ubuntu)", + "Date": "Thu, 08 Apr 2021 18:59:57 GMT", + "Content-Type": "text/html", + "Content-Length": "178", + "Connection": "keep-alive", + "Location": "https://pleroma.soykaf.com/.well-known/host-meta" + }, + "status_code": 301, + "type": "ok" + } + }, + { + "request": { + "body": "", + "headers": { + "User-Agent": "localhost - Mobilizon 1.1.0-32-gbd53bfc4-dirty", + "Accept": "application/xrd+xml, application/xml, text/xml" + }, + "method": "get", + "options": { + "recv_timeout": 20000 + }, + "request_body": "", + "url": "https://pleroma.soykaf.com/.well-known/host-meta" + }, + "response": { + "binary": false, + "body": "", + "headers": { + "Server": "nginx/1.18.0 (Ubuntu)", + "Date": "Thu, 08 Apr 2021 18:59:57 GMT", + "Content-Type": "application/xrd+xml; charset=utf-8", + "Content-Length": "220", + "Connection": "keep-alive", + "access-control-allow-credentials": "true", + "access-control-allow-origin": "*", + "access-control-expose-headers": "Link,X-RateLimit-Reset,X-RateLimit-Limit,X-RateLimit-Remaining,X-Request-Id,Idempotency-Key", + "cache-control": "max-age=0, private, must-revalidate", + "content-security-policy": "upgrade-insecure-requests;script-src 'self';connect-src 'self' blob: https://pleroma.soykaf.com wss://pleroma.soykaf.com;media-src 'self';img-src 'self' data: blob:;default-src 'none';base-uri 'self';frame-ancestors 'none';style-src 'self' 'unsafe-inline';font-src 'self';manifest-src 'self';", + "referrer-policy": "same-origin", + "x-content-type-options": "nosniff", + "x-download-options": "noopen", + "x-frame-options": "DENY", + "x-permitted-cross-domain-policies": "none", + "x-request-id": "FnP3HZA8tRWC7E4EYzyS", + "x-xss-protection": "1; mode=block" + }, + "status_code": 200, + "type": "ok" + } + }, + { + "request": { + "body": "", + "headers": { + "User-Agent": "localhost - Mobilizon 1.1.0-32-gbd53bfc4-dirty", "Accept": "application/json, application/activity+json, application/jrd+json" }, "method": "get", "options": { - "follow_redirect": "true" + "recv_timeout": 20000 }, "request_body": "", - "url": "http://pleroma.soykaf.com/.well-known/webfinger?resource=acct:lain@pleroma.soykaf.com" + "url": "https://pleroma.soykaf.com/.well-known/webfinger?resource=acct:lain@pleroma.soykaf.com" }, "response": { "binary": false, - "body": "{\"aliases\":[\"https://pleroma.soykaf.com/users/lain\"],\"links\":[{\"href\":\"https://pleroma.soykaf.com/users/lain/feed.atom\",\"rel\":\"http://schemas.google.com/g/2010#updates-from\",\"type\":\"application/atom+xml\"},{\"href\":\"https://pleroma.soykaf.com/users/lain\",\"rel\":\"http://webfinger.net/rel/profile-page\",\"type\":\"text/html\"},{\"href\":\"https://pleroma.soykaf.com/users/lain/salmon\",\"rel\":\"salmon\"},{\"href\":\"data:application/magic-public-key,RSA.u39dKLin8N4PywPvasEGXstOMsgg9m1OEKnpfHnSHqc6UOtIPs5-aI_LcLbhIEH2EVl6jstvtqMIloPch1FizZ3OBiKz81dXTiEZ3NfKgj_GJfIlipChAadxrmUyWT_Pr0qPaF1vhPrkSTwR8iDNUiQ-OEggRPpJVkJ619MXNdsJE59yklZiD1WY0vC9aG9m-dh0BANKNwSjwfZ3uFjDh0UosMATKjPTSO_I59nK_lArex_jAwTnVm6Dryk2qR2XXZyzTzZAHuYqSM77RlsNTJUCOaSadl816eZAvU3TF-ibIou0D-0sN-M-QehRh93sVJ95U40GQz8jOGc_5wK8xw==.AQAB\",\"rel\":\"magic-public-key\"},{\"href\":\"https://pleroma.soykaf.com/users/lain\",\"rel\":\"self\",\"type\":\"application/activity+json\"},{\"href\":\"https://pleroma.soykaf.com/users/lain\",\"rel\":\"self\",\"type\":\"application/ld+json; profile=\\\"https://www.w3.org/ns/activitystreams\\\"\"},{\"rel\":\"http://ostatus.org/schema/1.0/subscribe\",\"template\":\"https://pleroma.soykaf.com/ostatus_subscribe?acct={uri}\"}],\"subject\":\"acct:lain@pleroma.soykaf.com\"}", + "body": "{\"aliases\":[\"https://pleroma.soykaf.com/users/lain\"],\"links\":[{\"href\":\"https://pleroma.soykaf.com/users/lain\",\"rel\":\"http://webfinger.net/rel/profile-page\",\"type\":\"text/html\"},{\"href\":\"https://pleroma.soykaf.com/users/lain\",\"rel\":\"self\",\"type\":\"application/activity+json\"},{\"href\":\"https://pleroma.soykaf.com/users/lain\",\"rel\":\"self\",\"type\":\"application/ld+json; profile=\\\"https://www.w3.org/ns/activitystreams\\\"\"},{\"rel\":\"http://ostatus.org/schema/1.0/subscribe\",\"template\":\"https://pleroma.soykaf.com/ostatus_subscribe?acct={uri}\"}],\"subject\":\"acct:lain@pleroma.soykaf.com\"}", "headers": { - "Server": "nginx/1.10.3", - "Date": "Tue, 13 Nov 2018 11:11:11 GMT", + "Server": "nginx/1.18.0 (Ubuntu)", + "Date": "Thu, 08 Apr 2021 18:59:57 GMT", "Content-Type": "application/json; charset=utf-8", - "Content-Length": "1214", + "Content-Length": "576", "Connection": "keep-alive", "Vary": "Accept-Encoding", - "cache-control": "max-age=0, private, must-revalidate", - "x-request-id": "2ljal4oljell0gfni41am571", - "access-control-allow-origin": "*", - "access-control-expose-headers": "", "access-control-allow-credentials": "true", - "Access-Control-Allow-Methods": "POST, GET, OPTIONS", - "Access-Control-Allow-Headers": "Authorization, Content-Type", - "X-XSS-Protection": "1; mode=block", - "X-Permitted-Cross-Domain-Policies": "none", - "X-Frame-Options": "DENY", - "X-Content-Type-Options": "nosniff", - "Referrer-Policy": "same-origin", - "X-Download-Options": "noopen" + "access-control-allow-origin": "*", + "access-control-expose-headers": "Link,X-RateLimit-Reset,X-RateLimit-Limit,X-RateLimit-Remaining,X-Request-Id,Idempotency-Key", + "cache-control": "max-age=0, private, must-revalidate", + "content-security-policy": "upgrade-insecure-requests;script-src 'self';connect-src 'self' blob: https://pleroma.soykaf.com wss://pleroma.soykaf.com;media-src 'self';img-src 'self' data: blob:;default-src 'none';base-uri 'self';frame-ancestors 'none';style-src 'self' 'unsafe-inline';font-src 'self';manifest-src 'self';", + "referrer-policy": "same-origin", + "x-content-type-options": "nosniff", + "x-download-options": "noopen", + "x-frame-options": "DENY", + "x-permitted-cross-domain-policies": "none", + "x-request-id": "FnP3HZJ_kh8ymy8E1OCx", + "x-xss-protection": "1; mode=block" }, "status_code": 200, "type": "ok" diff --git a/test/web/controllers/webfinger_controller_test.exs b/test/web/controllers/webfinger_controller_test.exs index 5d407bdbe..d5dfff832 100644 --- a/test/web/controllers/webfinger_controller_test.exs +++ b/test/web/controllers/webfinger_controller_test.exs @@ -23,9 +23,9 @@ defmodule Mobilizon.Web.WebFingerControllerTest do conn = get(conn, "/.well-known/host-meta") assert response(conn, 200) == - "mobilizon.test" + }/.well-known/webfinger?resource={uri}\" type=\"application/jrd+json\" />" assert {"content-type", "application/xrd+xml; charset=utf-8"} in conn.resp_headers end From e991d7d373c0fdf3ed88b328dd073f29ab2608fb Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Fri, 9 Apr 2021 10:43:34 +0200 Subject: [PATCH 32/85] Fix content type and size missing for profile avatars Signed-off-by: Thomas Citharel --- lib/graphql/resolvers/person.ex | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/graphql/resolvers/person.ex b/lib/graphql/resolvers/person.ex index 21f686c12..70c720a81 100644 --- a/lib/graphql/resolvers/person.ex +++ b/lib/graphql/resolvers/person.ex @@ -225,9 +225,9 @@ defmodule Mobilizon.GraphQL.Resolvers.Person do end defp save_picture(media, key) do - with {:ok, %{name: name, url: url, content_type: content_type, size: _size}} <- + with {:ok, %{name: name, url: url, content_type: content_type, size: size}} <- Upload.store(media.file, type: key, description: media.alt) do - %{"name" => name, "url" => url, "mediaType" => content_type} + %{"name" => name, "url" => url, "content_type" => content_type, "size" => size} end end From 5ac02bae5dd7eee21c82772c10b26306a44e4577 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Fri, 9 Apr 2021 10:43:45 +0200 Subject: [PATCH 33/85] Use runtime configuration for HTTP clients user-agent Signed-off-by: Thomas Citharel --- lib/service/http/activity_pub.ex | 10 ++++------ lib/service/http/geospatial_client.ex | 4 +--- lib/service/http/remote_media_downloader_client.ex | 4 +--- lib/service/http/rich_media_preview_client.ex | 4 +--- lib/service/http/webfinger_client.ex | 4 +--- 5 files changed, 8 insertions(+), 18 deletions(-) diff --git a/lib/service/http/activity_pub.ex b/lib/service/http/activity_pub.ex index ee5b21630..db9683d9b 100644 --- a/lib/service/http/activity_pub.ex +++ b/lib/service/http/activity_pub.ex @@ -5,28 +5,26 @@ defmodule Mobilizon.Service.HTTP.ActivityPub do alias Mobilizon.Config - @adapter Application.get_env(:tesla, __MODULE__, [])[:adapter] || Tesla.Adapter.Hackney @default_opts [ recv_timeout: 20_000 ] - @user_agent Config.instance_user_agent() def client(options \\ []) do headers = Keyword.get(options, :headers, []) + adapter = Application.get_env(:tesla, __MODULE__, [])[:adapter] || Tesla.Adapter.Hackney opts = Keyword.merge(@default_opts, Keyword.get(options, :opts, [])) middleware = [ {Tesla.Middleware.Headers, - [{"User-Agent", @user_agent}, {"Accept", "application/activity+json"}] ++ headers}, + [{"User-Agent", Config.instance_user_agent()}, {"Accept", "application/activity+json"}] ++ + headers}, Tesla.Middleware.FollowRedirects, {Tesla.Middleware.Timeout, timeout: 10_000}, {Tesla.Middleware.JSON, decode_content_types: ["application/activity+json", "application/ld+json"]} ] - adapter = {@adapter, opts} - - Tesla.client(middleware, adapter) + Tesla.client(middleware, {adapter, opts}) end def get(client, url) do diff --git a/lib/service/http/geospatial_client.ex b/lib/service/http/geospatial_client.ex index 1b578c9de..064fee4c4 100644 --- a/lib/service/http/geospatial_client.ex +++ b/lib/service/http/geospatial_client.ex @@ -13,13 +13,11 @@ defmodule Mobilizon.Service.HTTP.GeospatialClient do adapter(Tesla.Adapter.Hackney, @default_opts) - @user_agent Config.instance_user_agent() - plug(Tesla.Middleware.FollowRedirects) plug(Tesla.Middleware.Timeout, timeout: 10_000) - plug(Tesla.Middleware.Headers, [{"User-Agent", @user_agent}]) + plug(Tesla.Middleware.Headers, [{"User-Agent", Config.instance_user_agent()}]) plug(Tesla.Middleware.JSON) end diff --git a/lib/service/http/remote_media_downloader_client.ex b/lib/service/http/remote_media_downloader_client.ex index 06af2bf9d..f8be88793 100644 --- a/lib/service/http/remote_media_downloader_client.ex +++ b/lib/service/http/remote_media_downloader_client.ex @@ -12,11 +12,9 @@ defmodule Mobilizon.Service.HTTP.RemoteMediaDownloaderClient do adapter(Tesla.Adapter.Hackney, @default_opts) - @user_agent Config.instance_user_agent() - plug(Tesla.Middleware.FollowRedirects) plug(Tesla.Middleware.Timeout, timeout: 10_000) - plug(Tesla.Middleware.Headers, [{"User-Agent", @user_agent}]) + plug(Tesla.Middleware.Headers, [{"User-Agent", Config.instance_user_agent()}]) end diff --git a/lib/service/http/rich_media_preview_client.ex b/lib/service/http/rich_media_preview_client.ex index 8f3983548..520839241 100644 --- a/lib/service/http/rich_media_preview_client.ex +++ b/lib/service/http/rich_media_preview_client.ex @@ -12,11 +12,9 @@ defmodule Mobilizon.Service.HTTP.RichMediaPreviewClient do adapter(Tesla.Adapter.Hackney, @default_opts) - @user_agent Config.instance_user_agent() - plug(Tesla.Middleware.FollowRedirects) plug(Tesla.Middleware.Timeout, timeout: 10_000) - plug(Tesla.Middleware.Headers, [{"User-Agent", @user_agent}]) + plug(Tesla.Middleware.Headers, [{"User-Agent", Config.instance_user_agent()}]) end diff --git a/lib/service/http/webfinger_client.ex b/lib/service/http/webfinger_client.ex index 13b578a0d..d5c02e357 100644 --- a/lib/service/http/webfinger_client.ex +++ b/lib/service/http/webfinger_client.ex @@ -13,14 +13,12 @@ defmodule Mobilizon.Service.HTTP.WebfingerClient do adapter(Tesla.Adapter.Hackney, @default_opts) - @user_agent Config.instance_user_agent() - plug(Tesla.Middleware.FollowRedirects) plug(Tesla.Middleware.Timeout, timeout: 10_000) plug(Tesla.Middleware.Headers, [ - {"User-Agent", @user_agent}, + {"User-Agent", Config.instance_user_agent()}, {"Accept", "application/json, application/activity+json, application/jrd+json"} ]) From cbf772f28250d93016d7a80f69fd5f6418783699 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Fri, 9 Apr 2021 10:52:40 +0200 Subject: [PATCH 34/85] Add a check for valid URI before fetching it in AP Client Signed-off-by: Thomas Citharel --- lib/federation/activity_pub/fetcher.ex | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/federation/activity_pub/fetcher.ex b/lib/federation/activity_pub/fetcher.ex index e23c7d163..58fcf7937 100644 --- a/lib/federation/activity_pub/fetcher.ex +++ b/lib/federation/activity_pub/fetcher.ex @@ -17,7 +17,8 @@ defmodule Mobilizon.Federation.ActivityPub.Fetcher do def fetch(url, options \\ []) do on_behalf_of = Keyword.get(options, :on_behalf_of, Relay.get_actor()) - with date <- Signature.generate_date_header(), + with false <- address_invalid(url), + date <- Signature.generate_date_header(), headers <- [{:Accept, "application/activity+json"}] |> maybe_date_fetch(date) @@ -90,4 +91,12 @@ defmodule Mobilizon.Federation.ActivityPub.Fetcher do {:error, err} end end + + @spec address_invalid(String.t()) :: false | {:error, :invalid_url} + defp address_invalid(address) do + with %URI{host: host, scheme: scheme} <- URI.parse(address), + true <- is_nil(host) or is_nil(scheme) do + {:error, :invalid_url} + end + end end From bbfe3de471ee25d17a48a49ae5aa64eefb77e55b Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Fri, 9 Apr 2021 11:57:53 +0200 Subject: [PATCH 35/85] Handle NotAcceptableError better Signed-off-by: Thomas Citharel --- lib/web/plugs/not_acceptable_error.ex | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 lib/web/plugs/not_acceptable_error.ex diff --git a/lib/web/plugs/not_acceptable_error.ex b/lib/web/plugs/not_acceptable_error.ex new file mode 100644 index 000000000..0b1556c4e --- /dev/null +++ b/lib/web/plugs/not_acceptable_error.ex @@ -0,0 +1,4 @@ +defimpl Plug.Exception, for: Phoenix.NotAcceptableError do + def status(_exception), do: 406 + def actions(_exception), do: [] +end From 4079af6f72019575540b4dbc0bd1e7dc1e0c7c9b Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Fri, 9 Apr 2021 12:12:06 +0200 Subject: [PATCH 36/85] Make sure arg for Actors.get_actor_by_name/2 doesn't start with @ Signed-off-by: Thomas Citharel --- lib/mobilizon/actors/actors.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mobilizon/actors/actors.ex b/lib/mobilizon/actors/actors.ex index e55f10702..21dc47a8b 100644 --- a/lib/mobilizon/actors/actors.ex +++ b/lib/mobilizon/actors/actors.ex @@ -156,7 +156,7 @@ defmodule Mobilizon.Actors do query |> filter_by_type(type) - |> filter_by_name(String.split(name, "@")) + |> filter_by_name(name |> String.trim() |> String.trim_leading("@") |> String.split("@")) |> Repo.one() end From fb614cf8777e4c52c2a5d307decbf98cdf57553b Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Fri, 9 Apr 2021 14:01:40 +0200 Subject: [PATCH 37/85] Handle AP fetch issues properly Signed-off-by: Thomas Citharel --- lib/federation/activity_pub/fetcher.ex | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/federation/activity_pub/fetcher.ex b/lib/federation/activity_pub/fetcher.ex index 58fcf7937..65971b6c7 100644 --- a/lib/federation/activity_pub/fetcher.ex +++ b/lib/federation/activity_pub/fetcher.ex @@ -39,6 +39,9 @@ defmodule Mobilizon.Federation.ActivityPub.Fetcher do {:ok, %Tesla.Env{} = res} -> {:error, res} + + {:error, err} -> + {:error, err} end end From 0210b677c5bc0f04585f580c96fb98098c0cfc2b Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Mon, 12 Apr 2021 10:13:11 +0200 Subject: [PATCH 38/85] Expose maximum picture sizes Signed-off-by: Thomas Citharel --- config/config.exs | 6 +++--- js/src/graphql/config.ts | 5 +++++ js/src/types/config.model.ts | 5 +++++ js/tests/unit/specs/mocks/config.ts | 6 ++++++ lib/graphql/resolvers/config.ex | 5 +++++ lib/graphql/schema/config.ex | 11 +++++++++++ lib/web/endpoint.ex | 5 ++++- 7 files changed, 39 insertions(+), 4 deletions(-) diff --git a/config/config.exs b/config/config.exs index ea57f6449..e99cea93a 100644 --- a/config/config.exs +++ b/config/config.exs @@ -25,9 +25,9 @@ config :mobilizon, :instance, allow_relay: true, federating: true, remote_limit: 100_000, - upload_limit: 10_000_000, - avatar_upload_limit: 2_000_000, - banner_upload_limit: 4_000_000, + upload_limit: 10_485_760, + avatar_upload_limit: 2_097_152, + banner_upload_limit: 4_194_304, remove_orphan_uploads: true, orphan_upload_grace_period_hours: 48, remove_unconfirmed_users: true, diff --git a/js/src/graphql/config.ts b/js/src/graphql/config.ts index 6e514ef35..80e79b624 100644 --- a/js/src/graphql/config.ts +++ b/js/src/graphql/config.ts @@ -75,6 +75,11 @@ export const CONFIG = gql` label } } + uploadLimits { + default + avatar + banner + } } } `; diff --git a/js/src/types/config.model.ts b/js/src/types/config.model.ts index 6d391d0a8..d4105a63f 100644 --- a/js/src/types/config.model.ts +++ b/js/src/types/config.model.ts @@ -89,4 +89,9 @@ export interface IConfig { ldap: boolean; oauthProviders: IOAuthProvider[]; }; + uploadLimits: { + default: number; + avatar: number; + banner: number; + }; } diff --git a/js/tests/unit/specs/mocks/config.ts b/js/tests/unit/specs/mocks/config.ts index 856288302..70ee08d75 100644 --- a/js/tests/unit/specs/mocks/config.ts +++ b/js/tests/unit/specs/mocks/config.ts @@ -102,6 +102,12 @@ export const configMock = { }, ], slogan: null, + uploadLimits: { + __typename: "UploadLimits", + default: 10_000_000, + avatar: 2_000_000, + banner: 4_000_000, + }, }, }, }; diff --git a/lib/graphql/resolvers/config.ex b/lib/graphql/resolvers/config.ex index a1b8c3e8c..f7b15a063 100644 --- a/lib/graphql/resolvers/config.ex +++ b/lib/graphql/resolvers/config.ex @@ -134,6 +134,11 @@ defmodule Mobilizon.GraphQL.Resolvers.Config do auth: %{ ldap: Config.ldap_enabled?(), oauth_providers: Config.oauth_consumer_strategies() + }, + upload_limits: %{ + default: Config.get([:instance, :upload_limit]), + avatar: Config.get([:instance, :avatar_upload_limit]), + banner: Config.get([:instance, :banner_upload_limit]) } } end diff --git a/lib/graphql/schema/config.ex b/lib/graphql/schema/config.ex index a2d9d02ab..1feafb1bb 100644 --- a/lib/graphql/schema/config.ex +++ b/lib/graphql/schema/config.ex @@ -33,6 +33,8 @@ defmodule Mobilizon.GraphQL.Schema.ConfigType do description: "The instance's enabled resource providers" ) + field(:upload_limits, :upload_limits, description: "The configuration for upload limits") + field(:timezones, list_of(:string), description: "The instance's available timezones") field(:features, :features, description: "The instance's features") field(:version, :string, description: "The instance's version") @@ -283,6 +285,15 @@ defmodule Mobilizon.GraphQL.Schema.ConfigType do field(:label, :string, description: "The label for the auth provider") end + @desc """ + An upload limits configuration + """ + object :upload_limits do + field(:default, :integer, description: "The default limitation, in bytes") + field(:avatar, :integer, description: "The avatar limitation, in bytes") + field(:banner, :integer, description: "The banner limitation, in bytes") + end + object :config_queries do @desc "Get the instance config" field :config, :config do diff --git a/lib/web/endpoint.ex b/lib/web/endpoint.ex index 40b1aa74c..5d062f6a5 100644 --- a/lib/web/endpoint.ex +++ b/lib/web/endpoint.ex @@ -62,9 +62,12 @@ defmodule Mobilizon.Web.Endpoint do plug(Plug.RequestId) plug(Plug.Logger) + upload_limit = + Keyword.get(Application.get_env(:mobilizon, :instance, []), :upload_limit, 10_485_760) + plug( Plug.Parsers, - parsers: [:urlencoded, {:multipart, length: 10_000_000}, :json, Absinthe.Plug.Parser], + parsers: [:urlencoded, {:multipart, length: upload_limit}, :json, Absinthe.Plug.Parser], pass: ["*/*"], json_decoder: Jason ) From 947d0b0cdb296b45b8e46b098b0c2435c3d7787e Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Mon, 12 Apr 2021 10:13:45 +0200 Subject: [PATCH 39/85] Handle maximum file sizes better Signed-off-by: Thomas Citharel --- lib/graphql/resolvers/group.ex | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/lib/graphql/resolvers/group.ex b/lib/graphql/resolvers/group.ex index 6c5ffe5cb..fca02e768 100644 --- a/lib/graphql/resolvers/group.ex +++ b/lib/graphql/resolvers/group.ex @@ -96,7 +96,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Group do # TODO Move me to somewhere cleaner defp save_attached_pictures(args) do Enum.reduce([:avatar, :banner], args, fn key, args -> - if Map.has_key?(args, key) && !is_nil(args[key][:media]) do + if is_map(args) && Map.has_key?(args, key) && !is_nil(args[key][:media]) do pic = args[key][:media] with {:ok, %{name: name, url: url, content_type: content_type, size: _size}} <- @@ -122,14 +122,17 @@ defmodule Mobilizon.GraphQL.Resolvers.Group do } ) do with %Actor{id: creator_actor_id} = creator_actor <- Users.get_actor_for_user(user), - args <- Map.update(args, :preferred_username, "", &String.downcase/1), - args <- Map.put(args, :creator_actor, creator_actor), - args <- Map.put(args, :creator_actor_id, creator_actor_id), - args <- save_attached_pictures(args), + args when is_map(args) <- Map.update(args, :preferred_username, "", &String.downcase/1), + args when is_map(args) <- Map.put(args, :creator_actor, creator_actor), + args when is_map(args) <- Map.put(args, :creator_actor_id, creator_actor_id), + {:picture, args} when is_map(args) <- {:picture, save_attached_pictures(args)}, {:ok, _activity, %Actor{type: :Group} = group} <- API.Groups.create_group(args) do {:ok, group} else + {:picture, {:error, :file_too_large}} -> + {:error, dgettext("errors", "The provided picture is too heavy")} + {:error, err} when is_binary(err) -> {:error, err} end @@ -154,12 +157,15 @@ defmodule Mobilizon.GraphQL.Resolvers.Group do with %Actor{} = updater_actor <- Users.get_actor_for_user(user), {:administrator, true} <- {:administrator, Actors.is_administrator?(updater_actor.id, group_id)}, - args <- Map.put(args, :updater_actor, updater_actor), - args <- save_attached_pictures(args), + args when is_map(args) <- Map.put(args, :updater_actor, updater_actor), + {:picture, args} when is_map(args) <- {:picture, save_attached_pictures(args)}, {:ok, _activity, %Actor{type: :Group} = group} <- API.Groups.update_group(args) do {:ok, group} else + {:picture, {:error, :file_too_large}} -> + {:error, dgettext("errors", "The provided picture is too heavy")} + {:error, err} when is_binary(err) -> {:error, err} From e2721af456a0e27f645c878e09dc9126a299662e Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Mon, 12 Apr 2021 10:43:04 +0200 Subject: [PATCH 40/85] Refactor picture-upload and take into account picture size limits Signed-off-by: Thomas Citharel --- js/src/components/PictureUpload.vue | 107 ++++++++++++++---- js/src/i18n/en_US.json | 7 +- js/src/i18n/fr_FR.json | 7 +- .../views/Account/children/EditIdentity.vue | 26 +++++ js/src/views/Group/Create.vue | 45 +++++++- js/src/views/Group/GroupSettings.vue | 59 +++++++++- 6 files changed, 214 insertions(+), 37 deletions(-) diff --git a/js/src/components/PictureUpload.vue b/js/src/components/PictureUpload.vue index 11a65579f..34a46ac3d 100644 --- a/js/src/components/PictureUpload.vue +++ b/js/src/components/PictureUpload.vue @@ -1,15 +1,35 @@ +
    From 57b1e534203bc6da77cadbdc5e3549eb97326525 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Fri, 16 Apr 2021 17:19:21 +0200 Subject: [PATCH 60/85] Fix some dependencies issue Signed-off-by: Thomas Citharel --- js/.prettierrc.json | 1 + js/package.json | 13 ++++--- js/yarn.lock | 86 +++++++++++++++++++++------------------------ 3 files changed, 47 insertions(+), 53 deletions(-) create mode 100644 js/.prettierrc.json diff --git a/js/.prettierrc.json b/js/.prettierrc.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/js/.prettierrc.json @@ -0,0 +1 @@ +{} diff --git a/js/package.json b/js/package.json index 00dbee656..d32e57a18 100644 --- a/js/package.json +++ b/js/package.json @@ -64,11 +64,11 @@ "@types/prosemirror-state": "^1.2.4", "@types/prosemirror-view": "^1.11.4", "@types/vuedraggable": "^2.23.0", - "@typescript-eslint/eslint-plugin": "^4.14.1", - "@typescript-eslint/parser": "^4.14.1", + "@typescript-eslint/eslint-plugin": "^4.18.0", + "@typescript-eslint/parser": "^4.18.0", "@vue/cli-plugin-babel": "~4.5.12", "@vue/cli-plugin-e2e-cypress": "~4.5.12", - "@vue/cli-plugin-eslint": "~4.5.12", + "@vue/cli-plugin-eslint": "~4.5.0", "@vue/cli-plugin-pwa": "~4.5.12", "@vue/cli-plugin-router": "~4.5.12", "@vue/cli-plugin-typescript": "~4.5.12", @@ -78,15 +78,14 @@ "@vue/eslint-config-typescript": "^7.0.0", "@vue/test-utils": "^1.1.0", "eslint": "^6.7.2", - "eslint-config-prettier": "^7.0.0", "eslint-plugin-cypress": "^2.10.3", "eslint-plugin-import": "^2.20.2", - "eslint-plugin-prettier": "^3.1.3", - "eslint-plugin-vue": "^7.9.0", + "eslint-plugin-prettier": "^3.3.1", + "eslint-plugin-vue": "^6.2.2", "flush-promises": "^1.0.2", "jest-junit": "^12.0.0", "mock-apollo-client": "^0.6", - "prettier": "2.2.1", + "prettier": "^2.2.1", "prettier-eslint": "^12.0.0", "sass": "^1.29.0", "sass-loader": "^8.0.2", diff --git a/js/yarn.lock b/js/yarn.lock index cb0594e42..ad0c26db6 100644 --- a/js/yarn.lock +++ b/js/yarn.lock @@ -28,9 +28,9 @@ zen-observable "0.8.11" "@apollo/client@^3.0.0": - version "3.3.14" - resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.3.14.tgz#b077f42e17941dbf4c62c4f41bf83c0828872d09" - integrity sha512-z7YwMvF9grmpWUG+26e3gPcBAOA/r/Ci5gwK7JVm3bGYG9kKqG8MF6sMXEbuwTsFseE4duSp0icJ6tdzxJhhlA== + version "3.3.15" + resolved "https://registry.yarnpkg.com/@apollo/client/-/client-3.3.15.tgz#bdd230894aac4beb8ade2b472a1d3c9ea6152812" + integrity sha512-/WQmNvLEZMA0mA3u+FkEPTXKzxZD/KhyO7WlbKcy3zKGrXKza83tAbNMzsitQE7DTcSc3DLEcIu1Z5Rc7PFq0Q== dependencies: "@graphql-typed-document-node/core" "^3.0.0" "@types/zen-observable" "^0.8.0" @@ -1501,9 +1501,9 @@ integrity sha512-6nlq2eEh75JegDGUXis9wGTYIJpUvbori4qx++PRKQsV3YRkaqUNPNykzphniqPSZADXCouBuAnyptjUkMkhvw== "@types/node@*", "@types/node@>=6": - version "14.14.37" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.37.tgz#a3dd8da4eb84a996c36e331df98d82abd76b516e" - integrity sha512-XYmBiy+ohOR4Lh5jE379fV2IU+6Jn4g5qASinhitfyO71b/sCo6MKsMLF5tc7Zf2CE8hViVQyYSobJNke8OvUw== + version "14.14.41" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.41.tgz#d0b939d94c1d7bd53d04824af45f1139b8c45615" + integrity sha512-dueRKfaJL4RTtSa7bWeTK1M+VH+Gns73oCgzvYfHZywRCoPSd8EkXBL0mZ9unPTveBn+D9phZBaxuzpwjWkW0g== "@types/normalize-package-data@^2.4.0": version "2.4.0" @@ -1695,7 +1695,7 @@ resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.2.tgz#808c9fa7e4517274ed555fa158f2de4b4f468e71" integrity sha512-HrCIVMLjE1MOozVoD86622S7aunluLb2PJdPfb3nYiEtohm8mIB/vyv0Fd37AdeMFrTUQXEunw78YloMA3Qilg== -"@typescript-eslint/eslint-plugin@^4.14.1": +"@typescript-eslint/eslint-plugin@^4.18.0": version "4.22.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.22.0.tgz#3d5f29bb59e61a9dba1513d491b059e536e16dbc" integrity sha512-U8SP9VOs275iDXaL08Ln1Fa/wLXfj5aTr/1c0t0j6CdbOnxh+TruXu1p4I0NAvdPBQgoPjHsgKn28mOi0FzfoA== @@ -1743,7 +1743,7 @@ "@typescript-eslint/typescript-estree" "3.10.1" eslint-visitor-keys "^1.1.0" -"@typescript-eslint/parser@^4.14.1": +"@typescript-eslint/parser@^4.18.0": version "4.22.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-4.22.0.tgz#e1637327fcf796c641fe55f73530e90b16ac8fe8" integrity sha512-z/bGdBJJZJN76nvAY9DkJANYgK3nlRstRRi74WHm3jjgf2I8AglrSY+6l7ogxOmn55YJ6oKZCLLy+6PW70z15Q== @@ -1962,7 +1962,7 @@ cypress "^3.8.3" eslint-plugin-cypress "^2.10.3" -"@vue/cli-plugin-eslint@~4.5.12": +"@vue/cli-plugin-eslint@~4.5.0": version "4.5.12" resolved "https://registry.yarnpkg.com/@vue/cli-plugin-eslint/-/cli-plugin-eslint-4.5.12.tgz#7fc2a1d0a490fa300ef4e94518c2cc49ba7a292f" integrity sha512-nbjGJkWxo/xdD32DwvnEAUwkWYsObpqNk9NuU7T62ehdzHPzz58o3j03YZ7a7T7Le8bYyOWMYsdNfz63F+XiZQ== @@ -3543,9 +3543,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001208: - version "1.0.30001208" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001208.tgz#a999014a35cebd4f98c405930a057a0d75352eb9" - integrity sha512-OE5UE4+nBOro8Dyvv0lfx+SRtfVIOM9uhKqFmJeUbGriqhhStgp1A0OyBpgy3OUF8AhYCT+PVwPC1gMl2ZcQMA== + version "1.0.30001209" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001209.tgz#1bb4be0bd118e98e21cfb7ef617b1ef2164622f4" + integrity sha512-2Ktt4OeRM7EM/JaOZjuLzPYAIqmbwQMNnYbgooT+icoRGrKOyAxA1xhlnotBD1KArRSPsuJp3TdYcZYrL7qNxA== capture-exit@^2.0.0: version "2.0.0" @@ -4851,9 +4851,9 @@ ejs@^2.6.1: integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== electron-to-chromium@^1.3.712: - version "1.3.713" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.713.tgz#4583efb17f2d1e9ec07a44c8004ea73c013ad146" - integrity sha512-HWgkyX4xTHmxcWWlvv7a87RHSINEcpKYZmDMxkUlHcY+CJcfx7xEfBHuXVsO1rzyYs1WQJ7EgDp2CoErakBIow== + version "1.3.717" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.717.tgz#78d4c857070755fb58ab64bcc173db1d51cbc25f" + integrity sha512-OfzVPIqD1MkJ7fX+yTl2nKyOE4FReeVfMCzzxQS+Kp43hZYwHwThlGP+EGIZRXJsxCM7dqo8Y65NOX/HP12iXQ== elegant-spinner@^1.0.1: version "1.0.1" @@ -5022,11 +5022,6 @@ eslint-config-prettier@^6.0.0: dependencies: get-stdin "^6.0.0" -eslint-config-prettier@^7.0.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz#f4a4bd2832e810e8cc7c1411ec85b3e85c0c53f9" - integrity sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg== - eslint-import-resolver-node@^0.3.4: version "0.3.4" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" @@ -5080,22 +5075,21 @@ eslint-plugin-import@^2.20.2: resolve "^1.17.0" tsconfig-paths "^3.9.0" -eslint-plugin-prettier@^3.1.3: +eslint-plugin-prettier@^3.3.1: version "3.4.0" resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz#cdbad3bf1dbd2b177e9825737fe63b476a08f0c7" integrity sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw== dependencies: prettier-linter-helpers "^1.0.0" -eslint-plugin-vue@^7.9.0: - version "7.9.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-7.9.0.tgz#f8e83a2a908f4c43fc8304f5401d4ff671f3d560" - integrity sha512-2Q0qQp5+5h+pZvJKCbG1/jCRUYrdgAz5BYKGyTlp2NU8mx09u3Hp7PsH6d5qef6ojuPoCXMnrbbDxeoplihrSw== +eslint-plugin-vue@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-6.2.2.tgz#27fecd9a3a24789b0f111ecdd540a9e56198e0fe" + integrity sha512-Nhc+oVAHm0uz/PkJAWscwIT4ijTrK5fqNqz9QB1D35SbbuMG1uB6Yr5AJpvPSWg+WOw7nYNswerYh0kOk64gqQ== dependencies: - eslint-utils "^2.1.0" natural-compare "^1.4.0" - semver "^7.3.2" - vue-eslint-parser "^7.6.0" + semver "^5.6.0" + vue-eslint-parser "^7.0.0" eslint-scope@^4.0.3: version "4.0.3" @@ -6575,9 +6569,9 @@ http-proxy-middleware@0.19.1: micromatch "^3.1.10" http-proxy-middleware@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-1.1.1.tgz#48900a68cd9d388c735d1dd97302c919b7e94a13" - integrity sha512-FIDg9zPvOwMhQ3XKB2+vdxK6WWbVAH7s5QpqQCif7a1TNL76GNAATWA1sy6q2gSfss8UJ/Nwza3N6QnFkKclpA== + version "1.1.2" + resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-1.1.2.tgz#38d062ce4182b2931442efc2d9a0c429cab634f8" + integrity sha512-YRFUeOG3q85FJjAaYVJUoNRW9a73SDlOtAyQOS5PHLr18QeZ/vEhxywNoOPiEO8BxCegz4RXzTHcvyLEGB78UA== dependencies: "@types/http-proxy" "^1.17.5" http-proxy "^1.18.1" @@ -7272,9 +7266,9 @@ iterall@^1.2.2: integrity sha512-QZ9qOMdF+QLHxy1QIpUHUU1D5pS2CG2P69LF6L6CPjPYA/XMOmKV3PZpawHoAjHNyB0swdVTRxdYT4tbBbxqwg== javascript-stringify@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-2.0.1.tgz#6ef358035310e35d667c675ed63d3eb7c1aa19e5" - integrity sha512-yV+gqbd5vaOYjqlbk16EG89xB5udgjqQF3C5FAORDg4f/IS1Yc5ERCv5e/57yBcfJYw05V5JyIXabhwb75Xxow== + version "2.1.0" + resolved "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-2.1.0.tgz#27c76539be14d8bd128219a2d731b09337904e79" + integrity sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg== jest-changed-files@^24.9.0: version "24.9.0" @@ -7706,9 +7700,9 @@ js-base64@^2.1.9: integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ== js-beautify@^1.6.12, js-beautify@^1.6.14: - version "1.13.5" - resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.13.5.tgz#a08a97890cae55daf1d758d3f6577bd4a64d7014" - integrity sha512-MsXlH6Z/BiRYSkSRW3clNDqDjSpiSNOiG8xYVUBXt4k0LnGvDhlTGOlHX1VFtAdoLmtwjxMG5qiWKy/g+Ipv5w== + version "1.13.11" + resolved "https://registry.yarnpkg.com/js-beautify/-/js-beautify-1.13.11.tgz#3fc59d74d4fcb03268a559220da26f5d8a2d5246" + integrity sha512-+3CW1fQqkV7aXIvprevNYfSrKrASQf02IstAZCVSNh+/IS5ciaOtE7erfjyowdMYZZmP2A7SMFkcJ28qCl84+A== dependencies: config-chain "^1.1.12" editorconfig "^0.15.3" @@ -10005,16 +9999,16 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@2.2.1, prettier@^2.0.0: - version "2.2.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" - integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== - prettier@^1.18.2: version "1.19.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb" integrity sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew== +prettier@^2.0.0, prettier@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.2.1.tgz#795a1a78dd52f073da0cd42b21f9c91381923ff5" + integrity sha512-PqyhM2yCjg/oKkFPtTGUojv7gnZAoG80ttl45O6x2Ug/rMJw4wcc9k6aaf2hibP7BGVCCM33gZoGjyvt9mm16Q== + pretty-bytes@^5.3.0: version "5.6.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" @@ -11806,9 +11800,9 @@ table@^5.2.3: string-width "^3.0.0" table@^6.0.4: - version "6.0.9" - resolved "https://registry.yarnpkg.com/table/-/table-6.0.9.tgz#790a12bf1e09b87b30e60419bafd6a1fd85536fb" - integrity sha512-F3cLs9a3hL1Z7N4+EkSscsel3z55XT950AvB05bwayrNg5T1/gykXtigioTAjbltvbMSJvvhFCbnf6mX+ntnJQ== + version "6.1.0" + resolved "https://registry.yarnpkg.com/table/-/table-6.1.0.tgz#676a0cfb206008b59e783fcd94ef8ba7d67d966c" + integrity sha512-T4G5KMmqIk6X87gLKWyU5exPpTjLjY5KyrFWaIjv3SvgaIUGXV7UEzGEnZJdTA38/yUS6f9PlKezQ0bYXG3iIQ== dependencies: ajv "^8.0.1" is-boolean-object "^1.1.0" @@ -12648,7 +12642,7 @@ vue-cli-plugin-svg@~0.1.3: url-loader "^2.0.0" vue-svg-loader "^0.12.0" -vue-eslint-parser@^7.0.0, vue-eslint-parser@^7.6.0: +vue-eslint-parser@^7.0.0: version "7.6.0" resolved "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-7.6.0.tgz#01ea1a2932f581ff244336565d712801f8f72561" integrity sha512-QXxqH8ZevBrtiZMZK0LpwaMfevQi9UL7lY6Kcp+ogWHC88AuwUPwwCIzkOUc1LR4XsYAt/F9yHXAB/QoD17QXA== From 6eb42660d51795f48ac9d9a1a929dc0876d88688 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Fri, 16 Apr 2021 18:12:57 +0200 Subject: [PATCH 61/85] Reset address when field is empty Signed-off-by: Thomas Citharel --- js/src/components/Event/FullAddressAutoComplete.vue | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/js/src/components/Event/FullAddressAutoComplete.vue b/js/src/components/Event/FullAddressAutoComplete.vue index 4c73150e0..537996c8d 100644 --- a/js/src/components/Event/FullAddressAutoComplete.vue +++ b/js/src/components/Event/FullAddressAutoComplete.vue @@ -22,7 +22,7 @@ expanded @select="updateSelected" > -