From c408c04bb0e9f5e29c224b8186be68aa3163ee7f Mon Sep 17 00:00:00 2001 From: setop Date: Sun, 4 Jul 2021 21:19:16 +0000 Subject: [PATCH 001/169] make build faster using buildlkit - use annotation for buildkit - cache yarn packages - compile before copying assets to allow parallel build of phases to use it, run `DOCKER_BUILDKIT=1 docker image build -f docker/production/Dockerfile .` --- docker/production/Dockerfile | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/docker/production/Dockerfile b/docker/production/Dockerfile index 46447aaf8..4f561c108 100644 --- a/docker/production/Dockerfile +++ b/docker/production/Dockerfile @@ -1,11 +1,13 @@ +# syntax=docker/dockerfile:1.2 + # First build the application assets FROM node:16-alpine as assets RUN apk add --no-cache python3 build-base libwebp-tools bash imagemagick ncurses WORKDIR /build COPY js . -RUN yarn install \ - && yarn run build +RUN --mount=type=cache,target=/root/.cache yarn install +RUN yarn run build # Then, build the application binary FROM elixir:1.12-alpine AS builder @@ -24,6 +26,9 @@ COPY config/config.exs config/prod.exs ./config/ COPY config/docker.exs ./config/runtime.exs COPY rel ./rel COPY support ./support + +RUN mix compile + COPY --from=assets ./priv/static ./priv/static RUN mix phx.digest \ From 6f881d5ee3de663d95fa864bcbc06e40a8132bf5 Mon Sep 17 00:00:00 2001 From: deadmorose Date: Thu, 8 Jul 2021 15:27:22 +0000 Subject: [PATCH 002/169] Translated using Weblate (Russian) Currently translated at 100.0% (1065 of 1065 strings) Translation: Mobilizon/Frontend Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/ru/ --- js/src/i18n/ru.json | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/js/src/i18n/ru.json b/js/src/i18n/ru.json index 4ff4314df..ddcff9ca3 100644 --- a/js/src/i18n/ru.json +++ b/js/src/i18n/ru.json @@ -18,6 +18,7 @@ "A federated software": "Федеративное программное обеспечение", "A member has been updated": "Участник обновлён", "A member requested to join one of my groups": "Участник попросил присоединиться к одной из моих групп", + "A new version is available.": "Доступна новая версия.", "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.": "Место для публикации чего-либо для всего мира, вашего сообщества или только участников вашей группы.", @@ -44,6 +45,7 @@ "Account": "Учётная запись", "Actions": "Действия", "Activate browser notification": "Активировать уведомления в браузере", + "Activate browser push notifications": "Активировать push-уведомления в браузере", "Activated": "Активирован", "Active": "Активный", "Activity": "Активность", @@ -69,6 +71,7 @@ "All the places have already been taken": "Все места уже заняты", "Allow all comments from users with accounts": "Разрешить все комментарии от авторизованных пользователей", "Allow registrations": "Разрешить регистрацию", + "An error has occured while refreshing the page.": "Произошла ошибка при обновлении страницы.", "An error has occured. Sorry about that. You may try to reload the page.": "Произошла ошибка. Приносим вам тысячу извинений. Вы можете попробовать перезагрузить страницу.", "An ethical alternative": "Этичная альтернатива", "An event I'm going to has been updated": "Мероприятие, на которое я собираюсь, обновлено", @@ -81,6 +84,7 @@ "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} комментариев", + "Announcements and mentions notifications are always sent straight away.": "Уведомления об объявлениях и упоминаниях всегда отправляются незамедлительно.", "Anonymous participant": "Анонимный участник", "Anonymous participants will be asked to confirm their participation through e-mail.": "Анонимные участники получат запрос на подтверждение своего участия по электронной почте.", "Anonymous participations": "Анонимное участие", @@ -100,6 +104,7 @@ "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.": "Поскольку организатор мероприятия решил вручную подтверждать запросы на участие, ваше участие будет фактически подтверждено после того, как вы получите электронное письмо о том, что оно было одобрено.", + "Ask your instance admin to {enable_feature}.": "Попросите администратора вашего узла {enable_feature}.", "Assigned to": "Присвоен", "Atom feed for events and posts": "Atom лента для мероприятий и публикаций", "Avatar": "Аватар", @@ -152,6 +157,7 @@ "Contact": "Контакт", "Continue editing": "Продолжить редактирование", "Cookies and Local storage": "Файлы cookie и локальное хранилище", + "Copy URL to clipboard": "Скопировать URL в буфер обмена", "Copy details to clipboard": "Копировать подробности в буфер обмена", "Country": "Страна", "Create": "Создать", @@ -257,11 +263,14 @@ "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 subscribing to push notifications": "Ошибка при подписке на push-уведомления", "Error while suspending group": "Ошибка при блокировке группы", + "Error while updating participation status inside this browser": "Ошибка при обновлении статуса участия в этом браузере", "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 URL": "URL мероприятия", "Event already passed": "Мероприятие уже прошло", "Event cancelled": "Мероприятие отменено", "Event creation": "Создание мероприятия", @@ -311,6 +320,7 @@ "Group": "Группа", "Group Followers": "Группа подписчиков", "Group Members": "Участники группы", + "Group URL": "URL группы", "Group activity": "Групповая активность", "Group address": "Адрес группы", "Group display name": "Отображаемое имя группы", @@ -351,6 +361,7 @@ "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.": "Здесь вы можете отправить сообщение организатору мероприятия.", + "Ignore": "Игнорировать", "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": "Подробное описание узла", @@ -381,6 +392,7 @@ "Italic": "Курсив", "Join {instance}, a Mobilizon instance": "Присоединиться к {instance}, узлу Mobilizon", "Join group": "Вступить в группу", + "Join group {group}": "Вступить в группу {group}", "Keep the entire conversation about a specific topic together on a single page.": "Храните всю беседу по определенной теме на одной странице.", "Key words": "Ключевые слова", "Language": "Язык", @@ -521,6 +533,7 @@ "On {date} from {startTime} to {endTime}": "{date} c {startTime} до {endTime}", "On {date} starting at {startTime}": "{date}, начало в {startTime}", "On {instance}": "На {instance}", + "On {instance} and other federated instances": "В {instance} и других федеративных узлах", "Only accessible through link": "Доступно только по ссылке", "Only accessible through link (private)": "Доступно только по ссылке (приватно)", "Only accessible to members of the group": "Доступно только участникам группы", @@ -599,6 +612,7 @@ "Public feeds": "Публичные ленты", "Public iCal Feed": "Публичная iCal-лента", "Public page": "Публичная страница", + "Public preview": "Публичный предварительный просмотр", "Publication date": "Дата публикации", "Publish": "Опубликовать", "Published events with {comments} comments and {participations} confirmed participations": "Опубликованные мероприятия с {comments} комментариями и {participations} подтвержденными участниками", @@ -606,6 +620,7 @@ "RSS/Atom Feed": "RSS/Atom новостная лента", "Radius": "Радиус", "Recap every week": "Подводить итоги каждую неделю", + "Receive one email for each activity": "Получать одно электронное письмо для каждого действия", "Receive one email per request": "Получать электронное письмо на каждый запрос", "Redirecting to content…": "Перенаправление к содержимому…", "Refresh profile": "Обновить профиль", @@ -664,6 +679,7 @@ "Select languages": "Выберите языки", "Select the activities for which you wish to receive an email or a push notification.": "Выберите действия, для которых вы хотите получать электронные письма или push-уведомления.", "Send email": "Отправить электронное письмо", + "Send notification e-mails": "Отправлять уведомления по электронной почте", "Send the confirmation email again": "Отправьте письмо с подтверждением еще раз", "Send the report": "Отправить отчёт", "Set an URL to a page with your own privacy policy.": "Укажите URL-адрес страницы с вашей собственной политикой конфиденциальности.", @@ -753,6 +769,7 @@ "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 hasn't got push notifications enabled.": "На этом узле не включены push-уведомления.", "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.", @@ -798,10 +815,12 @@ "Unset group": "Отменить выбор группы", "Unsubscribe to WebPush": "Отписаться от WebPush уведомлений", "Unsubscribe to browser notifications": "Отписаться от уведомлений в браузере", + "Unsubscribe to browser push notifications": "Отказаться от подписки на push-уведомления браузера", "Unsuspend": "Отменить приостановку", "Upcoming": "Предстоящие", "Upcoming events": "Предстоящие мероприятия", "Update": "Обновить", + "Update app": "Обновить приложение", "Update event {name}": "Обновить мероприятие {name}", "Update group": "Обновить группу", "Update my event": "Обновить моё мероприятие", @@ -827,6 +846,7 @@ "Visible everywhere on the web (public)": "Видно во всем Интернете (публично)", "Waiting for organization team approval.": "Ожидает одобрения организаторами.", "Warning": "Предупреждение", + "We couldn't save your participation inside this browser. Not to worry, you have successfully confirmed your participation, we just couldn't save it's status in this browser because of a technical issue.": "Нам не удалось сохранить ваше участие в этом браузере. Не волнуйтесь, вы успешно подтвердили свое участие, мы просто не смогли сохранить его статус в этом браузере из-за технической проблемы.", "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.": "Мы используем настройки вашего часового пояса, чтобы вы своевременно получали уведомления о мероприятиях.", @@ -836,6 +856,7 @@ "We'll use your timezone settings to send a recap of the morning of the event.": "Мы используем настройки вашего часового пояса, чтобы утром отправить вам напоминание о мероприятии.", "Website": "Веб-сайт", "Website / URL": "Веб-сайт / URL", + "Weekly email summary": "Еженедельная сводка по электронной почте", "Welcome back {username}!": "С возвращением, {username}!", "Welcome back!": "С возвращением!", "Welcome to Mobilizon, {username}!": "Добро пожаловать в Mobilizon, {username}!", @@ -862,6 +883,7 @@ "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 can't use notifications in this browser.": "Вы не можете использовать уведомления в этом браузере.", + "You can't use push notifications in this browser.": "В этом браузере нельзя использовать push-уведомления.", "You can't use webpush in this browser.": "Вы не можете использовать webpush в этом браузере.", "You changed your email or password": "Вы изменили свой адрес электронной почты или пароль", "You created the discussion {discussion}.": "Вы создали обсуждение {discussion}.", @@ -966,6 +988,7 @@ "default Mobilizon privacy policy": "Политика конфиденциальности Mobilizon по умолчанию", "default Mobilizon terms": "условия использования Mobilizon по умолчанию", "e.g. 10 Rue Jangot": "например: Садовая 10", + "enable the feature": "включить функцию", "explore the events": "просмотреть мероприятия", "explore the groups": "посмотреть группы", "full rules": "полные правила", From c6a7214d9c4374b24aa013beaadb2b8fc6e207f1 Mon Sep 17 00:00:00 2001 From: deadmorose Date: Thu, 8 Jul 2021 15:35:54 +0000 Subject: [PATCH 003/169] Translated using Weblate (Russian) Currently translated at 100.0% (52 of 52 strings) Translation: Mobilizon/Activity Translate-URL: https://weblate.framasoft.org/projects/mobilizon/activity/ru/ --- priv/gettext/ru/LC_MESSAGES/activity.po | 138 ++++++++++++------------ 1 file changed, 69 insertions(+), 69 deletions(-) diff --git a/priv/gettext/ru/LC_MESSAGES/activity.po b/priv/gettext/ru/LC_MESSAGES/activity.po index 5cc47648b..eaa570ffc 100644 --- a/priv/gettext/ru/LC_MESSAGES/activity.po +++ b/priv/gettext/ru/LC_MESSAGES/activity.po @@ -8,325 +8,325 @@ ## to merge POT files into PO files. msgid "" msgstr "" -"PO-Revision-Date: 2021-06-18 13:15+0000\n" +"PO-Revision-Date: 2021-07-09 00:51+0000\n" "Last-Translator: deadmorose \n" "Language-Team: Russian \n" "Language: ru\n" "Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 4.6.2\n" -"Content-Transfer-Encoding: 8bit\n" -#, elixir-format #: lib/service/activity/renderer/member.ex:38 #: lib/web/templates/email/activity/_member_activity_item.html.eex:19 lib/web/templates/email/activity/_member_activity_item.text.eex:12 +#, elixir-format msgid "%{member} accepted the invitation to join the group." msgstr "%{member} принял приглашение присоединиться к группе." -#, elixir-format #: lib/service/activity/renderer/member.ex:42 #: lib/web/templates/email/activity/_member_activity_item.html.eex:26 lib/web/templates/email/activity/_member_activity_item.text.eex:17 +#, elixir-format msgid "%{member} rejected the invitation to join the group." msgstr "%{member} отклонил приглашение присоединиться к группе." -#, elixir-format #: lib/service/activity/renderer/member.ex:30 #: lib/web/templates/email/activity/_member_activity_item.html.eex:4 lib/web/templates/email/activity/_member_activity_item.text.eex:1 +#, elixir-format msgid "%{member} requested to join the group." msgstr "%{member} попросил присоединиться к группе." -#, elixir-format #: lib/service/activity/renderer/member.ex:34 #: lib/web/templates/email/activity/_member_activity_item.html.eex:11 lib/web/templates/email/activity/_member_activity_item.text.eex:6 +#, elixir-format msgid "%{member} was invited by %{profile}." msgstr "%{member} был приглашён %{profile}." -#, elixir-format #: lib/service/activity/renderer/member.ex:50 #: lib/web/templates/email/activity/_member_activity_item.html.eex:40 lib/web/templates/email/activity/_member_activity_item.text.eex:27 +#, elixir-format msgid "%{profile} added the member %{member}." msgstr "%{profile} добавил участника %{member}." -#, elixir-format #: lib/service/activity/renderer/discussion.ex:65 #: lib/web/templates/email/activity/_discussion_activity_item.html.eex:46 lib/web/templates/email/activity/_discussion_activity_item.text.eex:19 +#, elixir-format msgid "%{profile} archived the discussion %{discussion}." msgstr "%{profile} заархивировал обсуждение %{discussion}." -#, elixir-format #: lib/service/activity/renderer/discussion.ex:25 #: lib/web/templates/email/activity/_discussion_activity_item.html.eex:4 lib/web/templates/email/activity/_discussion_activity_item.text.eex:1 +#, elixir-format msgid "%{profile} created the discussion %{discussion}." msgstr "%{profile} создал обсуждение %{discussion}." -#, elixir-format #: lib/service/activity/renderer/resource.ex:24 #: lib/web/templates/email/activity/_resource_activity_item.html.eex:5 lib/web/templates/email/activity/_resource_activity_item.text.eex:2 +#, elixir-format msgid "%{profile} created the folder %{resource}." msgstr "%{profile} создал папку %{resource}." -#, elixir-format #: lib/web/templates/email/activity/_group_activity_item.html.eex:4 #: lib/web/templates/email/activity/_group_activity_item.text.eex:1 +#, elixir-format msgid "%{profile} created the group %{group}." msgstr "%{profile} создал группу %{group}." -#, elixir-format #: lib/service/activity/renderer/resource.ex:33 #: lib/web/templates/email/activity/_resource_activity_item.html.eex:20 lib/web/templates/email/activity/_resource_activity_item.text.eex:8 +#, elixir-format msgid "%{profile} created the resource %{resource}." msgstr "%{profile} создал ресурс %{resource}." -#, elixir-format #: lib/service/activity/renderer/discussion.ex:75 #: lib/web/templates/email/activity/_discussion_activity_item.html.eex:60 lib/web/templates/email/activity/_discussion_activity_item.text.eex:25 +#, elixir-format msgid "%{profile} deleted the discussion %{discussion}." msgstr "%{profile} удалил обсуждение %{discussion}." -#, elixir-format #: lib/service/activity/renderer/resource.ex:97 #: lib/web/templates/email/activity/_resource_activity_item.html.eex:103 lib/web/templates/email/activity/_resource_activity_item.text.eex:40 +#, elixir-format msgid "%{profile} deleted the folder %{resource}." msgstr "%{profile} удалил папку %{resource}." -#, elixir-format #: lib/service/activity/renderer/resource.ex:106 #: lib/web/templates/email/activity/_resource_activity_item.html.eex:111 lib/web/templates/email/activity/_resource_activity_item.text.eex:45 +#, elixir-format msgid "%{profile} deleted the resource %{resource}." msgstr "%{profile} удалил ресурс %{resource}." -#, elixir-format #: lib/service/activity/renderer/member.ex:58 #: lib/web/templates/email/activity/_member_activity_item.html.eex:56 lib/web/templates/email/activity/_member_activity_item.text.eex:39 +#, elixir-format msgid "%{profile} excluded member %{member}." msgstr "%{profile} исключил участника %{member}." -#, elixir-format #: lib/service/activity/renderer/resource.ex:76 #: lib/web/templates/email/activity/_resource_activity_item.html.eex:71 lib/web/templates/email/activity/_resource_activity_item.text.eex:28 +#, elixir-format msgid "%{profile} moved the folder %{resource}." msgstr "%{profile} переместил папку %{resource}." -#, elixir-format #: lib/service/activity/renderer/resource.ex:85 #: lib/web/templates/email/activity/_resource_activity_item.html.eex:86 lib/web/templates/email/activity/_resource_activity_item.text.eex:34 +#, elixir-format msgid "%{profile} moved the resource %{resource}." msgstr "%{profile} переместил ресурс %{resource}." -#, elixir-format #: lib/service/activity/renderer/member.ex:62 #: lib/web/templates/email/activity/_member_activity_item.html.eex:64 lib/web/templates/email/activity/_member_activity_item.text.eex:45 +#, elixir-format msgid "%{profile} quit the group." msgstr "%{profile} вышел из группы." -#, elixir-format #: lib/service/activity/renderer/discussion.ex:55 #: lib/web/templates/email/activity/_discussion_activity_item.html.eex:32 lib/web/templates/email/activity/_discussion_activity_item.text.eex:13 +#, elixir-format msgid "%{profile} renamed the discussion %{discussion}." msgstr "%{profile} переименовал обсуждение %{discussion}." -#, elixir-format #: lib/service/activity/renderer/resource.ex:45 #: lib/web/templates/email/activity/_resource_activity_item.html.eex:37 lib/web/templates/email/activity/_resource_activity_item.text.eex:14 +#, elixir-format msgid "%{profile} renamed the folder from %{old_resource_title} to %{resource}." msgstr "%{profile} переименовал папку из %{old_resource_title} в %{resource}." -#, elixir-format #: lib/service/activity/renderer/resource.ex:59 #: lib/web/templates/email/activity/_resource_activity_item.html.eex:53 lib/web/templates/email/activity/_resource_activity_item.text.eex:21 +#, elixir-format msgid "%{profile} renamed the resource from %{old_resource_title} to %{resource}." msgstr "%{profile} переименовал ресурс из %{old_resource_title} в %{resource}." -#, elixir-format #: lib/service/activity/renderer/discussion.ex:35 #: lib/web/templates/email/activity/_discussion_activity_item.html.eex:18 lib/web/templates/email/activity/_discussion_activity_item.text.eex:7 +#, elixir-format msgid "%{profile} replied to the discussion %{discussion}." msgstr "%{profile} ответил на обсуждение %{discussion}." -#, elixir-format #: lib/web/templates/email/activity/_group_activity_item.html.eex:19 #: lib/web/templates/email/activity/_group_activity_item.text.eex:7 +#, elixir-format msgid "%{profile} updated the group %{group}." msgstr "%{profile} обновил группу %{group}." -#, elixir-format #: lib/service/activity/renderer/member.ex:54 #: lib/web/templates/email/activity/_member_activity_item.html.eex:48 lib/web/templates/email/activity/_member_activity_item.text.eex:33 +#, elixir-format msgid "%{profile} updated the member %{member}." msgstr "%{profile} обновил участника %{member}." -#, elixir-format #: lib/service/activity/renderer/event.ex:23 #: lib/web/templates/email/activity/_event_activity_item.html.eex:4 lib/web/templates/email/activity/_event_activity_item.text.eex:1 +#, elixir-format msgid "The event %{event} was created by %{profile}." msgstr "Мероприятие %{event} было создано %{profile}." -#, elixir-format #: lib/service/activity/renderer/event.ex:43 #: lib/web/templates/email/activity/_event_activity_item.html.eex:34 lib/web/templates/email/activity/_event_activity_item.text.eex:13 +#, elixir-format msgid "The event %{event} was deleted by %{profile}." msgstr "Мероприятие %{event} было удалено %{profile}." -#, elixir-format #: lib/service/activity/renderer/event.ex:33 #: lib/web/templates/email/activity/_event_activity_item.html.eex:19 lib/web/templates/email/activity/_event_activity_item.text.eex:7 +#, elixir-format msgid "The event %{event} was updated by %{profile}." msgstr "Мероприятие %{event} было обновлено %{profile}." -#, elixir-format #: lib/web/templates/email/activity/_post_activity_item.html.eex:4 #: lib/web/templates/email/activity/_post_activity_item.text.eex:1 +#, elixir-format msgid "The post %{post} was created by %{profile}." msgstr "Публикация %{post} была создана %{profile}." -#, elixir-format #: lib/web/templates/email/activity/_post_activity_item.html.eex:34 #: lib/web/templates/email/activity/_post_activity_item.text.eex:13 +#, elixir-format msgid "The post %{post} was deleted by %{profile}." msgstr "Публикация %{post} была удалена %{profile}." -#, elixir-format #: lib/web/templates/email/activity/_post_activity_item.html.eex:19 #: lib/web/templates/email/activity/_post_activity_item.text.eex:7 +#, elixir-format msgid "The post %{post} was updated by %{profile}." msgstr "Публикация %{post} была обновлена %{profile}." -#, elixir-format #: lib/service/activity/renderer/member.ex:46 #: lib/web/templates/email/activity/_member_activity_item.html.eex:33 lib/web/templates/email/activity/_member_activity_item.text.eex:22 +#, elixir-format msgid "%{member} joined the group." msgstr "%{member} присоединился к группе." -#, elixir-format #: lib/service/activity/renderer/event.ex:63 #: lib/web/templates/email/activity/_event_activity_item.html.eex:58 lib/web/templates/email/activity/_event_activity_item.text.eex:25 +#, elixir-format msgid "%{profile} posted a comment on the event %{event}." msgstr "%{profile} оставил комментарий к мероприятию %{event}." -#, elixir-format #: lib/service/activity/renderer/event.ex:54 #: lib/web/templates/email/activity/_event_activity_item.html.eex:43 lib/web/templates/email/activity/_event_activity_item.text.eex:19 +#, elixir-format msgid "%{profile} replied to a comment on the event %{event}." msgstr "%{profile} ответил на комментарий к мероприятию %{event}." -#, elixir-format #: lib/web/templates/email/email_direct_activity.text.eex:27 +#, elixir-format msgid "Don't want to receive activity notifications? You may change frequency or disable them in your settings." msgstr "" "Не хотите получать уведомления о событиях? Вы можете изменить частоту " "уведомлений или отключить их в своих настройках." -#, elixir-format #: lib/web/templates/email/email_direct_activity.html.eex:135 #: lib/web/templates/email/email_direct_activity.text.eex:23 +#, elixir-format msgid "View one more activity" msgid_plural "View %{count} more activities" msgstr[0] "Посмотреть еще одно событие" msgstr[1] "Посмотреть еще %{count} события" msgstr[2] "Посмотреть еще %{count} событий" -#, elixir-format #: lib/web/templates/email/email_direct_activity.html.eex:44 #: lib/web/templates/email/email_direct_activity.html.eex:46 lib/web/templates/email/email_direct_activity.text.eex:6 #: lib/web/templates/email/email_direct_activity.text.eex:7 +#, elixir-format msgid "There has been an activity!" msgid_plural "There has been some activity!" msgstr[0] "Было событие!" msgstr[1] "Были события!" msgstr[2] "Были события!" -#, elixir-format #: lib/service/activity/renderer/renderer.ex:38 +#, elixir-format msgid "Activity on %{instance}" msgstr "События на %{instance}" -#, elixir-format #: lib/service/activity/renderer/comment.ex:38 #: lib/web/templates/email/activity/_comment_activity_item.html.eex:19 lib/web/templates/email/activity/_comment_activity_item.text.eex:7 #: lib/web/templates/email/email_anonymous_activity.html.eex:41 lib/web/templates/email/email_anonymous_activity.text.eex:5 +#, elixir-format msgid "%{profile} has posted an announcement under event %{event}." msgstr "%{profile} разместил объявление под мероприятием %{event}." -#, elixir-format #: lib/service/activity/renderer/comment.ex:24 #: lib/web/templates/email/activity/_comment_activity_item.html.eex:4 lib/web/templates/email/activity/_comment_activity_item.text.eex:1 +#, elixir-format msgid "%{profile} mentionned you in a comment under event %{event}." msgstr "%{profile} упомянул вас в комментарии под мероприятием %{event}." -#, elixir-format #: lib/service/activity/renderer/discussion.ex:45 +#, elixir-format msgid "%{profile} mentionned you in the discussion %{discussion}." msgstr "%{profile} упомянул вас в обсуждении %{discussion}." -#, elixir-format #: lib/web/templates/email/email_direct_activity.html.eex:155 +#, elixir-format msgid "Don't want to receive activity notifications? You may change frequency or disable them in %{tag_start}your settings%{tag_end}." msgstr "" "Не хотите получать уведомления о событиях? Вы можете изменить частоту " "уведомлений или отключить их в своих настройках." -#, elixir-format #: lib/web/templates/email/email_direct_activity.html.eex:42 #: lib/web/templates/email/email_direct_activity.text.eex:5 -msgid "Here's your weekly activity recap" -msgstr "" - #, elixir-format +msgid "Here's your weekly activity recap" +msgstr "Вот итоги вашей еженедельной активности" + #: lib/web/email/activity.ex:119 lib/web/email/activity.ex:140 +#, elixir-format msgid "Activity notification for %{instance}" msgstr "События на %{instance}" -#, elixir-format #: lib/web/email/activity.ex:126 -msgid "Daily activity recap for %{instance}" -msgstr "" - #, elixir-format +msgid "Daily activity recap for %{instance}" +msgstr "Итоги ежедневной активности для %{instance}" + #: lib/web/templates/email/email_direct_activity.html.eex:40 #: lib/web/templates/email/email_direct_activity.text.eex:4 +#, elixir-format msgid "Here's your daily activity recap" -msgstr "" +msgstr "Вот итоги вашей ежедневной активности" -#, elixir-format #: lib/web/email/activity.ex:133 -msgid "Weekly activity recap for %{instance}" -msgstr "" - #, elixir-format +msgid "Weekly activity recap for %{instance}" +msgstr "Итоги еженедельной активности для %{instance}" + #: lib/service/activity/renderer/comment.ex:66 #: lib/web/templates/email/activity/_comment_activity_item.html.eex:51 lib/web/templates/email/activity/_comment_activity_item.text.eex:19 -msgid "%{profile} has posted a new comment under your event %{event}." -msgstr "" - #, elixir-format +msgid "%{profile} has posted a new comment under your event %{event}." +msgstr "%{profile} разместил новый комментарий под вашим мероприятием %{event}." + #: lib/service/activity/renderer/comment.ex:53 #: lib/web/templates/email/activity/_comment_activity_item.html.eex:36 lib/web/templates/email/activity/_comment_activity_item.text.eex:13 +#, elixir-format msgid "%{profile} has posted a new reply under your event %{event}." -msgstr "" +msgstr "%{profile} опубликовал новый ответ под вашим мероприятием %{event}." -#, elixir-format #: lib/web/email/activity.ex:46 -msgid "Announcement for your event %{event}" -msgstr "" - #, elixir-format +msgid "Announcement for your event %{event}" +msgstr "Объявление о вашем мероприятии %{event}" + #: lib/service/activity/renderer/group.ex:23 +#, elixir-format msgid "The group %{group} was updated by %{profile}." msgstr "Публикация %{post} была обновлена %{profile}." -#, elixir-format, fuzzy #: lib/service/activity/renderer/post.ex:47 +#, elixir-format msgid "The post %{post} from group %{group} was deleted by %{profile}." -msgstr "Публикация %{post} была обновлена %{profile}." +msgstr "Сообщение %{post} из группы %{group} было удалено %{profile}." -#, elixir-format, fuzzy #: lib/service/activity/renderer/post.ex:31 +#, elixir-format msgid "The post %{post} from group %{group} was published by %{profile}." -msgstr "Публикация %{post} была обновлена %{profile}." +msgstr "Сообщение %{post} из группы %{group} было опубликовано %{profile}." -#, elixir-format, fuzzy #: lib/service/activity/renderer/post.ex:39 +#, elixir-format msgid "The post %{post} from group %{group} was updated by %{profile}." -msgstr "Публикация %{post} была обновлена %{profile}." +msgstr "Сообщение %{post} из группы %{group} было обновлено %{profile}." From ec8325e604003a9b43dff38e5a7aa70a778ba37c Mon Sep 17 00:00:00 2001 From: GunChleoc Date: Mon, 19 Jul 2021 07:18:53 +0000 Subject: [PATCH 004/169] Translated using Weblate (Gaelic) Currently translated at 90.8% (968 of 1065 strings) Translation: Mobilizon/Frontend Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/gd/ --- js/src/i18n/gd.json | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/js/src/i18n/gd.json b/js/src/i18n/gd.json index 5ba3fddd9..c5e9faf81 100644 --- a/js/src/i18n/gd.json +++ b/js/src/i18n/gd.json @@ -122,7 +122,6 @@ "Click to upload": "Briog airson luchdadh suas", "Close": "Dùin", "Close comments for all (except for admins)": "Dùin na beachdan dhan a h-uile duine (ach rianairean)", - "Events nearby": "Tachartasan am fagas", "Closed": "Dùinte", "Comment deleted": "Chaidh am beachd a sguabadh às", "Comment from @{username} reported": "Chaidh gearan a dhèanamh mu bheachd le @{username}", @@ -252,6 +251,7 @@ "Event {eventTitle} deleted": "Chaidh an tachartas {eventTitle} a sguabadh às", "Event {eventTitle} reported": "Chaidh gearan a dhèanamh mun tachartas {eventTitle}", "Events": "Tachartasan", + "Events nearby": "Tachartasan am fagas", "Events tagged with {tag}": "Tachartasan le taga {tag} riutha", "Everything": "A h-uile rud", "Ex: mobilizon.fr": "Can: mobilizon.fr", @@ -324,7 +324,7 @@ "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:": "Ma thèid do dhearbh-aithne co-naisgte iarraidh ort, cuiridh tu an t-ainm-cleachdaiche ’s an ionstans agad ri chèile dha. Mar eisimpleir, seo an dearbh-aithne co-naisgte aig a’ chiad phròifil agad:", "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.": "Thagh thu gu bheil thu airson na com-pàirtichean a dhearbhadh a làimh. Cuiridh Mobilizon post-d thugad nuair a bhios com-pàirtichean ùra ri an dearbhadh ann. ’S urrainn dhut taghadh gu h-ìosal dè cho tric ’s a gheibh thu na brathan sin.", "If you want, you may send a message to the event organizer here.": "Faodaidh tu teachdaireachd a chur gu eagraiche an tachartais an-seo ma thogras tu.", - "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.": "Sa cho-theacs a leanas, ’s e bathar-bog a th’ ann an aplacaid a chleachdas tu airson eadar-ghnìomhan a ghabhail leis an ionstans agad ’s a tha ’ga sholar le sgioba Mobilizon no le tread-phàrtaidh.", + "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.": "Sa cho-theacs a leanas, ’s e bathar-bog a th’ ann an aplacaid a chleachdas tu airson conaltradh leis an ionstans agad ’s a tha ’ga sholar le sgioba Mobilizon no le treas-phàrtaidh.", "Instance": "Ionstans", "Instance Long Description": "Tuairisgeul fada an ionstans", "Instance Name": "Ainm an ionstans", @@ -345,6 +345,7 @@ "Instances": "Ionstansan", "Instances following you": "Na h-ionstansan a tha a’ leantainn ort", "Instances you follow": "Na h-ionstansan air a leanas tu", + "Interact with a remote content": "Dèan conaltradh le susbaint chèin", "Invite a new member": "Thoir cuireadh do bhall ùr", "Invite member": "Thoir cuireadh do bhall", "Invited": "Air cuireadh fhaighinn", @@ -394,8 +395,8 @@ "Members": "Buill", "Message": "Teachdaireachd", "Mobilizon": "Mobilizon", - "Mobilizon is a federated network. You can interact with this event from a different server.": "’S e lìonra co-naisgte a th’ ann am Mobilizon ’S urrainn dhut eadar-ghnìomh a dhèanamh leis an tachartas seo o fhrithealaiche eile.", - "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.": "’S e bathar-bog co-naisgte a th’ ann am Mobilizon. Is ciall dha seo gur urrainn dhut – a-rèir roghainnean rianachd a’ cho-nasgaidh – eadar-ghnìomhan a ghabhail le susbaint o ionstansan eile, can gum faigh thu ballrachd ann am buidheann no gun gabh thu pàirt ann an tachartas a chaidh a chruthachadh am badeigin eile.", + "Mobilizon is a federated network. You can interact with this event from a different server.": "’S e lìonra co-naisgte a th’ ann am Mobilizon ’S urrainn dhut conaltradh leis an tachartas seo o fhrithealaiche eile.", + "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.": "’S e bathar-bog co-naisgte a th’ ann am Mobilizon. Is ciall dha seo gur urrainn dhut – a-rèir roghainnean rianachd a’ cho-nasgaidh –conaltradh le susbaint o ionstansan eile, can gum faigh thu ballrachd ann am buidheann no gun gabh thu pàirt ann an tachartas a chaidh a chruthachadh am badeigin eile.", "Mobilizon is a tool that helps you find, create and organise events.": "’S e acainn a th’ ann am Mobilizon a chuidicheas thu ach an lorg, an cruthaich ’s an cuir thu air dòigh tachartasan.", "Mobilizon is not a giant platform, but a multitude of interconnected Mobilizon websites.": "Chan e mòr-ùrlar a th’ ann am Mobilizon ach pailteas de làraichean-lìn Mobilizon a tha co-cheangailte ri càch a chèile.", "Mobilizon software": "Bathar-bog Mobilizon", @@ -765,8 +766,8 @@ "We improve this software thanks to your feedback. To let us know about this issue, two possibilities (both unfortunately require user account creation):": "Bheir sinn piseach air a’ bhathar-bhog le taic do bheachdan. Tha dà dhòigh ann airson innse dhuinn mu dhèidhinn na trioblaide seo (gu mì-fhortanach, feumaidh tu cunntas a chruthachadh dhaibh):", "We just sent an email to {email}": "Tha sinn air post-d a chur gu {email}", "We use your timezone to make sure you get notifications for an event at the correct time.": "Cleachdaidh sinn an roinn-tìde agad ach an cuir sinn na brathan mu thachartas thugad aig an àm cheart.", - "We will redirect you to your instance in order to interact with this event": "Bheir sinn dhan ionstans agad-sa thu airson eadar-ghnìomh a ghabhail leis an tachartas seo", - "We will redirect you to your instance in order to interact with this group": "Bheir sinn dhan ionstans agad-sa thu airson eadar-ghnìomh a ghabhail leis a’ bhuidheann seo", + "We will redirect you to your instance in order to interact with this event": "Bheir sinn dhan ionstans agad-sa thu airson conaltradh leis an tachartas seo", + "We will redirect you to your instance in order to interact with this group": "Bheir sinn dhan ionstans agad-sa thu airson conaltradh leis a’ bhuidheann seo", "We'll send you an email one hour before the event begins, to be sure you won't forget about it.": "Cuiridh sinn post-d thugad uair a thìde mus tòisich an tachartas a dhèanamh cinnteach nach dìochuimhnich thu e.", "We'll use your timezone settings to send a recap of the morning of the event.": "Cleachdaidh sinn an roinn-tìde agad airson cuimhneachan a chur thugad sa mhadainn ron tachartas.", "Website": "Làrach-lìn", From 42d13f92b211485640c1176c831641edf4be64db Mon Sep 17 00:00:00 2001 From: -- Date: Tue, 20 Jul 2021 12:56:19 +0000 Subject: [PATCH 005/169] Translated using Weblate (Finnish) Currently translated at 95.8% (1021 of 1065 strings) Translation: Mobilizon/Frontend Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/fi/ --- js/src/i18n/fi.json | 163 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) diff --git a/js/src/i18n/fi.json b/js/src/i18n/fi.json index 941151c8f..5aa711b07 100644 --- a/js/src/i18n/fi.json +++ b/js/src/i18n/fi.json @@ -12,6 +12,7 @@ "@{group}": "@{group}", "@{username}": "@{username}", "@{username} ({role})": "@{username} ({role)}", + "@{username}'s follow request was accepted": "Käyttäjän @{username} seurauspyyntö hyväksyttiin", "@{username}'s follow request was rejected": "Käyttäjän @{username} seuraamispyyntö hylättiin", "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.": "Evästeellä tarkoitetaan sellaista tietoa, jonka palvelun tarjoajan palvelin lähettää käyttäjän selainohjelmalle pyytäen selainta tallentamaan tiedon käyttäjän päätelaitteelle ja jota kyseinen palvelun tarjoajan palvelin voi myöhemmin pyytää takaisin. Kyse on käytännössä pienestä tietomäärästä, tyypillisesti lyhyestä tekstistä. Voit asettaa selaimen kieltäytymään kaikista evästeistä, mutta tämä saattaa rikkoa joitakin toiminnallisuuksia.", "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.": "Evästeet ovat pieniä tiedostoja, joita verkkosivut lähettävät käyttäjän tietokoneelle käyttäjän vieraillessa verkkosivuilla. Kun käyttäjä vierailee sivulla uudelleen, sivusto tunnistaa käyttäjän selaimen evästeen avulla. Evästeisiin voidaan tallentaa käyttäjän valintoja ja muuta tietoa. Selaimen voi asettaa hylkäämään kaikki evästeet. Tällöin kuitenkin osa verkkosivun toiminnoista tai palveluista voi lakata toimimasta. Paikallisesti tallennettavat tiedot toimivat samalla tavoin, mutta niihin voidaan tallentaa suurempia tietomääriä.", @@ -41,6 +42,7 @@ "Actions": "Toimenpiteet", "Activated": "Käytössä", "Active": "Aktiivinen", + "Activity": "Toiminta", "Actor": "Toimija", "Add": "Lisää", "Add / Remove…": "Lisää/poista…", @@ -59,6 +61,7 @@ "Admin settings successfully saved.": "Ylläpitoasetukset tallennettu.", "Administration": "Ylläpito", "Administrator": "Ylläpitäjä", + "All activities": "Kaikki toiminta", "All good, let's continue!": "Kaikki kunnossa, eteenpäin!", "All group members and other eventual server admins will still be able to view this information.": "Ryhmän kaikki jäsenet ja palvelimen mahdolliset muut ylläpitäjät voivat edelleen nähdä tämän tiedon.", "All the places have already been taken": "Kaikki paikat on jo varattu", @@ -68,6 +71,7 @@ "An error has occured. Sorry about that. You may try to reload the page.": "Tapahtui virhe. Yritä ladata sivu uudelleen.", "An error has occurred.": "Tapahtui virhe.", "An ethical alternative": "Eettinen vaihtoehto", + "An event I'm going to has been updated": "Tapahtuma, jonne olen menossa, on päivitetty", "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.": "Palvelin tarkoittaa palvelintietokoneelle asennettua Mobilizon-ohjelmaa. Palvelinta voi käyttää kuka tahansa, jolla on käytössään {mobilizon_software} tai jokin muu federoituva sovellus, eli se on osa niin kutsuttua fediversumia. Tämän palvelimen nimi on {instance_name}. Mobilizon on useiden palvelinten muodostama federoituva verkosto (sähköpostipalvelinten tavaan), eli eri palvelimille rekisteröityneet käyttäjät voivat olla yhteydessä toisiinsa vaikka eivät olisi rekisteröityneet samalle palvelimelle.", "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 eli ohjelmointirajapinta on tietoliikenneprotokolla, jonka avulla ohjelmistokomponentit voivat olla yhteydessä keskenään. Mobilizon-API voi esimerkiksi tarjota kolmansien osapuolten ohjelmistotyökaluille yhteyden Mobilizon-palvelimiin erilaisten toimintojen, kuten tapahtumien julkaisemisen, suorittamiseksi automaattisesti ja etänä.", "And {number} comments": "{number} kommenttia", @@ -88,6 +92,7 @@ "Are you sure you want to cancel the event creation? You'll lose all modifications.": "Haluatko varmasti keskeyttää tapahtuman luomisen? Kaikki muutokset menetetään.", "Are you sure you want to cancel the event edition? You'll lose all modifications.": "Haluatko varmasti keskeyttää tapahtuman muokkaamisen? Kaikki muutokset menetetään.", "Are you sure you want to cancel your participation at event \"{title}\"?": "Haluatko varmasti perua osallistumisesi tapahtumaan {title}?", + "Are you sure you want to delete this entire discussion?": "Oletko varma, että haluat poistaa koko tämän keskustelun?", "Are you sure you want to delete this event? This action cannot be reverted.": "Haluatko varmasti poistaa tämän tapahtuman? Toimintoa ei voi perua.", "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.": "Tapahtuman järjestäjä vahvistaa osallistumispyynnöt käsin, joten osallistumisesi on vahvistettu vasta sitten, kun saat vahvistuksesta kertovan sähköpostin.", "Assigned to": "Yhdistetty", @@ -98,8 +103,10 @@ "Before you can login, you need to click on the link inside it to validate your account.": "Sinun on ennen sisäänkirjautumista vahvistettava tilisi napsauttamalla siinä olevaa linkkiä.", "Begins on": "Alkaa", "Bold": "Lihavoitu", + "Browser notifications": "Selaimen ilmoitukset", "By @{group}": "Tehnyt @{group}", "By @{username}": "Tehnyt @{username}", + "By others": "Muilta", "By {author}": "Tekijä {author}", "By {group}": "Tekijä {group}", "By {username} and {group}": "Tehnyt {username} ja {group}", @@ -120,6 +127,7 @@ "Change password": "Vaihda salasana", "Change timezone": "Vaihda aikavyöhykettä", "Check your inbox (and your junk mail folder).": "Tarkista sähköpostisi (myös roskapostikansio).", + "City or region": "Kaupunki tai alue", "Clear": "Tyhjennä", "Clear participation data for all events": "Poista kaikkien tapahtumien osallistumistiedot", "Clear participation data for this event": "Poista tapahtuman osallistumistiedot", @@ -131,6 +139,7 @@ "Closed": "Suljettu", "Comment deleted": "Kommentti poistettu", "Comment from @{username} reported": "Käyttäjän @{username} kommentti raportoitu", + "Comment text can't be empty": "Kommentin teksti ei voi olla tyhjä", "Comments": "Kommentit", "Comments are closed for everybody else.": "Kommentit on suljettu muilta.", "Comments have been closed.": "Kommentointi on pois käytöstä.", @@ -144,6 +153,7 @@ "Contact": "Yhteystieto", "Continue editing": "Jatka muokkausta", "Cookies and Local storage": "Evästeet ja paikallisesti tallennettavat tiedot", + "Copy details to clipboard": "Kopioi yksityiskohdat leikepöydälle", "Country": "Maa", "Create": "Luo", "Create a calc": "Luo taulukko", @@ -164,6 +174,7 @@ "Create my event": "Luo oma tapahtuma", "Create my group": "Luo oma ryhmä", "Create my profile": "Luo oma profiili", + "Create new links": "Luo uudet linkit", "Create or join an group and start organizing with other people": "Luo ryhmä tai liity ryhmään ja ala järjestäytyä", "Create resource": "Luo resurssi", "Create the discussion": "Luo keskustelu", @@ -194,11 +205,13 @@ "Delete Event": "Poista tapahtuma", "Delete account": "Poista tili", "Delete conversation": "Poista keskustelu", + "Delete discussion": "Poista keskustelu", "Delete event": "Poista tapahtuma", "Delete everything": "Poista kaikki", "Delete group": "Poista ryhmä", "Delete my account": "Poista tilini", "Delete post": "Poista julkaisu", + "Delete this discussion": "Poista tämä keskustelu", "Delete this identity": "Poista tämä identiteetti", "Delete your identity": "Poista oma identiteetti", "Delete {eventTitle}": "Poista {eventTitle}", @@ -248,12 +261,16 @@ "Enter your own terms. HTML tags allowed. Mobilizon.org's terms are provided as template.": "Syötä palvelimen käyttöehdot. HTML-merkinnät ovat sallittuja. Mallina voi käyttää Mobilizon.orgin käyttöehtoja.", "Enter your own terms. HTML tags allowed. The {mobilizon_terms} are provided as template.": "Kirjoita omat ehdot. HTML-tunnisteet sallittuja. {mobilizon_terms} toimivat mallina.", "Error": "Virhe", + "Error details copied!": "Virheen yksityiskohdat kopioitu!", + "Error message": "Virheilmoitus", + "Error stacktrace": "Virheen jäljitys", "Error while changing email": "Virhe sähköpostiosoitetta vaihdettaessa", "Error while communicating with the server.": "Virhe palvelinyhteydessä.", "Error while login with {provider}. Retry or login another way.": "Virhe kirjauduttaessa {provider}-tilillä. Yritä uudelleen tai kirjaudu toista kautta.", "Error while login with {provider}. This login provider doesn't exist.": "Virhe kirjauduttaessa {provider}-tilillä. Tätä sisäänkirjautumispalvelua ei ole olemassa.", "Error while reporting group {groupTitle}": "Tapahtui virhe raportoidessa ryhmää {groupTitle}", "Error while saving report.": "Virhe raportin tallennuksessa.", + "Error while suspending group": "Virhe tapahtui kun ryhmää hyllytettiin", "Error while validating account": "Virhe tilin vahvistamisessa", "Error while validating participation": "Virhe osallistumisen vahvistamisessa", "Error while validating participation request": "Virhe osallistumispyyntöä vahvistettaessa", @@ -270,6 +287,7 @@ "Event {eventTitle} deleted": "Tapahtuma {eventTitle} poistettu", "Event {eventTitle} reported": "Tapahtuma (eventTitle} raportoitu", "Events": "Tapahtumat", + "Events nearby": "Lähellä olevat tapahtumat", "Events tagged with {tag}": "Tapahtumat tunnisteella {tag}", "Everything": "Kaikki", "Ex: mobilizon.fr": "Esim. mobilizon.fr", @@ -299,9 +317,11 @@ "From the {startDate} at {startTime} to the {endDate}": "Alkaa {startDate} klo {startTime} ja päättyy {endDate}", "From the {startDate} at {startTime} to the {endDate} at {endTime}": "Alkaa {startDate} klo {startTime} ja päättyy {endDate} klo {endTime}", "From the {startDate} to the {endDate}": "Alkaa {startDate} ja päättyy {endDate}", + "From yourself": "Sinulta", "Gather ⋅ Organize ⋅ Mobilize": "Kokoonnu ⋅ Järjestä ⋅ Mobilisoi", "General": "Yleinen", "General information": "Yleiset tiedot", + "General settings": "Yleiset asetukset", "Getting location": "Haetaan sijaintia", "Getting there": "Reittiohjeet", "Glossary": "Sanasto", @@ -339,6 +359,8 @@ "I participate": "Osallistun", "I want to allow people to participate without an account.": "Osallistuminen ilman käyttäjätiliä sallittu.", "I want to approve every participation request": "Haluan hyväksyä kaikki osallistumispyynnöt", + "I've been mentionned in a comment under an event": "Minut on mainittu tapahtuman kommentissa", + "I've been mentionned in a group discussion": "Minut on mainittu ryhmäkeskustelussa", "ICS feed for events": "Tapahtumien ICS-syöte", "ICS/WebCal Feed": "ICS/WebCal-syöte", "Identity {displayName} created": "Identiteetti {displayName} luotu", @@ -376,6 +398,7 @@ "Instances": "Palvelimet", "Instances following you": "Instanssit, jotka seuraavat sinua", "Instances you follow": "Instanssit, joita seuraat", + "Interact with a remote content": "Vuorovaikuta ulkoisen sisällön kanssa", "Invite a new member": "Kutsu uusi jäsen", "Invite member": "Kutsu jäsen", "Invited": "Kutsuttu", @@ -390,6 +413,7 @@ "Last IP adress": "Edellinen IP-osoite", "Last group created": "Viimeisin luotu ryhmä", "Last published event": "Viimeisin julkaistu tapahtuma", + "Last published events": "Viimeksi julkaistut tapahtumat", "Last sign-in": "Edellinen sisäänkirjautuminen", "Last week": "Viime viikko", "Latest posts": "Viimeiset julkaisut", @@ -408,6 +432,7 @@ "Limited number of places": "Paikkoja rajoitettu määrä", "List title": "Luettelon otsikko", "Load more": "Lataa lisää", + "Load more activities": "Lataa lisää toimintaa", "Loading comments…": "Ladataan kommentteja…", "Local": "Paikallinen", "Locality": "Sijainti", @@ -427,6 +452,7 @@ "Mark as resolved": "Merkitse ratkaistuksi", "Member": "Jäsen", "Members": "Jäsenet", + "Mentions": "Maininnat", "Message": "Viesti", "Mobilizon": "Mobilizon", "Mobilizon is a federated network. You can interact with this event from a different server.": "Mobilizon on federoituva verkosto. Tätä tapahtumasivua voi käyttää myös toiselta palvelimelta.", @@ -462,6 +488,7 @@ "New members": "Uudet jäsenet", "New note": "Uusi merkintä", "New password": "Uusi salasana", + "New post": "Uusi viesti", "New profile": "Uusi profiili", "Next": "Seuraava", "Next month": "Ensi kuussa", @@ -477,22 +504,30 @@ "No events found": "Tapahtumia ei löytynyt", "No follower matches the filters": "Ei suodatinta vastaavia seuraajia", "No group found": "Ryhmää ei löytynyt", + "No group matches the filters": "Yksikään ryhmä ei vastaa suodattimia", "No groups found": "Ryhmiä ei löytynyt", + "No information": "Ei tietoa", "No instance follows your instance yet.": "Mikään palvelin ei vielä seuraa tätä palvelinta.", "No instance to approve|Approve instance|Approve {number} instances": "Ei hyväksyttäviä palvelimia|Hyväksy palvelin|Hyväksy {number} palvelinta", "No instance to reject|Reject instance|Reject {number} instances": "Ei hylättäviä palvelimia|Hylkää palvelin|Hylkää {number} palvelinta", "No instance to remove|Remove instance|Remove {number} instances": "Ei poistettavia palvelimia|Poista palvelin|Poista {number} palvelinta", "No languages found": "Kieliä ei löytynyt", "No member matches the filters": "Ei suodattimia vastaavia jäseniä", + "No members found": "Käyttäjiä ei löydetty", + "No memberships found": "Ei jäsenyyksiä löydettynä", "No message": "Ei viestiä", "No moderation logs yet": "Moderointilokia ei vielä ole", + "No more activity to display.": "Toimintaa ei ole enää näytettävänä.", "No notification settings yet": "Ei vielä ilmoitusasetuksia", "No one is participating|One person participating|{going} people participating": "Ei osallistujia|Yksi osallistuja|{going} osallistujaa", "No ongoing todos": "Ei keskeneräisiä tehtäviä", "No open reports yet": "Avoimia raportteja ei vielä ole", + "No organized events found": "Järjestettyjä tapahtumia ei löydetty", + "No organized events listed": "Ei järjestettyjä tapahtumia listattuna", "No participant matches the filters": "Ei suodattimia vastaavia osallistujia", "No participant to approve|Approve participant|Approve {number} participants": "Ei osallistujia hyväksyttäväksi|Hyväksy osallistuja|Hyväksy {number} osallistujaa", "No participant to reject|Reject participant|Reject {number} participants": "Ei osallistujia hylättäväksi|Hylkää osallistuja|Hylkää {number} osallistujaa", + "No participations listed": "Ei osallistumisia listattuna", "No posts found": "Viestejä ei löytynyt", "No posts yet": "Ei julkaisuja vielä", "No preferences yet": "Valintoja ei ole vielä tehty", @@ -514,8 +549,10 @@ "Nothing to see here": "Ei mitään nähtävää", "Notification before the event": "Ilmoitus ennen tapahtumaa", "Notification on the day of the event": "Ilmoitus tapahtumapäivänä", + "Notification settings": "Ilmoitusasetukset", "Notifications": "Ilmoitukset", "Notifications for manually approved participations to an event": "Ilmoitukset tapahtuman käsin hyväksytyistä osallistumisista", + "Notify participants": "Ilmoita osallistujille", "Now, create your first profile:": "Luo seuraavaksi ensimmäinen profiilisi:", "Number of places": "Paikkojen määrä", "OK": "OK", @@ -535,6 +572,8 @@ "Only group members can access discussions": "Vain ryhmän jäsenet voivat päästä keskusteluihin", "Only group moderators can create, edit and delete posts.": "Vain ryhmän moderaattorit voivat luode, muokata ja poistaa viestejä.", "Open": "Avoin", + "Open a topic on our forum": "Luo uusi aihe foorumillamme", + "Open an issue on our bug tracker (advanced users)": "Avaa vikailmoitus virheenjäljittimessämme (edistyneet käyttäjät)", "Opened reports": "Avatut raportit", "Or": "Tai", "Organize and take action, freely": "Organisoidu ja toimi vapaasti", @@ -569,11 +608,13 @@ "Password reset": "Salasanan palautus", "Past events": "Menneet tapahtumat", "Pending": "Odottaa", + "Personal feeds": "Henkilökohtaiset syötteet", "Pick": "Valitse", "Pick a group": "Valitse ryhmä", "Pick a profile or a group": "Valitse profiili tai ryhmä", "Pick an identity": "Valitse identiteetti", "Pick an instance": "Valitse instanssi", + "Please add as many details as possible to help identify the problem.": "Laita niin monta yksityiskohtaa kuin mahdollista, jotta voimme tunnistaa ongelman.", "Please check your spam folder if you didn't receive the email.": "Jos et saanut sähköpostia, tarkista roskapostikansio.", "Please contact this instance's Mobilizon admin if you think this is a mistake.": "Jos epäilet tätä virheeksi, ota yhteyttä tämän palvelimen Mobilizon-ylläpitäjään.", "Please do not use it in any real way.": "Älä käytä todellisiin tarkoituksiin.", @@ -597,6 +638,8 @@ "Privacy policy": "Tietosuojakäytäntö", "Private event": "Yksityistapahtuma", "Private feeds": "Yksityissyötteet", + "Profile": "Profiili", + "Profile feeds": "Profiilin syöte", "Profiles": "Profiilit", "Profiles and federation": "Profiilit ja federointi", "Promote": "Nosta", @@ -611,6 +654,7 @@ "Publish": "Julkaise", "Published events": "Julkaistut tapahtumat", "Published events with {comments} comments and {participations} confirmed participations": "Julkaistuissa tapahtumissa {comments} kommenttia ja {participations} vahvistettua osallistumista", + "Push": "Push", "RSS/Atom Feed": "RSS/Atom-syöte", "Radius": "Säde", "Read Framasoft’s statement of intent on the Framablog": "Lue Framasoftin päämääräjulkilausuma Framablogista", @@ -619,6 +663,7 @@ "Redirecting to content…": "Ohjataan sisältöön…", "Redirecting to event…": "Siirrytään tapahtumaan…", "Refresh profile": "Päivitä profiili", + "Regenerate new links": "Luo uudet linkit uudelleen", "Region": "Alue", "Register": "Rekisteröidy", "Register an account on Mobilizon!": "Rekisteröi Mobilizon-tili!", @@ -674,8 +719,10 @@ "Searching…": "Haetaan…", "Search…": "Hae…", "Select a language": "Valitse kieli", + "Select a radius": "Valitse säde", "Select a timezone": "Valitse aikavyöhyke", "Select languages": "Valitse kielet", + "Select the activities for which you wish to receive an email or a push notification.": "Valitse toiminnat, joista haluat saada sähköposti- tai push-ilmoitukset.", "Send email": "Lähetä sähköposti", "Send me an email to reset my password": "Lähetä salasananpalautusviesti", "Send me the confirmation email once again": "Lähetä vahvistussähköposti uudelleen", @@ -705,6 +752,7 @@ "Suspend group": "Estä ryhmä", "Suspended": "Estetty", "Task lists": "Tehtäväluettelot", + "Technical details": "Tekniset yksityiskohdat", "Tentative": "Alustava", "Tentative: Will be confirmed later": "Alustava: vahvistetaan myöhemmin", "Terms": "Käyttöehdot", @@ -725,10 +773,20 @@ "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.": "Tapahtuman järjestäjä hyväksyy osallistujat käsin. Koska olet päättänyt osallistua ilman tiliä, kerro, miksi haluat osallistua tapahtumaan.", "The event title will be ellipsed.": "Tapahtuman otsikkoa lyhennetään.", "The event will show as attributed to this group.": "Tapahtuma näytetään liitettynä tähän ryhmään.", + "The event will show as attributed to this profile.": "Tapahtuma näkyy liitettynä tähän profiiliin.", "The event will show as attributed to your personal profile.": "Tapahtuma näytetään liitettynä henkilökohtaiseen profiiliisi.", "The event will show the group as organizer.": "Ryhmä näkyy tapahtuman järjestäjänä.", + "The event {event} was created by {profile}.": "Tapahtuman {event} loi {profile}.", + "The event {event} was deleted by {profile}.": "Tapahtuman {event} poisti {profile}.", + "The event {event} was updated by {profile}.": "Tapahtumaa {event} päivitti {profile}.", "The events you created are not shown here.": "Luomiasi tapahtumia ei näytetä tässä.", + "The group can now be joined by anyone.": "Ryhmään voivat nyt liittyä kaikki.", + "The group can now only be joined with an invite.": "Ryhmään voi nyt liittyä vain kutsusta.", "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.": "Ryhmä näkyy julkisissa hakutuloksissa, ja sitä voidaan esitellä esittelyosiossa. Esittelysivulla näytetään vain julkisia tietoja.", + "The group's avatar was changed.": "Ryhmän avatar muutettiin.", + "The group's banner was changed.": "Ryhmän banneri muutettiin.", + "The group's physical address was changed.": "Ryhmän osoite muutettiin.", + "The group's short description was changed.": "Ryhmän lyhyt kuvaus muutettiin.", "The instance administrator is the person or entity that runs this Mobilizon instance.": "Palvelimen ylläpitäjä on tämän Mobilizon-palvelimen toiminnasta vastaava henkilö tai taho.", "The member was removed from the group {group}": "Jäsen poistettiin ryhmästä {group}", "The new email doesn't seem to be valid": "Uusi sähköpostiosoite ei kelpaa", @@ -739,14 +797,22 @@ "The page you're looking for doesn't exist.": "Etsimääsi sivua ei ole olemassa.", "The password provided is invalid": "Annettu salasana ei kelpaa", "The password was successfully changed": "Salasanan vaihto onnistui", + "The post {post} was created by {profile}.": "Viestin {post} loi {profile}.", + "The post {post} was deleted by {profile}.": "Viestin {post} poisti {profile}.", + "The post {post} was updated by {profile}.": "Viestiä {post} päivitti {profile}.", "The report will be sent to the moderators of your instance. You can explain why you report this content below.": "Raportti lähetetään oman palvelimesi moderaattoreille. Alla voit kertoa, miksi raportoit sisällöstä.", + "The selected picture is too heavy. You need to select a file smaller than {size}.": "Valittu kuva on liian iso. Valitse tiedosto, joka on pienempi kuin {size}.", + "The technical details of the error can help developers solve the problem more easily. Please add them to your feedback.": "Virheen tekniset yksityiskohdat voivat auttaa kehittäjiä ratkaisemaan ongelman helpommin. Lisää ne palautteeseesi, kiitos.", "The user account you're trying to login as has not been confirmed yet. Check your email inbox and eventually your spam folder.": "Käyttäjätiliä, jolla yrität kirjautua, ei ole vielä vahvistettu. Tarkista sähköpostilaatikkosi ja tarvittaessa roskapostikansiosi.", "The {default_privacy_policy} will be used. They will be translated in the user's language.": "Käytössä on {default_privacy_policy}. Ne käännetään käyttäjän valitsemalle kielelle.", "The {default_terms} will be used. They will be translated in the user's language.": "{default_terms} ovat käytössä. Ne käännetään käyttäjän kielelle.", "There are {participants} participants.": "Osallistujia on {participants}.", + "There is no activity yet. Start doing some things to see activity appear here.": "Toimintaa ei ole vielä täällä. Ala tekemään jotain, jotta näet toimintaa tapahtuvan täällä.", "There will be no way to recover your data.": "Tietoja ei voi palauttaa millään tavalla.", "There's no discussions yet": "Keskustelua ei vielä ole", "These events may interest you": "Nämä tapahtumat saattavat kiinnostaa sinua", + "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.": "Nämä syötteet sisältävät tapahtumadataa tapahtumille, joissa jokin profiileistasi on osallistuja tai luoja. Sinun tulisi pitää nämä yksityisinä. Voit löytää syötteet tietyille profiileille jokaisen profiilin sivuilta.", + "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.": "Nämä syötteet sisältävät tapahtumadataa tapahtumille, joissa tämä tietty profiili on osallistuja tai luoja. Sinun pitäisi pitää nämä yksityisinä. Voit löytää kaikkien profiiliesi syötteet ilmoitusasetuksista.", "This Mobilizon instance and this event organizer allows anonymous participations, but requires validation through email confirmation.": "Anonyymi osallistuminen on sallittua tällä Mobilizon-palvelimella ja tähän tapahtumaan, mutta osallistuminen on vahvistettava sähköpostitse.", "This URL is not supported": "Osoite ei ole tuettu", "This email is already registered as participant for this event": "Sähköpostiosoite on jo kirjattu tapahtuman osallistujiin", @@ -787,10 +853,13 @@ "Today": "Tänään", "Tomorrow": "Huomenna", "Transfer to {outsideDomain}": "Siirry osoitteeseen {outsideDomain}", + "Triggered profile refreshment": "Käynnistettiin profiilin päivitys", "Type": "Tyyppi", "Type or select a date…": "Syötä tai valitse päivämäärä…", "URL": "URL", "URL copied to clipboard": "Osoite kopioitu leikepöydälle", + "Unable to copy to clipboard": "Ei pystytty kopioimaan leikepöydälle", + "Unable to create the group. One of the pictures may be too heavy.": "Ryhmää ei pystytty luomaan. Jokin kuvista voi olla liian iso.", "Unable to detect timezone.": "Aikavyöhykettä ei pystytty tunnistamaan.", "Unable to load event for participation. The error details are provided below:": "Tapahtumaa ei voi ladata osallistumista varten. Tarkemmat tiedot virheestä:", "Unable to save your participation in this browser.": "Osallistumistasi ei voi tallentaa tässä selaimessa.", @@ -799,6 +868,7 @@ "Unknown": "Tuntematon", "Unknown actor": "Tuntematon tekijä", "Unknown error.": "Tuntematon virhe.", + "Unknown value for the openness setting.": "Tuntematon arvo avoimuuden asetukselle.", "Unsaved changes": "Tallentamattomia muutoksia", "Unset group": "Ryhmää ei asetettu", "Unsuspend": "Poista esto", @@ -826,12 +896,16 @@ "View event page": "Näytä tapahtumasivu", "View everything": "Näytä kaikki", "View page on {hostname} (in a new window)": "Näytä sivu palvelimella {hostname} (uudessa ikkunassa)", + "Visibility was set to an unknown value.": "Näkyvyys asetettiin tuntemattomaan arvoon.", + "Visibility was set to private.": "Näkyvyys asetettiin yksityiseksi.", + "Visibility was set to public.": "Näkyvyys asetettiin julkiseksi.", "Visible everywhere on the web": "Näkyy kaikkialle verkossa", "Visible everywhere on the web (public)": "Näkyy kaikkialla verkossa (julkinen)", "Waiting for organization team approval.": "Odottaa järjestäjien hyväksyntää.", "Waiting list": "Odotuslista", "Warning": "Varoitus", "We asked professional designers to help us develop our vision for Mobilizon. We took time to study the {digital_habits} in order to understand the features they need to gather, organize, and mobilize.": "Pyysimme ammattisuunnittelijoita auttamaan Mobilizon-visiomme kehittämisessä. Perehdyimme {digital_habits}, jotta ymmärtäisimme, mitä ominaisuuksia he tarvitsevat kokoontumisessaan, organisoitumisessaan ja mobilisoitumisessaan.", + "We improve this software thanks to your feedback. To let us know about this issue, two possibilities (both unfortunately require user account creation):": "Parannamme tätä ohjelmistoa palautteesi takia. Jotta saamme tietää tästä ongelmasta, kaksi mahdollisuutta (molemmat vaativat ikävä kyllä käyttäjätunnuksen luomista):", "We just sent an email to {email}": "Lähetimme juuri sähköpostia osoitteeseen {email}", "We use your timezone to make sure you get notifications for an event at the correct time.": "Aikavyöhyketiedon avulla saat tapahtumailmoitukset oikeaan aikaan.", "We want to develop a digital common, that everyone can make their own, which respects privacy and activism by design.": "Haluamme kehittää digitaalista yhteisomaisuutta, josta jokainen voi tehdä omanlaisensa ja joka kunnioittaa yksityisyyttä ja aktivismia ihan luonnostaan.", @@ -853,9 +927,14 @@ "Who published {number} events": "{number} julkaistua tapahtumaa", "Why create an account?": "Miksi kannattaa tehdä tunnus?", "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.": "Sallimme osallistumisesi näyttämisen ja hallinnoinnin tapahtumasivulla tällä laitteella. Älä valitse, jos käytät julkista laitetta.", + "Within {number} kilometers of {place}": "|Yhden kilometrin sisällä paikasta {place}|{number} kilometrin päässä paikasta {place}", "World map": "Maailmankartta", "Write something…": "Kirjoita jotain…", + "Yesterday": "Eilen", + "You accepted the invitation to join the group.": "Hyväksyit liittymiskutsun ryhmään.", + "You added the member {member}.": "Lisäsit käyttäjän {member}.", "You and one other person are going to this event": "Vain sinä olet menossa tähän tapahtumaan | Vain sinä ja yksi sinun lisäksesi on menossa tähän tapahtumaan | Sinä ja {approved} muuta henkilöä ovat menossa tähän tapahtumaan.", + "You archived the discussion {discussion}.": "Arkistoit keskustelun {discussion}.", "You are already a participant of this event.": "Olet jo tapahtuman osallistuja.", "You are already logged-in.": "Olet jo kirjautunut sisään.", "You are not an administrator for this group.": "Et ole ryhmän ylläpitäjä.", @@ -870,9 +949,24 @@ "You can't change your password because you are registered through {provider}.": "Et voi vaihtaa salasanaa, koska olet rekisteröitynyt palvelussa {provider}.", "You can't remove your last identity.": "Et voi poistaa viimeistä identiteettiäsi.", "You can't reset your password because you use a 3rd-party auth provider to login.": "Et voi palauttaa salasanaa, koska käytät kirjautumiseen ulkopuolista tunnistautumispalvelua.", + "You created the discussion {discussion}.": "Loit keskustelun {discussion}.", + "You created the event {event}.": "Loit tapahtuman {event}.", + "You created the folder {resource}.": "Loit kansion {resource}.", + "You created the group {group}.": "Loit ryhmän {group}.", + "You created the post {post}.": "Loit viestin {post}.", + "You created the resource {resource}.": "Loit resurssin {resource}.", + "You deleted the discussion {discussion}.": "Poistit keskustelun {discussion}.", + "You deleted the event {event}.": "Poistit tapahtuman {event}.", + "You deleted the folder {resource}.": "Poistit kansio {resource}.", + "You deleted the post {post}.": "Poistit viestin {post}.", + "You deleted the resource {resource}.": "Poistit resurssin {resource}.", + "You demoted the member {member} to an unknown role.": "Alensit käyttäjän {member} tuntemattomaan rooliin.", + "You demoted {member} to moderator.": "Alensit käyttäjän {member} roolin moderaattoriksi.", + "You demoted {member} to simple member.": "Alensit käyttäjän {member} roolin yksinkertaiseksi käyttäjäksi.", "You didn't create or join any event yet": "Et ole vielä luonut tapahtumaa tai liittynyt tapahtumaan", "You didn't create or join any event yet.": "Et ole vielä luonut tapahtumaa tai liittynyt mihinkään tapahtumaan.", "You don't follow any instances yet.": "Et seuraa vielä yhtäkään palvelinta.", + "You excluded member {member}.": "Jätit pois käyttäjän {member}.", "You have been disconnected": "Yhteytesi on katkaistu", "You have been invited by {invitedBy} to the following group:": "{invitedBy} on kutsunut sinut seuraaviin ryhmiin:", "You have been removed from this group's members.": "Sinut on poistettu ryhmän jäsenistä.", @@ -880,17 +974,44 @@ "You have one event in {days} days.": "Sinulla ei ole tapahtumia seuraavien {days} päivän aikana | Sinulla on yksi tapahtuma seuraavien {days} päivän aikana | Sinulla on {count} tapahtumaa seuraavien {days} päivän aikana", "You have one event today.": "Sinulla ei ole tapahtumia tänään | Sinulla on yksi tapahtuma tänään | Sinulla on {count} tapahtumaa tänään", "You have one event tomorrow.": "Sinulla ei ole tapahtumia huomenna | Sinulla on yksi tapahtuma huomenna | Sinulla on {count} tapahtumaa huomenna", + "You invited {member}.": "Kutsuit käyttäjän {member}.", "You may also ask to {resend_confirmation_email}.": "Voit myös pyytää {resend_confirmation_email}.", "You may clear all participation information for this device with the buttons below.": "Alla olevalla painikkeella voit poistaa kaikki tällä laitteella olevat osallistumistiedot.", "You may now close this window, or {return_to_event}.": "Voit sulkea ikkunan tai {return_to_event}.", "You may now close this window.": "Voit nyt sulkea tämän ikkunan.", + "You may show some members as contacts.": "Voit näyttää jotkut käyttäjät yhteyshenkilöinä.", + "You moved the folder {resource} into {new_path}.": "Siirsit kansion {resource} polkuun {new_parh}.", + "You moved the folder {resource} to the root folder.": "Siirsit kansion {resource} juurikansioon.", + "You moved the resource {resource} into {new_path}.": "Siirsit resurssin {resource} polkuun {new_path].", + "You moved the resource {resource} to the root folder.": "Siirsit resurssin {resource} juurikansioon.", "You need to create the group before you create an event.": "Luo ryhmä, jotta voit luoda tapahtuman.", "You need to login.": "Kirjaudu sisään.", + "You posted a comment on the event {event}.": "Lähetit kommentin tapahtumaan {event}.", + "You promoted the member {member} to an unknown role.": "Ylensit käyttäjän {member} tuntemattomaan rooliin.", + "You promoted {member} to administrator.": "Ylensit käyttäjän {member} ylläpitäjäksi.", + "You promoted {member} to moderator.": "Ylensit käyttäjän {member} moderaattoriksi.", + "You renamed the discussion from {old_discussion} to {discussion}.": "Nimesit keskustelun uudelleen nmestä {old_discussion} nimeksi {discussion}.", + "You renamed the folder from {old_resource_title} to {resource}.": "Muutit kansion nimestä {old_resource_title} nimeksi {resource}.", + "You renamed the resource from {old_resource_title} to {resource}.": "Nimesit resurssin uudelleen nimestä {old_resource_title} nimeksi {resource}.", + "You replied to a comment on the event {event}.": "Vastasit kommenttiin tapahtumassa {event}.", + "You replied to the discussion {discussion}.": "Vastasit keskusteluun {discussion}.", + "You requested to join the group.": "Pyysit liittymistäsi ryhmään.", + "You updated the event {event}.": "Päivitit tapahtumaa {event}.", + "You updated the group {group}.": "Päivitit ryhmän {group}.", + "You updated the member {member}.": "Päivitit käyttäjää {member}.", + "You updated the post {post}.": "Päivitit viestiä {post}.", + "You were demoted to an unknown role by {profile}.": "{profile} alensi roolisi tuntemattomaan rooliin.", + "You were demoted to moderator by {profile}.": "{profile} alensi roolisi moderaattoriksi.", + "You were demoted to simple member by {profile}.": "{profile} alensi roolisi yksinkertaiseksi käyttäjäksi.", + "You were promoted to administrator by {profile}.": "{profile} ylensi sinut ylläpitäjäksi.", + "You were promoted to an unknown role by {profile}.": "{profile} ylensi sinut tuntemattomaan rooliin.", + "You were promoted to moderator by {profile}.": "{profile} ylensi sinut moderaattoriksi.", "You will be able to add an avatar and set other options in your account settings.": "Voit lisätä profiilikuvan ja antaa muita tietoja tunnuksen asetuksissasi.", "You will be redirected to the original instance": "Sinut ohjataan alkuperäiselle palvelimelle", "You will find here all the events you have created or of which you are a participant.": "Täällä ovat kaikki luomasi tapahtumat sekä tapahtumat, joihin olet osallistumassa.", "You wish to participate to the following event": "Haluat osallistua seuraavaan tapahtumaan", "You'll get a weekly recap every Monday for upcoming events, if you have any.": "Saat joka maanantai muistutuksen viikon mahdollisista tulevista tapahtumista.", + "You'll need to change the URLs where there were previously entered.": "Sinun pitää muuttaa URLit sieltä mistä ne oli aiemmin syötetty.", "You'll need to transmit the group URL so people may access the group's profile.": "Ryhmän profiilin näkeminen edellyttää sitä, että jaat ryhmän osoitetta ihmisille.", "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.": "Sinun täytyy jakaa linkki ryhmään, jotta käyttäjät voivat päästä ryhmän profiilisivulle. Ryhmä ei näy Mobilizonin haussa tai tavallisilla hakukoneilla.", "You'll receive a confirmation email.": "Saat sähköpostiin vahvistuksen.", @@ -898,6 +1019,7 @@ "Your account has been validated": "Tilisi on vahvistettu", "Your account is being validated": "Tiliäsi vahvistetaan", "Your account is nearly ready, {username}": "Tilisi on melkein valmis, {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.": "Kaupunkisi tai alueesi ja säde käytetään vain ehdottamaan sinulle tapahtumia läheltä. Tapahtuman säde ottaa huomioon alueen hallinnollisen keskustan.", "Your current email is {email}. You use it to log in.": "Nykyinen sähköpostiosoitteesi on {email}. Kirjaudu sisään sillä.", "Your email": "Sähköpostiosoitteesi", "Your email address was automatically set based on your {provider} account.": "Sähköpostiosoitteesi asetettiin automaattisesti {provider}-tilisi perusteella.", @@ -923,6 +1045,7 @@ "Your timezone is currently set to {timezone}.": "Nykyinen aikavyöhykkeesi on {timezone}.", "Your timezone was detected as {timezone}.": "Aikavyöhykkeeksesi tunnistettiin {timezone}.", "Your timezone {timezone} isn't supported.": "Aikavyöhykkeesi {timezone} ei ole tuettu.", + "Your upcoming events": "Tulevat tapahtumasi", "[This comment has been deleted by it's author]": "[Kommentin kirjoittaja on poistanut kommentin]", "[This comment has been deleted]": "[Kommentti on poistettu]", "[deleted]": "[poistettu]", @@ -959,12 +1082,21 @@ "with another identity…": "toisella identiteetillä…", "{approved} / {total} seats": "{approved} / {total} paikkaa", "{available}/{capacity} available places": "Ei paikkoja jäljellä|{available}/{capacity} paikkaa jäljellä", + "{count} km": "{count} km", "{count} participants": "Ei osallistujia vielä | Yksi osallistuja | {count} osallistujaa", "{count} requests waiting": "{count} pyyntöä odottamassa", "{count} team members": "tiimissä {count} jäsentä", + "{folder} - Resources": "{folder} - Resurssia", + "{group} activity timeline": "{group} toiminnan aikajana", + "{group} events": "{group} tapahtumaa", "{group}'s events": "Ryhmän {group} tapahtumat", "{instanceName} is an instance of the {mobilizon} software.": "{instanceName} on {mobilizon}-ohjelmaa käyttävä palvelin.", + "{instanceName} is an instance of {mobilizon_link}, a free software built with the community.": "{instanceName} on {mobilizon_link} -instanssi, yhteisön luoma vapaa ohjelmisto.", "{license} guarantees {respect} of the people who will use it. Since {source}, anyone can audit it, which guarantees its transparency.": "{license} varmistaa sitä käyttävien ihmisten {respect}. Koska {source}, kuka tahansa voi tarkastaa sen ja varmistua sen läpinäkyvyydestä.", + "{member} accepted the invitation to join the group.": "{member} hyväksyi liittymiskutsun.", + "{member} rejected the invitation to join the group.": "{member} hylkäsi kutsun ryhmään liittymiseen.", + "{member} requested to join the group.": "{member} pyysi liittymistä ryhmään.", + "{member} was invited by {profile}.": "Käyttäjän {member} kutsui {profile}.", "{moderator} added a note on {report}": "{moderator} lisäsi huomautuksen: {report}", "{moderator} closed {report}": "{moderator} sulki: {report}", "{moderator} deleted an event named \"{title}\"": "{moderator} poisti tapahtuman ”{title)”", @@ -975,10 +1107,41 @@ "{moderator} suspended profile {profile}": "{moderator} esti profiilin {profile}", "{nb} km": "{nb} km", "{number} members": "{number} jäsentä", + "{number} memberships": "{number} käyttäjiä", "{number} organized events": "Ei järjestettyjä tapahtumia|Yksi järjestetty tapahtuma|{number} järjestettyä tapahtumaa", "{number} participations": "Ei osallistumisia|Yksi osallistuminen|{number} osallistumista", "{number} posts": "Ei julkaisuja|Yksi julkaisu|{number} julkaisua", + "{old_group_name} was renamed to {group}.": "{old_group_name} nimettiin uudelleen ryhmäksi {group}.", "{profile} (by default)": "{profile} (oletuksena)", + "{profile} added the member {member}.": "{profile} lisäsi käyttäjän {member}.", + "{profile} archived the discussion {discussion}.": "{profile} arkistoi keskustelun {discussion}.", + "{profile} created the discussion {discussion}.": "{profile} loi keskustelun {discussion}.", + "{profile} created the folder {resource}.": "{profile} loi kansion {resource}.", + "{profile} created the group {group}.": "{profile} loi ryhmän {group}.", + "{profile} created the resource {resource}.": "{profile} loi resurssin {resource}.", + "{profile} deleted the discussion {discussion}.": "{profile} poisti keskustelun {discussion}.", + "{profile} deleted the folder {resource}.": "{profile} poisti kansion {resource}.", + "{profile} deleted the resource {resource}.": "{profile} poisti resurssin {resource}.", + "{profile} demoted {member} to an unknown role.": "{profile} alensi käyttäjän {member} tuntemattomaan rooliin.", + "{profile} demoted {member} to moderator.": "{profile} alensi käyttäjän {member} moderaattoriksi.", + "{profile} demoted {member} to simple member.": "{profile} alensi käytäjän {member} yksinkertaiseksi käyttäjäksi.", + "{profile} excluded member {member}.": "{profile} jätti pois käyttäjän {member}.", + "{profile} moved the folder {resource} into {new_path}.": "{profile} siirsi kansion {resource} polkuun {new_path}.", + "{profile} moved the folder {resource} to the root folder.": "{profile} siirsi kansion {resource} juurikansioon.", + "{profile} moved the resource {resource} into {new_path}.": "{profile} siirsi resurssin {resource} polkuun {new_path}.", + "{profile} moved the resource {resource} to the root folder.": "{profile} siirsi resurssin {resource} juurikansioon.", + "{profile} posted a comment on the event {event}.": "{profile} lähetti kommentin tapahtumaan {event}.", + "{profile} promoted {member} to administrator.": "{proflle} ylensi käyttäjän {member} ylläpitäjäksi.", + "{profile} promoted {member} to an unknown role.": "{proflle} ylensi käyttäjän {member} tuntemattomaan rooliin.", + "{profile} promoted {member} to moderator.": "{profile} ylensi käyttäjän {member} moderaattoriksi.", + "{profile} quit the group.": "{profile} jätti ryhmän.", + "{profile} renamed the discussion from {old_discussion} to {discussion}.": "{profile} nimesi keskustelun uudelleen nimestä {old_discussion} nimeksi {discussion}.", + "{profile} renamed the folder from {old_resource_title} to {resource}.": "{profile} nimesi uudelleen kansion nimestä {old_resource_title} nimeksi {resource}.", + "{profile} renamed the resource from {old_resource_title} to {resource}.": "{profile} nimesi resurssin nimestä {old_resource_title} nimeksi {resource}.", + "{profile} replied to a comment on the event {event}.": "{profile} vastasi kommenttiin tapahtumassa {event}.", + "{profile} replied to the discussion {discussion}.": "{profile} vastasi keskusteluun {discussion}.", + "{profile} updated the group {group}.": "{profile} päivitti ryhmää {group}.", + "{profile} updated the member {member}.": "{profile} päivitti käyttäjää {member}.", "{title} ({count} todos)": "{title} ({count} tehtävää)", "{username} was invited to {group}": "{username} kutsuttiin ryhmään {group}", "© The Mobilizon Contributors {date} - Made with Elixir, Phoenix, VueJS & with some love and some weeks": "© Mobilizon-tekijät {date} – Valmistusaineina Elixir, Phoenix, VueJS sekä rakkaus ja aika", From 98c8679a1fbcb09871b2d730d68bd994ff03ff1d Mon Sep 17 00:00:00 2001 From: Jimi Viita-aho Date: Tue, 20 Jul 2021 13:00:24 +0000 Subject: [PATCH 006/169] Translated using Weblate (Finnish) Currently translated at 95.8% (1021 of 1065 strings) Translation: Mobilizon/Frontend Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/fi/ --- js/src/i18n/fi.json | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/js/src/i18n/fi.json b/js/src/i18n/fi.json index 5aa711b07..782e94b84 100644 --- a/js/src/i18n/fi.json +++ b/js/src/i18n/fi.json @@ -164,6 +164,7 @@ "Create a new group": "Luo uusi ryhmä", "Create a new identity": "Luo uusi identiteetti", "Create a new list": "Luo uusi luettelo", + "Create a new profile": "Luo uusi profiili", "Create a pad": "Luo tekstiasiakirja", "Create a videoconference": "Luo videokokous", "Create a visioconference": "Luo videopuhelu", @@ -242,6 +243,7 @@ "Edit": "Muokkaa", "Edit biography": "Muokkaa henkilökuvausta", "Edit post": "Muokkaa julkaisua", + "Edit profile {profile}": "Muokkaa profiilia {profile}", "Edited {ago}": "Muokattu {ago}", "Eg: Stockholm, Dance, Chess…": "Esim. Helsinki, tanssi, shakki, …", "Either on the {instance} instance or on another instance.": "Joko palvelimella {instance} tai toisella palvelimella.", @@ -266,6 +268,7 @@ "Error stacktrace": "Virheen jäljitys", "Error while changing email": "Virhe sähköpostiosoitetta vaihdettaessa", "Error while communicating with the server.": "Virhe palvelinyhteydessä.", + "Error while loading the preview": "Esikatselun latauksessa tapahtui virhe", "Error while login with {provider}. Retry or login another way.": "Virhe kirjauduttaessa {provider}-tilillä. Yritä uudelleen tai kirjaudu toista kautta.", "Error while login with {provider}. This login provider doesn't exist.": "Virhe kirjauduttaessa {provider}-tilillä. Tätä sisäänkirjautumispalvelua ei ole olemassa.", "Error while reporting group {groupTitle}": "Tapahtui virhe raportoidessa ryhmää {groupTitle}", @@ -363,6 +366,7 @@ "I've been mentionned in a group discussion": "Minut on mainittu ryhmäkeskustelussa", "ICS feed for events": "Tapahtumien ICS-syöte", "ICS/WebCal Feed": "ICS/WebCal-syöte", + "Identities": "Identiteetit", "Identity {displayName} created": "Identiteetti {displayName} luotu", "Identity {displayName} deleted": "Identiteetti {displayName} poistettu", "Identity {displayName} updated": "Identiteetti {displayName} päivitetty", @@ -392,6 +396,7 @@ "Instance Terms URL": "Pälvelimen käyttöehtojen URL", "Instance administrator": "Palvelimen ylläpitäjä", "Instance configuration": "Palvelimen asetukset", + "Instance feeds": "Instanssin syötteet", "Instance languages": "Instanssin kielet", "Instance rules": "Palvelimen säännöt", "Instance settings": "Palvelimen asetukset", @@ -860,9 +865,11 @@ "URL copied to clipboard": "Osoite kopioitu leikepöydälle", "Unable to copy to clipboard": "Ei pystytty kopioimaan leikepöydälle", "Unable to create the group. One of the pictures may be too heavy.": "Ryhmää ei pystytty luomaan. Jokin kuvista voi olla liian iso.", + "Unable to create the profile. The avatar picture may be too heavy.": "Profiilia ei voitu luoda. Profiilikuva saataa olla liian raskas.", "Unable to detect timezone.": "Aikavyöhykettä ei pystytty tunnistamaan.", "Unable to load event for participation. The error details are provided below:": "Tapahtumaa ei voi ladata osallistumista varten. Tarkemmat tiedot virheestä:", "Unable to save your participation in this browser.": "Osallistumistasi ei voi tallentaa tässä selaimessa.", + "Unable to update the profile. The avatar picture may be too heavy.": "Profiilia ei voitu päivittää. Profiilikuva saattaa olla liian raskas.", "Unfortunately, this instance isn't opened to registrations": "Valitettavasti tälle palvelimelle ei voi rekisteröityä", "Unfortunately, your participation request was rejected by the organizers.": "Ikävä kyllä järjestäjät hylkäsivät osallistumispyyntösi.", "Unknown": "Tuntematon", @@ -940,6 +947,7 @@ "You are not an administrator for this group.": "Et ole ryhmän ylläpitäjä.", "You are not part of any group": "Et ole yhdenkään ryhmän jäsen", "You are not part of any group.": "Et kuulu mihinkään ryhmään.", + "You are offline": "Ei verkkoyhteyttä", "You are participating in this event anonymously": "Osallistut tapahtumaan anonyymisti", "You are participating in this event anonymously but didn't confirm participation": "Osallistut tapahtumaan anonyymisti, mutta et ole vahvistanut osallistumistasi", "You can add tags by hitting the Enter key or by adding a comma": "Voit lisätä tunnisteita painamalla enteriä tai lisäämällä pilkun", @@ -1100,10 +1108,15 @@ "{moderator} added a note on {report}": "{moderator} lisäsi huomautuksen: {report}", "{moderator} closed {report}": "{moderator} sulki: {report}", "{moderator} deleted an event named \"{title}\"": "{moderator} poisti tapahtuman ”{title)”", + "{moderator} has deleted a comment from {author}": "{moderator} poisti kommentin henkilöltä {author}", + "{moderator} has deleted a comment from {author} under the event {event}": "{moderator} poisti kommentin henkilöltä {author} joka liittyi tapahtumaan {event}", "{moderator} has deleted user {user}": "{moderator} on poistanut käyttäjän {user}", + "{moderator} has done an unknown action": "{moderator} teki jotain tuntematonta", + "{moderator} has unsuspended group {profile}": "{moderator} poisti ryhmän jäädytyksen {profile}", "{moderator} has unsuspended profile {profile}": "{moderator} on poistanut profiilin {profile} eston", "{moderator} marked {report} as resolved": "{moderator} merkitsi ratkaistuksi: {report}", "{moderator} reopened {report}": "{moderator} avasi uudelleen: {report}", + "{moderator} suspended group {profile}": "{moderator} jäädytti ryhmän {profile}", "{moderator} suspended profile {profile}": "{moderator} esti profiilin {profile}", "{nb} km": "{nb} km", "{number} members": "{number} jäsentä", From 11e75eaf6689b405263b876eabc65c3f8717057b Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Tue, 20 Jul 2021 18:22:18 +0200 Subject: [PATCH 007/169] Add the possibility to create profiles and groups from CLI - Create an actor at the same time when creating an user - or create either a profile and attach it to an existing user - or create a group and set the admin to an existing profile Closes #785 Signed-off-by: Thomas Citharel --- lib/mix/tasks/mobilizon/actors/new.ex | 102 +++++++++++++ lib/mix/tasks/mobilizon/actors/utils.ex | 58 ++++++++ lib/mix/tasks/mobilizon/common.ex | 14 +- lib/mix/tasks/mobilizon/users/new.ex | 33 ++++- lib/mobilizon/actors/actors.ex | 9 ++ test/tasks/actors/new_test.exs | 185 ++++++++++++++++++++++++ test/tasks/users_test.exs | 85 ++++++++++- 7 files changed, 479 insertions(+), 7 deletions(-) create mode 100644 lib/mix/tasks/mobilizon/actors/new.ex create mode 100644 lib/mix/tasks/mobilizon/actors/utils.ex create mode 100644 test/tasks/actors/new_test.exs diff --git a/lib/mix/tasks/mobilizon/actors/new.ex b/lib/mix/tasks/mobilizon/actors/new.ex new file mode 100644 index 000000000..48124d816 --- /dev/null +++ b/lib/mix/tasks/mobilizon/actors/new.ex @@ -0,0 +1,102 @@ +defmodule Mix.Tasks.Mobilizon.Actors.New do + @moduledoc """ + Task to create a new user + """ + use Mix.Task + import Mix.Tasks.Mobilizon.Actors.Utils + import Mix.Tasks.Mobilizon.Common + alias Mobilizon.Actors.Actor + alias Mobilizon.{Actors, Users} + alias Mobilizon.Users.User + + @shortdoc "Manages Mobilizon users" + + @impl Mix.Task + def run(rest) do + {options, [], []} = + OptionParser.parse( + rest, + strict: [ + email: :string, + username: :string, + display_name: :string, + group_admin: :string, + type: :string + ], + aliases: [ + e: :email, + u: :username, + d: :display_name, + t: :type, + a: :group_admin + ] + ) + + start_mobilizon() + + profile_username = Keyword.get(options, :username) + profile_name = Keyword.get(options, :display_name) + + if profile_name != nil || profile_username != nil do + else + shell_error("You need to provide at least --username or --display-name.") + end + + case Keyword.get(options, :type, "profile") do + "profile" -> + do_create_profile(options, profile_username, profile_name) + + "group" -> + do_create_group(options, profile_username, profile_name) + end + end + + @spec do_create_profile(Keyword.t(), String.t(), String.t()) :: Actor.t() | nil + defp do_create_profile(options, profile_username, profile_name) do + with {:email, email} when is_binary(email) <- {:email, Keyword.get(options, :email)}, + {:ok, %User{} = user} <- Users.get_user_by_email(email), + %Actor{preferred_username: preferred_username, name: name} <- + create_profile(user, profile_username, profile_name, default: false) do + shell_info(""" + A profile was created for user #{email} with the following information: + - username: #{preferred_username} + - display name: #{name} + """) + else + {:email, nil} -> + shell_error("You need to provide an email for creating a new profile.") + + {:error, :user_not_found} -> + shell_error("No user with this email was found.") + + nil -> + nil + end + end + + defp do_create_group(options, profile_username, profile_name) do + with {:option, admin_name} when is_binary(admin_name) <- + {:option, Keyword.get(options, :group_admin)}, + {:admin, %Actor{} = admin} <- {:admin, Actors.get_local_actor_by_name(admin_name)}, + {:ok, %Actor{preferred_username: preferred_username, name: name}} <- + create_group(admin, profile_username, profile_name) do + shell_info(""" + A group was created with profile #{admin_name} as the admin and with the following information: + - username: #{preferred_username} + - display name: #{name} + """) + else + {:option, nil} -> + shell_error( + "You need to provide --group-admin with the username of the admin to create a group." + ) + + {:admin, nil} -> + shell_error("Profile with username #{Keyword.get(options, :group_admin)} wasn't found") + + {:error, :insert_group, %Ecto.Changeset{errors: errors}, _} -> + shell_error(inspect(errors)) + shell_error("Error while creating group because of the above reason") + end + end +end diff --git a/lib/mix/tasks/mobilizon/actors/utils.ex b/lib/mix/tasks/mobilizon/actors/utils.ex new file mode 100644 index 000000000..fd7e2e911 --- /dev/null +++ b/lib/mix/tasks/mobilizon/actors/utils.ex @@ -0,0 +1,58 @@ +defmodule Mix.Tasks.Mobilizon.Actors.Utils do + @moduledoc """ + Tools for generating usernames from display names + """ + + alias Mobilizon.Actors + alias Mobilizon.Actors.Actor + alias Mobilizon.Users.User + + @doc """ + Removes all spaces, accents, special characters and diacritics from a string to create a plain ascii username (a-z0-9_) + + See https://stackoverflow.com/a/37511463 + """ + @spec generate_username(String.t()) :: String.t() + def generate_username(""), do: "" + + def generate_username(name) do + name + |> String.downcase() + |> String.normalize(:nfd) + |> String.replace(~r/[\x{0300}-\x{036f}]/u, "") + |> String.replace(~r/ /, "_") + |> String.replace(~r/[^a-z0-9_]/, "") + end + + # Profile from name + @spec username_and_name(String.t() | nil, String.t() | nil) :: String.t() + def username_and_name(nil, profile_name) do + {generate_username(profile_name), profile_name} + end + + def username_and_name(profile_username, nil) do + {profile_username, profile_username} + end + + def username_and_name(profile_username, profile_name) do + {profile_username, profile_name} + end + + def create_profile(%User{id: user_id}, username, name, options \\ []) do + {username, name} = username_and_name(username, name) + + {:ok, %Actor{} = new_person} = + Actors.new_person( + %{preferred_username: username, user_id: user_id, name: name}, + Keyword.get(options, :default, true) + ) + + new_person + end + + def create_group(%Actor{id: admin_id}, username, name, _options \\ []) do + {username, name} = username_and_name(username, name) + + Actors.create_group(%{creator_actor_id: admin_id, preferred_username: username, name: name}) + end +end diff --git a/lib/mix/tasks/mobilizon/common.ex b/lib/mix/tasks/mobilizon/common.ex index 4ee5d96f9..8cc3ccffe 100644 --- a/lib/mix/tasks/mobilizon/common.ex +++ b/lib/mix/tasks/mobilizon/common.ex @@ -62,10 +62,16 @@ defmodule Mix.Tasks.Mobilizon.Common do end @spec shell_error(String.t()) :: :ok - def shell_error(message) do - if mix_shell?(), - do: Mix.shell().error(message), - else: IO.puts(:stderr, message) + def shell_error(message, options \\ []) do + if mix_shell?() do + Mix.shell().error(message) + else + IO.puts(:stderr, message) + end + + if Application.fetch_env!(:mobilizon, :env) != :test do + exit({:shutdown, Keyword.get(options, :error_code, 1)}) + end end @doc "Performs a safe check whether `Mix.shell/0` is available (does not raise if Mix is not loaded)" diff --git a/lib/mix/tasks/mobilizon/users/new.ex b/lib/mix/tasks/mobilizon/users/new.ex index 453762798..a91ef8d52 100644 --- a/lib/mix/tasks/mobilizon/users/new.ex +++ b/lib/mix/tasks/mobilizon/users/new.ex @@ -4,6 +4,8 @@ defmodule Mix.Tasks.Mobilizon.Users.New do """ use Mix.Task import Mix.Tasks.Mobilizon.Common + import Mix.Tasks.Mobilizon.Actors.Utils + alias Mobilizon.Actors.Actor alias Mobilizon.Users alias Mobilizon.Users.User @@ -17,7 +19,9 @@ defmodule Mix.Tasks.Mobilizon.Users.New do strict: [ password: :string, moderator: :boolean, - admin: :boolean + admin: :boolean, + profile_username: :string, + profile_display_name: :string ], aliases: [ p: :password @@ -52,14 +56,27 @@ defmodule Mix.Tasks.Mobilizon.Users.New do confirmation_token: nil }) do {:ok, %User{} = user} -> + profile = maybe_create_profile(user, options) + shell_info(""" An user has been created with the following information: - email: #{user.email} - password: #{password} - Role: #{user.role} - The user will be prompted to create a new profile after login for the first time. """) + if is_nil(profile) do + shell_info(""" + The user will be prompted to create a new profile after login for the first time. + """) + else + shell_info(""" + A profile was added with the following information: + - username: #{profile.preferred_username} + - display name: #{profile.name} + """) + end + {:error, %Ecto.Changeset{errors: errors}} -> shell_error(inspect(errors)) shell_error("User has not been created because of the above reason.") @@ -73,4 +90,16 @@ defmodule Mix.Tasks.Mobilizon.Users.New do def run(_) do shell_error("mobilizon.users.new requires an email as argument") end + + @spec maybe_create_profile(User.t(), Keyword.t()) :: Actor.t() | nil + defp maybe_create_profile(%User{} = user, options) do + profile_username = Keyword.get(options, :profile_username) + profile_name = Keyword.get(options, :profile_display_name) + + if profile_name != nil || profile_username != nil do + create_profile(user, profile_username, profile_name) + else + nil + end + end end diff --git a/lib/mobilizon/actors/actors.ex b/lib/mobilizon/actors/actors.ex index 5b1466f45..f24b68c30 100644 --- a/lib/mobilizon/actors/actors.ex +++ b/lib/mobilizon/actors/actors.ex @@ -741,6 +741,9 @@ defmodule Mobilizon.Actors do end end + @doc """ + Returns whether the `actor_id` is a confirmed member for the group `parent_id` + """ @spec is_member?(integer | String.t(), integer | String.t()) :: boolean() def is_member?(actor_id, parent_id) do match?( @@ -749,6 +752,9 @@ defmodule Mobilizon.Actors do ) end + @doc """ + Returns whether the `actor_id` is a moderator for the group `parent_id` + """ @spec is_moderator?(integer | String.t(), integer | String.t()) :: boolean() def is_moderator?(actor_id, parent_id) do match?( @@ -757,6 +763,9 @@ defmodule Mobilizon.Actors do ) end + @doc """ + Returns whether the `actor_id` is an administrator for the group `parent_id` + """ @spec is_administrator?(integer | String.t(), integer | String.t()) :: boolean() def is_administrator?(actor_id, parent_id) do match?( diff --git a/test/tasks/actors/new_test.exs b/test/tasks/actors/new_test.exs new file mode 100644 index 000000000..ff93a2388 --- /dev/null +++ b/test/tasks/actors/new_test.exs @@ -0,0 +1,185 @@ +defmodule Mix.Tasks.Mobilizon.Actors.NewTest do + use Mobilizon.DataCase + + import Mobilizon.Factory + + alias Mix.Tasks.Mobilizon.Actors.New + + alias Mobilizon.{Actors, Users} + alias Mobilizon.Actors.Actor + alias Mobilizon.Users.User + + Mix.shell(Mix.Shell.Process) + + @email "me@some.where" + describe "create profile" do + setup do + %User{} = user = insert(:user, email: @email) + + {:ok, user: user} + end + + @preferred_username "toto" + @name "Léo Pandaï" + @converted_username "leo_pandai" + + test "create with no options" do + New.run([]) + + # Debug message + assert_received {:mix_shell, :error, [message]} + + assert message =~ + "You need to provide at least --username or --display-name." + end + + test "create when email isn't set" do + New.run(["--display-name", @name]) + + # Debug message + assert_received {:mix_shell, :error, [message]} + + assert message =~ + "You need to provide an email for creating a new profile." + end + + test "create when email doesn't exist" do + New.run(["--email", "toto@somewhere.else", "--display-name", @name]) + + # Debug message + assert_received {:mix_shell, :error, [message]} + + assert message =~ + "No user with this email was found." + end + + test "create with --display-name" do + New.run(["--email", @email, "--display-name", @name]) + + assert {:ok, %User{id: user_id}} = Users.get_user_by_email(@email) + + assert %Actor{ + preferred_username: @converted_username, + name: @name, + domain: nil, + user_id: ^user_id + } = Actors.get_local_actor_by_name(@converted_username) + end + + test "create with --username" do + New.run(["--email", @email, "--username", @preferred_username]) + + assert {:ok, %User{id: user_id}} = Users.get_user_by_email(@email) + + assert %Actor{ + preferred_username: @preferred_username, + name: @preferred_username, + domain: nil, + user_id: ^user_id + } = Actors.get_local_actor_by_name(@preferred_username) + end + + test "create with --username and --display-name" do + New.run(["--email", @email, "--username", @preferred_username, "--display-name", @name]) + + assert {:ok, %User{id: user_id}} = Users.get_user_by_email(@email) + + assert %Actor{ + preferred_username: @preferred_username, + name: @name, + domain: nil, + user_id: ^user_id + } = Actors.get_local_actor_by_name(@preferred_username) + end + end + + describe "create group" do + @already_existing_group "already_there" + @already_existing_group_name "Already Thére" + @profile_username "theo" + + setup do + group = insert(:group, preferred_username: @already_existing_group) + profile = insert(:actor, preferred_username: @profile_username) + {:ok, group: group, profile: profile} + end + + test "create with no options" do + New.run(["--type", "group"]) + + # Debug message + assert_received {:mix_shell, :error, [message]} + + assert message =~ + "You need to provide at least --username or --display-name." + end + + test "create when email isn't set" do + New.run(["--type", "group", "--display-name", @name]) + + # Debug message + assert_received {:mix_shell, :error, [message]} + + assert message =~ + "You need to provide --group-admin with the username of the admin to create a group." + end + + test "create when group admin doesn't exist" do + New.run([ + "--type", + "group", + "--display-name", + @name, + "--group-admin", + "some0ne_98" + ]) + + # Debug message + assert_received {:mix_shell, :error, [message]} + + assert message =~ + "Profile with username some0ne_98 wasn't found" + end + + test "create but the group already exists" do + New.run([ + "--type", + "group", + "--display-name", + @already_existing_group_name, + "--group-admin", + @profile_username + ]) + + # Debug message + assert_received {:mix_shell, :error, [message]} + + assert message =~ + "[preferred_username: {\"This username is already taken.\", []}]" + + assert_received {:mix_shell, :error, [message]} + + assert message =~ + "Error while creating group because of the above reason" + end + + @group_name "My Awesome Group" + @group_username "my_awesome_group" + + test "create group", %{profile: %Actor{id: admin_id}} do + New.run([ + "--type", + "group", + "--display-name", + @group_name, + "--group-admin", + @profile_username + ]) + + assert %Actor{name: @group_name, preferred_username: @group_username, id: group_id} = + Actors.get_group_by_title(@group_username) + + assert Actors.is_administrator?(admin_id, group_id) + end + end +end diff --git a/test/tasks/users_test.exs b/test/tasks/users_test.exs index 7400be48b..d0b0e7ee3 100644 --- a/test/tasks/users_test.exs +++ b/test/tasks/users_test.exs @@ -5,7 +5,8 @@ defmodule Mix.Tasks.Mobilizon.UsersTest do alias Mix.Tasks.Mobilizon.Users.{Delete, Modify, New, Show} - alias Mobilizon.Users + alias Mobilizon.{Actors, Users} + alias Mobilizon.Actors.Actor alias Mobilizon.Users.User Mix.shell(Mix.Shell.Process) @@ -52,6 +53,88 @@ defmodule Mix.Tasks.Mobilizon.UsersTest do assert_received {:mix_shell, :error, [message]} assert message =~ "User has not been created because of the above reason." end + + @preferred_username "toto" + @name "Léo Pandaï" + @converted_username "leo_pandai" + + test "create a profile with the user" do + New.run([@email, "--profile-username", @preferred_username, "--profile-display-name", @name]) + + assert {:ok, + %User{ + email: email, + role: role, + confirmed_at: confirmed_at, + id: user_id, + default_actor_id: user_default_actor_id + }} = Users.get_user_by_email(@email) + + assert %Actor{ + preferred_username: @preferred_username, + name: @name, + domain: nil, + user_id: ^user_id, + id: actor_id + } = Actors.get_local_actor_by_name(@preferred_username) + + assert user_default_actor_id == actor_id + assert email == @email + assert role == :user + refute is_nil(confirmed_at) + end + + test "create a profile from displayed name only" do + New.run([@email, "--profile-display-name", @name]) + + assert {:ok, + %User{ + email: email, + role: role, + confirmed_at: confirmed_at, + id: user_id, + default_actor_id: user_default_actor_id + }} = Users.get_user_by_email(@email) + + assert %Actor{ + preferred_username: @converted_username, + name: @name, + domain: nil, + user_id: ^user_id, + id: actor_id + } = Actors.get_local_actor_by_name(@converted_username) + + assert user_default_actor_id == actor_id + assert email == @email + assert role == :user + refute is_nil(confirmed_at) + end + + test "create a profile from username only" do + New.run([@email, "--profile-username", @preferred_username]) + + assert {:ok, + %User{ + email: email, + role: role, + confirmed_at: confirmed_at, + id: user_id, + default_actor_id: user_default_actor_id + }} = Users.get_user_by_email(@email) + + assert %Actor{ + preferred_username: @preferred_username, + name: @preferred_username, + domain: nil, + user_id: ^user_id, + id: actor_id + } = Actors.get_local_actor_by_name(@preferred_username) + + assert user_default_actor_id == actor_id + assert email == @email + assert role == :user + refute is_nil(confirmed_at) + end end describe "delete user" do From d109d91225fd74fadf6618488887a890553cb55d Mon Sep 17 00:00:00 2001 From: -- Date: Tue, 20 Jul 2021 13:54:08 +0000 Subject: [PATCH 008/169] Translated using Weblate (Finnish) Currently translated at 100.0% (1065 of 1065 strings) Translation: Mobilizon/Frontend Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/fi/ --- js/src/i18n/fi.json | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/js/src/i18n/fi.json b/js/src/i18n/fi.json index 782e94b84..5ec30e5bc 100644 --- a/js/src/i18n/fi.json +++ b/js/src/i18n/fi.json @@ -16,12 +16,19 @@ "@{username}'s follow request was rejected": "Käyttäjän @{username} seuraamispyyntö hylättiin", "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.": "Evästeellä tarkoitetaan sellaista tietoa, jonka palvelun tarjoajan palvelin lähettää käyttäjän selainohjelmalle pyytäen selainta tallentamaan tiedon käyttäjän päätelaitteelle ja jota kyseinen palvelun tarjoajan palvelin voi myöhemmin pyytää takaisin. Kyse on käytännössä pienestä tietomäärästä, tyypillisesti lyhyestä tekstistä. Voit asettaa selaimen kieltäytymään kaikista evästeistä, mutta tämä saattaa rikkoa joitakin toiminnallisuuksia.", "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.": "Evästeet ovat pieniä tiedostoja, joita verkkosivut lähettävät käyttäjän tietokoneelle käyttäjän vieraillessa verkkosivuilla. Kun käyttäjä vierailee sivulla uudelleen, sivusto tunnistaa käyttäjän selaimen evästeen avulla. Evästeisiin voidaan tallentaa käyttäjän valintoja ja muuta tietoa. Selaimen voi asettaa hylkäämään kaikki evästeet. Tällöin kuitenkin osa verkkosivun toiminnoista tai palveluista voi lakata toimimasta. Paikallisesti tallennettavat tiedot toimivat samalla tavoin, mutta niihin voidaan tallentaa suurempia tietomääriä.", + "A discussion has been created or updated": "Keskustelu on luotu tai päivitetty", "A federated software": "Federoitu ohjelmisto", + "A member has been updated": "Käyttäjä on päivitetty", + "A member requested to join one of my groups": "Käyttäjä pyysi liittyä yhteen ryhmistäni", + "A new version is available.": "Uusi versio on saatavilla.", "A place for your code of conduct, rules or guidelines. You can use HTML tags.": "Käytössäännöille, säännöille ja ohjeille varattu tila. HTML-tunnisteita voi käyttää.", "A place to explain who you are and the things that set your instance apart. You can use HTML tags.": "Tässä voi esitellä ylläpitäjätahoa ja tämän palvelimen erityispiirteitä. HTML-tunnisteita voi käyttää.", "A place to publish something to the whole world, your community or just your group members.": "Paikka, jossa voit julkaista asioita koko maailmalle, yhteisöllesi tai pelkästään ryhmäsi jäsenille.", "A place to store links to documents or resources of any type.": "Paikka, johon voit tallentaa linkkejä dokumentteihin tai muihin resursseihin.", + "A post has been published": "Viesti on julkaistu", + "A post has been updated": "Viesti on päivitetty", "A practical tool": "Kätevä työkalu", + "A resource has been created or updated": "Resurssi on luotu tai päivitetty", "A short tagline for your instance homepage. Defaults to \"Gather ⋅ Organize ⋅ Mobilize\"": "Lyhyt teksti instanssisi kotisivulle. Oletuksena \"Kokoonnu ⋅ Järjestä ⋅ Mobilizoi\"", "A user-friendly, emancipatory and ethical tool for gathering, organising, and mobilising.": "Käyttäjäystävällinen, vapauttava ja eettinen työkalu tapahtumien järjestämiseen, organisointiin ja mobilisointiin.", "A validation email was sent to {email}": "Vahvistussähköposti lähetettiin osoitteeseen {email}", @@ -40,6 +47,7 @@ "Accessible through link": "Pääsy linkin kautta", "Account": "Tili", "Actions": "Toimenpiteet", + "Activate browser push notifications": "Ota käyttöön selaimen push-ilmoitukset", "Activated": "Käytössä", "Active": "Aktiivinen", "Activity": "Toiminta", @@ -68,18 +76,22 @@ "Allow all comments": "Salli kaikki kommentit", "Allow all comments from users with accounts": "Salli kommentit kirjautuneilta käyttäjiltä", "Allow registrations": "Salli rekisteröityminen", + "An error has occured while refreshing the page.": "Virhe tapahtui kun sivua päivitettiin.", "An error has occured. Sorry about that. You may try to reload the page.": "Tapahtui virhe. Yritä ladata sivu uudelleen.", "An error has occurred.": "Tapahtui virhe.", "An ethical alternative": "Eettinen vaihtoehto", "An event I'm going to has been updated": "Tapahtuma, jonne olen menossa, on päivitetty", + "An event from one of my groups has been published": "Tapahtuma ryhmästäni on julkaistu", + "An event from one of my groups has been updated or deleted": "Tapahtuma ryhmistäni on päivitetty tai poistettu", "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.": "Palvelin tarkoittaa palvelintietokoneelle asennettua Mobilizon-ohjelmaa. Palvelinta voi käyttää kuka tahansa, jolla on käytössään {mobilizon_software} tai jokin muu federoituva sovellus, eli se on osa niin kutsuttua fediversumia. Tämän palvelimen nimi on {instance_name}. Mobilizon on useiden palvelinten muodostama federoituva verkosto (sähköpostipalvelinten tavaan), eli eri palvelimille rekisteröityneet käyttäjät voivat olla yhteydessä toisiinsa vaikka eivät olisi rekisteröityneet samalle palvelimelle.", "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 eli ohjelmointirajapinta on tietoliikenneprotokolla, jonka avulla ohjelmistokomponentit voivat olla yhteydessä keskenään. Mobilizon-API voi esimerkiksi tarjota kolmansien osapuolten ohjelmistotyökaluille yhteyden Mobilizon-palvelimiin erilaisten toimintojen, kuten tapahtumien julkaisemisen, suorittamiseksi automaattisesti ja etänä.", "And {number} comments": "{number} kommenttia", + "Announcements and mentions notifications are always sent straight away.": "Ilmoitukset julkistuksista ja maininnoista lähetetään aina heti.", "Anonymous participant": "Nimetön osallistuja", "Anonymous participants will be asked to confirm their participation through e-mail.": "Anonyymejä osallistujia pyydetään vahvistamaan osallistumisensa sähköpostitse.", "Anonymous participations": "Anonyymit osallistujat", "Any day": "Milloin vain", - "Anyone can join freely": "Kuka tahansa voi liittyä", + "Anyone can join freely": "Kaikki voivat liittyä", "Anyone wanting to be a member from your group will be able to from your group page.": "Kaikki ryhmäsi jäsenet voivat liittyä ryhmäsi sivuilta.", "Application": "Sovellus", "Approve": "Hyväksy", @@ -95,6 +107,7 @@ "Are you sure you want to delete this entire discussion?": "Oletko varma, että haluat poistaa koko tämän keskustelun?", "Are you sure you want to delete this event? This action cannot be reverted.": "Haluatko varmasti poistaa tämän tapahtuman? Toimintoa ei voi perua.", "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.": "Tapahtuman järjestäjä vahvistaa osallistumispyynnöt käsin, joten osallistumisesi on vahvistettu vasta sitten, kun saat vahvistuksesta kertovan sähköpostin.", + "Ask your instance admin to {enable_feature}.": "Kysy instanssisi ylläpitäjältä {enable_feature}.", "Assigned to": "Yhdistetty", "Atom feed for events and posts": "Tapahtumien ja julkaisujen Atom-syöte", "Avatar": "Avatar", @@ -153,6 +166,7 @@ "Contact": "Yhteystieto", "Continue editing": "Jatka muokkausta", "Cookies and Local storage": "Evästeet ja paikallisesti tallennettavat tiedot", + "Copy URL to clipboard": "Kopioi URL leikepöydälle", "Copy details to clipboard": "Kopioi yksityiskohdat leikepöydälle", "Country": "Maa", "Create": "Luo", @@ -273,12 +287,15 @@ "Error while login with {provider}. This login provider doesn't exist.": "Virhe kirjauduttaessa {provider}-tilillä. Tätä sisäänkirjautumispalvelua ei ole olemassa.", "Error while reporting group {groupTitle}": "Tapahtui virhe raportoidessa ryhmää {groupTitle}", "Error while saving report.": "Virhe raportin tallennuksessa.", + "Error while subscribing to push notifications": "Virhe kun tilattiin push-ilmoitukset", "Error while suspending group": "Virhe tapahtui kun ryhmää hyllytettiin", + "Error while updating participation status inside this browser": "Virhe kun päivitettiin osallistumisen tilaa tämän selaimen sisällä", "Error while validating account": "Virhe tilin vahvistamisessa", "Error while validating participation": "Virhe osallistumisen vahvistamisessa", "Error while validating participation request": "Virhe osallistumispyyntöä vahvistettaessa", "Ethical alternative to Facebook events, groups and pages, Mobilizon is a tool designed to serve you. Period.": "Eettinen vaihtoehto Facebookin tapahtumille, ryhmille ja sivuille. Mobilizon on työkalu, joka on suunniteltu palvelemaan sinua. Piste.", "Event": "Tapahtuma", + "Event URL": "Tapahtuman URL", "Event already passed": "Tapahtuma on jo mennyt", "Event cancelled": "Tapahtuma peruttu", "Event creation": "Tapahtuman luonti", @@ -335,6 +352,7 @@ "Group Followers": "Ryhmän seuraajat", "Group List": "Ryhmäluettelo", "Group Members": "Ryhmän jäsenet", + "Group URL": "Ryhmän URL", "Group address": "Ryhmän osoite", "Group display name": "Ryhmän näyttönimi", "Group full name": "Ryhmän koko nimi", @@ -377,6 +395,7 @@ "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:": "Jos sinulta kysytään federoitua käyttäjätunnustasi, se koostuu käyttäjätunnuksestasi ja palvelimestasi. Esimerkiksi ensimmäisellä profiilillasi se on:", "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.": "Jos olet valinnut osallistujien manuaalisen vahvistuksen, Mobilizon lähettää sinulle viestin uusista osallistujista jotka voit vahvistaa. Voit alla valita näiden viestien tiheyden.", "If you want, you may send a message to the event organizer here.": "Tästä voit halutessasi lähettää tapahtuman järjestäjälle viestin.", + "Ignore": "Sivuuta", "Impossible to login, your email or password seems incorrect.": "Sisäänkirjautuminen ei onnistu, sähköposti tai salasana on väärin.", "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.": "Seuraavassa sovellus tarkoittaa Mobilizon-tiimin tai kolmannen osapuolen toimittamaa ohjelmaa, jonka kautta palvelinta käytetään.", "In the meantime, please consider that the software is not (yet) finished. More information {onBlog}.": "Huomaathan, että tämä ohjelma ei ole (vielä) kokonaan valmis. Lue lisää: {onBlog}.", @@ -411,6 +430,7 @@ "Italic": "Kursivoitu", "Join {instance}, a Mobilizon instance": "Liity Mobilizon-palvelimelle {instance}", "Join group": "Liity ryhmään", + "Join group {group}": "Liity ryhmään {group}", "Join {instance}, a Mobilizon instance": "Liity Mobilizon-palvelimelle {instance}", "Keep the entire conversation about a specific topic together on a single page.": "Pidä kaikki aiheeseen liittyvä keskustelu samassa paikassa.", "Key words": "Avainsanat", @@ -479,6 +499,7 @@ "Moderator": "Moderaattori", "Move": "Siirrä", "Move \"{resourceName}\"": "Siirrä ”{resourceName}”", + "Move resource to the root folder": "Siirrä resurssi juurikansioon", "Move resource to {folder}": "Siirrä resurssi kansioon {folder}", "My account": "Oma tili", "My events": "Omat tapahtumat", @@ -566,6 +587,7 @@ "On {date} ending at {endTime}": "{date}, päättyy {endTime}", "On {date} from {startTime} to {endTime}": "{date} klo {startTime}–{endTime}", "On {date} starting at {startTime}": "{date} klo {startTime}", + "On {instance} and other federated instances": "Instanssilla {instance} ja muilla federoiduilla instansseilla", "One person is going": "Kukaan ei ole menossa | Yksi henkilö menossa | {approved} henkilöä menossa", "Ongoing tasks": "Meneillään olevat tehtävät", "Only accessible through link": "Pääsy vain linkistä", @@ -584,6 +606,7 @@ "Organize and take action, freely": "Organisoidu ja toimi vapaasti", "Organized": "Järjestetty", "Organized by": "Järjestäjä", + "Organized by you": "Järjestämäsi", "Organized by {name}": "Järjestää {name}", "Organizer": "Järjestäjä", "Organizer notifications": "Järjestäjän ilmoitukset", @@ -655,6 +678,7 @@ "Public feeds": "Julkiset syötteet", "Public iCal Feed": "Julkinen iCal-syöte", "Public page": "Julkinen sivu", + "Public preview": "Julkinen esikatselu", "Publication date": "Julkaisupäivä", "Publish": "Julkaise", "Published events": "Julkaistut tapahtumat", @@ -664,6 +688,7 @@ "Radius": "Säde", "Read Framasoft’s statement of intent on the Framablog": "Lue Framasoftin päämääräjulkilausuma Framablogista", "Recap every week": "Muistutus joka viikko", + "Receive one email for each activity": "Vastaanota yksi sähköposti jokaista toimintoa kohden", "Receive one email per request": "Vastaanota sähköposti jokaisesta pyynnöstä", "Redirecting to content…": "Ohjataan sisältöön…", "Redirecting to event…": "Siirrytään tapahtumaan…", @@ -731,12 +756,15 @@ "Send email": "Lähetä sähköposti", "Send me an email to reset my password": "Lähetä salasananpalautusviesti", "Send me the confirmation email once again": "Lähetä vahvistussähköposti uudelleen", + "Send notification e-mails": "Lähetä ilmoitusten sähköpostit", "Send the confirmation email again": "Lähetä vahvistussähköposti uudelleen", "Send the report": "Lähetä raportti", "Set an URL to a page with your own privacy policy.": "Aseta osoitteeksi oman tietosuojakäytäntösivun osoite.", "Set an URL to a page with your own terms.": "Aseta palvelimen käyttöehdot sisältävän sivun URL.", "Settings": "Asetukset", + "Share": "Jaa", "Share this event": "Jaa tapahtuma", + "Share this group": "Jaa tämä ryhmä", "Short bio": "Lyhyt kuvaus", "Show map": "Näytä kartta", "Show remaining number of places": "Näytä vapaana olevien paikkojen määrä", @@ -825,11 +853,13 @@ "This event has been cancelled.": "Tapahtuma on peruttu.", "This event is accessible only through it's link. Be careful where you post this link.": "Tapahtumasivulle on pääsy vain linkin kautta. Ole tarkkana, missä julkaiset linkin.", "This group doesn't have a description yet.": "Ryhmällä ei ole vielä kuvausta.", + "This group is accessible only through it's link. Be careful where you post this link.": "Tähän ryhmään pääsee vain linkin kautta. Ole varovainen minne jaat tämän linkin.", "This group is invite-only": "Tämä ryhmä on vain kutsun saaneille", "This identifier is unique to your profile. It allows others to find you.": "Tämä on yksilöllinen tunniste profiiliisi. Sen avulla muut voivat löytää sinut.", "This identity is not a member of any group.": "Tämä identiteetti ei ole jäsenenä missään ryhmässä.", "This information is saved only on your computer. Click for details": "Nämä tiedot tallennetaan vain omalle tietokoneellesi. Katso lisätietoja napsauttamalla", "This installation (called “instance“) can easily {interconnect}, thanks to {protocol}.": "{protocol}-protokollan ansiosta tämä palvelin on vaivattomasti yhteydessä muihin ({interconnect}).", + "This instance hasn't got push notifications enabled.": "Tämä instanssi ei ole ottanut käyttöön push-ilmoituksia.", "This instance isn't opened to registrations, but you can register on other instances.": "Tälle palvelimelle ei voi rekisteröityä, mutta voit rekisteröityä muille palvelimille.", "This instance, {instanceName} ({domain}), hosts your profile, so remember its name.": "Tämä palvelin, {instanceName} ({domain}), sisältää profiilisi joten älä unohda sen nimeä.", "This is a demonstration site to test Mobilizon.": "Tämä on koekäyttöön tarkoitettu Mobilizonin esittelysivu.", @@ -878,10 +908,12 @@ "Unknown value for the openness setting.": "Tuntematon arvo avoimuuden asetukselle.", "Unsaved changes": "Tallentamattomia muutoksia", "Unset group": "Ryhmää ei asetettu", + "Unsubscribe to browser push notifications": "Peruuta selaimen push-ilmoitukset", "Unsuspend": "Poista esto", "Upcoming": "Tulossa", "Upcoming events": "Tulevat tapahtumat", "Update": "Päivitä", + "Update app": "Päivitä sovellus", "Update event {name}": "Päivitä tapahtumaa {name}", "Update group": "Päivitä ryhmä", "Update my event": "Päivitä omaa tapahtumaa", @@ -890,6 +922,7 @@ "Uploaded media size": "Lähetetyn median koko", "Use my location": "Käytä sijaintiani", "User": "Käyttäjä", + "User settings": "Käyttäjän asetukset", "Username": "Käyttäjänimi", "Users": "Käyttäjät", "View a reply": "|Näytä vastaus|Näytä {totalReplies} vastausta", @@ -912,6 +945,7 @@ "Waiting list": "Odotuslista", "Warning": "Varoitus", "We asked professional designers to help us develop our vision for Mobilizon. We took time to study the {digital_habits} in order to understand the features they need to gather, organize, and mobilize.": "Pyysimme ammattisuunnittelijoita auttamaan Mobilizon-visiomme kehittämisessä. Perehdyimme {digital_habits}, jotta ymmärtäisimme, mitä ominaisuuksia he tarvitsevat kokoontumisessaan, organisoitumisessaan ja mobilisoitumisessaan.", + "We couldn't save your participation inside this browser. Not to worry, you have successfully confirmed your participation, we just couldn't save it's status in this browser because of a technical issue.": "Emme voineet tallentaa osallistumistasi tämän selaimen sisällä. Älä hätäile, olet onnistuneesti varmistanut osallistumisesi, emme vain voineet tallentaa sen tilaa tässä selaimessa teknisen ongelman vuoksi.", "We improve this software thanks to your feedback. To let us know about this issue, two possibilities (both unfortunately require user account creation):": "Parannamme tätä ohjelmistoa palautteesi takia. Jotta saamme tietää tästä ongelmasta, kaksi mahdollisuutta (molemmat vaativat ikävä kyllä käyttäjätunnuksen luomista):", "We just sent an email to {email}": "Lähetimme juuri sähköpostia osoitteeseen {email}", "We use your timezone to make sure you get notifications for an event at the correct time.": "Aikavyöhyketiedon avulla saat tapahtumailmoitukset oikeaan aikaan.", @@ -923,6 +957,7 @@ "We'll use your timezone settings to send a recap of the morning of the event.": "Tapahtumapäivän aamuna lähetetään muistutus, ja siihen hyödynnetään aikavyöhykeasetusta.", "Website": "Verkkosivu", "Website / URL": "Verkkosivu/URL", + "Weekly email summary": "Viikottainen koostesähköposti", "Welcome back {username}!": "Tervetuloa takaisin, {username}!", "Welcome back!": "Tervetuloa takaisin!", "Welcome on your administration panel": "Tervetuloa hallintapaneeliin", @@ -957,6 +992,8 @@ "You can't change your password because you are registered through {provider}.": "Et voi vaihtaa salasanaa, koska olet rekisteröitynyt palvelussa {provider}.", "You can't remove your last identity.": "Et voi poistaa viimeistä identiteettiäsi.", "You can't reset your password because you use a 3rd-party auth provider to login.": "Et voi palauttaa salasanaa, koska käytät kirjautumiseen ulkopuolista tunnistautumispalvelua.", + "You can't use push notifications in this browser.": "Et voi käyttää push-ilmoituksia tässä selaimessa.", + "You changed your email or password": "Muutit sähköpostisi tai salasanasi", "You created the discussion {discussion}.": "Loit keskustelun {discussion}.", "You created the event {event}.": "Loit tapahtuman {event}.", "You created the folder {resource}.": "Loit kansion {resource}.", @@ -1070,6 +1107,7 @@ "default Mobilizon terms": "Mobilizonin oletuskäyttöehdot", "digital habits of activists": "aktivistien digitaalisiin käytäntöihin", "e.g. 10 Rue Jangot": "esim. Hämeenkatu 10", + "enable the feature": "salli ominaisuus", "explore the events": "tutustua tapahtumiin", "explore the groups": "tutustua ryhmiin", "firstDayOfWeek": "0", @@ -1091,6 +1129,7 @@ "{approved} / {total} seats": "{approved} / {total} paikkaa", "{available}/{capacity} available places": "Ei paikkoja jäljellä|{available}/{capacity} paikkaa jäljellä", "{count} km": "{count} km", + "{count} members": "Ei jäseniä|Yksi jäsen|{count} jäsentä", "{count} participants": "Ei osallistujia vielä | Yksi osallistuja | {count} osallistujaa", "{count} requests waiting": "{count} pyyntöä odottamassa", "{count} team members": "tiimissä {count} jäsentä", From edc11561daa69e2b07af3fafd7bc004f8fbebefd Mon Sep 17 00:00:00 2001 From: Jimi Viita-aho Date: Tue, 20 Jul 2021 13:06:23 +0000 Subject: [PATCH 009/169] Translated using Weblate (Finnish) Currently translated at 100.0% (1065 of 1065 strings) Translation: Mobilizon/Frontend Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/fi/ --- js/src/i18n/fi.json | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/js/src/i18n/fi.json b/js/src/i18n/fi.json index 5ec30e5bc..5f56a5c50 100644 --- a/js/src/i18n/fi.json +++ b/js/src/i18n/fi.json @@ -81,6 +81,10 @@ "An error has occurred.": "Tapahtui virhe.", "An ethical alternative": "Eettinen vaihtoehto", "An event I'm going to has been updated": "Tapahtuma, jonne olen menossa, on päivitetty", + "An event I'm going to has posted an announcement": "Tapahtuma, jonne olen menossa, teki julkaisun", + "An event I'm organizing has a new comment": "Organisoimassani tapahtumassa on uusi kommentti", + "An event I'm organizing has a new participation": "Organisoimassani tapahtumassa on uusi osallistuja", + "An event I'm organizing has a new pending participation": "Tapahtuma, jossa olen organisoija, on tullut uusi osallistumispyyntö", "An event from one of my groups has been published": "Tapahtuma ryhmästäni on julkaistu", "An event from one of my groups has been updated or deleted": "Tapahtuma ryhmistäni on päivitetty tai poistettu", "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.": "Palvelin tarkoittaa palvelintietokoneelle asennettua Mobilizon-ohjelmaa. Palvelinta voi käyttää kuka tahansa, jolla on käytössään {mobilizon_software} tai jokin muu federoituva sovellus, eli se on osa niin kutsuttua fediversumia. Tämän palvelimen nimi on {instance_name}. Mobilizon on useiden palvelinten muodostama federoituva verkosto (sähköpostipalvelinten tavaan), eli eri palvelimille rekisteröityneet käyttäjät voivat olla yhteydessä toisiinsa vaikka eivät olisi rekisteröityneet samalle palvelimelle.", @@ -288,7 +292,7 @@ "Error while reporting group {groupTitle}": "Tapahtui virhe raportoidessa ryhmää {groupTitle}", "Error while saving report.": "Virhe raportin tallennuksessa.", "Error while subscribing to push notifications": "Virhe kun tilattiin push-ilmoitukset", - "Error while suspending group": "Virhe tapahtui kun ryhmää hyllytettiin", + "Error while suspending group": "Ryhmän jäädytyksessä tapahtui virhe", "Error while updating participation status inside this browser": "Virhe kun päivitettiin osallistumisen tilaa tämän selaimen sisällä", "Error while validating account": "Virhe tilin vahvistamisessa", "Error while validating participation": "Virhe osallistumisen vahvistamisessa", @@ -353,6 +357,7 @@ "Group List": "Ryhmäluettelo", "Group Members": "Ryhmän jäsenet", "Group URL": "Ryhmän URL", + "Group activity": "Ryhmän muutokset", "Group address": "Ryhmän osoite", "Group display name": "Ryhmän näyttönimi", "Group full name": "Ryhmän koko nimi", @@ -539,8 +544,8 @@ "No instance to remove|Remove instance|Remove {number} instances": "Ei poistettavia palvelimia|Poista palvelin|Poista {number} palvelinta", "No languages found": "Kieliä ei löytynyt", "No member matches the filters": "Ei suodattimia vastaavia jäseniä", - "No members found": "Käyttäjiä ei löydetty", - "No memberships found": "Ei jäsenyyksiä löydettynä", + "No members found": "Käyttäjiä ei löydy", + "No memberships found": "Jäsenyyksiä ei löytynyt", "No message": "Ei viestiä", "No moderation logs yet": "Moderointilokia ei vielä ole", "No more activity to display.": "Toimintaa ei ole enää näytettävänä.", @@ -548,7 +553,7 @@ "No one is participating|One person participating|{going} people participating": "Ei osallistujia|Yksi osallistuja|{going} osallistujaa", "No ongoing todos": "Ei keskeneräisiä tehtäviä", "No open reports yet": "Avoimia raportteja ei vielä ole", - "No organized events found": "Järjestettyjä tapahtumia ei löydetty", + "No organized events found": "Järjestettyjä tapahtumia ei löydy", "No organized events listed": "Ei järjestettyjä tapahtumia listattuna", "No participant matches the filters": "Ei suodattimia vastaavia osallistujia", "No participant to approve|Approve participant|Approve {number} participants": "Ei osallistujia hyväksyttäväksi|Hyväksy osallistuja|Hyväksy {number} osallistujaa", @@ -888,7 +893,7 @@ "Today": "Tänään", "Tomorrow": "Huomenna", "Transfer to {outsideDomain}": "Siirry osoitteeseen {outsideDomain}", - "Triggered profile refreshment": "Käynnistettiin profiilin päivitys", + "Triggered profile refreshment": "Profiilin päivitys aloitettu", "Type": "Tyyppi", "Type or select a date…": "Syötä tai valitse päivämäärä…", "URL": "URL", @@ -1133,9 +1138,9 @@ "{count} participants": "Ei osallistujia vielä | Yksi osallistuja | {count} osallistujaa", "{count} requests waiting": "{count} pyyntöä odottamassa", "{count} team members": "tiimissä {count} jäsentä", - "{folder} - Resources": "{folder} - Resurssia", + "{folder} - Resources": "{folder} - Resurssit", "{group} activity timeline": "{group} toiminnan aikajana", - "{group} events": "{group} tapahtumaa", + "{group} events": "{group} tapahtumat", "{group}'s events": "Ryhmän {group} tapahtumat", "{instanceName} is an instance of the {mobilizon} software.": "{instanceName} on {mobilizon}-ohjelmaa käyttävä palvelin.", "{instanceName} is an instance of {mobilizon_link}, a free software built with the community.": "{instanceName} on {mobilizon_link} -instanssi, yhteisön luoma vapaa ohjelmisto.", @@ -1159,7 +1164,7 @@ "{moderator} suspended profile {profile}": "{moderator} esti profiilin {profile}", "{nb} km": "{nb} km", "{number} members": "{number} jäsentä", - "{number} memberships": "{number} käyttäjiä", + "{number} memberships": "{number} jäsenyyttä", "{number} organized events": "Ei järjestettyjä tapahtumia|Yksi järjestetty tapahtuma|{number} järjestettyä tapahtumaa", "{number} participations": "Ei osallistumisia|Yksi osallistuminen|{number} osallistumista", "{number} posts": "Ei julkaisuja|Yksi julkaisu|{number} julkaisua", From bb0f2e9310d4cee9c40caaf57dbb9c467785e14d Mon Sep 17 00:00:00 2001 From: GunChleoc Date: Tue, 20 Jul 2021 15:56:31 +0000 Subject: [PATCH 010/169] Translated using Weblate (Gaelic) Currently translated at 93.6% (997 of 1065 strings) Translation: Mobilizon/Frontend Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/gd/ --- js/src/i18n/gd.json | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/js/src/i18n/gd.json b/js/src/i18n/gd.json index c5e9faf81..30ba52d71 100644 --- a/js/src/i18n/gd.json +++ b/js/src/i18n/gd.json @@ -15,6 +15,7 @@ "@{username}'s follow request was rejected": "Chaidh an t-iarrtas leantainn aig @{username} a dhiùltadh", "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.": "’S e faidhle beag a th’ ann am briosgaid sa bheil fiosrachadh ’s a thèid a chur dhan choimpiutair agad nuair a thadhlas tu air làrach-lìn. Nuair a thadhlas tu air an làrach-lìn a-rithist, aithnichidh an làrach ud am brabhsair agad leis a’ bhriosgaid. Gabhaidh roghainnean cleachdaiche is fiosrachadh eile a stòradh ann am briosgaid. ’S urrainn dhut am brabhsair agad a rèiteachadh ach an diùlt e gach briosgaid. Gidheadh, dh’fhaoidte nach obraich a h-uile gleus no seirbheis aig làrach-lìn mar bu chòir an uairsin. Obraichidh an stòras ionadail air an aon dòigh ach faodar barrachd dàta a chumail ann.", "A federated software": "Bathar-bog co-naisgte", + "A new version is available.": "Tha tionndadh ùr ri fhaighinn.", "A place for your code of conduct, rules or guidelines. You can use HTML tags.": "Seo àite airson còd-giùlain, riaghailtean no comharra-treòrachaidh. ’S urrainn dhut tagaichean HTML a chleachdadh.", "A place to explain who you are and the things that set your instance apart. You can use HTML tags.": "Seo àite airson cò thusa agus dè a tha sònraichte mun ionstans agad a mhìneachadh. ’S urrainn dhut tagaichean HTML a chleachdadh.", "A place to publish something to the whole world, your community or just your group members.": "Seo àite airson rudan fhoillseachadh dhan t-saoghal gu lèir, dhan choimhearsnachd agad no do bhuill do bhuidhinn a-mhàin.", @@ -37,6 +38,7 @@ "Accessible through link": "Gabhaidh inntrigeadh le ceangal", "Account": "Cunntas", "Actions": "Gnìomhan", + "Activate browser push notifications": "Gnìomhaich brathan putaidh a’ bhrabhsair", "Activated": "An gnìomh", "Active": "Gnìomhach", "Activity": "Gnìomhachd", @@ -62,11 +64,14 @@ "All the places have already been taken": "Chan eil àite saor air fhàgail", "Allow all comments from users with accounts": "Ceadaich a h-uile beachd o chleachdaichean air an clàradh a-steach", "Allow registrations": "Ceadaich clàradh", + "An error has occured while refreshing the page.": "Thachair mearachd fhad ’s a bha sinn ag ath-nuadhachadh na duilleige.", "An error has occured. Sorry about that. You may try to reload the page.": "Thachair mearachd. Tha sinn duilich mu dhèidhinn. Feuch is ath-luchdaich an duilleag.", "An ethical alternative": "Roghainn bheusail", + "An event I'm going to has posted an announcement": "Phostaidh tachartas dhan dèid mi brath-fios", "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.": "’S e tionndadh dhen bhathar-bhog Mobilizon a chaidh a stàladh ’s a tha a’ ruith air frithealaiche a th’ ann an ionstans. ’S urrainn do dhuine sam bith ionstans a ruith le {mobilizon_software} no le aplacaidean co-naisgte eile, sin an “co-shaoghal”. Is {instance_name} ainm an ionstans seo. ’S e lìonra de dh’iomadh ionstans co-naisgte (coltach ri frithealaichean puist-d) a th’ ann am Mobilizon. ’S urrainn do chleachdaichean a chlàraich le ionstansan eadar-dhealaichte conaltradh ri chèile ged nach do chlàraich iad air an on ionstans.", "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.": "’S e pròtacal conaltraidh a th’ ann an “application programming interface” no “API” a leigeas le co-phàirtean bathair-bhog conaltradh ri chèile. Mar eisimpleir, ’s urrainn dhan API aig Mobilizon leigeil le innealan bathair-bhog threas-phàrtaidhean gun dèan iad conaltradh le ionstansan de Mhobilizon airson gnìomhan sònraichte a ghabhail, can postadh thachartasan às do leth gu fèin-obrachail is gu cèin.", "And {number} comments": "Agus {number} beachd", + "Announcements and mentions notifications are always sent straight away.": "Thèid brathan mu bhrathan-fios is iomraidhean a chur sa bhad an-còmhnaidh.", "Anonymous participant": "Freastalaiche gun ainm", "Anonymous participants will be asked to confirm their participation through e-mail.": "Thèid iarraidh air freastalaichean gun ainm gun dearbh iad an com-pàirteachadh air a’ phost-d.", "Anonymous participations": "Com-pàirteachaidhean gun ainm", @@ -125,6 +130,7 @@ "Closed": "Dùinte", "Comment deleted": "Chaidh am beachd a sguabadh às", "Comment from @{username} reported": "Chaidh gearan a dhèanamh mu bheachd le @{username}", + "Comment text can't be empty": "Chan fhaod teacsa a’ bheachd a bhith bàn", "Comments": "Beachdan", "Comments are closed for everybody else.": "Tha na beachdan dùinte dhan a h-uile duine eile.", "Confirm my participation": "Dearbh an com-pàirteachadh agam", @@ -154,6 +160,7 @@ "Create my event": "Cruthaich an tachartas agam", "Create my group": "Cruthaich am buidheann agam", "Create my profile": "Cruthaich a’ phròifil agam", + "Create new links": "Cruthaich ceanglaichean ùra", "Create resource": "Cruthaich goireas", "Create the discussion": "Cruthaich an deasbad", "Create to-do lists for all the tasks you need to do, assign them and set due dates.": "Cruthaich liostaichean de rudan ri dhèanamh dha na saothraichean uile a tha romhaibh, iomruin iad is suidhich cinn-latha orra.", @@ -237,6 +244,8 @@ "Error while login with {provider}. Retry or login another way.": "Mearachd a’ clàradh a-steach le {provider}. Feuch ris a-rithist no clàradh a-steach air dòigh eile.", "Error while login with {provider}. This login provider doesn't exist.": "Mearachd a’ clàradh a-steach le {provider}. Chan eil an solaraiche clàraidh a-steach seo ann.", "Error while reporting group {groupTitle}": "Tachair mearachd leis a’ ghearan mun bhuidheann {groupTitle}", + "Error while subscribing to push notifications": "Mearachd le fo-sgrìobhadh air brathan putaidh", + "Error while updating participation status inside this browser": "Mearachd le ùrachadh staid mun ghabhail pàirt am broinn a’ bhrabhsair seo", "Error while validating account": "Mearachd le dearbhadh a’ chunntais", "Error while validating participation request": "Mearachd le dearbhadh an iarrtais air com-pàirteachadh", "Ethical alternative to Facebook events, groups and pages, Mobilizon is a tool designed to serve you. Period.": "’S e roghainn bheusail seach tachartasan, buidhnean is duilleagan Facebook a th’ ann am Mobilizon is chaidh a dhealbhadh air do shon-sa. Sin agad e.", @@ -324,6 +333,7 @@ "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:": "Ma thèid do dhearbh-aithne co-naisgte iarraidh ort, cuiridh tu an t-ainm-cleachdaiche ’s an ionstans agad ri chèile dha. Mar eisimpleir, seo an dearbh-aithne co-naisgte aig a’ chiad phròifil agad:", "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.": "Thagh thu gu bheil thu airson na com-pàirtichean a dhearbhadh a làimh. Cuiridh Mobilizon post-d thugad nuair a bhios com-pàirtichean ùra ri an dearbhadh ann. ’S urrainn dhut taghadh gu h-ìosal dè cho tric ’s a gheibh thu na brathan sin.", "If you want, you may send a message to the event organizer here.": "Faodaidh tu teachdaireachd a chur gu eagraiche an tachartais an-seo ma thogras tu.", + "Ignore": "Leig seachad", "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.": "Sa cho-theacs a leanas, ’s e bathar-bog a th’ ann an aplacaid a chleachdas tu airson conaltradh leis an ionstans agad ’s a tha ’ga sholar le sgioba Mobilizon no le treas-phàrtaidh.", "Instance": "Ionstans", "Instance Long Description": "Tuairisgeul fada an ionstans", @@ -353,6 +363,7 @@ "Italic": "Eadailteach", "Join {instance}, a Mobilizon instance": "Faigh ballrachd air {instance}, seo ionstans Mobilizon", "Join group": "Faigh ballrachd sa bhuidheann", + "Join group {group}": "Faigh ballrachd sa bhuidheann {group}", "Keep the entire conversation about a specific topic together on a single page.": "Cùm an còmhradh gu lèir mu chuspair sònraichte còmhla air an aon duilleag.", "Key words": "Faclan-luirg", "Language": "Cànan", @@ -423,6 +434,7 @@ "New members": "Buill ùra", "New note": "Nòta ùr", "New password": "Facal-faire ùr", + "New post": "Post ùr", "New profile": "Pròifil ùr", "Next": "Air adhart", "Next month": "An ath mhìos", @@ -448,6 +460,7 @@ "No message": "Chan eil teachdaireachd ann", "No moderation logs yet": "Chan eil loga maorsainneachd ann fhathast", "No more activity to display.": "Chan eil barrachd ghnìomhan ri an sealltainn ann.", + "No one is participating|One person participating|{going} people participating": "{count} chom-pàirtiche| {count} chom-pàirtiche| {count} com-pàirtichean| {count} com-pàirtiche", "No open reports yet": "Chan eil gearan gun fhuasgladh ann", "No participant matches the filters": "Chan eil com-pàirtiche sam bith a’ maidseadh nan criathragan", "No participant to approve|Approve participant|Approve {number} participants": "Aontaich ri {number} chom-pàirtiche|Aontaich ri {number} chom-pàirtiche|Aontaich ri {number} com-pàirtichean|Aontaich ri {number} com-pàirtiche", @@ -470,6 +483,7 @@ "Nothing to see here": "Chan eil dad ri fhaicinn an-seo", "Notification before the event": "Brath ron tachartas", "Notification on the day of the event": "Brath air latha an tachartais", + "Notifications": "Brathan", "Notifications for manually approved participations to an event": "Brathan mu chom-pàirteachaichean air tachartas a chaidh aontachadh riutha à làimh", "Now, create your first profile:": "Nise, cruthaich a’ chiad phròifil agad:", "Number of places": "Co mheud àite", @@ -480,6 +494,7 @@ "On {date} from {startTime} to {endTime}": "{date} o {startTime} gu {endTime}", "On {date} starting at {startTime}": "{date}, a’ tòiseachadh aig {startTime}", "On {instance}": "Air {instance}", + "On {instance} and other federated instances": "Air {instance} agus ionstansan co-naisgte eile", "Only accessible through link": "Cha ghabh inntrigeadh ach le ceangal", "Only accessible through link (private)": "Cha ghabh inntrigeadh ach le ceangal (prìobhaideach)", "Only accessible to members of the group": "Cha ghabh inntrigeadh ach le buill a’ bhuidhinn", @@ -518,6 +533,7 @@ "Password reset": "Ath-shuidheachadh an fhacail-fhaire", "Past events": "Tachartasan a tha seachad mu thràth", "Pending": "Ri dhèiligeadh", + "Personal feeds": "Inbhirean pearsanta", "Pick": "Tagh", "Pick a group": "Tagh buidheann", "Pick a profile or a group": "Tagh pròifil no buidheann", @@ -543,6 +559,7 @@ "Privacy policy": "Poileasaidh prìobhaideachd", "Private event": "Tachartas prìobhaideach", "Private feeds": "Inbhirean prìobhaideach", + "Profile feeds": "Inbhirean na pròifile", "Profiles": "Pròifilean", "Profiles and federation": "Pròifilean agus co-nasgadh", "Promote": "Àrdaich", @@ -553,15 +570,18 @@ "Public feeds": "Inbhirean poblach", "Public iCal Feed": "Inbhir iCal poblach", "Public page": "Duilleag phoblach", + "Public preview": "Ro-shealladh poblach", "Publication date": "Ceann-là an fhoillseachaidh", "Publish": "Foillsich", "Published events with {comments} comments and {participations} confirmed participations": "Chaidh tachartasan fhoillseachadh le {comments} beachd(an) riutha agus {participations} com-pàirteachadh/com-pàirteachaidhean air an dearbhadh", "RSS/Atom Feed": "Inbhir RSS/Atom", "Radius": "Astar", "Recap every week": "Cuimhneachan seachdaineil", + "Receive one email for each activity": "Faigh post-d fa leth air gach gnìomhachd", "Receive one email per request": "Faigh aon phost-d air gach iarrtas", "Redirecting to content…": "’Gad ath-stiùireadh dhan t-susbaint…", "Refresh profile": "Ath-nuadhaich a’ phròifil", + "Regenerate new links": "Ath-ghin ceanglaichean ùra", "Region": "Roinn-dùthcha", "Register an account on {instanceName}!": "Clàraich cunntas air {instanceName}!", "Register on this instance": "Clàraich leis an ionstans seo", @@ -614,11 +634,13 @@ "Select a timezone": "Tagh roinn-tìde", "Select languages": "Tagh na cànain", "Send email": "Cuir post-d", + "Send notification e-mails": "Cuir puist-d bhrathan", "Send the confirmation email again": "Cuir am post-d dearbhaidh a-rithist", "Send the report": "Cuir an gearan", "Set an URL to a page with your own privacy policy.": "Suidhich an t-URL air duilleag leis a’ phoileasaidh prìobhaideachd agad fhèin.", "Set an URL to a page with your own terms.": "Suidhich an t-URL air duilleag leis na teirmichean agad fhèin.", "Settings": "Roghainnean", + "Share": "Co-roinn", "Share this event": "Co-roinn an tachartas seo", "Short bio": "Sgeul-beatha goirid", "Show map": "Seall am mapa", @@ -656,6 +678,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.": "Dearbhaidh eagraiche an tachartais romhpa na com-pàirteachaidhean a làimh.On a chuir thu romhad pàirt a ghabhail ann gun chunntas, mìnich carson a bu mhiann leat pàirt a ghabhail san tachartas seo.", "The event title will be ellipsed.": "Thèid tiotal an tachartais a ghiorrachadh.", "The event will show as attributed to this group.": "Thèid an tachartas seo iomruineadh dhan bhuidheann seo.", + "The event will show as attributed to this profile.": "Thèid an tachartas seo iomruineadh dhan phròifil seo.", "The event will show as attributed to your personal profile.": "Thèid an tachartas seo iomruineadh dhan phròifil phearsanta agad.", "The event will show the group as organizer.": "Seallaidh an tachartas am buidheann mar eagraiche.", "The event {event} was created by {profile}.": "Chaidh an tachartas {event} a chruthachadh le {profile}.", @@ -735,10 +758,12 @@ "Unknown value for the openness setting.": "Chaidh luach nach aithne dhuinn a shuidheachadh air dè cho fosgailte ’s a tha am buidheann.", "Unsaved changes": "Atharraichean gun sàbhaladh", "Unset group": "Dì-shuidhich am buidheann", + "Unsubscribe to browser push notifications": "Cuir crìoch air an fho-sgrìobhadh air brathan putaidh", "Unsuspend": "Na cuir à rèim tuilleadh", "Upcoming": "Ri thighinn", "Upcoming events": "Tachartasan ri thighinn", "Update": "Ùraich", + "Update app": "Ùraich an aplacaid", "Update event {name}": "Ùraich an tachartas {name}", "Update group": "Ùraich am buidheann", "Update my event": "Ùraich an tachartas agam", @@ -772,6 +797,7 @@ "We'll use your timezone settings to send a recap of the morning of the event.": "Cleachdaidh sinn an roinn-tìde agad airson cuimhneachan a chur thugad sa mhadainn ron tachartas.", "Website": "Làrach-lìn", "Website / URL": "Làrach-lìn / URL", + "Weekly email summary": "Geàrr-chunntas puist-d seachdaineil", "Welcome back {username}!": "Fàilte air ais, {username}!", "Welcome back!": "Fàilte air ais!", "Welcome to Mobilizon, {username}!": "Fàilte gu Mobilizon, {username}!", @@ -796,6 +822,7 @@ "You can pick your timezone into your preferences.": "’S urrainn dhut an roinn-tìde a thaghadh sna roghainnean agad.", "You can try another search term or drag and drop the marker on the map": "’S urrainn dhut facal-luirg eile fheuchainn no an comharra a shlaodadh agus leigeil às air a’ mhapa", "You can't change your password because you are registered through {provider}.": "Chan urrainn dhut am facal-faire agad atharrachadh air sgàth ’s gun do clàraich thu le {provider}.", + "You can't use push notifications in this browser.": "Chan urrainn dhut brathan putaidh a chleachdadh sa bhrabhsair seo.", "You created the discussion {discussion}.": "Chruthaich thu an deasbad {discussion}.", "You created the event {event}.": "Chruthaich thu an tachartas {event}.", "You created the folder {resource}.": "Chruthaich thu am pasgan {resource}.", @@ -854,6 +881,7 @@ "You will find here all the events you have created or of which you are a participant.": "Chì thu a h-uile tachartas a chruthaich thu no sa bheil thu a’ gabhail pàirt an-seo.", "You wish to participate to the following event": "Tha thu airson pàirt a ghabhail san tachartas a leanas", "You'll get a weekly recap every Monday for upcoming events, if you have any.": "Gheibh thu cuimhneachan gach madainn DiLuain mu na tachartasan ri thighinn ma tha gin agad.", + "You'll need to change the URLs where there were previously entered.": "Feumaidh tu na h-URLaichean atharrachadh far an deach an cur a-steach roimhe.", "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.": "Feumaidh tu URL a’ bhuidhinn a thar-chur ach an urrainn do dhaoine pròifil a’ bhuidhinn inntrigeadh. Cha ghabh am buidheann a lorg le gleus nan lorg aig Mobilizon no le einnseanan-luirg àbhaisteach.", "You'll receive a confirmation email.": "Gheibh thu post-d dearbhaidh.", "Your account has been successfully deleted": "Chaidh an cunntas agad a sguabadh às", @@ -910,6 +938,7 @@ "{approved} / {total} seats": "{approved} / {total} àite(achan)", "{available}/{capacity} available places": "{available}/{capacity} àite air fhàgail|{available}/{capacity} àite air fhàgail|{available}/{capacity} àiteachan air fhàgail|{available}/{capacity} àite air fhàgail", "{count} km": "{count} km", + "{count} members": "{count} bhall|{count} bhall|{count} buill|{count} ball", "{count} participants": "{count} chom-pàirtiche| {count} chom-pàirtiche| {count} com-pàirtichean| {count} com-pàirtiche", "{count} requests waiting": "Tha {count} iarrtas(an) a’ feitheamh", "{count} team members": "Buill an sgioba ({count})", From 10c918fd6ebaf7879667cd5bd332a416d97ab8fe Mon Sep 17 00:00:00 2001 From: -- Date: Tue, 20 Jul 2021 12:56:55 +0000 Subject: [PATCH 011/169] Translated using Weblate (Finnish) Currently translated at 100.0% (52 of 52 strings) Translation: Mobilizon/Activity Translate-URL: https://weblate.framasoft.org/projects/mobilizon/activity/fi/ --- priv/gettext/fi/LC_MESSAGES/activity.po | 140 ++++++++++++------------ 1 file changed, 70 insertions(+), 70 deletions(-) diff --git a/priv/gettext/fi/LC_MESSAGES/activity.po b/priv/gettext/fi/LC_MESSAGES/activity.po index b3f71c8b7..342572897 100644 --- a/priv/gettext/fi/LC_MESSAGES/activity.po +++ b/priv/gettext/fi/LC_MESSAGES/activity.po @@ -8,322 +8,322 @@ ## to merge POT files into PO files. msgid "" msgstr "" -"PO-Revision-Date: 2021-06-12 00:15+0000\n" -"Last-Translator: Taru Luojola \n" +"PO-Revision-Date: 2021-07-20 16:37+0000\n" +"Last-Translator: -- \n" "Language-Team: Finnish \n" "Language: fi\n" "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.6.2\n" -"Content-Transfer-Encoding: 8bit\n" -#, elixir-format #: lib/service/activity/renderer/member.ex:38 #: lib/web/templates/email/activity/_member_activity_item.html.eex:19 lib/web/templates/email/activity/_member_activity_item.text.eex:12 +#, elixir-format msgid "%{member} accepted the invitation to join the group." msgstr "%{member} hyväksyi kutsun liittyä ryhmään." -#, elixir-format #: lib/service/activity/renderer/member.ex:42 #: lib/web/templates/email/activity/_member_activity_item.html.eex:26 lib/web/templates/email/activity/_member_activity_item.text.eex:17 +#, elixir-format msgid "%{member} rejected the invitation to join the group." msgstr "%{member} hylkäsi kutsun liittyä ryhmään." -#, elixir-format #: lib/service/activity/renderer/member.ex:30 #: lib/web/templates/email/activity/_member_activity_item.html.eex:4 lib/web/templates/email/activity/_member_activity_item.text.eex:1 +#, elixir-format msgid "%{member} requested to join the group." msgstr "%{member} haluaa liittyä ryhmään." -#, elixir-format #: lib/service/activity/renderer/member.ex:34 #: lib/web/templates/email/activity/_member_activity_item.html.eex:11 lib/web/templates/email/activity/_member_activity_item.text.eex:6 +#, elixir-format msgid "%{member} was invited by %{profile}." msgstr "%{profile} kutsui jäsenen %{member}." -#, elixir-format #: lib/service/activity/renderer/member.ex:50 #: lib/web/templates/email/activity/_member_activity_item.html.eex:40 lib/web/templates/email/activity/_member_activity_item.text.eex:27 +#, elixir-format msgid "%{profile} added the member %{member}." msgstr "%{profile} lisäsi jäsenen %{member}." -#, elixir-format #: lib/service/activity/renderer/discussion.ex:65 #: lib/web/templates/email/activity/_discussion_activity_item.html.eex:46 lib/web/templates/email/activity/_discussion_activity_item.text.eex:19 +#, elixir-format msgid "%{profile} archived the discussion %{discussion}." msgstr "%{profile} arkistoi keskustelun %{discussion}." -#, elixir-format #: lib/service/activity/renderer/discussion.ex:25 #: lib/web/templates/email/activity/_discussion_activity_item.html.eex:4 lib/web/templates/email/activity/_discussion_activity_item.text.eex:1 +#, elixir-format msgid "%{profile} created the discussion %{discussion}." msgstr "%{profile} loi keskustelun %{discussion}." -#, elixir-format #: lib/service/activity/renderer/resource.ex:24 #: lib/web/templates/email/activity/_resource_activity_item.html.eex:5 lib/web/templates/email/activity/_resource_activity_item.text.eex:2 +#, elixir-format msgid "%{profile} created the folder %{resource}." msgstr "%{profile} loi kansion %{resource}." -#, elixir-format #: lib/web/templates/email/activity/_group_activity_item.html.eex:4 #: lib/web/templates/email/activity/_group_activity_item.text.eex:1 +#, elixir-format msgid "%{profile} created the group %{group}." msgstr "%{profile} loi ryhmän %{group}." -#, elixir-format #: lib/service/activity/renderer/resource.ex:33 #: lib/web/templates/email/activity/_resource_activity_item.html.eex:20 lib/web/templates/email/activity/_resource_activity_item.text.eex:8 +#, elixir-format msgid "%{profile} created the resource %{resource}." msgstr "%{profile} loi resurssin %{resource}." -#, elixir-format #: lib/service/activity/renderer/discussion.ex:75 #: lib/web/templates/email/activity/_discussion_activity_item.html.eex:60 lib/web/templates/email/activity/_discussion_activity_item.text.eex:25 +#, elixir-format msgid "%{profile} deleted the discussion %{discussion}." msgstr "%{profile} poisti keskustelun %{discussion}." -#, elixir-format #: lib/service/activity/renderer/resource.ex:97 #: lib/web/templates/email/activity/_resource_activity_item.html.eex:103 lib/web/templates/email/activity/_resource_activity_item.text.eex:40 +#, elixir-format msgid "%{profile} deleted the folder %{resource}." msgstr "%{profile} poisti kansion %{resource}." -#, elixir-format #: lib/service/activity/renderer/resource.ex:106 #: lib/web/templates/email/activity/_resource_activity_item.html.eex:111 lib/web/templates/email/activity/_resource_activity_item.text.eex:45 +#, elixir-format msgid "%{profile} deleted the resource %{resource}." msgstr "%{profile} poisti resurssin %{resource}." -#, elixir-format #: lib/service/activity/renderer/member.ex:58 #: lib/web/templates/email/activity/_member_activity_item.html.eex:56 lib/web/templates/email/activity/_member_activity_item.text.eex:39 +#, elixir-format msgid "%{profile} excluded member %{member}." msgstr "%{profile} hylkäsi jäsenen %{member}." -#, elixir-format #: lib/service/activity/renderer/resource.ex:76 #: lib/web/templates/email/activity/_resource_activity_item.html.eex:71 lib/web/templates/email/activity/_resource_activity_item.text.eex:28 +#, elixir-format msgid "%{profile} moved the folder %{resource}." msgstr "%{profile} siirsi kansion %{resource}." -#, elixir-format #: lib/service/activity/renderer/resource.ex:85 #: lib/web/templates/email/activity/_resource_activity_item.html.eex:86 lib/web/templates/email/activity/_resource_activity_item.text.eex:34 +#, elixir-format msgid "%{profile} moved the resource %{resource}." msgstr "%{profile} siirsi resurssin %{resource}." -#, elixir-format #: lib/service/activity/renderer/member.ex:62 #: lib/web/templates/email/activity/_member_activity_item.html.eex:64 lib/web/templates/email/activity/_member_activity_item.text.eex:45 +#, elixir-format msgid "%{profile} quit the group." msgstr "%{profile} poistui ryhmästä." -#, elixir-format #: lib/service/activity/renderer/discussion.ex:55 #: lib/web/templates/email/activity/_discussion_activity_item.html.eex:32 lib/web/templates/email/activity/_discussion_activity_item.text.eex:13 +#, elixir-format msgid "%{profile} renamed the discussion %{discussion}." msgstr "%{profile} muutti keskustelun %{discussion} nimer." -#, elixir-format #: lib/service/activity/renderer/resource.ex:45 #: lib/web/templates/email/activity/_resource_activity_item.html.eex:37 lib/web/templates/email/activity/_resource_activity_item.text.eex:14 +#, elixir-format msgid "%{profile} renamed the folder from %{old_resource_title} to %{resource}." msgstr "%{profile} muutti kansion %{old_resource_title} nimeksi %{resource}." -#, elixir-format #: lib/service/activity/renderer/resource.ex:59 #: lib/web/templates/email/activity/_resource_activity_item.html.eex:53 lib/web/templates/email/activity/_resource_activity_item.text.eex:21 +#, elixir-format msgid "%{profile} renamed the resource from %{old_resource_title} to %{resource}." msgstr "%{profile} muutti resurssin %{old_resource_title} nimeksi %{resource}." -#, elixir-format #: lib/service/activity/renderer/discussion.ex:35 #: lib/web/templates/email/activity/_discussion_activity_item.html.eex:18 lib/web/templates/email/activity/_discussion_activity_item.text.eex:7 +#, elixir-format msgid "%{profile} replied to the discussion %{discussion}." msgstr "%{profile} vastasi keskusteluun %{discussion}." -#, elixir-format #: lib/web/templates/email/activity/_group_activity_item.html.eex:19 #: lib/web/templates/email/activity/_group_activity_item.text.eex:7 +#, elixir-format msgid "%{profile} updated the group %{group}." msgstr "%{profile} päivitti ryhmää %{group}." -#, elixir-format #: lib/service/activity/renderer/member.ex:54 #: lib/web/templates/email/activity/_member_activity_item.html.eex:48 lib/web/templates/email/activity/_member_activity_item.text.eex:33 +#, elixir-format msgid "%{profile} updated the member %{member}." msgstr "%{profile} päivitti jäsentä %{member}." -#, elixir-format #: lib/service/activity/renderer/event.ex:23 #: lib/web/templates/email/activity/_event_activity_item.html.eex:4 lib/web/templates/email/activity/_event_activity_item.text.eex:1 +#, elixir-format msgid "The event %{event} was created by %{profile}." msgstr "%{profile} loi tapahtuman %{event}." -#, elixir-format #: lib/service/activity/renderer/event.ex:43 #: lib/web/templates/email/activity/_event_activity_item.html.eex:34 lib/web/templates/email/activity/_event_activity_item.text.eex:13 +#, elixir-format msgid "The event %{event} was deleted by %{profile}." msgstr "%{profile} poisti tapahtuman %{event}." -#, elixir-format #: lib/service/activity/renderer/event.ex:33 #: lib/web/templates/email/activity/_event_activity_item.html.eex:19 lib/web/templates/email/activity/_event_activity_item.text.eex:7 +#, elixir-format msgid "The event %{event} was updated by %{profile}." msgstr "%{profile} päivitti tapahtumaa %{event}." -#, elixir-format #: lib/web/templates/email/activity/_post_activity_item.html.eex:4 #: lib/web/templates/email/activity/_post_activity_item.text.eex:1 +#, elixir-format msgid "The post %{post} was created by %{profile}." msgstr "%{profile} loi julkaisun %{post}." -#, elixir-format #: lib/web/templates/email/activity/_post_activity_item.html.eex:34 #: lib/web/templates/email/activity/_post_activity_item.text.eex:13 +#, elixir-format msgid "The post %{post} was deleted by %{profile}." msgstr "%{profile} poisti julkaisun %{post}." -#, elixir-format #: lib/web/templates/email/activity/_post_activity_item.html.eex:19 #: lib/web/templates/email/activity/_post_activity_item.text.eex:7 +#, elixir-format msgid "The post %{post} was updated by %{profile}." msgstr "%{profile} päivitti julkaisun %{post}." -#, elixir-format #: lib/service/activity/renderer/member.ex:46 #: lib/web/templates/email/activity/_member_activity_item.html.eex:33 lib/web/templates/email/activity/_member_activity_item.text.eex:22 +#, elixir-format msgid "%{member} joined the group." msgstr "%{member} liittyi ryhmään." -#, elixir-format #: lib/service/activity/renderer/event.ex:63 #: lib/web/templates/email/activity/_event_activity_item.html.eex:58 lib/web/templates/email/activity/_event_activity_item.text.eex:25 +#, elixir-format msgid "%{profile} posted a comment on the event %{event}." msgstr "%{profile} kommentoi tapahtumaa %{event}." -#, elixir-format #: lib/service/activity/renderer/event.ex:54 #: lib/web/templates/email/activity/_event_activity_item.html.eex:43 lib/web/templates/email/activity/_event_activity_item.text.eex:19 +#, elixir-format msgid "%{profile} replied to a comment on the event %{event}." msgstr "%{profile} vastasi tapahtuman %{event} kommenttiin." -#, elixir-format #: lib/web/templates/email/email_direct_activity.text.eex:27 +#, elixir-format msgid "Don't want to receive activity notifications? You may change frequency or disable them in your settings." msgstr "" "Jos et halua vastaanottaa toimenpideilmoituksia, voit muuttaa " "ilmoitustiheyttä tai poistaa ilmoitukset käytöstä asetuksista." -#, elixir-format #: lib/web/templates/email/email_direct_activity.html.eex:135 #: lib/web/templates/email/email_direct_activity.text.eex:23 +#, elixir-format msgid "View one more activity" msgid_plural "View %{count} more activities" msgstr[0] "Näytä seuraava toimenpide" msgstr[1] "Näytä %{count} seuraavaa toimenpidettä" -#, elixir-format #: lib/web/templates/email/email_direct_activity.html.eex:44 #: lib/web/templates/email/email_direct_activity.html.eex:46 lib/web/templates/email/email_direct_activity.text.eex:6 #: lib/web/templates/email/email_direct_activity.text.eex:7 +#, elixir-format msgid "There has been an activity!" msgid_plural "There has been some activity!" msgstr[0] "Toimenpide!" msgstr[1] "Toimenpiteitä!" -#, elixir-format #: lib/service/activity/renderer/renderer.ex:38 +#, elixir-format msgid "Activity on %{instance}" msgstr "Toimenpide palvelimella %{instance}" -#, elixir-format #: lib/service/activity/renderer/comment.ex:38 #: lib/web/templates/email/activity/_comment_activity_item.html.eex:19 lib/web/templates/email/activity/_comment_activity_item.text.eex:7 #: lib/web/templates/email/email_anonymous_activity.html.eex:41 lib/web/templates/email/email_anonymous_activity.text.eex:5 +#, elixir-format msgid "%{profile} has posted an announcement under event %{event}." msgstr "%{profile} on julkaissut ilmoituksen tapahtumassa %{event}." -#, elixir-format #: lib/service/activity/renderer/comment.ex:24 #: lib/web/templates/email/activity/_comment_activity_item.html.eex:4 lib/web/templates/email/activity/_comment_activity_item.text.eex:1 +#, elixir-format msgid "%{profile} mentionned you in a comment under event %{event}." msgstr "%{profile} mainitsi sinut tapahtuman %{event} kommentissa." -#, elixir-format #: lib/service/activity/renderer/discussion.ex:45 +#, elixir-format msgid "%{profile} mentionned you in the discussion %{discussion}." msgstr "%{profile} mainitsi sinut keskustelussa %{discussion}." -#, elixir-format #: lib/web/templates/email/email_direct_activity.html.eex:155 +#, elixir-format msgid "Don't want to receive activity notifications? You may change frequency or disable them in %{tag_start}your settings%{tag_end}." msgstr "" "Jos et halua vastaanottaa toimenpideilmoituksia, voit muuttaa " "ilmoitustiheyttä tai poistaa ilmoitukset käytöstä asetuksista." -#, elixir-format #: lib/web/templates/email/email_direct_activity.html.eex:42 #: lib/web/templates/email/email_direct_activity.text.eex:5 -msgid "Here's your weekly activity recap" -msgstr "" - #, elixir-format +msgid "Here's your weekly activity recap" +msgstr "Tässä on viikoittainen kertaus toiminnastasi" + #: lib/web/email/activity.ex:119 lib/web/email/activity.ex:140 +#, elixir-format msgid "Activity notification for %{instance}" msgstr "Toimenpide palvelimella %{instance}" -#, elixir-format #: lib/web/email/activity.ex:126 -msgid "Daily activity recap for %{instance}" -msgstr "" - #, elixir-format +msgid "Daily activity recap for %{instance}" +msgstr "Päivittäinen toiminnan kertaus instanssille %{instance}" + #: lib/web/templates/email/email_direct_activity.html.eex:40 #: lib/web/templates/email/email_direct_activity.text.eex:4 +#, elixir-format msgid "Here's your daily activity recap" -msgstr "" +msgstr "Tässä on päivittäinen kertaus toiminnastasi" -#, elixir-format #: lib/web/email/activity.ex:133 -msgid "Weekly activity recap for %{instance}" -msgstr "" - #, elixir-format +msgid "Weekly activity recap for %{instance}" +msgstr "Viikoittainen toiminnan kertaus instanssille %{instance}" + #: lib/service/activity/renderer/comment.ex:66 #: lib/web/templates/email/activity/_comment_activity_item.html.eex:51 lib/web/templates/email/activity/_comment_activity_item.text.eex:19 -msgid "%{profile} has posted a new comment under your event %{event}." -msgstr "" - #, elixir-format +msgid "%{profile} has posted a new comment under your event %{event}." +msgstr "%{profile} on lähettänyt uuden kommentin tapahtumaasi %{event}." + #: lib/service/activity/renderer/comment.ex:53 #: lib/web/templates/email/activity/_comment_activity_item.html.eex:36 lib/web/templates/email/activity/_comment_activity_item.text.eex:13 +#, elixir-format msgid "%{profile} has posted a new reply under your event %{event}." -msgstr "" +msgstr "%{profiili} on lähettänyt uuden vastauksen tapahtumaasi %{event}." -#, elixir-format #: lib/web/email/activity.ex:46 -msgid "Announcement for your event %{event}" -msgstr "" - #, elixir-format +msgid "Announcement for your event %{event}" +msgstr "Ilmoitus tapahtumaasi %{event}" + #: lib/service/activity/renderer/group.ex:23 +#, elixir-format msgid "The group %{group} was updated by %{profile}." msgstr "%{profile} päivitti julkaisun %{post}." -#, elixir-format, fuzzy #: lib/service/activity/renderer/post.ex:47 +#, elixir-format msgid "The post %{post} from group %{group} was deleted by %{profile}." -msgstr "%{profile} päivitti julkaisun %{post}." +msgstr "Viestin %{post} ryhmästä %{group} poisti %{profile}." -#, elixir-format, fuzzy #: lib/service/activity/renderer/post.ex:31 +#, elixir-format msgid "The post %{post} from group %{group} was published by %{profile}." -msgstr "%{profile} päivitti julkaisun %{post}." +msgstr "Viestin %{post} ryhmästä %{group} julkaisi %{profile}." -#, elixir-format, fuzzy #: lib/service/activity/renderer/post.ex:39 +#, elixir-format msgid "The post %{post} from group %{group} was updated by %{profile}." -msgstr "%{profile} päivitti julkaisun %{post}." +msgstr "Viestin %{post} ryhmästä %{group} päivitti %{profile}." From d7bcfd5be6e872f2725eed7c0f1bdb236109ea78 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Wed, 21 Jul 2021 10:34:07 +0200 Subject: [PATCH 012/169] Add target to allowed attributes on links so that links open in new tabs Closes #786 Signed-off-by: Thomas Citharel --- lib/service/formatter/default_scrubbler.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/service/formatter/default_scrubbler.ex b/lib/service/formatter/default_scrubbler.ex index cf353fc05..001207216 100644 --- a/lib/service/formatter/default_scrubbler.ex +++ b/lib/service/formatter/default_scrubbler.ex @@ -36,7 +36,7 @@ defmodule Mobilizon.Service.Formatter.DefaultScrubbler do "ugc" ]) - Meta.allow_tag_with_these_attributes(:a, ["name", "title"]) + Meta.allow_tag_with_these_attributes(:a, ["name", "title", "target"]) Meta.allow_tag_with_these_attributes(:abbr, ["title"]) From 7ca7c132fb26e363adfe1da07ca0d8fafa6930d9 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Wed, 21 Jul 2021 10:45:42 +0200 Subject: [PATCH 013/169] Add back RSS/ical links on public group pages Signed-off-by: Thomas Citharel --- js/src/views/Group/Group.vue | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/js/src/views/Group/Group.vue b/js/src/views/Group/Group.vue index 5322fcb29..6c2ca2e14 100644 --- a/js/src/views/Group/Group.vue +++ b/js/src/views/Group/Group.vue @@ -172,7 +172,6 @@ @@ -183,13 +182,16 @@ icon-left="dots-horizontal" aria-label="Other actions" /> - + {{ $t("Public preview") }} From 1fe5ff802dac2a81a60c294043bacfc6ec7f3df7 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Wed, 21 Jul 2021 10:47:40 +0200 Subject: [PATCH 014/169] Aria improvements on group page Signed-off-by: Thomas Citharel --- js/src/views/Group/Group.vue | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/js/src/views/Group/Group.vue b/js/src/views/Group/Group.vue index 6c2ca2e14..a36048337 100644 --- a/js/src/views/Group/Group.vue +++ b/js/src/views/Group/Group.vue @@ -1,7 +1,7 @@ @@ -618,8 +459,6 @@ import { EventVisibility, MemberRole, ParticipantRole, - RoutingTransportationType, - RoutingType, } from "@/types/enums"; import { EVENT_PERSON_PARTICIPATION, @@ -636,7 +475,6 @@ import { IActor, IPerson, Person, usernameWithDomain } from "../../types/actor"; import { GRAPHQL_API_ENDPOINT } from "../../api/_entrypoint"; import DateCalendarIcon from "../../components/Event/DateCalendarIcon.vue"; import EventCard from "../../components/Event/EventCard.vue"; -import EventFullDate from "../../components/Event/EventFullDate.vue"; import ReportModal from "../../components/Report/ReportModal.vue"; import { IReport } from "../../types/report.model"; import { CREATE_REPORT } from "../../graphql/report"; @@ -644,7 +482,6 @@ import EventMixin from "../../mixins/event"; import IdentityPicker from "../Account/IdentityPicker.vue"; import ParticipationSection from "../../components/Participation/ParticipationSection.vue"; import RouteName from "../../router/name"; -import { Address } from "../../types/address.model"; import CommentTree from "../../components/Comment/CommentTree.vue"; import "intersection-observer"; import { CONFIG } from "../../graphql/config"; @@ -657,19 +494,18 @@ import { import { IConfig } from "../../types/config.model"; import Subtitle from "../../components/Utils/Subtitle.vue"; import Tag from "../../components/Tag.vue"; -import EventMetadataBlock from "../../components/Event/EventMetadataBlock.vue"; +import EventMetadataSidebar from "../../components/Event/EventMetadataSidebar.vue"; import EventBanner from "../../components/Event/EventBanner.vue"; -import ActorCard from "../../components/Account/ActorCard.vue"; import PopoverActorCard from "../../components/Account/PopoverActorCard.vue"; import { IParticipant } from "../../types/participant.model"; import { ApolloCache, FetchResult } from "@apollo/client/core"; +import { IEventMetadataDescription } from "@/types/event-metadata"; +import { eventMetaDataList } from "../../services/EventMetadata"; // noinspection TypeScriptValidateTypes @Component({ components: { - EventMetadataBlock, Subtitle, - EventFullDate, EventCard, BIcon, DateCalendarIcon, @@ -678,15 +514,25 @@ import { ApolloCache, FetchResult } from "@apollo/client/core"; ParticipationSection, CommentTree, Tag, - ActorCard, PopoverActorCard, EventBanner, - "map-leaflet": () => - import(/* webpackChunkName: "map" */ "../../components/Map.vue"), + EventMetadataSidebar, ShareEventModal: () => import( /* webpackChunkName: "shareEventModal" */ "../../components/Event/ShareEventModal.vue" ), + "integration-twitch": () => + import( + /* webpackChunkName: "twitchIntegration" */ "../../components/Event/Integrations/Twitch.vue" + ), + "integration-peertube": () => + import( + /* webpackChunkName: "PeerTubeIntegration" */ "../../components/Event/Integrations/PeerTube.vue" + ), + "integration-youtube": () => + import( + /* webpackChunkName: "YouTubeIntegration" */ "../../components/Event/Integrations/YouTube.vue" + ), }, apollo: { event: { @@ -783,8 +629,6 @@ export default class Event extends EventMixin { oldParticipationRole!: string; - showMap = false; - isReportModalActive = false; isShareModalActive = false; @@ -813,65 +657,6 @@ export default class Event extends EventMixin { messageForConfirmation = ""; - RoutingParamType = { - [RoutingType.OPENSTREETMAP]: { - [RoutingTransportationType.FOOT]: "engine=fossgis_osrm_foot", - [RoutingTransportationType.BIKE]: "engine=fossgis_osrm_bike", - [RoutingTransportationType.TRANSIT]: null, - [RoutingTransportationType.CAR]: "engine=fossgis_osrm_car", - }, - [RoutingType.GOOGLE_MAPS]: { - [RoutingTransportationType.FOOT]: "dirflg=w", - [RoutingTransportationType.BIKE]: "dirflg=b", - [RoutingTransportationType.TRANSIT]: "dirflg=r", - [RoutingTransportationType.CAR]: "driving", - }, - }; - - makeNavigationPath( - transportationType: RoutingTransportationType - ): string | undefined { - const geometry = this.physicalAddress?.geom; - if (geometry) { - const routingType = this.config.maps.routing.type; - /** - * build urls to routing map - */ - if (!this.RoutingParamType[routingType][transportationType]) { - return; - } - - const urlGeometry = geometry.split(";").reverse().join(","); - - switch (routingType) { - case RoutingType.GOOGLE_MAPS: - return `https://maps.google.com/?saddr=Current+Location&daddr=${urlGeometry}&${this.RoutingParamType[routingType][transportationType]}`; - case RoutingType.OPENSTREETMAP: - default: { - const bboxX = geometry.split(";").reverse()[0]; - const bboxY = geometry.split(";").reverse()[1]; - return `https://www.openstreetmap.org/directions?from=&to=${urlGeometry}&${this.RoutingParamType[routingType][transportationType]}#map=14/${bboxX}/${bboxY}`; - } - } - } - } - - get addressLinkToRouteByCar(): undefined | string { - return this.makeNavigationPath(RoutingTransportationType.CAR); - } - - get addressLinkToRouteByBike(): undefined | string { - return this.makeNavigationPath(RoutingTransportationType.BIKE); - } - - get addressLinkToRouteByFeet(): undefined | string { - return this.makeNavigationPath(RoutingTransportationType.FOOT); - } - - get addressLinkToRouteByTransit(): undefined | string { - return this.makeNavigationPath(RoutingTransportationType.TRANSIT); - } - get eventTitle(): undefined | string { if (!this.event) return undefined; return this.event.title; @@ -1262,12 +1047,6 @@ export default class Event extends EventMixin { ); } - get physicalAddress(): Address | null { - if (!this.event.physicalAddress) return null; - - return new Address(this.event.physicalAddress); - } - async anonymousParticipationConfirmed(): Promise { return isParticipatingInThisEvent(this.uuid); } @@ -1302,6 +1081,32 @@ export default class Event extends EventMixin { } return null; } + + metadataToComponent: Record = { + "mz:live:twitch:url": "integration-twitch", + "mz:live:peertube:url": "integration-peertube", + "mz:live:youtube:url": "integration-youtube", + }; + + get integrations(): Record { + return this.event.metadata + .map((val) => { + const def = eventMetaDataList.find((dat) => dat.key === val.key); + return { + ...def, + ...val, + }; + }) + .reduce((acc: Record, metadata) => { + const component = this.metadataToComponent[metadata.key]; + if (component !== undefined) { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + acc[component] = metadata; + } + return acc; + }, {}); + } } diff --git a/js/src/components/Group/GroupPicker.vue b/js/src/components/Group/GroupPicker.vue deleted file mode 100644 index 583b49671..000000000 --- a/js/src/components/Group/GroupPicker.vue +++ /dev/null @@ -1,105 +0,0 @@ - - diff --git a/js/src/components/Group/GroupPickerWrapper.vue b/js/src/components/Group/GroupPickerWrapper.vue deleted file mode 100644 index 9be9b28f9..000000000 --- a/js/src/components/Group/GroupPickerWrapper.vue +++ /dev/null @@ -1,132 +0,0 @@ - - - diff --git a/js/src/i18n/en_US.json b/js/src/i18n/en_US.json index 3d054a646..9f4586aab 100644 --- a/js/src/i18n/en_US.json +++ b/js/src/i18n/en_US.json @@ -1122,5 +1122,8 @@ "Tools": "Tools", "Social": "Social", "Details": "Details", - "Booking": "Booking" + "Booking": "Booking", + "Filter by profile or group name": "Filter by profile or group name", + "Filter by name": "Filter by name", + "Redirecting in progress…": "Redirecting in progress…" } diff --git a/js/src/i18n/fr_FR.json b/js/src/i18n/fr_FR.json index 58630776b..0615a1480 100644 --- a/js/src/i18n/fr_FR.json +++ b/js/src/i18n/fr_FR.json @@ -1213,5 +1213,8 @@ "Tools": "Outils", "Social": "Social", "Details": "Détails", - "Booking": "Réservations" + "Booking": "Réservations", + "Filter by profile or group name": "Filter par nom du profil ou du groupe", + "Filter by name": "Filtrer par nom", + "Redirecting in progress…": "Redirection en cours…" } From 8e54cf12c8f8432213108625f78c0929916c2edb Mon Sep 17 00:00:00 2001 From: Thomas Frenzel Date: Tue, 10 Aug 2021 18:07:31 +0000 Subject: [PATCH 131/169] Translated using Weblate (German) Currently translated at 91.6% (1030 of 1124 strings) Translation: Mobilizon/Frontend Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/de/ --- js/src/i18n/de.json | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/js/src/i18n/de.json b/js/src/i18n/de.json index baf5cb24b..453923e65 100644 --- a/js/src/i18n/de.json +++ b/js/src/i18n/de.json @@ -4,7 +4,7 @@ "(this folder)": "(dieser Ordner)", "(this link)": "(dieser Link)", "+ Add a resource": "+ Füge eine Ressource hinzu", - "+ Create an event": "+ Erstelle eine Event", + "+ Create an event": "+ Erstelle eine Veranstaltung", "+ 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.", @@ -16,12 +16,18 @@ "@{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.", + "A discussion has been created or updated": "Eine Diskussion wurde erstellt oder aktualisiert", "A federated software": "Eine federierte Software", + "A member has been updated": "Ein Mitglied wurde aktualisiert", + "A member requested to join one of my groups": "Ein Mitglied möchte einer meiner Gruppen beitreten", "A place for your code of conduct, rules or guidelines. You can use HTML tags.": "Hier ist Platz für Ihren Code of Conduct, Regeln und Vorgaben. Sie können HTML-Tags verwenden.", "A place to explain who you are and the things that set your instance apart. You can use HTML tags.": "Hier können Sie beschreiben, wer Sie sind und was Ihre Instanz besonders macht. Sie können HTML-Tags verwenden.", "A place to publish something to the whole world, your community or just your group members.": "Ein Ort, an dem Sie etwas für die ganze Welt, Ihre Community oder nur für Ihre Gruppenmitglieder veröffentlichen können.", "A place to store links to documents or resources of any type.": "Ein Ort um Links zu Dokumenten oder Ressourcen jeden Typs zu speichern.", + "A post has been published": "Ein Beitrag wurde veröffentlicht", + "A post has been updated": "Ein Beitrag wurde aktualisiert", "A practical tool": "Ein praktisches Werkzeug", + "A resource has been created or updated": "Eine Ressource wurde erstellt oder aktualisiert", "A short tagline for your instance homepage. Defaults to \"Gather ⋅ Organize ⋅ Mobilize\"": "Eine kurze Tagline für Ihre Instanz-Homepage. Standardmäßig steht dort: \"Sammeln ⋅ Organisieren ⋅ Mobilisieren\"", "A user-friendly, emancipatory and ethical tool for gathering, organising, and mobilising.": "Ein benutzerfreundliches, emanzipatorisches und ethisches Instrument zum Sammeln, Organisieren und Mobilisieren.", "A validation email was sent to {email}": "Es wurde eine Bestätigungs-Mail an {email} gesendet", @@ -72,6 +78,13 @@ "An error has occured. Sorry about that. You may try to reload the page.": "Ein Fehler ist aufgetreten. Bitte entschuldige. Du kannst versuchen die Seite neu zu laden.", "An error has occurred.": "Ein Fehler ist aufgetreten.", "An ethical alternative": "Eine ethische Alternative", + "An event I'm going to has been updated": "Eine Veranstaltung, an der ich teilnehme, wurde aktualisiert", + "An event I'm going to has posted an announcement": "In einer Veranstaltung, an der ich teilnehme, wurde eine Ankündigung geteilt", + "An event I'm organizing has a new comment": "Eine Veranstaltung, an der ich teilnehme, hat einen neuen Kommentar", + "An event I'm organizing has a new participation": "Eine Veranstaltung, an der ich teilnehme, hat eine*n neue*n Teilnehmer*in", + "An event I'm organizing has a new pending participation": "Eine Veranstaltung, an der ich teilnehme, hat zu bestätigende Teilnehmer*innen", + "An event from one of my groups has been published": "Eine Veranstaltung einer meiner Gruppen wurde veröffentlicht", + "An event from one of my groups has been updated or deleted": "Eine Veranstaltung einer meiner Gruppen wurde aktualisiert oder gelöscht", "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", @@ -103,6 +116,7 @@ "Before you can login, you need to click on the link inside it to validate your account.": "Bevor Sie sich anmelden können, müssen Sie auf den darin enthaltenen Link klicken, um Ihr Konto zu validieren.", "Begins on": "Beginnt um", "Bold": "Fett", + "Browser notifications": "Browserbenachrichtigungen", "By @{group}": "Von @{group}", "By @{username}": "von @{username}", "By others": "Von Anderen", @@ -163,6 +177,7 @@ "Create a new group": "Erstelle eine neue Gruppe", "Create a new identity": "Erstelle eine neue Identität", "Create a new list": "neue Liste erstellen", + "Create a new profile": "Neues Profil erstellen", "Create a pad": "Pad erstellen", "Create a videoconference": "Videokonferenz erstellen", "Create a visioconference": "Erstelle eine Videokonferenz", @@ -238,6 +253,7 @@ "Duplicate": "Duplikat", "Edit": "Bearbeiten", "Edit post": "Beitrag bearbeiten", + "Edit profile {profile}": "Profil {profile} bearbeiten", "Edited {ago}": "Editiert {ago}", "Eg: Stockholm, Dance, Chess…": "z.B.: Berlin, Tanzen, Schach…", "Either on the {instance} instance or on another instance.": "Entweder auf der Instanz {instance} oder auf einer andere Instanz.", @@ -316,6 +332,7 @@ "Gather ⋅ Organize ⋅ Mobilize": "Treffen ⋅ Organisieren ⋅ Mobilisieren", "General": "Allgemein", "General information": "Allgemeine Informationen", + "General settings": "Allgemeine EInstellungen", "Getting location": "Standort ermitteln", "Getting there": "Hin kommen", "Glossary": "Glossar", @@ -326,6 +343,7 @@ "Group Followers": "Follower*innen dieser Gruppe", "Group List": "Gruppenliste", "Group Members": "Gruppenmitglieder", + "Group activity": "Gruppenereignisse", "Group address": "Gruppenadresse", "Group display name": "Angezeigter Gruppenname", "Group full name": "Vollständiger Gruppenname", @@ -353,8 +371,11 @@ "I participate": "Ich nehme teil", "I want to allow people to participate without an account.": "Ich möchte Usern erlauben ohne Konto teilzunehmen.", "I want to approve every participation request": "Ich möchte jede Teilnahmeanfrage manuell bestätigen", + "I've been mentionned in a comment under an event": "Ich wurde in einem Kommentar unter einer Veranstaltung erwähnt", + "I've been mentionned in a group discussion": "Ich wurde in einer Gruppendiskussion erwähnt", "ICS feed for events": "ICS-Feed mit Veranstaltungen", "ICS/WebCal Feed": "ICS/Webcal-Feed", + "Identities": "Identitäten", "Identity {displayName} created": "Identität {displayName} erstellt", "Identity {displayName} deleted": "Identität {displayName} gelöscht", "Identity {displayName} updated": "Identität {displayName} aktualisiert", @@ -443,6 +464,7 @@ "Mark as resolved": "Als gelöst markieren", "Member": "Mitglied", "Members": "Mitglieder", + "Mentions": "Erwähnungen", "Message": "Nachricht", "Mobilizon": "Mobilizon", "Mobilizon is a federated network. You can interact with this event from a different server.": "Mobilizon ist ein federiertes Netzwerk.Sie können mit dieser Veranstaltung von verschiedenen Servern aus interagieren.", @@ -501,14 +523,20 @@ "No instance to remove|Remove instance|Remove {number} instances": "Keine Instanz zu entfernen|Entferne Instanz|Entferne {number} Instanzen", "No languages found": "Keine Sprachen gefunden", "No member matches the filters": "Kein Mitglied entspricht den Filterkriterien", + "No members found": "Keine Mitglieder gefunden", + "No memberships found": "Keine Mitgliedschaften gefunden", "No message": "Keine Nachricht", "No moderation logs yet": "Bisher keine Moderationsprotokolle", "No more activity to display.": "Es gibt keine weiteren anzuzeigenden Ereignisse.", + "No one is participating|One person participating|{going} people participating": "Niemand nimmt teil|Eine Person nimmt teilt|{going} nehmen teil", "No ongoing todos": "Keine aktiven To-dos", "No open reports yet": "Bisher keine ausstehenden Berichte", + "No organized events found": "Keine erstellte Veranstaltung gefunden", + "No organized events listed": "Keine erstellten Veranstaltungen gelistet", "No participant matches the filters": "Kein Teilnehmer entspricht den Filterkriterien", "No participant to approve|Approve participant|Approve {number} participants": "Keine Teilnahme zu bestätigen|Bestätige Teilnahme|Bestätige {number} Teilnahmen", "No participant to reject|Reject participant|Reject {number} participants": "Keine Teilnahmen abzulehnen|Teilnahme ablehnen|Lehne {number} Teilnahmen ab", + "No participations listed": "Keine Teilnehmer*innen gelistet", "No posts found": "Keine Beiträge gefunden", "No posts yet": "Noch keine Beträge vorhanden", "No profile matches the filters": "Kein Profil entspricht den Filterkriterien", @@ -529,8 +557,10 @@ "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", + "Notification settings": "Benachrichtigungseinstellungen", "Notifications": "Benachrichtigungen", "Notifications for manually approved participations to an event": "Benachrichtigungen bei manuell bestätigten Teilnahmen an einer Veranstlatung", + "Notify participants": "Benachrichtige Teilnehmer*innen", "Now, create your first profile:": "Erstellen Sie jetzt Ihr erstes Profil:", "Number of places": "Anzahl der Plätze", "OK": "OK", @@ -558,6 +588,7 @@ "Organize and take action, freely": "Organisiert euch und legt los, selbstbestimmt", "Organized": "Organisiert", "Organized by": "Organisiert von", + "Organized by you": "Erstellt durch Sie", "Organized by {name}": "Organisiert von {name}", "Organizer": "Organisator", "Organizer notifications": "Benachrichtigungen für Organisatoren", @@ -618,6 +649,7 @@ "Privacy policy": "Datenschutzerklärung", "Private event": "Private Veranstaltung", "Private feeds": "Private Feeds", + "Profile": "Profil", "Profile feeds": "Profil-Feeds", "Profiles": "Profile", "Profiles and federation": "Profile und Föderation", @@ -633,10 +665,12 @@ "Publish": "Veröffentlichen", "Published events": "Veröffentlichte Veranstaltungen", "Published events with {comments} comments and {participations} confirmed participations": "Veröffentlichte Veranstaltungen mit {comments} Kommentaren und {participations} bestätigten Teilnahmen", + "Push": "Push", "RSS/Atom Feed": "RSS/Atom-Feed", "Radius": "Radius", "Read Framasoft’s statement of intent on the Framablog": "Ließ Framasofts Absichtserklärung im Framablog", "Recap every week": "Jede Woche benachrichtigen", + "Receive one email for each activity": "Eine Email für jedes Ereignis erhalten", "Receive one email per request": "Eine E-Mail für jede Anfrage erhalten", "Redirecting to content…": "Weiterleitung zum Inhalt…", "Redirecting to event…": "Weiterleiten zur Veranstaltung…", @@ -700,6 +734,7 @@ "Select a radius": "Wähle einen Radius", "Select a timezone": "Zeitzone wählen", "Select languages": "Sprache wählen", + "Select the activities for which you wish to receive an email or a push notification.": "Wählen Sie die Ereignisse aus, für die Sie Email- oder Push-Benachrichtigungen erhalten möchten.", "Send email": "E-Mail senden", "Send me an email to reset my password": "Sende mir eine E-Mail, um mein Passwort zurückzusetzen", "Send me the confirmation email once again": "Sende mir noch eine Bestätigungsmail", @@ -859,6 +894,7 @@ "Uploaded media size": "Größe der hochgeladenen Medien", "Use my location": "Nutzte meinen Standort", "User": "Nutzer", + "User settings": "Nutzer*inneneinstellungen", "Username": "Nutzername", "Users": "Nutzer", "View a reply": "|Zeige eine Antwort|Zeige {totalReplies} Antworten", @@ -892,6 +928,7 @@ "We'll use your timezone settings to send a recap of the morning of the event.": "Wir nutzen Ihre Zeitzonen-Einstellung, um Ihnen am Morgen der Veranstaltung eine Erinnerung zu senden.", "Website": "Webseite", "Website / URL": "Website / URL", + "Weekly email summary": "Wöchentliche E-Mail-Zusammenfassungen", "Welcome back {username}!": "Willkommen zurück {username}!", "Welcome back!": "Willkommen zurück!", "Welcome on your administration panel": "Willkommen in deiner Administrationsansicht", @@ -916,6 +953,7 @@ "You are not an administrator for this group.": "Sie sind kein Administrator dieser Gruppe.", "You are not part of any group": "Sie sind nicht Teil einer Gruppe", "You are not part of any group.": "Sie sind kein Teil einer Gruppe.", + "You are offline": "Sie sind offline", "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 Schlagworte hinzufügen, indem Sie Enter drücken oder durch ein Komma trennen", @@ -924,6 +962,7 @@ "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 changed your email or password": "Sie haben Ihre Email-Adresse oder Ihr Passwort geändert", "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.", @@ -1072,6 +1111,8 @@ "{moderator} added a note on {report}": "{moderator} hat eine Notiz zu {report} hinzugefügt", "{moderator} closed {report}": "{moderator} hat die Meldung {report} geschlossen", "{moderator} deleted an event named \"{title}\"": "{moderator} hat eine Veranstaltung namens „{title}“ gelöscht", + "{moderator} has deleted a comment from {author}": "{moderator} hat einen Kommentar von {author} gelöscht", + "{moderator} has deleted a comment from {author} under the event {event}": "{moderator} hat einen Kommentar von {author} unter der Veranstaltung {event} gelöscht", "{moderator} has deleted user {user}": "{moderator} hat den Nutzer {user} gelöscht", "{moderator} has unsuspended profile {profile}": "{moderator} hat das Profil {profil} gesperrt", "{moderator} marked {report} as resolved": "{moderator} hat {report} als erledigt markiert", @@ -1079,6 +1120,7 @@ "{moderator} suspended profile {profile}": "{moderator} hat das Profil {profile} gesperrt", "{nb} km": "{nb} km", "{number} members": "{number} Mitglieder", + "{number} memberships": "{number} Mitgliedschaften", "{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", From 511890b54b2bfc8d613a4b05529eee8e820f9638 Mon Sep 17 00:00:00 2001 From: Berto Te Date: Tue, 10 Aug 2021 07:24:44 +0000 Subject: [PATCH 132/169] Translated using Weblate (Spanish) Currently translated at 100.0% (1124 of 1124 strings) Translation: Mobilizon/Frontend Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/es/ --- js/src/i18n/es.json | 50 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/js/src/i18n/es.json b/js/src/i18n/es.json index bdeca4248..d0f7fb58d 100644 --- a/js/src/i18n/es.json +++ b/js/src/i18n/es.json @@ -20,7 +20,10 @@ "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.": "Una cookie es un pequeño archivo que contiene información que se envía a su computadora cuando visita un sitio web. Cuando vuelve a visitar el sitio, la cookie permite que ese sitio reconozca su navegador. Las cookies pueden almacenar las preferencias del usuario y otra información. Puede configurar su navegador para rechazar todas las cookies. Sin embargo, esto puede provocar que algunas funciones o servicios del sitio web funcionen parcialmente. El almacenamiento local funciona de la misma manera pero permite almacenar más datos.", "A discussion has been created or updated": "Se ha creado o actualizado una discusión", "A federated software": "Un software federado", + "A fediverse account URL to follow for event updates": "Una URL de cuenta de fediverse a seguir para actualizaciones de eventos", "A group with this name already exists": "Ya existe un grupo con este nombre", + "A link to a page presenting the event schedule": "Un enlace a una página que presenta el calendario del evento", + "A link to a page presenting the price options": "Un enlace a una página que presenta las opciones de precio", "A member has been updated": "Un miembro ha sido actualizado", "A member requested to join one of my groups": "Un miembro solicitó unirse a uno de mis grupos", "A new version is available.": "Una nueva version esta disponible.", @@ -33,6 +36,7 @@ "A practical tool": "Una herramienta práctica", "A resource has been created or updated": "Traducción", "A short tagline for your instance homepage. Defaults to \"Gather ⋅ Organize ⋅ Mobilize\"": "Un breve eslogan para la página de inicio de su instancia. El valor predeterminado es \"Reunir ⋅ Organizar ⋅ Movilizar\"", + "A twitter account handle to follow for event updates": "Un identificador de cuenta de Twitter a seguir para actualizaciones de eventos", "A user-friendly, emancipatory and ethical tool for gathering, organising, and mobilising.": "Una herramienta fácil de usar, emancipadora y ética, para reunir, organizar y movilizar.", "A validation email was sent to {email}": "Un correo electrónico de confirmación fue enviado a {email}", "API": "API", @@ -46,6 +50,7 @@ "About {instance}": "Acerca de {instance}", "Accept": "Aceptar", "Accepted": "Aceptado", + "Accessibility": "Accesibilidad", "Accessible only to members": "Accesible solo para miembros", "Accessible through link": "Accesible a través del enlace", "Account": "Cuenta", @@ -66,6 +71,7 @@ "Add a todo": "Agrega una tarea pendiente", "Add an address": "Añade una dirección", "Add an instance": "Añade una instancia", + "Add new…": "Agregar nuevo…", "Add some tags": "Añade algunas etiquetas", "Add to my calendar": "Añadir a mi calendario", "Additional comments": "Comentarios adicionales", @@ -81,6 +87,7 @@ "Allow all comments": "Permitir todos los comentarios", "Allow all comments from users with accounts": "Permitir todos los comentarios de los usuarios registrados", "Allow registrations": "Permitir registros", + "An URL to an external ticketing platform": "Una URL a una plataforma de venta de entradas externa", "An error has occured while refreshing the page.": "Ha ocurrido un error al actualizar la página.", "An error has occured. Sorry about that. You may try to reload the page.": "Ha ocurrido un error. Lo siento por eso. Puede intentar volver a cargar la página.", "An error has occurred.": "Se ha producido un error.", @@ -126,6 +133,7 @@ "Begins on": "Comienza en", "Bio": "Bio", "Bold": "Negrita", + "Booking": "Reservacion", "Breadcrumbs": "Migajas", "Browser notifications": "Notificaciones del navegador", "By @{group}": "Por @{group}", @@ -252,6 +260,7 @@ "Deleting your Mobilizon account": "Eliminando tu cuenta de Mobilizon", "Demote": "Degradar", "Description": "Descripción", + "Details": "Detalles", "Didn't receive the instructions ?": "¿No recibiste las instrucciones?", "Didn't receive the instructions?": "¿No recibiste las instrucciones?", "Disabled": "Deshabilitado", @@ -281,6 +290,8 @@ "Either the email has already been changed, either the validation token is incorrect.": "O el correo electrónico ya se ha cambiado, o bien el token de validación es incorrecto.", "Either the participation has already been validated, either the validation token is incorrect.": "O la participación ya ha sido validada, o bien el token de validación es incorrecto.", "Either the participation request has already been validated, either the validation token is incorrect.": "O la solicitud de participación ya se ha validado o el token de validación es incorrecto.", + "Element title": "Título del elemento", + "Element value": "Valor del elemento", "Email": "Correo elecxtrónico", "Email address": "Dirección de correo electrónico", "Email notifications": "Notificaciónes de Correo Electrónico", @@ -317,6 +328,7 @@ "Event creation": "Creación de evento", "Event edition": "Edición del evento", "Event list": "Lista de eventos", + "Event metadata": "Metadatos de eventos", "Event not found.": "Evento no encontrado.", "Event page settings": "Configuración de la página del evento", "Event to be confirmed": "Evento por confirmar", @@ -336,10 +348,12 @@ "Features": "Caracteristicas", "Federated Group Name": "Nombre del grupo federado", "Federation": "Federación", + "Fediverse account": "Cuenta Fediverse", "Fetch more": "Buscar más", "Find an address": "Buscar una dirección", "Find an instance": "Buscar una instancia", "Find another instance": "Encuentra otra instancia", + "Find or add an element": "Encuentra o agrega un elemento", "Followed by {count} persons": "Seguido por {count} personas", "Follower": "Seguidor", "Followers": "Seguidores", @@ -349,12 +363,14 @@ "For instance: London, Taekwondo, Architecture…": "Por ejemplo: Londres, Taekwondo, Arquitectura …", "Forgot your password ?": "¿Olvidaste tu contraseña ?", "Forgot your password?": "¿Olvidaste tu contraseña?", + "Framadate poll": "Encuesta Framadate", "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?": "Desde una fiesta de cumpleaños con amigos y familiares hasta una marcha por el cambio climático, en este momento, nuestras reuniones están atrapadas dentro de las plataformas de los gigantes tecnológicos . ¿Cómo podemos organizarnos, cómo podemos hacer clic en \"Asistir\", sin proporcionar datos privados a Facebook o encerrarnos dentro de MeetUp?", "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 inside MeetUp?": "Desde una fiesta de cumpleaños con amigos y familiares hasta una marcha por el cambio climático, ahora mismo, nuestras reuniones están atrapadas dentro de las plataformas de los gigantes tecnológicos . ¿Cómo podemos organizarnos, cómo podemos hacer clic en \"Asistir\" sin proporcionar datos privados a Facebook o encerrarnos dentro de MeetUp?", "From the {startDate} at {startTime} to the {endDate}": "Desde {startDate} en {startTime} hasta {endDate}", "From the {startDate} at {startTime} to the {endDate} at {endTime}": "Desde el {startDate} en {startTime} hasta el {endDate} en {endTime}", "From the {startDate} to the {endDate}": "Desde el {startDate} hasta el {endDate}", "From yourself": "De ti mismo", + "Fully accessible with a wheelchair": "Totalmente accesible con silla de ruedas", "Gather ⋅ Organize ⋅ Mobilize": "Reúna ⋅ Organice ⋅ Movilice", "General": "General", "General information": "Información general", @@ -441,6 +457,7 @@ "Instances": "Instancias", "Instances following you": "Instancias siguiéndote", "Instances you follow": "Instancias que sigues", + "Integrate this event with 3rd-party tools and show metadata for the event.": "Integre este evento con herramientas de terceros y muestre metadatos para el evento.", "Interact with a remote content": "Interactuar con un contenido remoto", "Invite a new member": "Invita a un nuevo miembro", "Invite member": "Miembro invitado", @@ -476,6 +493,7 @@ "Like title update, start or end date change, event being confirmed or cancelled.": "Como cambiar el título del evento, su fecha de inicio o finalización, o ser confirmado o cancelado.", "Limited number of places": "Número limitado de plazas", "List title": "Título de la lista", + "Live": "En directo", "Load more": "Carga más", "Load more activities": "Cargar más actividades", "Loading comments…": "Cargando comentarios…", @@ -587,9 +605,11 @@ "No resources selected": "Ningún recurso seleccionado|Un recurso seleccionado|{count} recursos seleccionados", "No resources yet": "Aún no hay recursos", "No results for \"{queryText}\"": "No hay resultados para \"{queryText}\"", + "No results for {search}": "No hay resultados para {search}", "No rules defined yet.": "No hay reglas definidas todavía.", "No user account with this email was found. Maybe you made a typo?": "No se encontró ninguna cuenta de usuario con este correo electrónico. Tal vez hiciste un error tipográfico?", "None": "Ninguno", + "Not accessible with a wheelchair": "No accesible con silla de ruedas", "Not approved": "No aprovado", "Not confirmed": "Sin confirmar", "Notes": "Notas", @@ -612,6 +632,7 @@ "On {instance} and other federated instances": "En {instance} y otras instancias federadas", "One person is going": "Nadie va|Una persona va|personas {approved} van", "Ongoing tasks": "Tareas en curso", + "Online ticketing": "Venta de entradas en línea", "Only accessible through link": "Solo accesible a través del enlace", "Only accessible through link (private)": "Solo accesible a través del enlace (privado)", "Only accessible through link and search (private)": "Solo accesible a través de enlace y búsqueda (privado)", @@ -643,6 +664,7 @@ "Page limited to my group (asks for auth)": "Página limitada a mi grupo (solicita autenticación)", "Page not found": "Página no encontrada", "Parent folder": "Carpeta superior", + "Partially accessible with a wheelchair": "Parcialmente accesible con silla de ruedas", "Participant": "Participante", "Participant already was rejected.": "El participante ya fue rechazado.", "Participant has already been approved as participant.": "El participante ya ha sido aprobado como participante.", @@ -658,6 +680,8 @@ "Password (confirmation)": "Contraseña (confirmación)", "Password reset": "Restablecer la contraseña", "Past events": "Eventos pasados", + "PeerTube live": "PeerTube en vivo", + "PeerTube replay": "Repetición de PeerTube", "Pending": "Pendiente", "Personal feeds": "Flujos personales", "Pick": "Recoger", @@ -685,6 +709,7 @@ "Preferences": "Preferencias", "Previous": "Anterior", "Previous page": "Pagina anterior", + "Price sheet": "Hoja de precios", "Privacy Policy": "Política de privacidad", "Privacy policy": "Política de privacidad", "Private event": "Evento privado", @@ -737,6 +762,7 @@ "Rename": "Renombrar", "Rename resource": "Renombrar recurso", "Reopen": "Reabrir", + "Replay": "Repetición", "Reply": "Respuesta", "Report": "Declarar", "Report #{reportNumber}": "Informe #{reportNumber}", @@ -766,6 +792,7 @@ "SSL/TLS": "SSL/TLS", "Save": "Guardar", "Save draft": "Guardar borrador", + "Schedule": "Calendario", "Search": "Buscar", "Search events, groups, etc.": "Buscar eventos, grupos, etc.", "Search results: \"{search}\"": "Resultados de búsqueda: \"{search}\"", @@ -793,10 +820,12 @@ "Show remaining number of places": "Muestra el número restante de plazas", "Show the time when the event begins": "Muestra la hora en que comienza el evento", "Show the time when the event ends": "Muestra la hora en que finaliza el evento", + "Sign Language": "Lenguaje de señas", "Sign in with": "Inicia sesión con", "Sign up": "Regístrate", "Since you are a new member, private content can take a few minutes to appear.": "Dado que es un miembro nuevo, el contenido privado puede tardar unos minutos en aparecer.", "So that, right from its conception, Mobilizon would {fit_needs_uses_people} who are going to use it.": "De modo que, desde su concepción, Mobilizon podría {fit_needs_uses_people} quién lo va a usar.", + "Social": "Social", "Software to the people": "Software para la gente", "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:": "Algunos términos, técnicos o de otro tipo, utilizados en el texto a continuación pueden abarcar conceptos que son difíciles de comprender. Hemos proporcionado un glosario aquí para ayudarlo a comprenderlos mejor:", "Starts on…": "Comienza en …", @@ -804,6 +833,7 @@ "Statut": "Estado", "Street": "Calle", "Submit": "Enviar", + "Subtitles": "Subtítulos", "Suspend": "Suspender", "Suspend group": "Suspender grupo", "Suspended": "Suspendido", @@ -814,16 +844,23 @@ "Terms": "Condiciones", "Terms of service": "Términos de servicio", "Text": "Texto", + "The URL of a poll where the choice for the event date is happening": "La URL de una encuesta en la que se realiza la elección de la fecha del evento", + "The URL where the event can be watched live": "La URL donde se puede ver el evento en vivo", + "The URL where the event live can be watched again after it has ended": "La URL donde se puede volver a ver el evento en vivo una vez finalizado", "The account's email address was changed. Check your emails to verify it.": "Se cambió la dirección de correo electrónico de la cuenta. Revise sus correos electrónicos para verificarlo.", "The actual number of participants may differ, as this event is hosted on another instance.": "El número real de participantes puede diferir ya que este evento se aloja en otra instancia.", "The content came from another server. Transfer an anonymous copy of the report?": "El contenido vino de otro servidor. ¿Transferir una copia anónima del informe?", "The current identity doesn't have any permission on this event. You should probably change it.": "La identidad actual no tiene ningún permiso para este evento. Probablemente deberías cambiarlo.", "The current password is invalid": "La contraseña actual no es válida", "The draft event has been updated": "El borrador del evento ha sido actualizado", + "The event has a sign language interpreter": "El evento cuenta con intérprete de lengua de signos", "The event has been created as a draft": "El evento ha sido creado como borrador", "The event has been published": "El evento ha sido publicado", "The event has been updated": "El evento ha sido actualizado", "The event has been updated and published": "El evento ha sido actualizado y publicado", + "The event hasn't got a sign language interpreter": "El evento no tiene intérprete de lenguaje de señas", + "The event live video contains subtitles": "El video en vivo del evento contiene subtítulos", + "The event live video does not contain subtitles": "El video en vivo del evento no contiene subtítulos", "The event organiser has chosen to validate manually participations. Do you want to add a little note to explain why you want to participate to this event?": "El organizador del evento ha elegido validar las participaciones manualmente. ¿Desea agregar una pequeña nota para explicar por qué desea participar en este evento?", "The event organizer didn't add any description.": "El organizador del evento no agregó ninguna descripción.", "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.": "El organizador del evento aprueba manualmente las participaciones. Dado que ha elegido participar sin una cuenta, explique por qué desea participar en este evento.", @@ -871,6 +908,7 @@ "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.": "Estos flujos contienen datos de eventos para los eventos en los que alguno de sus perfiles es participante o creador. Deberías mantenerlos privados. Puede encontrar flujos para perfiles específicos en cada página de edición de perfil.", "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.": "Estos flujos contienen datos de eventos para los eventos para los que este perfil específico es un participante o creador. Deberías mantenerlos privados. Puede encontrar flujos para todos sus perfiles en la configuración de notificaciones.", "This Mobilizon instance and this event organizer allows anonymous participations, but requires validation through email confirmation.": "Esta instancia de Mobilizon y este organizador de eventos permiten participaciones anónimas pero requieren validación mediante confirmación por correo electrónico.", + "This URL doesn't seem to be valid": "Esta URL no parece ser válida", "This URL is not supported": "Esta URL no es compatible", "This email is already registered as participant for this event": "Este correo electrónico ya está registrado como participante para este evento", "This email is already used.": "Este correo electrónico ya está en uso.", @@ -913,8 +951,12 @@ "To register for an event by choosing one of your identities": "Para registrarse en un evento eligiendo una de sus identidades", "Today": "Hoy", "Tomorrow": "Mañana", + "Tools": "Herramientas", "Transfer to {outsideDomain}": "Transferir a {outsideDomain}", "Triggered profile refreshment": "Refresco de perfil activado", + "Twitch live": "Twitch en vivo", + "Twitch replay": "Repetición de Twitch", + "Twitter account": "Cuenta de Twitter", "Type": "Tipo", "Type or select a date…": "Escriba o seleccione una fecha …", "URL": "URL", @@ -954,6 +996,7 @@ "Username": "Nombre de usuario", "Users": "Los usuarios", "View a reply": "|Ver una respuesta|Ver {totalReplies} respuestas", + "View account on {hostname} (in a new window)": "Ver cuenta en {hostname} (en una nueva ventana)", "View all": "Ver todo", "View all discussions": "Ver todas las discusiones", "View all events": "Ver todos los eventos", @@ -997,8 +1040,12 @@ "Welcome on your administration panel": "Bienvenido en tu panel de administración", "Welcome to Mobilizon, {username}!": "¡Bienvenido a Mobilizon, {username}!", "What can I do to help?": "¿Que puedo hacer para ayudar?", + "Wheelchair accessibility": "Accesibilidad para sillas de ruedas", "When a moderator from the group creates an event and attributes it to the group, it will show up here.": "Cuando un moderador del grupo crea un evento y lo atribuye al grupo, se mostrará aquí.", "When someone from the group creates an event and attributes it to the group, it will show up here.": "Cuando alguien del grupo crea un evento y lo atribuye al grupo, se mostrará aquí.", + "Whether the event is accessible with a wheelchair": "Si el evento es accesible con silla de ruedas", + "Whether the event is interpreted in sign language": "Si el evento se interpreta en lenguaje de señas", + "Whether the event live video is subtitled": "Si el video en vivo del evento está subtitulado", "Who can view this event and participate": "Quién puede ver este evento y participar", "Who can view this post": "Quién puede ver esta publicación", "Who published {number} events": "Quién publicó {número} eventos", @@ -1096,6 +1143,8 @@ "You'll need to transmit the group URL so people may access the group's profile.": "Deberá transmitir la URL del grupo para que las personas puedan acceder al perfil del grupo.", "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.": "Deberá transmitir la URL del grupo para que las personas puedan acceder al perfil del grupo. El grupo no se podrá encontrar en la búsqueda de Mobilizon ni en los motores de búsqueda habituales.", "You'll receive a confirmation email.": "Recibirá un correo electrónico de confirmación.", + "YouTube live": "YouTube en vivo", + "YouTube replay": "Reproducción de YouTube", "Your account has been successfully deleted": "Su cuenta ha sido eliminada exitosamente", "Your account has been validated": "Su cuenta ha sido validada", "Your account is being validated": "Su cuenta esta siendo validada", @@ -1144,6 +1193,7 @@ "default Mobilizon terms": "términos predeterminados de Mobilizon", "digital habits of activists": "hábitos digitales de activistas", "e.g. 10 Rue Jangot": "e.j. 10 Rue Jangot", + "e.g. Accessibility, Twitch, PeerTube": "p.ej. Accesibilidad, Twitch, PeerTube", "enable the feature": "habilitar la función", "explore the events": "explorar los eventos", "explore the groups": "explorar los grupos", From b3ad0b7543d687f81ad308f73b1f472ee55274a8 Mon Sep 17 00:00:00 2001 From: Berto Te Date: Tue, 10 Aug 2021 07:24:18 +0000 Subject: [PATCH 133/169] Translated using Weblate (Spanish) Currently translated at 100.0% (172 of 172 strings) Translation: Mobilizon/Backend errors Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend-errors/es/ --- priv/gettext/es/LC_MESSAGES/errors.po | 306 +++++++++++++------------- 1 file changed, 154 insertions(+), 152 deletions(-) diff --git a/priv/gettext/es/LC_MESSAGES/errors.po b/priv/gettext/es/LC_MESSAGES/errors.po index 1250b052c..22f17b583 100644 --- a/priv/gettext/es/LC_MESSAGES/errors.po +++ b/priv/gettext/es/LC_MESSAGES/errors.po @@ -8,7 +8,7 @@ ## to merge POT files into PO files. msgid "" msgstr "" -"PO-Revision-Date: 2021-08-04 10:15+0000\n" +"PO-Revision-Date: 2021-08-11 11:21+0000\n" "Last-Translator: Berto Te \n" "Language-Team: Spanish \n" @@ -94,799 +94,801 @@ msgstr "debe ser mayor o igual que% {number}" msgid "must be equal to %{number}" msgstr "debe ser igual a% {number}" -#, elixir-format #: lib/graphql/resolvers/user.ex:100 +#, elixir-format msgid "Cannot refresh the token" msgstr "No se puede actualizar el token" -#, elixir-format #: lib/graphql/resolvers/group.ex:206 +#, elixir-format msgid "Current profile is not a member of this group" msgstr "El perfil actual no es miembro de este grupo" -#, elixir-format #: lib/graphql/resolvers/group.ex:210 +#, elixir-format msgid "Current profile is not an administrator of the selected group" msgstr "El perfil actual no es un administrador del grupo seleccionado" -#, elixir-format #: lib/graphql/resolvers/user.ex:540 +#, elixir-format msgid "Error while saving user settings" msgstr "Error al guardar los parámetros del usuario" -#, elixir-format #: lib/graphql/error.ex:91 lib/graphql/resolvers/group.ex:203 #: lib/graphql/resolvers/group.ex:234 lib/graphql/resolvers/group.ex:269 lib/graphql/resolvers/member.ex:80 +#, elixir-format msgid "Group not found" msgstr "Grupo no encontrado" -#, elixir-format #: lib/graphql/resolvers/group.ex:68 +#, elixir-format msgid "Group with ID %{id} not found" msgstr "No se encontró el grupo con ID% {id}" -#, elixir-format #: lib/graphql/resolvers/user.ex:80 +#, elixir-format msgid "Impossible to authenticate, either your email or password are invalid." msgstr "" "Imposible autenticarse, su correo electrónico o contraseña no son válidos." -#, elixir-format #: lib/graphql/resolvers/group.ex:266 +#, elixir-format msgid "Member not found" msgstr "Miembro no encontrado" -#, elixir-format #: lib/graphql/resolvers/actor.ex:61 lib/graphql/resolvers/actor.ex:91 #: lib/graphql/resolvers/user.ex:445 +#, elixir-format msgid "No profile found for the moderator user" msgstr "No se encontró el perfil del usuario moderador" -#, elixir-format #: lib/graphql/resolvers/user.ex:232 +#, elixir-format msgid "No user to validate with this email was found" msgstr "No se encontró ningún usuario para validar con este correo electrónico" -#, elixir-format #: lib/graphql/resolvers/person.ex:254 lib/graphql/resolvers/user.ex:257 +#, elixir-format msgid "No user with this email was found" msgstr "No se encontró ningún usuario con este correo electrónico" -#, elixir-format #: lib/graphql/resolvers/feed_token.ex:28 #: lib/graphql/resolvers/participant.ex:28 lib/graphql/resolvers/participant.ex:159 #: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:165 lib/graphql/resolvers/person.ex:199 #: lib/graphql/resolvers/person.ex:279 lib/graphql/resolvers/person.ex:295 lib/graphql/resolvers/person.ex:323 #: lib/graphql/resolvers/person.ex:340 +#, elixir-format msgid "Profile is not owned by authenticated user" msgstr "El perfil no es propiedad del usuario autenticado" -#, elixir-format #: lib/graphql/resolvers/user.ex:146 +#, elixir-format msgid "Registrations are not open" msgstr "Las inscripciones no están abiertas" -#, elixir-format #: lib/graphql/resolvers/user.ex:370 +#, elixir-format msgid "The current password is invalid" msgstr "La contraseña actual no es válida" -#, elixir-format #: lib/graphql/resolvers/user.ex:415 +#, elixir-format msgid "The new email doesn't seem to be valid" msgstr "El nuevo correo electrónico no parece ser válido" -#, elixir-format #: lib/graphql/resolvers/user.ex:412 +#, elixir-format msgid "The new email must be different" msgstr "El nuevo correo electrónico debe ser diferente" -#, elixir-format #: lib/graphql/resolvers/user.ex:373 +#, elixir-format msgid "The new password must be different" msgstr "La nueva contraseña debe ser diferente" -#, elixir-format #: lib/graphql/resolvers/user.ex:409 lib/graphql/resolvers/user.ex:467 #: lib/graphql/resolvers/user.ex:470 +#, elixir-format msgid "The password provided is invalid" msgstr "La contraseña proporcionada no es válida" -#, elixir-format #: lib/graphql/resolvers/user.ex:377 +#, elixir-format msgid "The password you have chosen is too short. Please make sure your password contains at least 6 characters." msgstr "" "La contraseña que ha elegido es demasiado corta. Asegúrese de que su " "contraseña contenga al menos 6 caracteres." -#, elixir-format #: lib/graphql/resolvers/user.ex:253 +#, elixir-format msgid "This user can't reset their password" msgstr "Este usuario no puede restablecer su contraseña" -#, elixir-format #: lib/graphql/resolvers/user.ex:76 +#, elixir-format msgid "This user has been disabled" msgstr "Este usuario ha sido inhabilitado" -#, elixir-format #: lib/graphql/resolvers/user.ex:216 +#, elixir-format msgid "Unable to validate user" msgstr "No se puede validar al usuario" -#, elixir-format #: lib/graphql/resolvers/user.ex:448 +#, elixir-format msgid "User already disabled" msgstr "El usuario ya está inhabilitado" -#, elixir-format #: lib/graphql/resolvers/user.ex:515 +#, elixir-format msgid "User requested is not logged-in" msgstr "El usuario solicitado no ha iniciado sesión" -#, elixir-format #: lib/graphql/resolvers/group.ex:240 +#, elixir-format msgid "You are already a member of this group" msgstr "Ya eres miembro de este grupo" -#, elixir-format #: lib/graphql/resolvers/group.ex:273 +#, elixir-format msgid "You can't leave this group because you are the only administrator" msgstr "No puedes dejar este grupo porque eres el único administrador" -#, elixir-format #: lib/graphql/resolvers/group.ex:237 +#, elixir-format msgid "You cannot join this group" msgstr "No puedes unirte a este grupo" -#, elixir-format #: lib/graphql/resolvers/group.ex:96 +#, elixir-format msgid "You may not list groups unless moderator." msgstr "No puedes enumerar grupos a menos que seas moderador." -#, elixir-format #: lib/graphql/resolvers/user.ex:420 +#, elixir-format msgid "You need to be logged-in to change your email" msgstr "Debes iniciar sesión para cambiar tu correo electrónico" -#, elixir-format #: lib/graphql/resolvers/user.ex:385 +#, elixir-format msgid "You need to be logged-in to change your password" msgstr "Debes iniciar sesión para cambiar tu contraseña" -#, elixir-format #: lib/graphql/resolvers/group.ex:215 +#, elixir-format msgid "You need to be logged-in to delete a group" msgstr "Debes iniciar sesión para eliminar un grupo" -#, elixir-format #: lib/graphql/resolvers/user.ex:475 +#, elixir-format msgid "You need to be logged-in to delete your account" msgstr "Debes iniciar sesión para eliminar su cuenta" -#, elixir-format #: lib/graphql/resolvers/group.ex:245 +#, elixir-format msgid "You need to be logged-in to join a group" msgstr "Debes iniciar sesión para eliminar su cuenta" -#, elixir-format #: lib/graphql/resolvers/group.ex:278 +#, elixir-format msgid "You need to be logged-in to leave a group" msgstr "Debes iniciar sesión para dejar un grupo" -#, elixir-format #: lib/graphql/resolvers/group.ex:180 +#, elixir-format msgid "You need to be logged-in to update a group" msgstr "Debes iniciar sesión para actualizar un grupo" -#, elixir-format #: lib/graphql/resolvers/user.ex:105 +#, elixir-format msgid "You need to have an existing token to get a refresh token" msgstr "Debes tener un token existente para obtener un token de actualización" -#, elixir-format #: lib/graphql/resolvers/user.ex:235 lib/graphql/resolvers/user.ex:260 +#, elixir-format msgid "You requested again a confirmation email too soon" msgstr "" "Solicitó de nuevo un correo electrónico de confirmación demasiado pronto" -#, elixir-format #: lib/graphql/resolvers/user.ex:149 +#, elixir-format msgid "Your email is not on the allowlist" msgstr "Tu correo electrónico no está en la lista de permitidos" -#, elixir-format #: lib/graphql/resolvers/actor.ex:67 lib/graphql/resolvers/actor.ex:97 +#, elixir-format msgid "Error while performing background task" msgstr "Error al realizar la tarea en segundo plano" -#, elixir-format #: lib/graphql/resolvers/actor.ex:30 +#, elixir-format msgid "No profile found with this ID" msgstr "No se encontró ningún perfil con este ID" -#, elixir-format #: lib/graphql/resolvers/actor.ex:57 lib/graphql/resolvers/actor.ex:94 +#, elixir-format msgid "No remote profile found with this ID" msgstr "No se encontró ningún perfil remoto con este ID" -#, elixir-format #: lib/graphql/resolvers/actor.ex:72 +#, elixir-format msgid "Only moderators and administrators can suspend a profile" msgstr "Solo los moderadores y administradores pueden suspender un perfil" -#, elixir-format #: lib/graphql/resolvers/actor.ex:102 +#, elixir-format msgid "Only moderators and administrators can unsuspend a profile" msgstr "" "Solo los moderadores y administradores pueden anular la suspensión de un " "perfil" -#, elixir-format #: lib/graphql/resolvers/actor.ex:27 +#, elixir-format msgid "Only remote profiles may be refreshed" msgstr "Solo se pueden actualizar los perfiles remotos" -#, elixir-format #: lib/graphql/resolvers/actor.ex:64 +#, elixir-format msgid "Profile already suspended" msgstr "Perfil ya suspendido" -#, elixir-format #: lib/graphql/resolvers/participant.ex:92 +#, elixir-format msgid "A valid email is required by your instance" msgstr "Su instancia requiere un correo electrónico válido" -#, elixir-format #: lib/graphql/resolvers/participant.ex:86 +#, elixir-format msgid "Anonymous participation is not enabled" msgstr "La participación anónima no está habilitada" -#, elixir-format #: lib/graphql/resolvers/person.ex:196 +#, elixir-format msgid "Cannot remove the last administrator of a group" msgstr "No se puede eliminar al último administrador de un grupo" -#, elixir-format #: lib/graphql/resolvers/person.ex:193 +#, elixir-format msgid "Cannot remove the last identity of a user" msgstr "No se puede eliminar la última identidad de un usuario" -#, elixir-format #: lib/graphql/resolvers/comment.ex:108 +#, elixir-format msgid "Comment is already deleted" msgstr "El comentario ya está eliminado" -#, elixir-format #: lib/graphql/error.ex:93 lib/graphql/resolvers/discussion.ex:62 +#, elixir-format msgid "Discussion not found" msgstr "Discusión no encontrada" -#, elixir-format #: lib/graphql/resolvers/report.ex:58 lib/graphql/resolvers/report.ex:77 +#, elixir-format msgid "Error while saving report" msgstr "Error al guardar el informe" -#, elixir-format #: lib/graphql/resolvers/report.ex:96 +#, elixir-format msgid "Error while updating report" msgstr "Error al actualizar el informe" -#, elixir-format #: lib/graphql/resolvers/participant.ex:127 +#, elixir-format msgid "Event id not found" msgstr "ID de evento no encontrado" -#, elixir-format #: lib/graphql/error.ex:90 lib/graphql/resolvers/event.ex:313 #: lib/graphql/resolvers/event.ex:358 +#, elixir-format msgid "Event not found" msgstr "Evento no encontrado" -#, elixir-format #: lib/graphql/resolvers/participant.ex:83 #: lib/graphql/resolvers/participant.ex:124 lib/graphql/resolvers/participant.ex:156 +#, elixir-format msgid "Event with this ID %{id} doesn't exist" msgstr "El evento con este ID%{id} no existe" -#, elixir-format #: lib/graphql/resolvers/participant.ex:99 +#, elixir-format msgid "Internal Error" msgstr "Error interno" -#, elixir-format #: lib/graphql/resolvers/discussion.ex:202 +#, elixir-format msgid "No discussion with ID %{id}" msgstr "Sin discusión con ID%{id}" -#, elixir-format #: lib/graphql/resolvers/todos.ex:78 lib/graphql/resolvers/todos.ex:168 +#, elixir-format msgid "No profile found for user" msgstr "No se encontró perfil para el usuario" -#, elixir-format #: lib/graphql/resolvers/feed_token.ex:64 +#, elixir-format msgid "No such feed token" msgstr "No existe tal token de alimentación" -#, elixir-format #: lib/graphql/resolvers/participant.ex:237 +#, elixir-format msgid "Participant already has role %{role}" msgstr "El participante ya tiene el rol%{role}" -#, elixir-format #: lib/graphql/resolvers/participant.ex:169 #: lib/graphql/resolvers/participant.ex:198 lib/graphql/resolvers/participant.ex:230 #: lib/graphql/resolvers/participant.ex:240 +#, elixir-format msgid "Participant not found" msgstr "Participante no encontrado" -#, elixir-format #: lib/graphql/resolvers/person.ex:30 +#, elixir-format msgid "Person with ID %{id} not found" msgstr "Persona con ID%{id} no encontrada" -#, elixir-format #: lib/graphql/resolvers/person.ex:52 +#, elixir-format msgid "Person with username %{username} not found" msgstr "Persona con nombre de usuario %{username} no encontrada" -#, elixir-format #: lib/graphql/resolvers/post.ex:169 lib/graphql/resolvers/post.ex:202 +#, elixir-format msgid "Post ID is not a valid ID" msgstr "La ID de publicación no es válida" -#, elixir-format #: lib/graphql/resolvers/post.ex:172 lib/graphql/resolvers/post.ex:205 +#, elixir-format msgid "Post doesn't exist" msgstr "La publicación no existe" -#, elixir-format #: lib/graphql/resolvers/member.ex:83 +#, elixir-format msgid "Profile invited doesn't exist" msgstr "El perfil invitado no existe" -#, elixir-format #: lib/graphql/resolvers/member.ex:92 lib/graphql/resolvers/member.ex:96 +#, elixir-format msgid "Profile is already a member of this group" msgstr "Perfil ya es miembro de este grupo" -#, elixir-format #: lib/graphql/resolvers/post.ex:134 lib/graphql/resolvers/post.ex:175 #: lib/graphql/resolvers/post.ex:208 lib/graphql/resolvers/resource.ex:88 lib/graphql/resolvers/resource.ex:128 #: lib/graphql/resolvers/resource.ex:157 lib/graphql/resolvers/resource.ex:186 lib/graphql/resolvers/todos.ex:57 #: lib/graphql/resolvers/todos.ex:81 lib/graphql/resolvers/todos.ex:99 lib/graphql/resolvers/todos.ex:171 #: lib/graphql/resolvers/todos.ex:194 lib/graphql/resolvers/todos.ex:222 +#, elixir-format msgid "Profile is not member of group" msgstr "El perfil no es miembro del grupo" -#, elixir-format #: lib/graphql/resolvers/person.ex:162 lib/graphql/resolvers/person.ex:190 +#, elixir-format msgid "Profile not found" msgstr "Perfil no encontrado" -#, elixir-format #: lib/graphql/resolvers/report.ex:36 +#, elixir-format msgid "Report not found" msgstr "Informe no encontrado" -#, elixir-format #: lib/graphql/resolvers/resource.ex:154 lib/graphql/resolvers/resource.ex:183 +#, elixir-format msgid "Resource doesn't exist" msgstr "El recurso no existe" -#, elixir-format #: lib/graphql/resolvers/participant.ex:120 +#, elixir-format msgid "The event has already reached its maximum capacity" msgstr "El evento ya alcanzó su capacidad máxima" -#, elixir-format #: lib/graphql/resolvers/participant.ex:260 +#, elixir-format msgid "This token is invalid" msgstr "Este token no es válido" -#, elixir-format #: lib/graphql/resolvers/todos.ex:165 lib/graphql/resolvers/todos.ex:219 +#, elixir-format msgid "Todo doesn't exist" msgstr "Todo no existe" -#, elixir-format #: lib/graphql/resolvers/todos.ex:75 lib/graphql/resolvers/todos.ex:191 #: lib/graphql/resolvers/todos.ex:216 +#, elixir-format msgid "Todo list doesn't exist" msgstr "La lista de tareas pendientes no existe" -#, elixir-format #: lib/graphql/resolvers/feed_token.ex:73 +#, elixir-format msgid "Token does not exist" msgstr "El token no existe" -#, elixir-format #: lib/graphql/resolvers/feed_token.ex:67 lib/graphql/resolvers/feed_token.ex:70 +#, elixir-format msgid "Token is not a valid UUID" msgstr "El token no es un UUID válido" -#, elixir-format #: lib/graphql/error.ex:88 lib/graphql/resolvers/person.ex:356 +#, elixir-format msgid "User not found" msgstr "Usuario no encontrado" -#, elixir-format #: lib/graphql/resolvers/person.ex:257 +#, elixir-format msgid "You already have a profile for this user" msgstr "Ya tienes un perfil para este usuario" -#, elixir-format #: lib/graphql/resolvers/participant.ex:130 +#, elixir-format msgid "You are already a participant of this event" msgstr "Ya eres participante de este evento" -#, elixir-format #: lib/graphql/resolvers/member.ex:86 +#, elixir-format msgid "You are not a member of this group" msgstr "no eres un miembro de este grupo" -#, elixir-format #: lib/graphql/resolvers/member.ex:149 +#, elixir-format msgid "You are not a moderator or admin for this group" msgstr "No eres moderador ni administrador de este grupo" -#, elixir-format #: lib/graphql/resolvers/comment.ex:54 +#, elixir-format msgid "You are not allowed to create a comment if not connected" msgstr "No está permitido crear un comentario si no está conectado" -#, elixir-format #: lib/graphql/resolvers/feed_token.ex:41 +#, elixir-format msgid "You are not allowed to create a feed token if not connected" msgstr "No puede crear un token de feed si no está conectado" -#, elixir-format #: lib/graphql/resolvers/comment.ex:113 +#, elixir-format msgid "You are not allowed to delete a comment if not connected" msgstr "No puede eliminar un comentario si no está conectado" -#, elixir-format #: lib/graphql/resolvers/feed_token.ex:82 +#, elixir-format msgid "You are not allowed to delete a feed token if not connected" msgstr "No puede eliminar un token de feed si no está conectado" -#, elixir-format #: lib/graphql/resolvers/comment.ex:76 +#, elixir-format msgid "You are not allowed to update a comment if not connected" msgstr "No se le permite actualizar un comentario si no está conectado" -#, elixir-format #: lib/graphql/resolvers/participant.ex:163 #: lib/graphql/resolvers/participant.ex:192 +#, elixir-format msgid "You can't leave event because you're the only event creator participant" msgstr "" "No puedes abandonar el evento porque eres el único participante creador del " "evento" -#, elixir-format #: lib/graphql/resolvers/member.ex:153 +#, elixir-format msgid "You can't set yourself to a lower member role for this group because you are the only administrator" msgstr "" "No puede establecerse en un rol de miembro inferior para este grupo porque " "es el único administrador" -#, elixir-format #: lib/graphql/resolvers/comment.ex:104 +#, elixir-format msgid "You cannot delete this comment" msgstr "No puedes borrar este comentario" -#, elixir-format #: lib/graphql/resolvers/event.ex:354 +#, elixir-format msgid "You cannot delete this event" msgstr "No puedes borrar este evento" -#, elixir-format #: lib/graphql/resolvers/member.ex:89 +#, elixir-format msgid "You cannot invite to this group" msgstr "No puedes invitar a este grupo" -#, elixir-format #: lib/graphql/resolvers/feed_token.ex:76 +#, elixir-format msgid "You don't have permission to delete this token" msgstr "No tienes permiso para eliminar este token" -#, elixir-format #: lib/graphql/resolvers/admin.ex:53 +#, elixir-format msgid "You need to be logged-in and a moderator to list action logs" msgstr "" "Debe iniciar sesión y un moderador para enumerar los registros de acción" -#, elixir-format #: lib/graphql/resolvers/report.ex:26 +#, elixir-format msgid "You need to be logged-in and a moderator to list reports" msgstr "Debe iniciar sesión y un moderador para enumerar los informes" -#, elixir-format #: lib/graphql/resolvers/report.ex:101 +#, elixir-format msgid "You need to be logged-in and a moderator to update a report" msgstr "Debe iniciar sesión y ser un moderador para actualizar un informe" -#, elixir-format #: lib/graphql/resolvers/report.ex:41 +#, elixir-format msgid "You need to be logged-in and a moderator to view a report" msgstr "Debe iniciar sesión y ser un moderador para actualizar un informe" -#, elixir-format #: lib/graphql/resolvers/admin.ex:237 +#, elixir-format msgid "You need to be logged-in and an administrator to access admin settings" msgstr "" "Debe iniciar sesión y ser administrador para acceder a la configuración de " "administrador" -#, elixir-format #: lib/graphql/resolvers/admin.ex:222 +#, elixir-format msgid "You need to be logged-in and an administrator to access dashboard statistics" msgstr "" "Debe iniciar sesión y ser administrador para acceder a las estadísticas del " "panel" -#, elixir-format #: lib/graphql/resolvers/admin.ex:261 +#, elixir-format msgid "You need to be logged-in and an administrator to save admin settings" msgstr "" "Debe iniciar sesión y ser administrador para acceder a las estadísticas del " "panel" -#, elixir-format #: lib/graphql/resolvers/discussion.ex:77 +#, elixir-format msgid "You need to be logged-in to access discussions" msgstr "Debe iniciar sesión para acceder a las discusiones" -#, elixir-format #: lib/graphql/resolvers/resource.ex:94 +#, elixir-format msgid "You need to be logged-in to access resources" msgstr "Debes iniciar sesión para acceder a los recursos" -#, elixir-format #: lib/graphql/resolvers/event.ex:283 +#, elixir-format msgid "You need to be logged-in to create events" msgstr "Debes iniciar sesión para crear eventos" -#, elixir-format #: lib/graphql/resolvers/post.ex:142 +#, elixir-format msgid "You need to be logged-in to create posts" msgstr "Debes iniciar sesión para crear publicaciones" -#, elixir-format #: lib/graphql/resolvers/report.ex:74 +#, elixir-format msgid "You need to be logged-in to create reports" msgstr "Debe iniciar sesión para crear informes" -#, elixir-format #: lib/graphql/resolvers/resource.ex:133 +#, elixir-format msgid "You need to be logged-in to create resources" msgstr "Debe iniciar sesión para crear recursos" -#, elixir-format #: lib/graphql/resolvers/event.ex:363 +#, elixir-format msgid "You need to be logged-in to delete an event" msgstr "Debe iniciar sesión para eliminar un evento" -#, elixir-format #: lib/graphql/resolvers/post.ex:213 +#, elixir-format msgid "You need to be logged-in to delete posts" msgstr "Debes iniciar sesión para eliminar publicaciones" -#, elixir-format #: lib/graphql/resolvers/resource.ex:191 +#, elixir-format msgid "You need to be logged-in to delete resources" msgstr "Debes iniciar sesión para eliminar recursos" -#, elixir-format #: lib/graphql/resolvers/participant.ex:104 +#, elixir-format msgid "You need to be logged-in to join an event" msgstr "Debes iniciar sesión para eliminar recursos" -#, elixir-format #: lib/graphql/resolvers/participant.ex:203 +#, elixir-format msgid "You need to be logged-in to leave an event" msgstr "Debes iniciar sesión para salir de un evento" -#, elixir-format #: lib/graphql/resolvers/event.ex:327 +#, elixir-format msgid "You need to be logged-in to update an event" msgstr "Debe iniciar sesión para actualizar un evento" -#, elixir-format #: lib/graphql/resolvers/post.ex:180 +#, elixir-format msgid "You need to be logged-in to update posts" msgstr "Debes iniciar sesión para actualizar las publicaciones" -#, elixir-format #: lib/graphql/resolvers/resource.ex:162 +#, elixir-format msgid "You need to be logged-in to update resources" msgstr "Debes iniciar sesión para actualizar los recursos" -#, elixir-format #: lib/graphql/resolvers/resource.ex:218 +#, elixir-format msgid "You need to be logged-in to view a resource preview" msgstr "Debe iniciar sesión para ver una vista previa del recurso" -#, elixir-format #: lib/graphql/resolvers/resource.ex:125 +#, elixir-format msgid "Parent resource doesn't belong to this group" msgstr "El recurso principal no pertenece a este grupo" -#, elixir-format #: lib/mobilizon/users/user.ex:110 +#, elixir-format msgid "The chosen password is too short." msgstr "La contraseña elegida es demasiado corta." -#, elixir-format #: lib/mobilizon/users/user.ex:139 +#, elixir-format msgid "The registration token is already in use, this looks like an issue on our side." msgstr "" "El token de registro ya está en uso, esto parece un problema de nuestra " "parte." -#, elixir-format #: lib/mobilizon/users/user.ex:105 +#, elixir-format msgid "This email is already used." msgstr "Este correo electrónico ya está en uso." -#, elixir-format #: lib/graphql/error.ex:89 +#, elixir-format msgid "Post not found" msgstr "Informe no encontrado" -#, elixir-format #: lib/graphql/error.ex:76 +#, elixir-format msgid "Invalid arguments passed" msgstr "Se pasaron argumentos no válidos" -#, elixir-format #: lib/graphql/error.ex:82 +#, elixir-format msgid "Invalid credentials" msgstr "Credenciales no válidas" -#, elixir-format #: lib/graphql/error.ex:80 +#, elixir-format msgid "Reset your password to login" msgstr "Restablezca su contraseña para iniciar sesión" -#, elixir-format #: lib/graphql/error.ex:87 lib/graphql/error.ex:92 +#, elixir-format msgid "Resource not found" msgstr "Recurso no encontrado" -#, elixir-format #: lib/graphql/error.ex:94 +#, elixir-format msgid "Something went wrong" msgstr "Algo salió mal" -#, elixir-format #: lib/graphql/error.ex:75 +#, elixir-format msgid "Unknown Resource" msgstr "Recurso desconocido" -#, elixir-format #: lib/graphql/error.ex:85 +#, elixir-format msgid "You don't have permission to do this" msgstr "No tienes permiso para hacer esto" -#, elixir-format #: lib/graphql/error.ex:77 +#, elixir-format msgid "You need to be logged in" msgstr "Debes iniciar sesión" -#, elixir-format #: lib/graphql/resolvers/member.ex:114 +#, elixir-format msgid "You can't accept this invitation with this profile." msgstr "No puedes aceptar esta invitación con este perfil." -#, elixir-format #: lib/graphql/resolvers/member.ex:132 +#, elixir-format msgid "You can't reject this invitation with this profile." msgstr "No puedes rechazar esta invitación con este perfil." -#, elixir-format #: lib/graphql/resolvers/media.ex:72 +#, elixir-format msgid "File doesn't have an allowed MIME type." msgstr "El archivo no tiene un tipo MIME permitido." -#, elixir-format #: lib/graphql/resolvers/group.ex:175 +#, elixir-format msgid "Profile is not administrator for the group" msgstr "El perfil no es miembro del grupo" -#, elixir-format #: lib/graphql/resolvers/event.ex:316 +#, elixir-format msgid "You can't edit this event." msgstr "No puedes borrar este evento." -#, elixir-format #: lib/graphql/resolvers/event.ex:319 +#, elixir-format msgid "You can't attribute this event to this profile." msgstr "No puedes rechazar esta invitación con este perfil." -#, elixir-format #: lib/graphql/resolvers/member.ex:135 +#, elixir-format msgid "This invitation doesn't exist." msgstr "Esta invitación no existe." -#, elixir-format #: lib/graphql/resolvers/member.ex:177 +#, elixir-format msgid "This member already has been rejected." msgstr "Este miembro ya ha sido rechazado." -#, elixir-format #: lib/graphql/resolvers/member.ex:184 +#, elixir-format msgid "You don't have the right to remove this member." msgstr "No tiene derecho a eliminar este miembro." -#, elixir-format #: lib/mobilizon/actors/actor.ex:351 +#, elixir-format msgid "This username is already taken." msgstr "Este nombre de usuario ya está en uso." -#, elixir-format #: lib/graphql/resolvers/discussion.ex:74 +#, elixir-format msgid "You must provide either an ID or a slug to access a discussion" msgstr "" "Debe proporcionar una identificación o un slug para acceder a una discusión" -#, elixir-format #: lib/graphql/resolvers/event.ex:272 +#, elixir-format msgid "Organizer profile is not owned by the user" msgstr "El perfil del organizador no es propiedad del usuario" -#, elixir-format #: lib/graphql/resolvers/participant.ex:89 +#, elixir-format msgid "Profile ID provided is not the anonymous profile one" msgstr "El ID de perfil proporcionado no es el del perfil anónimo" -#, elixir-format #: lib/graphql/resolvers/group.ex:136 lib/graphql/resolvers/group.ex:169 #: lib/graphql/resolvers/person.ex:132 lib/graphql/resolvers/person.ex:159 lib/graphql/resolvers/person.ex:251 +#, elixir-format msgid "The provided picture is too heavy" msgstr "La imagen proporcionada es demasiado pesada" -#, elixir-format #: lib/web/views/utils.ex:33 +#, elixir-format msgid "Index file not found. You need to recompile the front-end." msgstr "No se encontró el archivo de índice. Necesita recompilar el front-end." -#, elixir-format #: lib/graphql/resolvers/resource.ex:122 +#, elixir-format msgid "Error while creating resource" msgstr "Error al crear el recurso" -#, elixir-format #: lib/graphql/resolvers/user.ex:429 +#, elixir-format msgid "Invalid activation token" msgstr "Token de activación no válido" -#, elixir-format #: lib/graphql/resolvers/resource.ex:208 +#, elixir-format msgid "Unable to fetch resource details from this URL." msgstr "No se pueden recuperar los detalles del recurso de esta URL." -#, elixir-format #: lib/graphql/resolvers/event.ex:164 lib/graphql/resolvers/participant.ex:234 +#, elixir-format msgid "Provided profile doesn't have moderator permissions on this event" msgstr "El perfil de moderador proporcionado no tiene permiso para este evento" -#, elixir-format #: lib/graphql/resolvers/event.ex:266 +#, elixir-format msgid "Organizer profile doesn't have permission to create an event on behalf of this group" msgstr "" "El perfil del organizador no tiene permiso para crear un evento en nombre de " "este grupo" -#, elixir-format #: lib/graphql/resolvers/event.ex:307 +#, elixir-format msgid "This profile doesn't have permission to update an event on behalf of this group" msgstr "" "Este perfil no tiene permiso para actualizar un evento en nombre de este " "grupo" -#, elixir-format, fuzzy #: lib/graphql/resolvers/user.ex:153 +#, elixir-format msgid "Your e-mail has been denied registration or uses a disallowed e-mail provider" msgstr "" +"A su correo electrónico se le ha denegado el registro o utiliza un proveedor " +"de correo electrónico no autorizado" From f141660a8cab004eaedf62feff1b81d5f333d5cc Mon Sep 17 00:00:00 2001 From: GunChleoc Date: Mon, 9 Aug 2021 19:57:28 +0000 Subject: [PATCH 134/169] Translated using Weblate (Gaelic) Currently translated at 100.0% (1124 of 1124 strings) Translation: Mobilizon/Frontend Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/gd/ --- js/src/i18n/gd.json | 50 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/js/src/i18n/gd.json b/js/src/i18n/gd.json index 93fa929c6..8ff434846 100644 --- a/js/src/i18n/gd.json +++ b/js/src/i18n/gd.json @@ -17,6 +17,9 @@ "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.": "’S e faidhle beag a th’ ann am briosgaid sa bheil fiosrachadh ’s a thèid a chur dhan choimpiutair agad nuair a thadhlas tu air làrach-lìn. Nuair a thadhlas tu air an làrach-lìn a-rithist, aithnichidh an làrach ud am brabhsair agad leis a’ bhriosgaid. Gabhaidh roghainnean cleachdaiche is fiosrachadh eile a stòradh ann am briosgaid. ’S urrainn dhut am brabhsair agad a rèiteachadh ach an diùlt e gach briosgaid. Gidheadh, dh’fhaoidte nach obraich a h-uile gleus no seirbheis aig làrach-lìn mar bu chòir an uairsin. Obraichidh an stòras ionadail air an aon dòigh ach faodar barrachd dàta a chumail ann.", "A discussion has been created or updated": "Chaidh deasbad a chruthachadh no ùrachadh", "A federated software": "Bathar-bog co-naisgte", + "A fediverse account URL to follow for event updates": "URL cunntais co-shaoghail airson leantainn air naidheachdan tachartais", + "A link to a page presenting the event schedule": "Ceangal gu duilleag a sheallas sgeideal an tachartais", + "A link to a page presenting the price options": "Ceangal gu duilleag a sheallas roghainnean nam prìsean", "A member has been updated": "Chaidh ball ùrachadh", "A member requested to join one of my groups": "Dh’iarr cuideigin ballrachd ann am fear dhe na buidhnean agam", "A new version is available.": "Tha tionndadh ùr ri fhaighinn.", @@ -29,6 +32,7 @@ "A practical tool": "Acainn prataigeach", "A resource has been created or updated": "Chaidh goireas a chruthachadh no ùrachadh", "A short tagline for your instance homepage. Defaults to \"Gather ⋅ Organize ⋅ Mobilize\"": "Seo facal-suaicheantais goirid airson duilleag-dhachaigh an ionstans agad. ’S e “Cruinnich ⋅ Cuir air dòigh ⋅ Iomair” a tha sa bhun-roghainn", + "A twitter account handle to follow for event updates": "Làimhsichear cunntas Twitter airson leantainn air naidheachdan tachartais", "A user-friendly, emancipatory and ethical tool for gathering, organising, and mobilising.": "Inneal saor beusail airson cruinneachadh, cur air dòigh is iomairt a tha furasta cleachdadh.", "A validation email was sent to {email}": "Chaidh post-d dearbhaidh a chur gu {email}", "API": "API", @@ -41,6 +45,7 @@ "About {instance}": "Mu {instance}", "Accept": "Gabh ris", "Accepted": "Air a ghabhail ris", + "Accessibility": "So-ruigsinneachd", "Accessible only to members": "Chan fhaod ach buill inntrigeadh", "Accessible through link": "Gabhaidh inntrigeadh le ceangal", "Account": "Cunntas", @@ -59,6 +64,7 @@ "Add a todo": "Cuir rud ri dhèanamh ris", "Add an address": "Cuir seòladh ris", "Add an instance": "Cuir ionstans ris", + "Add new…": "Cuir fear ùr ris…", "Add some tags": "Cuir tagaichean ris", "Add to my calendar": "Cuir ris a’ mhìosachan agam", "Additional comments": "Beachdan a bharrachd", @@ -71,6 +77,7 @@ "All the places have already been taken": "Chan eil àite saor air fhàgail", "Allow all comments from users with accounts": "Ceadaich a h-uile beachd o chleachdaichean air an clàradh a-steach", "Allow registrations": "Ceadaich clàradh", + "An URL to an external ticketing platform": "URL tu ùrlar ticeadan air an taobh a-muigh", "An error has occured while refreshing the page.": "Thachair mearachd fhad ’s a bha sinn ag ath-nuadhachadh na duilleige.", "An error has occured. Sorry about that. You may try to reload the page.": "Thachair mearachd. Tha sinn duilich mu dhèidhinn. Feuch is ath-luchdaich an duilleag.", "An ethical alternative": "Roghainn bheusail", @@ -113,6 +120,7 @@ "Before you can login, you need to click on the link inside it to validate your account.": "Mus urrainn dhut clàradh a-steach, feumaidh tu briogadh air a’ cheangal ’na broinn gus an cunntas agad a dhearbhadh.", "Begins on": "Tòisichidh e aig", "Bold": "Trom", + "Booking": "Bucadh", "Breadcrumbs": "Breadcrumbs", "Browser notifications": "Brathan a’ bhrabhsair", "By @{group}": "Le @{group}", @@ -222,6 +230,7 @@ "Deleting your Mobilizon account": "A’ sguabadh às an cunntas Mobilizon agad", "Demote": "Ìslich", "Description": "Tuairisgeul", + "Details": "Mion-fhiosrachadh", "Didn't receive the instructions?": "Nach d’fhuair thu an stiùireadh?", "Disabled": "À comas", "Discussions": "Deasbadan", @@ -247,6 +256,8 @@ "Either the account is already validated, either the validation token is incorrect.": "Chaidh an cunntas a dhearbhadh mo thràth no chan eil tòcan an dearbhaidh mar bu chòir.", "Either the email has already been changed, either the validation token is incorrect.": "Chaidh am post-d atharrachadh mu thràth no chan eil tòcan an dearbhaidh mar bu chòir.", "Either the participation request has already been validated, either the validation token is incorrect.": "Chaidh an t-iarrtas air com-pàirteachadh a dhearbhadh mu thràth no chan eil tòcan a’ chom-pàirteachaidh mar bu chòir.", + "Element title": "Tiotal na h-eileamaid", + "Element value": "Luach na h-eileamaid", "Email": "Post-d", "Email address": "Seòladh puist-d", "Email notifications": "Brathan puist-d", @@ -278,6 +289,7 @@ "Event creation": "Cruthachadh tachartais", "Event edition": "Deasachadh tachartais", "Event list": "Liosta nan tachartasan", + "Event metadata": "Meata-dàta an tachartais", "Event page settings": "Roghainnean duilleag an tachartais", "Event to be confirmed": "Tachartas ri dearbhadh", "Event {eventTitle} deleted": "Chaidh an tachartas {eventTitle} a sguabadh às", @@ -294,10 +306,12 @@ "Featured events": "Tachartasan brosnaichte", "Federated Group Name": "Ainm co-naisgte a’ bhuidhinn", "Federation": "Co-nasgadh", + "Fediverse account": "Cunntas co-shaoghail", "Fetch more": "Faigh barrachd dheth", "Find an address": "Lorg seòladh", "Find an instance": "Lorg ionstans", "Find another instance": "Lorg ionstans eile", + "Find or add an element": "Lorg no cuir eileamaid ris", "Follower": "Neach-leantainn", "Followers": "Luchd-leantainn", "Followers will receive new public events and posts.": "Gheibh an luchd-leantainn tachartasan is postaichean poblach.", @@ -306,10 +320,12 @@ "For instance: London, Taekwondo, Architecture…": "Mar eisimpleir: Glaschu, Camanachd, Ailtireachd…", "Forgot your password ?": "Na dhìochuimhnich thu am facal-faire agad?", "Forgot your password?": "Na dhìochuimhnich thu am facal-faire agad?", + "Framadate poll": "Cunntas-bheachd Framadate", "From the {startDate} at {startTime} to the {endDate}": "O {startDate} aig {startTime} gu {endDate}", "From the {startDate} at {startTime} to the {endDate} at {endTime}": "O {startDate} aig {startTime} gu {endDate} aig {endTime}", "From the {startDate} to the {endDate}": "O {startDate} gu {endDate}", "From yourself": "Uat fhèin", + "Fully accessible with a wheelchair": "Gabhaidh a h-uile càil a ruigsinn le cathair-chuibhle", "Gather ⋅ Organize ⋅ Mobilize": "Cruinnich ⋅ Cuir air dòigh ⋅ Iomair", "General": "Coitcheann", "General information": "Fiosrachadh coitcheann", @@ -386,6 +402,7 @@ "Instances": "Ionstansan", "Instances following you": "Na h-ionstansan a tha a’ leantainn ort", "Instances you follow": "Na h-ionstansan air a leanas tu", + "Integrate this event with 3rd-party tools and show metadata for the event.": "Amalaich an tachartas seo le innealan threas-phàrtaidhean is seall meata-dàta dhan tachartas.", "Interact with a remote content": "Dèan conaltradh le susbaint chèin", "Invite a new member": "Thoir cuireadh do bhall ùr", "Invite member": "Thoir cuireadh do bhall", @@ -416,6 +433,7 @@ "License": "Ceadachas", "Limited number of places": "Àiteachan cuingichte", "List title": "Tiotal na liosta", + "Live": "Beò", "Load more": "Luchdaich barrachd dheth", "Load more activities": "Luchdaich barrachd gnìomhachdan", "Loading comments…": "A’ luchdadh nam beachdan…", @@ -515,8 +533,10 @@ "No resources selected": "Chaidh {count} ghoireas a thaghadh|Chaidh {count} ghoireas a thaghadh|Chaidh {count} goireasan a thaghadh|Chaidh {count} goireas a thaghadh", "No resources yet": "Chan eil goireas ann fhathast", "No results for \"{queryText}\"": "Cha deach toradh a lorg airson “{queryText}”", + "No results for {search}": "Cha deach toradh a lorg airson {search}", "No rules defined yet.": "Cha deach riaghailt a mhìneachadh fhathast.", "None": "Chan eil gin", + "Not accessible with a wheelchair": "Cha ghabh a ruigsinn le cathair-chuibhle", "Not approved": "Gun aonta", "Not confirmed": "Gun dearbhadh", "Notes": "Nòtaichean", @@ -537,6 +557,7 @@ "On {date} starting at {startTime}": "{date}, a’ tòiseachadh aig {startTime}", "On {instance}": "Air {instance}", "On {instance} and other federated instances": "Air {instance} agus ionstansan co-naisgte eile", + "Online ticketing": "Ticeadan air loidhne", "Only accessible through link": "Cha ghabh inntrigeadh ach le ceangal", "Only accessible through link (private)": "Cha ghabh inntrigeadh ach le ceangal (prìobhaideach)", "Only accessible to members of the group": "Cha ghabh inntrigeadh ach le buill a’ bhuidhinn", @@ -565,6 +586,7 @@ "Page limited to my group (asks for auth)": "Duilleag cuingichte air a’ bhuidheann agam (thèid dearbhadh iarraidh)", "Page not found": "Cha deach an duilleag a lorg", "Parent folder": "Pasgan pàrant", + "Partially accessible with a wheelchair": "Gabhaidh pàirt dheth a ruigsinn le cathair-chuibhle", "Participant": "Com-pàirtiche", "Participants": "Com-pàirtichean", "Participate": "Gabh pàirt ann", @@ -578,6 +600,8 @@ "Password (confirmation)": "Facal-faire (dearbhadh)", "Password reset": "Ath-shuidheachadh an fhacail-fhaire", "Past events": "Tachartasan a tha seachad mu thràth", + "PeerTube live": "PeerTube beò", + "PeerTube replay": "Ath-chluich PeerTube", "Pending": "Ri dhèiligeadh", "Personal feeds": "Inbhirean pearsanta", "Pick": "Tagh", @@ -601,6 +625,7 @@ "Preferences": "Roghainnean", "Previous": "Air ais", "Previous page": "An duilleag roimhpe", + "Price sheet": "Siota phrìsean", "Privacy Policy": "Poileasaidh prìobhaideachd", "Privacy policy": "Poileasaidh prìobhaideachd", "Private event": "Tachartas prìobhaideach", @@ -646,6 +671,7 @@ "Rename": "Thoir ainm ùr air", "Rename resource": "Thoir ainm ùr air a’ ghoireas", "Reopen": "Ath-fhosgail", + "Replay": "Ath-chluich", "Reply": "Freagair", "Report": "Dèan gearan", "Report #{reportNumber}": "Gearan #{report_number}", @@ -674,6 +700,7 @@ "SSL/TLS": "SSL/TLS", "Save": "Sàbhail", "Save draft": "Sàbhail dreachd", + "Schedule": "Sgeideal", "Search": "Lorg", "Search events, groups, etc.": "Lorg tachartasan, buidhnean is msaa.", "Searching…": "’Ga lorg…", @@ -698,14 +725,17 @@ "Show remaining number of places": "Seall na tha air fhàgail de dh’àiteachan", "Show the time when the event begins": "Seall an t-àm a thòisicheas an tachartas", "Show the time when the event ends": "Seall an t-àm a chrìochnaicheas an tachartas", + "Sign Language": "Cainnt-shanais", "Sign in with": "Clàraich a-steach le", "Sign up": "Clàraich", "Since you are a new member, private content can take a few minutes to appear.": "On a tha thu ’nad bhall ùr, dh’fhaoidte gun doir e greiseag mus nochd susbaint phrìobhaideach.", + "Social": "Sòisealta", "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:": "Tha cuid dhe na faclan a tha ’gan cleachdadh san teacsa gu h-ìosal, co-dhiù an e faclan teicnigeach a th’ annta gus nach e, mu bheachdan a tha caran doirbh a thuigsinn ma dh’fhaoidte. Rinn sinn briathrachan ach am bhiod e na b’ fhasa dhut an tuigsinn:", "Starts on…": "Àm-tòiseachaidh…", "Status": "Staid", "Street": "Sràid", "Submit": "Cuir a-null", + "Subtitles": "Fo-thiotalan", "Suspend": "Cuir à rèim", "Suspend group": "Cuir am buidheann à rèim", "Suspended": "Chaidh a chur à rèim", @@ -716,14 +746,21 @@ "Terms": "Teirmichean", "Terms of service": "Teirmichean na seirbheise", "Text": "Teacsa", + "The URL of a poll where the choice for the event date is happening": "URL cunntais-bheachd le roghainnean cheann-là dhan tachartas", + "The URL where the event can be watched live": "An t-URL far an urrainnear coimhead air an tachartas bheò", + "The URL where the event live can be watched again after it has ended": "An t-URL far an urrainnear coimhead air an tachartas bheò a-rithist às dèidh a thighinn gu crìoch", "The account's email address was changed. Check your emails to verify it.": "Chaidh seòladh puist-d a’ chunntais atharrachadh. Thoir sùil air a’ phost-d agad airson a dhearbhadh.", "The actual number of participants may differ, as this event is hosted on another instance.": "Dh’fhaoidte gu bheil àireamh fhìrinneach nan com-pàirtichean diofraichte on a tha an tachartas seo ’ga òstadh air ionstans eile.", "The content came from another server. Transfer an anonymous copy of the report?": "Thàinig an t-susbaint seo o fhrithealaiche eile. A bheil thu airson lethbhreac gun ainm dhen ghearan a thar-chur?", "The draft event has been updated": "Chaidh dreachd an tachartais ùrachadh", + "The event has a sign language interpreter": "Bidh eadar-theangaiche cainnt-shanais aig an tachartas", "The event has been created as a draft": "Chaidh an tachartas a chruthachadh mar dreachd", "The event has been published": "Chaidh an tachartas fhoillseachadh", "The event has been updated": "Chaidh an tachartas ùrachadh", "The event has been updated and published": "Chaidh an tachartas ùrachadh ’s fhoillseachadh", + "The event hasn't got a sign language interpreter": "Cha bhi eadar-theangaiche cainnt-shanais aig an tachartas", + "The event live video contains subtitles": "Bidh fo-thiotalan aig an tachartas video bheò", + "The event live video does not contain subtitles": "Cha bhi fo-thiotalan aig an tachartas video bheò", "The event organiser has chosen to validate manually participations. Do you want to add a little note to explain why you want to participate to this event?": "Chuir eagraiche an tachartais romhpa gun dearbh iad na com-pàirteachaidhean a làimh.Am bu mhiann leat nòta a chur ris a mhìnicheas carson a tha thu airson gabhail pàirt san tachartas seo?", "The event organizer didn't add any description.": "Cha do chuir eagraiche an tachartais tuairisgeul sam bith ris.", "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.": "Dearbhaidh eagraiche an tachartais romhpa na com-pàirteachaidhean a làimh.On a chuir thu romhad pàirt a ghabhail ann gun chunntas, mìnich carson a bu mhiann leat pàirt a ghabhail san tachartas seo.", @@ -765,6 +802,7 @@ "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.": "Tha dàta nan tachartasan sa bheil gin dhe na pròifilean agad a’ gabhail pàirt no a chruthaich iad sna h-inbhirean seo. Bu chòir dhut an cumail prìobhaideach. Gheibh thu inbhirean do phròifilean sònraichte air duilleag deasachadh gach pròifile.", "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.": "Tha dàta nan tachartasan sa bheil a’ phròifil shònraichte seo a’ gabhail pàirt no a chruthaich iad sna h-inbhirean seo. Bu chòir dhut an cumail prìobhaideach. Gheibh thu inbhirean dhan a h-uile pròifil agad ann an roghainnean nam brathan agad.", "This Mobilizon instance and this event organizer allows anonymous participations, but requires validation through email confirmation.": "Gabhaidh an t-ionstans seo de Mhobilizon agus eagraiche an tachartais seo ri com-pàirteachadh gun ainm ach feumaidh tu a dhearbhadh air a’ phost-d.", + "This URL doesn't seem to be valid": "Chan eil coltas dligheach air an URL seo", "This URL is not supported": "Chan eil taic ris an URL seo", "This event has been cancelled.": "Chaidh an tachartas seo a chur gu neoini.", "This event is accessible only through it's link. Be careful where you post this link.": "Cha ghabh an tachartas seo inntrigeadh ach leis a’ cheangal aige. Thoir an aire mus postaich thu an ceangal seo am badeigin.", @@ -798,8 +836,12 @@ "To register for an event by choosing one of your identities": "Airson clàradh le tachartas le tè dhe na dearbh-aithnean agad", "Today": "An-diugh", "Tomorrow": "A-màireach", + "Tools": "Innealan", "Transfer to {outsideDomain}": "Tar-chur gu {outsideDomain}", "Triggered profile refreshment": "Thèid a’ phròifil ath-nuadhachadh", + "Twitch live": "Twitch beò", + "Twitch replay": "Ath-chluiche Twitch", + "Twitter account": "Cunntas Twitter", "Type": "Seòrsa", "Type or select a date…": "Sgrìobh rudeigin no tagh ceann-latha…", "URL": "URL", @@ -837,6 +879,7 @@ "Username": "Ainm-cleachdaiche", "Users": "Cleachdaichean", "View a reply": "Seall {totalReplies} fhreagairt|Seall {totalReplies} fhreagairt|Seall {totalReplies} freagairtean|Seall {totalReplies} freagairt", + "View account on {hostname} (in a new window)": "Seall an cunntas air {hostname} (ann an uinneag ùr)", "View all": "Seall a h-uile", "View all events": "Seall a h-uile tachartas", "View all posts": "Seall a h-uile post", @@ -867,7 +910,11 @@ "Welcome back!": "Fàilte air ais!", "Welcome to Mobilizon, {username}!": "Fàilte gu Mobilizon, {username}!", "What can I do to help?": "Dè nì mi airson cuideachadh?", + "Wheelchair accessibility": "Inntrigeadh cathrach-cuibhle", "When a moderator from the group creates an event and attributes it to the group, it will show up here.": "Nuair a chruthaicheas maor a’ bhuidhinn tachartas le iomruineadh dhan bhuidheann, nochdaidh e an-seo.", + "Whether the event is accessible with a wheelchair": "Co-dhiù am faighear dhan tachartas le cathair-chuibhle gus nach fhaigh", + "Whether the event is interpreted in sign language": "Co-dhiù am faighear eadar-theangachadh gu cainnt-shanais aig an tachartas gus nach fhaigh", + "Whether the event live video is subtitled": "Co-dhiù am bi fo-thiotalan aig an tachartas gus nach bi", "Who can view this event and participate": "Cò chì an tachartas seo ’s a dh’fhaodas pàirt a ghabhail ann", "Who can view this post": "Cò chì am post seo", "Who published {number} events": "A dh’fhoillsich {number} tachartas", @@ -952,6 +999,8 @@ "You'll need to change the URLs where there were previously entered.": "Feumaidh tu na h-URLaichean atharrachadh far an deach an cur a-steach roimhe.", "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.": "Feumaidh tu URL a’ bhuidhinn a thar-chur ach an urrainn do dhaoine pròifil a’ bhuidhinn inntrigeadh. Cha ghabh am buidheann a lorg le gleus nan lorg aig Mobilizon no le einnseanan-luirg àbhaisteach.", "You'll receive a confirmation email.": "Gheibh thu post-d dearbhaidh.", + "YouTube live": "YouTube beò", + "YouTube replay": "Ath-chluich YouTube", "Your account has been successfully deleted": "Chaidh an cunntas agad a sguabadh às", "Your account has been validated": "Chaidh an cunntas agad a dhearbhadh", "Your account is being validated": "Tha an cunntas agad ’ga dhearbhadh", @@ -992,6 +1041,7 @@ "default Mobilizon privacy policy": "poileasaidh Mhobilizon thùsail", "default Mobilizon terms": "teirmichean Mhobilizon tùsail", "e.g. 10 Rue Jangot": "m.e. 10 Rathad a’ Chidhe", + "e.g. Accessibility, Twitch, PeerTube": "m.e. So-ruigsinneachd, Twitch, PeerTube", "enable the feature": "an gleus a chur an comas", "explore the events": "rùrachadh sna tachartasan", "explore the groups": "rùrachadh sna buidhnean", From 299abd2b598d0bc34e1c10e48b4045fbd4c44328 Mon Sep 17 00:00:00 2001 From: TA Date: Tue, 10 Aug 2021 03:21:17 +0000 Subject: [PATCH 135/169] Translated using Weblate (Indonesian) Currently translated at 61.1% (687 of 1124 strings) Translation: Mobilizon/Frontend Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/id/ --- js/src/i18n/id.json | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/js/src/i18n/id.json b/js/src/i18n/id.json index 6ef4044e2..89610e53c 100644 --- a/js/src/i18n/id.json +++ b/js/src/i18n/id.json @@ -2,10 +2,12 @@ "#{tag}": "#{tag}", "(this folder)": "(folder ini)", "(this link)": "(tautan ini)", + "+ Create a post": "+ Buat sebuah postingan", "+ Create an event": "+ Buat sebuah acara", "@{group}": "@{group}", "@{username}": "@{username}", "@{username} ({role})": "@{username} ({role})", + "A link to a page presenting the event schedule": "Tautan ke halaman yang menunjukkan jadwal acara", "A member has been updated": "Seorang anggota telah diperbarui", "A member requested to join one of my groups": "Seorang anggota ingin bergabung ke salah satu kelompok saya", "A new version is available.": "Versi baru tersedia.", @@ -21,6 +23,7 @@ "About this instance": "Tentang instansi ini", "About {instance}": "Tentang {instance}", "Accept": "Terima", + "Accessibility": "Aksesibilitas", "Account": "Akun", "Activate browser push notifications": "Aktifkan notifikasi push browser", "Activated": "Diaktifkan", @@ -33,6 +36,7 @@ "Add a note": "Tambahkan catatan", "Add an address": "Tambahkan alamat", "Add an instance": "Tambahkan instansi", + "Add new…": "Tambahkan…", "Add some tags": "Tambahkan beberapa tag", "Add to my calendar": "Tambahkan ke kalender saya", "Additional comments": "Komentar tambahan", @@ -151,6 +155,7 @@ "Deleting my account will delete all of my identities.": "Menghapus akun saya akan menghapus semua identitas saya.", "Deleting your Mobilizon account": "Menghapus akun Mobilizon Anda", "Description": "Keterangan", + "Details": "Keterangan", "Didn't receive the instructions?": "Tidak menerima instruksinya?", "Disabled": "Dinonaktifkan", "Discussions": "Diskusi", @@ -163,6 +168,7 @@ "Edit post": "Sunting postingan", "Edit profile {profile}": "Sunting profil {profile}", "Edited {ago}": "Disunting {ago}", + "Edited {relative_time} ago": "Disunting {relative_time} yang lalu", "Eg: Stockholm, Dance, Chess…": "Contoh: Stockholm, Menari, Catur…", "Email": "Surel", "Email address": "Alamat surel", @@ -189,6 +195,7 @@ "Event creation": "Pembuatan acara", "Event edition": "Penyuntingan acara", "Event list": "Daftar acara", + "Event metadata": "Metadata acara", "Event page settings": "Pengaturan halaman acara", "Event {eventTitle} deleted": "Acara {eventTitle} dihapus", "Event {eventTitle} reported": "Acara {eventTitle} dilaporkan", @@ -199,6 +206,7 @@ "Ex: someone@mobilizon.org": "Contoh: seseorang@mobilizon.org", "Explore": "Jelajahi", "Failed to save admin settings": "Gagal menyimpan pengaturan admin", + "Fediverse account": "Akun fediverse", "Find an instance": "Cari instansi", "Find another instance": "Cari instansi lain", "Follower": "Pengikut", @@ -209,6 +217,7 @@ "Forgot your password ?": "Lupa kata sandi Anda ?", "Forgot your password?": "Lupa kata sandi Anda?", "From yourself": "Dari Anda", + "Fully accessible with a wheelchair": "Sepenuhnya dapat diakses dengan kursi roda", "General": "Umum", "General information": "Informasi umum", "Getting location": "Mendapatkan lokasi", @@ -279,6 +288,7 @@ "Legal": "Legal", "Let's define a few settings": "Ayo kita atur beberapa pengaturan", "License": "Lisensi", + "Live": "Siaran Langsung", "Load more": "Muat lebih banyak", "Load more activities": "Muat lebih banyak aktivitas", "Loading comments…": "Memuat komentar…", @@ -292,6 +302,7 @@ "Manage participations": "", "Member": "Anggota", "Members": "Anggota", + "Members-only post": "Postingan hanya-anggota", "Message": "Pesan", "Mobilizon": "Mobilizon", "Mobilizon is a tool that helps you find, create and organise events.": "Mobilizon adalah alat yang membantu Anda untuk mencari, membuat dan menyelenggarakan acara-acara.", @@ -331,8 +342,10 @@ "No participant to reject|Reject participant|Reject {number} participants": "Tidak ada peserta yang perlu ditolak|Tolak peserta|Tolak {number} peserta", "No posts found": "Tak ada postingan yang ditemukan", "No posts yet": "Belum ada postingan", + "No results for {search}": "Tidak ada hasil untuk {search}", "No rules defined yet.": "Belum ada peraturan yang ditetapkan.", "None": "Tidak ada", + "Not accessible with a wheelchair": "Tidak dapat diakses dengan kursi roda", "Not confirmed": "Belum dikonfirmasi", "Notes": "Catatan", "Nothing to see here": "Tidak ada yang perlu dilihat di sini", @@ -368,6 +381,7 @@ "Password": "Kata sandi", "Password (confirmation)": "Kata sandi (konfirmasi)", "Past events": "Acara yang telah lalu", + "PeerTube live": "Siaran langsung PeerTube", "Pending": "Tertunda", "Pick a group": "Pilih kelompok", "Pick an identity": "Pilih identitas", @@ -409,6 +423,7 @@ "Remove": "Hapus", "Rename": "Ubah nama", "Reopen": "Buka kembali", + "Replay": "Siaran Ulang", "Reply": "Balas", "Report": "Laporkan", "Report this comment": "Laporkan komentar ini", @@ -425,6 +440,7 @@ "SSL/TLS": "SSL/TLS", "Save": "Simpan", "Save draft": "Simpan draf", + "Schedule": "Jadwal", "Search": "Cari", "Search events, groups, etc.": "Cari acara, kelompok, dll.", "Searching…": "Mencari…", @@ -444,22 +460,27 @@ "Show map": "Tampilkan peta", "Show the time when the event begins": "Tampilkan waktu acara dimulai", "Show the time when the event ends": "Tampilkan waktu acara berakhir", + "Sign Language": "Bahasa Isyarat", "Sign in with": "Masuk dengan", "Sign up": "Daftar", "Starts on…": "Dimulai pada…", "Status": "Status", "Submit": "Kirim", + "Subtitles": "Subtitel", "Technical details": "Keterangan teknis", "Tentative": "Tentative", "Tentative: Will be confirmed later": "Tentative: Akan dikonfirmasi nanti", "Terms of service": "Persyaratan layanan", "Text": "Teks", + "The URL where the event can be watched live": "URL di mana acara dapat ditonton secara langsung", "The actual number of participants may differ, as this event is hosted on another instance.": "Jumlah asli peserta mungkin berbeda, karena acara ini diselenggarakan instansi lain.", "The draft event has been updated": "Draf acara telah diperbarui", "The event has been created as a draft": "Acara ini telah dibuat sebagai draf", "The event has been published": "Acara ini telah dipublikasikan", "The event has been updated": "Acara ini telah diperbarui", "The event has been updated and published": "Acara ini telah diperbarui dan dipublikasikan", + "The event live video contains subtitles": "Video siaran langsung acara mengandung subtitel", + "The event live video does not contain subtitles": "Video siaran langsung acara tidak mengandung subtitel", "The event organizer didn't add any description.": "Penyelenggara acara tidak menambahkan keterangan.", "The event {event} was created by {profile}.": "Acara {event} dibuat oleh {profile}.", "The event {event} was deleted by {profile}.": "Acara {event} dihapus oleh {profile}.", @@ -483,6 +504,7 @@ "There will be no way to recover your data.": "Tidak akan ada cara untuk memulihkan data Anda.", "These events may interest you": "Acara-acara ini mungkin menarik untuk Anda", "This Mobilizon instance and this event organizer allows anonymous participations, but requires validation through email confirmation.": "Instansi Mobilizon ini dan penyelenggara ini mengizinkan peserta anonim, tetapi membutuhkan validasi melalui konfirmasi surel.", + "This URL doesn't seem to be valid": "URL tidak terlihat valid", "This URL is not supported": "URL ini tidak didukung", "This event has been cancelled.": "Acara ini telah dibatalkan.", "This event is accessible only through it's link. Be careful where you post this link.": "Acara ini hanya dapat diakses melalui tautannya. Berhati-hatilah di mana Anda memposting tautan ini.", @@ -507,6 +529,9 @@ "To create or join an group and start organizing with other people": "Untuk membuat atau bergabung ke suatu kelompok dan mulai menyelenggarakan bersama orang lain", "Today": "Hari Ini", "Tomorrow": "Besok", + "Tools": "Alat", + "Twitch live": "Siaran langsung Twitch", + "Twitter account": "Akun Twitter", "Type": "Jenis", "Type or select a date…": "Ketik atau pilih suatu tanggal…", "URL": "URL", @@ -535,6 +560,7 @@ "User": "Pengguna", "User settings": "Pengaturan pengguna", "View a reply": "|Lihat satu balasan|Lihat {totalReplies} balasan", + "View account on {hostname} (in a new window)": "Lihat akun di {hostname} (di jendela baru)", "View all": "Lihat semua", "View all events": "Lihat semua acara", "View all posts": "Lihat semua postingan", @@ -560,6 +586,9 @@ "Welcome back!": "Selamat datang kembali!", "Welcome to Mobilizon, {username}!": "Selamat datang di Mobilizon, {username}!", "What can I do to help?": "Apa yang dapat saya lakukan untuk membantu?", + "Wheelchair accessibility": "Aksesibilitas kursi roda", + "Whether the event is accessible with a wheelchair": "Apakah acaranya dapat diakses menggunakan kursi roda", + "Whether the event live video is subtitled": "Apakah subtitel tersedia pada video siaran langsung acara", "Who can view this event and participate": "Siapa yang dapat melihat acara ini dan ikut serta", "Who can view this post": "Siapa yang dapat melihat postingan ini", "Who published {number} events": "Yang mempublikasikan {number} acara", @@ -602,6 +631,7 @@ "You were promoted to moderator by {profile}.": "Anda dipromosikan menjadi moderator oleh {profile}.", "You wish to participate to the following event": "Anda ingin ikut serta dalam acara berikut", "You'll receive a confirmation email.": "Anda akan menerima surel konfirmasi.", + "YouTube live": "Siaran langsung YouTube", "Your account has been successfully deleted": "Akun Anda berhasil dihapus", "Your account has been validated": "Akun Anda telah divalidasi", "Your account is being validated": "Akun Anda sedang di validasi", From a6f7c2fb9f656a3e21505212e8caeeaf47e9a71d Mon Sep 17 00:00:00 2001 From: TA Date: Tue, 10 Aug 2021 03:39:49 +0000 Subject: [PATCH 136/169] Translated using Weblate (Indonesian) Currently translated at 7.5% (13 of 172 strings) Translation: Mobilizon/Backend errors Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend-errors/id/ --- priv/gettext/id/LC_MESSAGES/errors.po | 339 +++++++++++++------------- 1 file changed, 173 insertions(+), 166 deletions(-) diff --git a/priv/gettext/id/LC_MESSAGES/errors.po b/priv/gettext/id/LC_MESSAGES/errors.po index edc219d84..62be77ebb 100644 --- a/priv/gettext/id/LC_MESSAGES/errors.po +++ b/priv/gettext/id/LC_MESSAGES/errors.po @@ -8,24 +8,31 @@ ## to merge POT files into PO files. msgid "" msgstr "" +"PO-Revision-Date: 2021-08-11 11:21+0000\n" +"Last-Translator: TA \n" +"Language-Team: Indonesian \n" "Language: id\n" -"Plural-Forms: nplurals=1\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: Weblate 4.6.2\n" +"Content-Transfer-Encoding: 8bit\n" #: lib/mobilizon/discussions/discussion.ex:67 msgid "can't be blank" -msgstr "" +msgstr "tidak boleh kosong" msgid "has already been taken" -msgstr "" +msgstr "sudah diambil" msgid "is invalid" -msgstr "" +msgstr "tidak valid" msgid "must be accepted" msgstr "" msgid "has invalid format" -msgstr "" +msgstr "format tidak valid" msgid "has an invalid entry" msgstr "" @@ -44,7 +51,7 @@ msgstr "" msgid "should be %{count} character(s)" msgid_plural "should be %{count} character(s)" -msgstr[0] "" +msgstr[0] "seharusnya %{count} karakter" msgid "should have %{count} item(s)" msgid_plural "should have %{count} item(s)" @@ -52,7 +59,7 @@ msgstr[0] "" msgid "should be at least %{count} character(s)" msgid_plural "should be at least %{count} character(s)" -msgstr[0] "" +msgstr[0] "seharusnya sekurang-kurangnya %{count} karakter" msgid "should have at least %{count} item(s)" msgid_plural "should have at least %{count} item(s)" @@ -67,789 +74,789 @@ msgid_plural "should have at most %{count} item(s)" msgstr[0] "" msgid "must be less than %{number}" -msgstr "" +msgstr "harus kurang dari %{number}" msgid "must be greater than %{number}" -msgstr "" +msgstr "harus lebih dari %{number}" msgid "must be less than or equal to %{number}" -msgstr "" +msgstr "seharusnya kurang dari atau sama dengan %{number}" msgid "must be greater than or equal to %{number}" -msgstr "" +msgstr "harus lebih dari atau sama dengan %{number}" msgid "must be equal to %{number}" -msgstr "" +msgstr "harus sama dengan %{number}" -#, elixir-format #: lib/graphql/resolvers/user.ex:100 +#, elixir-format msgid "Cannot refresh the token" msgstr "" -#, elixir-format #: lib/graphql/resolvers/group.ex:206 +#, elixir-format msgid "Current profile is not a member of this group" msgstr "" -#, elixir-format #: lib/graphql/resolvers/group.ex:210 +#, elixir-format msgid "Current profile is not an administrator of the selected group" msgstr "" -#, elixir-format #: lib/graphql/resolvers/user.ex:540 +#, elixir-format msgid "Error while saving user settings" msgstr "" -#, elixir-format #: lib/graphql/error.ex:91 lib/graphql/resolvers/group.ex:203 #: lib/graphql/resolvers/group.ex:234 lib/graphql/resolvers/group.ex:269 lib/graphql/resolvers/member.ex:80 +#, elixir-format msgid "Group not found" -msgstr "" +msgstr "Kelompok tidak ditemukan" -#, elixir-format #: lib/graphql/resolvers/group.ex:68 -msgid "Group with ID %{id} not found" -msgstr "" - #, elixir-format +msgid "Group with ID %{id} not found" +msgstr "Kelompok dengan ID %{id} tidak ditemukan" + #: lib/graphql/resolvers/user.ex:80 +#, elixir-format msgid "Impossible to authenticate, either your email or password are invalid." msgstr "" -#, elixir-format #: lib/graphql/resolvers/group.ex:266 +#, elixir-format msgid "Member not found" msgstr "" -#, elixir-format #: lib/graphql/resolvers/actor.ex:61 lib/graphql/resolvers/actor.ex:91 #: lib/graphql/resolvers/user.ex:445 +#, elixir-format msgid "No profile found for the moderator user" msgstr "" -#, elixir-format #: lib/graphql/resolvers/user.ex:232 +#, elixir-format msgid "No user to validate with this email was found" msgstr "" -#, elixir-format #: lib/graphql/resolvers/person.ex:254 lib/graphql/resolvers/user.ex:257 +#, elixir-format msgid "No user with this email was found" msgstr "" -#, elixir-format #: lib/graphql/resolvers/feed_token.ex:28 #: lib/graphql/resolvers/participant.ex:28 lib/graphql/resolvers/participant.ex:159 #: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:165 lib/graphql/resolvers/person.ex:199 #: lib/graphql/resolvers/person.ex:279 lib/graphql/resolvers/person.ex:295 lib/graphql/resolvers/person.ex:323 #: lib/graphql/resolvers/person.ex:340 +#, elixir-format msgid "Profile is not owned by authenticated user" msgstr "" -#, elixir-format #: lib/graphql/resolvers/user.ex:146 +#, elixir-format msgid "Registrations are not open" msgstr "" -#, elixir-format #: lib/graphql/resolvers/user.ex:370 +#, elixir-format msgid "The current password is invalid" msgstr "" -#, elixir-format #: lib/graphql/resolvers/user.ex:415 +#, elixir-format msgid "The new email doesn't seem to be valid" msgstr "" -#, elixir-format #: lib/graphql/resolvers/user.ex:412 +#, elixir-format msgid "The new email must be different" msgstr "" -#, elixir-format #: lib/graphql/resolvers/user.ex:373 +#, elixir-format msgid "The new password must be different" msgstr "" -#, elixir-format #: lib/graphql/resolvers/user.ex:409 lib/graphql/resolvers/user.ex:467 #: lib/graphql/resolvers/user.ex:470 +#, elixir-format msgid "The password provided is invalid" msgstr "" -#, elixir-format #: lib/graphql/resolvers/user.ex:377 +#, elixir-format msgid "The password you have chosen is too short. Please make sure your password contains at least 6 characters." msgstr "" -#, elixir-format #: lib/graphql/resolvers/user.ex:253 +#, elixir-format msgid "This user can't reset their password" msgstr "" -#, elixir-format #: lib/graphql/resolvers/user.ex:76 +#, elixir-format msgid "This user has been disabled" msgstr "" -#, elixir-format #: lib/graphql/resolvers/user.ex:216 +#, elixir-format msgid "Unable to validate user" msgstr "" -#, elixir-format #: lib/graphql/resolvers/user.ex:448 +#, elixir-format msgid "User already disabled" msgstr "" -#, elixir-format #: lib/graphql/resolvers/user.ex:515 +#, elixir-format msgid "User requested is not logged-in" msgstr "" -#, elixir-format #: lib/graphql/resolvers/group.ex:240 +#, elixir-format msgid "You are already a member of this group" msgstr "" -#, elixir-format #: lib/graphql/resolvers/group.ex:273 +#, elixir-format msgid "You can't leave this group because you are the only administrator" msgstr "" -#, elixir-format #: lib/graphql/resolvers/group.ex:237 +#, elixir-format msgid "You cannot join this group" msgstr "" -#, elixir-format #: lib/graphql/resolvers/group.ex:96 +#, elixir-format msgid "You may not list groups unless moderator." msgstr "" -#, elixir-format #: lib/graphql/resolvers/user.ex:420 +#, elixir-format msgid "You need to be logged-in to change your email" msgstr "" -#, elixir-format #: lib/graphql/resolvers/user.ex:385 +#, elixir-format msgid "You need to be logged-in to change your password" msgstr "" -#, elixir-format #: lib/graphql/resolvers/group.ex:215 +#, elixir-format msgid "You need to be logged-in to delete a group" msgstr "" -#, elixir-format #: lib/graphql/resolvers/user.ex:475 +#, elixir-format msgid "You need to be logged-in to delete your account" msgstr "" -#, elixir-format #: lib/graphql/resolvers/group.ex:245 +#, elixir-format msgid "You need to be logged-in to join a group" msgstr "" -#, elixir-format #: lib/graphql/resolvers/group.ex:278 +#, elixir-format msgid "You need to be logged-in to leave a group" msgstr "" -#, elixir-format #: lib/graphql/resolvers/group.ex:180 +#, elixir-format msgid "You need to be logged-in to update a group" msgstr "" -#, elixir-format #: lib/graphql/resolvers/user.ex:105 +#, elixir-format msgid "You need to have an existing token to get a refresh token" msgstr "" -#, elixir-format #: lib/graphql/resolvers/user.ex:235 lib/graphql/resolvers/user.ex:260 +#, elixir-format msgid "You requested again a confirmation email too soon" msgstr "" -#, elixir-format #: lib/graphql/resolvers/user.ex:149 +#, elixir-format msgid "Your email is not on the allowlist" msgstr "" -#, elixir-format #: lib/graphql/resolvers/actor.ex:67 lib/graphql/resolvers/actor.ex:97 +#, elixir-format msgid "Error while performing background task" msgstr "" -#, elixir-format #: lib/graphql/resolvers/actor.ex:30 +#, elixir-format msgid "No profile found with this ID" msgstr "" -#, elixir-format #: lib/graphql/resolvers/actor.ex:57 lib/graphql/resolvers/actor.ex:94 +#, elixir-format msgid "No remote profile found with this ID" msgstr "" -#, elixir-format #: lib/graphql/resolvers/actor.ex:72 +#, elixir-format msgid "Only moderators and administrators can suspend a profile" msgstr "" -#, elixir-format #: lib/graphql/resolvers/actor.ex:102 +#, elixir-format msgid "Only moderators and administrators can unsuspend a profile" msgstr "" -#, elixir-format #: lib/graphql/resolvers/actor.ex:27 +#, elixir-format msgid "Only remote profiles may be refreshed" msgstr "" -#, elixir-format #: lib/graphql/resolvers/actor.ex:64 +#, elixir-format msgid "Profile already suspended" msgstr "" -#, elixir-format #: lib/graphql/resolvers/participant.ex:92 +#, elixir-format msgid "A valid email is required by your instance" msgstr "" -#, elixir-format #: lib/graphql/resolvers/participant.ex:86 +#, elixir-format msgid "Anonymous participation is not enabled" msgstr "" -#, elixir-format #: lib/graphql/resolvers/person.ex:196 +#, elixir-format msgid "Cannot remove the last administrator of a group" msgstr "" -#, elixir-format #: lib/graphql/resolvers/person.ex:193 +#, elixir-format msgid "Cannot remove the last identity of a user" msgstr "" -#, elixir-format #: lib/graphql/resolvers/comment.ex:108 +#, elixir-format msgid "Comment is already deleted" msgstr "" -#, elixir-format #: lib/graphql/error.ex:93 lib/graphql/resolvers/discussion.ex:62 +#, elixir-format msgid "Discussion not found" msgstr "" -#, elixir-format #: lib/graphql/resolvers/report.ex:58 lib/graphql/resolvers/report.ex:77 +#, elixir-format msgid "Error while saving report" msgstr "" -#, elixir-format #: lib/graphql/resolvers/report.ex:96 +#, elixir-format msgid "Error while updating report" msgstr "" -#, elixir-format #: lib/graphql/resolvers/participant.ex:127 +#, elixir-format msgid "Event id not found" msgstr "" -#, elixir-format #: lib/graphql/error.ex:90 lib/graphql/resolvers/event.ex:313 #: lib/graphql/resolvers/event.ex:358 +#, elixir-format msgid "Event not found" msgstr "" -#, elixir-format #: lib/graphql/resolvers/participant.ex:83 #: lib/graphql/resolvers/participant.ex:124 lib/graphql/resolvers/participant.ex:156 +#, elixir-format msgid "Event with this ID %{id} doesn't exist" msgstr "" -#, elixir-format #: lib/graphql/resolvers/participant.ex:99 +#, elixir-format msgid "Internal Error" msgstr "" -#, elixir-format #: lib/graphql/resolvers/discussion.ex:202 +#, elixir-format msgid "No discussion with ID %{id}" msgstr "" -#, elixir-format #: lib/graphql/resolvers/todos.ex:78 lib/graphql/resolvers/todos.ex:168 +#, elixir-format msgid "No profile found for user" msgstr "" -#, elixir-format #: lib/graphql/resolvers/feed_token.ex:64 +#, elixir-format msgid "No such feed token" msgstr "" -#, elixir-format #: lib/graphql/resolvers/participant.ex:237 +#, elixir-format msgid "Participant already has role %{role}" msgstr "" -#, elixir-format #: lib/graphql/resolvers/participant.ex:169 #: lib/graphql/resolvers/participant.ex:198 lib/graphql/resolvers/participant.ex:230 #: lib/graphql/resolvers/participant.ex:240 +#, elixir-format msgid "Participant not found" msgstr "" -#, elixir-format #: lib/graphql/resolvers/person.ex:30 +#, elixir-format msgid "Person with ID %{id} not found" msgstr "" -#, elixir-format #: lib/graphql/resolvers/person.ex:52 +#, elixir-format msgid "Person with username %{username} not found" msgstr "" -#, elixir-format #: lib/graphql/resolvers/post.ex:169 lib/graphql/resolvers/post.ex:202 +#, elixir-format msgid "Post ID is not a valid ID" msgstr "" -#, elixir-format #: lib/graphql/resolvers/post.ex:172 lib/graphql/resolvers/post.ex:205 +#, elixir-format msgid "Post doesn't exist" msgstr "" -#, elixir-format #: lib/graphql/resolvers/member.ex:83 +#, elixir-format msgid "Profile invited doesn't exist" msgstr "" -#, elixir-format #: lib/graphql/resolvers/member.ex:92 lib/graphql/resolvers/member.ex:96 +#, elixir-format msgid "Profile is already a member of this group" msgstr "" -#, elixir-format #: lib/graphql/resolvers/post.ex:134 lib/graphql/resolvers/post.ex:175 #: lib/graphql/resolvers/post.ex:208 lib/graphql/resolvers/resource.ex:88 lib/graphql/resolvers/resource.ex:128 #: lib/graphql/resolvers/resource.ex:157 lib/graphql/resolvers/resource.ex:186 lib/graphql/resolvers/todos.ex:57 #: lib/graphql/resolvers/todos.ex:81 lib/graphql/resolvers/todos.ex:99 lib/graphql/resolvers/todos.ex:171 #: lib/graphql/resolvers/todos.ex:194 lib/graphql/resolvers/todos.ex:222 +#, elixir-format msgid "Profile is not member of group" msgstr "" -#, elixir-format #: lib/graphql/resolvers/person.ex:162 lib/graphql/resolvers/person.ex:190 +#, elixir-format msgid "Profile not found" msgstr "" -#, elixir-format #: lib/graphql/resolvers/report.ex:36 +#, elixir-format msgid "Report not found" msgstr "" -#, elixir-format #: lib/graphql/resolvers/resource.ex:154 lib/graphql/resolvers/resource.ex:183 +#, elixir-format msgid "Resource doesn't exist" msgstr "" -#, elixir-format #: lib/graphql/resolvers/participant.ex:120 +#, elixir-format msgid "The event has already reached its maximum capacity" msgstr "" -#, elixir-format #: lib/graphql/resolvers/participant.ex:260 +#, elixir-format msgid "This token is invalid" msgstr "" -#, elixir-format #: lib/graphql/resolvers/todos.ex:165 lib/graphql/resolvers/todos.ex:219 +#, elixir-format msgid "Todo doesn't exist" msgstr "" -#, elixir-format #: lib/graphql/resolvers/todos.ex:75 lib/graphql/resolvers/todos.ex:191 #: lib/graphql/resolvers/todos.ex:216 +#, elixir-format msgid "Todo list doesn't exist" msgstr "" -#, elixir-format #: lib/graphql/resolvers/feed_token.ex:73 +#, elixir-format msgid "Token does not exist" msgstr "" -#, elixir-format #: lib/graphql/resolvers/feed_token.ex:67 lib/graphql/resolvers/feed_token.ex:70 +#, elixir-format msgid "Token is not a valid UUID" msgstr "" -#, elixir-format #: lib/graphql/error.ex:88 lib/graphql/resolvers/person.ex:356 +#, elixir-format msgid "User not found" msgstr "" -#, elixir-format #: lib/graphql/resolvers/person.ex:257 +#, elixir-format msgid "You already have a profile for this user" msgstr "" -#, elixir-format #: lib/graphql/resolvers/participant.ex:130 +#, elixir-format msgid "You are already a participant of this event" msgstr "" -#, elixir-format #: lib/graphql/resolvers/member.ex:86 +#, elixir-format msgid "You are not a member of this group" msgstr "" -#, elixir-format #: lib/graphql/resolvers/member.ex:149 +#, elixir-format msgid "You are not a moderator or admin for this group" msgstr "" -#, elixir-format #: lib/graphql/resolvers/comment.ex:54 +#, elixir-format msgid "You are not allowed to create a comment if not connected" msgstr "" -#, elixir-format #: lib/graphql/resolvers/feed_token.ex:41 +#, elixir-format msgid "You are not allowed to create a feed token if not connected" msgstr "" -#, elixir-format #: lib/graphql/resolvers/comment.ex:113 +#, elixir-format msgid "You are not allowed to delete a comment if not connected" msgstr "" -#, elixir-format #: lib/graphql/resolvers/feed_token.ex:82 +#, elixir-format msgid "You are not allowed to delete a feed token if not connected" msgstr "" -#, elixir-format #: lib/graphql/resolvers/comment.ex:76 +#, elixir-format msgid "You are not allowed to update a comment if not connected" msgstr "" -#, elixir-format #: lib/graphql/resolvers/participant.ex:163 #: lib/graphql/resolvers/participant.ex:192 +#, elixir-format msgid "You can't leave event because you're the only event creator participant" msgstr "" -#, elixir-format #: lib/graphql/resolvers/member.ex:153 +#, elixir-format msgid "You can't set yourself to a lower member role for this group because you are the only administrator" msgstr "" -#, elixir-format #: lib/graphql/resolvers/comment.ex:104 +#, elixir-format msgid "You cannot delete this comment" msgstr "" -#, elixir-format #: lib/graphql/resolvers/event.ex:354 +#, elixir-format msgid "You cannot delete this event" msgstr "" -#, elixir-format #: lib/graphql/resolvers/member.ex:89 +#, elixir-format msgid "You cannot invite to this group" msgstr "" -#, elixir-format #: lib/graphql/resolvers/feed_token.ex:76 +#, elixir-format msgid "You don't have permission to delete this token" msgstr "" -#, elixir-format #: lib/graphql/resolvers/admin.ex:53 +#, elixir-format msgid "You need to be logged-in and a moderator to list action logs" msgstr "" -#, elixir-format #: lib/graphql/resolvers/report.ex:26 +#, elixir-format msgid "You need to be logged-in and a moderator to list reports" msgstr "" -#, elixir-format #: lib/graphql/resolvers/report.ex:101 +#, elixir-format msgid "You need to be logged-in and a moderator to update a report" msgstr "" -#, elixir-format #: lib/graphql/resolvers/report.ex:41 +#, elixir-format msgid "You need to be logged-in and a moderator to view a report" msgstr "" -#, elixir-format #: lib/graphql/resolvers/admin.ex:237 +#, elixir-format msgid "You need to be logged-in and an administrator to access admin settings" msgstr "" -#, elixir-format #: lib/graphql/resolvers/admin.ex:222 +#, elixir-format msgid "You need to be logged-in and an administrator to access dashboard statistics" msgstr "" -#, elixir-format #: lib/graphql/resolvers/admin.ex:261 +#, elixir-format msgid "You need to be logged-in and an administrator to save admin settings" msgstr "" -#, elixir-format #: lib/graphql/resolvers/discussion.ex:77 +#, elixir-format msgid "You need to be logged-in to access discussions" msgstr "" -#, elixir-format #: lib/graphql/resolvers/resource.ex:94 +#, elixir-format msgid "You need to be logged-in to access resources" msgstr "" -#, elixir-format #: lib/graphql/resolvers/event.ex:283 +#, elixir-format msgid "You need to be logged-in to create events" msgstr "" -#, elixir-format #: lib/graphql/resolvers/post.ex:142 +#, elixir-format msgid "You need to be logged-in to create posts" msgstr "" -#, elixir-format #: lib/graphql/resolvers/report.ex:74 +#, elixir-format msgid "You need to be logged-in to create reports" msgstr "" -#, elixir-format #: lib/graphql/resolvers/resource.ex:133 +#, elixir-format msgid "You need to be logged-in to create resources" msgstr "" -#, elixir-format #: lib/graphql/resolvers/event.ex:363 +#, elixir-format msgid "You need to be logged-in to delete an event" msgstr "" -#, elixir-format #: lib/graphql/resolvers/post.ex:213 +#, elixir-format msgid "You need to be logged-in to delete posts" msgstr "" -#, elixir-format #: lib/graphql/resolvers/resource.ex:191 +#, elixir-format msgid "You need to be logged-in to delete resources" msgstr "" -#, elixir-format #: lib/graphql/resolvers/participant.ex:104 +#, elixir-format msgid "You need to be logged-in to join an event" msgstr "" -#, elixir-format #: lib/graphql/resolvers/participant.ex:203 +#, elixir-format msgid "You need to be logged-in to leave an event" msgstr "" -#, elixir-format #: lib/graphql/resolvers/event.ex:327 +#, elixir-format msgid "You need to be logged-in to update an event" msgstr "" -#, elixir-format #: lib/graphql/resolvers/post.ex:180 +#, elixir-format msgid "You need to be logged-in to update posts" msgstr "" -#, elixir-format #: lib/graphql/resolvers/resource.ex:162 +#, elixir-format msgid "You need to be logged-in to update resources" msgstr "" -#, elixir-format #: lib/graphql/resolvers/resource.ex:218 +#, elixir-format msgid "You need to be logged-in to view a resource preview" msgstr "" -#, elixir-format #: lib/graphql/resolvers/resource.ex:125 +#, elixir-format msgid "Parent resource doesn't belong to this group" msgstr "" -#, elixir-format #: lib/mobilizon/users/user.ex:110 +#, elixir-format msgid "The chosen password is too short." msgstr "" -#, elixir-format #: lib/mobilizon/users/user.ex:139 +#, elixir-format msgid "The registration token is already in use, this looks like an issue on our side." msgstr "" -#, elixir-format #: lib/mobilizon/users/user.ex:105 +#, elixir-format msgid "This email is already used." msgstr "" -#, elixir-format #: lib/graphql/error.ex:89 +#, elixir-format msgid "Post not found" msgstr "" -#, elixir-format #: lib/graphql/error.ex:76 +#, elixir-format msgid "Invalid arguments passed" msgstr "" -#, elixir-format #: lib/graphql/error.ex:82 +#, elixir-format msgid "Invalid credentials" msgstr "" -#, elixir-format #: lib/graphql/error.ex:80 +#, elixir-format msgid "Reset your password to login" msgstr "" -#, elixir-format #: lib/graphql/error.ex:87 lib/graphql/error.ex:92 +#, elixir-format msgid "Resource not found" msgstr "" -#, elixir-format #: lib/graphql/error.ex:94 +#, elixir-format msgid "Something went wrong" msgstr "" -#, elixir-format #: lib/graphql/error.ex:75 +#, elixir-format msgid "Unknown Resource" msgstr "" -#, elixir-format #: lib/graphql/error.ex:85 +#, elixir-format msgid "You don't have permission to do this" msgstr "" -#, elixir-format #: lib/graphql/error.ex:77 +#, elixir-format msgid "You need to be logged in" msgstr "" -#, elixir-format #: lib/graphql/resolvers/member.ex:114 +#, elixir-format msgid "You can't accept this invitation with this profile." msgstr "" -#, elixir-format #: lib/graphql/resolvers/member.ex:132 +#, elixir-format msgid "You can't reject this invitation with this profile." msgstr "" -#, elixir-format #: lib/graphql/resolvers/media.ex:72 +#, elixir-format msgid "File doesn't have an allowed MIME type." msgstr "" -#, elixir-format #: lib/graphql/resolvers/group.ex:175 +#, elixir-format msgid "Profile is not administrator for the group" msgstr "" -#, elixir-format #: lib/graphql/resolvers/event.ex:316 +#, elixir-format msgid "You can't edit this event." msgstr "" -#, elixir-format #: lib/graphql/resolvers/event.ex:319 +#, elixir-format msgid "You can't attribute this event to this profile." msgstr "" -#, elixir-format #: lib/graphql/resolvers/member.ex:135 +#, elixir-format msgid "This invitation doesn't exist." msgstr "" -#, elixir-format #: lib/graphql/resolvers/member.ex:177 +#, elixir-format msgid "This member already has been rejected." msgstr "" -#, elixir-format #: lib/graphql/resolvers/member.ex:184 +#, elixir-format msgid "You don't have the right to remove this member." msgstr "" -#, elixir-format #: lib/mobilizon/actors/actor.ex:351 +#, elixir-format msgid "This username is already taken." msgstr "" -#, elixir-format #: lib/graphql/resolvers/discussion.ex:74 +#, elixir-format msgid "You must provide either an ID or a slug to access a discussion" msgstr "" -#, elixir-format #: lib/graphql/resolvers/event.ex:272 +#, elixir-format msgid "Organizer profile is not owned by the user" msgstr "" -#, elixir-format #: lib/graphql/resolvers/participant.ex:89 +#, elixir-format msgid "Profile ID provided is not the anonymous profile one" msgstr "" -#, elixir-format #: lib/graphql/resolvers/group.ex:136 lib/graphql/resolvers/group.ex:169 #: lib/graphql/resolvers/person.ex:132 lib/graphql/resolvers/person.ex:159 lib/graphql/resolvers/person.ex:251 +#, elixir-format msgid "The provided picture is too heavy" msgstr "" -#, elixir-format #: lib/web/views/utils.ex:33 +#, elixir-format msgid "Index file not found. You need to recompile the front-end." msgstr "" -#, elixir-format #: lib/graphql/resolvers/resource.ex:122 +#, elixir-format msgid "Error while creating resource" msgstr "" -#, elixir-format #: lib/graphql/resolvers/user.ex:429 +#, elixir-format msgid "Invalid activation token" msgstr "" -#, elixir-format #: lib/graphql/resolvers/resource.ex:208 +#, elixir-format msgid "Unable to fetch resource details from this URL." msgstr "" -#, elixir-format #: lib/graphql/resolvers/event.ex:164 lib/graphql/resolvers/participant.ex:234 +#, elixir-format msgid "Provided profile doesn't have moderator permissions on this event" msgstr "" -#, elixir-format #: lib/graphql/resolvers/event.ex:266 +#, elixir-format msgid "Organizer profile doesn't have permission to create an event on behalf of this group" msgstr "" -#, elixir-format #: lib/graphql/resolvers/event.ex:307 +#, elixir-format msgid "This profile doesn't have permission to update an event on behalf of this group" msgstr "" -#, elixir-format, fuzzy #: lib/graphql/resolvers/user.ex:153 +#, elixir-format, fuzzy msgid "Your e-mail has been denied registration or uses a disallowed e-mail provider" msgstr "" From 16c52c3802d9a3bf0fc5bdafbf3f21246edafa56 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Wed, 11 Aug 2021 16:06:30 +0200 Subject: [PATCH 137/169] Fix broken popup warning about changes in event edition Well, partially at least Signed-off-by: Thomas Citharel --- js/src/i18n/fr_FR.json | 2 +- js/src/main.ts | 2 - js/src/types/event.model.ts | 78 ++++++++++++++++++++----------------- js/src/views/Event/Edit.vue | 70 ++++++++++++++++++++------------- 4 files changed, 86 insertions(+), 66 deletions(-) diff --git a/js/src/i18n/fr_FR.json b/js/src/i18n/fr_FR.json index 0615a1480..a4447f023 100644 --- a/js/src/i18n/fr_FR.json +++ b/js/src/i18n/fr_FR.json @@ -99,7 +99,7 @@ "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.": "Êtes-vous certain⋅e de vouloir supprimer cet événement ? Cette action n'est pas réversible. Vous voulez peut-être engager la discussion avec le créateur de l'événement ou bien modifier son événement à la place.", "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.": "Êtes-vous certain·e de vouloir suspendre ce groupe ? Tous les membres - y compris ceux·elles sur d'autres instances - seront notifié·e·s et supprimé·e·s du groupe, et toutes les données associées au groupe (événements, billets, discussions, todos…) seront irrémédiablement détruites.", "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.": "Êtes-vous certain·e de vouloir suspendre ce groupe ? Comme ce groupe provient de l'instance {instance}, cela supprimera seulement les membres locaux et supprimera les données locales, et rejettera également toutes les données futures.", - "Are you sure you want to cancel the event creation? You'll lose all modifications.": "Étes-vous certain⋅e de vouloir annuler la création de l'événement ? Vous allez perdre toutes vos modifications.", + "Are you sure you want to cancel the event creation? You'll lose all modifications.": "Êtes-vous certain⋅e de vouloir annuler la création de l'événement ? Vous allez perdre toutes vos modifications.", "Are you sure you want to cancel the event edition? You'll lose all modifications.": "Êtes-vous certain⋅e de vouloir annuler la modification de l'événement ? Vous allez perdre toutes vos modifications.", "Are you sure you want to cancel your participation at event \"{title}\"?": "Êtes-vous certain⋅e de vouloir annuler votre participation à l'événement « {title} » ?", "Are you sure you want to delete this entire discussion?": "Êtes-vous certain⋅e de vouloir supprimer l'entièreté de cette discussion ?", diff --git a/js/src/main.ts b/js/src/main.ts index 2ace9af59..cae711f1a 100644 --- a/js/src/main.ts +++ b/js/src/main.ts @@ -1,5 +1,3 @@ -// The Vue build version to load with the `import` command -// (runtime-only or standalone) has been set in webpack.base.conf with an alias. import Vue from "vue"; import Buefy from "buefy"; import Component from "vue-class-component"; diff --git a/js/src/types/event.model.ts b/js/src/types/event.model.ts index eb3c02469..c724e0aa3 100644 --- a/js/src/types/event.model.ts +++ b/js/src/types/event.model.ts @@ -203,41 +203,47 @@ export class EventModel implements IEvent { } toEditJSON(): IEventEditJSON { - return { - id: this.id, - title: this.title, - description: this.description, - beginsOn: this.beginsOn.toISOString(), - endsOn: this.endsOn ? this.endsOn.toISOString() : null, - status: this.status, - visibility: this.visibility, - joinOptions: this.joinOptions, - draft: this.draft, - tags: this.tags.map((t) => t.title), - onlineAddress: this.onlineAddress, - phoneAddress: this.phoneAddress, - physicalAddress: this.removeTypeName(this.physicalAddress), - options: this.removeTypeName(this.options), - metadata: this.metadata.map(({ key, value, type, title }) => ({ - key, - value, - type, - title, - })), - attributedToId: - this.attributedTo && this.attributedTo.id ? this.attributedTo.id : null, - contacts: this.contacts.map(({ id }) => ({ - id, - })), - }; - } - - private removeTypeName(entity: any): any { - if (entity?.__typename) { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const { __typename, ...purgedEntity } = entity; - return purgedEntity; - } - return entity; + return toEditJSON(this); } } + +function removeTypeName(entity: any): any { + if (entity?.__typename) { + // eslint-disable-next-line @typescript-eslint/no-unused-vars + const { __typename, ...purgedEntity } = entity; + return purgedEntity; + } + return entity; +} + +export function toEditJSON(event: IEvent): IEventEditJSON { + return { + id: event.id, + title: event.title, + description: event.description, + beginsOn: event.beginsOn.toISOString(), + endsOn: event.endsOn ? event.endsOn.toISOString() : null, + status: event.status, + visibility: event.visibility, + joinOptions: event.joinOptions, + draft: event.draft, + tags: event.tags.map((t) => t.title), + onlineAddress: event.onlineAddress, + phoneAddress: event.phoneAddress, + physicalAddress: removeTypeName(event.physicalAddress), + options: removeTypeName(event.options), + metadata: event.metadata.map(({ key, value, type, title }) => ({ + key, + value, + type, + title, + })), + attributedToId: + event.attributedTo && event.attributedTo.id + ? event.attributedTo.id + : null, + contacts: event.contacts.map(({ id }) => ({ + id, + })), + }; +} diff --git a/js/src/views/Event/Edit.vue b/js/src/views/Event/Edit.vue index eaacac57b..8cb7fdffc 100644 --- a/js/src/views/Event/Edit.vue +++ b/js/src/views/Event/Edit.vue @@ -463,7 +463,7 @@ import FullAddressAutoComplete from "@/components/Event/FullAddressAutoComplete. import EventMetadataList from "@/components/Event/EventMetadataList.vue"; import IdentityPickerWrapper from "@/views/Account/IdentityPickerWrapper.vue"; import Subtitle from "@/components/Utils/Subtitle.vue"; -import { Route } from "vue-router"; +import { RawLocation, Route } from "vue-router"; import { formatList } from "@/utils/i18n"; import { ActorType, @@ -481,7 +481,7 @@ import { EVENT_PERSON_PARTICIPATION, FETCH_EVENT, } from "../../graphql/event"; -import { EventModel, IEvent } from "../../types/event.model"; +import { EventModel, IEvent, toEditJSON } from "../../types/event.model"; import { CURRENT_ACTOR_CLIENT, IDENTITIES, @@ -586,6 +586,8 @@ export default class EditEvent extends Vue { event: IEvent = new EventModel(); + unmodifiedEvent: IEvent = new EventModel(); + identities: IActor[] = []; person!: IPerson; @@ -687,12 +689,13 @@ export default class EditEvent extends Vue { if (!(this.isUpdate || this.isDuplicate)) { this.initializeEvent(); } else { - this.event = { + this.event = new EventModel({ ...this.event, options: cloneDeep(this.event.options), description: this.event.description || "", - }; + }); } + this.unmodifiedEvent = cloneDeep(this.event); } createOrUpdateDraft(e: Event): void { @@ -813,8 +816,8 @@ export default class EditEvent extends Vue { } get updateEventMessage(): string { - // if (this.unmodifiedEvent.draft && !this.event.draft) - // return this.$i18n.t("The event has been updated and published") as string; + if (this.unmodifiedEvent.draft && !this.event.draft) + return this.$i18n.t("The event has been updated and published") as string; return ( this.event.draft ? this.$i18n.t("The draft event has been updated") @@ -910,7 +913,7 @@ export default class EditEvent extends Vue { * Build variables for Event GraphQL creation query */ private async buildVariables() { - let res = new EventModel(this.event).toEditJSON(); + let res = toEditJSON(new EventModel(this.event)); const organizerActor = this.event.organizerActor?.id ? this.event.organizerActor : this.organizerActor; @@ -984,10 +987,12 @@ export default class EditEvent extends Vue { /** * Confirm cancel */ - confirmGoElsewhere(callback: () => any): void { - if (!this.isEventModified) { - callback(); - } + confirmGoElsewhere(): Promise { + // TODO: Make calculation of changes work again and bring this back + // If the event wasn't modified, no need to warn + // if (!this.isEventModified) { + // return Promise.resolve(true); + // } const title: string = this.isUpdate ? (this.$t("Cancel edition") as string) : (this.$t("Cancel creation") as string); @@ -1001,14 +1006,17 @@ export default class EditEvent extends Vue { { title: this.event.title } ) as string); - this.$buefy.dialog.confirm({ - title, - message, - confirmText: this.$t("Abandon editing") as string, - cancelText: this.$t("Continue editing") as string, - type: "is-warning", - hasIcon: true, - onConfirm: callback, + return new Promise((resolve) => { + this.$buefy.dialog.confirm({ + title, + message, + confirmText: this.$t("Abandon editing") as string, + cancelText: this.$t("Continue editing") as string, + type: "is-warning", + hasIcon: true, + onConfirm: () => resolve(true), + onCancel: () => resolve(false), + }); }); } @@ -1016,21 +1024,29 @@ export default class EditEvent extends Vue { * Confirm cancel */ confirmGoBack(): void { - this.confirmGoElsewhere(() => this.$router.go(-1)); + this.$router.go(-1); } // eslint-disable-next-line consistent-return - beforeRouteLeave(to: Route, from: Route, next: () => void): void { + async beforeRouteLeave( + to: Route, + from: Route, + next: (to?: RawLocation | false | ((vm: any) => void)) => void + ): Promise { if (to.name === RouteName.EVENT) return next(); - this.confirmGoElsewhere(() => next()); + if (await this.confirmGoElsewhere()) { + return next(); + } + return next(false); } get isEventModified(): boolean { - // return ( - // JSON.stringify(this.event.toEditJSON()) !== - // JSON.stringify(this.unmodifiedEvent) - // ); - return false; + return ( + this.event && + this.unmodifiedEvent && + JSON.stringify(toEditJSON(this.event)) !== + JSON.stringify(this.unmodifiedEvent) + ); } get beginsOn(): Date { From 70bb3f3dd7317a8722f0028c19088cbef1216a43 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Thu, 12 Aug 2021 10:10:45 +0200 Subject: [PATCH 138/169] Put updated sizes in the upload when resizing Closes #823 Signed-off-by: Thomas Citharel --- lib/web/upload/filter/resize.ex | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/lib/web/upload/filter/resize.ex b/lib/web/upload/filter/resize.ex index 424d578aa..12c34ea7a 100644 --- a/lib/web/upload/filter/resize.ex +++ b/lib/web/upload/filter/resize.ex @@ -6,22 +6,27 @@ defmodule Mobilizon.Web.Upload.Filter.Resize do """ @behaviour Mobilizon.Web.Upload.Filter + alias Mobilizon.Web.Upload @maximum_width 1_920 @maximum_height 1_080 - def filter(%Mobilizon.Web.Upload{ - tempfile: file, - content_type: "image" <> _, - width: width, - height: height - }) do + def filter( + %Upload{ + tempfile: file, + content_type: "image" <> _, + width: width, + height: height + } = upload + ) do + {new_width, new_height} = sizes = limit_sizes({width, height}) + file |> Mogrify.open() - |> Mogrify.resize(string(limit_sizes({width, height}))) + |> Mogrify.resize(string(sizes)) |> Mogrify.save(in_place: true) - {:ok, :filtered} + {:ok, :filtered, %Upload{upload | width: new_width, height: new_height}} end def filter(_), do: {:ok, :noop} From 1280b66f419a92fc04be3e9e61be6c40d5ef08f6 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Thu, 12 Aug 2021 10:11:46 +0200 Subject: [PATCH 139/169] Catch blurhash decoding errors Signed-off-by: Thomas Citharel --- js/src/components/Event/EventBanner.vue | 3 ++- js/src/components/Image/BlurhashImg.vue | 14 +++++++++----- js/src/components/Image/LazyImageWrapper.vue | 3 ++- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/js/src/components/Event/EventBanner.vue b/js/src/components/Event/EventBanner.vue index 1e82f0c38..f2d429ab2 100644 --- a/js/src/components/Event/EventBanner.vue +++ b/js/src/components/Event/EventBanner.vue @@ -5,6 +5,7 @@ diff --git a/js/src/components/Image/BlurhashImg.vue b/js/src/components/Image/BlurhashImg.vue index 9181991a1..a4017a5fc 100644 --- a/js/src/components/Image/BlurhashImg.vue +++ b/js/src/components/Image/BlurhashImg.vue @@ -7,17 +7,21 @@ import { decode } from "blurhash"; import { Component, Prop, Ref, Vue } from "vue-property-decorator"; @Component -export default class extends Vue { +export default class BlurhashImg extends Vue { @Prop({ type: String, required: true }) hash!: string; @Prop({ type: Number, default: 1 }) aspectRatio!: string; @Ref("canvas") readonly canvas!: any; mounted(): void { - const pixels = decode(this.hash, 32, 32); - const imageData = new ImageData(pixels, 32, 32); - const context = this.canvas.getContext("2d"); - context.putImageData(imageData, 0, 0); + try { + const pixels = decode(this.hash, 32, 32); + const imageData = new ImageData(pixels, 32, 32); + const context = this.canvas.getContext("2d"); + context.putImageData(imageData, 0, 0); + } catch (e) { + console.error(e); + } } } diff --git a/js/src/components/Image/LazyImageWrapper.vue b/js/src/components/Image/LazyImageWrapper.vue index af5b43493..1b3e1313a 100644 --- a/js/src/components/Image/LazyImageWrapper.vue +++ b/js/src/components/Image/LazyImageWrapper.vue @@ -9,6 +9,7 @@ From d71e76d6921c4d630e1ec2f53964e664f44962d4 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Fri, 13 Aug 2021 16:56:51 +0200 Subject: [PATCH 151/169] Fix some queries being called even when not logged-in Signed-off-by: Thomas Citharel --- js/src/components/NavBar.vue | 2 +- js/src/views/Event/Event.vue | 1 + js/src/views/Home.vue | 4 +++- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/js/src/components/NavBar.vue b/js/src/components/NavBar.vue index 44a892aef..834de6654 100644 --- a/js/src/components/NavBar.vue +++ b/js/src/components/NavBar.vue @@ -216,7 +216,7 @@ import RouteName from "../router/name"; loggedUser: { query: USER_SETTINGS, skip() { - return this.currentUser.isLoggedIn === false; + return !this.currentUser || this.currentUser.isLoggedIn === false; }, }, }, diff --git a/js/src/views/Event/Event.vue b/js/src/views/Event/Event.vue index 31e4fe785..5ac44b715 100755 --- a/js/src/views/Event/Event.vue +++ b/js/src/views/Event/Event.vue @@ -592,6 +592,7 @@ import { eventMetaDataList } from "../../services/EventMetadata"; }, skip() { return ( + !this.currentActor.id || !this.event?.attributedTo || !this.event?.attributedTo?.preferredUsername ); diff --git a/js/src/views/Home.vue b/js/src/views/Home.vue index fe2110ff9..3aca6994d 100644 --- a/js/src/views/Home.vue +++ b/js/src/views/Home.vue @@ -372,7 +372,9 @@ import Subtitle from "../components/Utils/Subtitle.vue"; currentUser: CURRENT_USER_CLIENT, loggedUser: { query: USER_SETTINGS, - fetchPolicy: "no-cache", + skip() { + return !this.currentUser || this.currentUser.isLoggedIn === false; + }, error() { return null; }, From e781fd5b495e956191d2c2a390af1179bb352e2e Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Fri, 13 Aug 2021 17:00:21 +0200 Subject: [PATCH 152/169] Fix search on 404 page Signed-off-by: Thomas Citharel --- js/src/views/PageNotFound.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/src/views/PageNotFound.vue b/js/src/views/PageNotFound.vue index dc0412ad7..27fab110b 100644 --- a/js/src/views/PageNotFound.vue +++ b/js/src/views/PageNotFound.vue @@ -38,7 +38,7 @@ }}

-
+ Date: Fri, 13 Aug 2021 17:47:26 +0200 Subject: [PATCH 153/169] Fix session issues Close #809 Signed-off-by: Thomas Citharel --- js/src/apollo/utils.ts | 6 ++++++ js/src/types/apollo.ts | 10 --------- js/src/utils/auth.ts | 17 ++++++++------- js/src/vue-apollo.ts | 47 +++++++++++++++++++++++++++++++++++------- 4 files changed, 56 insertions(+), 24 deletions(-) delete mode 100644 js/src/types/apollo.ts diff --git a/js/src/apollo/utils.ts b/js/src/apollo/utils.ts index d47680ba5..84ba969e9 100644 --- a/js/src/apollo/utils.ts +++ b/js/src/apollo/utils.ts @@ -104,6 +104,11 @@ export async function refreshAccessToken( const refreshToken = localStorage.getItem(AUTH_REFRESH_TOKEN); + if (!refreshToken) { + console.debug("Refresh token not found"); + return false; + } + console.log("Refreshing access token."); try { @@ -118,6 +123,7 @@ export async function refreshAccessToken( return true; } catch (err) { + console.debug("Failed to refresh token"); return false; } } diff --git a/js/src/types/apollo.ts b/js/src/types/apollo.ts deleted file mode 100644 index da8b84b34..000000000 --- a/js/src/types/apollo.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { ServerParseError } from "@apollo/client/link/http"; -import { ServerError } from "@apollo/client/link/utils"; - -function isServerError( - err: Error | ServerError | ServerParseError | undefined -): err is ServerError { - return !!err && (err as ServerError).statusCode !== undefined; -} - -export { isServerError }; diff --git a/js/src/utils/auth.ts b/js/src/utils/auth.ts index 2feb49244..4c61a87a5 100644 --- a/js/src/utils/auth.ts +++ b/js/src/utils/auth.ts @@ -95,14 +95,17 @@ export async function initializeCurrentActor( } export async function logout( - apollo: ApolloClient + apollo: ApolloClient, + performServerLogout = true ): Promise { - await apollo.mutate({ - mutation: LOGOUT, - variables: { - refreshToken: localStorage.getItem(AUTH_REFRESH_TOKEN), - }, - }); + if (performServerLogout) { + await apollo.mutate({ + mutation: LOGOUT, + variables: { + refreshToken: localStorage.getItem(AUTH_REFRESH_TOKEN), + }, + }); + } await apollo.mutate({ mutation: UPDATE_CURRENT_USER_CLIENT, diff --git a/js/src/vue-apollo.ts b/js/src/vue-apollo.ts index 9b1a7714c..abfa694f6 100644 --- a/js/src/vue-apollo.ts +++ b/js/src/vue-apollo.ts @@ -11,8 +11,8 @@ import { NormalizedCacheObject, split, } from "@apollo/client/core"; +import { RetryLink } from "@apollo/client/link/retry"; import buildCurrentUserResolver from "@/apollo/user"; -import { isServerError } from "@/types/apollo"; import { AUTH_ACCESS_TOKEN } from "@/constants"; import { logout } from "@/utils/auth"; import { Socket as PhoenixSocket } from "phoenix"; @@ -61,9 +61,17 @@ const authMiddleware = new ApolloLink((operation, forward) => { return null; }); +const customFetch = async (uri: string, options: any) => { + const response = await fetch(uri, options); + if (response.status >= 400) { + return Promise.reject(response.status); + } + return response; +}; + const uploadLink = createLink({ uri: httpEndpoint, - fetch, + fetch: customFetch, }); const phoenixSocket = new PhoenixSocket(wsEndpoint, { @@ -97,17 +105,35 @@ const resolvePendingRequests = () => { pendingRequests = []; }; +const isAuthError = (graphQLError: GraphQLError | undefined) => { + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + return graphQLError && [403, 401].includes(graphQLError.status_code); +}; + const errorLink = onError( ({ graphQLErrors, networkError, forward, operation }) => { - if (isServerError(networkError) && networkError?.statusCode === 401) { + console.debug("We have an apollo error", [graphQLErrors, networkError]); + if ( + graphQLErrors?.some((graphQLError) => isAuthError(graphQLError)) || + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + networkError === 401 + ) { + console.debug("It's a authorization error (statusCode 401)"); let forwardOperation; if (!isRefreshing) { + console.debug("Setting isRefreshing to true"); isRefreshing = true; forwardOperation = fromPromise( refreshAccessToken(apolloClient) - .then(() => { + .then((res) => { + if (res !== true) { + // failed to refresh the token + throw "Failed to refresh the token"; + } resolvePendingRequests(); const context = operation.getContext(); @@ -121,9 +147,11 @@ const errorLink = onError( }); return true; }) - .catch(() => { + .catch((e) => { + console.debug("Something failed, let's logout", e); pendingRequests = []; - logout(apolloClient); + // don't perform a logout since we don't have any working access/refresh tokens + logout(apolloClient, false); return; }) .finally(() => { @@ -161,7 +189,12 @@ const errorLink = onError( } ); -const fullLink = authMiddleware.concat(errorLink).concat(link); +const retryLink = new RetryLink(); + +const fullLink = authMiddleware + .concat(retryLink) + .concat(errorLink) + .concat(link); const cache = new InMemoryCache({ addTypename: true, From cc029a52f944f7d3cb5015a4534a4f93050bc9ea Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Fri, 13 Aug 2021 17:57:22 +0200 Subject: [PATCH 154/169] Make the number of events fit the page on Explore Close #826 Signed-off-by: Thomas Citharel --- js/src/views/Search.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/src/views/Search.vue b/js/src/views/Search.vue index 5dda05424..5f2eb36e8 100644 --- a/js/src/views/Search.vue +++ b/js/src/views/Search.vue @@ -212,9 +212,9 @@ interface ISearchTimeOption { end?: Date | null; } -const EVENT_PAGE_LIMIT = 10; +const EVENT_PAGE_LIMIT = 12; -const GROUP_PAGE_LIMIT = 10; +const GROUP_PAGE_LIMIT = 12; const DEFAULT_RADIUS = 25; // value to set if radius is null but location set From 23b8da2085f6250ca66f3f07d2f385a15358a881 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Fri, 13 Aug 2021 18:04:37 +0200 Subject: [PATCH 155/169] Add link from homepage last published events section to search page Signed-off-by: Thomas Citharel --- js/src/views/Home.vue | 44 ++++++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/js/src/views/Home.vue b/js/src/views/Home.vue index 3aca6994d..00f54da48 100644 --- a/js/src/views/Home.vue +++ b/js/src/views/Home.vue @@ -62,14 +62,21 @@

-
-
- +
+
+
+ +
+ + {{ $t("View everything") }} >> +
{{ $t("No events found") @@ -308,14 +315,21 @@

-
-
- +
+
+
+ +
+ + {{ $t("View everything") }} >> +
{{ $t("No events found") }}
@@ -635,7 +649,7 @@ main > div > .container { } .columns { - margin: 1rem auto 3rem; + margin: 1rem auto 0; } } From ca12e65731e9394faf917d8d110ea973d4658b73 Mon Sep 17 00:00:00 2001 From: Berto Te Date: Fri, 13 Aug 2021 11:48:33 +0000 Subject: [PATCH 156/169] Translated using Weblate (Spanish) Currently translated at 100.0% (1130 of 1130 strings) Translation: Mobilizon/Frontend Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/es/ --- js/src/i18n/es.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/js/src/i18n/es.json b/js/src/i18n/es.json index 80566448b..03b17b207 100644 --- a/js/src/i18n/es.json +++ b/js/src/i18n/es.json @@ -820,6 +820,7 @@ "Share this group": "Comparte este grupo", "Short bio": "Breve biografía", "Show map": "Mostrar mapa", + "Show me where I am": "Muéstrame donde estoy", "Show remaining number of places": "Muestra el número restante de plazas", "Show the time when the event begins": "Muestra la hora en que comienza el evento", "Show the time when the event ends": "Muestra la hora en que finaliza el evento", @@ -1180,6 +1181,8 @@ "Your timezone was detected as {timezone}.": "Su zona horaria se detectó como {timezone}.", "Your timezone {timezone} isn't supported.": "Tu zona horaria {timezone} no es compatible.", "Your upcoming events": "Tus próximos eventos", + "Zoom in": "Zoom adelante", + "Zoom out": "Zoom atras", "[This comment has been deleted by it's author]": "[Este comentario ha sido borrado por su autor]", "[This comment has been deleted]": "[Este comentario ha sido eliminado]", "[deleted]": "[eliminado]", From b0d1e6d18f02516a96880b2520882a88435c9b0c Mon Sep 17 00:00:00 2001 From: deadmorose Date: Thu, 12 Aug 2021 18:28:50 +0000 Subject: [PATCH 157/169] Translated using Weblate (Russian) Currently translated at 100.0% (1130 of 1130 strings) Translation: Mobilizon/Frontend Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/ru/ --- js/src/i18n/ru.json | 61 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/js/src/i18n/ru.json b/js/src/i18n/ru.json index 66e463306..70b19b1f1 100644 --- a/js/src/i18n/ru.json +++ b/js/src/i18n/ru.json @@ -4,6 +4,7 @@ "(this folder)": "(эта папка)", "(this link)": "(эта ссылка)", "+ Add a resource": "+ Добавить ресурс", + "+ Create a post": "+ Создать пост", "+ Create an event": "+ Создать мероприятие", "+ Post a public message": "+ Опубликовать публичное сообщение", "+ Start a discussion": "+ Начать обсуждение", @@ -16,6 +17,9 @@ "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 discussion has been created or updated": "Обсуждение было создано или обновлено", "A federated software": "Федеративное программное обеспечение", + "A fediverse account URL to follow for event updates": "URL-адрес учетной записи fediverse, для отслеживания изменений в мероприятиях", + "A link to a page presenting the event schedule": "Ссылка на расписание мероприятий", + "A link to a page presenting the price options": "Ссылка на прайслист", "A member has been updated": "Участник обновлён", "A member requested to join one of my groups": "Участник попросил присоединиться к одной из моих групп", "A new version is available.": "Доступна новая версия.", @@ -28,6 +32,7 @@ "A practical tool": "Удобный инструмент", "A resource has been created or updated": "Ресурс был создан или обновлён", "A short tagline for your instance homepage. Defaults to \"Gather ⋅ Organize ⋅ Mobilize\"": "Короткий слоган для домашней страницы вашего узла. По умолчанию: \"Собирать ⋅ Организовывать ⋅ Мобилизовывать\"", + "A twitter account handle to follow for event updates": "Идентификатор учетной записи Twitter, для слежения за обновлениями мероприятий", "A user-friendly, emancipatory and ethical tool for gathering, organising, and mobilising.": "Удобный, свободный и этичный инструмент для объединения, организации и мобилизации.", "A validation email was sent to {email}": "Письмо с подтверждением было отправлено на адрес {email}", "API": "API", @@ -40,6 +45,7 @@ "About {instance}": "О {instance}", "Accept": "Принять", "Accepted": "Принято", + "Accessibility": "Доступность", "Accessible only to members": "Доступно только участникам", "Accessible through link": "Доступно по ссылке", "Account": "Учётная запись", @@ -59,6 +65,7 @@ "Add a todo": "Добавить в список задач", "Add an address": "Добавить адрес", "Add an instance": "Добавить узел", + "Add new…": "Добавить новый…", "Add some tags": "Добавить теги", "Add to my calendar": "Добавить в мой календарь", "Additional comments": "Дополнительные комментарии", @@ -71,6 +78,7 @@ "All the places have already been taken": "Все места уже заняты", "Allow all comments from users with accounts": "Разрешить все комментарии от авторизованных пользователей", "Allow registrations": "Разрешить регистрацию", + "An URL to an external ticketing platform": "URL-адрес внешней платформы продажи билетов", "An error has occured while refreshing the page.": "Произошла ошибка при обновлении страницы.", "An error has occured. Sorry about that. You may try to reload the page.": "Произошла ошибка. Приносим вам тысячу извинений. Вы можете попробовать перезагрузить страницу.", "An ethical alternative": "Этичная альтернатива", @@ -113,6 +121,7 @@ "Before you can login, you need to click on the link inside it to validate your account.": "Перед тем как войти в систему, вы должны перейти по указанной в письме ссылке, чтобы подтвердить свою учетную запись.", "Begins on": "Начало", "Bold": "Жирный", + "Booking": "Бронирование", "Breadcrumbs": "Хлебные крошки", "Browser notifications": "Уведомления в браузере", "By @{group}": "Из @{group}", @@ -222,6 +231,7 @@ "Deleting your Mobilizon account": "Удаление моей учётной записи Mobilizon", "Demote": "Понизить", "Description": "Описание", + "Details": "Подробности", "Didn't receive the instructions?": "Не получили инструкции?", "Disabled": "Отключено", "Discussions": "Обсуждения", @@ -241,11 +251,14 @@ "Edit post": "Редактировать пост", "Edit profile {profile}": "Редактировать профиль {profile}", "Edited {ago}": "Изменено {ago}", + "Edited {relative_time} ago": "Изменено {relative_time} назад", "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.": "Заявка на участие уже подтверждена или проверочный токен недействителен.", + "Element title": "Название элемента", + "Element value": "Значение элемента", "Email": "Электронная почта", "Email address": "Адрес электронной почты", "Email notifications": "Уведомления по электронной почте", @@ -277,6 +290,7 @@ "Event creation": "Создание мероприятия", "Event edition": "Редактирования мероприятия", "Event list": "Список мероприятий", + "Event metadata": "Метаданные мероприятия", "Event page settings": "Настройки страницы мероприятия", "Event to be confirmed": "Мероприятие должно быть подтверждено", "Event {eventTitle} deleted": "Мероприятие {eventTitle} удалено", @@ -293,10 +307,14 @@ "Featured events": "Избранные мероприятия", "Federated Group Name": "Имя федеративной группы", "Federation": "Федерализация", + "Fediverse account": "Аккаунт Fediverse", "Fetch more": "Загрузить больше", + "Filter by name": "Фильтр по имени", + "Filter by profile or group name": "Фильтр по профилю или названию группы", "Find an address": "Найти адрес", "Find an instance": "Найти узел", "Find another instance": "Найти другой узел", + "Find or add an element": "Найти или добавить элемент", "Follower": "Подписчик", "Followers": "Подписчики", "Followers will receive new public events and posts.": "Подписчики будут оповещены о новых публичных мероприятиях и публикациях.", @@ -305,10 +323,12 @@ "For instance: London, Taekwondo, Architecture…": "Например: Москва, йога, архитектура…", "Forgot your password ?": "Забыли свой пароль?", "Forgot your password?": "Забыли свой пароль?", + "Framadate poll": "Опрос Framadate", "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": "От себя", + "Fully accessible with a wheelchair": "Полностью доступно для инвалидов-колясочников", "Gather ⋅ Organize ⋅ Mobilize": "Объединять ⋅ Организовывать ⋅ Мобилизовывать", "General": "Общая", "General information": "Общая информация", @@ -385,6 +405,7 @@ "Instances": "Узлы", "Instances following you": "Узлы, подписанные на вас", "Instances you follow": "Узлы, на которые вы подписаны", + "Integrate this event with 3rd-party tools and show metadata for the event.": "Интегрировать это мероприятие со сторонними сервисами и просмотреть его метаданные.", "Interact with a remote content": "Взаимодействовать с удаленным контентом", "Invite a new member": "Пригласить нового участника", "Invite member": "Пригласить участника", @@ -415,6 +436,7 @@ "License": "Лицензия", "Limited number of places": "Ограниченное количество мест", "List title": "Заголовок списка", + "Live": "Живой", "Load more": "Загрузить больше", "Load more activities": "Загрузить больше действий", "Loading comments…": "Загрузка комментариев…", @@ -434,6 +456,7 @@ "Mark as resolved": "Отметить как решённое", "Member": "Участник", "Members": "Участники", + "Members-only post": "Пост только для участников", "Mentions": "Упоминания", "Message": "Сообщение", "Mobilizon": "Mobilizon", @@ -513,8 +536,10 @@ "No resources selected": "Ресурсы не выбраны|Выбран один ресурс|Выбрано {count} ресурсов", "No resources yet": "Ресурсов пока нет", "No results for \"{queryText}\"": "Нет результатов по запросу \"{queryText}\"", + "No results for {search}": "Нет результатов по запросу {search}", "No rules defined yet.": "Правила еще не определены.", "None": "Никто", + "Not accessible with a wheelchair": "Не доступно для инвалидов-колясочников", "Not approved": "Не одобрено", "Not confirmed": "Не подтверждено", "Notes": "Примечания", @@ -535,11 +560,13 @@ "On {date} starting at {startTime}": "{date}, начало в {startTime}", "On {instance}": "На {instance}", "On {instance} and other federated instances": "В {instance} и других федеративных узлах", + "Online ticketing": "Продажа билетов онлайн", "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 events.": "Только модераторы группы могут создавать, редактировать и удалять мероприятия.", "Only group moderators can create, edit and delete posts.": "Только модераторы группы могут создавать, редактировать и удалять публикации.", "Open": "Открыто", "Open a topic on our forum": "Откройте тему на нашем форуме", @@ -562,6 +589,7 @@ "Page limited to my group (asks for auth)": "Страница предназначена только для моей группы (требуется авторизация)", "Page not found": "Страница не найдена", "Parent folder": "Родительская папка", + "Partially accessible with a wheelchair": "Частично доступно для инвалидов-колясочников", "Participant": "Участник", "Participants": "Участники", "Participate": "Принять участие", @@ -575,6 +603,8 @@ "Password (confirmation)": "Пароль (подтверждение)", "Password reset": "Сброс пароля", "Past events": "Прошедшие мероприятия", + "PeerTube live": "Стрим на PeerTube", + "PeerTube replay": "Воспроизведение на PeerTube", "Pending": "В ожидании", "Personal feeds": "Личные ленты", "Pick": "Выбрать", @@ -598,6 +628,7 @@ "Preferences": "Персональные настройки", "Previous": "Предыдущий", "Previous page": "Предыдущая страница", + "Price sheet": "Прайс лист", "Privacy Policy": "Политика конфиденциальности", "Privacy policy": "Политика конфиденциальности", "Private event": "Приватное мероприятие", @@ -624,6 +655,7 @@ "Recap every week": "Подводить итоги каждую неделю", "Receive one email for each activity": "Получать одно электронное письмо для каждого действия", "Receive one email per request": "Получать электронное письмо на каждый запрос", + "Redirecting in progress…": "Выполняется перенаправление…", "Redirecting to content…": "Перенаправление к содержимому…", "Refresh profile": "Обновить профиль", "Regenerate new links": "Восстановить новые ссылки", @@ -643,6 +675,7 @@ "Rename": "Переименовать", "Rename resource": "Переименовать ресурс", "Reopen": "Открыть заново", + "Replay": "Воспроизвести", "Reply": "Ответ", "Report": "Жалоба", "Report #{reportNumber}": "Отчёт #{reportNumber}", @@ -671,6 +704,7 @@ "SSL/TLS": "SSL/TLS", "Save": "Сохранить", "Save draft": "Сохранить черновик", + "Schedule": "Расписание", "Search": "Поиск", "Search events, groups, etc.": "Искать мероприятия, группы и т. п.", "Searching…": "Поиск…", @@ -692,17 +726,21 @@ "Share this group": "Поделиться этой группой", "Short bio": "Коротко о себе", "Show map": "Показать карту", + "Show me where I am": "Показать моё местоположение", "Show remaining number of places": "Показать оставшееся количество мест", "Show the time when the event begins": "Показать время начала мероприятия", "Show the time when the event ends": "Показать время окончания мероприятия", + "Sign Language": "Сурдоперевод", "Sign in with": "Войти в систему с", "Sign up": "Зарегистрироваться", "Since you are a new member, private content can take a few minutes to appear.": "Поскольку вы новый участник, может потребоваться несколько минут, чтобы приватный контент стал видимым.", + "Social": "Социальный", "Some terms, technical or otherwise, used in the text below may cover concepts that are difficult to grasp. We have provided a glossary here to help you understand them better:": "Некоторые термины, технические или иные, используемые в приведенном ниже тексте, могут охватывать трудные для понимания концепции. Мы подготовили глоссарий чтобы помочь вам лучше их освоить:", "Starts on…": "Начало…", "Status": "Статус", "Street": "Улица", "Submit": "Отправить", + "Subtitles": "Субтитры", "Suspend": "Заблокировать", "Suspend group": "Заблокировать группу", "Suspended": "Приостановлен", @@ -713,14 +751,21 @@ "Terms": "Условия", "Terms of service": "Условия обслуживания", "Text": "Текст", + "The URL of a poll where the choice for the event date is happening": "URL-адрес опроса, в котором происходит выбор даты мероприятия", + "The URL where the event can be watched live": "URL-адрес, по которому мероприятие можно посмотреть в прямом эфире", + "The URL where the event live can be watched again after it has ended": "URL-адрес, по которому событие транслируется в прямом эфире, можно будет просмотреть снова после его завершения", "The account's email address was changed. Check your emails to verify it.": "Почтовый адрес аккаунта был изменён. Проверьте свою электронную почту, чтобы убедиться в этом.", "The actual number of participants may differ, as this event is hosted on another instance.": "Фактическое количество участников может отличаться, так как это мероприятие проводится на другом узле.", "The content came from another server. Transfer an anonymous copy of the report?": "Контент пришел с другого сервера. Переслать анонимную копию отчета?", "The draft event has been updated": "Черновик мероприятия обновлён", + "The event has a sign language interpreter": "На мероприятии есть сурдопереводчик", "The event has been created as a draft": "Мероприятие было создано в виде черновика", "The event has been published": "Мероприятие опубликовано", "The event has been updated": "Мероприятие обновлено", "The event has been updated and published": "Мероприятие обновлено и опубликовано", + "The event hasn't got a sign language interpreter": "На мероприятии нет сурдопреводчика", + "The event live video contains subtitles": "Прямая трансляция мероприятия содержит субтитры", + "The event live video does not contain subtitles": "Прямая трансляция мероприятия не содержит субтитров", "The event organiser has chosen to validate manually participations. Do you want to add a little note to explain why you want to participate to this event?": "Организатор мероприятия решил подтверждать участие вручную. Хотели бы вы добавить короткую заметку, объясняющую, почему вы хотите участвовать в этом мероприятии?", "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.": "Организатор мероприятия утверждает участие вручную. Поскольку вы выбрали участие без учётной записи, объясните, почему вы хотите участвовать в этом мероприятии.", @@ -762,6 +807,7 @@ "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 doesn't seem to be valid": "Этот URL-адрес кажется недействительным", "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.": "Это мероприятие доступно только по ссылке. Будьте осторожны, когда публикуете её.", @@ -777,6 +823,7 @@ "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 post is accessible only for members. You have access to it for moderation purposes only because you are an instance moderator.": "Этот пост доступен только для участников. У вас есть доступ к нему для модерации только потому, что вы являетесь модератором узла.", "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": "На этой неделе", @@ -794,8 +841,12 @@ "To register for an event by choosing one of your identities": "Чтобы зарегистрироваться на мероприятие, выбрав один из ваших идентификаторов", "Today": "Сегодня", "Tomorrow": "Завтра", + "Tools": "Инструменты", "Transfer to {outsideDomain}": "Перенос в {outsideDomain}", "Triggered profile refreshment": "Запуск обновления профиля", + "Twitch live": "Стрим на Twitch", + "Twitch replay": "Воспроизведение на Twitch", + "Twitter account": "Аккаунт Twitter", "Type": "Тип", "Type or select a date…": "Введите или выберите дату…", "URL": "URL-адрес", @@ -835,6 +886,7 @@ "Username": "Имя пользователя", "Users": "Пользователи", "View a reply": "|Посмотреть один ответ|Посмотреть {totalReplies} ответов", + "View account on {hostname} (in a new window)": "Просмотреть аккаунт на {hostname} (в новом окне)", "View all": "Посмотреть всё", "View all events": "Посмотреть все мероприятия", "View all posts": "Просмотреть все публикации", @@ -865,7 +917,11 @@ "Welcome back!": "С возвращением!", "Welcome to Mobilizon, {username}!": "Добро пожаловать в Mobilizon, {username}!", "What can I do to help?": "Чем я могу помочь?", + "Wheelchair accessibility": "Доступность для инвалидов-колясочников", "When a moderator from the group creates an event and attributes it to the group, it will show up here.": "Когда модератор группы создаёт событие и назначает его группе, оно появляется здесь.", + "Whether the event is accessible with a wheelchair": "Если мероприятие доступно для участников в инвалидных колясках", + "Whether the event is interpreted in sign language": "Сопровождается ли мероприятие сурдопереводом", + "Whether the event live video is subtitled": "Есть ли субтитры для прямой трансляции мероприятия", "Who can view this event and participate": "Кто может просматривать и участвовать в мероприятии", "Who can view this post": "Кто может видеть этот пост", "Who published {number} events": "Которые опубликовали {number} мероприятий", @@ -952,6 +1008,8 @@ "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.": "Вы получите электронное письмо с подтверждением.", + "YouTube live": "Стрим на YouTube", + "YouTube replay": "Воспроизведение на YouTube", "Your account has been successfully deleted": "Ваша учетная запись была успешно удалена", "Your account has been validated": "Ваша учетная запись была подтверждена", "Your account is being validated": "Ваша учетная запись проверяется", @@ -979,6 +1037,8 @@ "Your timezone was detected as {timezone}.": "Ваш часовой пояс был определен как {timezone}.", "Your timezone {timezone} isn't supported.": "Ваш часовой пояс {timezone} не поддерживается.", "Your upcoming events": "Ваши предстоящие мероприятия", + "Zoom in": "Увеличить", + "Zoom out": "Уменьшить", "[This comment has been deleted by it's author]": "[Этот комментарий был удален автором]", "[This comment has been deleted]": "[Этот комментарий был удалён]", "[deleted]": "[удалено]", @@ -992,6 +1052,7 @@ "default Mobilizon privacy policy": "Политика конфиденциальности Mobilizon по умолчанию", "default Mobilizon terms": "условия использования Mobilizon по умолчанию", "e.g. 10 Rue Jangot": "например: Садовая 10", + "e.g. Accessibility, Twitch, PeerTube": "например Доступность, Twitch, PeerTube", "enable the feature": "включить функцию", "explore the events": "просмотреть мероприятия", "explore the groups": "посмотреть группы", From 49fe27d86b51911a54cc7ba9fe24ea8710b2810b Mon Sep 17 00:00:00 2001 From: deadmorose Date: Thu, 12 Aug 2021 18:14:02 +0000 Subject: [PATCH 158/169] Translated using Weblate (Russian) Currently translated at 100.0% (247 of 247 strings) Translation: Mobilizon/Backend Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend/ru/ --- priv/gettext/ru/LC_MESSAGES/default.po | 500 +++++++++++++------------ 1 file changed, 252 insertions(+), 248 deletions(-) diff --git a/priv/gettext/ru/LC_MESSAGES/default.po b/priv/gettext/ru/LC_MESSAGES/default.po index 3a8d11603..5585c3011 100644 --- a/priv/gettext/ru/LC_MESSAGES/default.po +++ b/priv/gettext/ru/LC_MESSAGES/default.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2019-09-24 14:40+0000\n" -"PO-Revision-Date: 2021-06-18 13:15+0000\n" +"PO-Revision-Date: 2021-08-13 18:15+0000\n" "Last-Translator: deadmorose \n" "Language-Team: Russian \n" @@ -15,267 +15,267 @@ msgstr "" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Generator: Weblate 4.6.2\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 "" "Если вы не оставляли такой запрос, проигнорируйте данное письмо. Пароль не " "изменится, если не перейти по приведённой ссылке и не указать новый." -#, elixir-format #: lib/web/templates/email/report.html.eex:74 +#, elixir-format msgid "%{title} by %{creator}" msgstr "%{title} от %{creator}" -#, elixir-format #: lib/web/templates/email/registration_confirmation.html.eex:58 +#, elixir-format msgid "Activate my account" msgstr "Активировать мою учётную запись" -#, elixir-format #: lib/web/templates/email/email.html.eex:118 #: lib/web/templates/email/email.text.eex:9 +#, elixir-format msgid "Ask the community on Framacolibri" msgstr "Обратиться к сообществу на Framacolibri" -#, elixir-format #: lib/web/templates/email/report.text.eex:15 +#, elixir-format msgid "Comments" msgstr "Комментарии" -#, elixir-format #: lib/web/templates/email/report.html.eex:72 #: lib/web/templates/email/report.text.eex:11 +#, elixir-format msgid "Event" msgstr "Мероприятие" -#, elixir-format #: lib/web/email/user.ex:48 +#, elixir-format msgid "Instructions to reset your password on %{instance}" msgstr "Инструкции по сбросу пароля на %{instance}" -#, elixir-format #: lib/web/templates/email/report.text.eex:21 +#, elixir-format msgid "Reason" msgstr "Причина" -#, elixir-format #: lib/web/templates/email/password_reset.html.eex:61 +#, elixir-format msgid "Reset Password" msgstr "Сбросить пароль" -#, 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 "" "Сбросить пароль легко. Просто нажмите на кнопку ниже и следуйте инструкциям. " "Это быстро." -#, elixir-format #: lib/web/email/user.ex:28 +#, elixir-format msgid "Instructions to confirm your Mobilizon account on %{instance}" msgstr "Инструкции по подтверждению учётной записи Mobilizon на %{instance}" -#, elixir-format #: lib/web/email/admin.ex:24 +#, elixir-format msgid "New report on Mobilizon instance %{instance}" msgstr "Новый отчёт на Mobilizon узле %{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 "Перейти на страницу мероприятия" -#, elixir-format #: lib/web/templates/email/report.text.eex:1 +#, elixir-format msgid "New report from %{reporter} on %{instance}" msgstr "Новый отчёт от %{reporter} на %{instance}" -#, elixir-format #: lib/web/templates/email/event_participation_approved.text.eex:1 +#, elixir-format msgid "Participation approved" msgstr "Участие одобрено" -#, 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 "Сброс пароля" -#, 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 "" "Сбросить пароль легко. Просто нажмите на ссылку ниже и следуйте инструкциям. " "Это быстро." -#, 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 "" "Вы создали аккаунт на% {host}, используя этот адрес электронной почты. Вы в " "одном клике от его активации. Если это сделали не вы, просто проигнорируйте " "это письмо." -#, elixir-format #: lib/web/email/participation.ex:112 +#, elixir-format msgid "Your participation to event %{title} has been approved" msgstr "Ваше участие в мероприятии %{title} было одобрено" -#, elixir-format #: lib/web/email/participation.ex:70 +#, elixir-format msgid "Your participation to event %{title} has been rejected" msgstr "Ваш запрос на участие в %{title} был отклонен" -#, elixir-format #: lib/web/email/event.ex:36 +#, elixir-format msgid "Event %{title} has been updated" msgstr "Мероприятие %{title} было обновлено" -#, elixir-format #: lib/web/templates/email/event_updated.text.eex:15 +#, elixir-format msgid "New title: %{title}" msgstr "Новый заголовок: %{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 "Вы запросили новый пароль для своей учетной записи на %{instance}." -#, elixir-format #: lib/web/templates/email/email.html.eex:86 +#, elixir-format msgid "Warning" msgstr "Предупреждение" -#, elixir-format #: lib/web/email/participation.ex:135 +#, elixir-format msgid "Confirm your participation to event %{title}" msgstr "Подтвердите свое участие в мероприятии %{title}" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:75 +#, elixir-format msgctxt "terms" msgid "An internal ID for your current selected identity" msgstr "Внутренний ID для выбранного идентификатора" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:74 +#, elixir-format msgctxt "terms" msgid "An internal user ID" msgstr "Внутренний пользовательский 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 "" "Любая информация, которую мы собираем, может быть использована следующим " "образом:" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:9 +#, elixir-format msgctxt "terms" msgid "Basic account information" msgstr "Основная информация об аккаунте" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:25 +#, elixir-format msgctxt "terms" msgid "Do not share any dangerous information over Mobilizon." msgstr "Не передавайте через 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 "Передаем ли мы какую-либо информацию третьим лицам?" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:68 +#, elixir-format msgctxt "terms" msgid "Do we use cookies?" msgstr "Мы используем файлы cookie?" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:51 +#, elixir-format msgctxt "terms" msgid "How do we protect your information?" msgstr "Как мы защищаем вашу информацию?" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:29 +#, elixir-format msgctxt "terms" msgid "IPs and other metadata" msgstr "IP-адреса и другие метаданные" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:17 +#, elixir-format msgctxt "terms" msgid "Published events and comments" msgstr "Опубликованные мероприятия и комментарии" -#, 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 "" "Не храните IP-адреса, присвоенные зарегистрированным пользователям более 12 " "месяцев." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:76 +#, elixir-format msgctxt "terms" msgid "Tokens to authenticate you" msgstr "Токены для аутентификации вас" -#, 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 "" "Мы также можем хранить логи сервера, которые включают IP-адрес каждого " "запроса к нашему серверу." -#, 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 "" "Мы храним следующую информацию об устройстве, с которого вы подключаетесь:" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:58 +#, elixir-format msgctxt "terms" msgid "We will make a good faith effort to:" msgstr "Мы приложим все усилия, чтобы:" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:35 +#, elixir-format msgctxt "terms" msgid "What do we use your information for?" msgstr "Для чего мы используем ваши данные?" -#, elixir-format #: lib/web/templates/api/privacy.html.eex:57 +#, elixir-format msgctxt "terms" msgid "What is our data retention policy?" msgstr "Какова наша политика хранения данных?" -#, 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 "Вы можете в любой момент безвозвратно удалить свою учетную запись." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:115 +#, elixir-format msgctxt "terms" msgid "Changes to our Privacy Policy" msgstr "Изменения в нашей Политике конфиденциальности" -#, 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 "" @@ -285,8 +285,8 @@ msgstr "" "Общий_регламент_по_защите_данных\">Общие правила защиты данных) не " "используйте этот сайт." -#, 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 "" @@ -296,30 +296,30 @@ msgstr "" "99s_Online_Privacy_Protection_Act\">Закон о защите конфиденциальности детей " "в Интернете) не используйте этот сайт." -#, 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 "" "Если мы решим изменить нашу политику конфиденциальности, то опубликуем " "изменения на этой странице." -#, 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 "" "Требования закона могут отличаться, если этот сервер находится в другой " "юрисдикции." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:103 +#, elixir-format msgctxt "terms" msgid "Site usage by children" msgstr "Использование сайта детьми" -#, 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 "" @@ -329,8 +329,8 @@ msgstr "" "также для ответа на запросы, просьбы или\n" " вопросы." -#, 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 "" @@ -338,8 +338,8 @@ msgstr "" "адреса с другими известными, чтобы обнаружить обход бана\n" " или другие нарушения." -#, 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 "" @@ -348,92 +348,92 @@ msgstr "" " взаимодействовать с контентом других людей и размещать собственный " "контент, если вы вошли в систему." -#, elixir-format #: lib/web/templates/api/privacy.html.eex:6 +#, elixir-format msgctxt "terms" msgid "What information do we collect?" msgstr "Какую информацию мы собираем?" -#, elixir-format #: lib/web/email/user.ex:180 +#, elixir-format msgid "Mobilizon on %{instance}: confirm your email address" msgstr "Mobilizon на %{instance}: подтвердите свой адрес электронной почты" -#, elixir-format #: lib/web/email/user.ex:156 +#, elixir-format msgid "Mobilizon on %{instance}: email changed" msgstr "Mobilizon на %{instance}: адрес электронной почты изменен" -#, elixir-format #: lib/web/email/notification.ex:47 +#, elixir-format msgid "One event planned today" msgid_plural "%{nb_events} events planned today" msgstr[0] "Сегодня запланировано одно мероприятие" msgstr[1] "Сегодня запланировано %{nb_events} мероприятия" msgstr[2] "Сегодня запланировано %{nb_events} мероприятий" -#, 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] "У вас сегодня одно мероприятие:" msgstr[1] "У вас сегодня %{total} мероприятия:" msgstr[2] "У вас сегодня %{total} мероприятий:" -#, 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} только что пригласил вас присоединиться к их группе %{group}" -#, 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 "Присоединяйтесь к нам!" -#, elixir-format #: lib/web/email/notification.ex:24 +#, elixir-format msgid "Don't forget to go to %{title}" msgstr "Не забудь об участии в %{title}" -#, 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 "Будь готов к %{title}" -#, elixir-format #: lib/web/templates/email/group_invite.html.eex:59 +#, elixir-format msgid "See my groups" msgstr "Посмотреть мои группы" -#, 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 "Чтобы принять это приглашение, зайдите в свои группы." -#, elixir-format #: lib/web/templates/email/before_event_notification.text.eex:5 +#, elixir-format msgid "View the event on: %{link}" msgstr "Посмотреть мероприятие на: %{link}" -#, elixir-format #: lib/web/email/group.ex:33 +#, elixir-format msgid "You have been invited by %{inviter} to join group %{group}" msgstr "%{Inviter} пригласил вас присоединиться к группе %{group}" -#, 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] "На этой неделе запланировано одно мероприятие" msgstr[1] "На этой неделе запланировано %{nb_events} мероприятия" msgstr[2] "На этой неделе запланировано %{nb_events} мероприятий" -#, 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] "Одна заявка на участие в мероприятии %{title} ожидает одобрения" @@ -444,22 +444,22 @@ msgstr[2] "" "%{number_participation_requests} заявок на участие в мероприятии %{title} " "ожидают одобрения" -#, 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] "У вас одно мероприятие на этой неделе:" msgstr[1] "На этой неделе у вас запланировано %{total} мероприятия:" msgstr[2] "На этой неделе у вас запланировано %{total} мероприятий:" -#, elixir-format #: lib/service/metadata/utils.ex:53 +#, elixir-format msgid "The event organizer didn't add any description." msgstr "Организатор мероприятия не добавил описания." -#, 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 "" @@ -469,8 +469,8 @@ msgstr "" "между вашими приложениями и API защищены с помощью SSL/TLS, а ваш пароль " "хешируется с использованием надежного одностороннего алгоритма." -#, 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 "" @@ -482,20 +482,20 @@ msgstr "" "необходимо для соблюдения закона, обеспечения соблюдения политики нашего " "сайта или защиты наших или других прав, собственности или безопасности." -#, elixir-format #: lib/web/templates/api/terms.html.eex:23 +#, elixir-format msgctxt "terms" msgid "Accepting these Terms" msgstr "Принятие настоящих Условий" -#, elixir-format #: lib/web/templates/api/terms.html.eex:27 +#, elixir-format msgctxt "terms" msgid "Changes to these Terms" msgstr "Изменения в настоящих Условиях" -#, 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 "" @@ -508,16 +508,16 @@ msgstr "" "возникающие в связи с использованием вами любого контента или вашего доверия " "к нему." -#, 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 "" "Кроме того, вы соглашаетесь с тем, что не будете делать ничего из следующего " "в отношении Сервиса или других пользователей:" -#, 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 "" @@ -525,8 +525,8 @@ msgstr "" "ограничения скорости или другие функции, предназначенные для защиты Сервиса, " "пользователей Сервиса или третьих лиц." -#, 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 "" @@ -534,16 +534,16 @@ msgstr "" "угрожать, преследовать или иным образом беспокоить других пользователей " "Сервиса;" -#, 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 "" "Контент, который является незаконным или повлечет за собой уголовную " "ответственность;" -#, 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 "" @@ -551,40 +551,40 @@ msgstr "" "коммерческую тайну, авторское право, конфиденциальность, право на гласность " "или другие интеллектуальные и прочие права любой стороны;" -#, elixir-format #: lib/web/templates/api/terms.html.eex:42 +#, elixir-format msgctxt "terms" msgid "Creating Accounts" msgstr "Создание учётных записей" -#, elixir-format #: lib/web/templates/api/terms.html.eex:89 +#, elixir-format msgctxt "terms" msgid "Entire Agreement" msgstr "Полное согласие" -#, elixir-format #: lib/web/templates/api/terms.html.eex:92 +#, elixir-format msgctxt "terms" msgid "Feedback" msgstr "Обратная связь" -#, elixir-format #: lib/web/templates/api/terms.html.eex:83 +#, elixir-format msgctxt "terms" msgid "Hyperlinks and Third Party Content" msgstr "Гиперссылки и сторонний контент" -#, 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 "" "Если вы нарушите какое-либо из этих Условий, мы имеем право временно " "приостановить или полностью заблокировать вам доступ к Сервису." -#, 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 "" @@ -592,8 +592,8 @@ msgstr "" "физического или юридического лица или иным образом искажать свою " "принадлежность к физическому или юридическому лицу;" -#, 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 "" @@ -602,26 +602,26 @@ msgstr "" "контент, который вы предоставляете Сервису, включая его законность, " "правдивость и адекватность." -#, elixir-format #: lib/web/templates/api/terms.html.eex:39 +#, elixir-format msgctxt "terms" msgid "Privacy Policy" msgstr "Политика конфиденциальности" -#, elixir-format #: lib/web/templates/api/terms.html.eex:95 +#, elixir-format msgctxt "terms" msgid "Questions & Contact Information" msgstr "Вопросы и контактная информация" -#, elixir-format #: lib/web/templates/api/terms.html.eex:87 +#, elixir-format msgctxt "terms" msgid "Termination" msgstr "Завершение" -#, 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 "" @@ -630,14 +630,14 @@ msgstr "" "Сервисом или который может повредить, вывести из строя, перегрузить или " "нарушить работу Сервиса;" -#, elixir-format #: lib/web/templates/api/terms.html.eex:47 +#, elixir-format msgctxt "terms" msgid "Your Content & Conduct" msgstr "Ваш контент и ваши действия" -#, 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 "" @@ -649,8 +649,8 @@ msgstr "" "сайта. Ответственность за использование таких ссылок лежит на каждом " "пользователе." -#, 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 "" @@ -659,16 +659,16 @@ msgstr "" "модерации. Нарушение этих правил также может привести к приостановке или " "блокировки вашей учетной записи." -#, 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 "" "Для получения полной информации о Mobilizon смотреть тут." -#, 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 "" @@ -677,8 +677,8 @@ msgstr "" ">%{instance_url}) веб-сайта и сервиса (вместе именуемые \"Сервис\"). Это " "наши условия обслуживания (\"Условия\"). Пожалуйста, прочтите их внимательно." -#, 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 "" @@ -687,8 +687,8 @@ msgstr "" "подвале нашего веб-сайта. Вы обязаны регулярно проверять веб-сайт на предмет " "изменений в настоящих Условиях." -#, 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 "" @@ -696,16 +696,16 @@ msgstr "" "не публикуйте, не размещайте ссылки и не делайте доступными иным образом в " "нашем Сервисе любое из следующего:" -#, 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 "" "Личная информация третьих лиц (например, адреса, номера телефонов, адреса " "электронной почты, номера социального страхования и номера кредитных карт); и" -#, 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 "" @@ -716,8 +716,8 @@ msgstr "" "контента на других узлах на этом заканчивается. Если по какой-то причине " "какой-либо другой узел не удаляет его, то мы не несем ответственности за это." -#, 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 "" @@ -726,8 +726,8 @@ msgstr "" "предыдущие соглашения между вами и %{instance_name}, касающиеся " "использования Сервиса." -#, 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 "" @@ -736,14 +736,14 @@ msgstr "" "license-v3-(agpl-3.0)\">AGPLv3, следовательно, вам разрешено и даже " "рекомендуется брать, изменять и использовать его." -#, 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 "Вирусы, трояны или другие вредоносные файлы или их исходный код." -#, 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 "" @@ -752,29 +752,29 @@ msgstr "" "нашей системе или резервной копии в течение некоторого времени. Логи веб-" "сервера также могут некоторое время храниться в системе." -#, 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 "" "Вопросы и отзывы о нашем Сервисе можно направлять нам по адресу %{contact}" -#, elixir-format #: lib/web/templates/api/terms.html.eex:79 +#, elixir-format msgctxt "terms" msgid "Source code" msgstr "Исходный код" -#, 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 "" "Нам нравятся отзывы! Не стесняйтесь говорить, что вы думаете о Сервисе, " "настоящих Условиях и в целом о %{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 "" @@ -786,16 +786,16 @@ msgstr "" "запись, сообщество или узел за нарушение этих условий или другое поведение, " "которое они считают неуместным, угрожающим, оскорбительным или вредным." -#, 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} не будет использовать, передавать или продавать ваши " "личные данные" -#, 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 "" @@ -804,16 +804,16 @@ msgstr "" "уязвимостей в самом программном обеспечении Mobilizon обращайтесь напрямую " "к её разработчикам." -#, 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 "" "Администраторы узла должны убедиться, что каждое сообщество, размещенное на " "узле, адекватно модерируется в соответствии с определенными правилами." -#, 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 "" @@ -822,8 +822,8 @@ msgstr "" "service\">App.net, которые находятся под лицензией 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 "" @@ -832,115 +832,115 @@ msgstr "" "discourse\">Discourse, которые находятся под лицензией CC BY-SA." -#, elixir-format #: lib/web/templates/api/terms.html.eex:3 +#, elixir-format msgctxt "terms" msgid "Short version" msgstr "Сокращённая версия" -#, 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 "" "Услуги предоставляется без гарантий, и эти условия могут измениться в будущем" -#, 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 "" "Этот документ находится под лицензией CC BY-SA. Последний раз обновлялся 18 июня 2020." -#, 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 "" "Этот документ находится под лицензиейCC BY-SA. Последний раз обновлялся 22 июня 2020." -#, 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 "" "Вы должны уважать других людей и правила %{instance_name} используя " "этот сервис" -#, 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 "Вы должны соблюдать законы при использовании %{instance_name}" -#, elixir-format #: lib/web/templates/api/terms.html.eex:5 +#, elixir-format msgctxt "terms" msgid "Your content is yours" msgstr "Ваши данные принадлежат вам" -#, elixir-format #: lib/web/templates/email/anonymous_participation_confirmation.html.eex:51 +#, elixir-format msgid "Confirm my e-mail address" msgstr "Подтвердите мой адрес электронной почты" -#, 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 "Подтвердите ваш адрес электронной почты" -#, 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 "" "Привет! Вы только что зарегистрировались, чтобы присоединиться к мероприятию:" " « % {title} ». Пожалуйста, подтвердите адрес электронной почты, который вы " "указали:" -#, elixir-format #: lib/web/templates/email/email.html.eex:115 #: lib/web/templates/email/email.text.eex:8 +#, elixir-format msgid "Need help? Is something not working as expected?" msgstr "Нужна помощь? Что-то не работает?" -#, 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 "" "Вы создали на %{host} учётную запись с данным адресом электронной " "почты. Вы в одном клике от его активации." -#, elixir-format #: lib/web/templates/email/report.html.eex:13 +#, elixir-format msgid "New report on %{instance}" msgstr "Новый отчёт на %{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 "" "Адрес электронной почты вашего аккаунта на %{host} будет изменен на:" -#, 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 "" "Вы запросили новый пароль для своей учетной записи на %{instance}." -#, elixir-format #: lib/web/templates/email/email.text.eex:5 +#, elixir-format msgid "Please do not use it for real purposes." msgstr "Пожалуйста, используйте это только для тестовых целей." -#, 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] "" @@ -955,9 +955,9 @@ msgstr[2] "" "просто перейдите на страницы мероприятий по указанным выше ссылкам и нажмите " "кнопку « Я участвую »." -#, 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] "У вас есть ожидающий рассмотрения запрос на участие:" @@ -968,66 +968,66 @@ msgstr[2] "" "У вас есть %{number_participation_requests} ожидающих рассмотрения запросов " "на участие:" -#, elixir-format #: lib/web/templates/email/email.text.eex:11 +#, elixir-format msgid "%{instance} is powered by Mobilizon." msgstr "%{instance} работает на платформе Mobilizon." -#, elixir-format #: lib/web/templates/email/email.html.eex:143 +#, elixir-format msgid "%{instance} is powered by Mobilizon." msgstr "%{instance} работает на платформе Mobilizon." -#, 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 "Заявка находится на рассмотрении!" -#, 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 "Скоро начало мероприятия!" -#, 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 "Подтвердите новый адрес электронной почты" -#, elixir-format #: lib/web/templates/email/event_updated.html.eex:84 +#, elixir-format msgid "End" msgstr "Конец" -#, elixir-format #: lib/web/templates/email/event_updated.text.eex:21 +#, elixir-format msgid "End %{ends_on}" msgstr "Конец %{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 "Мероприятие обновлено!" -#, elixir-format #: lib/web/templates/email/report.html.eex:88 +#, elixir-format msgid "Flagged comments" msgstr "Помеченные комментарии" -#, 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 "" "Хорошие новости: один из организаторов мероприятия только что одобрил вашу " "заявку. Обновите свой календарь, потому что теперь вы в списке гостей!" -#, 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 "" "Привет! Похоже, вы хотели изменить адрес электронной почты, связанный с " @@ -1035,16 +1035,16 @@ msgstr "" "это, нажмите кнопку ниже, чтобы подтвердить изменение. После этого вы " "сможете войти в %{instance} с новым адресом электронной почты." -#, 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 "" "Привет! Мы просто хотели сообщить вам, что адрес электронной почты, который " "ранее был связан с вашей учетной записью на %{host}, был изменен с этого на:" -#, elixir-format #: lib/web/templates/email/email_changed_old.html.eex:62 #: 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 "" "Если вы не активировали это изменение самостоятельно, вероятно, кто-то " @@ -1052,174 +1052,174 @@ msgstr "" "немедленно измените свой пароль. Если вам не удается войти в систему, " "обратитесь к администратору %{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 "" "Если вы не активировали это изменение самостоятельно, проигнорируйте это " "сообщение. Ваш пароль не будет изменен, пока вы не нажмете ссылку выше." -#, 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 "" "Если вы не оставляли этот запрос, пожалуйста, проигнорируйте данное письмо." -#, 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 "" "Если вы хотите отменить свое участие, просто перейдите на страницу " "мероприятия по ссылке выше и нажмите кнопку « Я участвую »." -#, elixir-format #: lib/web/templates/email/email.html.eex:144 #: lib/web/templates/email/email.text.eex:11 +#, elixir-format msgid "Learn more about Mobilizon here!" msgstr "Узнайте больше о Mobilizon!" -#, elixir-format #: lib/web/templates/email/event_updated.html.eex:94 +#, elixir-format msgid "Location" msgstr "Местонахождение" -#, elixir-format #: lib/web/templates/email/event_updated.html.eex:104 +#, elixir-format msgid "Location address was removed" msgstr "Адрес местоположения был удален" -#, 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 "Управление запросами в ожидании" -#, 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 "Почти готово!" -#, 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 "Подтверждение нового адреса электронной почты" -#, elixir-format #: lib/web/templates/email/report.html.eex:106 +#, elixir-format msgid "Reasons for report" msgstr "Причина жалобы" -#, 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 "Кто-то на %{instance} сообщил вам о следующем содержимом:" -#, 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 "Очень жаль! Вы не будете участвовать." -#, elixir-format #: lib/web/templates/email/event_updated.html.eex:74 +#, elixir-format msgid "Start" msgstr "Начало" -#, elixir-format #: lib/web/templates/email/event_updated.text.eex:18 +#, elixir-format msgid "Start %{begins_on}" msgstr "Начало %{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 "В %{title} произошли изменения, поэтому мы решили сообщить вам об этом." -#, 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 "Мероприятие отменено организаторами. Очень жаль!" -#, 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 "Мероприятие подтверждено" -#, 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 "" "Это мероприятие еще не подтверждено: организаторы сообщат вам, если " "подтвердят его." -#, 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 "К сожалению, организаторы отклонили ваше участие." -#, elixir-format #: lib/web/templates/email/email_changed_new.html.eex:51 +#, elixir-format msgid "Verify your email address" msgstr "Проверьте свой адрес электронной почты" -#, elixir-format #: lib/web/templates/email/report.html.eex:126 +#, elixir-format msgid "View report" msgstr "Смотреть отчёт" -#, elixir-format #: lib/web/templates/email/report.text.eex:24 +#, elixir-format msgid "View report:" msgstr "Смотреть отчёт:" -#, elixir-format #: lib/web/templates/email/email_anonymous_activity.html.eex:67 #: 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 "Посетите страницу мероприятия" -#, elixir-format #: lib/web/templates/email/event_updated.html.eex:121 +#, elixir-format msgid "Visit the updated event page" msgstr "Посетите обновленную страницу мероприятия" -#, elixir-format #: lib/web/templates/email/event_updated.text.eex:23 +#, elixir-format msgid "Visit the updated event page: %{link}" msgstr "Посетите обновленную страницу мероприятия: %{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 "Что будет на этой неделе?" -#, 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 "Что будет сегодня?" -#, 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 "" "Если вы хотите обновить или отменить свое участие, просто перейдите на " "страницу мероприятия по ссылке выше и нажмите кнопку « Я участвую »." -#, 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 "" "Вы получили это письмо, потому что выбрали получение уведомлений об " @@ -1227,133 +1227,133 @@ msgstr "" "изменить настройки уведомлений в настройках своей учетной записи в разделе « " "Уведомления »." -#, elixir-format #: lib/web/templates/email/event_participation_rejected.text.eex:5 +#, elixir-format msgid "You issued a request to attend %{title}." msgstr "Вы подали заявку на участие в %{title}." -#, 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 "Вы недавно подали заявку на присоединение к %{title}." -#, 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 "Вы примете участие!" -#, 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 "" "Если вы не активировали изменение самостоятельно, проигнорируйте это " "сообщение." -#, elixir-format #: lib/web/templates/email/email.html.eex:90 +#, elixir-format msgid "Please do not use it for real purposes." msgstr "Пожалуйста, используйте это только для тестовых целей." -#, 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 "" "Если вы считаете, что это ошибка, вы можете связаться с администраторами " "группы, чтобы они добавили вас обратно." -#, 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 "Всего хорошего, и спасибо за рыбу!" -#, elixir-format #: lib/web/email/group.ex:63 +#, elixir-format msgid "You have been removed from group %{group}" msgstr "Вас исключили из группы %{group}" -#, 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 "" "Вас исключили из группы %{group}. Вы больше не сможете получить доступ к " "приватному контенту этой группы." -#, 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} только что пригласил вас присоединиться к их группе " "%{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 "" "Вас исключили из группы %{link_start}%{group}%{link_end}. Вы больше " "не сможете получить доступ к приватному контенту этой группы." -#, 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 "" "Поскольку эта группа находилась на другом узле, она все равно будет работать " "на других узлах, кроме этого." -#, 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 "" "Поскольку эта группа находилась на этом узле, все её содержимое было " "безвозвратно удалено." -#, 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 "" "Администратор %{author} удалил группу %{group}. Все мероприятия, обсуждения, " "сообщения и записи связанные с ней были удалены." -#, 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 "Группа %{group} заблокирована на %{instance}!" -#, 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 "Группа %{group} удалена на %{instance}!" -#, 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 "" "Команда модераторов вашего узла приняла решение приостановить работу " "%{group_name} (%{group_address}). Вы больше не являетесь участником этой " "группы." -#, elixir-format #: lib/web/email/group.ex:136 +#, elixir-format msgid "The group %{group} has been deleted on %{instance}" msgstr "Группа %{group} удалена на %{instance}" -#, elixir-format #: lib/web/email/group.ex:97 +#, elixir-format msgid "The group %{group} has been suspended on %{instance}" msgstr "Группа %{group} заблокирована на %{instance}" -#, 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 "" @@ -1361,8 +1361,8 @@ msgstr "" "ниже условиями. Если некоторые из этих условий вам неясны, сообщите нам об " "этом, связавшись с %{contact}." -#, 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 "" @@ -1370,22 +1370,22 @@ msgstr "" "пользователях Сервиса, ознакомьтесь с нашей политикой " "конфиденциальности." -#, 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 "" "Если вы продолжите использовать Сервис после вступления в силу измененных " "Условий, значит вы соглашаетесь с ними." -#, 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 "Если вы удалите эту информацию, вам придётся снова войти в систему." -#, 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 "" @@ -1395,31 +1395,31 @@ msgstr "" "идентификатора мероприятия и статус участия. Удаление этой информации " "приведет только к прекращению отображения статуса участия в браузере." -#, 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 "" "Примечание: Эта информация хранится в вашем локальном хранилище, а не в " "куках." -#, elixir-format #: lib/web/templates/api/terms.html.eex:71 +#, elixir-format msgctxt "terms" msgid "Our responsibility" msgstr "Наша ответственность" -#, 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 "" "Хранить логи сервера, содержащие IP-адреса всех запросов к этому серверу, " "если таковые имеются, не более 90 дней." -#, 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 "" @@ -1427,8 +1427,8 @@ msgstr "" "тексте, могут охватывать трудные для понимания концепции. Мы подготовили глоссарий, чтобы помочь вам лучше их освоить." -#, 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 "" @@ -1436,8 +1436,8 @@ msgstr "" "результате использования кем-либо вашего адреса электронной почты или " "пароля, с вашего ведома или без него." -#, 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 "" @@ -1447,8 +1447,8 @@ msgstr "" "права на контент, который вы публикуете, ссылаетесь или иным образом делаете " "доступным на Сервисе или через него." -#, 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 "" @@ -1465,16 +1465,16 @@ msgstr "" "отображаемое имя, биография, аватарка и логотип всегда общедоступны. " "Однако вы можете пользоваться этим узел без регистрации." -#, 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 "" "Мы оставляем за собой право изменять эти Условия в любое время. Например, " "нам может потребоваться сделать это при добавлении новой функции." -#, 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 "" @@ -1487,8 +1487,8 @@ msgstr "" "использующей исходный код Mobilizon. Дополнительную информацию об этом узле " "можно найти на странице «Об этом узле»." -#, 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 "" @@ -1497,8 +1497,8 @@ msgstr "" "доступа к данным вашей учетной записи и любой другой информации, которую вы " "предоставляете %{instance_name}." -#, 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 "" @@ -1511,8 +1511,8 @@ msgstr "" "в соответствии с правилами видимости, которые вы установили для него. Мы не " "будем изменять видимость установленного вами контента." -#, 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 "" @@ -1526,8 +1526,8 @@ msgstr "" "что получатели могут делать снимки экрана, копировать или иным образом " "повторно делиться ими." -#, 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 "" @@ -1536,218 +1536,222 @@ msgstr "" "Групповой контент, отправляется на узлы всех участников группы, если эти " "участники находятся на отличном от этого узле." -#, 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 "" "Вы подтвердили свое участие. Обновите свой календарь, потому что теперь вы в " "списке гостей!" -#, 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 "Вы недавно запросили участие в мероприятии %{title}." -#, elixir-format #: lib/web/email/participation.ex:91 +#, elixir-format msgid "Your participation to event %{title} has been confirmed" msgstr "Ваше участие в мероприятии %{title} одобрено" -#, elixir-format #: lib/web/templates/email/report.html.eex:41 +#, elixir-format msgid "%{reporter} reported the following content." msgstr "%{reporter} сообщил о следующем содержимом." -#, elixir-format #: lib/web/templates/email/report.text.eex:5 +#, elixir-format msgid "Group %{group} was reported" msgstr "Группа %{group} сообщила" -#, elixir-format #: lib/web/templates/email/report.html.eex:51 +#, elixir-format msgid "Group reported" msgstr "Группа сообщила" -#, elixir-format #: lib/web/templates/email/report.text.eex:7 +#, elixir-format msgid "Profile %{profile} was reported" msgstr "Профиль %{profile} сообщил" -#, elixir-format #: lib/web/templates/email/report.html.eex:56 +#, elixir-format msgid "Profile reported" msgstr "Профиль сообщил" -#, 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 "" "Вы подтвердили свое участие. Обновите свой календарь, потому что теперь вы в " "списке гостей!" -#, elixir-format #: lib/mobilizon/posts/post.ex:94 +#, elixir-format msgid "A text is required for the post" msgstr "Для публикации требуется текст" -#, elixir-format #: lib/mobilizon/posts/post.ex:93 +#, elixir-format msgid "A title is required for the post" msgstr "Для публикации требуется заголовок" -#, 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}) только что попросил подписаться на ваш узел." -#, elixir-format #: lib/web/email/follow.ex:54 +#, elixir-format msgid "%{name} requests to follow your instance" msgstr "%{name} просит подписаться на ваш узел" -#, 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}) только что просил подписаться на ваш узел. Если " "вы согласитесь, то этот узел будет получать все публичные события вашего " "узла." -#, 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 "" "Если вы согласитесь, то этот узел будет получать все публичные события " "вашего узла." -#, elixir-format #: lib/web/email/follow.ex:48 +#, elixir-format msgid "Instance %{name} (%{domain}) requests to follow your instance" msgstr "Узел %{name} (%{domain}) просит подписаться на ваш узел" -#, elixir-format #: lib/web/templates/email/instance_follow.html.eex:66 +#, elixir-format msgid "See the federation settings" msgstr "Смотри настройки федерализации" -#, 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 "Чтобы принять это приглашение, перейдите в админку узла." -#, 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 "Вы хотите подключиться?" -#, 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 "" "Примечание: Подписка %{name} (%{domain}) на вас не обязательно означает, что " "вы подписаны на этот узел, но вы также можете запросить подписку на него." -#, 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 "" "Привет! Вы только что зарегистрировались для участия в этом мероприятии: « " "%{title} ». Пожалуйста, подтвердите адрес электронной почты, который " "вы указали:" -#, elixir-format #: lib/web/templates/email/event_participation_rejected.html.eex:38 +#, elixir-format msgid "You issued a request to attend %{title}." msgstr "Вы отправили запрос на участие в %{title}." -#, elixir-format #: lib/web/templates/email/event_updated.html.eex:64 +#, elixir-format msgid "Event title" msgstr "Название мероприятия" -#, 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 "" "В %{title} были внесены изменения, поэтому мы решили сообщить вам об " "этом." -#, elixir-format #: lib/web/templates/error/500_page.html.eex:7 +#, elixir-format msgid "This page is not correct" msgstr "Эта страница недействительна" -#, 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 "Сожалеем, но с нашей стороны что-то пошло не так." -#, elixir-format #: lib/web/templates/email/email.html.eex:89 #: lib/web/templates/email/email.text.eex:4 +#, elixir-format msgid "This is a demonstration site to test Mobilizon." msgstr "Это демонстрационная площадка для тестирования Mobilizon." -#, elixir-format #: lib/service/metadata/actor.ex:67 lib/service/metadata/actor.ex:75 #: lib/service/metadata/instance.ex:54 lib/service/metadata/instance.ex:60 +#, elixir-format msgid "%{name}'s feed" msgstr "Лента %{name}" -#, elixir-format #: lib/service/export/feed.ex:120 +#, elixir-format msgid "%{actor}'s private events feed on %{instance}" msgstr "Лента приватных мероприятий от %{actor} на %{instance}" -#, elixir-format #: lib/service/export/feed.ex:115 +#, elixir-format msgid "%{actor}'s public events feed on %{instance}" msgstr "Лента публичных мероприятий от %{actor} на %{instance}" -#, elixir-format #: lib/service/export/feed.ex:220 +#, elixir-format msgid "Feed for %{email} on %{instance}" msgstr "Лента для %{email} на %{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 "" "Если проблема не исчезнет, вы можете связаться с администратором сервера по " "адресу %{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 "" "Если проблема не исчезнет, вы можете попытаться связаться с администратором " "сервера." -#, elixir-format #: lib/web/templates/error/500_page.html.eex:68 +#, elixir-format msgid "Technical details" msgstr "Технические подробности" -#, elixir-format #: lib/web/templates/error/500_page.html.eex:52 +#, elixir-format msgid "The Mobilizon server %{instance} seems to be temporarily down." msgstr "Сервер Mobilizon %{instance} временно недоступен." -#, elixir-format #: lib/service/export/feed.ex:73 +#, elixir-format msgid "Public feed for %{instance}" msgstr "Публичная лента для %{instance}" -#, elixir-format #: lib/web/email/user.ex:114 +#, elixir-format msgid "The password you have choosen is too short. Please make sure your password contains at least 6 charaters." msgstr "" +"Выбранный вами пароль слишком короткий. Пожалуйста, убедитесь, что ваш " +"пароль содержит не менее 6 символов." -#, elixir-format #: lib/web/email/user.ex:120 +#, elixir-format msgid "The token you provided is invalid. Make sure that the URL is exactly the one provided inside the email you got." msgstr "" +"Предоставленный вами токен недействителен. Убедитесь, что URL-адрес - именно " +"тот, который указан в полученном вами электронном письме." From 5bc4e7dc5a56bd6e21f9e7da565a815cb3f98d35 Mon Sep 17 00:00:00 2001 From: deadmorose Date: Thu, 12 Aug 2021 18:16:11 +0000 Subject: [PATCH 159/169] Translated using Weblate (Russian) Currently translated at 100.0% (172 of 172 strings) Translation: Mobilizon/Backend errors Translate-URL: https://weblate.framasoft.org/projects/mobilizon/backend-errors/ru/ --- priv/gettext/ru/LC_MESSAGES/errors.po | 311 +++++++++++++------------- 1 file changed, 158 insertions(+), 153 deletions(-) diff --git a/priv/gettext/ru/LC_MESSAGES/errors.po b/priv/gettext/ru/LC_MESSAGES/errors.po index 34dbbfb68..152687133 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-31 16:01+0000\n" +"PO-Revision-Date: 2021-08-13 18:15+0000\n" "Last-Translator: deadmorose \n" "Language-Team: Russian \n" @@ -17,7 +17,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.5.1\n" +"X-Generator: Weblate 4.6.2\n" #: lib/mobilizon/discussions/discussion.ex:67 msgid "can't be blank" @@ -101,811 +101,816 @@ msgstr "должно быть больше или равно %{number}" msgid "must be equal to %{number}" msgstr "должно быть равно %{number}" -#, elixir-format #: lib/graphql/resolvers/user.ex:100 +#, elixir-format msgid "Cannot refresh the token" msgstr "Токен не может быть обновлен" -#, elixir-format #: lib/graphql/resolvers/group.ex:206 +#, elixir-format msgid "Current profile is not a member of this group" msgstr "Текущий профиль не является участником этой группы" -#, elixir-format #: lib/graphql/resolvers/group.ex:210 +#, elixir-format msgid "Current profile is not an administrator of the selected group" msgstr "Текущий профиль не является администратором выбранной группы" -#, elixir-format #: lib/graphql/resolvers/user.ex:540 +#, elixir-format msgid "Error while saving user settings" msgstr "Ошибка при сохранении пользовательских настроек" -#, elixir-format #: lib/graphql/error.ex:91 lib/graphql/resolvers/group.ex:203 #: lib/graphql/resolvers/group.ex:234 lib/graphql/resolvers/group.ex:269 lib/graphql/resolvers/member.ex:80 +#, elixir-format msgid "Group not found" msgstr "Группа не найдена" -#, elixir-format #: lib/graphql/resolvers/group.ex:68 +#, elixir-format msgid "Group with ID %{id} not found" msgstr "Группа с ID %{id} не найдена" -#, elixir-format #: lib/graphql/resolvers/user.ex:80 +#, elixir-format msgid "Impossible to authenticate, either your email or password are invalid." msgstr "" "Не удалось пройти аутентификацию. Неверный адрес электронной почты или " "пароль." -#, elixir-format #: lib/graphql/resolvers/group.ex:266 +#, elixir-format msgid "Member not found" msgstr "Участник не найден" -#, elixir-format #: lib/graphql/resolvers/actor.ex:61 lib/graphql/resolvers/actor.ex:91 #: lib/graphql/resolvers/user.ex:445 +#, elixir-format msgid "No profile found for the moderator user" msgstr "Профиль модератора не найден" -#, elixir-format #: lib/graphql/resolvers/user.ex:232 +#, elixir-format msgid "No user to validate with this email was found" msgstr "" "Не найдено ни одного пользователя для подтверждения с этим адресом " "электронной почты" -#, elixir-format #: lib/graphql/resolvers/person.ex:254 lib/graphql/resolvers/user.ex:257 +#, elixir-format msgid "No user with this email was found" msgstr "Пользователя с этим адресом электронной почты не найдено" -#, elixir-format #: lib/graphql/resolvers/feed_token.ex:28 #: lib/graphql/resolvers/participant.ex:28 lib/graphql/resolvers/participant.ex:159 #: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:165 lib/graphql/resolvers/person.ex:199 #: lib/graphql/resolvers/person.ex:279 lib/graphql/resolvers/person.ex:295 lib/graphql/resolvers/person.ex:323 #: lib/graphql/resolvers/person.ex:340 +#, elixir-format msgid "Profile is not owned by authenticated user" msgstr "Профиль не принадлежит аутентифицированному пользователю" -#, elixir-format #: lib/graphql/resolvers/user.ex:146 +#, elixir-format msgid "Registrations are not open" msgstr "Регистрация не открыта" -#, elixir-format #: lib/graphql/resolvers/user.ex:370 +#, elixir-format msgid "The current password is invalid" msgstr "Текущий пароль неверен" -#, elixir-format #: lib/graphql/resolvers/user.ex:415 +#, elixir-format msgid "The new email doesn't seem to be valid" msgstr "Новый адрес электронной почты недействителен" -#, elixir-format #: lib/graphql/resolvers/user.ex:412 +#, elixir-format msgid "The new email must be different" msgstr "Новый адрес электронной почты должен отличаться от текущего" -#, elixir-format #: lib/graphql/resolvers/user.ex:373 +#, elixir-format msgid "The new password must be different" msgstr "Новый пароль должен отличаться от текущего" -#, elixir-format #: lib/graphql/resolvers/user.ex:409 lib/graphql/resolvers/user.ex:467 #: lib/graphql/resolvers/user.ex:470 +#, elixir-format msgid "The password provided is invalid" msgstr "Введён неверный пароль" -#, elixir-format #: lib/graphql/resolvers/user.ex:377 +#, elixir-format msgid "The password you have chosen is too short. Please make sure your password contains at least 6 characters." msgstr "" "Введенный пароль слишком короткий. Убедитесь, что ваш пароль состоит не " "менее чем из 6 символов." -#, elixir-format #: lib/graphql/resolvers/user.ex:253 +#, elixir-format msgid "This user can't reset their password" msgstr "Этот пользователь не может сбросить свой пароль" -#, elixir-format #: lib/graphql/resolvers/user.ex:76 +#, elixir-format msgid "This user has been disabled" msgstr "Этот пользователь отключен" -#, elixir-format #: lib/graphql/resolvers/user.ex:216 +#, elixir-format msgid "Unable to validate user" msgstr "Невозможно проверить пользователя" -#, elixir-format #: lib/graphql/resolvers/user.ex:448 +#, elixir-format msgid "User already disabled" msgstr "Пользователь уже отключен" -#, elixir-format #: lib/graphql/resolvers/user.ex:515 +#, elixir-format msgid "User requested is not logged-in" msgstr "Запрошенный пользователь не авторизован" -#, elixir-format #: lib/graphql/resolvers/group.ex:240 +#, elixir-format msgid "You are already a member of this group" msgstr "Вы уже являетесь участником этой группы" -#, elixir-format #: lib/graphql/resolvers/group.ex:273 +#, elixir-format msgid "You can't leave this group because you are the only administrator" msgstr "" "Вы не можете покинуть эту группу, потому что вы её единственный администратор" -#, elixir-format #: lib/graphql/resolvers/group.ex:237 +#, elixir-format msgid "You cannot join this group" msgstr "Вы не можете присоединиться к этой группе" -#, elixir-format #: lib/graphql/resolvers/group.ex:96 +#, elixir-format msgid "You may not list groups unless moderator." msgstr "Только модератор может просматривать список групп." -#, elixir-format #: lib/graphql/resolvers/user.ex:420 +#, elixir-format msgid "You need to be logged-in to change your email" msgstr "" "Вам необходимо войти в систему, чтобы изменить свой адрес электронной почты" -#, elixir-format #: lib/graphql/resolvers/user.ex:385 +#, elixir-format msgid "You need to be logged-in to change your password" msgstr "Вам необходимо войти в систему, чтобы изменить свой пароль" -#, elixir-format #: lib/graphql/resolvers/group.ex:215 +#, elixir-format msgid "You need to be logged-in to delete a group" msgstr "Вам необходимо войти в систему, чтобы удалить группу" -#, elixir-format #: lib/graphql/resolvers/user.ex:475 +#, elixir-format msgid "You need to be logged-in to delete your account" msgstr "Вам необходимо войти в систему, чтобы удалить свою учетную запись" -#, elixir-format #: lib/graphql/resolvers/group.ex:245 +#, elixir-format msgid "You need to be logged-in to join a group" msgstr "Вам необходимо войти в систему, чтобы присоединиться к группе" -#, elixir-format #: lib/graphql/resolvers/group.ex:278 +#, elixir-format msgid "You need to be logged-in to leave a group" msgstr "Вам необходимо войти в систему, чтобы покинуть группу" -#, elixir-format #: lib/graphql/resolvers/group.ex:180 +#, elixir-format msgid "You need to be logged-in to update a group" msgstr "Вам необходимо войти в систему, чтобы обновить группу" -#, elixir-format #: lib/graphql/resolvers/user.ex:105 +#, elixir-format msgid "You need to have an existing token to get a refresh token" msgstr "У вас должен быть существующий токен, чтобы получить токен обновления" -#, elixir-format #: lib/graphql/resolvers/user.ex:235 lib/graphql/resolvers/user.ex:260 +#, elixir-format msgid "You requested again a confirmation email too soon" msgstr "Вы слишком рано запросили новое письмо с подтверждением" -#, elixir-format #: lib/graphql/resolvers/user.ex:149 +#, elixir-format msgid "Your email is not on the allowlist" msgstr "Ваш адрес электронной почты отсутствует в белом списке" -#, elixir-format #: lib/graphql/resolvers/actor.ex:67 lib/graphql/resolvers/actor.ex:97 +#, elixir-format msgid "Error while performing background task" msgstr "Ошибка при выполнении фоновой задачи" -#, elixir-format #: lib/graphql/resolvers/actor.ex:30 +#, elixir-format msgid "No profile found with this ID" msgstr "Профиль с этим ID не найден" -#, elixir-format #: lib/graphql/resolvers/actor.ex:57 lib/graphql/resolvers/actor.ex:94 +#, elixir-format msgid "No remote profile found with this ID" msgstr "Удалённый профиль с этим ID не найден" -#, elixir-format #: lib/graphql/resolvers/actor.ex:72 +#, elixir-format msgid "Only moderators and administrators can suspend a profile" msgstr "Только модераторы и администраторы могут заблокировать профиль" -#, elixir-format #: lib/graphql/resolvers/actor.ex:102 +#, elixir-format msgid "Only moderators and administrators can unsuspend a profile" msgstr "Только модераторы и администраторы могут разблокировать профиль" -#, elixir-format #: lib/graphql/resolvers/actor.ex:27 +#, elixir-format msgid "Only remote profiles may be refreshed" msgstr "Обновлять можно только удаленные профили" -#, elixir-format #: lib/graphql/resolvers/actor.ex:64 +#, elixir-format msgid "Profile already suspended" msgstr "Профиль уже заблокирован" -#, elixir-format #: lib/graphql/resolvers/participant.ex:92 +#, elixir-format msgid "A valid email is required by your instance" msgstr "Вашему узлу требуется действующий адрес электронной почты" -#, elixir-format #: lib/graphql/resolvers/participant.ex:86 +#, elixir-format msgid "Anonymous participation is not enabled" msgstr "Анонимное участие не разрешено" -#, elixir-format #: lib/graphql/resolvers/person.ex:196 +#, elixir-format msgid "Cannot remove the last administrator of a group" msgstr "Невозможно удалить последнего администратора группы" -#, elixir-format #: lib/graphql/resolvers/person.ex:193 +#, elixir-format msgid "Cannot remove the last identity of a user" msgstr "Единственный идентификатор пользователя не может быть удален" -#, elixir-format #: lib/graphql/resolvers/comment.ex:108 +#, elixir-format msgid "Comment is already deleted" msgstr "Комментарий уже удалён" -#, elixir-format #: lib/graphql/error.ex:93 lib/graphql/resolvers/discussion.ex:62 +#, elixir-format msgid "Discussion not found" msgstr "Обсуждение не найдено" -#, elixir-format #: lib/graphql/resolvers/report.ex:58 lib/graphql/resolvers/report.ex:77 +#, elixir-format msgid "Error while saving report" msgstr "При сохранении отчёта произошла ошибка" -#, elixir-format #: lib/graphql/resolvers/report.ex:96 +#, elixir-format msgid "Error while updating report" msgstr "При обновлении отчёта произошла ошибка" -#, elixir-format #: lib/graphql/resolvers/participant.ex:127 +#, elixir-format msgid "Event id not found" msgstr "Не найден id мероприятия" -#, elixir-format #: lib/graphql/error.ex:90 lib/graphql/resolvers/event.ex:313 #: lib/graphql/resolvers/event.ex:358 +#, elixir-format msgid "Event not found" msgstr "Мероприятие не найдено" -#, elixir-format #: lib/graphql/resolvers/participant.ex:83 #: lib/graphql/resolvers/participant.ex:124 lib/graphql/resolvers/participant.ex:156 +#, elixir-format msgid "Event with this ID %{id} doesn't exist" msgstr "Мероприятия с ID %{id} не существует" -#, elixir-format #: lib/graphql/resolvers/participant.ex:99 +#, elixir-format msgid "Internal Error" msgstr "Внутренняя ошибка" -#, elixir-format #: lib/graphql/resolvers/discussion.ex:202 +#, elixir-format msgid "No discussion with ID %{id}" msgstr "Обсуждения с ID %{id} нет" -#, elixir-format #: lib/graphql/resolvers/todos.ex:78 lib/graphql/resolvers/todos.ex:168 +#, elixir-format msgid "No profile found for user" msgstr "Профиль пользователя не найден" -#, elixir-format #: lib/graphql/resolvers/feed_token.ex:64 +#, elixir-format msgid "No such feed token" msgstr "Такого токена ленты не существует" -#, elixir-format #: lib/graphql/resolvers/participant.ex:237 +#, elixir-format msgid "Participant already has role %{role}" msgstr "У участника уже есть роль %{role}" -#, elixir-format #: lib/graphql/resolvers/participant.ex:169 #: lib/graphql/resolvers/participant.ex:198 lib/graphql/resolvers/participant.ex:230 #: lib/graphql/resolvers/participant.ex:240 +#, elixir-format msgid "Participant not found" msgstr "Участник не найден" -#, elixir-format #: lib/graphql/resolvers/person.ex:30 +#, elixir-format msgid "Person with ID %{id} not found" msgstr "Человек с ID %{id} не найден" -#, elixir-format #: lib/graphql/resolvers/person.ex:52 +#, elixir-format msgid "Person with username %{username} not found" msgstr "Не найдено человека с именем пользователя %{username}" -#, elixir-format #: lib/graphql/resolvers/post.ex:169 lib/graphql/resolvers/post.ex:202 +#, elixir-format msgid "Post ID is not a valid ID" msgstr "ID поста имеет недопустимое значение" -#, elixir-format #: lib/graphql/resolvers/post.ex:172 lib/graphql/resolvers/post.ex:205 +#, elixir-format msgid "Post doesn't exist" msgstr "Пост не существует" -#, elixir-format #: lib/graphql/resolvers/member.ex:83 +#, elixir-format msgid "Profile invited doesn't exist" msgstr "Приглашенный профиль не существует" -#, elixir-format #: lib/graphql/resolvers/member.ex:92 lib/graphql/resolvers/member.ex:96 +#, elixir-format msgid "Profile is already a member of this group" msgstr "Профиль уже является участником этой группы" -#, elixir-format #: lib/graphql/resolvers/post.ex:134 lib/graphql/resolvers/post.ex:175 #: lib/graphql/resolvers/post.ex:208 lib/graphql/resolvers/resource.ex:88 lib/graphql/resolvers/resource.ex:128 #: lib/graphql/resolvers/resource.ex:157 lib/graphql/resolvers/resource.ex:186 lib/graphql/resolvers/todos.ex:57 #: lib/graphql/resolvers/todos.ex:81 lib/graphql/resolvers/todos.ex:99 lib/graphql/resolvers/todos.ex:171 #: lib/graphql/resolvers/todos.ex:194 lib/graphql/resolvers/todos.ex:222 +#, elixir-format msgid "Profile is not member of group" msgstr "Профиль не является членом группы" -#, elixir-format #: lib/graphql/resolvers/person.ex:162 lib/graphql/resolvers/person.ex:190 +#, elixir-format msgid "Profile not found" msgstr "Профиль не найден" -#, elixir-format #: lib/graphql/resolvers/report.ex:36 +#, elixir-format msgid "Report not found" msgstr "Отчёт не найден" -#, elixir-format #: lib/graphql/resolvers/resource.ex:154 lib/graphql/resolvers/resource.ex:183 +#, elixir-format msgid "Resource doesn't exist" msgstr "Ресурс не существует" -#, elixir-format #: lib/graphql/resolvers/participant.ex:120 +#, elixir-format msgid "The event has already reached its maximum capacity" msgstr "" "В мероприятии уже зарегистрировано максимально разрешённое количество " "участников" -#, elixir-format #: lib/graphql/resolvers/participant.ex:260 +#, elixir-format msgid "This token is invalid" msgstr "Этот токен недействителен" -#, elixir-format #: lib/graphql/resolvers/todos.ex:165 lib/graphql/resolvers/todos.ex:219 +#, elixir-format msgid "Todo doesn't exist" msgstr "Такого пункта в списке дел не существует" -#, elixir-format #: lib/graphql/resolvers/todos.ex:75 lib/graphql/resolvers/todos.ex:191 #: lib/graphql/resolvers/todos.ex:216 +#, elixir-format msgid "Todo list doesn't exist" msgstr "Списка дел не существует" -#, elixir-format #: lib/graphql/resolvers/feed_token.ex:73 +#, elixir-format msgid "Token does not exist" msgstr "Токен не существует" -#, elixir-format #: lib/graphql/resolvers/feed_token.ex:67 lib/graphql/resolvers/feed_token.ex:70 +#, elixir-format msgid "Token is not a valid UUID" msgstr "Токен не является допустимым UUID" -#, elixir-format #: lib/graphql/error.ex:88 lib/graphql/resolvers/person.ex:356 +#, elixir-format msgid "User not found" msgstr "Пользователь не найден" -#, elixir-format #: lib/graphql/resolvers/person.ex:257 +#, elixir-format msgid "You already have a profile for this user" msgstr "У вас уже есть профиль для этого пользователя" -#, elixir-format #: lib/graphql/resolvers/participant.ex:130 +#, elixir-format msgid "You are already a participant of this event" msgstr "Вы уже являетесь участником этого мероприятия" -#, elixir-format #: lib/graphql/resolvers/member.ex:86 +#, elixir-format msgid "You are not a member of this group" msgstr "Вы не состоите в этой группе" -#, elixir-format #: lib/graphql/resolvers/member.ex:149 +#, elixir-format msgid "You are not a moderator or admin for this group" msgstr "Вы не модератор и не администратор этой группы" -#, elixir-format #: lib/graphql/resolvers/comment.ex:54 +#, elixir-format msgid "You are not allowed to create a comment if not connected" msgstr "Вы не можете создать комментарий при отсутствии подключения" -#, elixir-format #: lib/graphql/resolvers/feed_token.ex:41 +#, elixir-format msgid "You are not allowed to create a feed token if not connected" msgstr "Вы не можете создать токен ленты при отсутствии подключения" -#, elixir-format #: lib/graphql/resolvers/comment.ex:113 +#, elixir-format msgid "You are not allowed to delete a comment if not connected" msgstr "Вы не можете удалить комментарий при отсутствии подключения" -#, elixir-format #: lib/graphql/resolvers/feed_token.ex:82 +#, elixir-format msgid "You are not allowed to delete a feed token if not connected" msgstr "Вы не можете удалить токен ленты при отсутствии подключения" -#, elixir-format #: lib/graphql/resolvers/comment.ex:76 +#, elixir-format msgid "You are not allowed to update a comment if not connected" msgstr "Вы не можете обновить комментарий при отсутствии подключения" -#, elixir-format #: lib/graphql/resolvers/participant.ex:163 #: lib/graphql/resolvers/participant.ex:192 +#, elixir-format msgid "You can't leave event because you're the only event creator participant" msgstr "" "Вы не можете покинуть мероприятие, потому что являетесь единственным " "участником, создавшим его" -#, elixir-format #: lib/graphql/resolvers/member.ex:153 +#, elixir-format msgid "You can't set yourself to a lower member role for this group because you are the only administrator" msgstr "" "Вы не можете назначить себе роль с меньшими правами для этой группы, потому " "что вы единственный администратор" -#, elixir-format #: lib/graphql/resolvers/comment.ex:104 +#, elixir-format msgid "You cannot delete this comment" msgstr "Вы не можете удалить этот комментарий" -#, elixir-format #: lib/graphql/resolvers/event.ex:354 +#, elixir-format msgid "You cannot delete this event" msgstr "Вы не можете удалить это мероприятие" -#, elixir-format #: lib/graphql/resolvers/member.ex:89 +#, elixir-format msgid "You cannot invite to this group" msgstr "Вы не можете приглашать в эту группу" -#, elixir-format #: lib/graphql/resolvers/feed_token.ex:76 +#, elixir-format msgid "You don't have permission to delete this token" msgstr "У вас нет прав на удаление этого токена" -#, elixir-format #: lib/graphql/resolvers/admin.ex:53 +#, elixir-format msgid "You need to be logged-in and a moderator to list action logs" msgstr "" "Для доступа к журналу активности вы должны войти в систему и иметь права " "модератора" -#, elixir-format #: lib/graphql/resolvers/report.ex:26 +#, elixir-format msgid "You need to be logged-in and a moderator to list reports" msgstr "" "Для доступа к списку отчётов вы должны войти в систему и иметь права " "модератора" -#, elixir-format #: lib/graphql/resolvers/report.ex:101 +#, elixir-format msgid "You need to be logged-in and a moderator to update a report" msgstr "" "Для обновления отчёта вы должны войти в систему и иметь права модератора" -#, elixir-format #: lib/graphql/resolvers/report.ex:41 +#, elixir-format msgid "You need to be logged-in and a moderator to view a report" msgstr "Для просмотра отчёта вы должны войти в систему и иметь права модератора" -#, elixir-format #: lib/graphql/resolvers/admin.ex:237 +#, elixir-format msgid "You need to be logged-in and an administrator to access admin settings" msgstr "" "Для доступа в админку вы должны войти в систему и иметь права администратора" -#, elixir-format #: lib/graphql/resolvers/admin.ex:222 +#, elixir-format msgid "You need to be logged-in and an administrator to access dashboard statistics" msgstr "" "Для доступа к панели со статистикой вы должны войти в систему и иметь права " "администратора" -#, elixir-format #: lib/graphql/resolvers/admin.ex:261 +#, elixir-format msgid "You need to be logged-in and an administrator to save admin settings" msgstr "" "Для сохранения настроек в админке вы должны войти в систему и иметь права " "администратора" -#, elixir-format #: lib/graphql/resolvers/discussion.ex:77 +#, elixir-format msgid "You need to be logged-in to access discussions" msgstr "Вам необходимо войти в систему, чтобы получить доступ к обсуждениям" -#, elixir-format #: lib/graphql/resolvers/resource.ex:94 +#, elixir-format msgid "You need to be logged-in to access resources" msgstr "Вам необходимо войти в систему, чтобы получить доступ к ресурсам" -#, elixir-format #: lib/graphql/resolvers/event.ex:283 +#, elixir-format msgid "You need to be logged-in to create events" msgstr "" "Вам необходимо войти в систему, чтобы иметь возможность создавать мероприятия" -#, elixir-format #: lib/graphql/resolvers/post.ex:142 +#, elixir-format msgid "You need to be logged-in to create posts" msgstr "" "Вам необходимо войти в систему, чтобы иметь возможность создавать публикации" -#, elixir-format #: lib/graphql/resolvers/report.ex:74 +#, elixir-format msgid "You need to be logged-in to create reports" msgstr "" "Вам необходимо войти в систему, чтобы иметь возможность создавать отчёты" -#, elixir-format #: lib/graphql/resolvers/resource.ex:133 +#, elixir-format msgid "You need to be logged-in to create resources" msgstr "" "Вам необходимо войти в систему, чтобы иметь возможность создавать ресурсы" -#, elixir-format #: lib/graphql/resolvers/event.ex:363 +#, elixir-format msgid "You need to be logged-in to delete an event" msgstr "" "Вам необходимо войти в систему, чтобы иметь возможность удалить мероприятие" -#, elixir-format #: lib/graphql/resolvers/post.ex:213 +#, elixir-format msgid "You need to be logged-in to delete posts" msgstr "" "Вам необходимо войти в систему, чтобы иметь возможность удалять публикации" -#, elixir-format #: lib/graphql/resolvers/resource.ex:191 +#, elixir-format msgid "You need to be logged-in to delete resources" msgstr "Вам необходимо войти в систему, чтобы иметь возможность удалять ресурсы" -#, elixir-format #: lib/graphql/resolvers/participant.ex:104 +#, elixir-format msgid "You need to be logged-in to join an event" msgstr "Вам необходимо войти в систему, чтобы присоединиться к мероприятию" -#, elixir-format #: lib/graphql/resolvers/participant.ex:203 +#, elixir-format msgid "You need to be logged-in to leave an event" msgstr "Вам необходимо войти в систему, чтобы покинуть мероприятие" -#, elixir-format #: lib/graphql/resolvers/event.ex:327 +#, elixir-format msgid "You need to be logged-in to update an event" msgstr "Вам необходимо войти в систему, чтобы обновить мероприятие" -#, elixir-format #: lib/graphql/resolvers/post.ex:180 +#, elixir-format msgid "You need to be logged-in to update posts" msgstr "" "Вам необходимо войти в систему, чтобы иметь возможность обновлять публикации" -#, elixir-format #: lib/graphql/resolvers/resource.ex:162 +#, elixir-format msgid "You need to be logged-in to update resources" msgstr "" "Вам необходимо войти в систему, чтобы иметь возможность обновлять ресурсы" -#, elixir-format #: lib/graphql/resolvers/resource.ex:218 +#, elixir-format msgid "You need to be logged-in to view a resource preview" msgstr "" "Вам необходимо войти в систему, чтобы получить доступ к предпросмотру " "ресурсов" -#, elixir-format #: lib/graphql/resolvers/resource.ex:125 +#, elixir-format msgid "Parent resource doesn't belong to this group" msgstr "Родительский ресурс не принадлежит к этой группе" -#, elixir-format #: lib/mobilizon/users/user.ex:110 +#, elixir-format msgid "The chosen password is too short." msgstr "Выбран слишком короткий пароль." -#, elixir-format #: lib/mobilizon/users/user.ex:139 +#, elixir-format msgid "The registration token is already in use, this looks like an issue on our side." msgstr "" "Регистрационный токен уже используется. Похоже, что проблема с нашей стороны." -#, elixir-format #: lib/mobilizon/users/user.ex:105 +#, elixir-format msgid "This email is already used." msgstr "Этот электронный адрес уже используется." -#, elixir-format #: lib/graphql/error.ex:89 +#, elixir-format msgid "Post not found" msgstr "Пост не найден" -#, elixir-format #: lib/graphql/error.ex:76 +#, elixir-format msgid "Invalid arguments passed" msgstr "Переданы неверные аргументы" -#, elixir-format #: lib/graphql/error.ex:82 +#, elixir-format msgid "Invalid credentials" msgstr "Неверные учётные данные" -#, elixir-format #: lib/graphql/error.ex:80 +#, elixir-format msgid "Reset your password to login" msgstr "Сбросьте пароль для входа в систему" -#, elixir-format #: lib/graphql/error.ex:87 lib/graphql/error.ex:92 +#, elixir-format msgid "Resource not found" msgstr "Ресурс не найден" -#, elixir-format #: lib/graphql/error.ex:94 +#, elixir-format msgid "Something went wrong" msgstr "Что-то пошло не так" -#, elixir-format #: lib/graphql/error.ex:75 +#, elixir-format msgid "Unknown Resource" msgstr "Неизвестный ресурс" -#, elixir-format #: lib/graphql/error.ex:85 +#, elixir-format msgid "You don't have permission to do this" msgstr "У вас недостаточно для этого прав" -#, elixir-format #: lib/graphql/error.ex:77 +#, elixir-format msgid "You need to be logged in" msgstr "Вам необходимо войти в систему" -#, elixir-format #: lib/graphql/resolvers/member.ex:114 +#, elixir-format msgid "You can't accept this invitation with this profile." msgstr "Вы не можете принять это приглашение из этого профиля." -#, elixir-format #: lib/graphql/resolvers/member.ex:132 +#, elixir-format msgid "You can't reject this invitation with this profile." msgstr "Вы не можете отклонить это приглашение из этого профиля." -#, elixir-format #: lib/graphql/resolvers/media.ex:72 +#, elixir-format msgid "File doesn't have an allowed MIME type." msgstr "Файл не имеет разрешенного MIME-типа." -#, elixir-format #: lib/graphql/resolvers/group.ex:175 +#, elixir-format msgid "Profile is not administrator for the group" msgstr "Профиль не является администратором группы" -#, elixir-format #: lib/graphql/resolvers/event.ex:316 +#, elixir-format msgid "You can't edit this event." msgstr "Вы не можете редактировать это мероприятие." -#, elixir-format #: lib/graphql/resolvers/event.ex:319 +#, elixir-format msgid "You can't attribute this event to this profile." msgstr "Вы не можете назначить это мероприятие этому профилю." -#, elixir-format #: lib/graphql/resolvers/member.ex:135 +#, elixir-format msgid "This invitation doesn't exist." msgstr "Такого приглашения не существует." -#, elixir-format #: lib/graphql/resolvers/member.ex:177 +#, elixir-format msgid "This member already has been rejected." msgstr "Этот участник уже был отклонён." -#, elixir-format #: lib/graphql/resolvers/member.ex:184 +#, elixir-format msgid "You don't have the right to remove this member." msgstr "У вас нет прав на удаление этого участника." -#, elixir-format #: lib/mobilizon/actors/actor.ex:351 +#, elixir-format msgid "This username is already taken." msgstr "Это имя пользователя уже занято." -#, elixir-format #: lib/graphql/resolvers/discussion.ex:74 +#, elixir-format msgid "You must provide either an ID or a slug to access a discussion" msgstr "" "Вы должны предоставить либо ID, либо короткое имя для доступа к обсуждению" -#, elixir-format #: lib/graphql/resolvers/event.ex:272 +#, elixir-format msgid "Organizer profile is not owned by the user" msgstr "Профиль организатора не принадлежит пользователю" -#, elixir-format #: lib/graphql/resolvers/participant.ex:89 +#, elixir-format msgid "Profile ID provided is not the anonymous profile one" msgstr "Указанный ID профиля не является анонимным" -#, elixir-format #: lib/graphql/resolvers/group.ex:136 lib/graphql/resolvers/group.ex:169 #: lib/graphql/resolvers/person.ex:132 lib/graphql/resolvers/person.ex:159 lib/graphql/resolvers/person.ex:251 +#, elixir-format msgid "The provided picture is too heavy" msgstr "Предоставленное изображение слишком большое" -#, elixir-format #: lib/web/views/utils.ex:33 +#, elixir-format msgid "Index file not found. You need to recompile the front-end." msgstr "Индексный файл не найден. Вам нужно пересобрать фронтенд." -#, elixir-format #: lib/graphql/resolvers/resource.ex:122 +#, elixir-format msgid "Error while creating resource" msgstr "При создании ресурса произошла ошибка" -#, elixir-format #: lib/graphql/resolvers/user.ex:429 +#, elixir-format msgid "Invalid activation token" msgstr "Неверный токен активации" -#, elixir-format #: lib/graphql/resolvers/resource.ex:208 +#, elixir-format msgid "Unable to fetch resource details from this URL." msgstr "Невозможно получить сведения о ресурсе по этому URL-адресу." -#, elixir-format #: lib/graphql/resolvers/event.ex:164 lib/graphql/resolvers/participant.ex:234 +#, elixir-format msgid "Provided profile doesn't have moderator permissions on this event" msgstr "Указанный профиль модератора не имеет доступа к этому событию" -#, elixir-format #: lib/graphql/resolvers/event.ex:266 +#, elixir-format msgid "Organizer profile doesn't have permission to create an event on behalf of this group" msgstr "" +"В профиле организатора нет разрешения на создание мероприятия от имени этой " +"группы" -#, elixir-format #: lib/graphql/resolvers/event.ex:307 +#, elixir-format msgid "This profile doesn't have permission to update an event on behalf of this group" msgstr "" +"У этого профиля нет разрешения на обновление мероприятия от имени этой группы" -#, elixir-format, fuzzy #: lib/graphql/resolvers/user.ex:153 +#, elixir-format msgid "Your e-mail has been denied registration or uses a disallowed e-mail provider" msgstr "" +"Ваш адрес электронной почты был отклонен при регистрации или используется " +"запрещенная служба электронной почты" From a616e511485e06e8646d4e09314e4f88f5a43418 Mon Sep 17 00:00:00 2001 From: GunChleoc Date: Thu, 12 Aug 2021 13:44:10 +0000 Subject: [PATCH 160/169] Translated using Weblate (Gaelic) Currently translated at 100.0% (1130 of 1130 strings) Translation: Mobilizon/Frontend Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/gd/ --- js/src/i18n/gd.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/js/src/i18n/gd.json b/js/src/i18n/gd.json index a449b3173..d5a4076db 100644 --- a/js/src/i18n/gd.json +++ b/js/src/i18n/gd.json @@ -725,6 +725,7 @@ "Share this group": "Co-roinn am buidheann seo", "Short bio": "Sgeul-beatha goirid", "Show map": "Seall am mapa", + "Show me where I am": "Seall càite a bheil mi", "Show remaining number of places": "Seall na tha air fhàgail de dh’àiteachan", "Show the time when the event begins": "Seall an t-àm a thòisicheas an tachartas", "Show the time when the event ends": "Seall an t-àm a chrìochnaicheas an tachartas", @@ -1031,6 +1032,8 @@ "Your timezone was detected as {timezone}.": "Mhothaich sinn dha {timezone} mar an roinn-tìde agad.", "Your timezone {timezone} isn't supported.": "Chan eil taic ris an roinn-tìde {timezone} agad.", "Your upcoming events": "Na tachartasan a tha gu bhith agad", + "Zoom in": "Sùm a-steach", + "Zoom out": "Sùm a-mach", "[This comment has been deleted by it's author]": "[Chaidh am beachd seo a sguabadh às leis an ùghdar]", "[This comment has been deleted]": "[Chaidh am beachd seo a sguabadh às]", "[deleted]": "[air a sguabadh às]", From 34e2c4f3109a36f57e8c0d263b9979d1d8a7c2d4 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Mon, 16 Aug 2021 10:23:16 +0200 Subject: [PATCH 161/169] Fix geocoordinates mixmatch Closes #828 Signed-off-by: Thomas Citharel --- lib/federation/activity_stream/converter/address.ex | 4 ++-- lib/mobilizon/addresses/address.ex | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/federation/activity_stream/converter/address.ex b/lib/federation/activity_stream/converter/address.ex index 87b679ac7..9b52dfcaf 100644 --- a/lib/federation/activity_stream/converter/address.ex +++ b/lib/federation/activity_stream/converter/address.ex @@ -40,7 +40,7 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Address do res else geo = %Geo.Point{ - coordinates: {object["latitude"], object["longitude"]}, + coordinates: {object["longitude"], object["latitude"]}, srid: 4326 } @@ -72,8 +72,8 @@ defmodule Mobilizon.Federation.ActivityStream.Converter.Address do res else res - |> Map.put("latitude", address.geom.coordinates |> elem(0)) |> Map.put("longitude", address.geom.coordinates |> elem(1)) + |> Map.put("latitude", address.geom.coordinates |> elem(0)) end end end diff --git a/lib/mobilizon/addresses/address.ex b/lib/mobilizon/addresses/address.ex index 2df321757..d1de602b5 100644 --- a/lib/mobilizon/addresses/address.ex +++ b/lib/mobilizon/addresses/address.ex @@ -76,7 +76,7 @@ defmodule Mobilizon.Addresses.Address do def coords(nil), do: nil def coords(%__MODULE__{} = address) do - with %Geo.Point{coordinates: {latitude, longitude}, srid: 4326} <- address.geom do + with %Geo.Point{coordinates: {longitude, latitude}, srid: 4326} <- address.geom do {latitude, longitude} end end From f20414126285e5ca9942092fdee8830689dfcffe Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Mon, 16 Aug 2021 11:16:45 +0200 Subject: [PATCH 162/169] Content is visible only @ap_public is in "to" Closes #711 Signed-off-by: Thomas Citharel --- lib/federation/activity_pub/visibility.ex | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/federation/activity_pub/visibility.ex b/lib/federation/activity_pub/visibility.ex index ed9c39d63..99337dc2d 100644 --- a/lib/federation/activity_pub/visibility.ex +++ b/lib/federation/activity_pub/visibility.ex @@ -20,7 +20,7 @@ defmodule Mobilizon.Federation.ActivityPub.Visibility do def is_public?(%Activity{data: data}), do: is_public?(data) def is_public?(data) when is_map(data) do - @public in (make_list(Map.get(data, "to", [])) ++ make_list(Map.get(data, "cc", []))) + @public in make_list(Map.get(data, "to", [])) end def is_public?(%Comment{deleted_at: deleted_at}), do: !is_nil(deleted_at) From 9ff127d172b645adf7e97626ef6bb2392efaa7bf Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Mon, 16 Aug 2021 11:35:45 +0200 Subject: [PATCH 163/169] Upgrade deps Signed-off-by: Thomas Citharel --- js/yarn.lock | 164 ++++++++++++++++++++++++++------------------------- mix.lock | 4 +- 2 files changed, 85 insertions(+), 83 deletions(-) diff --git a/js/yarn.lock b/js/yarn.lock index 1c2edcf69..83e2afd8d 100644 --- a/js/yarn.lock +++ b/js/yarn.lock @@ -1356,10 +1356,10 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@polka/url@^1.0.0-next.15": - version "1.0.0-next.15" - resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.15.tgz#6a9d143f7f4f49db2d782f9e1c8839a29b43ae23" - integrity sha512-15spi3V28QdevleWBNXE4pIls3nFZmBbUGrW9IVPwiQczuSb9n76TCB4bsk8TSel+I1OkHEdPhu5QKMfY6rQHA== +"@polka/url@^1.0.0-next.17": + version "1.0.0-next.17" + resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.17.tgz#25fdbdfd282c2f86ddf3fcefbd98be99cd2627e2" + integrity sha512-0p1rCgM3LLbAdwBnc7gqgnvjHg9KpbhcSphergHShlkWz8EdPawoMJ3/VbezI0mGC5eKCDzMaPgF9Yca6cKvrg== "@popperjs/core@^2.8.3": version "2.9.3" @@ -1457,10 +1457,10 @@ ejs "^2.6.1" magic-string "^0.25.0" -"@tiptap/core@^2.0.0-beta.41", "@tiptap/core@^2.0.0-beta.95": - version "2.0.0-beta.95" - resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.0.0-beta.95.tgz#9060991f2af566fd0ee0fb93a5de6beda0c60361" - integrity sha512-nsDAI8U9ypaQfJbzhLX035IJNZ71ym+qz5xkrBXzXRN9zcIfeELHi8BqNVRe6w79yWeF1fkrs32W/GXEe/V0bQ== +"@tiptap/core@^2.0.0-beta.41", "@tiptap/core@^2.0.0-beta.99": + version "2.0.0-beta.99" + resolved "https://registry.yarnpkg.com/@tiptap/core/-/core-2.0.0-beta.99.tgz#6ff2ef0a089b1d33713e5e57cff2f691dba5bddf" + integrity sha512-DoSIgeYyWGWTDVHyquVM5SM61T4U8kKWjlmOtSPcee13Z5zXrbCBSxCTgtC3uh7I+OcoE/PNQQFMU9yWZzKnhw== dependencies: "@types/prosemirror-commands" "^1.0.4" "@types/prosemirror-inputrules" "^1.0.4" @@ -1477,7 +1477,7 @@ prosemirror-schema-list "^1.1.5" prosemirror-state "^1.3.4" prosemirror-transform "^1.3.2" - prosemirror-view "^1.18.11" + prosemirror-view "^1.19.0" "@tiptap/extension-blockquote@^2.0.0-beta.15", "@tiptap/extension-blockquote@^2.0.0-beta.6": version "2.0.0-beta.15" @@ -1491,13 +1491,13 @@ resolved "https://registry.yarnpkg.com/@tiptap/extension-bold/-/extension-bold-2.0.0-beta.15.tgz#cf9ddb3fc316be9707753ad4e497bfb8a3ebb0c2" integrity sha512-jKyV6iiwhxwa0+7uuKD74jNDVNLNOS1GmU14MgaA95pY5e1fyaRBPPX8Gtt89niz2CLOY711AV17RPZTe/e60w== -"@tiptap/extension-bubble-menu@^2.0.0-beta.26", "@tiptap/extension-bubble-menu@^2.0.0-beta.9": - version "2.0.0-beta.26" - resolved "https://registry.yarnpkg.com/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.0.0-beta.26.tgz#3c017ce950b4aa32b41ec78f5578e1e75c0bd576" - integrity sha512-MwgnqOIrQoTdkousvxIlyIaQ0r5LBLw7H5EcRjx7wdImwarLusG1qTVqTu1rl1FdeKRgFYyj4X2/c3L6Pn4NcA== +"@tiptap/extension-bubble-menu@^2.0.0-beta.29", "@tiptap/extension-bubble-menu@^2.0.0-beta.9": + version "2.0.0-beta.29" + resolved "https://registry.yarnpkg.com/@tiptap/extension-bubble-menu/-/extension-bubble-menu-2.0.0-beta.29.tgz#570bcc606cff4deb10b4ef3b7a6e116c92c028ec" + integrity sha512-fOzUaMRCEQEtNUsJXeiuSbQuw19DObLISTbF78HQQh8VTsUu1uLeIxSlEcZ0u3Cl/kMFcDCKeIZb+jkRfEAjNw== dependencies: prosemirror-state "^1.3.4" - prosemirror-view "^1.18.11" + prosemirror-view "^1.19.0" tippy.js "^6.3.1" "@tiptap/extension-bullet-list@^2.0.0-beta.15": @@ -1537,13 +1537,13 @@ "@types/prosemirror-dropcursor" "^1.0.2" prosemirror-dropcursor "^1.3.5" -"@tiptap/extension-floating-menu@^2.0.0-beta.20": - version "2.0.0-beta.20" - resolved "https://registry.yarnpkg.com/@tiptap/extension-floating-menu/-/extension-floating-menu-2.0.0-beta.20.tgz#58b9ece32094aeff67e3bba4025b793ce9dbd7d1" - integrity sha512-slM2tKOECCScDWmHKksSBV8xFEWyDxeoXGG/ne7okZLrObmVV+9T2e2VTz6ZaGz0tFy3zPuMm8Yf3RKOhEUUiQ== +"@tiptap/extension-floating-menu@^2.0.0-beta.23": + version "2.0.0-beta.23" + resolved "https://registry.yarnpkg.com/@tiptap/extension-floating-menu/-/extension-floating-menu-2.0.0-beta.23.tgz#d2075e58449585fe4e365a1fbf1f708bf54dc2c5" + integrity sha512-vhJjqf0iCbn8sG/WSbGW/5QkJNoh/l25In7zGG6eRRwzxKiQy2POdkSxCZdcFKjyg8xNu8OXZURWkpSx8XJKSA== dependencies: prosemirror-state "^1.3.4" - prosemirror-view "^1.18.11" + prosemirror-view "^1.19.0" tippy.js "^6.3.1" "@tiptap/extension-gapcursor@^2.0.0-beta.19": @@ -1574,10 +1574,10 @@ "@types/prosemirror-history" "^1.0.3" prosemirror-history "^1.1.3" -"@tiptap/extension-horizontal-rule@^2.0.0-beta.18": - version "2.0.0-beta.18" - resolved "https://registry.yarnpkg.com/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.0.0-beta.18.tgz#8e2980325d219933920fb89de9b954202f130919" - integrity sha512-drcPbveAwjj/Ci7glcP6bw5PjKOE6ADHBumwpS3pTLEvWbcF3o6XfRFLykZoGLsforv+/d2JMs7vKnLNbnUHSw== +"@tiptap/extension-horizontal-rule@^2.0.0-beta.19": + version "2.0.0-beta.19" + resolved "https://registry.yarnpkg.com/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-2.0.0-beta.19.tgz#d98d0070a2cead32a497b62586c0e259d31f3f2e" + integrity sha512-RrU7+inExgC+rRmFWoTxALbu/IgRGRik11LPhMhqrCB+n0XFRUMyVEb/jbfgHWVrPmTXq0MbSWW6LYw3iREzRA== dependencies: prosemirror-state "^1.3.4" @@ -1604,11 +1604,13 @@ integrity sha512-t6xwEqP+d5443Ul2Jvqz9kXb3ro7bA7yY9HA0vskm3120WxxHW9jxgxZN+82Ot5Tm7nXOAlsN6vuqnt4idnxZQ== "@tiptap/extension-mention@^2.0.0-beta.42": - version "2.0.0-beta.64" - resolved "https://registry.yarnpkg.com/@tiptap/extension-mention/-/extension-mention-2.0.0-beta.64.tgz#cee3eee3fd3008e5dc0d9a9825cebbd24f349276" - integrity sha512-xk3HvGOZVmOWVO+DNYpDhSR14C7ZuaNd3AuNHuvX7vFI6nmDOc7blTDxOyVcLMT9C0N5x3awjJrJb12/vc6z+g== + version "2.0.0-beta.67" + resolved "https://registry.yarnpkg.com/@tiptap/extension-mention/-/extension-mention-2.0.0-beta.67.tgz#da150818181f358147f7cd1a50fca50d30f665f8" + integrity sha512-lx++MzXr4nL3jQyd06pYrVc3U5wDYHIa56nDE5d9JhW36pYfaXh+mLNu0LMRAG8PsUJizicHhNA82ZDsqu1EpA== dependencies: - "@tiptap/suggestion" "^2.0.0-beta.62" + "@tiptap/suggestion" "^2.0.0-beta.65" + prosemirror-model "^1.14.3" + prosemirror-state "^1.3.4" "@tiptap/extension-ordered-list@^2.0.0-beta.15", "@tiptap/extension-ordered-list@^2.0.0-beta.6": version "2.0.0-beta.15" @@ -1638,11 +1640,11 @@ integrity sha512-N3wMfSJkn+A5HbuLSpbn1Zp9CWWLXfMexpVdg4eUwTMOgF/kpVRaPGCkBonhHH3NfWtT7QbSipdWc7DKpBb8Jw== "@tiptap/starter-kit@^2.0.0-beta.37": - version "2.0.0-beta.92" - resolved "https://registry.yarnpkg.com/@tiptap/starter-kit/-/starter-kit-2.0.0-beta.92.tgz#462750fa0daa79acaebdbf379ff9bccf499b9953" - integrity sha512-Ak0ZOjGdRFyxISKwM1QR5XLlUlOjTNi20f+2ltFGy47k6WJIM1PmhaTRuTsFbBFM64JE1BdMyd3VldK2kD2nrw== + version "2.0.0-beta.97" + resolved "https://registry.yarnpkg.com/@tiptap/starter-kit/-/starter-kit-2.0.0-beta.97.tgz#8eccba0900af144b8e30cd39ead75b1472e8b4c0" + integrity sha512-ySnJPG6px/Pv99TGCrgXOi7Ahh1qkpV171C791lLlFuH+lXMo719bWaeCTEiBDxjamVzh18nEJkIxyu6sucpSg== dependencies: - "@tiptap/core" "^2.0.0-beta.95" + "@tiptap/core" "^2.0.0-beta.99" "@tiptap/extension-blockquote" "^2.0.0-beta.15" "@tiptap/extension-bold" "^2.0.0-beta.15" "@tiptap/extension-bullet-list" "^2.0.0-beta.15" @@ -1654,7 +1656,7 @@ "@tiptap/extension-hard-break" "^2.0.0-beta.15" "@tiptap/extension-heading" "^2.0.0-beta.15" "@tiptap/extension-history" "^2.0.0-beta.15" - "@tiptap/extension-horizontal-rule" "^2.0.0-beta.18" + "@tiptap/extension-horizontal-rule" "^2.0.0-beta.19" "@tiptap/extension-italic" "^2.0.0-beta.15" "@tiptap/extension-list-item" "^2.0.0-beta.14" "@tiptap/extension-ordered-list" "^2.0.0-beta.15" @@ -1662,23 +1664,23 @@ "@tiptap/extension-strike" "^2.0.0-beta.17" "@tiptap/extension-text" "^2.0.0-beta.13" -"@tiptap/suggestion@^2.0.0-beta.62": - version "2.0.0-beta.62" - resolved "https://registry.yarnpkg.com/@tiptap/suggestion/-/suggestion-2.0.0-beta.62.tgz#70c123ea0d2bf635f10c6e67f902648192075165" - integrity sha512-HCpoti2Bl1rmIEZG/LPdfuJpG1YeMVqbrK8YHDN8+QmhOiMSsAIjeOQNGD1brO9kd+KIQkQlUlGeglQN5TKuGg== +"@tiptap/suggestion@^2.0.0-beta.65": + version "2.0.0-beta.65" + resolved "https://registry.yarnpkg.com/@tiptap/suggestion/-/suggestion-2.0.0-beta.65.tgz#d998dd9aa3dfc6e42ab683078caa1e7467a676c2" + integrity sha512-Y8pV9jJwe5EfmKOG6jlkRYRR3F0XqQB6Li11aiDIPUHhZI/Wj2U1nuoMpc2W5+kWzaIyFB02t3IbYj6azdRYWg== dependencies: prosemirror-model "^1.14.3" prosemirror-state "^1.3.4" - prosemirror-view "^1.18.11" + prosemirror-view "^1.19.0" "@tiptap/vue-2@^2.0.0-beta.21": - version "2.0.0-beta.43" - resolved "https://registry.yarnpkg.com/@tiptap/vue-2/-/vue-2-2.0.0-beta.43.tgz#436e55dc7f83cd2412e45063f316445a5e11fb0b" - integrity sha512-6X29ZvOF7MTlimj8RWbJaWjLYisRlnsNXhnkIEi7DUZyA2c8awJtJPh5Y/UMlOBqurSBRDYDvxUqN8NJrqhkXg== + version "2.0.0-beta.46" + resolved "https://registry.yarnpkg.com/@tiptap/vue-2/-/vue-2-2.0.0-beta.46.tgz#2998dd1bbf2df9001e449658771574bba84886d5" + integrity sha512-+3Iuh6sFIbfuPjBxGfpyOaiBVqC2LqJrjJvKgWl6vT3zrMYSGnPuTHiWtOnkxIPRDVuEjLvm9uoFQJHUoxRYEA== dependencies: - "@tiptap/extension-bubble-menu" "^2.0.0-beta.26" - "@tiptap/extension-floating-menu" "^2.0.0-beta.20" - prosemirror-view "^1.18.11" + "@tiptap/extension-bubble-menu" "^2.0.0-beta.29" + "@tiptap/extension-floating-menu" "^2.0.0-beta.23" + prosemirror-view "^1.19.0" "@tootallnate/once@1": version "1.1.2" @@ -1900,9 +1902,9 @@ integrity sha512-rr20mmx41OkWx4q5du2dv2sESR/6xH2tzScUQXwO8SiaQWa6PYTuan1nqBtA76FR9qkVfZY7nwQwZNC9StX/Ww== "@types/node@*": - version "16.6.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.6.0.tgz#0d5685f85066f94e97f19e8a67fe003c5fadacc4" - integrity sha512-OyiZPohMMjZEYqcVo/UJ04GyAxXOJEZO/FpzyXxcH4r/ArrVoXHf4MbUrkLp0Tz7/p1mMKpo5zJ6ZHl8XBNthQ== + version "16.6.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.6.1.tgz#aee62c7b966f55fc66c7b6dfa1d58db2a616da61" + integrity sha512-Sr7BhXEAer9xyGuCN3Ek9eg9xPviCF2gfu9kTfuU2HkTVAMYSDeX40fvpmo72n5nansg3nsBjuQBrsS28r+NUw== "@types/node@^14.14.31": version "14.17.9" @@ -1980,9 +1982,9 @@ "@types/prosemirror-view" "*" "@types/prosemirror-model@*", "@types/prosemirror-model@^1.13.1", "@types/prosemirror-model@^1.7.2": - version "1.13.1" - resolved "https://registry.yarnpkg.com/@types/prosemirror-model/-/prosemirror-model-1.13.1.tgz#53df04ee174a7e1dc12747005b1b4c02565adcc4" - integrity sha512-tA1AlI+YR2t3Ve5eeQVJnQm4yV4wVlNfeogHusD1X3OEqqMYTuPssThgIMR4PxPHtvV871Ix8a20bUiJvULDgw== + version "1.13.2" + resolved "https://registry.yarnpkg.com/@types/prosemirror-model/-/prosemirror-model-1.13.2.tgz#2adad3ec478f83204f155d7fb94c9dfde2fc3296" + integrity sha512-a2rDB0aZ+7aIP7uBqQq1wLb4Hg4qqEvpkCqvhsgT/gG8IWC0peCAZfQ24sgTco0qSJLeDgIbtPeU6mgr869/kg== dependencies: "@types/orderedmap" "*" @@ -2758,10 +2760,10 @@ dependencies: envinfo "^7.7.3" -"@webpack-cli/serve@^1.5.1": - version "1.5.1" - resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.5.1.tgz#b5fde2f0f79c1e120307c415a4c1d5eb15a6f278" - integrity sha512-4vSVUiOPJLmr45S8rMGy7WDvpWxfFxfP/Qx/cxZFCfvoypTYpPPL1X8VIZMe0WTA+Jr7blUxwUSEZNkjoMTgSw== +"@webpack-cli/serve@^1.5.2": + version "1.5.2" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.5.2.tgz#ea584b637ff63c5a477f6f21604b5a205b72c9ec" + integrity sha512-vgJ5OLWadI8aKjDlOH3rb+dYyPd2GTZuQC/Tihjct6F9GpXGZINo3Y/IVuZVTM1eDQB+/AOsjPUWH/WySDaXvw== "@wry/context@^0.6.0": version "0.6.1" @@ -3904,9 +3906,9 @@ color-name@~1.1.4: integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== colord@^2.0.1: - version "2.6.0" - resolved "https://registry.yarnpkg.com/colord/-/colord-2.6.0.tgz#6cd716e1270cfff8d6f66e751768749650e209cd" - integrity sha512-8yMrtE20ZxH1YWvvSoeJFtvqY+GIAOfU+mZ3jx7ZSiEMasnAmNqD1BKUP3CuCWcy/XHgcXkLW6YU8C35nhOYVg== + version "2.7.0" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.7.0.tgz#706ea36fe0cd651b585eb142fe64b6480185270e" + integrity sha512-pZJBqsHz+pYyw3zpX6ZRXWoCHM1/cvFikY9TV8G3zcejCaKE0lhankoj8iScyrrePA8C7yJ5FStfA9zbcOnw7Q== colorette@^1.2.1, colorette@^1.2.2: version "1.3.0" @@ -4709,9 +4711,9 @@ ejs@^2.6.1: integrity sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA== electron-to-chromium@^1.3.793: - version "1.3.803" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.803.tgz#78993a991d096500f21a77e91cd2a44295fe3cbe" - integrity sha512-tmRK9qB8Zs8eLMtTBp+w2zVS9MUe62gQQQHjYdAc5Zljam3ZIokNb+vZLPRz9RCREp6EFRwyhOFwbt1fEriQ2Q== + version "1.3.806" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.806.tgz#21502100f11aead6c501d1cd7f2504f16c936642" + integrity sha512-AH/otJLAAecgyrYp0XK1DPiGVWcOgwPeJBOLeuFQ5l//vhQhwC9u6d+GijClqJAmsHG4XDue81ndSQPohUu0xA== emittery@^0.7.1: version "0.7.2" @@ -4882,9 +4884,9 @@ eslint-config-prettier@^6.0.0: get-stdin "^6.0.0" eslint-import-resolver-node@^0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.5.tgz#939bbb0f74e179e757ca87f7a4a890dabed18ac4" - integrity sha512-XMoPKjSpXbkeJ7ZZ9icLnJMTY5Mc1kZbCakHquaFsXPpyWOwK0TK6CODO+0ca54UoM9LKOxyUNnoVZRl8TeaAg== + version "0.3.6" + resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz#4048b958395da89668252001dbd9eca6b83bacbd" + integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw== dependencies: debug "^3.2.7" resolve "^1.20.0" @@ -5749,9 +5751,9 @@ globals@^11.1.0, globals@^11.12.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.6.0, globals@^13.9.0: - version "13.10.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.10.0.tgz#60ba56c3ac2ca845cfbf4faeca727ad9dd204676" - integrity sha512-piHC3blgLGFjvOuMmWZX60f+na1lXFDhQXBf1UYp2fXPXqvEUbOhNwi6BsQ0bQishwedgnjkwv1d9zKf+MWw3g== + version "13.11.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.11.0.tgz#40ef678da117fe7bd2e28f1fab24951bd0255be7" + integrity sha512-08/xrJ7wQjK9kkkRoI3OFUBbLx4f+6x3SGwcPvQ0QH6goFDrOU2oyAWrmh3dJezu65buo+HBMzAMQy6rovVC3g== dependencies: type-fest "^0.20.2" @@ -9094,10 +9096,10 @@ prosemirror-transform@^1.0.0, prosemirror-transform@^1.1.0, prosemirror-transfor dependencies: prosemirror-model "^1.0.0" -prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.18.11: - version "1.18.11" - resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.18.11.tgz#1a839508e7cb6d500a95512af8079661f9e36034" - integrity sha512-KXUM8UEV+IK4JYWHNyxkPGDGbxeTEUHQv3POApfyTRN5eMcPFbY4cB0mDJr0LPelVvYPghmZDOCqfCIm9mYHtQ== +prosemirror-view@^1.0.0, prosemirror-view@^1.1.0, prosemirror-view@^1.19.0: + version "1.19.1" + resolved "https://registry.yarnpkg.com/prosemirror-view/-/prosemirror-view-1.19.1.tgz#3fe7479c28501da68348b31fb62a02f56d6d96c8" + integrity sha512-Hijrpw5pSkdr8LvN2KK9AxNngdJu9ftZw8gGB6jCk2bYOZ3VsQCehjKn4Chx3LvRiG3IGZMR2m1jWylRjmiwpA== dependencies: prosemirror-model "^1.14.3" prosemirror-state "^1.0.0" @@ -9871,11 +9873,11 @@ signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3: integrity sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA== sirv@^1.0.7: - version "1.0.12" - resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.12.tgz#d816c882b35489b3c63290e2f455ae3eccd5f652" - integrity sha512-+jQoCxndz7L2tqQL4ZyzfDhky0W/4ZJip3XoOuxyQWnAwMxindLl3Xv1qT4x1YX/re0leShvTm8Uk0kQspGhBg== + version "1.0.14" + resolved "https://registry.yarnpkg.com/sirv/-/sirv-1.0.14.tgz#b826343f573e12653c5b3c3080a3a2a6a06595cd" + integrity sha512-czTFDFjK9lXj0u9mJ3OmJoXFztoilYS+NdRPcJoT182w44wSEkHSiO7A2517GLJ8wKM4GjCm2OXE66Dhngbzjg== dependencies: - "@polka/url" "^1.0.0-next.15" + "@polka/url" "^1.0.0-next.17" mime "^2.3.1" totalist "^1.0.0" @@ -10333,12 +10335,12 @@ svg-tags@^1.0.0: integrity sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q= svgo@^2.3.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.3.1.tgz#603a69ce50311c0e36791528f549644ec1b3f4bc" - integrity sha512-riDDIQgXpEnn0BEl9Gvhh1LNLIyiusSpt64IR8upJu7MwxnzetmF/Y57pXQD2NMX2lVyMRzXt5f2M5rO4wG7Dw== + version "2.4.0" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.4.0.tgz#0c42653101fd668692c0f69b55b8d7b182ef422b" + integrity sha512-W25S1UUm9Lm9VnE0TvCzL7aso/NCzDEaXLaElCUO/KaVitw0+IBicSVfM1L1c0YHK5TOFh73yQ2naCpVHEQ/OQ== dependencies: "@trysound/sax" "0.1.1" - chalk "^4.1.0" + colorette "^1.2.2" commander "^7.1.0" css-select "^4.1.3" css-tree "^1.1.2" @@ -11194,14 +11196,14 @@ webpack-chain@^6.5.1: javascript-stringify "^2.0.1" webpack-cli@^4.7.0: - version "4.7.2" - resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.7.2.tgz#a718db600de6d3906a4357e059ae584a89f4c1a5" - integrity sha512-mEoLmnmOIZQNiRl0ebnjzQ74Hk0iKS5SiEEnpq3dRezoyR3yPaeQZCMCe+db4524pj1Pd5ghZXjT41KLzIhSLw== + version "4.8.0" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.8.0.tgz#5fc3c8b9401d3c8a43e2afceacfa8261962338d1" + integrity sha512-+iBSWsX16uVna5aAYN6/wjhJy1q/GKk4KjKvfg90/6hykCTSgozbfz5iRgDTSJt/LgSbYxdBX3KBHeobIs+ZEw== dependencies: "@discoveryjs/json-ext" "^0.5.0" "@webpack-cli/configtest" "^1.0.4" "@webpack-cli/info" "^1.3.0" - "@webpack-cli/serve" "^1.5.1" + "@webpack-cli/serve" "^1.5.2" colorette "^1.2.1" commander "^7.0.0" execa "^5.0.0" diff --git a/mix.lock b/mix.lock index 23e2da4bc..e4dd51e29 100644 --- a/mix.lock +++ b/mix.lock @@ -39,7 +39,7 @@ "ex_cldr": {:hex, :ex_cldr, "2.23.0", "16aa883c3388a0b27485a810ae2a60d815968a473b5315454ebe2b5264e92a80", [: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: true]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "7c9dad3115e2622a4902390591d9c4a2f7c5333bd73f02a02f7b4190394c7347"}, "ex_cldr_calendars": {:hex, :ex_cldr_calendars, "1.15.1", "8d049f56ad87114b0bd0c6f8d0f4bdaa91d688181e256260af61aa9f13c527af", [: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.19", [hex: :ex_cldr_numbers, repo: "hexpm", optional: false]}, {:ex_cldr_units, "~> 3.7", [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", "d4ac12a9fd366d51252662b8477a9eb01ccbb77362115ae6dfa0e253ab139de6"}, "ex_cldr_currencies": {:hex, :ex_cldr_currencies, "2.11.1", "a6e56209d6f98082cd197aa424333e7a0e38e79253fce9589117719728de4fef", [:mix], [{:ex_cldr, "~> 2.23", [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", "99e8eb3f48a30127bb11ab70f484c124c9fe5b11bce710c94c53939032b0c58c"}, - "ex_cldr_dates_times": {:hex, :ex_cldr_dates_times, "2.8.0", "36495988148f1dc4aae1c2ef193dcb524f77008818e986f09850cf693e2f4dd3", [:mix], [{:calendar_interval, "~> 0.2", [hex: :calendar_interval, repo: "hexpm", optional: true]}, {:ex_cldr_calendars, "~> 1.15", [hex: :ex_cldr_calendars, repo: "hexpm", optional: false]}, {:ex_cldr_numbers, "~> 2.19", [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", "673cc60ea7f163436758726c0c38f01587d856e98e5df42b1a8502aa32e8935e"}, + "ex_cldr_dates_times": {:hex, :ex_cldr_dates_times, "2.9.2", "39820b1b11ba621ea2832137beb726180bb59936db2eda1df2ad9753d3539b2f", [:mix], [{:calendar_interval, "~> 0.2", [hex: :calendar_interval, repo: "hexpm", optional: true]}, {:ex_cldr_calendars, "~> 1.15", [hex: :ex_cldr_calendars, repo: "hexpm", optional: false]}, {:ex_cldr_numbers, "~> 2.19", [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", "dabd8e6f444c178b63dea8ace09477f503489027c3708785d5f0e58957104d12"}, "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.19.0", "bfefc45b1eda49896eb4d32a36e15efe649827d4fe42422937ee8e14afcd1dfd", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:ex_cldr, "~> 2.23", [hex: :ex_cldr, repo: "hexpm", optional: false]}, {:ex_cldr_currencies, "~> 2.11", [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", "0f4696e6b6c357879aaa0b3ce18f2cfc49666696371a8a3c0f9c5963aad614f4"}, "ex_doc": {:hex, :ex_doc, "0.25.1", "4b736fa38dc76488a937e5ef2944f5474f3eff921de771b25371345a8dc810bc", [: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", "3200b0a69ddb2028365281fbef3753ea9e728683863d8cdaa96580925c891f67"}, @@ -60,7 +60,7 @@ "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.4.2", "834f106e4ba072f5917920bd7ece42cfe1caa03c7fb278f85ea5d0905c8dc153", [:mix], [{:jason, "~> 1.2", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "0a9fdad0d5197678cbac85e1dac674528bd90fa923398679a174b541cdf0ec68"}, "geo_postgis": {:hex, :geo_postgis, "3.4.0", "67815cc9b3db12e378e7a96d0f77d3bc2188534aba4d2c2229e3ebf8370f9d52", [:mix], [{:geo, "~> 3.4", [hex: :geo, repo: "hexpm", optional: false]}, {:jason, "~> 1.2", [hex: :jason, repo: "hexpm", optional: true]}, {:poison, "~> 2.2 or ~> 3.0 or ~> 4.0", [hex: :poison, repo: "hexpm", optional: true]}, {:postgrex, ">= 0.0.0", [hex: :postgrex, repo: "hexpm", optional: false]}], "hexpm", "23563946ef6e5c747380e6a7a0493b0a631e91d0452314ee7e33354f4fdf5230"}, - "geohax": {:hex, :geohax, "0.4.1", "87efd3c4bb00d9dd237cef917004b635417859f51dfe716ba0864b8c61eb7e0e", [:mix], [], "hexpm", "ce6aff24726f3824caf59aa8b903a1be99ac05820b53c23196d5ac36b13a1fa3"}, + "geohax": {:hex, :geohax, "0.4.2", "282e1bdd179a7e868105ab6e5484302dc5c4548e12a706699fd55587374d2876", [:mix], [], "hexpm", "0d10f07290e8410c66014e2041d989a45f341ec4f018445ed1a69523cddf05fe"}, "geolix": {:hex, :geolix, "2.0.0", "7e65764bedfc98d08a3ddb24c417657c9d438eff163280b45fbb7de289626acd", [:mix], [], "hexpm", "8742bf588ed0bb7def2c443204d09d355990846c6efdff96ded66aac24c301df"}, "geolix_adapter_mmdb2": {:hex, :geolix_adapter_mmdb2, "0.6.0", "6ab9dbf6ea395817aa1fd2597be25d0dda1853c7f664e62716e47728d18bc4f9", [:mix], [{:geolix, "~> 2.0", [hex: :geolix, repo: "hexpm", optional: false]}, {:mmdb2_decoder, "~> 3.0", [hex: :mmdb2_decoder, repo: "hexpm", optional: false]}], "hexpm", "06ff962feae8a310cffdf86b74bfcda6e2d0dccb439bb1f62df2b657b1c0269b"}, "gettext": {:hex, :gettext, "0.18.2", "7df3ea191bb56c0309c00a783334b288d08a879f53a7014341284635850a6e55", [:mix], [], "hexpm", "f9f537b13d4fdd30f3039d33cb80144c3aa1f8d9698e47d7bcbcc8df93b1f5c5"}, From de102755f8878f2f73cfc3ff19c6a6f1da414add Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Mon, 16 Aug 2021 16:15:52 +0200 Subject: [PATCH 164/169] Add sane limits to feeds Signed-off-by: Thomas Citharel --- lib/service/export/common.ex | 36 ++++++++++++++++----------------- lib/service/export/feed.ex | 14 +++++++------ lib/service/export/icalendar.ex | 16 ++++++++------- 3 files changed, 35 insertions(+), 31 deletions(-) diff --git a/lib/service/export/common.ex b/lib/service/export/common.ex index dd3e53903..c414fd9de 100644 --- a/lib/service/export/common.ex +++ b/lib/service/export/common.ex @@ -9,12 +9,12 @@ defmodule Mobilizon.Service.Export.Common do alias Mobilizon.Storage.Page alias Mobilizon.Users.User - @spec fetch_actor_event_feed(String.t()) :: String.t() - def fetch_actor_event_feed(name) do + @spec fetch_actor_event_feed(String.t(), integer()) :: String.t() + def fetch_actor_event_feed(name, limit) do with %Actor{} = actor <- Actors.get_actor_by_name(name), {:visibility, true} <- {:visibility, Actor.is_public_visibility?(actor)}, - %Page{elements: events} <- Events.list_public_events_for_actor(actor), - %Page{elements: posts} <- Posts.get_public_posts_for_group(actor) do + %Page{elements: events} <- Events.list_public_events_for_actor(actor, 1, limit), + %Page{elements: posts} <- Posts.get_public_posts_for_group(actor, 1, limit) do {:ok, actor, events, posts} else err -> @@ -23,8 +23,8 @@ defmodule Mobilizon.Service.Export.Common do end # Only events, not posts - @spec fetch_events_from_token(String.t()) :: String.t() - def fetch_events_from_token(token) do + @spec fetch_events_from_token(String.t(), integer()) :: String.t() + def fetch_events_from_token(token, limit) do with {:ok, uuid} <- ShortUUID.decode(token), {:ok, _uuid} <- Ecto.UUID.cast(uuid), %FeedToken{actor: actor, user: %User{} = user} <- Events.get_feed_token(uuid) do @@ -33,7 +33,7 @@ defmodule Mobilizon.Service.Export.Common do %{ type: :actor, actor: actor, - events: fetch_actor_private_events(actor), + events: fetch_actor_private_events(actor, limit), user: user, token: token } @@ -42,7 +42,7 @@ defmodule Mobilizon.Service.Export.Common do with actors <- Users.get_actors_for_user(user), events <- actors - |> Enum.map(&fetch_actor_private_events/1) + |> Enum.map(&fetch_actor_private_events(&1, limit)) |> Enum.concat() do %{type: :user, events: events, user: user, token: token, actor: nil} end @@ -50,22 +50,22 @@ defmodule Mobilizon.Service.Export.Common do end end - @spec fetch_instance_public_content :: {:ok, list(Event.t()), list(Post.t())} - def fetch_instance_public_content do - with %Page{elements: events} <- Events.list_public_local_events(), - %Page{elements: posts} <- Posts.list_public_local_posts() do + @spec fetch_instance_public_content(integer()) :: {:ok, list(Event.t()), list(Post.t())} + def fetch_instance_public_content(limit) do + with %Page{elements: events} <- Events.list_public_local_events(1, limit), + %Page{elements: posts} <- Posts.list_public_local_posts(1, limit) do {:ok, events, posts} end end - @spec fetch_actor_private_events(Actor.t()) :: list(Event.t()) - def fetch_actor_private_events(%Actor{} = actor) do - actor |> fetch_identity_participations() |> participations_to_events() + @spec fetch_actor_private_events(Actor.t(), integer()) :: list(Event.t()) + def fetch_actor_private_events(%Actor{} = actor, limit) do + actor |> fetch_identity_participations(limit) |> participations_to_events() end - @spec fetch_identity_participations(Actor.t()) :: Page.t() - defp fetch_identity_participations(%Actor{} = actor) do - with %Page{} = page <- Events.list_event_participations_for_actor(actor) do + @spec fetch_identity_participations(Actor.t(), integer()) :: Page.t() + defp fetch_identity_participations(%Actor{} = actor, limit) do + with %Page{} = page <- Events.list_event_participations_for_actor(actor, 1, limit) do page end end diff --git a/lib/service/export/feed.ex b/lib/service/export/feed.ex index 30a76b37e..7d764f01e 100644 --- a/lib/service/export/feed.ex +++ b/lib/service/export/feed.ex @@ -19,6 +19,8 @@ defmodule Mobilizon.Service.Export.Feed do require Logger + @item_limit 500 + def version, do: Config.instance_version() @spec create_cache(String.t()) :: {:commit, String.t()} | {:ignore, any()} @@ -55,7 +57,7 @@ defmodule Mobilizon.Service.Export.Feed do @spec fetch_instance_feed :: {:ok, String.t()} defp fetch_instance_feed do - case Common.fetch_instance_public_content() do + case Common.fetch_instance_public_content(@item_limit) do {:ok, events, posts} -> {:ok, build_instance_feed(events, posts)} @@ -88,9 +90,9 @@ defmodule Mobilizon.Service.Export.Feed do |> Atomex.generate_document() end - @spec fetch_actor_event_feed(String.t()) :: String.t() - defp fetch_actor_event_feed(name) do - case Common.fetch_actor_event_feed(name) do + @spec fetch_actor_event_feed(String.t(), integer()) :: String.t() + defp fetch_actor_event_feed(name, limit \\ @item_limit) do + case Common.fetch_actor_event_feed(name, limit) do {:ok, actor, events, posts} -> {:ok, build_actor_feed(actor, events, posts)} @@ -198,9 +200,9 @@ defmodule Mobilizon.Service.Export.Feed do # Only events, not posts @spec fetch_events_from_token(String.t()) :: String.t() - defp fetch_events_from_token(token) do + defp fetch_events_from_token(token, limit \\ @item_limit) do with %{events: events, token: token, user: user, actor: actor, type: type} <- - Common.fetch_events_from_token(token) do + Common.fetch_events_from_token(token, limit) do case type do :user -> {:ok, build_user_feed(events, user, token)} :actor -> {:ok, build_actor_feed(actor, events, [], false)} diff --git a/lib/service/export/icalendar.ex b/lib/service/export/icalendar.ex index 4984239fd..c3ba2dde7 100644 --- a/lib/service/export/icalendar.ex +++ b/lib/service/export/icalendar.ex @@ -10,6 +10,8 @@ defmodule Mobilizon.Service.Export.ICalendar do alias Mobilizon.Service.Export.Common alias Mobilizon.Service.Formatter.HTML + @item_limit 500 + @doc """ Create cache for an actor, an event or an user token """ @@ -55,7 +57,7 @@ defmodule Mobilizon.Service.Export.ICalendar do @spec fetch_instance_feed :: {:ok, String.t()} defp fetch_instance_feed do - case Common.fetch_instance_public_content() do + case Common.fetch_instance_public_content(@item_limit) do {:ok, events, _posts} -> {:ok, %ICalendar{events: events |> Enum.map(&do_export_event/1)} |> ICalendar.to_ics()} @@ -90,8 +92,8 @@ defmodule Mobilizon.Service.Export.ICalendar do The actor must have a visibility of `:public` or `:unlisted`, as well as the events """ @spec export_public_actor(String.t()) :: String.t() - def export_public_actor(name) do - case Common.fetch_actor_event_feed(name) do + def export_public_actor(name, limit \\ @item_limit) do + case Common.fetch_actor_event_feed(name, limit) do {:ok, _actor, events, _posts} -> {:ok, events_to_ics(events)} @@ -101,15 +103,15 @@ defmodule Mobilizon.Service.Export.ICalendar do end @spec export_private_actor(Actor.t()) :: String.t() - def export_private_actor(%Actor{} = actor) do - with events <- Common.fetch_actor_private_events(actor) do + def export_private_actor(%Actor{} = actor, limit \\ @item_limit) do + with events <- Common.fetch_actor_private_events(actor, limit) do {:ok, events_to_ics(events)} end end @spec fetch_events_from_token(String.t()) :: String.t() - defp fetch_events_from_token(token) do - with %{events: events} <- Common.fetch_events_from_token(token) do + defp fetch_events_from_token(token, limit \\ @item_limit) do + with %{events: events} <- Common.fetch_events_from_token(token, limit) do {:ok, events_to_ics(events)} end end From f8f53edb765a3b0480777b4a8966d58721d86437 Mon Sep 17 00:00:00 2001 From: Norbert Szulc Date: Wed, 9 Jun 2021 01:17:46 +0200 Subject: [PATCH 165/169] Add test --- test/service/export/icalendar_test.exs | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/test/service/export/icalendar_test.exs b/test/service/export/icalendar_test.exs index b50351e12..27d1ad615 100644 --- a/test/service/export/icalendar_test.exs +++ b/test/service/export/icalendar_test.exs @@ -48,6 +48,18 @@ defmodule Mobilizon.Service.ICalendarTest do refute ics =~ event2.title assert ics =~ event3.title end + + test "with 50 events" do + Enum.each(0..50, fn i -> + %Event{} = insert(:event, title: "Event #{i}") + end) + + {:commit, ics} = ICalendarService.create_cache("instance") + + Enum.each(0..50, fn i -> + assert ics =~ "Event #{i}" + end) + end end describe "export an actor's events from a token" do From 639309ed92a1ad87041c7a34c9a6d9042bc464e6 Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Tue, 17 Aug 2021 10:28:03 +0200 Subject: [PATCH 166/169] Add some visio services to preconfigured metadata Signed-off-by: Thomas Citharel --- js/src/components/Event/EventMetadataList.vue | 3 + .../Event/Integrations/JitsiMeet.vue | 38 ++++++++++++ js/src/i18n/en_US.json | 13 ++++- js/src/i18n/fr_FR.json | 13 ++++- js/src/services/EventMetadata.ts | 58 +++++++++++++++++++ js/src/types/enums.ts | 1 + js/src/views/Event/Event.vue | 5 ++ 7 files changed, 129 insertions(+), 2 deletions(-) create mode 100644 js/src/components/Event/Integrations/JitsiMeet.vue diff --git a/js/src/components/Event/EventMetadataList.vue b/js/src/components/Event/EventMetadataList.vue index b5779def6..b6b863e77 100644 --- a/js/src/components/Event/EventMetadataList.vue +++ b/js/src/components/Event/EventMetadataList.vue @@ -140,6 +140,9 @@ export default class EventMetadataList extends Vue { [EventMetadataCategories.SOCIAL]: this.$t("Social") as string, [EventMetadataCategories.DETAILS]: this.$t("Details") as string, [EventMetadataCategories.BOOKING]: this.$t("Booking") as string, + [EventMetadataCategories.VIDEO_CONFERENCE]: this.$t( + "Video Conference" + ) as string, }; get filteredDataArray(): GroupedIEventMetadata { diff --git a/js/src/components/Event/Integrations/JitsiMeet.vue b/js/src/components/Event/Integrations/JitsiMeet.vue new file mode 100644 index 000000000..2bee04aab --- /dev/null +++ b/js/src/components/Event/Integrations/JitsiMeet.vue @@ -0,0 +1,38 @@ + + + diff --git a/js/src/i18n/en_US.json b/js/src/i18n/en_US.json index faef2ada9..b0196daf8 100644 --- a/js/src/i18n/en_US.json +++ b/js/src/i18n/en_US.json @@ -1128,5 +1128,16 @@ "Redirecting in progress…": "Redirecting in progress…", "Zoom in": "Zoom in", "Zoom out": "Zoom out", - "Show me where I am": "Show me where I am" + "Show me where I am": "Show me where I am", + "Video Conference": "Video Conference", + "Jisti Meet": "Jisti Meet", + "The Jitsi Meet video teleconference URL": "The Jitsi Meet video teleconference URL", + "Zoom": "Zoom", + "The Zoom video teleconference URL": "The Zoom video teleconference URL", + "Microsoft Teams": "Microsoft Teams", + "The Microsoft Teams video teleconference URL": "The Microsoft Teams video teleconference URL", + "Google Meet": "Google Meet", + "The Google Meet video teleconference URL": "The Google Meet video teleconference URL", + "Big Blue Button": "Big Blue Button", + "The Big Blue Button video teleconference URL": "The Big Blue Button video teleconference URL" } diff --git a/js/src/i18n/fr_FR.json b/js/src/i18n/fr_FR.json index e7f3473da..76ee8772e 100644 --- a/js/src/i18n/fr_FR.json +++ b/js/src/i18n/fr_FR.json @@ -1219,5 +1219,16 @@ "Redirecting in progress…": "Redirection en cours…", "Zoom in": "Zoomer", "Zoom out": "Dézoomer", - "Show me where I am": "Afficher ma position" + "Show me where I am": "Afficher ma position", + "Video Conference": "Visio-conférence", + "Jisti Meet": "Jitsi Meet", + "The Jitsi Meet video teleconference URL": "L'URL de visio-conférence Jitsi Meet", + "Zoom": "Zoom", + "The Zoom video teleconference URL": "L'URL de visio-conférence Zoom", + "Microsoft Teams": "Microsoft Teams", + "The Microsoft Teams video teleconference URL": "L'URL de visio-conférence Microsoft Teams", + "Google Meet": "Google Meet", + "The Google Meet video teleconference URL": "L'URL de visio-conférence Google Meet", + "Big Blue Button": "Big Blue Button", + "The Big Blue Button video teleconference URL": "L'URL de visio-conférence Big Blue Button" } diff --git a/js/src/services/EventMetadata.ts b/js/src/services/EventMetadata.ts index a6b899d85..c964f9d8d 100644 --- a/js/src/services/EventMetadata.ts +++ b/js/src/services/EventMetadata.ts @@ -209,4 +209,62 @@ export const eventMetaDataList: IEventMetadataDescription[] = [ keyType: EventMetadataKeyType.URL, category: EventMetadataCategories.DETAILS, }, + { + icon: "webcam", + key: "mz:visio:jitsi_meet", + label: i18n.t("Jisti Meet") as string, + description: i18n.t("The Jitsi Meet video teleconference URL") as string, + value: "", + type: EventMetadataType.STRING, + keyType: EventMetadataKeyType.URL, + category: EventMetadataCategories.VIDEO_CONFERENCE, + placeholder: "https://meet.jit.si/AFewWords", + }, + { + icon: "webcam", + key: "mz:visio:zoom", + label: i18n.t("Zoom") as string, + description: i18n.t("The Zoom video teleconference URL") as string, + value: "", + type: EventMetadataType.STRING, + keyType: EventMetadataKeyType.URL, + category: EventMetadataCategories.VIDEO_CONFERENCE, + pattern: /https:\/\/.*\.?zoom.us\/.*/, + }, + { + icon: "microsoft-teams", + key: "mz:visio:microsoft_teams", + label: i18n.t("Microsoft Teams") as string, + description: i18n.t( + "The Microsoft Teams video teleconference URL" + ) as string, + value: "", + type: EventMetadataType.STRING, + keyType: EventMetadataKeyType.URL, + category: EventMetadataCategories.VIDEO_CONFERENCE, + pattern: /https:\/\/teams\.live\.com\/meet\/.+/, + }, + { + icon: "google-hangouts", + key: "mz:visio:google_meet", + label: i18n.t("Google Meet") as string, + description: i18n.t("The Google Meet video teleconference URL") as string, + value: "", + type: EventMetadataType.STRING, + keyType: EventMetadataKeyType.URL, + category: EventMetadataCategories.VIDEO_CONFERENCE, + pattern: /https:\/\/meet\.google\.com\/.+/, + }, + { + icon: "webcam", + key: "mz:visio:big_blue_button", + label: i18n.t("Big Blue Button") as string, + description: i18n.t( + "The Big Blue Button video teleconference URL" + ) as string, + value: "", + type: EventMetadataType.STRING, + keyType: EventMetadataKeyType.URL, + category: EventMetadataCategories.VIDEO_CONFERENCE, + }, ]; diff --git a/js/src/types/enums.ts b/js/src/types/enums.ts index b5c738b7c..34049388b 100644 --- a/js/src/types/enums.ts +++ b/js/src/types/enums.ts @@ -274,4 +274,5 @@ export enum EventMetadataCategories { TOOLS = "TOOLS", DETAILS = "DETAILS", BOOKING = "BOOKING", + VIDEO_CONFERENCE = "VIDEO_CONFERENCE", } diff --git a/js/src/views/Event/Event.vue b/js/src/views/Event/Event.vue index 5ac44b715..74eab15a4 100755 --- a/js/src/views/Event/Event.vue +++ b/js/src/views/Event/Event.vue @@ -533,6 +533,10 @@ import { eventMetaDataList } from "../../services/EventMetadata"; import( /* webpackChunkName: "YouTubeIntegration" */ "../../components/Event/Integrations/YouTube.vue" ), + "integration-jitsi-meet": () => + import( + /* webpackChunkName: "JitsiMeetIntegration" */ "../../components/Event/Integrations/JitsiMeet.vue" + ), }, apollo: { event: { @@ -1087,6 +1091,7 @@ export default class Event extends EventMixin { "mz:live:twitch:url": "integration-twitch", "mz:live:peertube:url": "integration-peertube", "mz:live:youtube:url": "integration-youtube", + "mz:visio:jitsi_meet": "integration-jitsi-meet", }; get integrations(): Record { From ae318359233c3b236d9c8ae61991484e65503b9d Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Tue, 17 Aug 2021 10:41:39 +0200 Subject: [PATCH 167/169] Add Etherpad Integration Signed-off-by: Thomas Citharel --- .../Event/Integrations/Etherpad.vue | 38 +++++++++++++++++++ js/src/i18n/en_US.json | 5 ++- js/src/i18n/fr_FR.json | 5 ++- js/src/services/EventMetadata.ts | 15 ++++++++ js/src/views/Event/Event.vue | 5 +++ 5 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 js/src/components/Event/Integrations/Etherpad.vue diff --git a/js/src/components/Event/Integrations/Etherpad.vue b/js/src/components/Event/Integrations/Etherpad.vue new file mode 100644 index 000000000..afba2f326 --- /dev/null +++ b/js/src/components/Event/Integrations/Etherpad.vue @@ -0,0 +1,38 @@ + + + diff --git a/js/src/i18n/en_US.json b/js/src/i18n/en_US.json index b0196daf8..eeaa8fc9a 100644 --- a/js/src/i18n/en_US.json +++ b/js/src/i18n/en_US.json @@ -1139,5 +1139,8 @@ "Google Meet": "Google Meet", "The Google Meet video teleconference URL": "The Google Meet video teleconference URL", "Big Blue Button": "Big Blue Button", - "The Big Blue Button video teleconference URL": "The Big Blue Button video teleconference URL" + "The Big Blue Button video teleconference URL": "The Big Blue Button video teleconference URL", + "Etherpad notes": "Etherpad notes", + "The URL of a pad where notes are being taken collaboratively": "The URL of a pad where notes are being taken collaboratively", + "https://mensuel.framapad.org/p/some-secret-token": "https://mensuel.framapad.org/p/some-secret-token" } diff --git a/js/src/i18n/fr_FR.json b/js/src/i18n/fr_FR.json index 76ee8772e..76bf9c154 100644 --- a/js/src/i18n/fr_FR.json +++ b/js/src/i18n/fr_FR.json @@ -1230,5 +1230,8 @@ "Google Meet": "Google Meet", "The Google Meet video teleconference URL": "L'URL de visio-conférence Google Meet", "Big Blue Button": "Big Blue Button", - "The Big Blue Button video teleconference URL": "L'URL de visio-conférence Big Blue Button" + "The Big Blue Button video teleconference URL": "L'URL de visio-conférence Big Blue Button", + "Etherpad notes": "Notes sur Etherpad", + "The URL of a pad where notes are being taken collaboratively": "L'URL d'un pad où les notes sont prises collaborativement", + "https://mensuel.framapad.org/p/some-secret-token": "https://mensuel.framapad.org/p/un-jeton-secret" } diff --git a/js/src/services/EventMetadata.ts b/js/src/services/EventMetadata.ts index c964f9d8d..29f093138 100644 --- a/js/src/services/EventMetadata.ts +++ b/js/src/services/EventMetadata.ts @@ -149,6 +149,21 @@ export const eventMetaDataList: IEventMetadataDescription[] = [ keyType: EventMetadataKeyType.URL, category: EventMetadataCategories.TOOLS, }, + { + icon: "file-document-edit", + key: "mz:notes:etherpad:url", + label: i18n.t("Etherpad notes") as string, + description: i18n.t( + "The URL of a pad where notes are being taken collaboratively" + ) as string, + value: "", + placeholder: i18n.t( + "https://mensuel.framapad.org/p/some-secret-token" + ) as string, + type: EventMetadataType.STRING, + keyType: EventMetadataKeyType.URL, + category: EventMetadataCategories.TOOLS, + }, { icon: "twitter", key: "mz:social:twitter:account", diff --git a/js/src/views/Event/Event.vue b/js/src/views/Event/Event.vue index 74eab15a4..bd0ded10e 100755 --- a/js/src/views/Event/Event.vue +++ b/js/src/views/Event/Event.vue @@ -537,6 +537,10 @@ import { eventMetaDataList } from "../../services/EventMetadata"; import( /* webpackChunkName: "JitsiMeetIntegration" */ "../../components/Event/Integrations/JitsiMeet.vue" ), + "integration-etherpad": () => + import( + /* webpackChunkName: "EtherpadIntegration" */ "../../components/Event/Integrations/Etherpad.vue" + ), }, apollo: { event: { @@ -1092,6 +1096,7 @@ export default class Event extends EventMixin { "mz:live:peertube:url": "integration-peertube", "mz:live:youtube:url": "integration-youtube", "mz:visio:jitsi_meet": "integration-jitsi-meet", + "mz:notes:etherpad:url": "integration-etherpad", }; get integrations(): Record { From 106cf9271ed001be2930939bf31ae8b63c067ee0 Mon Sep 17 00:00:00 2001 From: GunChleoc Date: Tue, 17 Aug 2021 05:59:59 +0000 Subject: [PATCH 168/169] Translated using Weblate (Gaelic) Currently translated at 100.0% (1130 of 1130 strings) Translation: Mobilizon/Frontend Translate-URL: https://weblate.framasoft.org/projects/mobilizon/frontend/gd/ --- js/src/i18n/gd.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/js/src/i18n/gd.json b/js/src/i18n/gd.json index d5a4076db..dac92f0dc 100644 --- a/js/src/i18n/gd.json +++ b/js/src/i18n/gd.json @@ -205,9 +205,9 @@ "Date and time settings": "Roghainnean a’ chinn-là ’s an ama", "Date parameters": "Paramadairean a’ chinn-là", "Decline": "Diùlt", - "Default": "Tùsail", - "Default Mobilizon privacy policy": "Poileasaidh prìobhaideachd Mhobilizon thùsail", - "Default Mobilizon terms": "Teirmichean Mhobilizon tùsail", + "Default": "Bun-roghainn", + "Default Mobilizon privacy policy": "Poileasaidh prìobhaideachd Mhobilizon bhunaiteach", + "Default Mobilizon terms": "Teirmichean Mhobilizon bunaiteach", "Delete": "Sguab às", "Delete Comment": "Sguab às am beachd", "Delete Event": "Sguab às an tachartas", @@ -479,7 +479,7 @@ "My events": "Na tachartasan agam", "My groups": "Na buidhnean agam", "My identities": "Na dearbh-aithnean agam", - "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.": "AN AIRE! Tha dug neach-lagha sùil air na teirmichean tùsail idir agus mar sin chan eil sinn an dùil gun solar iad dìon laghail slàn anns gach suidheachadh do rianaire ionstans a chleachdas iad. Cuideachd, chan eil iad sònraichte do gach dùthaich is uachdranas laghail. Mur eil thu cinnteach, bruidhinn ri neach-lagha.", + "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.": "AN AIRE! Tha dug neach-lagha sùil air na teirmichean bunaiteach idir agus mar sin chan eil sinn an dùil gun solar iad dìon laghail slàn anns gach suidheachadh do rianaire ionstans a chleachdas iad. Cuideachd, chan eil iad sònraichte do gach dùthaich is uachdranas laghail. Mur eil thu cinnteach, bruidhinn ri neach-lagha.", "Name": "Ainm", "New discussion": "Deasbad ùr", "New email": "Post-d ùr", @@ -1044,8 +1044,8 @@ "contact uninformed": "gun fhiosrachadh conaltraidh", "create a group": "buidheann a chruthachadh", "create an event": "tachartas a chruthachadh", - "default Mobilizon privacy policy": "poileasaidh Mhobilizon thùsail", - "default Mobilizon terms": "teirmichean Mhobilizon tùsail", + "default Mobilizon privacy policy": "poileasaidh Mhobilizon bhunaiteach", + "default Mobilizon terms": "teirmichean Mhobilizon bunaiteach", "e.g. 10 Rue Jangot": "m.e. 10 Rathad a’ Chidhe", "e.g. Accessibility, Twitch, PeerTube": "m.e. So-ruigsinneachd, Twitch, PeerTube", "enable the feature": "an gleus a chur an comas", @@ -1097,7 +1097,7 @@ "{number} participations": "{number} chom-pàirtiche|{number} chom-pàirtiche|{number} com-pàirtichean|{number} com-pàirtiche", "{number} posts": "{number} phost|{number} phost|{number} postaichean|{number} post", "{old_group_name} was renamed to {group}.": "Chaidh {group} a thoirt air {old_group_name}.", - "{profile} (by default)": "{profile} (o thùs)", + "{profile} (by default)": "{profile} (a ghnàth)", "{profile} added the member {member}.": "Chuir {profile} am ball {member} ris.", "{profile} archived the discussion {discussion}.": "Chuir {profile} an deasbad {discussion} san tasg-lann.", "{profile} created the discussion {discussion}.": "Chruthaich {profile} an deasbad {discussion}.", From f0e9f8e31eb3caebff07f1a2df7235f82074c98a Mon Sep 17 00:00:00 2001 From: Thomas Citharel Date: Thu, 12 Aug 2021 17:27:01 +0200 Subject: [PATCH 169/169] Bump version to 1.3.0 Signed-off-by: Thomas Citharel --- CHANGELOG.md | 63 +++++++++++++++++++++++++++++++++++++++++++++++++ js/package.json | 2 +- mix.exs | 2 +- 3 files changed, 65 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c8299e02..aa16e0b77 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,69 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## 1.3.0 - 2021-08-12 + +### Added + +- **Allow remote group moderators to edit group events and posts** +- **Allow events to hold metadata information, either preconfigured (live video URL, price details, accessibility informations,…), either through a free key/value form.** Metadata concerning live video feeds linking to PeerTube, YouTube & Twitch will benefit from iframe integration. +- Add the possibility to create profiles and groups from CLI +- Add the possibility to create a profile at the same time when creating an user from CLI +- Add the possibility to create users with LDAP provider from CLI +- Added back support for Docker-compose based development +- Added rel=canonical and meta robots noindex tags to public pages from remote groups, in order to avoid them being indexed by Google +- Allow members-restricted posts to be viewable by instance moderators (for moderation purposes) +- Added a filter to resize pictures bigger than 1920x1080 +- Allow to deny registration by email or email domain +- Added missing index on participants url +- Added a loading wheel to show that events are loading on some views + +### Changed + +- Made server only listen on IPv4 in the install template +- Improve identity picker to have a fixed height and allow filtering between your identities and group contacts +- Leaflet map controls (zoom/locate) are now translatable +- Show exactly 12 events on the Explore page + +### Fixed + +- Fixed links contained in event & post description that didn't open in new tabs +- Add back missing RSS/ical links on public group pages +- Fixed links to Framacolibri forum +- Fixed drafts and restricted visibility events & posts listed on group page +- Fixed notification page on Safari +- Fixed profile edition +- Fixed Feed Token recreation +- Fixed media cleaner job +- Fixed english being always used as a language instead of the default one set when the request has no `Accept-Language` header (such as Google index bots) +- Fixed Ecto validation errors not being translated and interpolated +- Fixed `lang` attribute not being properly set with the language currently used +- Fixed federated posts having wrong visibility setting +- Fixed unused CSS filter on homepage rendering wrong on Webkit +- Fixed handling SSL being already started in LDAP connection +- Fixed an Apollo cache issue when registrering your first profile +- Fixed the Docker image missing ca-certificates +- Fixed missing pagination on Explore page featured events +- Fixed broken popup warning when editing an event +- Fixed GraphQL Playground (again) +- Fixed Coordinates mixmatch between latitude and longitude in iCalendar export and federation +- Fixed token refreshment issues +- Fixed search from 404 page + + +### Translations + +- Catalan +- Chinese (Traditional) +- Finnish +- French +- Gaelic +- Galician +- German +- Indonesian +- Russian +- Spanish + ## 1.2.3 - 2021-07-02 ### Changed diff --git a/js/package.json b/js/package.json index 089289bc0..084bd09d1 100644 --- a/js/package.json +++ b/js/package.json @@ -1,6 +1,6 @@ { "name": "mobilizon", - "version": "1.2.3", + "version": "1.3.0", "private": true, "scripts": { "serve": "vue-cli-service serve", diff --git a/mix.exs b/mix.exs index 9ba64b540..462ad7f15 100644 --- a/mix.exs +++ b/mix.exs @@ -1,7 +1,7 @@ defmodule Mobilizon.Mixfile do use Mix.Project - @version "1.2.3" + @version "1.3.0" def project do [