Merge tag '1.0.4' into chapril

This commit is contained in:
Tykayn 2021-02-19 15:33:03 +01:00 committed by tykayn
commit adbe90bc87
155 changed files with 8730 additions and 5574 deletions

3
.gitignore vendored
View File

@ -14,6 +14,7 @@ erl_crash.dump
# secrets files as long as you replace their contents by environment
# variables.
/config/*.secret.exs
/config/releases.exs
/setup_db.psql
@ -39,3 +40,5 @@ release/
*.po~
.weblate
docker/production/.env
test-junit-report.xml
js/junit.xml

View File

@ -1,13 +1,18 @@
image: tcitworld/mobilizon-ci
stages:
- install
- check
- build-js
- test
- deploy
- docker
- package
- upload
- deploy
variables:
MIX_ENV: "test"
YARN_CACHE_FOLDER: "js/.yarn"
# DB Variables for Postgres / Postgis
POSTGRES_DB: mobilizon_test
POSTGRES_USER: postgres
@ -20,95 +25,130 @@ variables:
MOBILIZON_DATABASE_HOST: $POSTGRES_HOST
GEOLITE_CITIES_PATH: "/usr/share/GeoIP/GeoLite2-City.mmdb"
MOBILIZON_INSTANCE_REGISTRATIONS_OPEN: "true"
# Release elements
PACKAGE_REGISTRY_URL: "${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/generic/${CI_PROJECT_NAME}"
ARCH: "amd64"
cache:
key: ${CI_COMMIT_REF_SLUG}
key: "${CI_COMMIT_REF_SLUG}-${CI_COMMIT_SHORT_SHA}"
paths:
- ~/.cache/Cypress
- _build/
- deps/
- js/node_modules
- cache/Cypress
- deps/
- _build/
- js/node_modules
- js/.yarn
lint:
# Installed dependencies are cached across the pipeline
# So there is no need to reinstall them all the time
# It saves minutes during a pipeline build time
install:
stage: install
script:
- yarn --cwd "js" install --frozen-lockfile
- mix deps.get
- mix compile
lint-elixir:
stage: check
before_script:
- mix deps.get
script:
- export EXITVALUE=0
- mix deps.get
- mix credo --strict -a || export EXITVALUE=1
- mix format --check-formatted --dry-run || export EXITVALUE=1
- cd js
- yarn install
- yarn run lint || export EXITVALUE=1
- yarn run prettier -c . || export EXITVALUE=1
- yarn run build:assets
- cd ../
- mix credo --strict -a || export EXITVALUE=1
- mix sobelow --config || export EXITVALUE=1
- exit $EXITVALUE
lint-front:
image: node:14
stage: check
before_script:
- export EXITVALUE=0
- yarn --cwd "js" install --frozen-lockfile
script:
- yarn --cwd "js" run lint || export EXITVALUE=1
- yarn --cwd "js" run prettier -c . || export EXITVALUE=1
- exit $EXITVALUE
build-frontend:
stage: build-js
image: node:14
before_script:
- apt update
- apt install -y --no-install-recommends python build-essential webp imagemagick gifsicle jpegoptim optipng pngquant
script:
- yarn --cwd "js" install --frozen-lockfile
- yarn --cwd "js" run build
artifacts:
expire_in: 1 day
when: on_success
expire_in: 5 days
paths:
- priv/static
needs:
- lint-front
deps:
stage: check
before_script:
- mix deps.get
script:
- export EXITVALUE=0
- mix deps.get
- mix hex.outdated || export EXITVALUE=1
- cd js
- yarn outdated || export EXITVALUE=1
- yarn --cwd "js" outdated || export EXITVALUE=1
- exit $EXITVALUE
allow_failure: true
needs:
- install
exunit:
stage: test
services:
- name: mdillon/postgis:11
alias: postgres
variables:
MIX_ENV: test
before_script:
- cd js
- yarn install
- yarn run build:assets
- cd ../
- mix deps.get
- MIX_ENV=test mix ecto.create
- MIX_ENV=test mix ecto.migrate
dependencies:
- lint
- mix ecto.create
- mix ecto.migrate
script:
- mix coveralls
artifacts:
when: always
reports:
junit:
- test-junit-report.xml
expire_in: 30 days
jest:
stage: test
needs:
- lint-front
before_script:
- cd js
- yarn install
dependencies:
- lint
- yarn --cwd "js" install --frozen-lockfile
script:
- yarn run test:unit --no-color
- yarn --cwd "js" run test:unit --no-color --ci --reporters=default --reporters=jest-junit
artifacts:
when: always
paths:
- js/coverage
reports:
junit:
- js/junit.xml
expire_in: 30 days
# cypress:
# stage: test
# services:
# - name: mdillon/postgis:11
# alias: postgres
# variables:
# MIX_ENV=e2e
# script:
# - mix deps.get
# - cd js
# - yarn install
# - npx cypress install # just to be sure
# - yarn run build
# - cd ../
# - MIX_ENV=e2e mix ecto.create
# - MIX_ENV=e2e mix ecto.migrate
# - MIX_ENV=e2e mix run priv/repo/e2e.seed.exs
# - MIX_ENV=e2e mix phx.server &
# - mix ecto.create
# - mix ecto.migrate
# - mix run priv/repo/e2e.seed.exs
# - mix phx.server &
# - cd js
# - npx wait-on http://localhost:4000
# - if [ -z "$CYPRESS_KEY" ]; then npx cypress run; else npx cypress run --record --parallel --key $CYPRESS_KEY; fi
@ -118,25 +158,20 @@ jest:
# - js/tests/e2e/screenshots/**/*.png
# - js/tests/e2e/videos/**/*.mp4
# pages:
# stage: deploy
# script:
# # - mkdir public
# # Mobilizon documentation is now on https://framagit.org/framasoft/joinmobilizon/documentation
# # Mix docs disabled because of https://github.com/elixir-lang/ex_doc/issues/1172
# # - mix deps.get
# # - mix docs
# # - mv doc public/backend
# #- cd js
# #- yarn install
# #- yarn run styleguide:build
# #- mv styleguide ../public/frontend
# only:
# - master
# artifacts:
# expire_in: 1 hour
# paths:
# - public
pages:
stage: deploy
script:
- mkdir public
- mix docs
- mv doc public/backend
# #- yarn run --cwd "js" styleguide:build
# #- mv js/styleguide public/frontend
rules:
- if: '$CI_COMMIT_BRANCH == "master"'
artifacts:
expire_in: 1 hour
paths:
- public
.docker: &docker
stage: docker
@ -152,14 +187,71 @@ jest:
build-docker-master:
<<: *docker
only:
- schedules
rules:
- if: '$CI_PROJECT_NAMESPACE != "framasoft"'
when: never
- if: '$CI_PIPELINE_SOURCE == "schedule"'
variables:
DOCKER_IMAGE_NAME: framasoft/mobilizon:master
build-docker-tag:
<<: *docker
only:
- tags
rules:
- if: '$CI_PROJECT_NAMESPACE != "framasoft"'
when: never
- if: $CI_COMMIT_TAG
variables:
DOCKER_IMAGE_NAME: framasoft/mobilizon:$CI_COMMIT_TAG
package-app:
stage: package
before_script:
- apt update
- apt install -y --no-install-recommends build-essential git cmake
variables:
MIX_ENV: "prod"
script:
- mix local.hex --force
- mix local.rebar --force
- cp docker/production/releases.exs ./config/
- mix phx.digest
- mix release
artifacts:
expire_in: 2 days
paths:
- _build/prod/rel
release-upload:
stage: upload
image: curlimages/curl:latest
rules:
- if: $CI_COMMIT_TAG
script: |
APP_VERSION="${CI_COMMIT_TAG}"
APP_ASSET="${CI_PROJECT_NAME}_${APP_VERSION}_${ARCH}.tar.gz"
echo "Artifact: ${APP_ASSET}"
tar czf ${APP_ASSET} -C _build/prod/rel mobilizon
ls -al ${APP_ASSET}
curl --silent --show-error --header "JOB-TOKEN: ${CI_JOB_TOKEN}" --upload-file "${APP_ASSET}" ${PACKAGE_REGISTRY_URL}/${APP_VERSION}/${APP_ASSET}
artifacts:
expire_in: 1 day
when: on_success
paths:
- mobilizon_*.tar.gz
release-create:
stage: deploy
image: registry.gitlab.com/gitlab-org/release-cli:latest
rules:
- if: $CI_COMMIT_TAG
dependencies: []
cache: {}
script: |
APP_VERSION="${CI_COMMIT_TAG}"
APP_ASSET="${CI_PROJECT_NAME}_${APP_VERSION}_${ARCH}.tar.gz"
release-cli create --name "$CI_PROJECT_TITLE v$CI_COMMIT_TAG" \
--tag-name "$CI_COMMIT_TAG" \
--assets-link "{\"name\":\"${APP_ASSET}\",\"url\":\"${PACKAGE_REGISTRY_URL}/${APP_VERSION}/${APP_ASSET}\"}"

12
.sobelow-conf Normal file
View File

@ -0,0 +1,12 @@
[
verbose: true,
private: false,
skip: true,
router: "lib/web/router.ex",
exit: "low",
format: "txt",
out: "",
threshold: "medium",
ignore: ["Config.HTTPS", "Config.CSP"],
ignore_files: ["config/dev.1.secret.exs", "config/dev.2.secret.exs", "config/dev.3.secret.exs", "config/dev.secret.exs", "config/e2e.secret.exs", "config/prod.secret.exs", "config/test.secret.exs"]
]

2
.sobelow-skips Normal file
View File

@ -0,0 +1,2 @@
752C0E897CA81ACD81F4BB215FA5F8E4

View File

@ -5,6 +5,53 @@ 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.0.4 - 20-01-2020
### Added
- **Added interface to approve/reject group follow requests**
- **Added UI for group public RSS (Atom) / ICS feeds**
- **Attach ICS files representing the event to notifications and participations emails**
- Add initial support to build Elixir releases
- Add some CSP & other security headers
### Changed
- Added `<hr>` to allowed HTML tags
- Events are now correctly ordered by their beginning date on search and group page
- Improve resource metadata parsing by restricting OGP/Twitter metadata to an allowed list of attributes
- Reverse proxy pictures from resource metadata (favicons & such)
### Fixed
- **Fixed group remote subscription**
- Upgrade PWA support library to avoid a call to Google CDN
- Fixed group avatar & banner upload
- Fixed some events not showing on homepage
- Fixed the `next` and `prev` attribute not being present in `CollectionPage` ActivityPub Collections
- Added a text to explain that group discussions are restricted to members on discussion list page
- Fixed ICS export timezone issues
- Fixed remote interactions when the content was not local to the instance
- Fixed a federation issue with group member removal
- Hide event organiser profile through the GraphQL API when a group is the organizer
- Fix an issue where the event form datepickers where displayed under the address map
### Translations
- Bengali (New!)
- Catalan
- Finnish
- French
- Galician
- German
- Italian
- Norwegian
- Polish
- Portuguese (New!)
- Slovenian (New!)
- Spanish
- Swedish
## 1.0.3 - 18-12-2020
**This release adds new migrations, be sure to run them before restarting Mobilizon**

View File

@ -1,7 +1,6 @@
FROM bitwalker/alpine-elixir:latest
RUN apk add inotify-tools postgresql-client yarn file
RUN apk add --no-cache make gcc libc-dev argon2 imagemagick
RUN apk add --no-cache inotify-tools postgresql-client yarn file make gcc libc-dev argon2 imagemagick cmake build-base libwebp-tools bash ncurses
RUN mix local.hex --force && mix local.rebar --force

View File

@ -81,6 +81,20 @@ config :mobilizon, Mobilizon.Web.Upload,
config :mobilizon, Mobilizon.Web.Upload.Uploader.Local, uploads: "uploads"
config :mobilizon, :media_proxy,
enabled: true,
proxy_opts: [
redirect_on_failure: false,
max_body_length: 25 * 1_048_576,
# Note: max_read_duration defaults to Mobilizon.Web.ReverseProxy.max_read_duration_default/1
max_read_duration: 30_000,
http: [
follow_redirect: true,
pool: :media
]
],
whitelist: []
config :mobilizon, Mobilizon.Web.Email.Mailer,
adapter: Bamboo.SMTPAdapter,
server: "localhost",
@ -215,6 +229,24 @@ config :mobilizon, :maps,
type: :openstreetmap
]
config :mobilizon, :http_security,
enabled: true,
sts: false,
sts_max_age: 31_536_000,
csp_policy: [
script_src: [],
style_src: [],
connect_src: [],
font_src: [],
img_src: ["*.tile.openstreetmap.org"],
manifest_src: [],
media_src: [],
object_src: [],
frame_src: [],
frame_ancestors: []
],
referrer_policy: "same-origin"
config :mobilizon, :anonymous,
participation: [
allowed: true,

View File

@ -59,6 +59,8 @@ config :mobilizon, Mobilizon.Web.Auth.Guardian, secret_key: "some secret"
config :mobilizon, :activitypub, sign_object_fetches: false
config :junit_formatter, report_dir: "."
if System.get_env("DOCKER", "false") == "false" && File.exists?("./config/test.secret.exs") do
import_config "test.secret.exs"
end

View File

@ -4,7 +4,7 @@ services:
postgres:
container_name: mobilizon_db
restart: unless-stopped
image: mdillon/postgis:11
image: postgis/postgis:13-3.0
environment:
POSTGRES_PASSWORD: postgres
POSTGRES_DB: mobilizon_dev

View File

@ -5,7 +5,7 @@ import Config
config :mobilizon, Mobilizon.Web.Endpoint,
server: true,
url: [host: System.get_env("MOBILIZON_INSTANCE_HOST", "mobilizon.lan")],
http: [port: 4000],
http: [port: System.get_env("MOBILIZON_INSTANCE_PORT", "4000")],
secret_key_base: System.get_env("MOBILIZON_INSTANCE_SECRET_KEY_BASE", "changethis")
config :mobilizon, Mobilizon.Web.Auth.Guardian,

View File

@ -7,6 +7,7 @@ module.exports = {
"!get_union_json.ts",
],
coverageReporters: ["html", "text", "text-summary"],
reporters: ["default", "jest-junit"],
// The following should fix the issue with svgs and ?inline loader (see Logo.vue), but doesn't work
//
// transform: {

View File

@ -1,15 +1,15 @@
{
"name": "mobilizon",
"version": "1.0.3",
"version": "1.0.4",
"private": true,
"scripts": {
"serve": "vue-cli-service serve",
"build:assets": "vue-cli-service build --modern",
"build:pictures": "bash ./scripts/build/pictures.sh",
"build": "yarn run build:assets && yarn run build:pictures",
"test:unit": "LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_ALL=en_US.UTF-8 vue-cli-service test:unit",
"test:e2e": "vue-cli-service test:e2e",
"lint": "vue-cli-service lint"
"lint": "vue-cli-service lint",
"build:assets": "vue-cli-service build --modern",
"build:pictures": "bash ./scripts/build/pictures.sh"
},
"dependencies": {
"@absinthe/socket": "^0.2.1",
@ -39,10 +39,10 @@
"phoenix": "^1.4.11",
"register-service-worker": "^1.7.1",
"tippy.js": "^6.2.3",
"tiptap": "^1.26.0",
"tiptap-extensions": "^1.29.1",
"tiptap": "^1.31.0",
"tiptap-extensions": "^1.34.0",
"unfetch": "^4.2.0",
"v-tooltip": "2.0.2",
"v-tooltip": "^2.1.2",
"vue": "^2.6.11",
"vue-apollo": "^3.0.3",
"vue-class-component": "^7.2.3",
@ -52,7 +52,7 @@
"vue-router": "^3.1.6",
"vue-scrollto": "^2.17.1",
"vue2-leaflet": "^2.0.3",
"vuedraggable": "2.23.2"
"vuedraggable": "^2.24.3"
},
"devDependencies": {
"@types/jest": "^26.0.18",
@ -65,16 +65,16 @@
"@types/prosemirror-state": "^1.2.4",
"@types/prosemirror-view": "^1.11.4",
"@types/vuedraggable": "^2.23.0",
"@typescript-eslint/eslint-plugin": "^4.0.1",
"@typescript-eslint/parser": "^4.0.1",
"@vue/cli-plugin-babel": "~4.5.9",
"@vue/cli-plugin-e2e-cypress": "~4.5.9",
"@vue/cli-plugin-eslint": "~4.5.9",
"@vue/cli-plugin-pwa": "~4.5.9",
"@vue/cli-plugin-router": "~4.5.9",
"@vue/cli-plugin-typescript": "~4.5.9",
"@vue/cli-plugin-unit-jest": "~4.5.0",
"@vue/cli-service": "~4.5.9",
"@typescript-eslint/eslint-plugin": "^4.14.1",
"@typescript-eslint/parser": "^4.14.1",
"@vue/cli-plugin-babel": "~4.5.11",
"@vue/cli-plugin-e2e-cypress": "~4.5.11",
"@vue/cli-plugin-eslint": "~4.5.11",
"@vue/cli-plugin-pwa": "~4.5.11",
"@vue/cli-plugin-router": "~4.5.11",
"@vue/cli-plugin-typescript": "~4.5.11",
"@vue/cli-plugin-unit-jest": "~4.5.11",
"@vue/cli-service": "~4.5.11",
"@vue/eslint-config-prettier": "^6.0.0",
"@vue/eslint-config-typescript": "^7.0.0",
"@vue/test-utils": "^1.1.0",
@ -82,7 +82,8 @@
"eslint-config-prettier": "^7.0.0",
"eslint-plugin-prettier": "^3.1.3",
"eslint-plugin-vue": "^7.0.0",
"mock-apollo-client": "^0.4",
"jest-junit": "^12.0.0",
"mock-apollo-client": "^0.5",
"prettier": "2.2.1",
"prettier-eslint": "^12.0.0",
"sass": "^1.29.0",
@ -94,7 +95,6 @@
"webpack-cli": "^3.3"
},
"resolutions": {
"prosemirror-model": "1.9.1",
"prosemirror-state": "1.3.3"
"workbox-webpack-plugin": "5.1.3"
}
}

View File

@ -1,5 +1,6 @@
<template>
<redirect-with-account
v-if="uri"
:uri="uri"
:pathAfterLogin="`/@${preferredUsername}`"
:sentence="sentence"
@ -8,21 +9,35 @@
<script lang="ts">
import { Component, Prop, Vue } from "vue-property-decorator";
import RedirectWithAccount from "@/components/Utils/RedirectWithAccount.vue";
import RouteName from "../../router/name";
import { FETCH_GROUP } from "@/graphql/group";
import { IGroup } from "@/types/actor";
@Component({
components: { RedirectWithAccount },
apollo: {
group: {
query: FETCH_GROUP,
fetchPolicy: "cache-and-network",
variables() {
return {
name: this.$route.params.preferredUsername,
beforeDateTime: null,
afterDateTime: new Date(),
};
},
skip() {
return !this.$route.params.preferredUsername;
},
},
},
})
export default class JoinGroupWithAccount extends Vue {
@Prop({ type: String, required: true }) preferredUsername!: string;
group!: IGroup;
get uri(): string {
return `${window.location.origin}${
this.$router.resolve({
name: RouteName.GROUP,
params: { preferredUsername: this.preferredUsername },
}).href
}`;
return this.group?.url;
}
sentence = this.$t(

View File

@ -1,5 +1,6 @@
<template>
<redirect-with-account
v-if="uri"
:uri="uri"
:pathAfterLogin="`/events/${uuid}`"
:sentence="sentence"
@ -8,21 +9,33 @@
<script lang="ts">
import { Component, Prop, Vue } from "vue-property-decorator";
import RedirectWithAccount from "@/components/Utils/RedirectWithAccount.vue";
import RouteName from "../../router/name";
import { FETCH_EVENT } from "@/graphql/event";
import { IEvent } from "@/types/event.model";
@Component({
components: { RedirectWithAccount },
apollo: {
event: {
query: FETCH_EVENT,
fetchPolicy: "cache-and-network",
variables() {
return {
uuid: this.uuid,
};
},
skip() {
return !this.uuid;
},
},
},
})
export default class ParticipationWithAccount extends Vue {
@Prop({ type: String, required: true }) uuid!: string;
get uri(): string {
return `${window.location.origin}${
this.$router.resolve({
name: RouteName.EVENT,
params: { uuid: this.uuid },
}).href
}`;
event!: IEvent;
get uri(): string | undefined {
return this.event?.url;
}
sentence = this.$t(

View File

@ -0,0 +1,37 @@
<template>
<div class="empty-content" :class="{ inline }" role="note">
<b-icon :icon="icon" size="is-large" />
<h2 class="empty-content__title">
<!-- @slot Mandatory title -->
<slot />
</h2>
<p v-show="$slots.desc">
<!-- @slot Optional description -->
<slot name="desc" />
</p>
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue } from "vue-property-decorator";
@Component
export default class EmptyContent extends Vue {
@Prop({ type: String, required: true }) icon!: string;
@Prop({ type: Boolean, required: false, default: false }) inline!: boolean;
}
</script>
<style lang="scss">
.empty-content {
display: flex;
flex-direction: column;
align-items: center;
margin-top: 20vh;
&__title {
margin-bottom: 10px;
}
&.inline {
margin-top: 5vh;
}
}
</style>

View File

@ -0,0 +1,49 @@
import gql from "graphql-tag";
export const GROUP_FOLLOWERS = gql`
query(
$name: String!
$followersPage: Int
$followersLimit: Int
$approved: Boolean
) {
group(preferredUsername: $name) {
id
preferredUsername
name
domain
followers(
page: $followersPage
limit: $followersLimit
approved: $approved
) {
total
elements {
id
actor {
id
preferredUsername
name
domain
avatar {
id
url
}
}
approved
insertedAt
updatedAt
}
}
}
}
`;
export const UPDATE_FOLLOWER = gql`
mutation UpdateFollower($id: ID!, $approved: Boolean) {
updateFollower(id: $id, approved: $approved) {
id
approved
}
}
`;

View File

@ -64,6 +64,7 @@ export const GROUP_FIELDS_FRAGMENTS = gql`
suspended
visibility
openness
manuallyApprovesFollowers
physicalAddress {
description
street
@ -265,6 +266,7 @@ export const UPDATE_GROUP = gql`
$visibility: GroupVisibility
$openness: Openness
$physicalAddress: AddressInput
$manuallyApprovesFollowers: Boolean
) {
updateGroup(
id: $id
@ -275,6 +277,7 @@ export const UPDATE_GROUP = gql`
visibility: $visibility
openness: $openness
physicalAddress: $physicalAddress
manuallyApprovesFollowers: $manuallyApprovesFollowers
) {
id
preferredUsername
@ -282,6 +285,7 @@ export const UPDATE_GROUP = gql`
summary
visibility
openness
manuallyApprovesFollowers
avatar {
id
url

View File

@ -1 +1,6 @@
{}
{
"Accepted": "অনুমদিত",
"Account": "অ্",
"Add": "যোগ",
"Admin": "অ্যাড"
}

View File

@ -11,6 +11,7 @@
"<b>{contact}</b> will be displayed as contact.": "Es mostrarà <b>{contact}</b> com a contacte.|Es mostraran <b>{contact}</b> com a contactes.",
"@{group}": "@{group}",
"@{username} ({role})": "@{username} ({role})",
"@{username}'s follow request was rejected": "S'ha rebutjat la soŀlicitud de seguir-te de @{username}",
"A cookie is a small file containing information that is sent to your computer when you visit a website. When you visit the site again, the cookie allows that site to recognize your browser. Cookies may store user preferences and other information. You can configure your browser to refuse all cookies. However, this may result in some website features or services partially working. Local storage works the same way but allows you to store more data.": "Una cookie és un arxiu petit amb informació que s'envia al teu ordinador quan visites una web. Quan tornes a visitar el lloc web, la cookie fa que el lloc pugui reconèixer el teu navegador. Les cookies poden conservar preferències i altres informacions. Pots configurar el teu navegador perquè rebutgi totes les cookies. Ara bé, això podria fer que algunes funcionalitats o serveis d'algunes webs deixessin de funcionar bé. L'emmagatzematge local funciona de la mateixa manera, però permet desar més informació.",
"A federated software": "Un software federat",
"A place for your code of conduct, rules or guidelines. You can use HTML tags.": "Un lloc pel codi de conducta, normes o guies. Podeu fer servir etiquetes HTML.",
@ -26,6 +27,7 @@
"Abandon edition": "Canceŀla l'edició",
"About": "Quant a",
"About Mobilizon": "Quant a Mobilizon",
"About anonymous participation": "Quant a la participació anònima",
"About this event": "Sobre aquesta activitat",
"About this instance": "Quant a aquesta instància",
"About {instance}": "Quant a {instance}",
@ -84,7 +86,9 @@
"Are you sure you want to cancel the event edition? You'll lose all modifications.": "Segur que vols canceŀlar l'edició? Perdràs tots els canvis que hagis fet.",
"Are you sure you want to cancel your participation at event \"{title}\"?": "Segur que vols deixar de participar a l'activitat \"{title}\"?",
"Are you sure you want to delete this event? This action cannot be reverted.": "Segur que vols esborrar aquesta activitat? Aquesta acció és irreversible.",
"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.": "Com que l'organitzadora de l'activitat ha triat validar manualment les soŀlicituds per participar-hi, hauràs d'esperar la seva decisió. T'arribarà un correu comunicant-te-la.",
"Assigned to": "Assignat a",
"Atom feed for events and posts": "Flux Atom d'activitats i publicacions",
"Avatar": "Avatar",
"Back to previous page": "Tornar a la pàgina anterior",
"Banner": "Bàner",
@ -102,6 +106,7 @@
"Cancel edition": "Canceŀla l'edició",
"Cancel my participation request…": "Canceŀla la meva soŀlicitud de participació…",
"Cancel my participation…": "Canceŀla la meva participació…",
"Cancelled": "Canceŀlada",
"Cancelled: Won't happen": "Canceŀlada: No es farà",
"Category": "Categoria",
"Change": "Canvia-la",
@ -112,6 +117,9 @@
"Change timezone": "Canvia el fus horari",
"Check your inbox (and your junk mail folder).": "Mira la teva safata d'entrada (i la de brossa, per si de cas).",
"Clear": "Esborra",
"Clear participation data for all events": "Esborra les dades d'assistència de totes les activitats",
"Clear participation data for this event": "Esborra les dades d'assistència per aquesta activitat",
"Click for more information": "Fes clic per a més informació",
"Click to select": "Clica per triar",
"Click to upload": "Clica per pujar",
"Close": "Deshabilita",
@ -144,6 +152,7 @@
"Create a videoconference": "Crea una videoconferència",
"Create an account": "Crea un compte",
"Create and manage several identities from the same account": "Crea i gestiona diverses identitats des del mateix compte",
"Create event": "Crea una activitat",
"Create group": "Crea un grup",
"Create my event": "Crea l'activitat",
"Create my group": "Crea el grup",
@ -201,6 +210,8 @@
"Displayed nickname": "Sobrenom per mostrar",
"Displayed on homepage and meta tags. Describe what Mobilizon is and what makes this instance special in a single paragraph.": "Es mostrarà a la pàgina d'inici i a les etiquetes meta. Hauria d'explicar en un sol paragraf què és Mobilizon i què fa que aquesta instància sigui especial.",
"Do not receive any mail": "No vull rebre cap correu",
"Do you wish to {create_event} or {explore_events}?": "Vols {create_event} o {explore_events}?",
"Do you wish to {create_group} or {explore_groups}?": "Vols {create_group} o {explore_groups}?",
"Domain": "Domini",
"Don't show @{organizer} as event host alongside @{group}": "No mostris @{organizer} com a organitzadora amb @{group}",
"Draft": "Esborrany",
@ -265,7 +276,9 @@
"Find an address": "Cerca una adreça",
"Find an instance": "Cerca una instància",
"Find another instance": "Cerca una altra instància",
"Follower": "Seguidor/a",
"Followers": "Seguidors/es",
"Followers will receive new public events and posts.": "Les seguidores rebran les publicacions i activitats noves.",
"Followings": "Seguint",
"For instance: London": "Per exemple: Lleida",
"For instance: London, Taekwondo, Architecture…": "Per exemple: Lleida, Ioga, Història…",
@ -279,10 +292,12 @@
"General": "General",
"General information": "Informació general",
"Getting location": "Obtenció d'ubicació",
"Getting there": "Com arribar-hi",
"Glossary": "Glossari",
"Go": "Anar",
"Go to the event page": "Porta'm a la pàgina de l'activitat",
"Going as {name}": "Hi assisteixes com a {name}",
"Group Followers": "Seguidores del grup",
"Group List": "Llista del grup",
"Group Members": "Membres del grup",
"Group address": "Adreça del grup",
@ -296,6 +311,7 @@
"Group {displayName} created": "S'ha creat el grup {displayName}",
"Group {groupTitle} reported": "S'ha denunciat el grup {groupTitle}",
"Groups": "Grups",
"Groups are not enabled on this instance.": "Els grups no estan disponibles en aquesta instància.",
"Groups are spaces for coordination and preparation to better organize events and manage your community.": "Els grups són espais de coordinació i preparació per organitzar millor les activitats i gestionar una comunitat.",
"Headline picture": "Imatge de capçalera",
"Hide replies": "Amaga les respostes",
@ -311,6 +327,8 @@
"I participate": "Participo",
"I want to allow people to participate without an account.": "Vull permetre que tothom. participi sense un compte.",
"I want to approve every participation request": "Vull aprovar cada soŀlicitud de participació",
"ICS feed for events": "Calendari ICS de les activitats",
"ICS/WebCal Feed": "Calendari ICS/WebCal",
"Identity {displayName} created": "S'ha creat la identitat {displayName}",
"Identity {displayName} deleted": "S'ha esborrat la identitat {displayName}",
"Identity {displayName} updated": "S'ha actualitzat la identitat {displayName}",
@ -348,6 +366,7 @@
"Invite a new member": "Convida algú",
"Invite member": "Convida",
"Invited": "Convidat/da",
"It is possible that the content is not accessible on this instance, because this instance has blocked the profiles or groups behind this content.": "Pot ser que el contingut no sigui accessible en aquesta instància perquè els perfils o grups creadors del contingut hi estiguin bloquejats.",
"Italic": "Cursiva",
"Join <b>{instance}</b>, a Mobilizon instance": "Uneix-te a <b>{instance}</b>, una instància de Mobilizon",
"Join group": "Suma't al grup",
@ -374,6 +393,7 @@
"Limited number of places": "Places limitades",
"List title": "Títol de la llista",
"Load more": "Carrega'n més",
"Loading comments…": "S'estan carregant els comentaris…",
"Local": "Local",
"Locality": "Localitat",
"Location": "Ubicació",
@ -387,6 +407,7 @@
"Manage my notifications": "Gestiona les notificacions",
"Manage my settings": "Gestiona les preferències",
"Manage participations": "Gestiona les participacions",
"Manually approve new followers": "Aprova manualment les noves seguidores",
"Manually invite new members": "Invitacions manuals",
"Mark as resolved": "Marca com resolta",
"Member": "Membre",
@ -437,6 +458,7 @@
"No discussions yet": "Encara no s'ha obert cap discussió",
"No end date": "Sense data de finalització",
"No events found": "No s'ha trobat cap esdeveniment",
"No follower matches the filters": "No hi ha cap seguidor que hi coincideixi",
"No group found": "No s'ha trobat cap grup",
"No groups found": "No s'han trobat grups",
"No instance follows your instance yet.": "Encara no hi ha cap instància que segueixi la teva.",
@ -488,6 +510,7 @@
"Only accessible to members of the group": "Només accessible als membres del grup",
"Only alphanumeric characters and underscores are supported.": "Només acceptem caràcters alfanumèrics i el guió baix.",
"Only alphanumeric lowercased characters and underscores are supported.": "Només es permeten els caràcters alfanumèrics en minúscula i els guions baixos.",
"Only group members can access discussions": "Només els membres del grup poden accedir a les discussions",
"Only group moderators can create, edit and delete posts.": "Només les moderadores poden crear, modificar i esborrar publicacions.",
"Open": "Obre",
"Opened reports": "Denúncies obertes",
@ -612,6 +635,7 @@
"Resource provided is not an URL": "El recurs no és una URL",
"Resources": "Recursos",
"Restricted": "Restringit",
"Return to the group page": "Torna a la pàgina del grup",
"Right now": "Ara mateix",
"Role": "Rol",
"Rules": "Normes",
@ -654,6 +678,7 @@
"Suspend group": "Suspen el grup",
"Suspended": "Suspesa",
"Task lists": "Llista de tasques",
"Tentative": "Provisional",
"Tentative: Will be confirmed later": "Provisional: Ho confirmaran més endavant",
"Terms": "Condicions",
"Terms of service": "Condicions del servei",
@ -674,6 +699,7 @@
"The event will show as attributed to this group.": "L'activitat es mostrarà atribuïda an aquest grup.",
"The event will show as attributed to your personal profile.": "L'activitat es mostrarà atribuïda al teu perfil personal.",
"The event will show the group as organizer.": "El grup apareixerà com a organitzador de l'activitat.",
"The events you created are not shown here.": "Aquí no apareixen les activitats que has creat tu.",
"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.": "Es llistarà públicament el grup en els resultats de cerca i podrà ser suggerit en la secció d'explorar. Només se'n mostrarà informació pública.",
"The instance administrator is the person or entity that runs this Mobilizon instance.": "L'administradora de la instància és la persona o entitat que gestiona aquesta instància de Mobilizon.",
"The member was removed from the group {group}": "S'ha esborrat el/la membre del grup {group}",
@ -687,6 +713,7 @@
"The {default_terms} will be used. They will be translated in the user's language.": "Es faran servir els {default_terms}. Seràn traduïts a la llengua de cada usuària.",
"There are {participants} participants.": "Hi ha {participants} participants.",
"There will be no way to recover your data.": "No hi haurà cap manera de recuperar les teves dades.",
"There's no discussions yet": "No hi ha cap discussió",
"These events may interest you": "Pot ser que t'interessin aquestes activitats",
"This Mobilizon instance and this event organizer allows anonymous participations, but requires validation through email confirmation.": "Aquesta instància de Mobilizon i l'organització d'aquesta activitat permeten la participació anònima, però demanen una validació per correu.",
"This URL is not supported": "Aquesta URL no és compatible",
@ -725,9 +752,12 @@
"Tomorrow": "Demà",
"Transfer to {outsideDomain}": "Transfereix a {outsideDomain}",
"Type": "Escriu",
"Type or select a date…": "Escriu o tria una data…",
"URL": "URL",
"URL copied to clipboard": "S'ha copiat la URL al portapapers",
"Unable to detect timezone.": "No s'ha pogut detectar el fus horari.",
"Unable to load event for participation. The error details are provided below:": "No s'ha pogut carregar l'activitat. Els detalls de l'error es detallen a sota:",
"Unable to save your participation in this browser.": "No s'ha pogut desar al navegador la teva assistència.",
"Unfortunately, this instance isn't opened to registrations": "Malauradament, aquesta instància no està oberta a nous comptes",
"Unfortunately, your participation request was rejected by the organizers.": "Malauradament, l'organització de l'activitat ha rebutjat la teva soŀlicitud de participació.",
"Unknown": "Desconegut",
@ -744,12 +774,14 @@
"Update my event": "Actualitza l'activitat",
"Update post": "Actualitza la publicació",
"Updated": "S'ha actualitzat",
"Uploaded media size": "Mida dels arxius pujats",
"Use my location": "Agafa la meva ubicació",
"User": "Usuària",
"Username": "Nom d'usuària",
"Users": "Usuàries",
"View a reply": "|Mostra la resposta|Mostra les {totalReplies} resposta",
"View all": "Mostra-ho tot",
"View all events": "Mostra totes les activitats",
"View all posts": "Mostra totes les publicacions",
"View all upcoming events": "Mostra les activitats properes en temps",
"View event page": "Mostra la pàgina de l'activitat",
@ -786,6 +818,7 @@
"You are already a participant of this event.": "Ja figures com a participant d'aquesta activitat.",
"You are already logged-in.": "Ja tens una sessió iniciada.",
"You are not an administrator for this group.": "No ets administrador/a d'aquest grup.",
"You are not part of any group.": "No formes de cap grup.",
"You are participating in this event anonymously": "Estàs registrada anònimament com a participant",
"You are participating in this event anonymously but didn't confirm participation": "Figures com a participant anònima d'aquesta activitat però no has confirmat la participació",
"You can add tags by hitting the Enter key or by adding a comma": "Pots afegir etiquetes prement Enter o afegint una coma",
@ -794,6 +827,7 @@
"You can try another search term or drag and drop the marker on the map": "Pots provar amb altres paraules de cerca o arrossegar l'indicador al mapa",
"You can't change your password because you are registered through {provider}.": "No pots canviar la teva contrasenya perquè estàs registrat/da amb {provider}.",
"You can't remove your last identity.": "No pots esborrar la teva única identitat.",
"You didn't create or join any event yet.": "No t'has apuntat a cap activitat ni n'has creat cap.",
"You don't follow any instances yet.": "Encara no pots seguir cap instància.",
"You have been disconnected": "S'ha desconnectat la sessió",
"You have been invited by {invitedBy} to the following group:": "{invitedBy} t'ha convidat a afegir-te al següent grup:",
@ -803,11 +837,14 @@
"You have one event today.": "No tens cap activitat avui|Avui tens una activitat|Avui tens {count} activitats",
"You have one event tomorrow.": "No tens cap activitat per demà|Demà tens una activitat|Demà tens {count} activitats",
"You may also ask to {resend_confirmation_email}.": "També pots demanar {resend_confirmation_email}.",
"You may clear all participation information for this device with the buttons below.": "Pots esborrar tota la informació d'assistències que hi ha en aquest dispositiu amb els botons de sota.",
"You may now close this window, or {return_to_event}.": "Ja pots tancar aquesta finestra o {return_to_event}.",
"You may now close this window.": "Ja pots tancar aquesta finestra.",
"You need to create the group before you create an event.": "Has de tenir un grup per poder crear una activitat.",
"You need to login.": "Has d'iniciar sessió.",
"You will be able to add an avatar and set other options in your account settings.": "Pots afegir un avatar i editar altres opcions en les preferències del compte.",
"You will be redirected to the original instance": "Seràs redirigit/da a la instància original",
"You will find here all the events you have created or of which you are a participant.": "Aquí hi trobaràs totes les activitats que hagis creat o a les quals estiguis apuntat/da.",
"You wish to participate to the following event": "Vols participar en l'activitat següent",
"You'll get a weekly recap every Monday for upcoming events, if you have any.": "Rebràs un recordatori cada dilluns que tinguis activitats properes planificades.",
"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.": "Hauràs de fer arribar l'enllaç del grup a les persones que vulguis que accedeixin al perfil del grup. No es podrà trobar en la cerca de Mobilizon ni als motors de cerca generals.",
@ -831,7 +868,10 @@
"Your participation request has been validated": "Has estat validat/da com a participant",
"Your participation request is being validated": "Se t'està validant com a participant",
"Your participation status has been changed": "Ha canviat l'estat de participació",
"Your participation status is saved only on this device and will be deleted one month after the event's passed.": "L'estat de la teva assistència només es desa en aquest dispositiu, i té una caducitat d'un mes a partir del final de l'activitat.",
"Your participation still has to be approved by the organisers.": "Les organitzadores encara no t'han aprovat com a participant.",
"Your participation will be validated once you click the confirmation link into the email, and after the organizer manually validates your participation.": "Es validarà la teva participació un cop hagis seguit l'enllaç de confirmació del correu, que t'arribarà després que una organitzadora accepti la teva soŀlicitud.",
"Your participation will be validated once you click the confirmation link into the email.": "La teva assistència serà validada un cop hagis fet clic a l'enllaç de confirmació que t'arribarà al correu.",
"Your profile will be shown as contact.": "Es mostrarà el teu perfil com a contacte.",
"Your timezone is currently set to {timezone}.": "El fus horari que tens configurat és {timezone}.",
"Your timezone was detected as {timezone}.": "S'ha detectat el fus horari {timezone}.",
@ -845,9 +885,13 @@
"any distance": "qualsevol distància",
"as {identity}": "com a {identity}",
"contact uninformed": "contacte",
"create a group": "crea un grup",
"create an event": "crea una activitat",
"default Mobilizon privacy policy": "política de privacitat per defecte de Mobilizon",
"default Mobilizon terms": "condicions de Mobilizon per defecte",
"e.g. 10 Rue Jangot": "ex.: 13 Rue del Percebe",
"explore the events": "explora les activitats",
"explore the groups": "explora els grups",
"firstDayOfWeek": "0",
"full rules": "normes completes",
"iCal Feed": "Flux iCal",
@ -860,6 +904,7 @@
"report #{report_number}": "denúncia #{report_number}",
"resend confirmation email": "reenvia el mail de confirmació",
"respect of the fundamental freedoms": "respecte per les llibertats fonamentals",
"return to the event's page": "torna a la pàgina de l'activitat",
"terms of service": "condicions del servei",
"with another identity…": "amb una altra identitat…",
"{approved} / {total} seats": "{approved} / {total} places",

View File

@ -15,14 +15,14 @@
"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 federated software": "Eine federierte Software",
"A place for your code of conduct, rules or guidelines. You can use HTML tags.": "Hier ist Platz für deinen Code of Conduct, Regeln und Vorgaben. Du kannst HTML-Tags verwenden.",
"A place to explain who you are and the things that set your instance apart. You can use HTML tags.": "Hier kannst Du beschreiben, wer du bist und was deine Instanz besonders macht. Du kannst HTML-Tags verwenden.",
"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 practical tool": "Ein praktisches Werkzeug",
"A short tagline for your instance homepage. Defaults to \"Gather ⋅ Organize ⋅ Mobilize\"": "Eine kurze Tagline für Ihre Instanz-Homepage. Standardmäßig ist \"Sammeln ⋅ Organisieren ⋅ Mobilisieren\" eingestellt.",
"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.",
"A validation email was sent to {email}": "Es wurde eine Bestätigungs-Mail an {email} gesendet",
"API": "API",
"Abandon editing": "Bearbeitung abbrechen",
"Abandon edition": "Bearbeitung abbrechen",
@ -36,7 +36,7 @@
"Accepted": "Akzeptiert",
"Accessible only to members": "Nur für Mitglieder zugänglich",
"Accessible through link": "Erreichbar über Link",
"Account": "Account",
"Account": "Konto",
"Account settings": "Kontoeinstellungen",
"Actions": "Aktionen",
"Activated": "Aktiviert",
@ -45,10 +45,10 @@
"Add": "Hinzufügen",
"Add / Remove…": "Hinzufügen / Entfernen…",
"Add a contact": "Füge einen Kontakt hinzu",
"Add a group": "Füge eine Gruppe hinzu",
"Add a group": "Fügen Sie eine Gruppe hinzu",
"Add a new post": "Einen neuen Beitrag hinzufügen",
"Add a note": "Notiz hinzufügen",
"Add a todo": "Erstelle ein To-do",
"Add a todo": "To-do hinzufügen",
"Add an address": "Adresse hinzufügen",
"Add an instance": "Instanz hinzufügen",
"Add some tags": "Füge Tags hinzu",
@ -58,7 +58,7 @@
"Admin settings": "Admineinstellungen",
"Admin settings successfully saved.": "Admineinstellungen erfolgreich gespeichert.",
"Administration": "Administration",
"Administrator": "Administrator:in",
"Administrator": "Administrator",
"All good, let's continue!": "Das passt, weiter geht's!",
"All group members and other eventual server admins will still be able to view this information.": "Alle Gruppenmitglieder und andere Server-Administrator:innen können diese Information dennoch einsehen.",
"All the places have already been taken": "Alle Plätze sind besetzt|Ein Platz ist noch verfügbar|{places} Plätze sind noch verfügbar",
@ -66,38 +66,39 @@
"Allow all comments from users with accounts": "Erlaube alle Kommentare von eingeloggten Usern",
"Allow registrations": "Erlaube Registrierungen",
"An error has occurred.": "Ein Fehler ist aufgetreten.",
"An ethical alternative": "Eine ethnische Alternative",
"An instance is an installed version of the Mobilizon software running on a server. An instance can be run by anyone using the {mobilizon_software} or other federated apps, aka the “fediverse”. This instance's name is {instance_name}. Mobilizon is a federated network of multiple instances (just like email servers), users registered on different instances may communicate even though they didn't register on the same instance.": "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:innen 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 deinem Namen.",
"An ethical alternative": "Eine ethische Alternative",
"An instance is an installed version of the Mobilizon software running on a server. An instance can be run by anyone using the {mobilizon_software} or other federated apps, aka the “fediverse”. This instance's name is {instance_name}. Mobilizon is a federated network of multiple instances (just like email servers), users registered on different instances may communicate even though they didn't register on the same instance.": "Als Instanz bezeichnen wir eine Installation der Mobilizon-Software auf einem Server. Eine Instanz kann von jedem mit Hilfe der {mobilizon_software} oder anderer kompatibler Software betrieben werden. Der Name dieser Instanz lautet „{instance_name}“. Diese Instanz ist Teil des „Fediverse“, einem Netzwerk aus vielen verbundenen Instanzen, die alle miteinander kommunizieren können. Nutzer von verschiedenen Instanzen können so - genau wie beim E-Mail-System - miteinander kommunizieren, auch wenn sie Accounts bei völlig verschiedenen Instanzen registriert haben.",
"An “application programming interface” or “API” is a communication protocol that allows software components to communicate with each other. The Mobilizon API, for example, can allow third-party software tools to communicate with Mobilizon instances to carry out certain actions, such as posting events on your behalf, automatically and remotely.": "Eine Programmierschnittstelle, auch API genannt (von englisch „application programming interface“) definiert ein Kommunikationsprotokoll, das Softwarekomponenten erlaubt, miteinander zu interagieren. Die Mobilizon-API ermöglicht Drittanbietersoftware beispielsweise automatisiert bestimmte Aktionen auszuführen, z.B. das Erstellen von Veranstaltungen in Ihrem Namen.",
"And {number} comments": "Und {number} Kommentare",
"Anonymous participant": "Anonyme Teilnehmer:in",
"Anonymous participants will be asked to confirm their participation through e-mail.": "Anonyme Teilnehmer:innen werden gebeten, ihre Teilnahme per E-Mail zu bestätigen.",
"Anonymous participant": "Anonymer Teilnehmer",
"Anonymous participants will be asked to confirm their participation through e-mail.": "Anonyme Teilnehmer werden gebeten, ihre Teilnahme per E-Mail zu bestätigen.",
"Anonymous participations": "Anonyme Teilnehmer",
"Any day": "Egal wann",
"Anyone can join freely": "Jeder kann frei beitreten",
"Anyone wanting to be a member from your group will be able to from your group page.": "Jeder, der ein Mitglied Ihrer Gruppe werden möchte, kann dies von Ihrer Gruppenseite aus tun.",
"Application": "Anwendung",
"Approve": "Bestätigen",
"Are you really sure you want to delete your whole account? You'll lose everything. Identities, settings, events created, messages and participations will be gone forever.": "Bist du dir sicher, dass du den gesamten Account löschen möchtest? Du verlierst dadurch alles. Identitäten, Einstellungen, erstellte Events, Nachrichten, Teilnahmen sind dann für immer verschwunden.",
"Are you really sure you want to delete your whole account? You'll lose everything. Identities, settings, events created, messages and participations will be gone forever.": "Sind Sie sich sicher, dass Sie Ihren gesamten Nutzeraccount löschen möchten? Sie verlieren dadurch alles. Identitäten, Einstellungen, erstellte Veranstaltungen, Nachrichten, Teilnahmen sind dann für immer verschwunden.",
"Are you sure you want to <b>completely delete</b> this group? All members - including remote ones - will be notified and removed from the group, and <b>all of the group data (events, posts, discussions, todos…) will be irretrievably destroyed</b>.": "Sind Sie sicher, dass Sie diese Gruppe <b>vollständig löschen</b> wollen? Alle Mitglieder - auch die entfernten - werden benachrichtigt und aus der Gruppe entfernt, und <b>alle Daten der Gruppe (Ereignisse, Beiträge, Diskussionen, ToDos...) werden unwiederbringlich zerstört</b>.",
"Are you sure you want to <b>delete</b> this comment? This action cannot be undone.": "Bist du sicher, dass du diesen Kommentar <b>löschen</b> willst? Diese Aktion kann nicht rückgängig gemacht werden.",
"Are you sure you want to <b>delete</b> this event? This action cannot be undone. You may want to engage the discussion with the event creator or edit its event instead.": "Bist du sicher, dass du diese Veranstaltung <b>löschen</b> willst? Diese Aktion kann nicht rückgängig gemacht werden.",
"Are you sure you want to <b>suspend</b> this group? All members - including remote ones - will be notified and removed from the group, and <b>all of the group data (events, posts, discussions, todos…) will be irretrievably destroyed</b>.": "Sind Sie sicher, dass Sie diese Gruppe <b>suspendieren</b> wollen? Alle Mitglieder - auch die entfernten - werden benachrichtigt und aus der Gruppe entfernt, und <b>alle Daten der Gruppe (Ereignisse, Beiträge, Diskussionen, ToDos...) werden unwiederbringlich zerstört</b>.",
"Are you sure you want to <b>suspend</b> 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.": "Sind Sie sicher, dass Sie diese Gruppe <b>suspendieren</b> wollen? Da diese Gruppe von der Instanz {instance} stammt, werden dadurch nur die lokalen Mitglieder entfernt und die lokalen Daten gelöscht, sowie alle zukünftigen Daten verworfen.",
"Are you sure you want to cancel the event creation? You'll lose all modifications.": "Bist Du dir sicher, dass du das Erstellen der Veranstaltung abbrechen möchtest? Alle Änderungen werden verloren gehen.",
"Are you sure you want to cancel the event edition? You'll lose all modifications.": "Bist du dir sicher, dass Du die Bearbeitung der Veranstaltung abbrechen möchtest? Alle Änderungen werden verloren gehen.",
"Are you sure you want to cancel your participation at event \"{title}\"?": "Bist Du dir sicher, dass Du nicht mehr an der Veranstaltung \"{title}\" teilnehmen möchtest?",
"Are you sure you want to delete this event? This action cannot be reverted.": "Bist Du dir sicher, dass Du diese Veranstaltung löschen möchtest? Dies kann nicht rückgängig gemacht werden.",
"Are you sure you want to <b>delete</b> this comment? This action cannot be undone.": "Sind Sie sicher, dass Sie diesen Kommentar <b>löschen</b> wollen? Diese Aktion kann nicht rückgängig gemacht werden.",
"Are you sure you want to <b>delete</b> this event? This action cannot be undone. You may want to engage the discussion with the event creator or edit its event instead.": "Sind Sie sicher, dass Sie diese Veranstaltung <b>löschen</b> wollen? Diese Aktion kann nicht rückgängig gemacht werden.",
"Are you sure you want to <b>suspend</b> this group? All members - including remote ones - will be notified and removed from the group, and <b>all of the group data (events, posts, discussions, todos…) will be irretrievably destroyed</b>.": "Möchten Sie diese Gruppe wirklich <b>auflösen</b>? Alle Mitglieder - einschließlich externe - werden benachrichtigt und aus der Gruppe entfernt. Es werden <b>alle Gruppendaten (Veranstaltungen, Beiträge, Diskussionen, Aufgaben, ...) irreversibel gelöscht</b>.",
"Are you sure you want to <b>suspend</b> 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.": "Möchten Sie diese Gruppe wirklich <b>auflösen</b>? Da diese Gruppe von einer anderen Instanz ({instance}) stammt, werden nur lokale Mitglieder und Daten entfernt und zukünftige Daten abgelehnt.",
"Are you sure you want to cancel the event creation? You'll lose all modifications.": "Sind Sie sich sicher, dass Sie das Erstellen der Veranstaltung abbrechen möchten? Alle Änderungen werden verloren gehen.",
"Are you sure you want to cancel the event edition? You'll lose all modifications.": "Sind Sie sich sicher, dass die Veranstaltung abrechen möchten? Sie verlieren dann alle Änderungen.",
"Are you sure you want to cancel your participation at event \"{title}\"?": "Sind Sie sicher, dass Sie Ihre Teilnahme an der Veranstaltung \"{Titel}\" stornieren möchten?",
"Are you sure you want to delete this event? This action cannot be reverted.": "Sind Sie sicher, dass Sie diese Veranstaltung löschen möchten? Diese Aktion kann nicht rückgängig gemacht werden.",
"As the event organizer has chosen to manually validate participation requests, your participation will be really confirmed only once you receive an email stating it's being accepted.": "Da der Veranstalter sich entschieden hat, die Teilnahmeanfragen manuell zu validieren, wird Ihre Teilnahme erst dann wirklich bestätigt, wenn Sie eine E-Mail erhalten, in der die Annahme bestätigt wird.",
"Assigned to": "Zugewiesen an",
"Atom feed for events and posts": "Atom-Feed mit Veranstaltungen und Beiträgen",
"Avatar": "Profilbild",
"Back to previous page": "Zurück zur vorherigen Seite",
"Banner": "Banner",
"Before you can login, you need to click on the link inside it to validate your account.": "Bevor Du dich einloggen kannst, musst Du den Link anklicken, um deinen Account zu überprüfen.",
"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",
"By @{group}": "Von @{group}",
"By @{username}": "Nach @{username}",
"By @{username}": "von @{username}",
"By {author}": "Von {author}",
"By {group}": "Von {group}",
"By {username} and {group}": "Nach {username} und {group}",
@ -125,7 +126,7 @@
"Click to select": "Klicken zum Auswählen",
"Click to upload": "Klicken zum Hochladen",
"Close": "Schließen",
"Close comments for all (except for admins)": "Schließe die Kommentare für alle (außer für Administratoren)",
"Close comments for all (except for admins)": "Kommentare für alle sperren (außer für Admins)",
"Closed": "Geschlossen",
"Comment deleted": "Kommentar gelöscht",
"Comment from @{username} reported": "Kommentar von @{username} gemeldet",
@ -139,32 +140,32 @@
"Confirmed": "Bestätigt",
"Confirmed at": "Bestätigt am",
"Confirmed: Will happen": "Bestätigt: Wird stattfinden",
"Congratulations, your account is now created!": "Glückwunsch, dein Account wurde jetzt erstellt!",
"Congratulations, your account is now created!": "Glückwunsch, Ihr Account wurde jetzt erstellt!",
"Contact": "Kontakt",
"Continue editing": "Bearbeitung fortsetzen",
"Cookies and Local storage": "Cookies und lokale Website-Daten",
"Cookies and Local storage": "Cookies und lokaler Web-Storage",
"Country": "Land",
"Create": "Erstellen",
"Create a calc": "Erstelle ein Tabellenkalkulations-Dokument",
"Create a calc": "Tabelle erstellen",
"Create a discussion": "Beginne eine Diskussion",
"Create a folder": "Erstelle einen Ordner",
"Create a new event": "Erstelle eine neue Veranstaltung",
"Create a new group": "Erstelle eine neue Gruppe",
"Create a new identity": "Erstelle eine neue Identität",
"Create a new list": "Erstelle eine neue Liste",
"Create a pad": "Erstelle ein Pad",
"Create a videoconference": "Erstelle eine Videokonferenz",
"Create a new list": "neue Liste erstellen",
"Create a pad": "Pad erstellen",
"Create a videoconference": "Videokonferenz erstellen",
"Create a visioconference": "Erstelle eine Videokonferenz",
"Create an account": "Erstelle einen Account",
"Create an account": "Konto erstellen",
"Create and manage several identities from the same account": "Erstelle und verwalte mehrere Identitäten vom selben Account aus",
"Create event": "Veranstaltung erstellen",
"Create group": "Gruppe erstellen",
"Create my event": "Erstelle eine neue Veranstaltung",
"Create my group": "Erstelle meine Gruppe",
"Create my group": "Erstelle eine Gruppe",
"Create my profile": "Erstelle mein Profil",
"Create resource": "Ressource erstellen",
"Create the discussion": "Beginne die Diskussion",
"Create to-do lists for all the tasks you need to do, assign them and set due dates.": "Erstellen Sie To-Do-Listen für alle Aufgaben, die Sie erledigen müssen, weisen Sie sie zu und legen Sie Fälligkeitsdaten fest.",
"Create to-do lists for all the tasks you need to do, assign them and set due dates.": "Erstellen Sie To-Do-Listen für alle Aufgaben, die Sie erledigen müssen, weisen Sie diese zu und legen Sie Fälligkeitsdaten fest.",
"Create token": "Token erstellen",
"Create, edit or delete events": "Erstelle, bearbeite oder lösche Veranstaltungen",
"Created by {name}": "Erstellt von {name}",
@ -174,7 +175,7 @@
"Current page": "Aktuelle Seite",
"Custom": "Benutzerdefiniert",
"Custom URL": "benutzerdefiniert URL",
"Custom text": "benutzerdefiniert Text",
"Custom text": "benutzerdefinierter Text",
"Daily email summary": "Tägliche E-Mail-Zusammenfassungen",
"Dashboard": "Dashboard",
"Date": "Datum",
@ -190,19 +191,19 @@
"Delete Event": "Veranstaltung löschen",
"Delete account": "Account löschen",
"Delete conversation": "Lösche Konversation",
"Delete event": "Event löschen",
"Delete event": "Veranstaltung löschen",
"Delete everything": "Alles löschen",
"Delete group": "Lösche Gruppe",
"Delete my account": "Meinen Account löschen",
"Delete group": "Gruppe löschen",
"Delete my account": "Mein Konto löschen",
"Delete post": "Beitrag löschen",
"Delete this identity": "Diese Identität löschen",
"Delete your identity": "Deine Identität löschen",
"Delete your identity": "Ihre Identität löschen",
"Delete {eventTitle}": "Lösche {eventTitle}",
"Delete {preferredUsername}": "Lösche {preferredUsername}",
"Deleting comment": "Lösche Kommentar",
"Deleting event": "Lösche Event",
"Deleting my account will delete all of my identities.": "Das Löschen meines Accounts wird all meine Identitäten löschen.",
"Deleting your Mobilizon account": "Lösche dein Mobilizon Konto",
"Deleting event": "Lösche Veranstaltung",
"Deleting my account will delete all of my identities.": "Das Löschen meines Kontos wird alle meine Identitäten löschen.",
"Deleting your Mobilizon account": "Löschen Sie Ihr Mobilizon Konto",
"Demote": "zurückstufen",
"Description": "Beschreibung",
"Didn't receive the instructions ?": "Bestätigungsmail nicht erhalten?",
@ -212,8 +213,10 @@
"Display name": "Anzeigename",
"Display participation price": "Teilnahmegebühr anzeigen",
"Displayed nickname": "Angezeigter Nutzername",
"Displayed on homepage and meta tags. Describe what Mobilizon is and what makes this instance special in a single paragraph.": "Wird auf der Startseite und in den Meta-Tags angezeigt. Beschreibe in einem Absatz was Mobilizon ist und was diese Instanz besonders macht.",
"Displayed on homepage and meta tags. Describe what Mobilizon is and what makes this instance special in a single paragraph.": "Wird auf der Startseite und in den Meta-Tags angezeigt. Beschreiben Sie in einem Absatz was Mobilizon ist und was diese Instanz besonders macht.",
"Do not receive any mail": "Keine E-Mails erhalten",
"Do you wish to {create_event} or {explore_events}?": "Wollen Sie {create_event} oder {explore_events}?",
"Do you wish to {create_group} or {explore_groups}?": "Wollen Sie {create_group} oder {explore_groups}?",
"Domain": "Domain",
"Don't show @{organizer} as event host alongside @{group}": "Zeige @{organizer} nicht neben @{group} als Veranstalter:in an",
"Draft": "Entwurf",
@ -225,7 +228,7 @@
"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.",
"Either the account is already validated, either the validation token is incorrect.": "Der Account ist bereits bestätigt oder der Bestätigungstoken ist abgelaufen.",
"Either the account is already validated, either the validation token is incorrect.": "Das Konto ist bereits bestätigt oder der Bestätigungstoken ist abgelaufen.",
"Either the email has already been changed, either the validation token is incorrect.": "Die E-Mail-Adresse wurde bereits geändert oder der Bestätigungstoken ist abgelaufen.",
"Either the participation has already been validated, either the validation token is incorrect.": "Die Teilnahme wurde bereits bestätigt oder der Bestätigungstoken ist abgelaufen.",
"Either the participation request has already been validated, either the validation token is incorrect.": "Entweder wurde die Teilnahmeanfrage bereits validiert, oder das Validierungs-Token ist falsch.",
@ -233,25 +236,25 @@
"Email address": "E-Mail-Adresse",
"Email notifications": "E-Mail-Benachrichtigungen",
"Enabled": "Aktiviert",
"Ends on…": "Endet mit…",
"Ends on…": "Endet am…",
"Enjoy discovering Mobilizon!": "Viel Spaß beim Entdecken von Mobilizon!",
"Enter the link URL": "Füge die URL ein",
"Enter your email address below, and we'll email you instructions on how to change your password.": "Gib unten deine E-Mail-Adresse ein und wir senden dir per E-Mail Anweisungen, wie du dein Passwort zurücksetzen kannst.",
"Enter your own privacy policy. HTML tags allowed. The {mobilizon_privacy_policy} is provided as template.": "Gebe deine eigene Datenschutzerklärung ein. HTML tags sind erlaubt. Die {mobilizon_privacy_policy} ist als Vorlage bereitgestellt.",
"Enter your own terms. HTML tags allowed. The {mobilizon_terms} are provided as template.": "Gib deine eigenen Bedingungen an. HTML-Tags sind erlaubt. Die {mobilizon_terms} sind als Vorlage gegeben.",
"Enter the link URL": "Geben Sie die URL ein",
"Enter your email address below, and we'll email you instructions on how to change your password.": "Geben Sie unten Ihre E-Mail-Adresse ein und wir senden Ihnen per E-Mail Anweisungen, wie Sie Ihr Passwort zurücksetzen können.",
"Enter your own privacy policy. HTML tags allowed. The {mobilizon_privacy_policy} is provided as template.": "Geben Sie Ihre eigene Datenschutzerklärung ein. HTML tags sind erlaubt. Die {mobilizon_privacy_policy} ist als Vorlage bereitgestellt.",
"Enter your own terms. HTML tags allowed. The {mobilizon_terms} are provided as template.": "Geben Sie Ihre eigenen Bedingungen an. HTML-Tags sind erlaubt. Die {mobilizon_terms} sind als Vorlage gegeben.",
"Error": "Fehler",
"Error while changing email": "Fehler beim Ändern der E-Mail-Adresse",
"Error while communicating with the server.": "Fehler bei der Kommunikation mit dem Server.",
"Error while login with {provider}. Retry or login another way.": "Fehler bei der Anmeldung mit {provider}. Versuche es erneut oder nutze eine andere Login-Möglichkeit.",
"Error while login with {provider}. Retry or login another way.": "Fehler bei der Anmeldung mit {provider}. Versuchen Sie es erneut oder nutzen Sie eine andere Login-Möglichkeit.",
"Error while login with {provider}. This login provider doesn't exist.": "Fehler bei der Anmeldung über {provider}. Dieser Anbieter existiert nicht.",
"Error while reporting group {groupTitle}": "Fehler beim melden der Gruppe {groupTitle}",
"Error while saving report.": "Fehler beim Speichern der Meldung.",
"Error while validating account": "Fehler beim Bestätigen des Accounts",
"Error while validating account": "Fehler beim Bestätigen des Kontos",
"Error while validating participation": "Fehler beim Bestätigen der Teilnahme",
"Error while validating participation request": "Bei Deiner Teilnahmebestätigung ist ein Fehler aufgetreten",
"Ethical alternative to Facebook events, groups and pages, Mobilizon is a <b>tool designed to serve you</b>. Period.": "Ethische Alternative zu Facebook-Events, -Gruppen und -Seiten. Mobilizon ist ein <b>Werkzeug, das Ihnen dienen soll</b>. Punkt.",
"Error while validating participation request": "Bei Ihrer Teilnahmebestätigung ist ein Fehler aufgetreten",
"Ethical alternative to Facebook events, groups and pages, Mobilizon is a <b>tool designed to serve you</b>. Period.": "Ethische Alternative zu Facebook-Events, -Gruppen und -Seiten. Mobilizon ist ein <b>Werkzeug, welches Ihnen dienen soll</b>. Punkt.",
"Event": "Veranstaltung",
"Event already passed": "Veranstaltung hat bereits stattgefunden",
"Event already passed": "Veranstaltung liegt in der Vergangenheit",
"Event cancelled": "Veranstaltung abgesagt",
"Event creation": "Veranstaltung anlegen",
"Event edition": "Veranstaltung bearbeiten",
@ -274,7 +277,7 @@
"Featured events": "Vorgestellte Veranstaltungen",
"Features": "Funktionen",
"Federated Group Name": "Federierter Gruppenname",
"Federation": "Föderation",
"Federation": "Federation",
"Fetch more": "Mehr abrufen",
"Find an address": "Adresse finden",
"Find an instance": "Eine Instanz finden",
@ -293,15 +296,16 @@
"General": "Allgemein",
"General information": "Allgemeine Informationen",
"Getting location": "Standort ermitteln",
"Getting there": "Hin kommen",
"Glossary": "Glossar",
"Go": "Los",
"Go to the event page": "Gehe zur Veranstaltungsseite",
"Go to the event page": "Zur Veranstaltungsseite",
"Going as {name}": "Teilnehmen als {name}",
"Group": "Gruppe",
"Group List": "Gruppenliste",
"Group Members": "Gruppenmitglieder",
"Group address": "Gruppenadresse",
"Group display name": "Anzeigename Gruppe",
"Group display name": "Angezeigter Gruppenname",
"Group full name": "Vollständiger Gruppenname",
"Group name": "Gruppenname",
"Group settings": "Gruppeneinstellungen",
@ -311,12 +315,13 @@
"Group {displayName} created": "Gruppe {displayName} erstellt",
"Group {groupTitle} reported": "Gruppe {groupTitle} wurde gemeldet",
"Groups": "Gruppen",
"Groups are not enabled on this instance.": "Gruppen sind auf dieser Instanz nicht aktiviert.",
"Groups are spaces for coordination and preparation to better organize events and manage your community.": "Gruppen sind Räume zur Koordination und Vorbereitung, um Veranstaltungen besser zu organisieren und Ihre Gemeinschaft zu verwalten.",
"Headline picture": "Titelbild",
"Hide replies": "Antworten ausblenden",
"Hide the organizer": "Verstecke die Organisator:innen",
"Home": "Home",
"Home to {number} users": "Zuhause von {number} Nutzer:innen",
"Home to {number} users": "Zuhause von {number} Nutzern",
"Hourly email summary": "Stündliche E-Mail-Zusammenfassungen",
"I agree to the {instanceRules} and {termsOfService}": "Ich stimme den {instanceRules} und den {termsOfService} zu",
"I create an identity": "Ich erstelle eine Identität",
@ -326,23 +331,25 @@
"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",
"ICS feed for events": "ICS-Feed mit Veranstaltungen",
"ICS/WebCal Feed": "ICS/Webcal-Feed",
"Identity {displayName} created": "Identität {displayName} erstellt",
"Identity {displayName} deleted": "Identität {displayName} gelöscht",
"Identity {displayName} updated": "Identität {displayName} aktualisiert",
"If allowed by organizer": "Wenn von der Organisator:in erlaubt",
"If an account with this email exists, we just sent another confirmation email to {email}": "Falls ein Account mit dieser E-Mail-Adresse existiert, senden wir eine neue Bestätigung an {email}",
"If allowed by organizer": "Wenn vom Organisator erlaubt",
"If an account with this email exists, we just sent another confirmation email to {email}": "Falls ein Konto mit dieser E-Mail-Adresse existiert, senden wir eine neue Bestätigung an {email}",
"If the direction given by the development team does not suit you, you have the legal right to create your own version of the software, with your own governance choices.": "Wenn dir die von den Entwickler:innen vorgegebene Richtung nicht passt, hast du das Recht, deine eigene Version der Software nach deinen eigenen Regeln zu erstellen.",
"If this identity is the only administrator of some groups, you need to delete them before being able to delete this identity.": "Falls diese Identität die einzige Administrator:in einer oder mehrerer Gruppen sein sollte, musst du zunächst die Gruppen löschen, bevor du diese Identität löschen kannst.",
"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:": "Wenn Sie nach Ihrer föderierten Identität gefragt werden, setzt sich diese aus Ihrem Benutzernamen und Ihrer Instanz zusammen. Die föderierte Identität für Ihr erstes Profil lautet zum Beispiel:",
"If this identity is the only administrator of some groups, you need to delete them before being able to delete this identity.": "Falls diese Identität die einzige Administrator einer oder mehrerer Gruppen sein sollte, müssen Sie zunächst die Gruppen löschen, bevor Sie diese Identität löschen können.",
"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:": "Wenn Sie nach Ihrer federierten Identität gefragt werden, setzt sich dieser aus Ihrem Benutzernamen und Ihrer Instanz zusammen. Die federierte Identität für Ihr erstes Profil lautet zum Beispiel:",
"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.": "Wenn Sie sich für die manuelle Validierung von Teilnehmern entschieden haben, sendet Ihnen Mobilizon eine E-Mail, um Sie über neue zu bearbeitende Teilnahmen zu informieren. Sie können die Häufigkeit dieser Benachrichtigungen unten auswählen.",
"If you want, you may send a message to the event organizer here.": "Wenn Du möchtest, kannst du der Organisator:in hier eine Nachricht hinterlassen.",
"If you want, you may send a message to the event organizer here.": "Wenn Sie möchten, können Sie dem Organisator eine Nachricht hinterlassen.",
"Impossible to login, your email or password seems incorrect.": "Login nicht möglich. Deine E-Mail-Adresse oder dein Passwort ist falsch.",
"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.": "Im Folgenden meinen wir mit Anwendung eine Software, über die du mit deiner Instanz interagierst. Diese Software kann vom Mobilizon-Team oder von Dritten bereitgestellt werden.",
"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.": "Im Folgenden meinen wir mit Anwendung eine Software, über die Sie mit Ihrer Instanz interagieren. Diese Software kann vom Mobilizon-Team oder von Dritten bereitgestellt werden.",
"In the meantime, please consider that the software is not (yet) finished. More information {onBlog}.": "Bitte beachte, dass diese Software noch nicht fertig ist. Mehr Informationen {onBlog}.",
"Installing Mobilizon will allow communities to free themselves from the services of tech giants by creating <b>their own event platform</b>.": "Mobilizon zu installieren wird es Gemeinschaften erlauben, sich von den Plattformen und Diensten der Tech-Giganten loszulösen, indem sie <b>ihre eigene Plattform</b> schaffen.",
"Instance": "Instanz",
"Instance Description": "Beschreibung der Instanz",
"Instance Long Description": "Langbeschreibung der Instanz",
"Instance Long Description": "Vollständige Beschreibung der Instanz",
"Instance Name": "Name der Instanz",
"Instance Privacy Policy": "Datenschutzerklärung der Instanz",
"Instance Privacy Policy Source": "Herkunft der Datenschutzerklärung der Instanz",
@ -353,22 +360,22 @@
"Instance Terms": "Nutzungsbedingungen der Instanz",
"Instance Terms Source": "Herkunft der Nutzungsbedingungen der Instanz",
"Instance Terms URL": "URL der Nutzungsbedingungen der Instanz",
"Instance administrator": "Administrator:in der Instanz",
"Instance administrator": "Administrator der Instanz",
"Instance configuration": "Einstellungen der Instanz",
"Instance languages": "Sprache der Instanz",
"Instance rules": "Instanz-Regeln",
"Instance settings": "Einstellungen der Instanz",
"Instances": "Instanzen",
"Instances following you": "Instanzen, die dir folgen",
"Instances you follow": "Instanzen, denen du folgst",
"Invite a new member": "Lade ein neues Gruppenmitglied ein",
"Instances following you": "Instanzen, die Ihnen folgen",
"Instances you follow": "Instanzen, denen Sie folgen",
"Invite a new member": "Neues Mitglied einladen",
"Invite member": "Mitglied einladen",
"Invited": "Eingeladen",
"Italic": "Kursiv",
"Join <b>{instance}</b>, a Mobilizon instance": "Trete <b>{instance}</b> bei, eine Mobilizon Instanz",
"Join group": "Gruppe beitreten",
"Join {instance}, a Mobilizon instance": "Tritt {instance} bei, eine Mobilizon-Instanz",
"Keep the entire conversation about a specific topic together on a single page.": "Halten Sie die gesamte Konversation über ein bestimmtes Thema auf einer einzigen Seite zusammen.",
"Keep the entire conversation about a specific topic together on a single page.": "Fassen Sie die gesamte Konversation über ein bestimmtes Thema auf einer einzigen Seite zusammen.",
"Key words": "Schlagworte",
"Language": "Sprache",
"Last IP adress": "Letzte IP Adresse",
@ -377,15 +384,15 @@
"Last sign-in": "Letzter Log-in",
"Last week": "Letzte Woche",
"Latest posts": "Neuste Beiträge",
"Learn more": "Erfahre mehr",
"Learn more": "Mehr erfahren",
"Learn more about Mobilizon": "Erfahre mehr über Mobilizon",
"Learn more about {instance}": "Lerne mehr über {instance}",
"Learn more about {instance}": "Mehr über {instance} erfahren",
"Leave": "Verlassen",
"Leave event": "Teilnahme absagen",
"Leaving event \"{title}\"": "Teilnahme an der Veranstaltung \"{title}\" absagen",
"Legal": "Rechtliches",
"Let's create a new common": "Lass uns neues Gemeingut erschaffen",
"Let's define a few settings": "Lass uns ein paar Einstellungen vornehmen",
"Let's define a few settings": "Einstellungen vornehmen",
"Let\\'s create a new common": "Lasst uns neues Gemeingut erschaffen",
"License": "Lizenz",
"Limited number of places": "Limitierte Anzahl an Plätzen",
@ -411,31 +418,31 @@
"Members": "Mitglieder",
"Message": "Nachricht",
"Mobilizon": "Mobilizon",
"Mobilizon is a federated network. You can interact with this event from a different server.": "Mobilizon ist ein föderiertes Netzwerk. Du kannst mit dieser Veranstaltung von verschiedenen Server aus interagieren.",
"Mobilizon is a federated software, meaning you can interact - depending on your admin's federation settings - with content from other instances, such as joining groups or events that were created elsewhere.": "Mobilizon ist eine föderierte Software, d.h. Sie können - abhängig von Ihren Admin-Föderationseinstellungen - mit Inhalten aus anderen Instanzen interagieren, z.B. Gruppen oder Veranstaltungen beitreten, die anderswo erstellt wurden.",
"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.",
"Mobilizon is a federated software, meaning you can interact - depending on your admin's federation settings - with content from other instances, such as joining groups or events that were created elsewhere.": "Mobilizon ist eine föderierte Software, d.h. Sie können - abhängig von Ihren Admin-Federationseinstellungen - mit Inhalten aus anderen Instanzen interagieren, z.B. Gruppen oder Veranstaltungen beitreten, die anderswo erstellt wurden.",
"Mobilizon is a free/libre software that will allow communities to create <b>their own spaces</b> to publish events in order to better emancipate themselves from tech giants.": "Mobilizon ist Freie Software (Open Source), welche es Gemeinschaften erlaubt <b>ihre eigenen Räume</b> zu schaffen, um Veranstaltungen anzukündigen und sich aus der Abhängigkeit von Tech-Giganten zu lösen.",
"Mobilizon is a tool that helps you <b>find, create and organise events</b>.": "Mobilizon ist ein Werkzeug, das Ihnen beim <b>Finden, Erstellen und Organisieren von Veranstaltungen</b> hilft.",
"Mobilizon is not a giant platform, but a <b>multitude of interconnected Mobilizon websites</b>.": "Mobilizon ist keine riesige Plattform, sondern eine <b>Multitude von miteinander verbundenen Mobilizon-Websites</b>.",
"Mobilizon is not a giant platform, but a <b>multitude of interconnected Mobilizon websites</b>.": "Mobilizon ist keine riesige Plattform, sondern eine <b>Vielzahl von miteinander verbundenen Mobilizon-Websiten</b>.",
"Mobilizon is not developed by a secretive start-up, but by a group of friends who strive to {change_world}. So while we do work slower, we remain attentive and in touch with our users.": "Mobilizon wird nicht von einem geheimniskrämerischen Start-Up entwickelt, sondern von einer Gruppe von Menschen, die {change_world}. Auch wenn wir etwas langsamer arbeiten, bleiben wir achtsam und in Kontakt mit unseren Nutzer:innen.",
"Mobilizon is under development, we will add new features to this site during regular updates, until the release of <b>version 1 of the software in the fall of 2020</b>.": "Mobilizon befindet sich noch in der Entwicklung. Bis zur Veröffentlichung von <b>Version 1.0 im zweiten Halbjahr 2020</b> werden wir über regelmäßige Updates neue Funktionen hinzufügen.",
"Mobilizon is under development, we will add new features to this site during regular updates, until the release of <b>version 1 of the software in the first half of 2020</b>.": "Mobilizon befindet sich in der Entwicklung, wir werden neue Funktionen während regulären Updates hinzufügen, bis <b>Version 1 der Software in der ersten Hälfte von 2020 veröffentlicht wird</b>.",
"Mobilizon software": "Mobilizon-Software",
"Mobilizon uses a system of profiles to compartiment your activities. You will be able to create as many profiles as you want.": "Mobilizon verwendet ein System von Profilen, um Ihre Aktivitäten zu unterteilen. Sie können so viele Profile erstellen, wie Sie möchten.",
"Mobilizon version": "Mobilizon-Version",
"Mobilizon will send you an email when the events you are attending have important changes: date and time, address, confirmation or cancellation, etc.": "Mobilizon wird dir eine E-Mail senden, wenn sich bei Veranstaltungen, an denen zu teilnimmst, wichtige Änderungen ergeben: Datum und Uhrzeit, Ort, Bestätigung oder Absage der Veranstaltung.",
"Mobilizon will send you an email when the events you are attending have important changes: date and time, address, confirmation or cancellation, etc.": "Mobilizon wird Ihnen eine E-Mail senden, wenn sich bei Veranstaltungen, an denen Sie teilnehmen, wichtige Änderungen ergeben: Datum und Uhrzeit, Ort, Bestätigung oder Absage der Veranstaltung.",
"Mobilizons licence": "Mobilizons Lizenz",
"Moderated comments (shown after approval)": "Moderierte Kommentare (werden nach manueller Freigabe angezeigt)",
"Moderation": "Moderation",
"Moderation log": "Moderations-Logbuch",
"Moderator": "Moderator:in",
"Moderator": "Moderator",
"Move": "Verschieben",
"Move \"{resourceName}\"": "„{resourceName}“ verschieben",
"Move resource to {folder}": "Verschiebe Ressource nach {folder}",
"My account": "Mein Account",
"My account": "Mein Konto",
"My events": "Meine Veranstaltungen",
"My groups": "Meine Gruppen",
"My identities": "Meine Identitäten",
"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.": "VORSICHT! Standard-Nutzungsbedingungen wurden nicht von einer Anwält:in geprüft und stellen daher wahrscheinlich keinen vollständigen Schutz für Administrator:innen in allen erdenklichen Fällen dar. Sie sind zudem nicht auf die lokalen Gesetzgebungen der Länder angepasst. Falls du dir unsicher bist, lass dich von einer Anwält:in beraten.",
"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.": "VORSICHT! Standard-Nutzungsbedingungen wurden nicht von einem Anwalt geprüft und stellen daher wahrscheinlich keinen vollständigen Schutz für Administratoren in allen erdenklichen Fällen dar. Sie sind zudem nicht auf die lokalen Gesetzgebungen der Länder angepasst. Falls Sie sich unsicher sind, konsultieren Sie einen Rechtsanwalt.",
"Name": "Name",
"New discussion": "Neue Diskussion",
"New email": "Neue E-Mail",
@ -469,7 +476,7 @@
"No one is going to this event": "Niemand nimmt an dieser Veranstaltung teil|Eine Person nimmt teil|{going} Personen nehmen teil",
"No ongoing todos": "Keine aktiven To-dos",
"No open reports yet": "Bisher keine ausstehenden Berichte",
"No participant matches the filters": "Keine Teilnehmer:in entspricht den Filterkriterien",
"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 posts found": "Keine Beiträge gefunden",
@ -493,7 +500,7 @@
"Notification before the event": "Benachrichtigung vor der Veranstaltung",
"Notification on the day of the event": "Benachrichtigung am Tag der Veranstaltung",
"Notifications for manually approved participations to an event": "Benachrichtigungen bei manuell bestätigten Teilnahmen an einer Veranstlatung",
"Now, create your first profile:": "Erstelle jetzt dein erstes Profil:",
"Now, create your first profile:": "Erstellen Sie jetzt Ihr erstes Profil:",
"Number of places": "Anzahl der Plätze",
"OK": "OK",
"Old password": "Altes Passwort",
@ -509,6 +516,7 @@
"Only accessible to members of the group": "Nur für Gruppenmitglieder sichtbar",
"Only alphanumeric characters and underscores are supported.": "Nur alphanumerische Zeichen und Unterstriche werden unterstützt.",
"Only alphanumeric lowercased characters and underscores are supported.": "Es werden nur alphanumerische Kleinbuchstaben und Unterstriche unterstützt.",
"Only group members can access discussions": "Nur Gruppenmitglieder können die Diskussion anzeigen",
"Only group moderators can create, edit and delete posts.": "Nur Gruppenmoderatoren können Beiträge erstellen, editieren oder löschen.",
"Open": "Offen",
"Opened reports": "Geöffnete Meldungen",
@ -517,9 +525,9 @@
"Organized": "Organisiert",
"Organized by": "Organisiert von",
"Organized by {name}": "Organisiert von {name}",
"Organizer": "Organisator:in",
"Organizer notifications": "Benachrichtigungen für Organisator:innen",
"Organizers": "Organisator:innen",
"Organizer": "Organisator",
"Organizer notifications": "Benachrichtigungen für Organisatoren",
"Organizers": "Organisator",
"Other": "Andere",
"Other notification options:": "Andere Benachrichtigungs-Optionen:",
"Other software may also support this.": "Andere Software unterstützt dies möglicherweise auch.",
@ -528,15 +536,15 @@
"Page limited to my group (asks for auth)": "Seite ist auf meine Gruppe beschränkt (nach Authentifizierung fragen)",
"Page not found": "Seite nicht gefunden",
"Parent folder": "Übergeordneter Ordner",
"Participant": "Teilnehmer:in",
"Participant": "Teilnehmer",
"Participant already was rejected.": "Teilnehmer:in wurde bereits abgelehnt.",
"Participant has already been approved as participant.": "Teilnehmer:in wurde bereits bestätigt.",
"Participants": "Teilnehmer:innen",
"Participants": "Teilnehmer",
"Participate": "Teilnehmen",
"Participate using your email address": "Nehme mit deiner E-Mail-Adresse teil",
"Participate using your email address": "Nehmen Sie mit Ihrer E-Mail Adresse teil",
"Participation approval": "Teilnahmebestätigung",
"Participation confirmation": "Teilnahmebestätigung",
"Participation notifications": "Benachrichtigungen für Teilnehmer:innen",
"Participation notifications": "Benachrichtigungen für Teilnehmer",
"Participation requested!": "Teilnahme angefragt!",
"Participations": "Teilnahmen",
"Password": "Passwort",
@ -546,28 +554,29 @@
"Past events": "Vergangene Veranstaltungen",
"Pending": "Ausstehend",
"Pick": "Wähle",
"Pick a group": "Wähle eine Gruppe",
"Pick a group": "Wählen Sie eine Gruppe",
"Pick a profile or a group": "Wähle ein Profil der eine Gruppe",
"Pick an identity": "Wähle eine Identität",
"Pick an identity": "Wählen Sie eine Identität",
"Pick an instance": "Wähle eine Instanz",
"Please check your spam folder if you didn't receive the email.": "Bitte schaue auch in deinem Spam-Ordner nach, wenn Du die E-Mail nicht erhalten hast.",
"Please contact this instance's Mobilizon admin if you think this is a mistake.": "Bitte kontaktiere den Administrator dieser Mobilizon-Instanz, wenn Du denkst, dass dies ein Fehler ist.",
"Please check your spam folder if you didn't receive the email.": "Bitte sehen Sie auch in Ihrem Spam-Ordner nach, wenn Sie keine E-Mail erhalten haben.",
"Please contact this instance's Mobilizon admin if you think this is a mistake.": "Bitte kontaktieren Sie den Administrator dieser Mobilizon-Instanz, wenn Sie denken, dass dies ein Fehler ist.",
"Please do not use it in any real way.": "Bitte nicht im praktischen Einsatz verwenden.",
"Please enter your password to confirm this action.": "Bitte gebe zur Bestätigung des Vorgangs dein Passwort ein.",
"Please make sure the address is correct and that the page hasn't been moved.": "Bitte stelle sicher, dass die Adresse korrekt ist und die Seite nicht verschoben wurde.",
"Please enter your password to confirm this action.": "Bitte geben Sie zur Bestätigung des Vorgangs Ihr Passwort ein.",
"Please make sure the address is correct and that the page hasn't been moved.": "Bitte stellen Sie sicher, dass die Adresse korrekt ist und die Seite nicht verschoben wurde.",
"Please read the full rules": "Bitte ließ die kompletten Regeln",
"Please read the instance's {fullRules}": "Bitte lese die {fullRules} der Instanz",
"Please read the {fullRules} published by {instance}'s administrators.": "Bitte lesen Sie die {fullRules} veröffentlicht von {instance}'s Administratoren.",
"Please refresh the page and retry.": "Bitte lade die Seite neu und versuche es erneut.",
"Please type at least 5 characters": "Bitte tippe wenigstens 5 Zeichen",
"Post": "Beitrag",
"Post a comment": "Schreibe einen Kommentar",
"Post a comment": "Kommentar schreiben",
"Post a public message": "Schreibe eine öffentliche Nachricht",
"Post a reply": "Schreibe eine Antwort",
"Post a reply": "Antwort schreiben",
"Postal Code": "Postleitzahl",
"Posts": "Beiträge",
"Powered by {mobilizon}. © 2018 - {date} The Mobilizon Contributors - Made with the financial support of {contributors}.": "Betrieben mit {mobilizon}. © 2018 - {date} Mobilizon-Mitwirkende - Mit finanzieller Unterstützung von {contributors}.",
"Preferences": "Einstellungen",
"Previous": "Vorherig",
"Previous": "Vorher",
"Previous page": "Vorherige Seite",
"Privacy Policy": "Datenschutzerklärung",
"Privacy policy": "Datenschutzerklärung",
@ -586,7 +595,7 @@
"Publication date": "Erstellungsdatum",
"Publish": "Veröffentlichen",
"Published events": "Veröffentlichte Veranstaltungen",
"Published events with <b>{comments}</b> comments and <b>{participations}</b> confirmed participations": "Veröffentlichend Veranstaltungen mit <b>{comments}</b> Kommentare und <b>{participations}</b> bestätigt Teilnahmen",
"Published events with <b>{comments}</b> comments and <b>{participations}</b> confirmed participations": "Veröffentlichte Veranstaltungen mit <b>{comments}</b> Kommentaren und <b>{participations}</b> bestätigten Teilnahmen",
"RSS/Atom Feed": "RSS/Atom-Feed",
"Radius": "Radius",
"Read Framasofts statement of intent on the Framablog": "Ließ Framasofts Absichtserklärung im Framablog",
@ -601,11 +610,11 @@
"Register an account on {instanceName}!": "Erstelle einen Account auf {instanceName}!",
"Register for an event by choosing one of your identities": "Registriere dich für eine Veranstaltung, indem Du eine deiner Identitäten wählst",
"Register on this instance": "Auf dieser Instanz registrieren",
"Registration is allowed, anyone can register.": "Registrierung erlaubt, jede:r kann teilnehmen.",
"Registration is allowed, anyone can register.": "Registrierung erlaubt, jeder kann teilnehmen.",
"Registration is closed.": "Registrierung geschlossen.",
"Registration is currently closed.": "Registrierungen sind aktuell geschlossen.",
"Registrations": "Registrierung",
"Registrations are restricted by allowlisting.": "Anmeldungen sind durch Zugriffsrecht beschränkt.",
"Registrations are restricted by allowlisting.": "Registrierungen werden durch die Erlaubnisliste eingeschränkt.",
"Registrations are restricted by whitelisting.": "Registrierung ist durch eine Positivliste beschränkt.",
"Reject": "Ablehnen",
"Rejected": "Abgelehnt",
@ -636,6 +645,7 @@
"Resource provided is not an URL": "Die angegebene Ressource ist keine URL",
"Resources": "Ressourcen",
"Restricted": "Eingeschränkt",
"Return to the group page": "Zur Gruppenseite zurückkehren",
"Right now": "Gerade eben",
"Role": "Rolle",
"Rules": "Regeln",
@ -649,15 +659,15 @@
"Searching…": "Suche…",
"Search…": "Suchen…",
"Select a language": "Wähle eine Sprache",
"Select a timezone": "Wähle eine Zeitzone",
"Select languages": "Wähle eine Sprache",
"Select a timezone": "Zeitzone wählen",
"Select languages": "Sprache wählen",
"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",
"Send the confirmation email again": "Bestätigungsmail erneut senden",
"Send the report": "Meldung senden",
"Set an URL to a page with your own privacy policy.": "Setze eine URL zu einer Seite mit deiner eigenen Datenschutzerklärung.",
"Set an URL to a page with your own terms.": "Gib einen Link zu einer Seite mit deinen eigenen Nutzungsbedingungen an.",
"Set an URL to a page with your own terms.": "Geben Sie einen Link zu einer Seite mit Ihren eigenen Nutzungsbedingungen an.",
"Settings": "Einstellungen",
"Share this event": "Diese Veranstaltung teilen",
"Short bio": "Kurze Biografie",
@ -667,10 +677,10 @@
"Show the time when the event ends": "Zeige mir die Zeit, zu der die Veranstaltung endet",
"Sign in with": "Anmelden mit",
"Sign up": "Registrieren",
"Since you are a new member, private content can take a few minutes to appear.": "Da du ein neues Mitglied bist kann es ein paar Minuten dauern bis private Inhalte sichtbar sind.",
"Since you are a new member, private content can take a few minutes to appear.": "Da Sie ein neues Mitglied sind, kann es ein paar Minuten dauern bis private Inhalte sichtbar sind.",
"So that, right from its conception, Mobilizon would {fit_needs_uses_people} who are going to use it.": "Sodass Mobilizon, direkt von Beginn an {fit_needs_uses_people}, die es nutzen werden.",
"Software to the people": "Software für die Menschen",
"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:": "Einige der im Text genannten Begriffe beschreiben Konzepte, die nicht ganz einfach zu erklären sind. Wir haben ein Liste mit Begriffsdefinitionen zusammengestellt, damit du jederzeit nachsehen kannst, was wir damit meinen:",
"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:": "Einige der im Text genannten Begriffe beschreiben Konzepte, die nicht ganz einfach zu erklären sind. Wir haben ein Liste mit Begriffsdefinitionen zusammengestellt, damit Sie jederzeit nachsehen können, was wir damit meinen:",
"Starts on…": "Startet am…",
"Status": "Status",
"Street": "Straße",
@ -684,9 +694,9 @@
"Terms": "Nutzungsbedingungen",
"Terms of service": "Nutzungsbedingungen",
"Text": "Text",
"The account's email address was changed. Check your emails to verify it.": "Die E-Mail-Adresse des Accounts wurde geändert. Schau in deinen Mails nach einer Bestätigung.",
"The actual number of participants may differ, as this event is hosted on another instance.": "Die tatsächliche Zahl der Teilnehmer:innen kann variieren, da diese Veranstaltung auf einer anderen Instanz ausgerichtet wird.",
"The content came from another server. Transfer an anonymous copy of the report?": "Der Inhalt kam von einem anderen Server. Möchtest Du eine anonyme Kopie der Meldung übertragen?",
"The account's email address was changed. Check your emails to verify it.": "Die E-Mail-Adresse des Accounts wurde geändert. Bitte prüfen Sie Ihre E-Mails für eine Bestätigung.",
"The actual number of participants may differ, as this event is hosted on another instance.": "Die tatsächliche Zahl der Teilnehmer kann variieren, da diese Veranstaltung auf einer anderen Instanz ausgerichtet wird.",
"The content came from another server. Transfer an anonymous copy of the report?": "Der Inhalt kam von einem anderen Server. Möchten Sie eine anonyme Kopie der Meldung übertragen?",
"The current identity doesn't have any permission on this event. You should probably change it.": "Die aktuelle Identität hat keine Berechtigungen für diese Veranstaltung. Du solltest sie wahrscheinlich wechseln.",
"The current password is invalid": "Das Passwort ist ungültig",
"The draft event has been updated": "Der Entwurf wurde aktualisiert",
@ -694,48 +704,50 @@
"The event has been published": "Die Veranstaltung wurde veröffentlicht",
"The event has been updated": "Die Veranstaltung wurde aktualisiert",
"The event has been updated and published": "Die Veranstaltung wurde aktualisiert und veröffentlicht",
"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?": "Der/die Veranstalter:in hat sich dafür entschieden, Teilnahmeanfragen manuell zu überprüfen. Möchtest Du eine kurze Nachricht hinterlassen, in der du erklärst, warum du an der Veranstaltung teilnehmen möchtest?",
"The event organizer didn't add any description.": "Die Organisator:in hat keine Beschreibung hinzugefügt.",
"The event organizer manually approves participations. Since you've chosen to participate without an account, please explain why you want to participate to this event.": "Die Organisator:in möchte Teilnahmen manuell bestätigen. Wenn Du ohne Konto teilnehmen möchtest, erkläre bitte warum Du an der Veranstaltung interessiert bist.",
"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?": "Der Veranstalter hat sich dafür entschieden, Teilnahmeanfragen manuell zu überprüfen. Möchten Sie eine kurze Nachricht hinterlassen, in der Sie erklären, warum Sie an der Veranstaltung teilnehmen möchten?",
"The event organizer didn't add any description.": "Der Organisator hat keine Beschreibung hinzugefügt.",
"The event organizer manually approves participations. Since you've chosen to participate without an account, please explain why you want to participate to this event.": "Der Organisator möchte Teilnahmen manuell bestätigen. Wenn Sie ohne Konto teilnehmen möchten, erklären Sie bitte warum Sie an der Veranstaltung interessiert sind.",
"The event title will be ellipsed.": "Der Titel der Veranstaltung wird verkürzt dargestellt.",
"The event will show as attributed to this group.": "Das Ereignis wird als dieser Gruppe zugehörig angezeigt.",
"The event will show as attributed to your personal profile.": "Das Ereignis wird als Ihrem persönlichen Profil zugewiesen angezeigt.",
"The event will show the group as organizer.": "Bei diese Veranstaltung wird die Gruppe als Organisationsteam angezeigt.",
"The events you created are not shown here.": "Die Veranstaltung, die Sie erstellt haben ist hier nicht gelistet.",
"The group will be publicly listed in search results and may be suggested in the explore section. Only public informations will be shown on it's page.": "Diese Gruppe wird öffentlich in Suchergebnissen sichtbar sein und könnte im Bereich „Entdecken“ auftauchen. Nur öffentliche Informationen werden auf der Gruppenseite angezeigt.",
"The instance administrator is the person or entity that runs this Mobilizon instance.": "Die Administrator:in der Instanz ist die Person oder Organisation, die diese Mobilizon-Instanz betreibt.",
"The instance administrator is the person or entity that runs this Mobilizon instance.": "Der Administrator der Instanz ist die Person oder Organisation, die diese Mobilizon-Instanz betreibt.",
"The member was removed from the group {group}": "Das Mitglied wurde aus der Gruppe {group} entfernt",
"The new email doesn't seem to be valid": "Die neue E-Mail-Adresse scheint ungültig zu sein",
"The new email must be different": "Die neue E-Mail-Adresse muss unterschiedlich sein",
"The new password must be different": "Das neue Passwort muss unterschiedlich sein",
"The only way for your group to get new members is if an admininistrator invites them.": "Die einzige Möglichkeit für Ihre Gruppe, neue Mitglieder zu bekommen, ist, wenn ein Administrator sie einlädt.",
"The only way for your group to get new members is if an admininistrator invites them.": "Die einzige Möglichkeit für Ihre Gruppe, neue Mitglieder zu bekommen, ist, wenn ein Administrator Sie einlädt.",
"The organiser has chosen to close comments.": "Der Veranstalter hat beschlossen, die Kommentare zu schließen.",
"The page you're looking for doesn't exist.": "Die Seite, nach der du suchst, existiert nicht.",
"The page you're looking for doesn't exist.": "Die Seite, nach der Sie suchen existiert nicht.",
"The password provided is invalid": "Das angegebene Passwort ist ungültig",
"The password was successfully changed": "Das Passwort wurde erfolgreich geändert",
"The report will be sent to the moderators of your instance. You can explain why you report this content below.": "Die Meldung wird an die Moderator:innen deiner Instanz gesendet. Du kannst unten erläutern, warum Du diesen Inhalt meldest.",
"The report will be sent to the moderators of your instance. You can explain why you report this content below.": "Die Meldung wird an die Moderatoren Ihrer Instanz gesendet. Sie können unten erläutern, warum Sie diesen Inhalt melden.",
"The user account you're trying to login as has not been confirmed yet. Check your email inbox and eventually your spam folder.": "Der Account, mit dem Du dich einloggen willst, wurde noch nicht bestätigt. Schau in deinem E-Mail-Postfach und in deinem Spam-Ordner nach.",
"The {default_privacy_policy} will be used. They will be translated in the user's language.": "Die {default_privacy_policy} wird verwendet. Sie wird in die Sprache der Nutzer:in übersetzt.",
"The {default_terms} will be used. They will be translated in the user's language.": "Die {default_terms} werden verwendet. Sie werden in die Sprache der Nutzer:in übersetzt.",
"There are {participants} participants.": "Es gibt {participants} Teilnehmer:innen.",
"There will be no way to recover your data.": "Es gibt keinen Weg deine Daten wiederherszustellen.",
"These events may interest you": "Diese Veranstaltungen könnten dich interessieren",
"This Mobilizon instance and this event organizer allows anonymous participations, but requires validation through email confirmation.": "Diese Mobilizon-Instanz und die Organisator:in akzeptieren anonyme Teilnahmen, aber eine Bestätigung per E-Mail ist erforderlich.",
"The {default_privacy_policy} will be used. They will be translated in the user's language.": "Die {default_privacy_policy} wird verwendet. Sie wird in die Sprache des Nutzers übersetzt.",
"The {default_terms} will be used. They will be translated in the user's language.": "Die {default_terms} werden verwendet. Sie werden in die Sprache der Nuttzer übersetzt.",
"There are {participants} participants.": "Es gibt {participants} Teilnehmer.",
"There will be no way to recover your data.": "Es gibt keinen Weg Ihre Daten wiederherszustellen.",
"There's no discussions yet": "Es gibt noch keine Diskussion",
"These events may interest you": "Diese Veranstaltungen könnten Sie interessieren",
"This Mobilizon instance and this event organizer allows anonymous participations, but requires validation through email confirmation.": "Diese Mobilizon-Instanz und der Organisator akzeptieren anonyme Teilnahmen, aber eine Bestätigung per E-Mail ist erforderlich.",
"This URL is not supported": "Diese URL wird nicht unterstützt",
"This email is already registered as participant for this event": "Diese E-Mail-Adresse ist bereits als Teilnehmer:in für die Veranstaltung registriert",
"This email is already used.": "Diese E-Mail-Adresse wird bereits verwendet.",
"This event has been cancelled.": "Diese Veranstaltung wurde abgesagt.",
"This event is accessible only through it's link. Be careful where you post this link.": "Diese Veranstaltung ist nur über den Link einsehbar. Pass auf, wo Du den Link veröffentlichst.",
"This event is accessible only through it's link. Be careful where you post this link.": "Diese Veranstaltung ist nur über den Link einsehbar. Seien Sie vorsichtig, wo Sie diesen Link veröffentlichen.",
"This group doesn't have a description yet.": "Diese Gruppe hat noch keine Beschreibung.",
"This group is invite-only": "Diese Gruppe ist nur für Eingeladene",
"This identifier is unique to your profile. It allows others to find you.": "Diese Kennung ist eindeutig für Ihr Profil. Sie ermöglicht es anderen, Sie zu finden.",
"This identity is not a member of any group.": "Diese Identität ist nicht Mitglied in einer Gruppe.",
"This information is saved only on your computer. Click for details": "Diese Information ist nur auf deinem Computer gespeichert. Klicke für mehr Details",
"This information is saved only on your computer. Click for details": "Diese Information ist nur auf Ihrem Computer gespeichert. Klicken Sie für mehr Details",
"This installation (called “instance“) can easily {interconnect}, thanks to {protocol}.": "Diese Installation (genannt \"Instanz\") kann sich dank {protocol} ganz einfach {interconnect}.",
"This instance isn't opened to registrations, but you can register on other instances.": "Diese Instanz lässt keine Registrierungen zu, aber Du kannst dich auf anderen Instanzen registrieren.",
"This instance isn't opened to registrations, but you can register on other instances.": "Diese Instanz lässt keine Registrierungen zu, aber Sie können sich auf anderen Instanzen registrieren.",
"This instance, <b>{instanceName} ({domain})</b>, hosts your profile, so remember its name.": "Diese Instanz, <b>{instanceName} ({domain})</b>, hostet Ihr Profil, merken Sie sich also ihren Namen.",
"This is a demonstration site to test Mobilizon.": "Dies ist ein Demo-Seite, um Mobilizon zu testen.",
"This is a demonstration site to test Mobilizon.": "Dies ist eine Demoseite zum kennenlernen von Mobilizon.",
"This is a demonstration site to test the beta version of Mobilizon.": "Dies ist eine Demo-Seite, um die Beta-Version von Mobilizon zu testen.",
"This is like your federated username (<code>{username}</code>) for groups. It will allow the group to be found on the federation, and is guaranteed to be unique.": "Dies ist wie Ihr föderierter Benutzername (<code>{username}</code>) für Gruppen. Damit kann die Gruppe im Verbund gefunden werden und ist garantiert eindeutig.",
"This is like your federated username (<code>{username}</code>) for groups. It will allow the group to be found on the federation, and is guaranteed to be unique.": "Dies ist wie Ihr federierter Benutzername (<code>{username}</code>) für Gruppen. Damit kann die Gruppe im Verbund gefunden werden und ist garantiert eindeutig.",
"This month": "Diesen Monat",
"This setting will be used to display the website and send you emails in the correct language.": "Diese Einstellung wird verwendet, um die Website anzuzeigen und Ihnen E-Mails in der richtigen Sprache zu senden.",
"This user has been disabled": "Dieser Account wurde deaktiviert",
@ -747,10 +759,10 @@
"Timezone detected as {timezone}.": "Zeitzone erkannt als {timezone}.",
"Title": "Titel",
"To achieve your registration, please create a first identity profile.": "Erstelle bitte deine erste Identität, um die Registrierung abzuschließen.",
"To activate more notifications, head over to the notification settings.": "Um mehr Benachrichtigungen zu aktivieren, schau in den Benachrichtigungs-Einstellungen vorbei.",
"To activate more notifications, head over to the notification settings.": "Um mehr Benachrichtigungen zu aktivieren, sehen Sie in den Benachrichtigungs-Einstellungen vorbei.",
"To change the world, change the software": "Um die Welt zu ändern, muss man die Software ändern",
"To confirm, type your event title \"{eventTitle}\"": "Gib zur Bestätigung deinen Veranstaltungstitel „{eventTitle}“ ein",
"To confirm, type your identity username \"{preferredUsername}\"": "Gib zur Bestätigung den Nutzernamen deiner Identität „{preferredUsername}“ ein",
"To confirm, type your event title \"{eventTitle}\"": "Geben Sie zur Bestätigung Ihren Veranstaltungstitel „{eventTitle}“ ein",
"To confirm, type your identity username \"{preferredUsername}\"": "Geben Sie zur Bestätigung den Nutzernamen Ihrer Identität „{preferredUsername}“ ein",
"To create and manage multiples identities from a same account": "So erstellen und verwalten Sie mehrere Identitäten über ein und dasselbe Konto",
"To create and manage your events": "So erstellen und verwalten Sie Ihre Ereignisse",
"To create or join an group and start organizing with other people": "So erstellen Sie eine Gruppe oder treten ihr bei und beginnen, sich mit anderen Personen zu organisieren",
@ -759,13 +771,14 @@
"Tomorrow": "Morgen",
"Transfer to {outsideDomain}": "Zu {outsideDomain} übertragen",
"Type": "Typ",
"Type or select a date…": "Datum wählen",
"URL": "URL",
"URL copied to clipboard": "URL in die Zwischenablage kopiert",
"Unable to detect timezone.": "Zeitzone kann nicht erkannt werden.",
"Unable to load event for participation. The error details are provided below:": "Event für die Teilnahme kann nicht geladen werden. Die Fehlerdetails finden Sie unten:",
"Unable to save your participation in this browser.": "Ihre Teilnahme kann in diesem Browser nicht gespeichert werden.",
"Unfortunately, this instance isn't opened to registrations": "Leider lässt diese Instanz keine Registrierungen zu",
"Unfortunately, your participation request was rejected by the organizers.": "Leider wurde deine Teilnahmeanfrage von den Organisator:innen abgelehnt.",
"Unfortunately, your participation request was rejected by the organizers.": "Leider wurde Ihre Teilnahmeanfrage vom Organisator abgelehnt.",
"Unknown": "Unbekannt",
"Unknown actor": "Unbekannter Akteur",
"Unknown error.": "Unbekannter Fehler.",
@ -775,14 +788,14 @@
"Upcoming": "Demnächst",
"Upcoming events": "Bevorstehende Veranstaltungen",
"Update": "Update",
"Update event {name}": "Event {name} aktualisieren",
"Update event {name}": "Veranstaltung {name} aktualisieren",
"Update group": "Gruppe aktualisieren",
"Update my event": "Meine Veranstaltung aktualisieren",
"Update my event": "Veranstaltung aktualisieren",
"Update post": "Beitrag aktualisieren",
"Updated": "Aktualisiert",
"Uploaded media size": "Größe der hochgeladenen Medien",
"Use my location": "Nutzte meinen Standort",
"User": "Nutzer:in",
"User": "Nutzer",
"Username": "Nutzername",
"Users": "Nutzer",
"View a reply": "|Zeige eine Antwort|Zeige {totalReplies} Antworten",
@ -803,13 +816,13 @@
"Warning": "Warnung",
"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.": "Wir haben professionelle Designer:innen gebeten, uns bei der Entwicklung der Vision von Mobilizon zu helfen. Wir haben uns Zeit genommen, die {digital_habits} zu untersuchen und zu verstehen, welche Funktionalitäten wir benötigen, um zusammenzukommen, zu organisieren und zu mobilisieren.",
"We just sent an email to {email}": "Wir haben gerade eine E-Mail an {email} gesendet",
"We use your timezone to make sure you get notifications for an event at the correct time.": "Wir nutzen deine Zeitzone, um sicherzustellen, dass du Benachrichtigungen für eine Veranstaltung zur richtigen Zeit erhältst.",
"We use your timezone to make sure you get notifications for an event at the correct time.": "Wir nutzen Ihre Zeitzone, um sicherzustellen, dass Sie Benachrichtigungen für eine Veranstaltung zur richtigen Zeit erhalten.",
"We want to develop a <b>digital common</b>, that everyone can make their own, which respects <b>privacy and activism by design</b>.": "Wir wollen ein <b>digitales Gemeingut</b> schaffen, das jeder selbst mitgestalten kann, das <b>Privatsphäre und Aktivismus</b> respektiert.",
"We will redirect you to your instance in order to interact with this event": "Du wirst auf deine Instanz weitergeleitet, um mit dieser Veranstaltung zu interagieren",
"We will redirect you to your instance in order to interact with this event": "Wir werden Sie auf Ihre Instanz weiterleiten, damit Sie die Veranstaltung bearbeiten können",
"We will redirect you to your instance in order to interact with this group": "Wir leiten Sie zu Ihrer Instanz weiter, um mit dieser Gruppe zu interagieren",
"We wont change the world from Facebook. The tool we dream of, surveillance capitalism corporations wont develop it, as they couldnt profit from it. This is an opportunity to build something better, by taking another approach.": "Wir werden nicht aus Facebook heraus die Welt verändern können. Firmen des Überwachungs-Kaptialismus haben keinerlei Interesse an einem Werkzeug wie dem, das wir uns erträumen, da sie keinen Profit daraus schlagen können. Dies ist eine Möglichkeit etwas besseres zu erschaffen - indem wir einen anderen Ansatz verfolgen.",
"We'll send you an email one hour before the event begins, to be sure you won't forget about it.": "Wir senden dir eine Stunde vor Beginn der Veranstaltung eine E-Mail, um sicherzugehen, dass du sie nicht vergisst.",
"We'll use your timezone settings to send a recap of the morning of the event.": "Wir nutzen deine Zeitzonen-Einstellung, um dir am Morgen der Veranstaltung eine Erinnerung zu senden.",
"We'll send you an email one hour before the event begins, to be sure you won't forget about it.": "Wir senden Ihnen eine Stunde vor Beginn der Veranstaltung eine E-Mail, um sicherzugehen, dass Sie diese nicht vergessen.",
"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",
"Welcome back {username}!": "Willkommen zurück {username}!",
@ -817,78 +830,81 @@
"Welcome on your administration panel": "Willkommen in deiner Administrationsansicht",
"Welcome to Mobilizon, {username}!": "Willkommen zu Mobilizon, {username}!",
"When a moderator from the group creates an event and attributes it to the group, it will show up here.": "Wenn ein Moderator der Gruppe ein Ereignis erstellt und es der Gruppe zuordnet, wird es hier angezeigt.",
"Who can view this event and participate": "Wer kann diese Veranstaltung sehen und teilnehmen",
"Who can view this event and participate": "Wer kann diese Veranstaltung sehen und daran teilnehmen kann",
"Who can view this post": "Wer kann diesen Beitrag sehen",
"Who published {number} events": "Die {number} Veranstaltungen angelegt haben",
"Why create an account?": "Warum einen Account erstellen?",
"Why create an account?": "Warum ein Konto erstellen?",
"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.": "Ermöglicht die Anzeige und Verwaltung Ihres Teilnahmestatus auf der Veranstaltungsseite, wenn Sie dieses Gerät verwenden. Deaktivieren Sie diese Option, wenn Sie ein öffentliches Gerät verwenden.",
"World map": "Weltkarte",
"Write something…": "Schreibe etwas…",
"Write something…": "Schreiben Sie etwas…",
"You and one other person are going to this event": "Du gehst alleine zu dieser Veranstaltung | Du und eine weitere Person gehen zu dieser Veranstaltung | Du und {approved} weitere Personen gehen zu dieser Veranstaltung.",
"You are already a participant of this event.": "Du nimmst bereits an dieser Veranstaltung teil.",
"You are already logged-in.": "Du bist bereits eingeloggt.",
"You are not an administrator for this group.": "Du bist kein Administrator dieser Gruppe.",
"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 participating in this event anonymously": "Du nimmst anonym an dieser Veranstaltung teil",
"You are participating in this event anonymously but didn't confirm participation": "Du nimmst an dieser Veranstaltung anonym teil, hast aber deine Teilnahme noch nicht bestätigt",
"You can add tags by hitting the Enter key or by adding a comma": "Du kannst Tags hinzufügen, indem du Enter drückst oder ein Komma hinzufügst",
"You can pick your timezone into your preferences.": "Du kannst deine Zeitzone in den Einstellungen festlegen.",
"You can try another search term or drag and drop the marker on the map": "Du kannst einen anderen Suchbegriff verwenden oder die Markierung auf der Karte verschieben",
"You can't change your password because you are registered through {provider}.": "Du kannst dein Passwort nicht ändern, weil du über {provider} angemeldet bist.",
"You are not part of any group.": "Sie sind kein Teil einer Gruppe.",
"You are participating in this event anonymously": "Sie nehmen anonym an dieser Veranstaltung teil",
"You are participating in this event anonymously but didn't confirm participation": "Sie nehmen an dieser Veranstaltung anonym teil, haben aber Ihre Teilnahme noch nicht bestätigt",
"You can add tags by hitting the Enter key or by adding a comma": "Sie können Tags hinzufügen, indem Sie Enter drücken oder ein Komma hinzufügen",
"You can pick your timezone into your preferences.": "Sie können Ihre Zeitzone in den Einstellungen festlegen.",
"You can try another search term or drag and drop the marker on the map": "Sie können einen anderen Suchbegriff verwenden oder die Markierung auf der Karte verschieben",
"You can't change your password because you are registered through {provider}.": "Sie können Ihr Passwort nicht ändern, weil Sie über {provider} angemeldet sind.",
"You can't remove your last identity.": "Du kannst deine letzte Identität nicht löschen.",
"You can't reset your password because you use a 3rd-party auth provider to login.": "Du kannst dein Passwort nicht zurücksetzen, weil du über einen Drittanbieter eingeloggt bist.",
"You didn't create or join any event yet": "Sie haben noch keine Veranstaltung erstellt oder sind einer Veranstaltung beigetreten",
"You don't follow any instances yet.": "Du folgst noch keinen Instanzen.",
"You have been disconnected": "Deine Verbindung wurde getrennt",
"You have been invited by {invitedBy} to the following group:": "Du wurdest von {invitedBy} zu dieser Gruppe eingeladen:",
"You have been removed from this group's members.": "Du wurdest von diesen Gruppenmitgliedern entfernt.",
"You have cancelled your participation": "Du hast deine Teilnahme abgesagt",
"You have one event in {days} days.": "Du hast keine Veranstaltung in {days} Tagen | Du hast eine Veranstaltung in {days} Tagen. | Du hast {count} Veranstaltungen in {days} Tagen",
"You have one event today.": "Du hast heute keine Veranstaltungen | Du hast heute eine Veranstaltung. | Du hast heute {count} Veranstaltungen",
"You have one event tomorrow.": "Du hast morgen keine Veranstaltungen | Du hast morgen eine Veranstaltung. | Du hast morgen {count} Veranstaltungen",
"You didn't create or join any event yet.": "Sie haben keine Veranstaltung erstellt oder sind dieser beigetreten.",
"You don't follow any instances yet.": "Sie folgen noch keinen Instanzen.",
"You have been disconnected": "Ihre Verbindung wurde getrennt",
"You have been invited by {invitedBy} to the following group:": "Sie wurden von {invitedBy} zu dieser Gruppe eingeladen:",
"You have been removed from this group's members.": "Sie wurden von diesen Gruppenmitgliedern entfernt.",
"You have cancelled your participation": "Sie haben Ihre Teilnahme abgesagt",
"You have one event in {days} days.": "Sie haben keine Veranstaltung in {days} Tagen | Sie haben eine Veranstaltung in {days} Tagen | Sie haben {count} Veranstaltungen in {days} Tagen",
"You have one event today.": "Sie haben heute keine Veranstaltungen | Sie haben heute eine Veranstaltung. | Sie haben heute {count} Veranstaltungen",
"You have one event tomorrow.": "Sie haben morgen keine Veranstaltungen | Sie haben morgen eine Veranstaltung. | Sie haben morgen {count} Veranstaltungen",
"You may also ask to {resend_confirmation_email}.": "Du kannst auch die {resend_confirmation_email}.",
"You may clear all participation information for this device with the buttons below.": "Sie können alle Teilnahmeinformationen für dieses Gerät mit den Schaltflächen unten löschen.",
"You need to create the group before you create an event.": "Du musst zunächst eine Gruppe anlegen, bevor Du eine Veranstaltung anlegen kannst.",
"You need to login.": "Du musst dich einloggen.",
"You may now close this window, or {return_to_event}.": "Sie können das Fenster jetzt schließe oder {return_to_event}.",
"You need to create the group before you create an event.": "Sie müssen zunächst eine Gruppe anlegen, bevor Sie eine Veranstaltung anlegen können.",
"You need to login.": "Sie müssen sich einloggen.",
"You will be able to add an avatar and set other options in your account settings.": "In Ihren Kontoeinstellungen können Sie einen Avatar hinzufügen und weitere Optionen festlegen.",
"You will be redirected to the original instance": "Du wirst auf die ursprüngliche Instanz weitergeleitet",
"You will be redirected to the original instance": "Sie werden auf die ursprüngliche Instanz weitergeleitet",
"You will find here all the events you have created or of which you are a participant.": "Hier finden Sie alle Ereignisse, die Sie erstellt haben oder an denen Sie beteiligt sind.",
"You wish to participate to the following event": "Du möchtest an der folgenden Veranstaltung teilnehmen",
"You'll get a weekly recap every Monday for upcoming events, if you have any.": "Du erhältst jeden Montag eine Benachrichtigung über deine anstehenden Veranstaltungen.",
"You wish to participate to the following event": "Sie möchten an der folgenden Veranstaltung teilnehmen",
"You'll get a weekly recap every Monday for upcoming events, if you have any.": "Sie erhalten jeden Montag eine Benachrichtigung über Ihre anstehenden Veranstaltungen.",
"You'll need to transmit the group URL so people may access the group's profile.": "Du musst die Adresse (URL) der Gruppe weitergeben, um Leuten Zugriff auf das Gruppenprofil zu geben.",
"You'll need to transmit the group URL so people may access the group's profile. The group won't be findable in Mobilizon's search or regular search engines.": "Sie müssen die Gruppen-URL übertragen, damit andere Personen auf das Profil der Gruppe zugreifen können. Die Gruppe wird nicht in der Mobilizonsuche oder in normalen Suchmaschinen gefunden.",
"You'll receive a confirmation email.": "Du erhältst eine Bestätigungsmail.",
"Your account has been successfully deleted": "Dein Konto wurde erfolgreich gelöscht",
"Your account has been validated": "Dein Account wurde validiert",
"Your account is being validated": "Dein Account wird validiert",
"Your account is nearly ready, {username}": "Dein Account ist fast bereit, {username}",
"Your current email is {email}. You use it to log in.": "Deine aktuelle E-Mail-Adresse ist {email}. Nutze sie zum Einloggen.",
"Your email": "Deine E-Mail",
"Your email address was automatically set based on your {provider} account.": "Deine E-Mail-Adresse wurde automatisch basierend auf deinem {provider}-Account gesetzt.",
"You'll receive a confirmation email.": "Sie erhalten eine Bestätigungsmail.",
"Your account has been successfully deleted": "Ihr Konto wurde erfolgreich gelöscht",
"Your account has been validated": "Ihr Account wurde validiert",
"Your account is being validated": "Ihr Account wird validiert",
"Your account is nearly ready, {username}": "Ihr Account ist fast bereit, {username}",
"Your current email is {email}. You use it to log in.": "Ihre aktuelle E-Mail-Adresse ist {email}. Nutzen Sie sie zum Einloggen.",
"Your email": "Ihre E-Mail",
"Your email address was automatically set based on your {provider} account.": "Ihre E-Mail-Adresse wurde automatisch basierend auf Ihrem {provider}-Account gesetzt.",
"Your email has been changed": "Deine E-Mail-Adresse wurde geändert",
"Your email is being changed": "Deine E-Mail wird geändert",
"Your email is being changed": "Ihre E-Mail wird geändert",
"Your email is not whitelisted, you can't register.": "Deine E-Mail-Adresse ist nicht gewhitelisted, du kannst dich nicht registrieren.",
"Your email will only be used to confirm that you're a real person and send you eventual updates for this event. It will NOT be transmitted to other instances or to the event organizer.": "Deine E-Mail-Adresse wird nur verwendet, um zu bestätigen, dass du eine reale Person bist und um dir Neuigkeiten zu dieser Veranstaltung zuzusenden. Sie wird nicht an andere Instanzen oder an die Organisator:in weitergegeben.",
"Your federated identity": "Deine föderierte Identität",
"Your email will only be used to confirm that you're a real person and send you eventual updates for this event. It will NOT be transmitted to other instances or to the event organizer.": "Ihre E-Mail-Adresse wird nur verwendet, um zu bestätigen, dass Sie eine reale Person sind und um Ihnen Neuigkeiten zu dieser Veranstaltung zuzusenden. Sie wird nicht an andere Instanzen oder an die Organisatoren weitergegeben.",
"Your federated identity": "Ihre federierte Identität",
"Your local administrator resumed its policy:": "Deine lokale Administration setzt den Betrieb fort:",
"Your participation has been confirmed": "Deine Teilnahme wurde bestätigt",
"Your participation has been rejected": "Deine Teilnahme wurde abgelehnt",
"Your participation has been requested": "Deine Teilnahme wurde angefragt",
"Your participation has been confirmed": "Ihre Teilnahme wurde bestätigt",
"Your participation has been rejected": "Ihre Teilnahme wurde abgelehnt",
"Your participation has been requested": "Ihre Teilnahme wurde angefragt",
"Your participation has been validated": "Deine Teilnahme wurde bestätigt",
"Your participation is being validated": "Deine Teilnahme wird bestätigt",
"Your participation request has been validated": "Deine Teilnahme wurde bestätigt",
"Your participation request is being validated": "Deine Teilnahme wird überprüft",
"Your participation status has been changed": "Dein Teilnahmestatus hat sich geändert",
"Your participation request has been validated": "Ihre Teilnahme wurde bestätigt",
"Your participation request is being validated": "Ihre Teilnahme wird überprüft",
"Your participation status has been changed": "Ihr Teilnahmestatus hat sich geändert",
"Your participation status is saved only on this device and will be deleted one month after the event's passed.": "Ihr Teilnahmestatus wird nur auf diesem Gerät gespeichert und wird einen Monat nach Ablauf der Veranstaltung wieder gelöscht.",
"Your participation still has to be approved by the organisers.": "Ihre Teilnahme muss noch von den Organisatoren genehmigt werden.",
"Your participation will be validated once you click the confirmation link into the email, and after the organizer manually validates your participation.": "Ihre Teilnahme wird bestätigt, sobald Sie auf den Bestätigungslink in der E-Mail klicken und nachdem der Veranstalter Ihre Teilnahme manuell bestätigt hat.",
"Your participation will be validated once you click the confirmation link into the email.": "Ihre Teilnahme wird bestätigt, sobald Sie den Bestätigungslink in der E-Mail anklicken.",
"Your profile will be shown as contact.": "Dein Profil wird als Kontakt angezeigt.",
"Your timezone is currently set to {timezone}.": "Deine Zeitzone ist aktuell {timezone}.",
"Your timezone was detected as {timezone}.": "Deine Zeitzone wurde erkannt als {timezone}.",
"Your timezone is currently set to {timezone}.": "Ihre Zeitzone ist aktuell {timezone}.",
"Your timezone was detected as {timezone}.": "Ihre Zeitzone wurde erkannt als {timezone}.",
"Your timezone {timezone} isn't supported.": "Ihre Zeitzone {timezone} wird nicht unterstützt.",
"[This comment has been deleted by it's author]": "[Dieser Kommentar wurde vom Autor entfernt]",
"[This comment has been deleted]": "[Dieser Kommentar wurde gelöscht]",
"[This comment has been deleted]": "[Ihr Kommentar wurde gelöscht]",
"[deleted]": "[gelöscht]",
"a decentralised federation protocol": "eins dezentralisiertem Föderatons-Protokoll",
"a non-existent report": "Eine nicht-existierende Meldung",
@ -898,11 +914,11 @@
"change the world, one byte at a time": "die Welt verändern, Byte für Byte",
"contact uninformed": "Kein Kontakt angegeben",
"create a group": "Gruppe erstellen",
"create an event": "Erstelle eine Veranstaltung",
"create an event": "Veranstaltung erstellen",
"default Mobilizon privacy policy": "Standard-Datenschutzerklärung von Mobilizon",
"default Mobilizon terms": "Standard-Nutzungsbedingungen von Mobilizon",
"digital habits of activists": "Anforderungen von Aktivist:innen",
"e.g. 10 Rue Jangot": "z.B. Musterstraße 21",
"e.g. 10 Rue Jangot": "z .B. Musterstraße 21",
"explore the events": "Veranstaltungen entdecken",
"explore the groups": "Gruppen entdecken",
"firstDayOfWeek": "0",
@ -932,7 +948,7 @@
"{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 user {user}": "{moderator} hat die Nutzer:in {user} 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",
"{moderator} reopened {report}": "{moderator} hat {report} wieder geöffnet",
@ -940,7 +956,7 @@
"{nb} km": "{nb} km",
"{number} members": "{number} Mitglieder",
"{number} organized events": "Keine organisierten Veranstaltungen|Eine organisierte Veranstaltung|{number} organisierte Veranstaltungen",
"{number} participations": "Keine Teilnehmer:innen|Eine Teilnehmer:in|{number} Teilnehmer:innen",
"{number} participations": "Keine Teilnehmer|Ein Teilnehmer|{number} Teilnehmer",
"{number} posts": "Keine Beiträge |Ein Beitrag|{number} Beiträge",
"{profile} (by default)": "{profile} (Standard)",
"{title} ({count} todos)": "{title} ({count} To-dos)",

View File

@ -47,7 +47,6 @@
"Change my password": "Change my password",
"Change": "Change",
"Clear": "Clear",
"Click to select": "Click to select",
"Click to upload": "Click to upload",
"Close comments for all (except for admins)": "Close comments for all (except for admins)",
"Close": "Close",
@ -404,7 +403,6 @@
"as {identity}": "as {identity}",
"default Mobilizon terms": "default Mobilizon terms",
"e.g. 10 Rue Jangot": "e.g. 10 Rue Jangot",
"firstDayOfWeek": "0",
"iCal Feed": "iCal Feed",
"profile@instance": "profile@instance",
"with another identity…": "with another identity…",
@ -823,5 +821,20 @@
"Do you wish to {create_group} or {explore_groups}?": "Do you wish to {create_group} or {explore_groups}?",
"Type or select a date…": "Type or select a date…",
"Getting there": "Getting there",
"Groups are not enabled on this instance.": "Groups are not enabled on this instance."
"Groups are not enabled on this instance.": "Groups are not enabled on this instance.",
"The events you created are not shown here.": "The events you created are not shown here.",
"There's no discussions yet": "There's no discussions yet",
"Only group members can access discussions": "Only group members can access discussions",
"Return to the group page": "Return to the group page",
"It is possible that the content is not accessible on this instance, because this instance has blocked the profiles or groups behind this content.": "It is possible that the content is not accessible on this instance, because this instance has blocked the profiles or groups behind this content.",
"Atom feed for events and posts": "Atom feed for events and posts",
"ICS feed for events": "ICS feed for events",
"ICS/WebCal Feed": "ICS/WebCal Feed",
"Group Followers": "Group Followers",
"Follower": "Follower",
"Reject": "Reject",
"No follower matches the filters": "No follower matches the filters",
"@{username}'s follow request was rejected": "@{username}'s follow request was rejected",
"Followers will receive new public events and posts.": "Followers will receive new public events and posts.",
"Manually approve new followers": "Manually approve new followers"
}

View File

@ -13,6 +13,7 @@
"@{group}": "@{group}",
"@{username}": "@{username}",
"@{username} ({role})": "@{username} ({role})",
"@{username}'s follow request was rejected": "Se rechazó la solicitud de seguimiento de @{username}",
"A cookie is a small file containing information that is sent to your computer when you visit a website. When you visit the site again, the cookie allows that site to recognize your browser. Cookies may store user preferences and other information. You can configure your browser to refuse all cookies. However, this may result in some website features or services partially working. Local storage works the same way but allows you to store more data.": "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 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 le permite almacenar más datos.",
"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 federated software": "Un software federado",
@ -92,6 +93,7 @@
"Are you sure you want to delete this event? This action cannot be reverted.": "¿Seguro que quieres eliminar este evento? Esta acción no se puede revertir.",
"As the event organizer has chosen to manually validate participation requests, your participation will be really confirmed only once you receive an email stating it's being accepted.": "Como el organizador del evento ha optado por validar manualmente las solicitudes de participación, su participación se confirmará realmente solo una vez que reciba un correo electrónico que indique que está siendo aceptada.",
"Assigned to": "Asignado a",
"Atom feed for events and posts": "Flujo Atom para eventos y publicaciones",
"Avatar": "Avatar",
"Back to previous page": "Volver a la página anterior",
"Banner": "Pancarta",
@ -292,7 +294,9 @@
"Find an instance": "Buscar una instancia",
"Find another instance": "Encuentra otra instancia",
"Followed by {count} persons": "Seguido por {count} personas",
"Follower": "Seguidor",
"Followers": "Seguidores",
"Followers will receive new public events and posts.": "Los seguidores recibirán nuevos eventos públicos y publicaciones.",
"Followings": "Seguimientos",
"For instance: London": "Por ejemplo: Londres",
"For instance: London, Taekwondo, Architecture…": "Por ejemplo: Londres, Taekwondo, Arquitectura …",
@ -313,6 +317,7 @@
"Go to the event page": "Ir a la página del evento",
"Going as {name}": "Ir como {nombre}",
"Group": "Grupo",
"Group Followers": "Seguidores del grupo",
"Group List": "Lista de grupo",
"Group Members": "Miembros del grupo",
"Group address": "Dirección del grupo",
@ -342,6 +347,8 @@
"I participate": "Yo participo",
"I want to allow people to participate without an account.": "Quiero permitir que las personas participen sin una cuenta.",
"I want to approve every participation request": "Quiero aprobar cada solicitud de participación",
"ICS feed for events": "Flujo ICS para eventos",
"ICS/WebCal Feed": "Flujo ICS/WebCal",
"Identity {displayName} created": "Identidad {displayName} creada",
"Identity {displayName} deleted": "Identidad {displayName} eliminada",
"Identity {displayName} updated": "Identidad {displayName} actualizada",
@ -381,6 +388,7 @@
"Invite a new member": "Invita a un nuevo miembro",
"Invite member": "Miembro invitado",
"Invited": "Invitado",
"It is possible that the content is not accessible on this instance, because this instance has blocked the profiles or groups behind this content.": "Es posible que el contenido no sea accesible en esta instancia, porque esta instancia ha bloqueado los perfiles o grupos detrás de este contenido.",
"Italic": "Cursiva",
"Join <b>{instance}</b>, a Mobilizon instance": "Únase a <b> {instance} </b>, una instancia de Mobilizon",
"Join group": "Unirse al grupo",
@ -424,6 +432,7 @@
"Manage my notifications": "Administrar mis notificaciones",
"Manage my settings": "Administrar mi configuración",
"Manage participations": "Administrar participaciones",
"Manually approve new followers": "Aprobar manualmente nuevos seguidores",
"Manually invite new members": "Invitar nuevos miembros manualmente",
"Mark as resolved": "Marca como resuelto",
"Member": "Miembro",
@ -476,6 +485,7 @@
"No discussions yet": "Aún no hay discusiones",
"No end date": "Sin fecha de finalización",
"No events found": "No se encontraron eventos",
"No follower matches the filters": "Ningún seguidor coincide con los filtros",
"No group found": "Ningún grupo encontrado",
"No groups found": "No se encontraron grupos",
"No instance follows your instance yet.": "Ninguna instancia sigue a tu instancia todavía.",
@ -532,6 +542,7 @@
"Only accessible to members of the group": "Solo accesible para los miembros del grupo",
"Only alphanumeric characters and underscores are supported.": "Solo se admiten caracteres alfanuméricos y guiones bajos.",
"Only alphanumeric lowercased characters and underscores are supported.": "Solo se admiten caracteres alfanuméricos en minúscula y guiones bajos.",
"Only group members can access discussions": "Solo los miembros del grupo pueden acceder a las discusiones",
"Only group moderators can create, edit and delete posts.": "Solo los moderadores de grupo pueden crear, editar y eliminar publicaciones.",
"Open": "Abrir",
"Opened reports": "Informes abiertos",
@ -658,6 +669,7 @@
"Resource provided is not an URL": "El recurso proporcionado no es una URL",
"Resources": "Recursos",
"Restricted": "Restringido",
"Return to the group page": "Volver a la página del grupo",
"Right now": "Ahora mismo",
"Role": "Rol",
"Rules": "Reglas",
@ -724,6 +736,7 @@
"The event will show as attributed to this group.": "El evento se mostrará como atribuido a este grupo.",
"The event will show as attributed to your personal profile.": "El evento se mostrará como atribuido a su perfil personal.",
"The event will show the group as organizer.": "El evento mostrará al grupo como organizador.",
"The events you created are not shown here.": "Los eventos que creó no se muestran aquí.",
"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.": "El grupo se incluirá públicamente en los resultados de búsqueda y se puede sugerir en la sección de exploración. En su página solo se mostrará información pública.",
"The instance administrator is the person or entity that runs this Mobilizon instance.": "El administrador de la instancia es la persona o entidad que ejecuta esta instancia de Mobilizon.",
"The member was removed from the group {group}": "El miembro fue eliminado del grupo {grup}",
@ -742,6 +755,7 @@
"The {default_terms} will be used. They will be translated in the user's language.": "Se utilizarán los {default_terms}. Se traducirán en el idioma del usuario.",
"There are {participants} participants.": "Hay {participantes} participantes.",
"There will be no way to recover your data.": "No habrá forma de recuperar sus datos.",
"There's no discussions yet": "Aún no hay discusiones",
"These events may interest you": "Estos eventos pueden interesarte",
"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 is not supported": "Esta URL no es compatible",

View File

@ -89,6 +89,7 @@
"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",
"Atom feed for events and posts": "Tapahtumien ja julkaisujen Atom-syöte",
"Avatar": "Avatar",
"Back to previous page": "Palaa edelliselle sivulle",
"Banner": "Banneri",
@ -333,6 +334,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",
"ICS feed for events": "Tapahtumien ICS-syöte",
"ICS/WebCal Feed": "ICS/WebCal-syöte",
"Identity {displayName} created": "Identiteetti {displayName} luotu",
"Identity {displayName} deleted": "Identiteetti {displayName} poistettu",
"Identity {displayName} updated": "Identiteetti {displayName} päivitetty",
@ -371,6 +374,7 @@
"Invite a new member": "Kutsu uusi jäsen",
"Invite member": "Kutsu jäsen",
"Invited": "Kutsuttu",
"It is possible that the content is not accessible on this instance, because this instance has blocked the profiles or groups behind this content.": "Sisältö ei ole käytettävissä tämän palvelimen kautta mahdollisesti siksi, että tämä palvelin on estänyt sisällön taustalla olevat profiilit tai ryhmät.",
"Italic": "Kursivoitu",
"Join <b>{instance}</b>, a Mobilizon instance": "Liity Mobilizon-palvelimelle <b>{instance}</b>",
"Join group": "Liity ryhmään",
@ -521,6 +525,7 @@
"Only accessible to members of the group": "Pääsy vain ryhmän jäsenillä",
"Only alphanumeric characters and underscores are supported.": "Vain kirjaimet, numerot ja alaviiva ovat sallittuja.",
"Only alphanumeric lowercased characters and underscores are supported.": "Vain pieniä kirjaimia (a-z), numeroita ja alaviivaa voi käyttää.",
"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",
"Opened reports": "Avatut raportit",
@ -648,6 +653,7 @@
"Resource provided is not an URL": "Ilmoitettu resurssi ei ole URL",
"Resources": "Resurssit",
"Restricted": "Rajoitettu",
"Return to the group page": "Palaa ryhmän sivulle",
"Right now": "Juuri nyt",
"Role": "Rooli",
"Rules": "Säännöt",
@ -714,6 +720,7 @@
"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 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 events you created are not shown here.": "Luomiasi tapahtumia ei näytetä tässä.",
"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 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}",
@ -731,6 +738,7 @@
"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 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",
"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",

View File

@ -24,9 +24,11 @@
"A user-friendly, emancipatory and ethical tool for gathering, organising, and mobilising.": "Un outil convivial, émancipateur et éthique pour se rassembler, s'organiser et se mobiliser.",
"A validation email was sent to {email}": "Un email de validation a été envoyé à {email}",
"API": "API",
"Abandon editing": "Abandonner la modification",
"About": "À propos",
"About Mobilizon": "À propos de Mobilizon",
"About this event": "À propos de cet évènement",
"About anonymous participation": "À propos de la participation anonyme",
"About this event": "À propos de cet événement",
"About this instance": "À propos de cette instance",
"About {instance}": "À propos de {instance}",
"Accept": "Accepter",
@ -76,13 +78,14 @@
"Are you really sure you want to delete your whole account? You'll lose everything. Identities, settings, events created, messages and participations will be gone forever.": "Êtes-vous vraiment certain⋅e de vouloir supprimer votre compte ? Vous allez tout perdre. Identités, paramètres, événements créés, messages et participations disparaîtront pour toujours.",
"Are you sure you want to <b>completely delete</b> this group? All members - including remote ones - will be notified and removed from the group, and <b>all of the group data (events, posts, discussions, todos…) will be irretrievably destroyed</b>.": "Êtes-vous certain·e de vouloir <b>complètement supprimer</b> ce groupe ? Tous les membres - y compris ceux·elles sur d'autres instances - seront notifié·e·s et supprimé·e·s du groupe, et <b>toutes les données associées au groupe (événements, billets, discussions, todos…) seront irrémédiablement détruites</b>.",
"Are you sure you want to <b>delete</b> this comment? This action cannot be undone.": "Êtes-vous certain⋅e de vouloir <b>supprimer</b> ce commentaire ? Cette action ne peut pas être annulée.",
"Are you sure you want to <b>delete</b> 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 <b>supprimer</b> 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 <b>delete</b> 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 <b>supprimer</b> 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 <b>suspend</b> this group? All members - including remote ones - will be notified and removed from the group, and <b>all of the group data (events, posts, discussions, todos…) will be irretrievably destroyed</b>.": "Êtes-vous certain·e de vouloir <b>suspendre</b> ce groupe ? Tous les membres - y compris ceux·elles sur d'autres instances - seront notifié·e·s et supprimé·e·s du groupe, et <b>toutes les données associées au groupe (événements, billets, discussions, todos…) seront irrémédiablement détruites</b>.",
"Are you sure you want to <b>suspend</b> 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 <b>suspendre</b> 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 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 event? This action cannot be reverted.": "Êtes-vous certain⋅e de vouloir supprimer cet évènement ? Cette action ne peut être annulée.",
"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 event? This action cannot be reverted.": "Êtes-vous certain⋅e de vouloir supprimer cet événement ? Cette action ne peut être annulée.",
"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.": "L'organisateur de l'événement ayant choisi de valider manuellement les demandes de participation, votre participation ne sera réellement confirmée que lorsque vous recevrez un courriel indiquant qu'elle est acceptée.",
"Assigned to": "Assigné à",
"Avatar": "Avatar",
"Back to previous page": "Retour à la page précédente",
@ -103,6 +106,7 @@
"Cancel edition": "Annuler la modification",
"Cancel my participation request…": "Annuler ma demande de participation…",
"Cancel my participation…": "Annuler ma participation…",
"Cancelled": "Annulé",
"Cancelled: Won't happen": "Annulé : N'aura pas lieu",
"Category": "Catégorie",
"Change": "Modifier",
@ -112,6 +116,9 @@
"Change timezone": "Changer de fuseau horaire",
"Check your inbox (and your junk mail folder).": "Vérifiez votre boîte de réception (et votre dossier des indésirables).",
"Clear": "Effacer",
"Clear participation data for all events": "Effacer mes données de participation pour tous les événements",
"Clear participation data for this event": "Effacer mes données de participation pour cet événement",
"Click for more information": "Cliquez pour plus d'informations",
"Click to select": "Cliquez pour sélectionner",
"Click to upload": "Cliquez pour téléverser",
"Close": "Fermé",
@ -138,7 +145,7 @@
"Create a calc": "Créer un calc",
"Create a discussion": "Créer une discussion",
"Create a folder": "Créer un dossier",
"Create a new event": "Créer un nouvel évènement",
"Create a new event": "Créer un nouvel événement",
"Create a new group": "Créer un nouveau groupe",
"Create a new identity": "Créer une nouvelle identité",
"Create a new list": "Créer une nouvelle liste",
@ -146,8 +153,9 @@
"Create a videoconference": "Créer une visio-conférence",
"Create an account": "Créer un compte",
"Create and manage several identities from the same account": "Créer et gérer plusieurs identités sur un même compte",
"Create event": "Créer un événement",
"Create group": "Créer un groupe",
"Create my event": "Créer mon évènement",
"Create my event": "Créer mon événement",
"Create my group": "Créer mon groupe",
"Create my profile": "Créer mon profil",
"Create or join an group and start organizing with other people": "Créez ou rejoignez un groupe et commencez à vous organiser avec d'autres personnes",
@ -159,7 +167,7 @@
"Created by {name}": "Créé par {name}",
"Created by {username}": "Créé par {username}",
"Creator": "Créateur⋅ice",
"Current identity has been changed to {identityName} in order to manage this event.": "L'identité actuelle a été changée à {identityName} pour pouvoir gérer cet évènement.",
"Current identity has been changed to {identityName} in order to manage this event.": "L'identité actuelle a été changée à {identityName} pour pouvoir gérer cet événement.",
"Current page": "Page courante",
"Custom": "Personnel",
"Custom URL": "URL personnalisée",
@ -176,10 +184,10 @@
"Default Mobilizon terms": "Conditions d'utilisation par défaut de Mobilizon",
"Delete": "Supprimer",
"Delete Comment": "Supprimer le commentaire",
"Delete Event": "Supprimer l'évènement",
"Delete Event": "Supprimer l'événement",
"Delete account": "Suppression du compte",
"Delete conversation": "Supprimer la conversation",
"Delete event": "Supprimer un évènement",
"Delete event": "Supprimer un événement",
"Delete everything": "Tout supprimer",
"Delete group": "Supprimer le groupe",
"Delete my account": "Supprimer mon compte",
@ -189,7 +197,7 @@
"Delete {eventTitle}": "Supprimer {eventTitle}",
"Delete {preferredUsername}": "Supprimer {preferredUsername}",
"Deleting comment": "Suppression du commentaire en cours",
"Deleting event": "Suppression de l'évènement",
"Deleting event": "Suppression de l'événement",
"Deleting my account will delete all of my identities.": "Supprimer mon compte supprimera toutes mes identités.",
"Deleting your Mobilizon account": "Supprimer votre compte Mobilizon",
"Demote": "Rétrograder",
@ -203,6 +211,8 @@
"Displayed nickname": "Pseudonyme affiché",
"Displayed on homepage and meta tags. Describe what Mobilizon is and what makes this instance special in a single paragraph.": "Affichée sur la page d'accueil et dans les balises meta. Décrivez ce qu'est Mobilizon et ce qui rend spécifique cette instance en un seul paragraphe.",
"Do not receive any mail": "Ne pas recevoir d'e-mail",
"Do you wish to {create_event} or {explore_events}?": "Voulez-vous {create_event} ou {explore_events} ?",
"Do you wish to {create_group} or {explore_groups}?": "Voulez-vous {create_group} ou {explore_groups} ?",
"Domain": "Domaine",
"Don't show @{organizer} as event host alongside @{group}": "Ne pas afficher @{organizer} comme organisateur⋅ice de l'événement avec @{group}",
"Draft": "Brouillon",
@ -239,11 +249,11 @@
"Event": "Événement",
"Event already passed": "Événement déjà passé",
"Event cancelled": "Événement annulé",
"Event creation": "Création d'évènement",
"Event edition": "Modification d'évènement",
"Event list": "Liste d'évènements",
"Event creation": "Création d'événement",
"Event edition": "Modification d'événement",
"Event list": "Liste d'événements",
"Event not found.": "Événement non trouvé.",
"Event page settings": "Paramètres de la page de l'évènement",
"Event page settings": "Paramètres de la page de l'événement",
"Event to be confirmed": "Événement à confirmer",
"Event {eventTitle} deleted": "Événement {eventTitle} supprimé",
"Event {eventTitle} reported": "Événement {eventTitle} signalé",
@ -264,7 +274,7 @@
"Find an address": "Trouver une adresse",
"Find an instance": "Trouver une instance",
"Find another instance": "Trouver une autre instance",
"Followers": "Abonnés",
"Followers": "Abonné⋅es",
"Followings": "Abonnements",
"For instance: London": "Par exemple : Lyon",
"For instance: London, Taekwondo, Architecture…": "Par exemple : Lyon, Taekwondo, Architecture…",
@ -278,6 +288,7 @@
"General": "Général",
"General information": "Informations générales",
"Getting location": "Récupération de la position",
"Getting there": "S'y rendre",
"Glossary": "Glossaire",
"Go": "Allons-y",
"Go to the event page": "Aller à la page de l'événement",
@ -295,6 +306,7 @@
"Group {displayName} created": "Groupe {displayName} créé",
"Group {groupTitle} reported": "Groupe {groupTitle} signalé",
"Groups": "Groupes",
"Groups are not enabled on this instance.": "Les groupes ne sont pas activés sur cette instance.",
"Groups are spaces for coordination and preparation to better organize events and manage your community.": "Les groupes sont des espaces de coordination et de préparation pour mieux organiser des événements et gérer votre communauté.",
"Headline picture": "Image à la une",
"Hide replies": "Masquer les réponses",
@ -317,6 +329,7 @@
"If an account with this email exists, we just sent another confirmation email to {email}": "Si un compte avec un tel email existe, nous venons juste d'envoyer un nouvel email de confirmation à {email}",
"If the direction given by the development team does not suit you, you have the legal right to create your own version of the software, with your own governance choices.": "Si la direction donnée par léquipe de développement ne vous convient pas, vous avez légalement le droit de créer votre version du logiciel avec vos propres choix de gouvernance.",
"If this identity is the only administrator of some groups, you need to delete them before being able to delete this identity.": "Si cette identité est la seule administratrice de certains groupes, vous devez les supprimer avant de pouvoir supprimer cette identité.",
"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:": "Si l'on vous demande votre identité fédérée, elle est composée de votre nom d'utilisateur·ice et de votre instance. Par exemple, l'identité fédérée de votre premier profil est :",
"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.": "Si vous avez opté pour la validation manuelle des participantes, Mobilizon vous enverra un email pour vous informer des nouvelles participations à traiter. Vous pouvez choisir la fréquence de ces notifications ci-dessous.",
"If you want, you may send a message to the event organizer here.": "Si vous le désirez, vous pouvez laisser un message pour l'organisateur⋅ice de l'événement ci-dessous.",
"Impossible to login, your email or password seems incorrect.": "Impossible de se connecter, votre email ou bien votre mot de passe semble incorrect.",
@ -345,6 +358,7 @@
"Invite a new member": "Inviter un nouveau membre",
"Invite member": "Inviter un·e membre",
"Invited": "Invité·e",
"It is possible that the content is not accessible on this instance, because this instance has blocked the profiles or groups behind this content.": "Il est possible que le contenu ne soit pas accessible depuis cette instance, car cette instance a bloqué le profil ou le groupe derrière ce contenu.",
"Italic": "Italique",
"Join <b>{instance}</b>, a Mobilizon instance": "Rejoignez <b>{instance}</b>, une instance Mobilizon",
"Join group": "Rejoindre le groupe",
@ -353,7 +367,7 @@
"Language": "Langue",
"Last IP adress": "Dernière addresse IP",
"Last group created": "Dernier groupe créé",
"Last published event": "Dernier évènement publié",
"Last published event": "Dernier événement publié",
"Last sign-in": "Dernière connexion",
"Last week": "La semaine dernière",
"Latest posts": "Derniers billets",
@ -361,9 +375,9 @@
"Learn more about Mobilizon": "En savoir plus sur Mobilizon",
"Learn more about {instance}": "En savoir plus sur {instance}",
"Leave": "Quitter",
"Leave event": "Annuler ma participation à l'évènement",
"Leave event": "Annuler ma participation à l'événement",
"Leave group": "Quitter le groupe",
"Leaving event \"{title}\"": "Annuler ma participation à l'évènement",
"Leaving event \"{title}\"": "Annuler ma participation à l'événement",
"Legal": "Légal",
"Let's create a new common": "Créons un nouveau Common",
"Let's define a few settings": "Définissons quelques paramètres",
@ -372,6 +386,7 @@
"Limited number of places": "Nombre de places limité",
"List title": "Titre de la liste",
"Load more": "Voir plus",
"Loading comments…": "Chargement des commentaires…",
"Local": "Local·e",
"Locality": "Commune",
"Location": "Lieu",
@ -392,13 +407,15 @@
"Message": "Message",
"Mobilizon": "Mobilizon",
"Mobilizon is a federated network. You can interact with this event from a different server.": "Mobilizon est un réseau fédéré. Vous pouvez interagir avec cet événement depuis un serveur différent.",
"Mobilizon is a federated software, meaning you can interact - depending on your admin's federation settings - with content from other instances, such as joining groups or events that were created elsewhere.": "Mobilizon est un logiciel fédéré, ce qui signifie que vous pouvez interagir - en fonction des paramètres de fédération de votre administrateur·ice - avec du contenu d'autres instances, comme par exemple rejoindre des groupes ou des événements ayant été créés ailleurs.",
"Mobilizon is a free/libre software that will allow communities to create <b>their own spaces</b> to publish events in order to better emancipate themselves from tech giants.": "Mobilizon est un logiciel libre qui permettra à des communautés de <b>créer leurs propres espaces</b> de publication dévènements, afin de mieux sémanciper des géants du web.",
"Mobilizon is a tool that helps you <b>find, create and organise events</b>.": "Mobilizon est un outil qui vous permet de <b>trouver, créer et organiser des événements</b>.",
"Mobilizon is not a giant platform, but a <b>multitude of interconnected Mobilizon websites</b>.": "Mobilizon nest pas une plateforme géante, mais une <b>multitude de sites web Mobilizon interconnectés</b>.",
"Mobilizon is not developed by a secretive start-up, but by a group of friends who strive to {change_world}. So while we do work slower, we remain attentive and in touch with our users.": "Moblizon nest pas développé par une start-up inaccessible, mais par un groupe dami·e·s qui sévertuent à {change_world}. Alors, certes, on va moins vite, mais on reste à lécoute et dans léchange.",
"Mobilizon software": "logiciel Mobilizon",
"Mobilizon uses a system of profiles to compartiment your activities. You will be able to create as many profiles as you want.": "Mobilizon utilise un système de profils pour compartimenter vos activités. Vous pourrez créer autant de profils que vous voulez.",
"Mobilizon version": "Version de Mobilizon",
"Mobilizon will send you an email when the events you are attending have important changes: date and time, address, confirmation or cancellation, etc.": "Mobilizon vous enverra un email quand les événements auxquels vous participez connaissent des événements importants : date et heure, adresse, confirmation ou annulation, etc.",
"Mobilizon will send you an email when the events you are attending have important changes: date and time, address, confirmation or cancellation, etc.": "Mobilizon vous enverra un email lors de changements importants pour les événements auxquels vous participez : date et heure, adresse, confirmation ou annulation, etc.",
"Mobilizons licence": "La licence de Mobilizon",
"Moderated comments (shown after approval)": "Commentaires modérés (affichés après validation)",
"Moderation": "Modération",
@ -408,7 +425,7 @@
"Move \"{resourceName}\"": "Déplacer « {resourceName} »",
"Move resource to {folder}": "Déplacer la ressource dans {folder}",
"My account": "Mon compte",
"My events": "Mes évènements",
"My events": "Mes événements",
"My groups": "Mes groupes",
"My identities": "Mes identités",
"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.": "REMARQUE : les conditions par défaut n'ont pas été vérifiées par un·e juriste et sont donc susceptibles de ne pas offrir une protection juridique complète dans toutes les situations pour un·e administrateur·rice d'instance qui les utilise. Elles ne sont pas non plus spécifiques à tous les pays et juridictions. Si vous n'êtes pas sûr·e, veuillez consulter un·e juriste.",
@ -421,6 +438,7 @@
"New note": "Nouvelle note",
"New password": "Nouveau mot de passe",
"New profile": "Nouveau profil",
"Next": "Suivant",
"Next month": "Le mois-prochain",
"Next page": "Page suivante",
"Next week": "La semaine prochaine",
@ -430,7 +448,7 @@
"No comments yet": "Pas encore de commentaires",
"No discussions yet": "Pas encore de discussions",
"No end date": "Pas de date de fin",
"No events found": "Aucun évènement trouvé",
"No events found": "Aucun événement trouvé",
"No group found": "Aucun groupe trouvé",
"No groups found": "Aucun groupe trouvé",
"No instance follows your instance yet.": "Aucune instance ne suit votre instance pour le moment.",
@ -481,6 +499,7 @@
"Only accessible through link (private)": "Uniquement accessible par lien (privé)",
"Only accessible to members of the group": "Accessible uniquement aux membres du groupe",
"Only alphanumeric lowercased characters and underscores are supported.": "Seuls les caractères alphanumériques minuscules et les tirets bas sont acceptés.",
"Only group members can access discussions": "Seul⋅es les membres du groupes peuvent accéder aux discussions",
"Only group moderators can create, edit and delete posts.": "Seul·e·s les modérateur·rice·s du groupe peuvent créer, éditer et supprimer des billets.",
"Open": "Ouvert",
"Opened reports": "Signalements ouverts",
@ -536,12 +555,14 @@
"Posts": "Billets",
"Powered by {mobilizon}. © 2018 - {date} The Mobilizon Contributors - Made with the financial support of {contributors}.": "Propulsé par {mobilizon}. © 2018 - {date} Les contributeur·rice·s Mobilizon - Fait avec le soutien financier de {contributors}.",
"Preferences": "Préférences",
"Previous": "Précédent",
"Previous page": "Page précédente",
"Privacy Policy": "Politique de confidentialité",
"Privacy policy": "Politique de confidentialité",
"Private event": "Événement privé",
"Private feeds": "Flux privés",
"Profiles": "Profils",
"Profiles and federation": "Profils et fédération",
"Promote": "Promouvoir",
"Public": "Public",
"Public RSS/Atom Feed": "Flux RSS/Atom public",
@ -583,7 +604,7 @@
"Report": "Signalement",
"Report #{reportNumber}": "Signalement #{reportNumber}",
"Report this comment": "Signaler ce commentaire",
"Report this event": "Signaler cet évènement",
"Report this event": "Signaler cet événement",
"Report this group": "Signaler ce groupe",
"Reported": "Signalée",
"Reported by": "Signalée par",
@ -599,6 +620,7 @@
"Resource provided is not an URL": "La ressource fournie n'est pas une URL",
"Resources": "Ressources",
"Restricted": "Restreintes",
"Return to the group page": "Retourner à la page du groupe",
"Right now": "À l'instant",
"Role": "Rôle",
"Rules": "Règles",
@ -607,7 +629,7 @@
"Save": "Enregistrer",
"Save draft": "Enregistrer le brouillon",
"Search": "Rechercher",
"Search events, groups, etc.": "Rechercher des évènements, des groupes, etc.",
"Search events, groups, etc.": "Rechercher des événements, des groupes, etc.",
"Searching…": "Recherche en cours…",
"Search…": "Rechercher…",
"Select a language": "Choisissez une langue",
@ -619,12 +641,12 @@
"Set an URL to a page with your own privacy policy.": "Entrez une URL vers une page web avec votre propre politique de confidentialité.",
"Set an URL to a page with your own terms.": "Entrez une URL vers une page web avec vos propres conditions d'utilisation.",
"Settings": "Paramètres",
"Share this event": "Partager l'évènement",
"Share this event": "Partager l'événement",
"Short bio": "Courte biographie",
"Show map": "Afficher la carte",
"Show remaining number of places": "Afficher le nombre de places restantes",
"Show the time when the event begins": "Afficher l'heure de début de l'évènement",
"Show the time when the event ends": "Afficher l'heure de fin de l'évènement",
"Show the time when the event begins": "Afficher l'heure de début de l'événement",
"Show the time when the event ends": "Afficher l'heure de fin de l'événement",
"Sign in with": "Se connecter avec",
"Sign up": "S'enregistrer",
"Since you are a new member, private content can take a few minutes to appear.": "Étant donné que vous êtes un·e nouveau·elle membre, le contenu privé peut mettre quelques minutes à arriver.",
@ -639,6 +661,7 @@
"Suspend group": "Suspendre le groupe",
"Suspended": "Suspendu·e",
"Task lists": "Listes de tâches",
"Tentative": "Provisoire",
"Tentative: Will be confirmed later": "Provisoire : sera confirmé plus tard",
"Terms": "Conditions d'utilisation",
"Terms of service": "Conditions d'utilisation",
@ -648,18 +671,19 @@
"The content came from another server. Transfer an anonymous copy of the report?": "Le contenu provient d'une autre instance. Transférer une copie anonyme du signalement ?",
"The current identity doesn't have any permission on this event. You should probably change it.": "L'identité actuelle n'a pas de permissions sur cet évènement. Vous devriez probablement en changer.",
"The current password is invalid": "Le mot de passe actuel est invalide",
"The draft event has been updated": "L'évènement brouillon a été mis à jour",
"The event has been created as a draft": "L'évènement a été créé en tant que brouillon",
"The event has been published": "L'évènement a été publié",
"The event has been updated": "L'évènement a été mis à jour",
"The event has been updated and published": "L'évènement a été mis à jour et publié",
"The draft event has been updated": "L'événement brouillon a été mis à jour",
"The event has been created as a draft": "L'événement a été créé en tant que brouillon",
"The event has been published": "L'événement a été publié",
"The event has been updated": "L'événement a été mis à jour",
"The event has been updated and published": "L'événement a été mis à jour et publié",
"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?": "L'organisateur⋅ice de l'événement a choisi de valider manuellement les demandes de participation. Voulez-vous ajouter un petit message pour expliquer pourquoi vous souhaitez participer à cet événement ?",
"The event organizer didn't add any description.": "L'organisateur⋅ice de l'évènement n'a pas ajouté de description.",
"The event organizer didn't add any description.": "L'organisateur⋅ice de l'événement n'a pas ajouté de 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.": "L'organisateur⋅ice de l'événement valide les participations manuellement. Comme vous avez choisi de participer sans compte, merci d'expliquer pourquoi vous voulez participer à cet événement.",
"The event title will be ellipsed.": "Le titre de l'évènement sera ellipsé.",
"The event title will be ellipsed.": "Le titre de l'événement sera ellipsé.",
"The event will show as attributed to this group.": "L'événement sera affiché comme étant attribué à ce groupe.",
"The event will show as attributed to your personal profile.": "L'événement sera affiché comme étant attribué à votre profil.",
"The event will show the group as organizer.": "L'événement affichera le groupe en tant qu'organisateur⋅ice.",
"The events you created are not shown here.": "Les événements que vous avez créé ne s'affichent pas ici.",
"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.": "Le groupe sera listé publiquement dans les résultats de recherche et pourra être suggéré sur la page « Explorer ». Seules les informations publiques seront affichées sur sa page.",
"The instance administrator is the person or entity that runs this Mobilizon instance.": "L'administrateur·rice de l'instance est la personne ou entité qui gère cette instance Mobilizon.",
"The member was removed from the group {group}": "Le ou la membre a été supprimé·e du groupe {group}",
@ -678,7 +702,8 @@
"The {default_terms} will be used. They will be translated in the user's language.": "Les {default_terms} seront utilisées. Elles seront traduites dans la langue de l'utilisateur⋅rice.",
"There are {participants} participants.": "Il n'y a qu'un⋅e participant⋅e. | Il y a {participants} participant⋅es.",
"There will be no way to recover your data.": "Il n'y aura aucun moyen de récupérer vos données.",
"These events may interest you": "Ces évènements peuvent vous intéresser",
"There's no discussions yet": "Il n'y a pas encore de discussions",
"These events may interest you": "Ces événements peuvent vous intéresser",
"This Mobilizon instance and this event organizer allows anonymous participations, but requires validation through email confirmation.": "Cette instance Mobilizon et l'organisateur⋅ice de l'événement autorise les participations anonymes, mais requiert une validation à travers une confirmation par email.",
"This URL is not supported": "Cette URL n'est pas supportée",
"This email is already registered as participant for this event": "Cet email est déjà enregistré comme participant⋅e pour cet événement",
@ -692,33 +717,38 @@
"This information is saved only on your computer. Click for details": "Cette information est sauvegardée uniquement sur votre appareil. Cliquez pour plus de details",
"This installation (called “an instance“) can easily {interconnect}, thanks to {protocol}.": "Cette installation (appelée “une instance“) peut facilement {interconnect}, grâce à {protocol}.",
"This instance isn't opened to registrations, but you can register on other instances.": "Cette instance n'autorise pas les inscriptions, mais vous pouvez vous enregistrer sur d'autres instances.",
"This instance, <b>{instanceName} ({domain})</b>, hosts your profile, so remember its name.": "Cette instance, <b>{instanceName} ({domain})</b>, héberge votre profil, donc notez bien son nom.",
"This is a demonstration site to test Mobilizon.": "Ceci est un site de démonstration permettant de tester Mobilizon.",
"This is like your federated username (<code>{username}</code>) for groups. It will allow the group to be found on the federation, and is guaranteed to be unique.": "C'est comme votre addresse fédérée (<code>{username}</code>) pour les groupes. Cela permettra au groupe d'être trouvable sur la fédération, et est garanti d'être unique.",
"This month": "Ce mois-ci",
"This setting will be used to display the website and send you emails in the correct language.": "Ce paramètre sera utilisé pour l'affichage du site et pour vous envoyer des courriels dans la bonne langue.",
"This user has been disabled": "Cet utilisateur·ice a été désactivé·e",
"This website isn't moderated and the data that you enter will be automatically destroyed every day at 00:01 (Paris timezone).": "Ce site nest pas modéré et les données que vous y rentrerez seront automatiquement détruites tous les jours à 00:01 (heure de Paris).",
"This week": "Cette semaine",
"This weekend": "Ce weekend",
"This will delete / anonymize all content (events, comments, messages, participations…) created from this identity.": "Cela supprimera / anonymisera tout le contenu (évènements, commentaires, messages, participations…) créés avec cette identité.",
"This will delete / anonymize all content (events, comments, messages, participations…) created from this identity.": "Cela supprimera / anonymisera tout le contenu (événements, commentaires, messages, participations…) créés avec cette identité.",
"Timezone": "Fuseau horaire",
"Timezone detected as {timezone}.": "Fuseau horaire détecté en tant que {timezone}.",
"Title": "Titre",
"To achieve your registration, please create a first identity profile.": "Pour finir votre inscription, veuillez créer un premier profil.",
"To activate more notifications, head over to the notification settings.": "Pour activer plus de notifications, rendez-vous dans vos paramètres de notification.",
"To change the world, change the software": "Changer de logiciel pour changer le monde",
"To confirm, type your event title \"{eventTitle}\"": "Pour confirmer, entrez le titre de l'évènement « {eventTitle} »",
"To confirm, type your event title \"{eventTitle}\"": "Pour confirmer, entrez le titre de l'événement « {eventTitle} »",
"To confirm, type your identity username \"{preferredUsername}\"": "Pour confirmer, entrez le nom de lidentité « {preferredUsername} »",
"To create and manage multiples identities from a same account": "Pour pouvoir créer et gérer plusieurs identités avec un même compte",
"To create and manage your events": "Pour créer et gérer vos évènements",
"To create and manage your events": "Pour créer et gérer vos événements",
"To create or join an group and start organizing with other people": "Pour créer ou rejoindre un groupe et commencer à vous organiser avec d'autres personnes",
"To register for an event by choosing one of your identities": "Pour s'inscrire à un évènement en choisissant une de vos identités",
"To register for an event by choosing one of your identities": "Pour s'inscrire à un événement en choisissant une de vos identités",
"Today": "Aujourd'hui",
"Tomorrow": "Demain",
"Transfer to {outsideDomain}": "Transférer à {outsideDomain}",
"Type": "Type",
"Type or select a date…": "Entrez ou sélectionnez une date…",
"URL": "URL",
"URL copied to clipboard": "URL copiée dans le presse-papiers",
"Unable to detect timezone.": "Impossible de détecter le fuseau horaire.",
"Unable to load event for participation. The error details are provided below:": "Impossible de charger l'événement pour la participation. Les détails de l'erreur sont disponibles ci-dessous :",
"Unable to save your participation in this browser.": "Échec de la sauvegarde de votre participation dans ce navigateur.",
"Unfortunately, this instance isn't opened to registrations": "Malheureusement, cette instance n'est pas ouverte aux inscriptions",
"Unfortunately, your participation request was rejected by the organizers.": "Malheureusement, votre demande de participation a été refusée par les organisateur⋅ices.",
"Unknown": "Inconnu",
@ -730,20 +760,22 @@
"Upcoming": "À venir",
"Upcoming events": "Événements à venir",
"Update": "Éditer",
"Update event {name}": "Mettre à jour l'évènement {name}",
"Update event {name}": "Mettre à jour l'événement {name}",
"Update group": "Mettre à jour le groupe",
"Update my event": "Mettre à jour mon évènement",
"Update my event": "Mettre à jour mon événement",
"Update post": "Mettre à jour le billet",
"Updated": "Mis à jour",
"Uploaded media size": "Taille des médias téléversés",
"Use my location": "Utiliser ma position",
"User": "Utilisateur·rice",
"Username": "Identifiant",
"Users": "Utilisateur⋅rice⋅s",
"View a reply": "Aucune réponse | Voir une réponse | Voir {totalReplies} réponses",
"View all": "Voir tous",
"View all events": "Voir tous les événements",
"View all posts": "Voir tous les billets",
"View all upcoming events": "Voir tous les événements à venir",
"View event page": "Voir la page de l'évènement",
"View event page": "Voir la page de l'événement",
"View everything": "Voir tout",
"View page on {hostname} (in a new window)": "Voir la page sur {hostname} (dans une nouvelle fenêtre)",
"Visible everywhere on the web": "Visible partout sur le web",
@ -767,7 +799,7 @@
"Welcome to Mobilizon, {username}!": "Bienvenue sur Mobilizon, {username} !",
"When a moderator from the group creates an event and attributes it to the group, it will show up here.": "Lorsqu'un·e modérateur·rice du groupe crée un événement et l'attribue au groupe, il s'affichera ici.",
"When someone from the group creates an event and attributes it to the group, it will show up here.": "Lorsqu'un membre du groupe crée un événement et l'attribue au groupe, il s'affichera ici.",
"Who can view this event and participate": "Qui peut voir cet évènement et y participer",
"Who can view this event and participate": "Qui peut voir cet événement et y participer",
"Who can view this post": "Qui peut voir ce billet",
"Who published {number} events": "Ayant publié {number} événements",
"Why create an account?": "Pourquoi se créer un compte ?",
@ -776,6 +808,7 @@
"Write something…": "Écrivez quelque chose…",
"You are already a participant of this event.": "Vous participez déjà à cet évènement.",
"You are not an administrator for this group.": "Vous n'êtes pas une administrateur·rice de ce groupe.",
"You are not part of any group.": "Vous ne faites partie d'aucun groupe.",
"You are participating in this event anonymously": "Vous participez à cet événement anonymement",
"You are participating in this event anonymously but didn't confirm participation": "Vous participez à cet événement anonymement mais vous n'avez pas confirmé votre participation",
"You can add tags by hitting the Enter key or by adding a comma": "Vous pouvez ajouter des tags en appuyant sur la touche Entrée ou bien en ajoutant une virgule",
@ -785,19 +818,23 @@
"You can't change your password because you are registered through {provider}.": "Vous ne pouvez pas changer votre mot de passe car vous vous êtes enregistré via {provider}.",
"You can't remove your last identity.": "Vous ne pouvez pas supprimer votre dernière identité.",
"You can't reset your password because you use a 3rd-party auth provider to login.": "Vous ne pouvez pas réinitialiser votre mot de passe car vous vous connectez via une méthode externe.",
"You didn't create or join any event yet.": "Vous n'avez pas encore créé ou rejoint d'événement.",
"You don't follow any instances yet.": "Vous ne suivez aucune instance pour le moment.",
"You have been disconnected": "Vous avez été déconnecté⋅e",
"You have been invited by {invitedBy} to the following group:": "Vous avez été invité par {invitedBy} à rejoindre le groupe suivant :",
"You have been removed from this group's members.": "Vous avez été exclu des membres de ce groupe.",
"You have cancelled your participation": "Vous avez annulé votre participation",
"You have one event in {days} days.": "Vous n'avez pas d'évènements dans {days} jours | Vous avez un évènement dans {days} jours. | Vous avez {count} évènements dans {days} jours",
"You have one event today.": "Vous n'avez pas d'évenement aujourd'hui | Vous avez un évènement aujourd'hui. | Vous avez {count} évènements aujourd'hui",
"You have one event tomorrow.": "Vous n'avez pas d'évènement demain | Vous avez un évènement demain. | Vous avez {count} évènements demain",
"You have one event in {days} days.": "Vous n'avez pas d'événements dans {days} jours | Vous avez un événement dans {days} jours. | Vous avez {count} événements dans {days} jours",
"You have one event today.": "Vous n'avez pas d'événement aujourd'hui | Vous avez un événement aujourd'hui. | Vous avez {count} événements aujourd'hui",
"You have one event tomorrow.": "Vous n'avez pas d'événement demain | Vous avez un événement demain. | Vous avez {count} événements demain",
"You may also ask to {resend_confirmation_email}.": "Vous pouvez aussi demander à {resend_confirmation_email}.",
"You may clear all participation information for this device with the buttons below.": "Vous pouvez effacer toutes les informations de participation pour cet appareil avec les boutons ci-dessous.",
"You may now close this window, or {return_to_event}.": "Vous pouvez maintenant fermer cette fenêtre, ou bien {return_to_event}.",
"You need to create the group before you create an event.": "Vous devez créer le groupe avant de créer l'événement.",
"You need to login.": "Vous devez vous connecter.",
"You will be able to add an avatar and set other options in your account settings.": "Vous pourrez ajouter un avatar et définir d'autres options dans les paramètres de votre compte.",
"You will be redirected to the original instance": "Vous allez être redirigé⋅e vers l'instance d'origine",
"You will find here all the events you have created or of which you are a participant.": "Vous trouverez ici tous les événements que vous avez créé ou dont vous êtes un·e participant·e.",
"You wish to participate to the following event": "Vous souhaitez participer à l'événement suivant",
"You'll get a weekly recap every Monday for upcoming events, if you have any.": "Vous recevrez un récapitulatif hebdomadaire chaque lundi pour les événements de la semaine, si vous en avez.",
"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.": "Vous aurez besoin de transmettre l'URL du groupe pour que d'autres personnes accèdent au profil du groupe. Le groupe ne sera pas trouvable dans la recherche de Mobilizon ni dans les moteurs de recherche habituels.",
@ -820,10 +857,14 @@
"Your participation request has been validated": "Votre demande de participation a été validée",
"Your participation request is being validated": "Votre demande de participation est en cours de validation",
"Your participation status has been changed": "Le statut de votre participation a été mis à jour",
"Your participation status is saved only on this device and will be deleted one month after the event's passed.": "Le statut de votre participation est enregistré uniquement sur cet appareil et sera supprimé un mois après la fin de l'événement.",
"Your participation still has to be approved by the organisers.": "Votre participation doit encore être approuvée par les organisateur·rice·s.",
"Your participation will be validated once you click the confirmation link into the email, and after the organizer manually validates your participation.": "Votre participation sera validée une fois que vous aurez cliqué sur le lien de confirmation contenu dans le courriel, et après que l'organisateur·ice valide votre participation.",
"Your participation will be validated once you click the confirmation link into the email.": "Votre participation sera validée une fois que vous aurez cliqué sur le lien de confirmation contenu dans le courriel.",
"Your profile will be shown as contact.": "Votre profil sera affiché en tant que contact.",
"Your timezone is currently set to {timezone}.": "Votre fuseau horaire est actuellement défini à {timezone}.",
"Your timezone was detected as {timezone}.": "Votre fuseau horaire a été détecté en tant que {timezone}.",
"Your timezone {timezone} isn't supported.": "Votre fuseau horaire {timezone} n'est pas supporté.",
"[This comment has been deleted by it's author]": "[Ce commentaire a été supprimé par son auteur]",
"[This comment has been deleted]": "[Ce commentaire a été supprimé]",
"[deleted]": "[supprimé]",
@ -834,10 +875,14 @@
"as {identity}": "en tant que {identity}",
"change the world, one byte at a time": "changer le monde, un octet à la fois",
"contact uninformed": "contact non renseigné",
"create a group": "créer un groupe",
"create an event": "créer un événement",
"default Mobilizon privacy policy": "politique de confidentialité par défaut de Mobilizon",
"default Mobilizon terms": "conditions d'utilisation par défaut de Mobilizon",
"digital habits of activists": "les usages numériques de militant·es",
"e.g. 10 Rue Jangot": "par exemple : 10 Rue Jangot",
"explore the events": "explorer les événements",
"explore the groups": "explorer les groupes",
"firstDayOfWeek": "1",
"fit the needs and uses of the people": "aux besoins et usages",
"full rules": "règles complètes",
@ -850,6 +895,7 @@
"report #{report_number}": "le signalement #{report_number}",
"resend confirmation email": "réenvoyer l'email de confirmation",
"respect of the fundamental freedoms": "le respect des libertés fondamentales",
"return to the event's page": "retourner sur la page de l'événement",
"terms of service": "conditions générales d'utilisation",
"with another identity…": "avec une autre identité…",
"{approved} / {total} seats": "{approved} / {total} places",
@ -877,45 +923,13 @@
"{title} ({count} todos)": "{title} ({count} todos)",
"{username} was invited to {group}": "{username} a été invité à {group}",
"© The OpenStreetMap Contributors": "© Les Contributeur⋅ices OpenStreetMap",
"This setting will be used to display the website and send you emails in the correct language.": "Ce paramètre sera utilisé pour l'affichage du site et pour vous envoyer des courriels dans la bonne langue.",
"Abandon editing": "Abandonner la modification",
"Previous": "Précédent",
"Next": "Suivant",
"Your timezone {timezone} isn't supported.": "Votre fuseau horaire {timezone} n'est pas supporté.",
"Profiles and federation": "Profils et fédération",
"Mobilizon uses a system of profiles to compartiment your activities. You will be able to create as many profiles as you want.": "Mobilizon utilise un système de profils pour compartimenter vos activités. Vous pourrez créer autant de profils que vous voulez.",
"Mobilizon is a federated software, meaning you can interact - depending on your admin's federation settings - with content from other instances, such as joining groups or events that were created elsewhere.": "Mobilizon est un logiciel fédéré, ce qui signifie que vous pouvez interagir - en fonction des paramètres de fédération de votre administrateur·ice - avec du contenu d'autres instances, comme par exemple rejoindre des groupes ou des événements ayant été créés ailleurs.",
"This instance, <b>{instanceName} ({domain})</b>, hosts your profile, so remember its name.": "Cette instance, <b>{instanceName} ({domain})</b>, héberge votre profil, donc notez bien son nom.",
"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:": "Si l'on vous demande votre identité fédérée, elle est composée de votre nom d'utilisateur·ice et de votre instance. Par exemple, l'identité fédérée de votre premier profil est :",
"Uploaded media size": "Taille des médias téléversés",
"Loading comments…": "Chargement des commentaires…",
"Tentative": "Provisoire",
"Cancelled": "Annulé",
"Click for more information": "Cliquez pour plus d'informations",
"About anonymous participation": "À propos de la participation anonyme",
"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.": "L'organisateur de l'événement ayant choisi de valider manuellement les demandes de participation, votre participation ne sera réellement confirmée que lorsque vous recevrez un courriel indiquant qu'elle est acceptée.",
"Your participation status is saved only on this device and will be deleted one month after the event's passed.": "Le statut de votre participation est enregistré uniquement sur cet appareil et sera supprimé un mois après la fin de l'événement.",
"You may clear all participation information for this device with the buttons below.": "Vous pouvez effacer toutes les informations de participation pour cet appareil avec les boutons ci-dessous.",
"Clear participation data for this event": "Effacer mes données de participation pour cet événement",
"Clear participation data for all events": "Effacer mes données de participation pour tous les événements",
"Your participation will be validated once you click the confirmation link into the email, and after the organizer manually validates your participation.": "Votre participation sera validée une fois que vous aurez cliqué sur le lien de confirmation contenu dans le courriel, et après que l'organisateur·ice valide votre participation.",
"Your participation will be validated once you click the confirmation link into the email.": "Votre participation sera validée une fois que vous aurez cliqué sur le lien de confirmation contenu dans le courriel.",
"Unable to load event for participation. The error details are provided below:": "Impossible de charger l'événement pour la participation. Les détails de l'erreur sont disponibles ci-dessous :",
"Unable to save your participation in this browser.": "Échec de la sauvegarde de votre participation dans ce navigateur.",
"return to the event's page": "retourner sur la page de l'événement",
"You may now close this window, or {return_to_event}.": "Vous pouvez maintenant fermer cette fenêtre, ou bien {return_to_event}.",
"View all events": "Voir tous les événements",
"You will find here all the events you have created or of which you are a participant.": "Vous trouverez ici tous les événements que vous avez créé ou dont vous êtes un·e participant·e.",
"Create event": "Créer un événement",
"You didn't create or join any event yet.": "Vous n'avez pas encore créé ou rejoint d'événement.",
"create an event": "créer un événement",
"explore the events": "explorer les événements",
"Do you wish to {create_event} or {explore_events}?": "Voulez-vous {create_event} ou {explore_events} ?",
"You are not part of any group.": "Vous ne faites partie d'aucun groupe.",
"create a group": "créer un groupe",
"explore the groups": "explorer les groupes",
"Do you wish to {create_group} or {explore_groups}?": "Voulez-vous {create_group} ou {explore_groups} ?",
"Type or select a date…": "Entrez ou sélectionnez une date…",
"Getting there": "S'y rendre",
"Groups are not enabled on this instance.": "Les groupes ne sont pas activés sur cette instance."
"Atom feed for events and posts": "Flux Atom pour les événements et les billets",
"ICS feed for events": "Flux ICS pour les événements",
"ICS/WebCal Feed": "Flux ICS/WebCal",
"Group Followers": "Abonné⋅es au groupe",
"Follower": "Abonné⋅es",
"No follower matches the filters": "Aucun⋅e abonné⋅e ne correspond aux filtres",
"@{username}'s follow request was rejected": "La demande de suivi de @{username} a été rejettée",
"Followers will receive new public events and posts.": "Les abonnée⋅s recevront les nouveaux événements et billets publics.",
"Manually approve new followers": "Approuver les nouvelles demandes de suivi manuellement"
}

View File

@ -11,6 +11,7 @@
"<b>{contact}</b> will be displayed as contact.": "<b>{contact}</b> será mostrado como contacto.|<b>{contact}</b> serán mostrados como contactos.",
"@{group}": "@{group}",
"@{username} ({role})": "@{username} ({role})",
"@{username}'s follow request was rejected": "A solicitude de seguimento de @{username} foi rexeitada",
"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.": "Unha cookie é un pequeno ficheiro que contén información que se envía á túa computadora cando visitas unha web. Cando volves á mesma web, a cookie permite que esa web recoñeza o teu navegador. As cookies poden gardar preferencias da usuaria e outra información. Podes configurar o navegador para rexeitar todas as cookies. Porén, esto podería facer que algúns servizos ou características da web non funcionen correctamente. O almacenaxe local funciona do mesmo xeito pero permite almacenar máis datos.",
"A federated software": "Software federado",
"A place for your code of conduct, rules or guidelines. You can use HTML tags.": "Lugar para o código de conduta, regras ou guías. Podes usar HTML.",
@ -86,6 +87,7 @@
"Are you sure you want to delete this event? This action cannot be reverted.": "¿Tes a certeza de que queres eliminar este evento? Esta acción non é reversible.",
"As the event organizer has chosen to manually validate participation requests, your participation will be really confirmed only once you receive an email stating it's being accepted.": "Como a organización do evento escolleu validar manualmente as solicitudes, a túa participación estará realmente confirmada cando recibas un email informándote.",
"Assigned to": "Asignado a",
"Atom feed for events and posts": "Fonte Atom para eventos e publicacións",
"Avatar": "Avatar",
"Back to previous page": "Volver á páxina anterior",
"Banner": "Cabeceira",
@ -274,7 +276,9 @@
"Find an address": "Atopar un enderezo",
"Find an instance": "Atopar unha instancia",
"Find another instance": "Atopa outra instancia",
"Follower": "Seguidora",
"Followers": "Seguidoras",
"Followers will receive new public events and posts.": "As seguidoras recibirán os novos eventos públicos e publicacións.",
"Followings": "Seguindo",
"For instance: London": "Por exemplo: Allariz",
"For instance: London, Taekwondo, Architecture…": "Por exemplo: Leiro, Natación, Arquitectura…",
@ -288,10 +292,12 @@
"General": "Xeral",
"General information": "Información xeral",
"Getting location": "Obtendo localización",
"Getting there": "Chegar alí",
"Glossary": "Glosario",
"Go": "Ir",
"Go to the event page": "Ir á páxina do evento",
"Going as {name}": "Ir como {name}",
"Group Followers": "Agrupar seguidoras",
"Group List": "Lista do grupo",
"Group Members": "Membros do grupo",
"Group address": "Enderezo do grupo",
@ -304,6 +310,7 @@
"Group {displayName} created": "Creado o grupo {displayName}",
"Group {groupTitle} reported": "Grupo {groupTitle} denunciado",
"Groups": "Grupos",
"Groups are not enabled on this instance.": "Os grupos non están activados nesta instancia.",
"Groups are spaces for coordination and preparation to better organize events and manage your community.": "Os grupos son espazos de coordinación e preparación, para organizar os eventos e xestionar a comunidade.",
"Headline picture": "Imaxe de cabeceira",
"Hide replies": "Agochar respostas",
@ -319,6 +326,8 @@
"I participate": "Eu participo",
"I want to allow people to participate without an account.": "Quero que a xente poida participar sen ter unha conta.",
"I want to approve every participation request": "Quero aprobar cada solicitude de participación",
"ICS feed for events": "Fonte ICS para eventos",
"ICS/WebCal Feed": "Fonte ICS/WebCal",
"Identity {displayName} created": "Creouse a identidade {displayName}",
"Identity {displayName} deleted": "Eliminada a identidade {displayName}",
"Identity {displayName} updated": "Identidade {displayName} actualizada",
@ -355,6 +364,7 @@
"Invite a new member": "Convida a un novo membro",
"Invite member": "Convida a persoa",
"Invited": "Convidada",
"It is possible that the content is not accessible on this instance, because this instance has blocked the profiles or groups behind this content.": "É posible que o contido non sexa accesible nesta instancia, porque a instancia bloqueou os perfís ou grupos que publican este contido.",
"Italic": "Cursiva",
"Join <b>{instance}</b>, a Mobilizon instance": "Únete a <b>{instance}</b>, unha instancia Mobilizon",
"Join group": "Unirse ó grupo",
@ -396,6 +406,7 @@
"Manage my notifications": "Xestionar notificacións",
"Manage my settings": "Xestionar os axustes",
"Manage participations": "Xestionar participantes",
"Manually approve new followers": "Aprobar manualmente novas solicitudes",
"Manually invite new members": "Convida manualmente a novos membros",
"Mark as resolved": "Marcar como resolto",
"Member": "Membro",
@ -446,6 +457,7 @@
"No discussions yet": "Aínda non hai debates",
"No end date": "Se data de fin",
"No events found": "Non se atopan eventos",
"No follower matches the filters": "Ningunha seguidora supera o filtro",
"No group found": "Non hai grupos",
"No groups found": "Non se atopa ningún grupo",
"No instance follows your instance yet.": "Aínda non te segue ningunha instancia.",
@ -493,6 +505,7 @@
"Only accessible to members of the group": "Accesible só para membros do grupo",
"Only alphanumeric characters and underscores are supported.": "Só se permiten caracteres alfanuméricos e trazo baixo.",
"Only alphanumeric lowercased characters and underscores are supported.": "Só se permiten caracteres alfanuméricos en minúsculas e trazo baixo.",
"Only group members can access discussions": "Só os membros do grupo poden acceder ás conversas",
"Only group moderators can create, edit and delete posts.": "Só as moderadoras do grupo poden crear, editar e eliminar publicacións.",
"Open": "Abrir",
"Opened reports": "Denuncias abertas",
@ -610,6 +623,7 @@
"Resource provided is not an URL": "O recurso proporcionado non é un URL",
"Resources": "Recursos",
"Restricted": "Restrinxido",
"Return to the group page": "Volver á páxina do grupo",
"Right now": "Xusto agora",
"Role": "Rol",
"Rules": "Normas",
@ -670,6 +684,7 @@
"The event will show as attributed to this group.": "O evento aparecerá atribuído a este grupo.",
"The event will show as attributed to your personal profile.": "O evento aparecerá atribuído ó teu perfil persoal.",
"The event will show the group as organizer.": "O evento mostrará ó grupo como organizador.",
"The events you created are not shown here.": "Os eventos que ti creaches non se mostran aquí.",
"The group will be publicly listed in search results and may be suggested in the explore section. Only public informations will be shown on it's page.": "Este grupo aparecerá en resultados de buscas e podería ser suxerido na sección descubrir. Só se mostrará información pública nesta páxina.",
"The instance administrator is the person or entity that runs this Mobilizon instance.": "A administradora da instancia é a persoa ou entidade que xestiona a instancia Mobilizon.",
"The member was removed from the group {group}": "A usuaria foi eliminada do grupo {group}",
@ -682,6 +697,7 @@
"The {default_terms} will be used. They will be translated in the user's language.": "Serán utilizados os {default_terms}. Serán traducidos ó idioma da usuaria.",
"There are {participants} participants.": "Hai {participants} participantes.",
"There will be no way to recover your data.": "Non hai xeito de recuperar os teus datos.",
"There's no discussions yet": "Aínda non hai conversas",
"These events may interest you": "Estos eventos poderían interesarche",
"This Mobilizon instance and this event organizer allows anonymous participations, but requires validation through email confirmation.": "Esta instancia Mobilizon e os organizadores do evento permiten a participación anónima, pero requiren validación a través dun email.",
"This URL is not supported": "O URL non está soportado",
@ -720,6 +736,7 @@
"Tomorrow": "Mañán",
"Transfer to {outsideDomain}": "Transferir a {outsideDomain}",
"Type": "Tipo",
"Type or select a date…": "Escribe o elixe unha data…",
"URL": "URL",
"URL copied to clipboard": "URL copiado ó portapapeis",
"Unable to detect timezone.": "Non se detectou a zona horaria.",
@ -783,6 +800,7 @@
"Write something…": "Escribe algo…",
"You are not an administrator for this group.": "Non es administradora deste grupo.",
"You are not part of any group": "Non formas parte de ningún grupo",
"You are not part of any group.": "Non formas parte de ningún grupo.",
"You are participating in this event anonymously": "Participas neste evento de xeito anónimo",
"You are participating in this event anonymously but didn't confirm participation": "Participas neste evento de xeito anónimo pero non confirmaches a participación",
"You can add tags by hitting the Enter key or by adding a comma": "Podes engadir etiquetas premento Enter ou con vírgulas",
@ -791,6 +809,7 @@
"You can try another search term or drag and drop the marker on the map": "Podes intentalo con outro termo de busca ou arrastrar e soltar a marca no mapa",
"You can't change your password because you are registered through {provider}.": "Non podes cambiar o contrasinal porque estás rexistrada en {provider}.",
"You didn't create or join any event yet": "Non creaches nin te uniches a ningún evento",
"You didn't create or join any event yet.": "Aínda non te uniches nin creaches un evento.",
"You don't follow any instances yet.": "Aínda non segues ningunha instancia.",
"You have been disconnected": "Desconectáronte",
"You have been invited by {invitedBy} to the following group:": "Foches convidada por {invitedBy} ó seguinte grupo:",

View File

@ -149,6 +149,7 @@
"Create a pad": "Crea un pad",
"Create a videoconference": "Crea una videoconferenza",
"Create an account": "Crea un account",
"Create event": "Crea un evento",
"Create group": "Crea gruppo",
"Create my event": "Crea il mio evento",
"Create my group": "Crea il mio gruppo",
@ -203,6 +204,8 @@
"Displayed nickname": "Nickname visualizzato",
"Displayed on homepage and meta tags. Describe what Mobilizon is and what makes this instance special in a single paragraph.": "Visualizzato sulla home page e nei meta tag. Descrivi cos'è Mobilizon e cosa rende speciale questa istanza in un solo paragrafo.",
"Do not receive any mail": "Non ricevere email",
"Do you wish to {create_event} or {explore_events}?": "Desideri {create_event} o {explore_events}?",
"Do you wish to {create_group} or {explore_groups}?": "Desideri {create_group} o {explore_groups}?",
"Domain": "Dominio",
"Don't show @{organizer} as event host alongside @{group}": "Non mostrare @{organizer} come conduttore dell'evento assieme a @{group}",
"Draft": "Bozza",
@ -276,6 +279,7 @@
"General": "Generali",
"General information": "Informazioni generali",
"Getting location": "Ottieni posizione",
"Getting there": "Arrivarci",
"Glossary": "Glossario",
"Go": "Vai",
"Go to the event page": "Vai alla pagina dell'evento",
@ -291,6 +295,7 @@
"Group {displayName} created": "Gruppo {displayName} creato",
"Group {groupTitle} reported": "Gruppo {groupTitle} segnalato",
"Groups": "Gruppi",
"Groups are not enabled on this instance.": "I gruppi non sono abilitati su questa istanza.",
"Groups are spaces for coordination and preparation to better organize events and manage your community.": "I gruppi sono spazi di coordinamento e preparazione per organizzare al meglio gli eventi e gestire la tua comunità.",
"Headline picture": "immagine della prima pagina",
"Hide replies": "Nascondi risposte",
@ -689,9 +694,12 @@
"Tomorrow": "Domani",
"Transfer to {outsideDomain}": "Trasferire a {outsideDomain}",
"Type": "Tipo",
"Type or select a date…": "Digita o seleziona una data…",
"URL": "URL",
"URL copied to clipboard": "URL copiato negli appunti",
"Unable to detect timezone.": "Impossibile rilevare il fuso orario.",
"Unable to load event for participation. The error details are provided below:": "Impossibile caricare l'evento per la partecipazione. Di seguito vengono forniti i dettagli dell'errore:",
"Unable to save your participation in this browser.": "Impossibile salvare la tua partecipazione in questo browser.",
"Unfortunately, this instance isn't opened to registrations": "Sfortunatamente, questa istanza non è aperta a registrazioni",
"Unfortunately, your participation request was rejected by the organizers.": "Sfortunatamente, la tua richiesta di partecipazione è stata rifiutata da chi organizza l'evento.",
"Unknown": "Sconosciuto",
@ -715,6 +723,7 @@
"Users": "Utenti",
"View a reply": "|Vedi una risposta|Vedi {totalReplies} risposte",
"View all": "Visualizza tutto",
"View all events": "Visualizza tutti gli eventi",
"View all posts": "Visualizza tutti i post",
"View all upcoming events": "Visualizza tutti i prossimi eventi",
"View event page": "Vedi pagina evento",
@ -743,6 +752,7 @@
"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.": "Consentirà di visualizzare e gestire lo stato di partecipazione sulla pagina dell'evento quando si utilizza questo dispositivo. Deseleziona se stai utilizzando un dispositivo pubblico.",
"Write something…": "Scrivi qualcosa…",
"You are not an administrator for this group.": "Non sei un amministratore di questo gruppo.",
"You are not part of any group.": "Non fai parte di nessun gruppo.",
"You are participating in this event anonymously": "Stai partecipando a questo evento in forma anonima",
"You are participating in this event anonymously but didn't confirm participation": "Stai partecipando a questo evento in forma anonima ma non hai confermato la partecipazione",
"You can add tags by hitting the Enter key or by adding a comma": "Puoi aggiungere etichette premendo il tasto Invio o aggiungendo una virgola",
@ -750,6 +760,7 @@
"You can pick your timezone into your preferences.": "Puoi scegliere il tuo fuso orario nelle preferenze.",
"You can try another search term or drag and drop the marker on the map": "Puoi provare un altro termine di ricerca o trascinare il marcatore sulla mappa",
"You can't change your password because you are registered through {provider}.": "Non puoi cambiare la tua password perché sei registrato con {provider}.",
"You didn't create or join any event yet.": "Non hai ancora creato o partecipato a nessun evento.",
"You don't follow any instances yet.": "Non segui ancora nessuna istanza.",
"You have been disconnected": "Sei stato disconnesso",
"You have been invited by {invitedBy} to the following group:": "Sei stato invitato da {invitedBy} al seguente gruppo:",
@ -759,11 +770,13 @@
"You have one event today.": "Non hai eventi oggi | Hai un evento oggi. | Hai {count} eventi oggi",
"You have one event tomorrow.": "Non hai eventi domani | Hai un evento domani | Hai {count} eventi domani",
"You may clear all participation information for this device with the buttons below.": "Puoi rimuovere tutte le informazioni di partecipazione da questo dispositivo col bottone qui sotto.",
"You may now close this window, or {return_to_event}.": "Ora puoi chiudere questa finestra, o {return_to_event}.",
"You may now close this window.": "Ora puoi chiudere questa finestra.",
"You need to create the group before you create an event.": "Devi creare un gruppo prima di creare un evento.",
"You need to login.": "Devi accedere.",
"You will be able to add an avatar and set other options in your account settings.": "Potrai aggiungere un avatar e impostare altre opzioni nelle impostazioni del tuo account.",
"You will be redirected to the original instance": "Sarai reindirizzato verso l'istanza originale",
"You will find here all the events you have created or of which you are a participant.": "Qui troverai tutti gli eventi che hai creato o di cui sei partecipante.",
"You wish to participate to the following event": "Desideri partecipare all'evento seguente",
"You'll get a weekly recap every Monday for upcoming events, if you have any.": "Rivecerai un riassunto settimanale degli eventi in arrivo ogni Lunedì, se ce ne sono.",
"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.": "Dovrai trasmettere l'URL del gruppo in modo che le persone possano accedere al profilo del gruppo. Il gruppo non sarà rintracciabile nella ricerca di Mobilizon o nei normali motori di ricerca.",
@ -787,6 +800,8 @@
"Your participation status has been changed": "Lo stato della tua partecipazione è cambiato",
"Your participation status is saved only on this device and will be deleted one month after the event's passed.": "Il tuo stato di partecipazione è salvato solo su questo dispositivo e sarà cancellato un mese dopo che l'evento si è concluso.",
"Your participation still has to be approved by the organisers.": "La tua partecipazione deve ancora essere approvata dagli organizzatori.",
"Your participation will be validated once you click the confirmation link into the email, and after the organizer manually validates your participation.": "La tua partecipazione verrà convalidata dopo aver fatto clic sul collegamento di conferma nell'email, e dopo che l'organizzatore ha convalidato manualmente la tua partecipazione.",
"Your participation will be validated once you click the confirmation link into the email.": "La tua partecipazione verrà convalidata dopo aver fatto clic sul collegamento di conferma nell'email.",
"Your profile will be shown as contact.": "Il tuo profilo sarà mostrato come contatto.",
"Your timezone is currently set to {timezone}.": "Il fuso orario è attualmente impostato su {timezone}.",
"Your timezone was detected as {timezone}.": "Il tuo fuso orario è stato rilevato come {timezone}.",
@ -799,10 +814,14 @@
"any distance": "qualsiasi distanza",
"as {identity}": "come {identità}",
"contact uninformed": "contatto disinformato",
"create a group": "crea un gruppo",
"create an event": "crea un evento",
"default Mobilizon privacy policy": "Politica predefinita di Mobilizon sulla riservatezza",
"default Mobilizon terms": "condizioni predefinite di Mobilizon",
"digital habits of activists": "Abitudini digitali degli attivisti",
"e.g. 10 Rue Jangot": "ad es. via Jangot, 10",
"explore the events": "esplora gli eventi",
"explore the groups": "esplora i gruppi",
"firstDayOfWeek": "0",
"fit the needs and uses of the people": "Soddisfa i bisogni e gli utilizzi delle persone",
"full rules": "regole complete",
@ -811,6 +830,7 @@
"more than 1360 contributors": "più di 1360 donatori",
"profile@instance": "profilo@istanza",
"report #{report_number}": "relazione",
"return to the event's page": "torna alla pagina dell'evento",
"terms of service": "termini di servizio",
"with another identity…": "con altra identità…",
"{approved} / {total} seats": "{approved} / {total} posti",

View File

@ -1,6 +1,7 @@
{
"ar": "العربية",
"be": "Беларуская мова",
"bn": "বাংলা",
"ca": "Català",
"cs": "čeština",
"de": "Deutsch",
@ -22,5 +23,6 @@
"pt": "Português",
"pt_BR": "Português brasileiro",
"ru": "Русский",
"sl": "Slovenščina",
"sv": "Svenska"
}

View File

@ -143,6 +143,7 @@
"Create a pad": "Lag ei kladdebok",
"Create a videoconference": "Lag ein videokonferanse",
"Create an account": "Lag ein konto",
"Create event": "Lag hending",
"Create group": "Lag ei gruppe",
"Create my event": "Lag hendinga mi",
"Create my group": "Lag gruppa mi",
@ -197,6 +198,8 @@
"Displayed nickname": "Synleg kallenamn",
"Displayed on homepage and meta tags. Describe what Mobilizon is and what makes this instance special in a single paragraph.": "Står på heimesida og meta-skildring. Skriv kva Mobilizon er, og kva som gjer denne nettstaden spesiell, i eitt avsnitt.",
"Do not receive any mail": "Ikkje få nokon epostar",
"Do you wish to {create_event} or {explore_events}?": "Vil du {create_event} eller {explore_events}?",
"Do you wish to {create_group} or {explore_groups}?": "Vil du {create_group} eller {explore_groups}?",
"Domain": "Domene",
"Don't show @{organizer} as event host alongside @{group}": "Ikkje syn @{organizer} som vert ved sidan av @{group}",
"Draft": "Kladd",
@ -267,6 +270,7 @@
"General": "Allment",
"General information": "Allmenne opplysingar",
"Getting location": "Hentar plass",
"Getting there": "Kvar skjer det",
"Glossary": "Ordliste",
"Go": "Gå",
"Go to the event page": "Gå til hendingssida",
@ -282,6 +286,7 @@
"Group {displayName} created": "Gruppa {displayName} er oppretta",
"Group {groupTitle} reported": "Gruppa {groupTitle} er rapportert",
"Groups": "Grupper",
"Groups are not enabled on this instance.": "Denne nettstaden bruker ikkje grupper.",
"Groups are spaces for coordination and preparation to better organize events and manage your community.": "Grupper er stader der du koordinerer og førebur deg for å skipa til hendingar og handtera brukarsamfunnet ditt.",
"Headline picture": "Hovudbilete",
"Hide replies": "Gøym svar",
@ -676,6 +681,7 @@
"Tomorrow": "I morgon",
"Transfer to {outsideDomain}": "Overfør til {outsideDomain}",
"Type": "Type",
"Type or select a date…": "Skriv inn eller vel ein dato…",
"URL": "URL-adresse",
"URL copied to clipboard": "Adressa er kopiert til utklippstavla",
"Unable to detect timezone.": "Greidde ikkje finna tidssonen.",
@ -704,6 +710,7 @@
"Users": "Brukarar",
"View a reply": "|Sjå eitt svar|Sjå {totalReplies} svar",
"View all": "Sjå alle",
"View all events": "Sjå alle hendingar",
"View all posts": "Sjå alle innlegga",
"View all upcoming events": "Sjå alle komande hendingar",
"View event page": "Sjå på hendingssida",
@ -732,6 +739,7 @@
"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.": "Lèt deg syna og handtera deltakarstatusen din på hendingssida når du bruker denne eininga. Fjern merkinga viss du bruker ei offentleg eining.",
"Write something…": "Skriv noko…",
"You are not an administrator for this group.": "Du er ikkje styrar for denne gruppa.",
"You are not part of any group.": "Du er ikkje med i noko gruppe.",
"You are participating in this event anonymously": "Du deltek på denne hendinga anonymt",
"You are participating in this event anonymously but didn't confirm participation": "Du deltek på denne hendinga anonymt, men har ikkje stadfesta at du deltek",
"You can add tags by hitting the Enter key or by adding a comma": "Du kan leggja til merkelappar ved å trykkja Enter eller skriva eit komma",
@ -739,6 +747,7 @@
"You can pick your timezone into your preferences.": "Du kan velja tidssone i innstillingane dine.",
"You can try another search term or drag and drop the marker on the map": "Du kan søkja etter noko anna, eller dra og sleppa markøren på kartet",
"You can't change your password because you are registered through {provider}.": "Du kan ikkje endra passordet ditt, fordi du er registrert gjennom {provider}.",
"You didn't create or join any event yet.": "Du har ikkje laga eller vorte med på hendingar enno.",
"You don't follow any instances yet.": "Du fylgjer ingen nettstader enno.",
"You have been disconnected": "Du er fråkopla",
"You have been invited by {invitedBy} to the following group:": "{invitedBy} har invitert deg til denne gruppa:",
@ -754,6 +763,7 @@
"You need to login.": "Du må logga inn.",
"You will be able to add an avatar and set other options in your account settings.": "Du kan laga eit profilbilete og gjera andre val i kontoinnstillingane dine.",
"You will be redirected to the original instance": "Du blir send vidare til den opphavelege nettstaden",
"You will find here all the events you have created or of which you are a participant.": "Her finn du alle hendingane du har laga eller deltek på.",
"You wish to participate to the following event": "Du ynskjer å delta på denne hendinga",
"You'll get a weekly recap every Monday for upcoming events, if you have any.": "Du vil få eit samandrag kvar måndag over komande hendingar, om du har nokon.",
"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.": "Du må senda ut gruppeadressa slik at folk kan sjå gruppeprofilen. Du vil ikkje finna gruppa i Mobilizon-søk eller vanlege søkjemotorar.",
@ -791,9 +801,13 @@
"any distance": "alle avstandar",
"as {identity}": "som {identity}",
"contact uninformed": "ingen kontakt informert",
"create a group": "laga ei gruppe",
"create an event": "laga ei hending",
"default Mobilizon privacy policy": "standard personvern for Mobilizon",
"default Mobilizon terms": "Standardvilkår for Mobilizon",
"e.g. 10 Rue Jangot": "td. Kaigata 10",
"explore the events": "utforska hendingane",
"explore the groups": "utforska gruppene",
"firstDayOfWeek": "1",
"full rules": "fullstendige reglar",
"iCal Feed": "iCal-straum",

View File

@ -27,6 +27,7 @@
"Abandon edition": "Abandonar la modificacion",
"About": "A prepaus",
"About Mobilizon": "A prepaus de Mobilizon",
"About anonymous participation": "A prepaus de la participacion anonima",
"About this event": "Tocant aqueste eveniment",
"About this instance": "Tocant aquesta instància",
"About {instance}": "A prepaus de {instance}",
@ -90,6 +91,7 @@
"Are you sure you want to cancel your participation at event \"{title}\"?": "Volètz vertadièrament anullar vòstra participacion a leveniment « {title} » ?",
"Are you sure you want to delete this event? This action cannot be reverted.": "Volètz vertadièrament suprimir aqueste eveniment ? Aquesta accion se pòt pas anullar.",
"Assigned to": "Assignat a",
"Atom feed for events and posts": "Flux Atom per los eveniments e las publicacions",
"Avatar": "Avatar",
"Back to previous page": "Tornar a pas pagina precedenta",
"Banner": "Banièra",
@ -109,6 +111,7 @@
"Cancel edition": "Anullar la modificacion",
"Cancel my participation request…": "Anullar ma demanda de participacion…",
"Cancel my participation…": "Anullar ma participacion…",
"Cancelled": "Anullat",
"Cancelled: Won't happen": "Anullat : se tendrà pas",
"Category": "Categoria",
"Change": "Modificar",
@ -119,6 +122,8 @@
"Change timezone": "Cambiar de zòna orària",
"Check your inbox (and your junk mail folder).": "Verificatz vòstra bóstia de recepcion (los indesirales tanben).",
"Clear": "Escafar",
"Clear participation data for this event": "Escafar mas donadas de participacion per aqueste eveniment",
"Click for more information": "Clicatz per mai dinformacions",
"Click to select": "Clicatz per seleccionar",
"Click to upload": "Clicatz per enviar",
"Close": "Tancar",
@ -157,6 +162,7 @@
"Create a visioconference": "Crear una vidèo-conferéncia",
"Create an account": "Crear un compte",
"Create and manage several identities from the same account": "Crear e gerir mantunas identitats amb lo meteis compte",
"Create event": "Crear un eveniment",
"Create group": "Crear un grop",
"Create my event": "Crear mon eveniment",
"Create my group": "Crear mon grop",
@ -217,6 +223,8 @@
"Displayed on homepage and meta tags. Describe what Mobilizon is and what makes this instance special in a single paragraph.": "Afichadas sus la pagina dacuèlh e dins las balisas meta. Descrivètz ques Mobilizon e çò que lo rend especific a aquesta instància en un sol paragraf.",
"Do not receive any mail": "Recebre pas de corrièls",
"Do you want to participate in {title}?": "Volètz participar a {title} ?",
"Do you wish to {create_event} or {explore_events}?": "Volètz {create_event} o {explore_events}?",
"Do you wish to {create_group} or {explore_groups}?": "Volètz {create_group} o {explore_groups}?",
"Domain": "Domeni",
"Don't show @{organizer} as event host alongside @{group}": "Mostrar pas @{organizer} coma organizator de leveniment amb @{group}",
"Draft": "Borrolhon",
@ -300,6 +308,7 @@
"General": "General",
"General information": "Informacions generalas",
"Getting location": "Obtencion de la localizacion",
"Getting there": "I arribar",
"Glossary": "Glossari",
"Go": "Zo",
"Go to the event page": "Anar a la pagina de leveniment",
@ -318,6 +327,7 @@
"Group {displayName} created": "Grop {displayName} creat",
"Group {groupTitle} reported": "Grop {groupTitle} senhalat",
"Groups": "Grops",
"Groups are not enabled on this instance.": "Los grops son pas activés sus aquesta instància.",
"Groups are spaces for coordination and preparation to better organize events and manage your community.": "Los grops son despacis de coordinacion e de preparacion per melhor organizar deveniments e gerir vòstra comunautat.",
"Headline picture": "Imatge endavant",
"Hide replies": "Rescondre las responsas",
@ -333,6 +343,8 @@
"I participate": "Participi",
"I want to allow people to participate without an account.": "Vòli permetre al monde de participar sens compte.",
"I want to approve every participation request": "Vòli aprovar cada demanda de participacion",
"ICS feed for events": "Flux ICS pels eveniements",
"ICS/WebCal Feed": "flux ICS/WebCal",
"Identities": "Identitats",
"Identity": "Identitat",
"Identity {displayName} created": "Identitat {displayName} creada",
@ -405,6 +417,7 @@
"Limited places": "Plaças limitadas",
"List title": "Títol de la lista",
"Load more": "Ne veire mai",
"Loading comments…": "Cargament dels comentaris…",
"Loading…": "Cargament…",
"Local": "Local",
"Locality": "Comuna",
@ -526,6 +539,7 @@
"Only accessible to members of the group": "Accessible sonque als membres del grop",
"Only alphanumeric characters and underscores are supported.": "Solament los caractèrs alfanumerics e los jonhents basses son suportats.",
"Only alphanumeric lowercased characters and underscores are supported.": "Solament los caractèrs alfanumerics minusculs e los jonhents basses son acceptats.",
"Only group members can access discussions": "Sonque los membres del grop pòdon accedir a las discussions",
"Only group moderators can create, edit and delete posts.": "Sonque los moderators de grops pòdon crear, modificar e suprimir de publicacions.",
"Open": "Dobèrtas",
"Opened reports": "Senhalaments dubèrts",
@ -655,6 +669,7 @@
"Resource provided is not an URL": "La ressorça fornida es pas una URL",
"Resources": "Ressorsas",
"Restricted": "Restrenchas",
"Return to the group page": "Tornar a la pagina del grop",
"Right now": "Ara meteis",
"Role": "Ròtle",
"Rules": "Règlas",
@ -700,6 +715,7 @@
"Suspend group": "Suspendre lo grop",
"Suspended": "Suspendut",
"Task lists": "Lista dels prètzfaches",
"Tentative": "Provisòri",
"Tentative: Will be confirmed later": "Provisòri : serà confirmat mai tard",
"Terms": "Tèrmes",
"Terms of service": "Condicions dutilizacion",
@ -723,6 +739,7 @@
"The event will show as attributed to this group.": "Leveniment serà mostrat coma atribuit a aqueste grop.",
"The event will show as attributed to your personal profile.": "Leveniment serà mostrat coma atribuit a vòstre perfil.",
"The event will show the group as organizer.": "Leveniment mostrarà lo grop coma organizator.",
"The events you created are not shown here.": "Aquí apareissan los eveniments quavètz creats.",
"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.": "Lo grop serà listat publicament dins los resultats de recèrca e poirà èsser suggerit sus la pagina «Explorar». Sonque las informacions publicas seràn mostradas sus la pagina.",
"The instance administrator is the person or entity that runs this Mobilizon instance.": "Ladministrator de linstància es la persona o entitat que gerís aquesta instància Mobilizon.",
"The member was removed from the group {group}": "Lo membre foguèt suprimit del grop {group}",
@ -741,6 +758,7 @@
"The {default_terms} will be used. They will be translated in the user's language.": "Los {default_terms} seràn utilizat. Seràn traduches dins la lenga de lutilizaire.",
"There are {participants} participants.": "I a pas quun participant | I a {participants} participants.",
"There will be no way to recover your data.": "I aurà pas cap de biais de recuperar vòstras donadas.",
"There's no discussions yet": "I a pas cap de discussions",
"These events may interest you": "Aquestes eveniments pòdon vos interessar",
"This Mobilizon instance and this event organizer allows anonymous participations, but requires validation through email confirmation.": "Aquesta instància Mobilizon e lorganizaire de leveniment permeton las participacions anonimas, mas aquò requerís una validacion per email.",
"This URL is not supported": "Aquesta URL es pas compotibla",
@ -781,9 +799,11 @@
"Tomorrow": "Deman",
"Transfer to {outsideDomain}": "Transferit a {outsideDomain}",
"Type": "Tipe",
"Type or select a date…": "Picatz o seleccionatz una data…",
"URL": "URL",
"URL copied to clipboard": "URL copiada al quicha-papièrs",
"Unable to detect timezone.": "Deteccion impossibla de la zòna orària.",
"Unable to save your participation in this browser.": "Fracàs de la salvagarda de vòstra participacion dins aqueste navegador.",
"Unfortunately, this instance isn't opened to registrations": "Malaürosament, aquesta instància es pas dubèrta a las inscripcions",
"Unfortunately, your participation request was rejected by the organizers.": "Malaürosament, vòstra demanda de participacion es estada refusada pels organizators.",
"Unknown": "Desconegut",
@ -808,6 +828,7 @@
"Users": "Utilizaires",
"View a reply": "|Veire una responsa|Veire {totalReplies} responsas",
"View all": "O veire tot",
"View all events": "Veire totes eveniments",
"View all posts": "Veire totas las publicacions",
"View all resources": "Veire totas las ressorsas",
"View all todos": "Veire totes los todos",
@ -848,6 +869,7 @@
"You are already logged-in.": "Sètz ja connectat.",
"You are an organizer.": "Sètz un organizaire.",
"You are not an administrator for this group.": "Sètz pas administrator daqueste grop.",
"You are not part of any group.": "Fasètz pas part de cap de grop.",
"You are participating in this event anonymously": "Participatz a aqueste eveniment dun biais anonim",
"You are participating in this event anonymously but didn't confirm participation": "Participatz a aqueste eveniment dun biais anonim mas avètz pas encara confirmat vòstra participacion",
"You can add tags by hitting the Enter key or by adding a comma": "Podètz ajustar detiquetas en tocant la tòca Entrada o en ajustant una vergula",
@ -856,6 +878,7 @@
"You can try another search term or drag and drop the marker on the map": "Podètz ensajar un autre tèrme de recèrca o botar lo marcador sus la mapa",
"You can't change your password because you are registered through {provider}.": "Podètz pas cambiar vòstre senhal perque sètz enregistrat via {provider}.",
"You can't remove your last identity.": "Podètz pas suprimir vòstra darrièra identitat.",
"You didn't create or join any event yet.": "Avètz pas encara pas creat o participat a un eveniment.",
"You don't follow any instances yet.": "Seguissètz pas cap dinstància pel moment.",
"You have been disconnected": "Sètz estat desconnectat",
"You have been invited by {invitedBy} to the following group:": "{invitedBy} vos a convidat a rejónher lo grop seguent:",
@ -865,6 +888,7 @@
"You have one event today.": "Avètz pas cap deveniment uèi | Avètz un eveniment uèi. | Avètz {count} eveniments uèi",
"You have one event tomorrow.": "Avètz pas cap deveniment deman| Avètz un eveniment deman. | Avètz {count} eveniments deman",
"You may also ask to {resend_confirmation_email}.": "Podètz tanben demandar a {resend_confirmation_email}.",
"You may now close this window, or {return_to_event}.": "Ara podètz tampar aquesta fenèstra o {return_to_event}.",
"You may now close this window.": "Podètz ara tampar aquesta fenèstra.",
"You need to create the group before you create an event.": "Vos cal crear lo grop abans de crear leveniment.",
"You need to login.": "Vos cal vos connectar.",
@ -911,10 +935,14 @@
"as {identity}": "coma {identity}",
"change the world, one byte at a time": "cambiar lo monde, un octet a lencòp",
"contact uninformed": "contacte pas fornit",
"create a group": "crear un grop",
"create an event": "crear un eveniment",
"default Mobilizon privacy policy": "politica de confidencialitat per defaut de Mobilizon",
"default Mobilizon terms": "tèrmes per defaut de Mobilizon",
"digital habits of activists": "los usatges numerics de militants",
"e.g. 10 Rue Jangot": "per exemple : 10 carrièra Jangot",
"explore the events": "explorar los eveniments",
"explore the groups": "explorar los grops",
"firstDayOfWeek": "1",
"fit the needs and uses of the people": "als besonhs e usatges",
"full rules": "règlas complètas",
@ -928,6 +956,7 @@
"report #{report_number}": "lo senhalament #{report_number}",
"resend confirmation email": "tornar enviar lo messatge de confirmacion",
"respect of the fundamental freedoms": "lo respet de las libertats fondamentalas",
"return to the event's page": "tornar a la pagina de leveniment",
"terms of service": "condicions generalas dutilizacion",
"with another identity…": "amb una autra identitat…",
"{actor}'s avatar": "Avatar de {actor}",

View File

@ -36,7 +36,7 @@
"Active": "Aktywny",
"Actor": "Aktor",
"Add": "Dodaj",
"Add / Remove…": "Dodaj/usun…",
"Add / Remove…": "Dodaj/usuń…",
"Add a contact": "Dodaj kontakt",
"Add a group": "Dodaj grupę",
"Add a new post": "Dodaj nowy wpis",
@ -67,7 +67,7 @@
"Anonymous participations": "Anonimowy udział",
"Any day": "Dowolny dzień",
"Anyone can join freely": "Każdy może dołączyć",
"Anyone wanting to be a member from your group will be able to from your group page.": "Każdy, kot chce zostać członkiem Twojej grupy będzie mógł dołączyć ze strony Twojej grupy.",
"Anyone wanting to be a member from your group will be able to from your group page.": "Każdy, kto chce zostać członkiem Twojej grupy będzie mógł dołączyć ze strony Twojej grupy.",
"Application": "Aplikacja",
"Approve": "Zatwierdź",
"Are you really sure you want to delete your whole account? You'll lose everything. Identities, settings, events created, messages and participations will be gone forever.": "Czy na pewno chcesz usunąć całe swoje konto? Stracisz wszystko. Tożsamości, ustawienia, utworzone wydarzenia, wiadomości i uczestnictwa zostaną na zawsze usunięte.",
@ -498,7 +498,7 @@
"Participants": "Uczestnicy",
"Participate": "Weź udział",
"Participate using your email address": "Weź udział używając adresu e-mail",
"Participation approval": "Przyjmowanie uzdiału",
"Participation approval": "Przyjmowanie udziału",
"Participation confirmation": "Zatwierdzanie udziału",
"Participation notifications": "Powiadomienia o udziale",
"Participation requested!": "Poproszono o udział!",

View File

@ -1 +1,67 @@
{}
{
"A user-friendly, emancipatory and ethical tool for gathering, organising, and mobilising.": "É uma ferramenta simples, emanicipatória e ética para juntar, organizar e mobilizar.",
"A validation email was sent to {email}": "Um email de validação, foi enviado para {email}",
"Abandon editing": "Abandonar edição",
"About": "Sobre",
"About Mobilizon": "Sobre o Mobilizon",
"About this event": "Sobre este evento",
"About this instance": "Sobre esta instância",
"Accepted": "Aceite",
"Account": "Conta",
"Add": "Adicionar",
"Add a note": "Adicionar nota",
"Add an address": "Adicionar morada",
"Add an instance": "Adicionar instância",
"Add some tags": "Adicionar tags",
"Add to my calendar": "Adicionar ao meu calendário",
"Additional comments": "Comentários adicionais",
"Admin": "Administrador",
"Admin settings successfully saved.": "Definições de administração gravadas.",
"Administration": "Administração",
"All the places have already been taken": "Todos os lugares estão ocupados|Um lugar está livre|{places} lugares estão livres",
"Allow registrations": "Permitir registos",
"Anonymous participant": "Participante anonimo",
"Anonymous participants will be asked to confirm their participation through e-mail.": "Para os participantes anónimos será pedido para comfirmar a sua participação através do email.",
"Anonymous participations": "Participação anónima",
"Are you really sure you want to delete your whole account? You'll lose everything. Identities, settings, events created, messages and participations will be gone forever.": "Tens a certeza que realmente queres apagar a tua conta? Vais perder tudo. Identidades, defenições, eventos criados, mensagens e participações vão desaparecer para sempre.",
"Are you sure you want to <b>delete</b> this comment? This action cannot be undone.": "Tens a certeza que queres <b>apagar</b> este comentário? Esta acção não pode ser desfeita.",
"Are you sure you want to <b>delete</b> this event? This action cannot be undone. You may want to engage the discussion with the event creator or edit its event instead.": "Tens a certeza que queres <b>apagar</b> este evento? Esta acção não pode ser desfeita. Talvez queiras impulsionar uma discussão com o criador deste evento ou apenas editar este evento.",
"Are you sure you want to cancel the event creation? You'll lose all modifications.": "Tens a certeza que queres cancelar a criação deste evento? Vais perder todas as modificações.",
"Are you sure you want to cancel the event edition? You'll lose all modifications.": "Tens a certeza que queres cancelar esta edição de evento? Vais perder todas as modificações.",
"Are you sure you want to cancel your participation at event \"{title}\"?": "Tens a certeza que queres cancelar a participação no evento \"{title}\"?",
"Are you sure you want to delete this event? This action cannot be reverted.": "Tens a certeza que queres apagar a participação no evento ? A tua acção não pode ser revertida.",
"Avatar": "Avatar",
"Back to previous page": "Voltar à página anterior",
"Before you can login, you need to click on the link inside it to validate your account.": "Antes de entrar, precisas de clicar no link dentro para validar a tua conta.",
"By @{username}": "Por @{username}",
"Cancel": "Cancelar",
"Cancel anonymous participation": "Cancelar participação anónima",
"Cancel creation": "Aborto",
"Cancel edition": "Cancelar edição",
"Cancel my participation request…": "Cancelar o meu pedido de participação…",
"Cancel my participation…": "Cancelar a minha participação…",
"Cancelled: Won't happen": "Cancelado: Não acontecerá",
"Change": "Mudar",
"Change my email": "Mudar o meu email",
"Change my identity…": "Mudar a minha identidade…",
"Change my password": "Mudar a minha palavra-passe",
"Clear": "Limpar",
"Click to select": "Clicar para selecionar",
"Click to upload": "Clicar para carregar",
"Close": "Fechar",
"Close comments for all (except for admins)": "Fechar os comentários para todos ( excepto administradores)",
"Closed": "Fechado",
"Comment deleted": "Apagar comentário",
"Comment from @{username} reported": "Comentário de @ {username} reportado",
"Comments": "Comentário",
"Confirm my participation": "Comfirmar a minha participação",
"Confirm my particpation": "Confirmar a minha participação",
"Confirmed: Will happen": "Confirmado: Vai acontecer",
"Continue editing": "Continuar a editar",
"Country": "País",
"Create a new event": "Criar um novo evento",
"Create a new group": "Criar um novo grupo",
"Create a new identity": "Criar uma nova identidade",
"Create group": "Criar grupo",
"Please do not use it in any real way.": "Por favor não utilize isto para eventos reais."
}

467
js/src/i18n/sl.json Normal file
View File

@ -0,0 +1,467 @@
{
"(Masked)": "(Maskirano)",
"@{group}": "@{group}",
"@{username} ({role})": "@{username} ({role})",
"A user-friendly, emancipatory and ethical tool for gathering, organising, and mobilising.": "Uporabniku prijazno, emancipatorno in etično orodje za zbiranje, organiziranje in mobilizacijo.",
"A validation email was sent to {email}": "E-pošta za potrditev je bla poslana na {email}",
"Abandon editing": "Opusti urejanje",
"About Mobilizon": "O Mobilizon-u",
"About this event": "O tem dogodku",
"About this instance": "O tem vozlišču",
"Accept": "Sprejmi",
"Accepted": "Sprejet",
"Account": "Račun",
"Actor": "Igralec",
"Add": "Dodaj",
"Add a group": "Dodaj supino",
"Add a note": "Dodaj opombo",
"Add a todo": "Dodaj opravilo",
"Add an address": "Dodaj naslov",
"Add an instance": "Dodaj vozlišče",
"Add some tags": "Dodaj oznake",
"Add to my calendar": "Dodaj v moj koledar",
"Additional comments": "Dodatni komentarji",
"Admin": "Skrbnik",
"Admin settings successfully saved.": "Nastavitve skrbnika so bile uspešno shranjene.",
"Administration": "Skrbništvo",
"All the places have already been taken": "Vsa mesta so zasedena|Eno mesto je še na voljo|{places} mest je še na voljo",
"Allow registrations": "Dovoli registracije",
"Anonymous participant": "Anonimni udeleženec",
"Anonymous participants will be asked to confirm their participation through e-mail.": "Anonimni udeleženci bodo morali svojo udeležbo potrditi preko e-pošte.",
"Anonymous participations": "Anonimni udeleženci",
"Are you really sure you want to delete your whole account? You'll lose everything. Identities, settings, events created, messages and participations will be gone forever.": "Ali ste prepričani, da želite izbrisati celoten račun? Izgubili boste vse. Identitete, nastavitve, ustvarjeni dogodki, sporočila in udeležbe bodo za vedno izbrisane.",
"Are you sure you want to <b>delete</b> this comment? This action cannot be undone.": "Ali ste prepričani, da želite <b>izbrisati</b> ta komentar? Tega dejanja ni mogoče razveljaviti.",
"Are you sure you want to <b>delete</b> this event? This action cannot be undone. You may want to engage the discussion with the event creator or edit its event instead.": "Ali ste prepričani, da želite <b>izbrisati</b> ta dogodek? Tega dejanja ni mogoče razveljaviti. Morda boste želeli sodelovati v razpravi z ustvarjalcem dogodka ali urediti njegov dogodek.",
"Are you sure you want to cancel the event creation? You'll lose all modifications.": "Ali ste prepričani, da želite preklicati ustvarjanje dogodka? Izgubili boste vse spremembe.",
"Are you sure you want to cancel the event edition? You'll lose all modifications.": "",
"Are you sure you want to cancel your participation at event \"{title}\"?": "Ali ste prepričani, da želite preklicati udeležbo na dogodku \"{title}\"?",
"Are you sure you want to delete this event? This action cannot be reverted.": "Ali ste prepričani, da želite izbrisati ta dogodek? Tega dejanja ni mogoče razveljaviti.",
"Assigned to": "Dodeljeno",
"Avatar": "Podoba",
"Back to previous page": "Nazaj na prejšnjo stran",
"Before you can login, you need to click on the link inside it to validate your account.": "Preden se lahko prijavite, morate klikniti na povezavo znotraj njega, da potrdite svoj račun.",
"Bold": "Krepko",
"By @{group}": "Avtor @{group}",
"By @{username}": "Od @{username}",
"Cancel": "Prekliči",
"Cancel anonymous participation": "Prekliči anonimno udeležbo",
"Cancel creation": "Prekliči ustvarjanje",
"Cancel edition": "",
"Cancel my participation request…": "Prekliči mojo prošnjo za udeležbo …",
"Cancel my participation…": "Prekliči mojo udeležbo …",
"Cancelled: Won't happen": "Preklicano: Ne bo se zgodilo",
"Change": "Spremeni",
"Change my email": "Spremeni moj e-poštni naslov",
"Change my identity…": "Spremeni mojo identiteto …",
"Change my password": "Spremeni moje geslo",
"Clear": "Izbriši",
"Click to select": "Kliknite za izbiro",
"Click to upload": "Kliknite za pošiljanje",
"Close": "Zapri",
"Close comments for all (except for admins)": "Zapri komentarje za vse (razen za skrbnike)",
"Closed": "Zaprto",
"Comment deleted": "Komentar je izbrisan",
"Comment from @{username} reported": "Prijavljen je bil komentar uporabnika @{username}",
"Comments": "Komentarji",
"Confirm my participation": "Potrdi mojo udeležbo",
"Confirm my particpation": "Potrdi mojo udeležbo",
"Confirmed: Will happen": "Potrjeno: Zgodilo se bo",
"Contact": "Kontakt",
"Continue editing": "Nadaljuj z urejanjem",
"Country": "Država",
"Create": "Ustvari",
"Create a calc": "Ustvari tabelo",
"Create a new event": "Ustvari nov dogodek",
"Create a new group": "Ustvari novo skupino",
"Create a new identity": "Ustvari novo identiteto",
"Create a new list": "Ustvari nov seznam",
"Create a pad": "Ustvari zapisnik",
"Create a videoconference": "Ustvari videokonferenco",
"Create group": "Ustvari skupino",
"Create my event": "Ustvari moj dogodek",
"Create my group": "Ustvari mojo skupino",
"Create my profile": "Ustvari moj profil",
"Create resource": "Ustvari vir",
"Create token": "Ustvari žeton",
"Current identity has been changed to {identityName} in order to manage this event.": "Trenutna identiteta je bila spremenjena v {identityName}, da bi lahko upravljali ta dogodek.",
"Current page": "Trenutna stran",
"Custom": "Po meri",
"Custom URL": "URL po meri",
"Custom text": "Besedilo po meri",
"Dashboard": "Nadzorna plošča",
"Date": "Datum",
"Date and time": "Datum in čas",
"Date and time settings": "Nastavitve datuma in ure",
"Date parameters": "Parametri datuma",
"Decline": "Zavrni",
"Default": "Privzeto",
"Delete": "Izbriši",
"Delete Comment": "Izbriši komentar",
"Delete Event": "Izbriši dogodek",
"Delete account": "Izbriši račun",
"Delete event": "Izbriši dogodek",
"Delete everything": "Izbriši vse",
"Delete my account": "Izbriši moj račun",
"Delete this identity": "Izbriši to identiteto",
"Delete your identity": "Izbriši svojo identiteto",
"Delete {eventTitle}": "Izbriši {eventTitle}",
"Delete {preferredUsername}": "Izbriši {preferredUsername}",
"Deleting comment": "Brisanje komentarja",
"Deleting event": "Brisanje dogodka",
"Deleting my account will delete all of my identities.": "Če izbrišete račun, se izbrišejo vse moje identitete.",
"Deleting your Mobilizon account": "Brisanje računa Mobilizon",
"Description": "Opis",
"Discussions": "Razprave",
"Display name": "Prikazno ime",
"Display participation price": "Prikaži ceno udeležbe",
"Domain": "Domena",
"Draft": "Osnutek",
"Drafts": "Osnutki",
"Due on": "Do",
"Duplicate": "Podvojiti",
"Edit": "Uredi",
"Eg: Stockholm, Dance, Chess…": "Npr.: Stockholm, ples, šah …",
"Either on the {instance} instance or on another instance.": "Ali na vozlišču {instance}, ali na drugem.",
"Either the account is already validated, either the validation token is incorrect.": "Ali je račun že potrjen, ali je žeton za preverjanje veljavnosti napačen.",
"Either the email has already been changed, either the validation token is incorrect.": "Ali je bil e-poštni naslov že spremenjen, ali je žeton za preverjanje veljavnosti napačen.",
"Either the participation request has already been validated, either the validation token is incorrect.": "Ali je bila prošnja za udeležbo že potrjena, ali je žeton za preverjanje veljavnosti napačen.",
"Email": "E-pošta",
"Email notifications": "Obvestila po e-pošti",
"Ends on…": "Se konča …",
"Enter the link URL": "Vnesite URL povezave",
"Error while changing email": "Napaka pri spreminjanju e-poštnega naslova",
"Error while validating account": "Napaka pri preverjanju veljavnosti računa",
"Error while validating participation request": "Napaka pri preverjanju veljavnosti računa",
"Event": "Dogodek",
"Event already passed": "Dogodek je že minil",
"Event cancelled": "Dogodek preklican",
"Event creation": "Ustvarjanje dogodkov",
"Event list": "Seznam dogodkov",
"Event page settings": "Nastavitve dogodka",
"Event to be confirmed": "Dogodek bo potrjen",
"Event {eventTitle} deleted": "Dogodek {eventTitle} je izbrisan",
"Event {eventTitle} reported": "Dogodek {eventTitle} je prijavljen",
"Events": "Dogodki",
"Ex: mobilizon.fr": "Npr.: mobilizon.fr",
"Ex: someone@mobilizon.org": "Npr.: nekdo@mobilizon.org",
"Explore": "Razišči",
"Failed to save admin settings": "Skrbniških nastavitev ni bilo mogoče shraniti",
"Featured events": "Izbrani dogodki",
"Find an address": "Poišči naslov",
"Find an instance": "Poišči vozlišče",
"Followers": "Sledilci",
"Followings": "",
"For instance: London, Taekwondo, Architecture…": "Na primer: London, taekwondo, arhitektura …",
"Forgot your password ?": "Ste pozabili geslo?",
"From the {startDate} at {startTime} to the {endDate}": "Od {startDate} ob {startTime}, do {endDate}",
"From the {startDate} at {startTime} to the {endDate} at {endTime}": "Od {startDate} ob {startTime}, do {endDate} ob {endTime}",
"From the {startDate} to the {endDate}": "Od {startDate}, do {endDate}",
"Gather ⋅ Organize ⋅ Mobilize": "Zberite ⋅ Organizirajte ⋅ Mobilizirajte",
"General": "Splošno",
"General information": "Splošne informacije",
"Getting location": "Pridobivanje lokacije",
"Go": "Pojdi",
"Group Members": "Člani skupine",
"Group name": "Ime skupine",
"Group {displayName} created": "Skupina {displayName} je ustvarjena",
"Groups": "Skupine",
"Headline picture": "Naslovna slika",
"Hide replies": "Skrij odgovore",
"Home": "Domov",
"I create an identity": "Ustvarim identiteto",
"I don't have a Mobilizon account": "Nimam Mobilizon računa",
"I have a Mobilizon account": "Imam Mobilizon račun",
"I have an account on another Mobilizon instance.": "Imam račun na drugem Mobilizon vozlišču.",
"I participate": "Sodelujem",
"I want to allow people to participate without an account.": "Ljudem želim omogočiti udeležbo brez računa.",
"I want to approve every participation request": "Želim odobriti vsako prošnjo za udeležbo",
"Identity {displayName} created": "Identiteta {displayName} je ustvarjena",
"Identity {displayName} deleted": "Identiteta {displayName} je izbrisana",
"Identity {displayName} updated": "Identiteta {displayName} je posodobljena",
"If an account with this email exists, we just sent another confirmation email to {email}": "Če račun s tem e-poštnim naslovom obstaja, smo pravkar poslali novo potrditveno e-pošto na {email}",
"If this identity is the only administrator of some groups, you need to delete them before being able to delete this identity.": "Če je ta identiteta edini skrbnik katerih skupin, jih morate izbrisati, preden lahko izbrišete identiteto.",
"If you want, you may send a message to the event organizer here.": "Če želite, lahko tukaj pošljete sporočilo organizatorju dogodka.",
"Instance Name": "Ime vozlišča",
"Instance Terms": "Pogoji uporabe vozlišča",
"Instance Terms Source": "Viri pogojev uporabe vozlišča",
"Instance Terms URL": "URL pogojev uporabe vozlišča",
"Instance settings": "Nastavitve vozlišča",
"Instances": "Vozlišča",
"Invite a new member": "Povabi novega člana",
"Invite member": "Povabi člana",
"Italic": "Ležeče",
"Join <b>{instance}</b>, a Mobilizon instance": "Pridruži se <b>{instance}</b>, ki je Mobilizon vozlišče",
"Last published event": "Zadnji objavljeni dogodek",
"Last week": "Prejšnji teden",
"Latest posts": "Zadnje objave",
"Learn more about Mobilizon": "Preberite več o Mobilizonu",
"Leave event": "Zapusti dogodek",
"Leaving event \"{title}\"": "Zapuščanje dogodka »{title}«",
"License": "Licenca",
"Limited number of places": "Omejeno število mest",
"List title": "Naslov seznama",
"Load more": "Naloži več",
"Location": "Lokacija",
"Log in": "Vpiši se",
"Log out": "Odjava",
"Login": "Prijava",
"Login on Mobilizon!": "Prijava v Mobilizon!",
"Login on {instance}": "Prijava v {instance}",
"Manage participations": "Upravljaj udeležbe",
"Mark as resolved": "Označi kot razrešeno",
"Members": "Člani",
"Message": "Sporočilo",
"Mobilizon is a federated network. You can interact with this event from a different server.": "Mobilizon je združeno omrežje. S tem dogodkom lahko komunicirate z drugega strežnika.",
"Moderated comments (shown after approval)": "Moderirani komentarji (prikazani po odobritvi)",
"Moderation log": "Dnevnik moderiranja",
"Move": "Premakni",
"My account": "Moj račun",
"My events": "Moji dogodki",
"My groups": "Moje skupine",
"My identities": "Moje identitete",
"Name": "Ime",
"New email": "Nov e-poštni naslov",
"New folder": "Nova mapa",
"New link": "Nova povezava",
"New note": "Nova opomba",
"New password": "Novo geslo",
"New profile": "Nov profil",
"Next page": "Naslednja stran",
"No address defined": "Naslov ni določen",
"No closed reports yet": "Še ni zaključenih poročil",
"No comment": "Brez komentarja",
"No comments yet": "Še brez komentarja",
"No end date": "Brez končnega datuma",
"No events found": "Najdenih ni nobenih dogodkov",
"No group found": "Najdena ni nobena skupina",
"No groups found": "Najdenih ni nobenih skupin",
"No instance follows your instance yet.": "Še nobeno vozlišče ne sledi vašemu vozlišču.",
"No instance to approve|Approve instance|Approve {number} instances": "Nobenega vozlišča za odobritev|Odobri vozlišče|Odobri {number} vozlišč",
"No instance to reject|Reject instance|Reject {number} instances": "Nobenega vozlišča za zavrnitev|Zavrni vozlišče|Zavrni {number} vozlišč",
"No instance to remove|Remove instance|Remove {number} instances": "Nobenega vozlišča za odstranitev|Odstrani vozlišče|Odstrani {number} vozlišč",
"No message": "Ni sporočil",
"No one is going to this event": "Nihče ne gre na ta dogodek|Ena oseba gre|{going} oseb gre",
"No open reports yet": "Še ni odprtih poročil",
"No participant to approve|Approve participant|Approve {number} participants": "Nobenega udeleženca za odobritev|Odobri udeleženca|Odobri {number} udeležencev",
"No participant to reject|Reject participant|Reject {number} participants": "Nobenega udeleženca za zavrnitev|Zavrni udeleženca|Zavrni {number} udeležencev",
"No public upcoming events": "Ni javnih prihajajočih dogodkov",
"No resolved reports yet": "Še ni razrešenih poročil",
"No resources selected": "Izbran ni noben vir|En vir je izbran|{count} virov je izbranih",
"No results for \"{queryText}\"": "Ni rezultatov za \"{queryText}\"",
"Notes": "Opombe",
"Notification on the day of the event": "Obvestilo na dan dogodka",
"Number of places": "Število mest",
"OK": "V redu",
"Old password": "Staro geslo",
"On {date}": "{date}",
"On {date} ending at {endTime}": "{date}, do {endTime}",
"On {date} from {startTime} to {endTime}": "{date}, od {startTime} do {endTime}",
"On {date} starting at {startTime}": "{date}, ob {startTime}",
"Only accessible through link (private)": "Dostopno samo prek povezave (zasebno)",
"Only alphanumeric lowercased characters and underscores are supported.": "Podprte so samo alfanumerične male črke in podčrtaji.",
"Open": "Odpri",
"Opened reports": "Odprta poročila",
"Or": "Ali",
"Organized": "Organizirano",
"Organized by {name}": "Organizira {name}",
"Organizer": "Organizator",
"Organizers": "Organizatorji",
"Other software may also support this.": "To lahko podpira tudi druga programska oprema.",
"Otherwise this identity will just be removed from the group administrators.": "V nasprotnem primeru bo ta identiteta odstranjena samo iz skupine skrbnikov.",
"Page": "Stran",
"Page limited to my group (asks for auth)": "Stran je omejena na mojo skupino (prosi za avtorizacijo)",
"Participant": "Udeleženec",
"Participants": "Udeleženci",
"Participate": "Udeleži se",
"Participate using your email address": "Udeleži se s svojim e-poštnim naslovom",
"Participation approval": "Odobritev udeležbe",
"Participation confirmation": "Potrditev udeležbe",
"Participation requested!": "Udeležba zahtevana!",
"Password": "Geslo",
"Password (confirmation)": "Geslo (potrditev)",
"Password reset": "Ponastavitev gesla",
"Past events": "Pretekli dogodki",
"Pending": "Na čakanju",
"Pick a group": "Izberi skupino",
"Pick an identity": "Izberi si identiteto",
"Please check your spam folder if you didn't receive the email.": "Če niste prejeli e-pošte, preverite mapo z vsiljeno pošto.",
"Please contact this instance's Mobilizon admin if you think this is a mistake.": "Če menite, da gre za napako, se obrnite na skrbnika tega Mobilizon vozlišča.",
"Please do not use it in any real way.": "Prosim, ne uporabljajte ga na noben resen način.",
"Please enter your password to confirm this action.": "Vnesite svoje geslo, da potrdite to dejanje.",
"Please make sure the address is correct and that the page hasn't been moved.": "Prepričajte se, da je naslov pravilen in da stran ni bila premaknjena.",
"Post a comment": "Objavi komentar",
"Post a reply": "Objavi odgovor",
"Postal Code": "Poštna številka",
"Preferences": "Možnosti",
"Previous page": "Prejšnja stran",
"Privacy Policy": "Pravilnik o zasebnosti",
"Private event": "Zasebni dogodek",
"Private feeds": "Zasebni viri",
"Profiles": "Profili",
"Public": "Javno",
"Public RSS/Atom Feed": "Javni vir RSS/Atom",
"Public comment moderation": "Moderiranje javnih komentarjev",
"Public event": "Javni dogodek",
"Public feeds": "Javni viri",
"Public iCal Feed": "Javni vir iCal",
"Public page": "Javna stran",
"Publish": "Objavi",
"Published events with <b>{comments}</b> comments and <b>{participations}</b> confirmed participations": "Objavljeni dogodki s <b>{comments}</b> komentarji in <b>{participations}</b> potrjenimi udeležbami",
"RSS/Atom Feed": "Vir RSS/Atom",
"Recap every week": "Povzetek vsak teden",
"Region": "Regija",
"Registration is allowed, anyone can register.": "Registracija je dovoljena, prijavi se lahko vsak.",
"Registration is closed.": "Registracija je zaprta.",
"Registration is currently closed.": "Registracija je trenutno zaprta.",
"Rejected": "Zavrnjeno",
"Rename": "Preimenuj",
"Rename resource": "Preimenuj vir",
"Reopen": "Ponovno odprto",
"Reply": "Odgovori",
"Report": "Prijavi",
"Report this comment": "Prijavi ta komentar",
"Report this event": "Prijavi ta dogodek",
"Reported": "Prijavljeno",
"Reported by": "Prijavil",
"Reported by someone on {domain}": "Prijavil nekdo na {domain}",
"Reported by {reporter}": "Prijavil {reporter}",
"Reported identity": "Prijavljena identiteta",
"Reports": "Prijave",
"Reset my password": "Ponastavi geslo",
"Resolved": "Razrešeno",
"Resource provided is not an URL": "Navedeni vir ni URL",
"Resources": "Viri",
"Role": "Vloga",
"Save": "Shrani",
"Save draft": "Shrani osnutek",
"Search": "Poišči",
"Search events, groups, etc.": "Poišči dogodke, skupine itd.",
"Searching…": "Iskanje…",
"Send email": "Pošlji e-pošto",
"Send the report": "Pošlji prijavo",
"Set an URL to a page with your own terms.": "Nastavi URL na stran s svojimi pogoji.",
"Settings": "Nastavitve",
"Share this event": "Daj dogodek v skupno rabo",
"Show map": "Pokaži zemljevid",
"Show remaining number of places": "Prikaži preostalo število mest",
"Show the time when the event begins": "Prikaži uro, ko se dogodek začne",
"Show the time when the event ends": "Prikaži uro, ko se dogodek konča",
"Sign up": "Vpis",
"Starts on…": "Začne se…",
"Status": "Stanje",
"Street": "Ulica",
"Task lists": "Seznami nalog",
"Tentative: Will be confirmed later": "Okvirno: kasneje bo potrjeno",
"Terms": "Pogoji",
"Text": "Tekst",
"The account's email address was changed. Check your emails to verify it.": "E-poštni naslov računa je bil spremenjen. Poglejte e-pošto, da preverite naslov.",
"The actual number of participants may differ, as this event is hosted on another instance.": "Dejansko število udeležencev se lahko razlikuje, saj ta dogodek gosti drugo vozlišče.",
"The content came from another server. Transfer an anonymous copy of the report?": "Vsebina je prišla z drugega strežnika. Želite prenesti anonimno kopijo poročila?",
"The draft event has been updated": "Osnutek dogodka je posodobljen",
"The event has been created as a draft": "Dogodek je ustvarjen kot osnutek",
"The event has been published": "Dogodek je objavljen",
"The event has been updated": "Dogodek je posodobljen",
"The event has been updated and published": "Dogodek je posodobljen in objavljen",
"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?": "Organizator dogodka se je odločil, da ročno potrdi udeležbe. Ali želite dodati kratko opombo, da razložite, zakaj želite sodelovati na tem dogodku?",
"The event organizer didn't add any description.": "Organizator dogodka ni dodal nobenega opisa.",
"The event organizer manually approves participations. Since you've chosen to participate without an account, please explain why you want to participate to this event.": "Organizator dogodka ročno odobri udeležbe. Ker ste se odločili za udeležbo brez računa, pojasnite, zakaj želite sodelovati na tem dogodku.",
"The event title will be ellipsed.": "Naslov dogodka bo zatemnjen.",
"The event will show the group as organizer.": "Na dogodku bo skupina prikazana kot organizator.",
"The page you're looking for doesn't exist.": "Stran, ki jo iščete, ne obstaja.",
"The password was successfully changed": "Geslo je bilo uspešno spremenjeno",
"The report will be sent to the moderators of your instance. You can explain why you report this content below.": "Poročilo bo poslano moderatorjem vašega vozlišča. Spodaj lahko razložite, zakaj prijavljate to vsebino.",
"The {default_terms} will be used. They will be translated in the user's language.": "Uporabljeni bodo {default_terms}. Prevedeni bodo v uporabnikov jezik.",
"There are {participants} participants.": "Sodeluje {participants} udeležencev.",
"There will be no way to recover your data.": "Vaših podatkov ne bo mogoče obnoviti.",
"These events may interest you": "Ti dogodki vas lahko zanimajo",
"This Mobilizon instance and this event organizer allows anonymous participations, but requires validation through email confirmation.": "To Mobilizon vozlišče in organizator dogodkov omogočata anonimne udeležbe, vendar zahtevata potrditev po e-pošti.",
"This identity is not a member of any group.": "Ta identiteta ni članica nobene skupine.",
"This information is saved only on your computer. Click for details": "Ti podatki so shranjeni samo na vašem računalniku. Kliknite za podrobnosti",
"This instance isn't opened to registrations, but you can register on other instances.": "To vozlišče ni odprto za registracije, lahko pa se registrirate na drugih vozliščih.",
"This is a demonstration site to test Mobilizon.": "To je demonstracijska stran za preizkušanje Mobilizona.",
"This will delete / anonymize all content (events, comments, messages, participations…) created from this identity.": "S tem boste izbrisali / anonimizirali vso vsebino (dogodke, komentarje, sporočila, udeležbe ...), ustvarjeno iz te identitete.",
"Timezone detected as {timezone}.": "Časovni pas je zaznan kot {timezone}.",
"Title": "Naslov",
"To confirm, type your event title \"{eventTitle}\"": "Za potrditev vnesite naslov dogodka \"{eventTitle}\"",
"To confirm, type your identity username \"{preferredUsername}\"": "Za potrditev vnesite svoje uporabniško ime \"{preferredUsername}\"",
"Transfer to {outsideDomain}": "Prenesi na {outsideDomain}",
"Type": "Tip",
"URL": "URL",
"Unfortunately, this instance isn't opened to registrations": "Na žalost tao vozlišče ni odprto za registracije",
"Unfortunately, your participation request was rejected by the organizers.": "Na žalost so organizatorji zavrnili vašo prošnjo za udeležbo.",
"Unknown": "Neznano",
"Unknown actor": "Neznani udeleženec",
"Unknown error.": "Neznana napaka.",
"Unsaved changes": "Neshranjene spremembe",
"Unset group": "Ponastavi skupino",
"Upcoming": "Prihajajoči",
"Upcoming events": "Prihajajoči dogodki",
"Update event {name}": "Posodobi dogodek {name}",
"Update my event": "Posodobi moj dogodek",
"Updated": "Posodobljeno",
"Use my location": "Uporabi mojo lokacijo",
"Username": "Uporabniško ime",
"Users": "Uporabniki",
"View a reply": "|Pokaži en odgovor|Pokaži {totalReplies} odgovorov",
"View event page": "Pokaži stran dogodka",
"View everything": "Pokaži vse",
"View page on {hostname} (in a new window)": "Pokaži stran na {hostname} (v novem oknu)",
"Visible everywhere on the web (public)": "Vidno povsod v spletu (javno)",
"Waiting for organization team approval.": "Čakanje na odobritev organizacijske ekipe.",
"Warning": "Opozorilo",
"We just sent an email to {email}": "Pravkar smo poslali e-pošto na naslov {email}",
"We will redirect you to your instance in order to interact with this event": "Za interakcijo s tem dogodkom vas bomo preusmerili na vaše vozlišče",
"Website": "Spletna stran",
"Website / URL": "URL spletne strani",
"Welcome back {username}!": "Dobrodošli nazaj {username}!",
"Welcome back!": "Dobrodošli nazaj!",
"Welcome to Mobilizon, {username}!": "Dobrodošli na Mobilizonu, {username}!",
"Who can view this event and participate": "Kdo si lahko ogleda ta dogodek in se ga udeleži",
"Write something…": "Napišite nekaj …",
"You are participating in this event anonymously": "Tega dogodka se udeležujete anonimno",
"You are participating in this event anonymously but didn't confirm participation": "Tega dogodka se udeležujete anonimno, vendar niste potrdili udeležbe",
"You can add tags by hitting the Enter key or by adding a comma": "Oznake lahko dodate tako, da pritisnete tipko Enter ali z vejico",
"You can try another search term or drag and drop the marker on the map": "Lahko poskusite z drugim iskalnim izrazom ali povlečete in spustite oznako na zemljevidu",
"You don't follow any instances yet.": "Še nobenega vozlišča ne spremljate.",
"You have been disconnected": "Oklopljeni ste",
"You have been invited by {invitedBy} to the following group:": "{invitedBy} vas je povabil v naslednjo skupino:",
"You have cancelled your participation": "Odpovedali ste udeležbo",
"You have one event in {days} days.": "V {days} dneh nimate dogodkov | V {days} dneh imate en dogodek | V {days} dneh imate {count} dogodkov",
"You have one event today.": "Danes nimate dogodkov | Danes imate en dogodek | Danes imate {count} dogodkov",
"You have one event tomorrow.": "Jutri nimate dogodkov | Jutri imate en dogodek | Jutri imate {count} dogodkov",
"You need to create the group before you create an event.": "Preden ustvarite dogodek, morate ustvariti skupino.",
"You need to login.": "Morate se prijaviti.",
"You will be redirected to the original instance": "Preusmerjeni boste na prvotno vozlišče",
"You wish to participate to the following event": "Želite se udeležiti naslednjega dogodka",
"You'll receive a confirmation email.": "Prejeli boste potrditveno e-pošto.",
"Your account has been successfully deleted": "Vaš račun je uspešno izbrisan",
"Your account has been validated": "Vaš račun je potrjen",
"Your account is being validated": "Vaš račun je v procesu potrjevanja",
"Your account is nearly ready, {username}": "Vaš račun je skoraj pripravljen, {username}",
"Your current email is {email}. You use it to log in.": "Vaš trenutni e-poštni naslov je {email}. Uporabljate ga za prijavo.",
"Your email has been changed": "Vaš e-poštni naslov je bil spremenjen",
"Your email is being changed": "Vaš e-poštni naslov je bil spremenjen",
"Your email will only be used to confirm that you're a real person and send you eventual updates for this event. It will NOT be transmitted to other instances or to the event organizer.": "Vaš e-poštni naslov bo uporabljen samo za potrditev, da ste resnična oseba, in za morebitne posodobitve za ta dogodek. NE bo posredovan drugim vozliščem ali organizatorju dogodka.",
"Your federated identity": "Vaša zvezna identiteta",
"Your participation has been confirmed": "Vaša udeležba je potrjena",
"Your participation has been rejected": "Vaša udeležba je bila zavrnjena",
"Your participation has been requested": "Zahtevana je vaša udeležba",
"Your participation request has been validated": "Vaša udeležba je potrjena",
"Your participation request is being validated": "Vaša udeležba je v procesu potrjevanja",
"Your participation status has been changed": "Vaše stanje udeležbe je bilo spremenjeno",
"Your timezone is currently set to {timezone}.": "Vaš časovni pas je trenutno nastavljen na {timezone}.",
"[This comment has been deleted]": "[Ta komentar je bil izbrisan]",
"[deleted]": "[izbrisano]",
"as {identity}": "kot {identity}",
"default Mobilizon terms": "privzeti pogoji Mobilizona",
"e.g. 10 Rue Jangot": "npr. Kersnikova ulica 4",
"iCal Feed": "vir iCal",
"profile@instance": "profil@vozlišče",
"with another identity…": "z drugo identiteto…",
"{approved} / {total} seats": "{approved} / {total} mest",
"{available}/{capacity} available places": "Prostih mest ni več|{available}/{capacity} prostih mest",
"{count} participants": "Še ni udeležencev | En udeleženec | {count} udeležencev",
"{count} requests waiting": "{count} zahtev čaka",
"{title} ({count} todos)": "{title} ({count} todos)",
"© The OpenStreetMap Contributors": "© The OpenStreetMap Contributors"
}

View File

@ -2,6 +2,7 @@
"<b>Please do not use it in any real way.</b>": "<b>Använd gärna inte det på riktigt.</b>",
"A user-friendly, emancipatory and ethical tool for gathering, organising, and mobilising.": "Ett användarvänligt, frigörande och etiskt verktyg för att samlas, organisera och mobilisera.",
"A validation email was sent to {email}": "Ett valideringsmail skickades till {email}",
"Abandon editing": "Överge redigering",
"Abandon edition": "Överge redigering",
"About": "Om",
"About Mobilizon": "Om Mobilizon",
@ -28,7 +29,9 @@
"Anonymous participants will be asked to confirm their participation through e-mail.": "Anonyma deltagare måste bekräfta sitt deltagande via e-post.",
"Anonymous participations": "Anonyma deltagare",
"Approve": "Godkänn",
"Are you really sure you want to delete your whole account? You'll lose everything. Identities, settings, events created, messages and participations will be gone forever.": "Är du verkligen säker på att du vill ta bort hela ditt konto? Du förlorar allt. Identiteter, inställningar, skapade händelser, meddelanden och deltagande försvinner för alltid.",
"Are you sure you want to <b>delete</b> this comment? This action cannot be undone.": "Är du säker på att du vill <b>radera</b> den här kommentaren? Detta kan inte ångras.",
"Are you sure you want to <b>delete</b> this event? This action cannot be undone. You may want to engage the discussion with the event creator or edit its event instead.": "Är du säker på att du vill <b>radera</b> det här evenemanget? Denna åtgärd kan inte ångras. Du kanske vill delta i diskussionen med evenemangsskaparen eller redigera det istället.",
"Are you sure you want to cancel the event creation? You'll lose all modifications.": "Är du säker på att du vill avbryta evenemangskapandet? Du kommer förlora alla ändringar.",
"Are you sure you want to cancel the event edition? You'll lose all modifications.": "Är du säker på att du vill avbryta evenemangredigeringen? Du kommer förlora alla ändringar.",
"Are you sure you want to cancel your participation at event \"{title}\"?": "Är du säker på att du vill avsluta ditt deltagande i evenemanget \"{title}\"?",
@ -36,6 +39,7 @@
"Avatar": "Avatar",
"Back to previous page": "Tillbaka till föregående sida",
"Before you can login, you need to click on the link inside it to validate your account.": "Innan du loggar in måste du klicka på länken inuti det för att validera ditt konto.",
"By @{group}": "Av @{group}",
"By @{username}": "Av @{username}",
"By {username} and {group}": "Av {username} och {group}",
"Cancel": "Avbryt",
@ -86,6 +90,7 @@
"Custom text": "Anpassad text",
"Dashboard": "Kontrollpanel",
"Date": "Datum",
"Date and time": "Datum och tid",
"Date and time settings": "Datum- och tidsinställningar",
"Date parameters": "Datumparametrar",
"Default": "Standard",
@ -111,17 +116,22 @@
"Domain": "Domän",
"Draft": "Utkast",
"Drafts": "Utkast",
"Duplicate": "Kopiera",
"Edit": "Redigera",
"Eg: Stockholm, Dance, Chess…": "E.g.: Stockholm, Dans, Schack…",
"Either on the {instance} instance or on another instance.": "Antingen på instansen {instance}, eller någon annan.",
"Either the account is already validated, either the validation token is incorrect.": "Antingen är kontot redan validerat eller så är valideringstoken inkorrekt.",
"Either the email has already been changed, either the validation token is incorrect.": "Antingen så har emailadressen redan ändrats eller så är valideringstoken felaktigt.",
"Either the participation request has already been validated, either the validation token is incorrect.": "Antingen har begäran om deltagande redan validerats eller så är valideringstoken felaktig.",
"Email": "E-post",
"Ends on…": "Slutar…",
"Enjoy discovering Mobilizon!": "Njut av att utforska Mobilizon!",
"Enter the link URL": "Skriv in länken",
"Error while changing email": "Fel vid byte av e-post",
"Error while communicating with the server.": "Fel vid kommunikation med servern.",
"Error while saving report.": "Fel vid sparande av rapport.",
"Error while validating account": "Fel vid validering av konto",
"Error while validating participation request": "Fel vid validering av deltagandeförfrågan",
"Event": "Evenemang",
"Event already passed": "Evenemanget är över",
"Event cancelled": "Evenemanget är inställt",
@ -137,18 +147,22 @@
"Ex: mobilizon.fr": "T.ex: mobilizon.fr",
"Exclude": "Exkludera",
"Explore": "Utforska",
"Explore events": "Utforska evenemang",
"Failed to save admin settings": "Det gick inte att spara admininställningar",
"Featured events": "Utvalda evenemang",
"Features": "Utvalda",
"Federation": "Federation",
"Find an address": "Hitta en adress",
"Find an instance": "Hitta en instans",
"Followers": "Följare",
"For instance: London, Taekwondo, Architecture…": "Till exempel: London, Taekwondo, Arkitektur…",
"For instance: London, Taekwondo, Architecture…": "Till exempel: London, Taekwondo, Arkitektur …",
"Forgot your password ?": "Glömt ditt lösenord?",
"From a birthday party with friends and family to a march for climate change, right now, our gatherings are <b>trapped inside the tech giants platforms</b>. How can we organize, how can we click “Attend,” without <b>providing private data</b> to Facebook or <b>locking ourselves up</b> inside MeetUp?": "Från en födelsedagsfest med vänner och familj till en demonstration för klimatet, just nu är våra evenemang <b>bundna till teknikjättarnas platformer</b>. Hur kan vi organisera, hur kan vi klicka \"Kommer,\" utan att <b>ge upp privat information</b> till Facebook eller <b>låsa upp oss själva</b> i MeetUp?",
"From the {startDate} at {startTime} to the {endDate}": "Från {startDate} klockan {startTime} till {endDate}",
"From the {startDate} at {startTime} to the {endDate} at {endTime}": "Från {startDate} klockan {startTime} till {endDate} klockan {endTime}",
"From the {startDate} to the {endDate}": "Från {startDate} till {endDate}",
"Gather ⋅ Organize ⋅ Mobilize": "Samlas ⋅ Organisera ⋅ Mobilisera",
"General": "Allmänt",
"General information": "Generell information",
"Getting location": "Hämtar plats",
"Going as {name}": "Går under namnet {name}",
@ -160,17 +174,29 @@
"Headline picture": "Huvudbild",
"Hide replies": "Dölj svar",
"I create an identity": "Jag skapar en identitet",
"I don't have a Mobilizon account": "Jag har inget Mobilizon konto",
"I have a Mobilizon account": "Jag har ett Mobilizon konto",
"I have an account on another Mobilizon instance.": "Jag har ett konto i en annan Mobilizon instans.",
"I participate": "Jag deltar",
"I want to allow people to participate without an account.": "Jag vill låta personer utan ett konto delta.",
"I want to approve every participation request": "Jag vill godkänna varje deltagande",
"Identity {displayName} created": "Identiteten {displayName} skapad",
"Identity {displayName} deleted": "Identiteten {displayName} raderad",
"Identity {displayName} updated": "Identiteten {displayName} uppdaterad",
"If an account with this email exists, we just sent another confirmation email to {email}": "Om ett konto med den här e-postadressen finns skickade vi precis ett till bekräftelsemail till {email}",
"If an account with this email exists, we just sent another confirmation email to {email}": "Om ett konto med den här e-postadressen finns skickade vi precis ett till meddelande till {email}",
"If this identity is the only administrator of some groups, you need to delete them before being able to delete this identity.": "Om den här identiteten är den enda administratören av vissa grupper måste du radera dem innan du kan radera den här identiteten.",
"Impossible to login, your email or password seems incorrect.": "Kunde inte logga in, din e-postadress eller ditt lösenord verkar inte stämma.",
"In the meantime, please consider that the software is not (yet) finished. More information {onBlog}.": "Under tiden, kom ihåg att mjukvaran inte är färdig (ännu). Mer information {onBlog}.",
"Installing Mobilizon will allow communities to free themselves from the services of tech giants by creating <b>their own event platform</b>.": "Att installera Mobilizon kommer tillåta gemenskaper att fria sig själva från teknikjättarnas tjänster genom att skapa sina <b>egna platformar för evenamang</b>.",
"Instance Name": "Instansnamn",
"Instance Terms": "Instansvillkor",
"Instance Terms Source": "Instansvillkor source",
"Instance Terms URL": "Instansvillkor URL",
"Instance settings": "Instansinställningar",
"Instances": "Instanser",
"Join <b>{instance}</b>, a Mobilizon instance": "Gå med i <b>{instans}</b>, en Mobilizon instans",
"Join {instance}, a Mobilizon instance": "Gå med i {instance}, en Mobilizon instans",
"Key words": "Nyckelord",
"Last published event": "Senast publicerade evenemang",
"Last week": "Senaste veckan",
"Learn more": "Lär dig mer",
@ -182,6 +208,7 @@
"Limited number of places": "Begränsat antal platser",
"Load more": "Ladda fler",
"Locality": "Plats",
"Location": "Plats",
"Log in": "Logga in",
"Log out": "Logga ut",
"Login": "Logga in",
@ -194,6 +221,7 @@
"Moderated comments (shown after approval)": "Modererade kommentarer (visas när de godkänts)",
"My account": "Mitt konto",
"My events": "Mina evenemang",
"My groups": "Mina grupper",
"My identities": "Mina identiteter",
"Name": "Namn",
"New password": "Nytt lösenord",
@ -207,16 +235,17 @@
"Number of places": "Antal platser",
"OK": "Okej",
"Old password": "Gammalt lösenord",
"On {date}": "Den {date}",
"On {date} ending at {endTime}": "Den {date}, slut klockan {endTime}",
"On {date} from {startTime} to {endTime}": "Den {date} från {startTime} till {endTime}",
"On {date} starting at {startTime}": "Den {date} med start klockan {startTime}",
"On {date}": " {date}",
"On {date} ending at {endTime}": " {date}, slut klockan {endTime}",
"On {date} from {startTime} to {endTime}": " {date} från {startTime} till {endTime}",
"On {date} starting at {startTime}": " {date} med start klockan {startTime}",
"One person is going": "Ingen kommer|En person kommer|{approved} personer kommer",
"Only accessible through link and search (private)": "Endast tillgänglig via länk och sök (privat)",
"Only alphanumeric characters and underscores are supported.": "Endast bokstäver, siffror och understreck stöds.",
"Opened reports": "Öppnade rapporter",
"Organized": "Organiserad",
"Organized by {name}": "Organiserad av {namn}",
"Organized by": "Organiseras av",
"Organized by {name}": "Organiseras av {namn}",
"Organizer": "Organisatör",
"Otherwise this identity will just be removed from the group administrators.": "Annars kommer den här identiteten bara raderas från gruppens administratörer.",
"Page limited to my group (asks for auth)": "Sida begränsad till min grupp (frågar efter autentisering)",
@ -235,10 +264,13 @@
"Pick an identity": "Välj en identitet",
"Please check your spam folder if you didn't receive the email.": "Kolla din spam-folder om du inte fått mailet.",
"Please contact this instance's Mobilizon admin if you think this is a mistake.": "Vänligen kontakta den här instansens Mobilizon-administratör om du tror det här är ett misstag.",
"Please do not use it in any real way.": "Använd det inte på riktigt.",
"Please make sure the address is correct and that the page hasn't been moved.": "Vänligen se till att adressen stämmer och att sidan inte flyttats.",
"Please read the full rules": "Vänligen läs reglerna",
"Please refresh the page and retry.": "Vänligen ladda om sidan och försök igen.",
"Please type at least 5 characters": "Vänligen skriv minst 5 karaktärer",
"Post a comment": "Skriv en kommentar",
"Post a reply": "Skriv ett svar",
"Postal Code": "Postkod",
"Private event": "Privat evenemang",
"Private feeds": "Privata feeds",
@ -250,6 +282,7 @@
"Publish": "Publicera",
"Published events": "Publicerade evenemang",
"RSS/Atom Feed": "RSS/Atom-feed",
"Radius": "Avstånd",
"Read Framasofts statement of intent on the Framablog": "Läs Framasofts uttalande om intention på Framabloggen",
"Region": "Region",
"Register": "Registrera",
@ -259,6 +292,7 @@
"Reject": "Avfärda",
"Rejected": "Avfärdad",
"Rejected participations": "Avfärdade deltaganden",
"Reply": "Svara",
"Report": "Rapportera",
"Report this event": "Rapportera det här evenemanget",
"Requests": "Förfrågningar",
@ -284,6 +318,7 @@
"Status": "Status",
"Street": "Gata",
"Tentative: Will be confirmed later": "Preliminär: Kommer bekräftas senare",
"Terms": "Användarvillkor",
"The content came from another server. Transfer an anonymous copy of the report?": "Innehållet kom rån en annan server. Överför en anonym kopia av rapporten?",
"The current identity doesn't have any permission on this event. You should probably change it.": "Den aktiva identiteten har inga behörigheter på det här evenemanget. Du borde antagligen ändra det.",
"The draft event has been updated": "Utkastet har uppdaterats",
@ -316,8 +351,10 @@
"Upcoming": "Kommande",
"Update event {name}": "Uppdatera evenemang {name}",
"Update my event": "Uppdatera mitt evenemang",
"Use my location": "Använd min plats",
"Username": "Användarnamn",
"Users": "Användare",
"View a reply": "Inga svar|Visa 1 svar|Vsa {totalReplies} svar",
"View event page": "Visa evenemangsidan",
"View everything": "Visa allt",
"View page on {hostname} (in a new window)": "Visa sidan hos {hostname} (öppnas i ett nytt fönster)",
@ -345,7 +382,7 @@
"You have been disconnected": "Du har blivit frånkopplad",
"You have cancelled your participation": "Du har avslutat ditt deltagande",
"You have one event in {days} days.": "Du har inga evenemang under nästa {days} dagar|Du har ett evenemang under nästa {days} dagar.|Du har {count} under nästa {days} dagar",
"You have one event today.": "Du har inga evenemang idag|Du hare ett evenemang idag.|Du har {count} evenemang idag",
"You have one event today.": "Du har inga evenemang idag|Du har ett evenemang idag.|Du har {count} evenemang idag",
"You have one event tomorrow.": "Du har inga evenemang imorgon|Du har ett evenemang imorgon|Du har {count} evenemang imorgon",
"You may also ask to {resend_confirmation_email}.": "Du kan också be om att {resend_confirmation_email}.",
"You need to login.": "Du måste logga in.",
@ -357,6 +394,7 @@
"Your participation has been requested": "Ditt deltagande har förfrågats",
"a decentralised federation protocol": "ett decentraliserat federationsprotokoll",
"e.g. 10 Rue Jangot": "e.g. 10 Rue Jangot",
"explore the events": "utforska evenemang",
"firstDayOfWeek": "0",
"iCal Feed": "iCal-feed",
"interconnect with others like it": "sammanlänka med liknande",

View File

@ -37,5 +37,6 @@ new Vue({
el: "#app",
template: "<App/>",
components: { App },
render: (h) => h(App),
i18n,
});

View File

@ -8,6 +8,7 @@ export enum GroupsRouteName {
GROUP_SETTINGS = "GROUP_SETTINGS",
GROUP_PUBLIC_SETTINGS = "GROUP_PUBLIC_SETTINGS",
GROUP_MEMBERS_SETTINGS = "GROUP_MEMBERS_SETTINGS",
GROUP_FOLLOWERS_SETTINGS = "GROUP_FOLLOWERS_SETTINGS",
RESOURCES = "RESOURCES",
RESOURCE_FOLDER_ROOT = "RESOURCE_FOLDER_ROOT",
RESOURCE_FOLDER = "RESOURCE_FOLDER",
@ -85,6 +86,13 @@ export const groupsRoutes: RouteConfig[] = [
import("../views/Group/GroupMembers.vue"),
props: true,
},
{
path: "followers",
name: GroupsRouteName.GROUP_FOLLOWERS_SETTINGS,
component: (): Promise<EsModuleComponent> =>
import("../views/Group/GroupFollowers.vue"),
props: true,
},
],
},
{

View File

@ -19,6 +19,7 @@ export interface IGroup extends IActor {
organizedEvents: Paginate<IEvent>;
physicalAddress: IAddress;
openness: Openness;
manuallyApprovesFollowers: boolean;
}
export class Group extends Actor implements IGroup {
@ -45,6 +46,8 @@ export class Group extends Actor implements IGroup {
physicalAddress: IAddress = new Address();
manuallyApprovesFollowers = true;
patch(hash: IGroup | Record<string, unknown>): void {
Object.assign(this, hash);
}

View File

@ -27,7 +27,7 @@
</li>
</ul>
</nav>
<section>
<section v-if="isCurrentActorAGroupMember">
<p>
{{
$t(
@ -39,7 +39,7 @@
tag="router-link"
:to="{
name: RouteName.CREATE_DISCUSSION,
params: { preferredUsername: this.preferredUsername },
params: { preferredUsername },
}"
>{{ $t("New discussion") }}</b-button
>
@ -50,18 +50,38 @@
:key="discussion.id"
/>
</div>
<empty-content v-else icon="chat">
{{ $t("There's no discussions yet") }}
</empty-content>
</section>
<section class="section" v-else>
<empty-content icon="chat">
{{ $t("Only group members can access discussions") }}
<template #desc>
<router-link
:to="{ name: RouteName.GROUP, params: { preferredUsername } }"
>
{{ $t("Return to the group page") }}
</router-link>
</template>
</empty-content>
</section>
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue } from "vue-property-decorator";
import { FETCH_GROUP } from "@/graphql/group";
import { IGroup, usernameWithDomain } from "@/types/actor";
import { IActor, IGroup, IPerson, usernameWithDomain } from "@/types/actor";
import DiscussionListItem from "@/components/Discussion/DiscussionListItem.vue";
import RouteName from "../../router/name";
import { MemberRole } from "@/types/enums";
import { CURRENT_ACTOR_CLIENT, PERSON_MEMBERSHIPS } from "@/graphql/actor";
import { GROUP_MEMBERSHIP_SUBSCRIPTION_CHANGED } from "@/graphql/event";
import { IMember } from "@/types/actor/member.model";
import EmptyContent from "@/components/Utils/EmptyContent.vue";
@Component({
components: { DiscussionListItem },
components: { DiscussionListItem, EmptyContent },
apollo: {
group: {
query: FETCH_GROUP,
@ -75,6 +95,30 @@ import RouteName from "../../router/name";
return !this.preferredUsername;
},
},
person: {
query: PERSON_MEMBERSHIPS,
fetchPolicy: "cache-and-network",
variables() {
return {
id: this.currentActor.id,
};
},
subscribeToMore: {
document: GROUP_MEMBERSHIP_SUBSCRIPTION_CHANGED,
variables() {
return {
actorId: this.currentActor.id,
};
},
skip() {
return !this.currentActor || !this.currentActor.id;
},
},
skip() {
return !this.currentActor || !this.currentActor.id;
},
},
currentActor: CURRENT_ACTOR_CLIENT,
},
metaInfo() {
return {
@ -89,11 +133,36 @@ import RouteName from "../../router/name";
export default class DiscussionsList extends Vue {
@Prop({ type: String, required: true }) preferredUsername!: string;
person!: IPerson;
group!: IGroup;
currentActor!: IActor;
RouteName = RouteName;
usernameWithDomain = usernameWithDomain;
get groupMemberships(): (string | undefined)[] {
if (!this.person || !this.person.id) return [];
return this.person.memberships.elements
.filter(
(membership: IMember) =>
![
MemberRole.REJECTED,
MemberRole.NOT_APPROVED,
MemberRole.INVITED,
].includes(membership.role)
)
.map(({ parent: { id } }) => id);
}
get isCurrentActorAGroupMember(): boolean {
return (
this.groupMemberships !== undefined &&
this.groupMemberships.includes(this.group.id)
);
}
}
</script>
<style lang="scss">

View File

@ -33,6 +33,7 @@
<b-field horizontal :label="$t('Starts on…')" class="begins-on-field">
<b-datetimepicker
class="datepicker starts-on"
:placeholder="$t('Type or select a date…')"
icon="calendar-today"
:locale="$i18n.locale"
@ -45,6 +46,7 @@
<b-field horizontal :label="$t('Ends on…')">
<b-datetimepicker
class="datepicker ends-on"
:placeholder="$t('Type or select a date…')"
icon="calendar-today"
:locale="$i18n.locale"
@ -380,6 +382,12 @@ h2.subtitle {
}
}
.datepicker {
::v-deep .dropdown-menu {
z-index: 200;
}
}
section {
& > .container {
padding: 2rem 1.5rem;

View File

@ -166,7 +166,7 @@ export default class CreateGroup extends mixins(IdentityEditionMixin) {
if (this.avatarFile) {
avatarObj = {
avatar: {
picture: {
media: {
name: this.avatarFile.name,
alt: `${this.group.preferredUsername}'s avatar`,
file: this.avatarFile,
@ -178,7 +178,7 @@ export default class CreateGroup extends mixins(IdentityEditionMixin) {
if (this.bannerFile) {
bannerObj = {
banner: {
picture: {
media: {
name: this.bannerFile.name,
alt: `${this.group.preferredUsername}'s banner`,
file: this.bannerFile,

View File

@ -145,7 +145,11 @@
type="is-primary"
>{{ $t("Join group") }}</b-button
>
<b-dropdown aria-role="list" position="is-bottom-left">
<b-dropdown
class="menu-dropdown"
aria-role="list"
position="is-bottom-left"
>
<b-button
slot="trigger"
role="button"
@ -162,6 +166,25 @@
<b-icon icon="flag" />
</span>
</b-dropdown-item>
<hr class="dropdown-divider" />
<b-dropdown-item has-link aria-role="listitem">
<a
:href="`@${preferredUsername}/feed/atom`"
:title="$t('Atom feed for events and posts')"
>
{{ $t("RSS/Atom Feed") }}
<b-icon icon="rss" />
</a>
</b-dropdown-item>
<b-dropdown-item has-link aria-role="listitem">
<a
:href="`@${preferredUsername}/feed/ics`"
:title="$t('ICS feed for events')"
>
{{ $t("ICS/WebCal Feed") }}
<b-icon icon="calendar-sync" />
</a>
</b-dropdown-item>
</b-dropdown>
</p>
</div>
@ -834,5 +857,12 @@ div.container {
margin-top: 2rem;
}
}
.menu-dropdown {
::v-deep .dropdown-item,
::v-deep .has-link a {
padding-right: 1rem;
}
}
}
</style>

View File

@ -0,0 +1,261 @@
<template>
<div>
<nav class="breadcrumb" aria-label="breadcrumbs">
<ul v-if="group">
<li>
<router-link
:to="{
name: RouteName.GROUP,
params: { preferredUsername: usernameWithDomain(group) },
}"
>{{ group.name }}</router-link
>
</li>
<li>
<router-link
:to="{
name: RouteName.GROUP_SETTINGS,
params: { preferredUsername: usernameWithDomain(group) },
}"
>{{ $t("Settings") }}</router-link
>
</li>
<li class="is-active">
<router-link
:to="{
name: RouteName.GROUP_FOLLOWERS_SETTINGS,
params: { preferredUsername: usernameWithDomain(group) },
}"
>{{ $t("Followers") }}</router-link
>
</li>
</ul>
</nav>
<section
class="container section"
v-if="group && isCurrentActorAGroupAdmin"
>
<h1>{{ $t("Group Followers") }} ({{ followers.total }})</h1>
<b-field :label="$t('Status')" horizontal>
<b-switch v-model="pending">{{ $t("Pending") }}</b-switch>
</b-field>
<b-table
v-if="followers"
:data="followers.elements"
ref="queueTable"
:loading="this.$apollo.loading"
paginated
backend-pagination
:current-page.sync="page"
:pagination-simple="true"
:aria-next-label="$t('Next page')"
:aria-previous-label="$t('Previous page')"
:aria-page-label="$t('Page')"
:aria-current-label="$t('Current page')"
:total="followers.total"
:per-page="FOLLOWERS_PER_PAGE"
backend-sorting
:default-sort-direction="'desc'"
:default-sort="['insertedAt', 'desc']"
@page-change="triggerLoadMoreFollowersPageChange"
@sort="(field, order) => $emit('sort', field, order)"
>
<b-table-column
field="actor.preferredUsername"
:label="$t('Follower')"
v-slot="props"
>
<article class="media">
<figure
class="media-left image is-48x48"
v-if="props.row.actor.avatar"
>
<img
class="is-rounded"
:src="props.row.actor.avatar.url"
alt=""
/>
</figure>
<b-icon
class="media-left"
v-else
size="is-large"
icon="account-circle"
/>
<div class="media-content">
<div class="content">
<span v-if="props.row.actor.name">{{
props.row.actor.name
}}</span
><br />
<span class="is-size-7 has-text-grey"
>@{{ usernameWithDomain(props.row.actor) }}</span
>
</div>
</div>
</article>
</b-table-column>
<b-table-column field="insertedAt" :label="$t('Date')" v-slot="props">
<span class="has-text-centered">
{{ props.row.insertedAt | formatDateString }}<br />{{
props.row.insertedAt | formatTimeString
}}
</span>
</b-table-column>
<b-table-column field="actions" :label="$t('Actions')" v-slot="props">
<div class="buttons">
<b-button
v-if="!props.row.approved"
@click="updateFollower(props.row, true)"
icon-left="check"
type="is-success"
>{{ $t("Accept") }}</b-button
>
<b-button
@click="updateFollower(props.row, false)"
icon-left="close"
type="is-danger"
>{{ $t("Reject") }}</b-button
>
</div>
</b-table-column>
<template slot="empty">
<empty-content icon="account" inline>
{{ $t("No follower matches the filters") }}
</empty-content>
</template>
</b-table>
</section>
<b-message v-else-if="group">
{{ $t("You are not an administrator for this group.") }}
</b-message>
</div>
</template>
<script lang="ts">
import { Component, Watch } from "vue-property-decorator";
import GroupMixin from "@/mixins/group";
import { mixins } from "vue-class-component";
import { GROUP_FOLLOWERS, UPDATE_FOLLOWER } from "@/graphql/followers";
import RouteName from "../../router/name";
import { usernameWithDomain } from "../../types/actor";
import EmptyContent from "@/components/Utils/EmptyContent.vue";
import { IFollower } from "@/types/actor/follower.model";
import { Paginate } from "@/types/paginate";
@Component({
apollo: {
followers: {
query: GROUP_FOLLOWERS,
variables() {
return {
name: this.$route.params.preferredUsername,
followersPage: this.page,
followersLimit: this.FOLLOWERS_PER_PAGE,
approved: this.pending === null ? null : !this.pending,
};
},
update: (data) => data.group.followers,
},
},
components: {
EmptyContent,
},
})
export default class GroupFollowers extends mixins(GroupMixin) {
loading = true;
RouteName = RouteName;
page = parseInt((this.$route.query.page as string) || "1", 10);
pending: boolean | null =
(this.$route.query.pending as string) == "1" || null;
FOLLOWERS_PER_PAGE = 1;
usernameWithDomain = usernameWithDomain;
followers!: Paginate<IFollower>;
mounted(): void {
this.page = parseInt((this.$route.query.page as string) || "1", 10);
}
@Watch("page")
triggerLoadMoreFollowersPageChange(page: string): void {
this.$router.replace({
name: RouteName.GROUP_FOLLOWERS_SETTINGS,
query: { ...this.$route.query, page },
});
}
@Watch("pending")
triggerPendingStatusPageChange(pending: boolean): void {
this.$router.replace({
name: RouteName.GROUP_FOLLOWERS_SETTINGS,
query: { ...this.$route.query, ...{ pending: pending ? "1" : "0" } },
});
}
async loadMoreFollowers(): Promise<void> {
const { FOLLOWERS_PER_PAGE, group, page, pending } = this;
await this.$apollo.queries.followers.fetchMore({
// New variables
variables() {
return {
name: usernameWithDomain(group),
followersPage: page,
followersLimit: FOLLOWERS_PER_PAGE,
approved: !pending,
};
},
// Transform the previous result with new data
updateQuery: (previousResult, { fetchMoreResult }) => {
if (!fetchMoreResult) return previousResult;
const oldFollowers = previousResult.group.followers;
const newFollowers = fetchMoreResult.group.followers;
return {
elements: [...oldFollowers.elements, ...newFollowers.elements],
total: newFollowers.total,
__typename: oldFollowers.__typename,
};
},
});
}
async updateFollower(follower: IFollower, approved: boolean): Promise<void> {
const { FOLLOWERS_PER_PAGE, group, page, pending } = this;
try {
await this.$apollo.mutate<{ rejectFollower: IFollower }>({
mutation: UPDATE_FOLLOWER,
variables: {
id: follower.id,
approved,
},
refetchQueries: [
{
query: GROUP_FOLLOWERS,
variables: {
name: usernameWithDomain(group),
followersPage: page,
followersLimit: FOLLOWERS_PER_PAGE,
approved: !pending,
},
},
],
});
this.$notifier.success(
this.$t("@{username}'s follow request was rejected", {
username: follower.actor.preferredUsername,
}) as string
);
} catch (error) {
console.error(error);
if (error.graphQLErrors && error.graphQLErrors.length > 0) {
this.$notifier.error(error.graphQLErrors[0].message);
}
}
}
}
</script>

View File

@ -218,11 +218,9 @@
</div>
</b-table-column>
<template slot="empty">
<section class="section">
<div class="content has-text-grey has-text-centered">
<p>{{ $t("No member matches the filters") }}</p>
</div>
</section>
<empty-content icon="account" inline>
{{ $t("No member matches the filters") }}
</empty-content>
</template>
</b-table>
</section>
@ -247,6 +245,7 @@ import {
UPDATE_MEMBER,
} from "../../graphql/member";
import { usernameWithDomain } from "../../types/actor";
import EmptyContent from "@/components/Utils/EmptyContent.vue";
@Component({
apollo: {
@ -263,6 +262,9 @@ import { usernameWithDomain } from "../../types/actor";
update: (data) => data.group.members,
},
},
components: {
EmptyContent,
},
})
export default class GroupMembers extends mixins(GroupMixin) {
loading = true;

View File

@ -134,6 +134,15 @@
</b-radio>
</div>
<b-field
:label="$t('Followers')"
:message="$t('Followers will receive new public events and posts.')"
>
<b-checkbox v-model="group.manuallyApprovesFollowers">
{{ $t("Manually approve new followers") }}
</b-checkbox>
</b-field>
<full-address-auto-complete
:label="$t('Group address')"
v-model="group.physicalAddress"

View File

@ -16,6 +16,10 @@
:title="this.$t('Members')"
:to="{ name: RouteName.GROUP_MEMBERS_SETTINGS }"
/>
<SettingMenuItem
:title="this.$t('Followers')"
:to="{ name: RouteName.GROUP_FOLLOWERS_SETTINGS }"
/>
</SettingMenuSection>
</ul>
</aside>

View File

@ -267,9 +267,15 @@
<EventCard :event="event" />
</div>
</div>
<b-message v-else type="is-danger">{{
$t("No events found")
}}</b-message>
<b-message v-else type="is-danger"
>{{ $t("No events found") }}<br />
<div v-if="goingToEvents.size > 0 || lastWeekEvents.length > 0">
<b-icon size="is-small" icon="information-outline" />
<small>{{
$t("The events you created are not shown here.")
}}</small>
</div>
</b-message>
</section>
</div>
</div>
@ -452,7 +458,7 @@ export default class Home extends Vue {
);
}
get goingToEvents(): Map<string, Map<string, IParticipant>> {
get thisWeekGoingToEvents(): IParticipant[] {
const res = this.currentUserParticipations.filter(
({ event, role }) =>
event.beginsOn != null &&
@ -464,8 +470,11 @@ export default class Home extends Vue {
(a: IParticipant, b: IParticipant) =>
a.event.beginsOn.getTime() - b.event.beginsOn.getTime()
);
return res;
}
return res.reduce(
get goingToEvents(): Map<string, Map<string, IParticipant>> {
return this.thisWeekGoingToEvents.reduce(
(
acc: Map<string, Map<string, IParticipant>>,
participation: IParticipant
@ -504,7 +513,7 @@ export default class Home extends Vue {
get filteredFeaturedEvents(): IEvent[] {
return this.events.elements.filter(
({ id }) =>
!this.currentUserParticipations
!this.thisWeekGoingToEvents
.filter(
(participation) => participation.role === ParticipantRole.CREATOR
)

View File

@ -6,6 +6,24 @@
<b-notification v-if="$apollo.queries.interact.skip" type="is-danger">
{{ $t("Resource provided is not an URL") }}
</b-notification>
<b-message
:title="$t('Error')"
type="is-danger"
has-icon
:closable="false"
v-if="!$apollo.loading && errors.length > 0"
>
<p v-for="error in errors" :key="error">
<b>{{ error }}</b>
</p>
<p>
{{
$t(
"It is possible that the content is not accessible on this instance, because this instance has blocked the profiles or groups behind this content."
)
}}
</p>
</b-message>
</div>
</template>
@ -34,6 +52,12 @@ import RouteName from "../router/name";
return true;
}
},
error({ graphQLErrors, networkError }) {
if (networkError) {
this.errors = [networkError.message];
}
this.errors = graphQLErrors.map((error) => error.message);
},
async result({ data: { interact } }) {
switch (interact.__typename) {
case "Group":
@ -49,7 +73,7 @@ import RouteName from "../router/name";
});
break;
default:
this.error = this.$t("This URL is not supported");
this.error = [this.$t("This URL is not supported")];
}
// await this.$router.replace({
// name: RouteName.EVENT,
@ -62,7 +86,7 @@ import RouteName from "../router/name";
export default class Interact extends Vue {
interact!: IEvent | IGroup;
error!: string;
errors: string[] = [];
}
</script>
<style lang="scss">

View File

@ -1,10 +1,8 @@
const path = require("path");
const ForkTsCheckerWebpackPlugin = require("fork-ts-checker-webpack-plugin");
const webpack = require("webpack");
module.exports = {
runtimeCompiler: true,
filenameHashing: true,
productionSourceMap: false,
outputDir: path.resolve(__dirname, "../priv/static"),
configureWebpack: (config) => {
// Limit the used memory when building
@ -26,6 +24,12 @@ module.exports = {
forkTsCheckerOptions.memoryLimit = process.env.NODE_BUILD_MEMORY || 2048;
config.plugins.push(new ForkTsCheckerWebpackPlugin(forkTsCheckerOptions));
config.plugins.push(
new webpack.DefinePlugin({
global: "window", // Placeholder for global used in any node_modules
})
);
config.node.global = false;
},
chainWebpack: (config) => {
// remove the prefetch plugin

File diff suppressed because it is too large Load Diff

View File

@ -50,7 +50,6 @@ defmodule Mobilizon.Federation.ActivityPub do
alias Mobilizon.Web.Endpoint
alias Mobilizon.Web.Email.{Admin, Group, Mailer}
alias Mobilizon.Web.Email.Follow, as: FollowMailer
require Logger
@ -320,17 +319,26 @@ defmodule Mobilizon.Federation.ActivityPub do
@doc """
Make an actor follow another
"""
def follow(%Actor{} = follower, %Actor{} = followed, activity_id \\ nil, local \\ true) do
def follow(
%Actor{} = follower,
%Actor{} = followed,
activity_id \\ nil,
local \\ true,
additional \\ %{}
) do
with {:different_actors, true} <- {:different_actors, followed.id != follower.id},
{:ok, %Follower{} = follower} <-
Actors.follow(followed, follower, activity_id, false),
:ok <- FollowMailer.send_notification_to_admins(follower),
follower_as_data <- Convertible.model_to_as(follower),
{:ok, activity} <- create_activity(follower_as_data, local),
{:ok, activity_data, %Follower{} = follower} <-
Types.Actors.follow(
follower,
followed,
local,
Map.merge(additional, %{"activity_id" => activity_id})
),
{:ok, activity} <- create_activity(activity_data, local),
:ok <- maybe_federate(activity) do
{:ok, activity, follower}
else
{:error, err, msg} when err in [:already_following, :suspended] ->
{:error, err, msg} when err in [:already_following, :suspended, :no_person] ->
{:error, msg}
{:different_actors, _} ->
@ -480,7 +488,7 @@ defmodule Mobilizon.Federation.ActivityPub do
"to" => [group_members_url],
"type" => "Remove",
"actor" => moderator_url,
"object" => member.actor.url,
"object" => member.url,
"origin" => group_url
},
{:ok, activity} <- create_activity(remove_data, local),

View File

@ -302,6 +302,10 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do
do_handle_incoming_accept_join(accepted_object, actor)} do
{:ok, activity, object}
else
{:object_not_found, {:error, "Follow already accepted"}} ->
Logger.info("Follow was already accepted. Ignoring.")
:error
{:object_not_found, nil} ->
Logger.warn(
"Unable to process Accept activity #{inspect(id)}. Object #{inspect(accepted_object)} wasn't found."
@ -686,8 +690,7 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do
with {:ok, %Actor{id: moderator_id} = moderator} <-
data |> Utils.get_actor() |> ActivityPub.get_or_fetch_actor_by_url(),
{:ok, %Actor{id: person_id}} <-
object |> Utils.get_url() |> ActivityPub.get_or_fetch_actor_by_url(),
{:ok, person_id} <- get_remove_object(object),
{:ok, %Actor{type: :Group, id: group_id} = group} <-
origin |> Utils.get_url() |> ActivityPub.get_or_fetch_actor_by_url(),
{:is_admin, {:ok, %Member{role: role}}}
@ -762,6 +765,10 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do
{:ok, activity, follow}
else
{:follow, {:ok, %Follower{approved: true} = _follow}} ->
Logger.debug("Follow already accepted")
{:error, "Follow already accepted"}
{:follow, _} ->
Logger.debug(
"Tried to handle an Accept activity but it's not containing a Follow activity"
@ -771,9 +778,6 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do
{:same_actor} ->
{:error, "Actor who accepted the follow wasn't the target. Quite odd."}
{:ok, %Follower{approved: true} = _follow} ->
{:error, "Follow already accepted"}
end
end
@ -1084,4 +1088,16 @@ defmodule Mobilizon.Federation.ActivityPub.Transmogrifier do
err
end
end
# Before 1.0.4 the object of a "Remove" activity was an actor's URL
# instead of the member's URL.
# TODO: Remove in 1.2
@spec get_remove_object(map() | String.t()) :: {:ok, String.t() | integer()}
defp get_remove_object(object) do
case object |> Utils.get_url() |> ActivityPub.fetch_object_from_url() do
{:ok, %Member{actor: %Actor{id: person_id}}} -> {:ok, person_id}
{:ok, %Actor{id: person_id}} -> {:ok, person_id}
_ -> {:error, :remove_object_not_found}
end
end
end

View File

@ -1,7 +1,7 @@
defmodule Mobilizon.Federation.ActivityPub.Types.Actors do
@moduledoc false
alias Mobilizon.Actors
alias Mobilizon.Actors.{Actor, Member}
alias Mobilizon.Actors.{Actor, Follower, Member}
alias Mobilizon.Federation.ActivityPub
alias Mobilizon.Federation.ActivityPub.Audience
alias Mobilizon.Federation.ActivityPub.Types.Entity
@ -9,6 +9,7 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Actors do
alias Mobilizon.GraphQL.API.Utils, as: APIUtils
alias Mobilizon.Service.Formatter.HTML
alias Mobilizon.Service.Notifications.Scheduler
alias Mobilizon.Web.Email.Follow, as: FollowMailer
alias Mobilizon.Web.Endpoint
import Mobilizon.Federation.ActivityPub.Utils, only: [make_create_data: 2, make_update_data: 2]
@ -130,6 +131,18 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Actors do
end
end
def follow(%Actor{} = follower_actor, %Actor{type: type} = followed, _local, additional)
when type != :Person do
with {:ok, %Follower{} = follower} <-
Mobilizon.Actors.follow(followed, follower_actor, additional["activity_id"], false),
:ok <- FollowMailer.send_notification_to_admins(follower),
follower_as_data <- Convertible.model_to_as(follower) do
approve_if_manually_approves_followers(follower, follower_as_data)
end
end
def follow(_, _, _, _), do: {:error, :no_person, "Only group and instances can be followed"}
defp prepare_args_for_actor(args) do
args
|> maybe_sanitize_username()
@ -189,4 +202,21 @@ defmodule Mobilizon.Federation.ActivityPub.Types.Actors do
{:ok, activity_data, member}
end
end
defp approve_if_manually_approves_followers(
%Follower{} = follower,
follow_as_data
) do
unless follower.target_actor.manually_approves_followers do
{:accept,
ActivityPub.accept(
:follow,
follower,
true,
%{"actor" => follower.actor.url}
)}
end
{:ok, follow_as_data, follower}
end
end

View File

@ -34,7 +34,7 @@ defmodule Mobilizon.Federation.ActivityPub.Utils do
%{
"@context" => [
"https://www.w3.org/ns/activitystreams",
"https://litepub.social/litepub/context.jsonld",
"https://litepub.social/context.jsonld",
%{
"sc" => "http://schema.org#",
"ical" => "http://www.w3.org/2002/12/cal/ical#",

View File

@ -123,7 +123,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Admin do
# Changes are stored as %{"key" => "value"} so we need to convert them back as struct
defp convert_changes_to_struct(struct, %{"report_id" => _report_id} = changes) do
with data <- for({key, val} <- changes, into: %{}, do: {String.to_atom(key), val}),
with data <- for({key, val} <- changes, into: %{}, do: {String.to_existing_atom(key), val}),
data <- Map.put(data, :report, Mobilizon.Reports.get_report(data.report_id)) do
struct(struct, data)
end
@ -135,7 +135,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Admin do
for(
{key, val} <- changes,
into: %{},
do: {String.to_atom(key), process_eventual_type(changeset, key, val)}
do: {String.to_existing_atom(key), process_eventual_type(changeset, key, val)}
) do
struct(struct, data)
end
@ -144,11 +144,11 @@ defmodule Mobilizon.GraphQL.Resolvers.Admin do
# datetimes are not unserialized as DateTime/NaiveDateTime so we do it manually with changeset data
defp process_eventual_type(changeset, key, val) do
cond do
changeset[String.to_atom(key)] == :utc_datetime and not is_nil(val) ->
changeset[String.to_existing_atom(key)] == :utc_datetime and not is_nil(val) ->
{:ok, datetime, _} = DateTime.from_iso8601(val)
datetime
changeset[String.to_atom(key)] == :naive_datetime and not is_nil(val) ->
changeset[String.to_existing_atom(key)] == :naive_datetime and not is_nil(val) ->
{:ok, datetime} = NaiveDateTime.from_iso8601(val)
datetime

View File

@ -12,12 +12,53 @@ defmodule Mobilizon.GraphQL.Resolvers.Event do
alias Mobilizon.GraphQL.API
alias Mobilizon.Federation.ActivityPub.Activity
import Mobilizon.Users.Guards, only: [is_moderator: 1]
import Mobilizon.Web.Gettext
# We limit the max number of events that can be retrieved
@event_max_limit 100
@number_of_related_events 3
def organizer_for_event(
%Event{attributed_to_id: attributed_to_id, organizer_actor_id: organizer_actor_id},
_args,
%{context: %{current_user: %User{role: user_role} = user}} = _resolution
)
when not is_nil(attributed_to_id) do
with %Actor{id: group_id} <- Actors.get_actor(attributed_to_id),
%Actor{id: actor_id} <- Users.get_actor_for_user(user),
{:member, true} <-
{:member, Actors.is_member?(actor_id, group_id) or is_moderator(user_role)},
%Actor{} = actor <- Actors.get_actor(organizer_actor_id) do
{:ok, actor}
else
_ -> {:ok, nil}
end
end
def organizer_for_event(
%Event{attributed_to_id: attributed_to_id},
_args,
_resolution
)
when not is_nil(attributed_to_id) do
case Actors.get_actor(attributed_to_id) do
%Actor{} -> {:ok, nil}
_ -> {:error, "Unable to get organizer actor"}
end
end
def organizer_for_event(
%Event{organizer_actor_id: organizer_actor_id},
_args,
_resolution
) do
case Actors.get_actor(organizer_actor_id) do
%Actor{} = actor -> {:ok, actor}
_ -> {:error, "Unable to get organizer actor"}
end
end
def list_events(_parent, %{page: page, limit: limit}, _resolution)
when limit < @event_max_limit do
{:ok, Events.list_events(page, limit)}

View File

@ -0,0 +1,64 @@
defmodule Mobilizon.GraphQL.Resolvers.Followers do
@moduledoc """
Handles the followers-related GraphQL calls.
"""
import Mobilizon.Users.Guards
alias Mobilizon.{Actors, Users}
alias Mobilizon.Actors.{Actor, Follower}
alias Mobilizon.Federation.ActivityPub
alias Mobilizon.Storage.Page
alias Mobilizon.Users.User
@spec find_followers_for_group(Actor.t(), map(), map()) :: {:ok, Page.t()}
def find_followers_for_group(
%Actor{id: group_id} = group,
%{page: page, limit: limit} = args,
%{
context: %{
current_user: %User{role: user_role} = user
}
}
) do
with {:actor, %Actor{id: actor_id} = _actor} <- {:actor, Users.get_actor_for_user(user)},
{:member, true} <-
{:member, Actors.is_moderator?(actor_id, group_id) or is_moderator(user_role)} do
{:ok,
Actors.list_paginated_followers_for_actor(group, Map.get(args, :approved), page, limit)}
else
_ -> {:error, :unauthorized}
end
end
def find_followers_for_group(_, _, _), do: {:error, :unauthenticated}
@spec update_follower(any(), map(), map()) :: {:ok, Follower.t()} | {:error, any()}
def update_follower(_, %{id: follower_id, approved: approved}, %{
context: %{
current_user: %User{} = user
}
}) do
with {:actor, %Actor{id: actor_id} = _actor} <- {:actor, Users.get_actor_for_user(user)},
%Follower{target_actor: %Actor{type: :Group, id: group_id}} = follower <-
Actors.get_follower(follower_id),
{:member, true} <-
{:member, Actors.is_moderator?(actor_id, group_id)},
{:ok, _activity, %Follower{} = follower} <-
(if approved do
ActivityPub.accept(:follow, follower)
else
ActivityPub.reject(:follow, follower)
end) do
{:ok, follower}
else
{:member, _} ->
{:error, :unauthorized}
_ ->
{:error,
if(approved, do: "Unable to approve follower", else: "Unable to reject follower")}
end
end
def update_follower(_, _, _), do: {:error, :unauthenticated}
end

View File

@ -26,8 +26,8 @@ defmodule Mobilizon.GraphQL.Resolvers.Group do
}
}
) do
with {:ok, %Actor{id: group_id} = group} <-
ActivityPub.find_or_make_group_from_nickname(name),
with {:group, {:ok, %Actor{id: group_id} = group}} <-
{:group, ActivityPub.find_or_make_group_from_nickname(name)},
{:actor, %Actor{id: actor_id} = _actor} <- {:actor, Users.get_actor_for_user(user)},
{:member, true} <- {:member, Actors.is_member?(actor_id, group_id)} do
{:ok, group}
@ -35,8 +35,11 @@ defmodule Mobilizon.GraphQL.Resolvers.Group do
{:member, false} ->
find_group(parent, args, nil)
_ ->
{:group, _} ->
{:error, :group_not_found}
_ ->
{:error, :unknown}
end
end

View File

@ -11,6 +11,7 @@ defmodule Mobilizon.GraphQL.Resolvers.Resource do
alias Mobilizon.Service.RichMedia.Parser
alias Mobilizon.Storage.Page
alias Mobilizon.Users.User
alias Mobilizon.Web.MediaProxy
import Mobilizon.Web.Gettext
require Logger
@ -210,6 +211,16 @@ defmodule Mobilizon.GraphQL.Resolvers.Resource do
{:error, dgettext("errors", "You need to be logged-in to view a resource preview")}
end
def proxyify_pictures(%Metadata{} = metadata, _args, %{
definition: %{schema_node: %{name: name}}
}) do
case name do
"image_remote_url" -> {:ok, proxify_picture(metadata.image_remote_url)}
"favicon_url" -> {:ok, proxify_picture(metadata.favicon_url)}
_ -> {:error, "Unknown field"}
end
end
@spec get_eventual_parent(map()) :: Resource.t() | nil
defp get_eventual_parent(args) do
parent = args |> Map.get(:parent_id) |> get_parent_resource()
@ -234,4 +245,11 @@ defmodule Mobilizon.GraphQL.Resolvers.Resource do
defp check_resource_owned_by_group(%Resource{actor_id: actor_id}, group_id)
when is_number(group_id),
do: actor_id == group_id
@spec proxify_picture(String.t() | nil) :: String.t() | nil
defp proxify_picture(nil), do: nil
defp proxify_picture(url) do
MediaProxy.url(url)
end
end

View File

@ -177,6 +177,7 @@ defmodule Mobilizon.GraphQL.Schema do
import_fields(:resource_mutations)
import_fields(:post_mutations)
import_fields(:actor_mutations)
import_fields(:follower_mutations)
end
@desc """

View File

@ -32,8 +32,6 @@ defmodule Mobilizon.GraphQL.Schema.ActorInterface do
field(:banner, :media, description: "The actor's banner media")
# These one should have a privacy setting
field(:following, list_of(:follower), description: "List of followings")
field(:followers, list_of(:follower), description: "List of followers")
field(:followersCount, :integer, description: "Number of followers for this actor")
field(:followingCount, :integer, description: "Number of actors following this actor")

View File

@ -31,8 +31,6 @@ defmodule Mobilizon.GraphQL.Schema.Actors.ApplicationType do
field(:banner, :media, description: "The actor's banner media")
# These one should have a privacy setting
field(:following, list_of(:follower), description: "List of followings")
field(:followers, list_of(:follower), description: "List of followers")
field(:followersCount, :integer, description: "Number of followers for this actor")
field(:followingCount, :integer, description: "Number of actors following this actor")

View File

@ -3,11 +3,13 @@ defmodule Mobilizon.GraphQL.Schema.Actors.FollowerType do
Schema representation for Follower
"""
use Absinthe.Schema.Notation
alias Mobilizon.GraphQL.Resolvers.Followers
@desc """
Represents an actor's follower
"""
object :follower do
field(:id, :id, description: "The follow ID")
field(:target_actor, :actor, description: "What or who the profile follows")
field(:actor, :actor, description: "Which profile follows")
@ -26,4 +28,17 @@ defmodule Mobilizon.GraphQL.Schema.Actors.FollowerType do
field(:elements, list_of(:follower), description: "A list of followers")
field(:total, :integer, description: "The total number of elements in the list")
end
object :follower_mutations do
@desc "Update follower"
field :update_follower, :follower do
arg(:id, non_null(:id), description: "The follower ID")
arg(:approved, non_null(:boolean),
description: "Whether the follower has been approved by the target actor or not"
)
resolve(&Followers.update_follower/3)
end
end
end

View File

@ -8,7 +8,18 @@ defmodule Mobilizon.GraphQL.Schema.Actors.GroupType do
import Absinthe.Resolution.Helpers, only: [dataloader: 1]
alias Mobilizon.Addresses
alias Mobilizon.GraphQL.Resolvers.{Discussion, Group, Media, Member, Post, Resource, Todos}
alias Mobilizon.GraphQL.Resolvers.{
Discussion,
Followers,
Group,
Media,
Member,
Post,
Resource,
Todos
}
alias Mobilizon.GraphQL.Schema
import_types(Schema.Actors.MemberType)
@ -47,8 +58,6 @@ defmodule Mobilizon.GraphQL.Schema.Actors.GroupType do
)
# These one should have a privacy setting
field(:following, list_of(:follower), description: "List of followings")
field(:followers, list_of(:follower), description: "List of followers")
field(:followersCount, :integer, description: "Number of followers for this actor")
field(:followingCount, :integer, description: "Number of actors following this actor")
@ -116,6 +125,23 @@ defmodule Mobilizon.GraphQL.Schema.Actors.GroupType do
resolve(&Todos.find_todo_lists_for_group/3)
description("A paginated list of the todo lists this group has")
end
field :followers, :paginated_follower_list do
arg(:page, :integer,
default_value: 1,
description: "The page in the paginated followers list"
)
arg(:limit, :integer, default_value: 10, description: "The limit of followers per page")
arg(:approved, :boolean,
default_value: nil,
description: "Used to filter the followers list by approved status"
)
resolve(&Followers.find_followers_for_group/3)
description("A paginated list of the followers this group has")
end
end
@desc """
@ -232,6 +258,10 @@ defmodule Mobilizon.GraphQL.Schema.Actors.GroupType do
description: "Whether the group can be join freely, with approval or is invite-only."
)
arg(:manually_approves_followers, :boolean,
description: "Whether this group approves new followers manually"
)
arg(:avatar, :media_input,
description:
"The avatar for the group, either as an object or directly the ID of an existing media"

View File

@ -44,8 +44,6 @@ defmodule Mobilizon.GraphQL.Schema.Actors.PersonType do
field(:banner, :media, description: "The actor's banner media")
# These one should have a privacy setting
field(:following, list_of(:follower), description: "List of followings")
field(:followers, list_of(:follower), description: "List of followers")
field(:followersCount, :integer, description: "Number of followers for this actor")
field(:followingCount, :integer, description: "Number of actors following this actor")

View File

@ -51,16 +51,16 @@ defmodule Mobilizon.GraphQL.Schema.EventType do
field(:online_address, :string, description: "Online address of the event")
field(:phone_address, :string, description: "Phone address for the event")
field(:organizer_actor, :actor,
resolve: dataloader(Actors),
description: "The event's organizer (as a person)"
)
field(:attributed_to, :actor,
resolve: dataloader(Actors),
description: "Who the event is attributed to (often a group)"
)
field(:organizer_actor, :actor,
resolve: &Event.organizer_for_event/3,
description: "The event's organizer (as a person)"
)
field(:tags, list_of(:tag),
resolve: &Tag.list_tags_for_event/3,
description: "The event's tags"

View File

@ -45,7 +45,12 @@ defmodule Mobilizon.GraphQL.Schema.ResourceType do
field(:type, :string, description: "The type of the resource")
field(:title, :string, description: "The resource's metadata title")
field(:description, :string, description: "The resource's metadata description")
field(:image_remote_url, :string, description: "The resource's metadata image")
field(:image_remote_url, :string,
description: "The resource's metadata image",
resolve: &Resource.proxyify_pictures/3
)
field(:width, :integer, description: "The resource's metadata image width")
field(:height, :integer, description: "The resource's metadata image height")
field(:author_name, :string, description: "The resource's author name")
@ -53,7 +58,11 @@ defmodule Mobilizon.GraphQL.Schema.ResourceType do
field(:provider_name, :string, description: "The resource's provider name")
field(:provider_url, :string, description: "The resource's provider URL")
field(:html, :string, description: "The resource's author name")
field(:favicon_url, :string, description: "The resource's favicon URL")
field(:favicon_url, :string,
description: "The resource's favicon URL",
resolve: &Resource.proxyify_pictures/3
)
end
object :resource_queries do

View File

@ -76,10 +76,11 @@ defmodule Mobilizon do
:ok
end
# sobelow_skip ["DOS.StringToAtom"]
@spec cachex_spec(atom, integer, integer, integer, function | nil) :: Supervisor.child_spec()
defp cachex_spec(name, limit, default, interval, fallback \\ nil) do
%{
id: :"cache_#{name}",
id: String.to_atom("cache_#{to_string(name)}"),
start:
{Cachex, :start_link,
[

View File

@ -296,18 +296,6 @@ defmodule Mobilizon.Actors do
end
end
# defp transform_media_file(nil), do: nil
# defp transform_media_file(file) do
# file = for({key, val} <- file, into: %{}, do: {String.to_atom(key), val})
# if is_nil(file) do
# nil
# else
# struct(Mobilizon.Medias.File, file)
# end
# end
@delete_actor_default_options [reserve_username: true, suspension: false]
def delete_actor(%Actor{} = actor, options \\ @delete_actor_default_options) do
@ -1022,6 +1010,16 @@ defmodule Mobilizon.Actors do
@spec list_bots :: [Bot.t()]
def list_bots, do: Repo.all(Bot)
@doc """
Gets a single follower.
"""
@spec get_follower(integer | String.t()) :: Follower.t() | nil
def get_follower(id) do
Follower
|> Repo.get(id)
|> Repo.preload([:actor, :target_actor])
end
@doc """
Gets a single follower.
Raises `Ecto.NoResultsError` if the follower does not exist.
@ -1149,6 +1147,25 @@ defmodule Mobilizon.Actors do
|> Repo.aggregate(:count)
end
@doc """
Returns a paginated list of followers for an actor.
"""
@spec list_paginated_followers_for_actor(Actor.t(), boolean | nil, integer | nil, integer | nil) ::
Page.t()
def list_paginated_followers_for_actor(
%Actor{id: actor_id},
approved \\ nil,
page \\ nil,
limit \\ nil
) do
actor_id
|> follower_for_actor_query()
|> filter_followed_by_approved_status(approved)
|> order_by(desc: :updated_at)
|> preload([:actor, :target_actor])
|> Page.build_page(page, limit)
end
@doc """
Returns the list of followings for an actor.
If actor A follows actor B and C, actor A's followings are B and C.
@ -1688,6 +1705,13 @@ defmodule Mobilizon.Actors do
from(a in query, where: a.preferred_username == ^name and a.domain == ^domain)
end
@spec filter_by_name(Ecto.Query.t(), boolean | nil) :: Ecto.Query.t()
defp filter_followed_by_approved_status(query, nil), do: query
defp filter_followed_by_approved_status(query, approved) do
from(f in query, where: f.approved == ^approved)
end
@spec preload_followers(Actor.t(), boolean) :: Actor.t()
defp preload_followers(actor, true), do: Repo.preload(actor, [:followers])
defp preload_followers(actor, false), do: actor

View File

@ -55,6 +55,11 @@ defmodule Mobilizon.Discussions do
@public_visibility [:public, :unlisted]
@doc """
Callback for Absinthe Ecto Dataloader
"""
# sobelow_skip ["SQL.Query"]
@spec data :: Dataloader.Ecto.t()
def data do
Dataloader.Ecto.new(Repo, query: &query/2)
end
@ -65,6 +70,7 @@ defmodule Mobilizon.Discussions do
We only get first comment of thread, and count replies.
Read: https://hexdocs.pm/absinthe/ecto.html#dataloader
"""
@spec query(atom(), map()) :: Ecto.Queryable.t()
def query(Comment, _params) do
Comment
|> join(:left, [c], r in Comment, on: r.origin_comment_id == c.id)
@ -94,6 +100,9 @@ defmodule Mobilizon.Discussions do
@spec get_comment!(integer | String.t()) :: Comment.t()
def get_comment!(id), do: Repo.get!(Comment, id)
@doc """
Get a single comment by it's ID and all associations preloaded
"""
@spec get_comment_with_preload(String.t() | integer() | nil) :: Comment.t() | nil
def get_comment_with_preload(nil), do: nil
@ -160,6 +169,10 @@ defmodule Mobilizon.Discussions do
|> Repo.preload(@comment_preloads)
end
@doc """
Get all comment threads under an event
"""
@spec get_threads(String.t() | integer()) :: [Comment.t()]
def get_threads(event_id) do
Comment
|> where([c, _], c.event_id == ^event_id and is_nil(c.origin_comment_id))
@ -179,6 +192,10 @@ defmodule Mobilizon.Discussions do
|> Repo.all()
end
@doc """
Get a comment or create it
"""
@spec get_or_create_comment(map()) :: {:ok, Comment.t()}
def get_or_create_comment(%{"url" => url} = attrs) do
case Repo.get_by(Comment, url: url) do
%Comment{} = comment -> {:ok, Repo.preload(comment, @comment_preloads)}
@ -239,6 +256,9 @@ defmodule Mobilizon.Discussions do
Repo.all(from(c in Comment, where: c.visibility == ^:public))
end
@doc """
Returns a paginated list of local comments
"""
@spec list_local_comments(integer | nil, integer | nil) :: Page.t()
def list_local_comments(page \\ nil, limit \\ nil) do
Comment
@ -274,6 +294,9 @@ defmodule Mobilizon.Discussions do
|> Repo.all()
end
@doc """
Get all the comments contained into a discussion
"""
@spec get_comments_for_discussion(integer, integer | nil, integer | nil) :: Page.t()
def get_comments_for_discussion(discussion_id, page \\ nil, limit \\ nil) do
Comment
@ -302,12 +325,19 @@ defmodule Mobilizon.Discussions do
|> Repo.one()
end
@doc """
Get a discussion by it's ID
"""
@spec get_discussion(String.t() | integer()) :: Discussion.t()
def get_discussion(discussion_id) do
Discussion
|> Repo.get(discussion_id)
|> Repo.preload(@discussion_preloads)
end
@doc """
Get a discussion by it's URL
"""
@spec get_discussion_by_url(String.t() | nil) :: Discussion.t() | nil
def get_discussion_by_url(nil), do: nil
@ -317,12 +347,19 @@ defmodule Mobilizon.Discussions do
|> Repo.preload(@discussion_preloads)
end
@doc """
Get a discussion by it's slug
"""
@spec get_discussion_by_slug(String.t()) :: Discussion.t()
def get_discussion_by_slug(discussion_slug) do
Discussion
|> Repo.get_by(slug: discussion_slug)
|> Repo.preload(@discussion_preloads)
end
@doc """
Get a paginated list of discussions for a group actor
"""
@spec find_discussions_for_actor(Actor.t(), integer | nil, integer | nil) :: Page.t()
def find_discussions_for_actor(%Actor{id: actor_id}, page \\ nil, limit \\ nil) do
Discussion
@ -366,6 +403,10 @@ defmodule Mobilizon.Discussions do
end
end
@doc """
Create a response to a discussion
"""
@spec reply_to_discussion(Discussion.t(), map()) :: {:ok, Discussion.t()}
def reply_to_discussion(%Discussion{id: discussion_id} = discussion, attrs \\ %{}) do
with {:ok, %{comment: %Comment{} = comment, discussion: %Discussion{} = discussion}} <-
Multi.new()
@ -415,6 +456,7 @@ defmodule Mobilizon.Discussions do
|> Repo.transaction()
end
@spec public_comments_for_actor_query(String.t() | integer()) :: [Comment.t()]
defp public_comments_for_actor_query(actor_id) do
Comment
|> where([c], c.actor_id == ^actor_id and c.visibility in ^@public_visibility)
@ -422,6 +464,7 @@ defmodule Mobilizon.Discussions do
|> preload_for_comment()
end
@spec public_replies_for_thread_query(String.t() | integer()) :: [Comment.t()]
defp public_replies_for_thread_query(comment_id) do
Comment
|> where([c], c.origin_comment_id == ^comment_id and c.visibility in ^@public_visibility)
@ -444,6 +487,7 @@ defmodule Mobilizon.Discussions do
)
end
@spec filter_comments_under_events(Ecto.Query.t()) :: Ecto.Query.t()
defp filter_comments_under_events(query) do
where(query, [c], is_nil(c.discussion_id) and not is_nil(c.event_id))
end

View File

@ -520,7 +520,8 @@ defmodule Mobilizon.Events do
|> events_for_tags(args)
|> events_for_location(args)
|> filter_local_or_from_followed_instances_events()
|> order_by([q], asc: q.id)
|> filter_public_visibility()
|> event_order_begins_on_asc()
|> Page.build_page(page, limit)
end
@ -1276,7 +1277,7 @@ defmodule Mobilizon.Events do
from(
e in Event,
where: e.attributed_to_id == ^group_id,
order_by: [desc: :id]
order_by: [asc: :begins_on]
)
end
@ -1339,21 +1340,12 @@ defmodule Mobilizon.Events do
end
@spec events_for_search_query(String.t()) :: Ecto.Query.t()
defp events_for_search_query(""), do: Event
defp events_for_search_query(search_string) do
Event
|> where([e], e.visibility == ^:public)
|> distinct([e], e.id)
|> do_event_for_search_query(search_string)
end
@spec do_event_for_search_query(Ecto.Query.t(), String.t()) :: Ecto.Query.t()
defp do_event_for_search_query(query, ""), do: query
defp do_event_for_search_query(query, search_string) do
from(event in query,
from(event in Event,
join: id_and_rank in matching_event_ids_and_ranks(search_string),
on: id_and_rank.id == event.id,
order_by: [desc: id_and_rank.rank]
on: id_and_rank.id == event.id
)
end

View File

@ -145,6 +145,6 @@ defmodule Mobilizon.Posts do
Post
|> where(attributed_to_id: ^group_id)
|> order_by(desc: :inserted_at)
|> preload([p], [:author, :attributed_to, :picture, :media])
|> preload([p], [:author, :attributed_to, :picture, :media, :tags])
end
end

View File

@ -185,6 +185,7 @@ defmodule Mobilizon.Resources do
end)
end
# sobelow_skip ["SQL.Query"]
@spec update_children(Multi.t(), Resource.t(), map()) :: Multi.t()
defp update_children(
%Multi{} = multi,

View File

@ -7,9 +7,10 @@ defmodule Mobilizon.Service.Export.Feed do
alias Atomex.{Entry, Feed}
alias Mobilizon.{Actors, Events, Users}
alias Mobilizon.{Actors, Config, Events, Posts, Users}
alias Mobilizon.Actors.Actor
alias Mobilizon.Events.{Event, FeedToken}
alias Mobilizon.Posts.Post
alias Mobilizon.Storage.Page
alias Mobilizon.Users.User
@ -18,8 +19,7 @@ defmodule Mobilizon.Service.Export.Feed do
require Logger
@version Mix.Project.config()[:version]
def version, do: @version
def version, do: Config.instance_version()
@spec create_cache(String.t()) :: {:commit, String.t()} | {:ignore, any()}
def create_cache("actor_" <> name) do
@ -47,17 +47,18 @@ defmodule Mobilizon.Service.Export.Feed do
defp fetch_actor_event_feed(name) do
with %Actor{} = actor <- Actors.get_local_actor_by_name(name),
{:visibility, true} <- {:visibility, Actor.is_public_visibility?(actor)},
%Page{elements: events} <- Events.list_public_events_for_actor(actor) do
{:ok, build_actor_feed(actor, events)}
%Page{elements: events} <- Events.list_public_events_for_actor(actor),
%Page{elements: posts} <- Posts.get_public_posts_for_group(actor) do
{:ok, build_actor_feed(actor, events, posts)}
else
err ->
{:error, err}
end
end
# Build an atom feed from actor and its public events
@spec build_actor_feed(Actor.t(), list(), boolean()) :: String.t()
defp build_actor_feed(%Actor{} = actor, events, public \\ true) do
# Build an atom feed from actor and its public events and posts
@spec build_actor_feed(Actor.t(), list(), list(), boolean()) :: String.t()
defp build_actor_feed(%Actor{} = actor, events, posts, public \\ true) do
display_name = Actor.display_name(actor)
self_url =
@ -67,21 +68,29 @@ defmodule Mobilizon.Service.Export.Feed do
title =
if public,
do: "%{actor}'s public events feed on Mobilizon",
else: "%{actor}'s private events feed on Mobilizon"
do:
gettext("%{actor}'s public events feed on %{instance}",
actor: display_name,
instance: Config.instance_name()
),
else:
gettext("%{actor}'s private events feed on %{instance}",
actor: display_name,
instance: Config.instance_name()
)
# Title uses default instance language
feed =
self_url
|> Feed.new(
DateTime.utc_now(),
Gettext.gettext(Mobilizon.Web.Gettext, title, actor: display_name)
title
)
|> Feed.author(display_name, uri: actor.url)
|> Feed.link(self_url, rel: "self")
|> Feed.link(actor.url, rel: "alternate")
|> Feed.generator("Mobilizon", uri: "https://joinmobilizon.org", version: version())
|> Feed.entries(Enum.map(events, &get_entry/1))
|> Feed.generator(Config.instance_name(), uri: Endpoint.url(), version: version())
|> Feed.entries(Enum.map(events ++ posts, &get_entry/1))
feed =
if actor.avatar do
@ -123,6 +132,28 @@ defmodule Mobilizon.Service.Export.Feed do
Entry.build(entry)
end
@spec get_entry(Post.t()) :: any()
defp get_entry(%Post{} = post) do
body = post.body || ""
entry =
post.url
|> Entry.new(post.publish_at || post.inserted_at, post.title)
|> Entry.link(post.url, rel: "alternate", type: "text/html")
|> Entry.content({:cdata, body}, type: "html")
|> Entry.published(post.publish_at || post.inserted_at)
|> Entry.author(post.author.name || post.author.preferred_username)
# Add tags
entry =
post.tags
|> Enum.uniq()
|> Enum.reduce(entry, fn tag, acc -> Entry.category(acc, tag.slug, label: tag.title) end)
Entry.build(entry)
end
# Only events, not posts
@spec fetch_events_from_token(String.t()) :: String.t()
defp fetch_events_from_token(token) do
with {:ok, _uuid} <- Ecto.UUID.cast(token),
@ -130,7 +161,7 @@ defmodule Mobilizon.Service.Export.Feed do
case actor do
%Actor{} = actor ->
events = actor |> fetch_identity_participations() |> participations_to_events()
{:ok, build_actor_feed(actor, events, false)}
{:ok, build_actor_feed(actor, events, [], false)}
nil ->
with actors <- Users.get_actors_for_user(user),
@ -167,9 +198,15 @@ defmodule Mobilizon.Service.Export.Feed do
# Title uses default instance language
self_url
|> Feed.new(DateTime.utc_now(), gettext("Feed for %{email} on Mobilizon", email: email))
|> Feed.new(
DateTime.utc_now(),
gettext("Feed for %{email} on %{instance}",
email: email,
instance: Config.instance_name()
)
)
|> Feed.link(self_url, rel: "self")
|> Feed.generator("Mobilizon", uri: "https://joinmobilizon.org", version: version())
|> Feed.generator(Config.instance_name(), uri: Endpoint.url(), version: version())
|> Feed.entries(Enum.map(events, &get_entry/1))
|> Feed.build()
|> Atomex.generate_document()

View File

@ -3,7 +3,7 @@ defmodule Mobilizon.Service.Export.ICalendar do
Export an event to iCalendar format.
"""
alias Mobilizon.{Actors, Events, Users}
alias Mobilizon.{Actors, Config, Events, Users}
alias Mobilizon.Actors.Actor
alias Mobilizon.Addresses.Address
alias Mobilizon.Events.{Event, FeedToken}
@ -11,6 +11,8 @@ defmodule Mobilizon.Service.Export.ICalendar do
alias Mobilizon.Storage.Page
alias Mobilizon.Users.User
@vendor "Mobilizon #{Config.instance_version()}"
@doc """
Export a public event to iCalendar format.
@ -19,12 +21,19 @@ defmodule Mobilizon.Service.Export.ICalendar do
@spec export_public_event(Event.t()) :: {:ok, String.t()}
def export_public_event(%Event{visibility: visibility} = event)
when visibility in [:public, :unlisted] do
{:ok, %ICalendar{events: [do_export_event(event)]} |> ICalendar.to_ics(vendor: "Mobilizon")}
export_event(event)
end
@spec export_public_event(Event.t()) :: {:error, :event_not_public}
def export_public_event(%Event{}), do: {:error, :event_not_public}
@doc """
Export an event to iCalendar format
"""
def export_event(%Event{} = event) do
{:ok, %ICalendar{events: [do_export_event(event)]} |> ICalendar.to_ics(vendor: @vendor)}
end
@spec do_export_event(Event.t()) :: ICalendar.Event.t()
defp do_export_event(%Event{} = event) do
%ICalendar.Event{

View File

@ -73,6 +73,7 @@ defmodule Mobilizon.Service.Formatter.DefaultScrubbler do
Meta.allow_tag_with_these_attributes(:h3, [])
Meta.allow_tag_with_these_attributes(:h4, [])
Meta.allow_tag_with_these_attributes(:h5, [])
Meta.allow_tag_with_these_attributes(:hr, [])
Meta.strip_everything_not_covered()
end

View File

@ -2,8 +2,11 @@ defimpl Mobilizon.Service.Metadata, for: Mobilizon.Actors.Actor do
alias Phoenix.HTML
alias Phoenix.HTML.Tag
alias Mobilizon.Actors.Actor
alias Mobilizon.Web.Endpoint
alias Mobilizon.Web.JsonLD.ObjectView
alias Mobilizon.Web.Router.Helpers, as: Routes
import Mobilizon.Service.Metadata.Utils, only: [process_description: 2, default_description: 1]
import Mobilizon.Web.Gettext
def build_tags(_actor, _locale \\ "en")
@ -40,7 +43,24 @@ defimpl Mobilizon.Service.Metadata, for: Mobilizon.Actors.Actor do
end
defp add_group_schema(tags, %Actor{} = group) do
tags ++ [~s{<script type="application/ld+json">#{json(group)}</script>} |> HTML.raw()]
tags ++
[
~s{<script type="application/ld+json">#{json(group)}</script>} |> HTML.raw(),
Tag.tag(:link,
rel: "alternate",
type: "application/atom+xml",
title:
gettext("%{name}'s feed", name: group.name || group.preferred_username) |> HTML.raw(),
href: Routes.feed_url(Endpoint, :actor, group.preferred_username, :atom)
),
Tag.tag(:link,
rel: "alternate",
type: "text/calendar",
title:
gettext("%{name}'s feed", name: group.name || group.preferred_username) |> HTML.raw(),
href: Routes.feed_url(Endpoint, :actor, group.preferred_username, :ics)
)
]
end
# Insert JSON-LD schema by hand because Tag.content_tag wants to escape it

View File

@ -7,12 +7,21 @@ defmodule Mobilizon.Service.RichMedia.Parsers.MetaTagsParser do
@moduledoc """
Module to parse meta tags data in HTML pages
"""
def parse(html, data, prefix, error_message, key_name, value_name \\ "content") do
def parse(
html,
data,
prefix,
error_message,
key_name,
value_name \\ :content,
allowed_attributes \\ []
) do
meta_data =
html
|> get_elements(key_name, prefix)
|> Enum.reduce(data, fn el, acc ->
attributes = normalize_attributes(el, prefix, key_name, value_name)
attributes = normalize_attributes(el, prefix, key_name, value_name, allowed_attributes)
Map.merge(acc, attributes)
end)
@ -27,18 +36,23 @@ defmodule Mobilizon.Service.RichMedia.Parsers.MetaTagsParser do
end
defp get_elements(html, key_name, prefix) do
html |> Floki.find("meta[#{key_name}^='#{prefix}:']")
html |> Floki.find("meta[#{to_string(key_name)}^='#{prefix}:']")
end
defp normalize_attributes(html_node, prefix, key_name, value_name) do
defp normalize_attributes(html_node, prefix, key_name, value_name, allowed_attributes) do
{_tag, attributes, _children} = html_node
data =
Enum.into(attributes, %{}, fn {name, value} ->
attributes
|> Enum.into(%{}, fn {name, value} ->
{name, String.trim_leading(value, "#{prefix}:")}
end)
%{String.to_atom(data[key_name]) => data[value_name]}
if data[to_string(key_name)] in Enum.map(allowed_attributes, &to_string/1) do
%{String.to_existing_atom(data[to_string(key_name)]) => data[to_string(value_name)]}
else
%{}
end
end
defp maybe_put_title(%{title: _} = meta, _), do: meta

View File

@ -41,10 +41,31 @@ defmodule Mobilizon.Service.RichMedia.Parsers.OEmbed do
{:ok, Enum.into(attributes, %{})["href"]}
end
@oembed_allowed_attributes [
:type,
:version,
:html,
:width,
:height,
:title,
:author_name,
:author_url,
:provider_name,
:provider_url,
:cache_age,
:thumbnail_url,
:thumbnail_width,
:thumbnail_height,
:url
]
defp get_oembed_data(url) do
with {:ok, %{body: json}} <- Tesla.get(url, opts: @http_options),
{:ok, data} <- Jason.decode(json),
data <- data |> Map.new(fn {k, v} -> {String.to_atom(k), v} end) do
data <-
data
|> Map.new(fn {k, v} -> {String.to_existing_atom(k), v} end)
|> Map.take(@oembed_allowed_attributes) do
{:ok, data}
end
end

View File

@ -10,6 +10,26 @@ defmodule Mobilizon.Service.RichMedia.Parsers.OGP do
require Logger
alias Mobilizon.Service.RichMedia.Parsers.MetaTagsParser
@opengraph_properties [
:title,
:type,
:image,
:url,
:audio,
:description,
:determiner,
:locale,
:"locale:alternate",
:site_name,
:video,
:"image:url",
:"image.secure_url",
:"image:type",
:"image:width",
:"image:height",
:"image:alt"
]
def parse(html, data) do
Logger.debug("Using OpenGraph card parser")
@ -19,7 +39,9 @@ defmodule Mobilizon.Service.RichMedia.Parsers.OGP do
data,
"og",
"No OGP metadata found",
"property"
:property,
:content,
@opengraph_properties
) do
data = transform_tags(data)
Logger.debug("Data found with OpenGraph card parser")
@ -29,9 +51,11 @@ defmodule Mobilizon.Service.RichMedia.Parsers.OGP do
defp transform_tags(data) do
data
|> Map.put(:image_remote_url, Map.get(data, :image))
|> Map.put(:width, get_integer_value(data, :"image:width"))
|> Map.put(:height, get_integer_value(data, :"image:height"))
|> Enum.reject(fn {_, v} -> is_nil(v) end)
|> Map.new()
|> Map.update(:image_remote_url, Map.get(data, :image), & &1)
|> Map.update(:width, get_integer_value(data, :"image:width"), & &1)
|> Map.update(:height, get_integer_value(data, :"image:height"), & &1)
end
@spec get_integer_value(map(), atom()) :: integer() | nil

View File

@ -10,25 +10,49 @@ defmodule Mobilizon.Service.RichMedia.Parsers.TwitterCard do
alias Mobilizon.Service.RichMedia.Parsers.MetaTagsParser
require Logger
@twitter_card_properties [
:card,
:site,
:creator,
:title,
:description,
:image,
:"image:alt"
]
@spec parse(String.t(), map()) :: {:ok, map()} | {:error, String.t()}
def parse(html, data) do
Logger.debug("Using Twitter card parser")
res =
with {:ok, data} <- parse_name_attrs(data, html),
{:ok, data} <- parse_property_attrs(data, html),
data <- transform_tags(data) do
Logger.debug("Data found with Twitter card parser")
Logger.debug(inspect(data))
data
|> parse_name_attrs(html)
|> parse_property_attrs(html)
Logger.debug("Data found with Twitter card parser")
Logger.debug(inspect(res))
res
end
end
defp parse_name_attrs(data, html) do
MetaTagsParser.parse(html, data, "twitter", %{}, "name")
MetaTagsParser.parse(html, data, "twitter", %{}, :name, :content, [:"twitter:card"])
end
defp parse_property_attrs({_, data}, html) do
MetaTagsParser.parse(html, data, "twitter", "No twitter card metadata found", "property")
MetaTagsParser.parse(
html,
data,
"twitter",
"No twitter card metadata found",
:property,
:content,
@twitter_card_properties
)
end
defp transform_tags(data) do
data
|> Enum.reject(fn {_, v} -> is_nil(v) end)
|> Map.new()
|> Map.update(:image_remote_url, Map.get(data, :image), & &1)
end
end

View File

@ -4,6 +4,7 @@ defmodule Mobilizon.Web.Auth.ErrorHandler do
"""
import Plug.Conn
# sobelow_skip ["XSS.SendResp"]
def auth_error(conn, {type, _reason}, _opts) do
body = Jason.encode!(%{message: to_string(type)})
send_resp(conn, 401, body)

View File

@ -11,6 +11,7 @@ defmodule Mobilizon.Web.FeedController do
{status, data} when status in [:commit, :ok] ->
conn
|> put_resp_content_type("application/atom+xml")
|> put_resp_header("content-disposition", "attachment; filename=\"#{name}.atom\"")
|> send_resp(200, data)
_ ->
@ -23,6 +24,7 @@ defmodule Mobilizon.Web.FeedController do
{status, data} when status in [:commit, :ok] ->
conn
|> put_resp_content_type("text/calendar")
|> put_resp_header("content-disposition", "attachment; filename=\"#{name}.ics\"")
|> send_resp(200, data)
_err ->
@ -30,11 +32,16 @@ defmodule Mobilizon.Web.FeedController do
end
end
def actor(_conn, _) do
{:error, :not_found}
end
def event(conn, %{"uuid" => uuid, "format" => "ics"}) do
case Cachex.fetch(:ics, "event_" <> uuid) do
{status, data} when status in [:commit, :ok] ->
conn
|> put_resp_content_type("text/calendar")
|> put_resp_header("content-disposition", "attachment; filename=\"event.ics\"")
|> send_resp(200, data)
_ ->
@ -42,11 +49,16 @@ defmodule Mobilizon.Web.FeedController do
end
end
def event(_conn, _) do
{:error, :not_found}
end
def going(conn, %{"token" => token, "format" => "ics"}) do
case Cachex.fetch(:ics, "token_" <> token) do
{status, data} when status in [:commit, :ok] ->
conn
|> put_resp_content_type("text/calendar")
|> put_resp_header("content-disposition", "attachment; filename=\"events.ics\"")
|> send_resp(200, data)
_ ->
@ -59,10 +71,15 @@ defmodule Mobilizon.Web.FeedController do
{status, data} when status in [:commit, :ok] ->
conn
|> put_resp_content_type("application/atom+xml")
|> put_resp_header("content-disposition", "attachment; filename=\"events.atom\"")
|> send_resp(200, data)
{:ignore, _} ->
{:error, :not_found}
end
end
def going(_conn, _) do
{:error, :not_found}
end
end

View File

@ -0,0 +1,33 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Mobilizon.Web.MediaProxyController do
use Mobilizon.Web, :controller
alias Mobilizon.Config
alias Mobilizon.Web.{MediaProxy, ReverseProxy}
alias Plug.Conn
# sobelow_skip ["XSS.SendResp"]
def remote(conn, %{"sig" => sig64, "url" => url64}) do
with {_, true} <- {:enabled, MediaProxy.enabled?()},
{:ok, url} <- MediaProxy.decode_url(sig64, url64),
:ok <- MediaProxy.verify_request_path_and_url(conn, url) do
ReverseProxy.call(conn, url, media_proxy_opts())
else
{:enabled, false} ->
send_resp(conn, 404, Conn.Status.reason_phrase(404))
{:error, :invalid_signature} ->
send_resp(conn, 403, Conn.Status.reason_phrase(403))
{:wrong_filename, filename} ->
redirect(conn, external: MediaProxy.build_url(sig64, url64, filename))
end
end
defp media_proxy_opts do
Config.get([:media_proxy, :proxy_opts], [])
end
end

View File

@ -6,7 +6,9 @@ defmodule Mobilizon.Web.Email do
use Bamboo.Phoenix, view: Mobilizon.Web.EmailView
alias Ecto.UUID
alias Mobilizon.Config
alias Mobilizon.{Config, Events}
alias Mobilizon.Events.Event
alias Mobilizon.Service.Export.ICalendar
alias Mobilizon.Web.EmailView
@spec base_email(keyword()) :: Bamboo.Email.t()
@ -40,4 +42,18 @@ defmodule Mobilizon.Web.Email do
Timex.format!(DateTime.utc_now(), "{WDshort}, {D} {Mshort} {YYYY} {h24}:{m}:{s} {Z}")
end
end
def add_event_attachment(%Bamboo.Email{} = email, %Event{id: event_id}) do
with {:ok, %Event{} = event} <- Events.get_event_with_preload(event_id),
{:ok, event_ics_data} <- ICalendar.export_event(event) do
put_attachment(email, %Bamboo.Attachment{
filename: Slugger.slugify_downcase(event.title),
content_type: "text/calendar",
data: event_ics_data
})
else
_ ->
email
end
end
end

View File

@ -46,6 +46,7 @@ defmodule Mobilizon.Web.Email.Event do
|> assign(:changes, changes)
|> assign(:subject, subject)
|> assign(:timezone, timezone)
|> Email.add_event_attachment(event)
|> render(:event_updated)
end

View File

@ -30,6 +30,7 @@ defmodule Mobilizon.Web.Email.Notification do
|> assign(:locale, locale)
|> assign(:participant, participant)
|> assign(:subject, subject)
|> Email.add_event_attachment(event)
|> render(:before_event_notification)
end

View File

@ -118,6 +118,7 @@ defmodule Mobilizon.Web.Email.Participation do
|> assign(:locale, locale)
|> assign(:event, event)
|> assign(:subject, subject)
|> Email.add_event_attachment(event)
|> render(:event_participation_approved)
end

View File

@ -6,6 +6,7 @@ defmodule Mobilizon.Web.Endpoint do
use Absinthe.Phoenix.Endpoint
plug(Mobilizon.Web.Plugs.SetLocalePlug)
plug(Mobilizon.Web.Plugs.HTTPSecurityPlug)
# For e2e tests
if Application.get_env(:mobilizon, :sql_sandbox) do
@ -75,4 +76,9 @@ defmodule Mobilizon.Web.Endpoint do
)
plug(Mobilizon.Web.Router)
@spec websocket_url :: String.t()
def websocket_url do
String.replace_leading(url(), "http", "ws")
end
end

115
lib/web/media_proxy.ex Normal file
View File

@ -0,0 +1,115 @@
# Pleroma: A lightweight social networking server
# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Mobilizon.Web.MediaProxy do
@moduledoc """
Module to proxify remote media
"""
alias Mobilizon.Config
alias Mobilizon.Web
@base64_opts [padding: false]
def url(url) when is_nil(url) or url == "", do: nil
def url("/" <> _ = url), do: url
def url(url) do
if enabled?() and url_proxiable?(url) do
encode_url(url)
else
url
end
end
@spec url_proxiable?(String.t()) :: boolean()
def url_proxiable?(url) do
not local?(url)
end
def enabled?, do: Config.get([:media_proxy, :enabled], false)
# Note: media proxy must be enabled for media preview proxy in order to load all
# non-local non-whitelisted URLs through it and be sure that body size constraint is preserved.
def preview_enabled?, do: enabled?() and !!Config.get([:media_preview_proxy, :enabled])
def local?(url), do: String.starts_with?(url, Web.Endpoint.url())
defp base64_sig64(url) do
base64 = Base.url_encode64(url, @base64_opts)
sig64 =
base64
|> signed_url()
|> Base.url_encode64(@base64_opts)
{base64, sig64}
end
def encode_url(url) do
{base64, sig64} = base64_sig64(url)
build_url(sig64, base64, filename(url))
end
def decode_url(sig, url) do
with {:ok, sig} <- Base.url_decode64(sig, @base64_opts),
signature when signature == sig <- signed_url(url) do
{:ok, Base.url_decode64!(url, @base64_opts)}
else
_ -> {:error, :invalid_signature}
end
end
defp signed_url(url) do
:crypto.hmac(:sha, Config.get([Web.Endpoint, :secret_key_base]), url)
end
def filename(url_or_path) do
if path = URI.parse(url_or_path).path, do: Path.basename(path)
end
def base_url do
Web.Endpoint.url()
end
defp proxy_url(path, sig_base64, url_base64, filename) do
[
base_url(),
path,
sig_base64,
url_base64,
filename
]
|> Enum.filter(& &1)
|> Path.join()
end
def build_url(sig_base64, url_base64, filename \\ nil) do
proxy_url("proxy", sig_base64, url_base64, filename)
end
def verify_request_path_and_url(
%Plug.Conn{params: %{"filename" => _}, request_path: request_path},
url
) do
verify_request_path_and_url(request_path, url)
end
def verify_request_path_and_url(request_path, url) when is_binary(request_path) do
filename = filename(url)
if filename && not basename_matches?(request_path, filename) do
{:wrong_filename, filename}
else
:ok
end
end
def verify_request_path_and_url(_, _), do: :ok
defp basename_matches?(path, filename) do
basename = Path.basename(path)
basename == filename or URI.decode(basename) == filename or URI.encode(basename) == filename
end
end

View File

@ -0,0 +1,111 @@
# Portions of this file are derived from Pleroma:
# Pleroma: A lightweight social networking server
# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only
defmodule Mobilizon.Web.Plugs.HTTPSecurityPlug do
@moduledoc """
A plug to setup some HTTP security-related headers, like CSP
"""
alias Mobilizon.Config
import Plug.Conn
require Logger
def init(opts), do: opts
def call(conn, _options) do
if Config.get([:http_security, :enabled]) do
conn
|> merge_resp_headers(headers())
|> maybe_send_sts_header(Config.get([:http_security, :sts]))
else
conn
end
end
defp headers do
referrer_policy = Config.get([:http_security, :referrer_policy])
[
{"referrer-policy", referrer_policy},
{"content-security-policy", csp_string()}
]
end
@static_csp_rules [
"default-src 'none'",
"base-uri 'self'",
"manifest-src 'self'"
]
@csp_start [Enum.join(@static_csp_rules, ";") <> ";"]
defp csp_string do
scheme = Config.get([Pleroma.Web.Endpoint, :url])[:scheme]
static_url = Mobilizon.Web.Endpoint.static_url()
websocket_url = Mobilizon.Web.Endpoint.websocket_url()
img_src =
["img-src 'self' data: blob: "] ++ Config.get([:http_security, :csp_policy, :img_src])
media_src = ["media-src 'self' "] ++ Config.get([:http_security, :csp_policy, :media_src])
connect_src =
["connect-src 'self' blob: ", static_url, ?\s, websocket_url] ++
Config.get([:http_security, :csp_policy, :connect_src])
script_src =
if Config.get(:env) == :dev do
"script-src 'self' 'unsafe-eval' 'unsafe-inline' "
else
"script-src 'self' 'unsafe-eval' 'sha256-4RS22DYeB7U14dra4KcQYxmwt5HkOInieXK1NUMBmQI=' "
end
script_src = [script_src] ++ Config.get([:http_security, :csp_policy, :script_src])
style_src =
["style-src 'self' 'unsafe-inline' "] ++
Config.get([:http_security, :csp_policy, :style_src])
font_src = ["font-src 'self' "] ++ Config.get([:http_security, :csp_policy, :font_src])
frame_src = if Config.get(:env) == :dev, do: "frame-src 'self' ", else: "frame-src 'none' "
frame_src = [frame_src] ++ Config.get([:http_security, :csp_policy, :frame_src])
frame_ancestors =
if Config.get(:env) == :dev, do: "frame-ancestors 'self' ", else: "frame-ancestors 'none' "
frame_ancestors =
[frame_ancestors] ++ Config.get([:http_security, :csp_policy, :frame_ancestors])
insecure = if scheme == "https", do: "upgrade-insecure-requests"
@csp_start
|> add_csp_param(script_src)
|> add_csp_param(style_src)
|> add_csp_param(connect_src)
|> add_csp_param(img_src)
|> add_csp_param(media_src)
|> add_csp_param(font_src)
|> add_csp_param(frame_src)
|> add_csp_param(frame_ancestors)
|> add_csp_param(insecure)
|> :erlang.iolist_to_binary()
end
defp add_csp_param(csp_iodata, nil), do: csp_iodata
defp add_csp_param(csp_iodata, param), do: [[param, ?;] | csp_iodata]
defp maybe_send_sts_header(conn, true) do
max_age_sts = Config.get([:http_security, :sts_max_age])
merge_resp_headers(conn, [
{"strict-transport-security", "max-age=#{max_age_sts}; includeSubDomains"}
])
end
defp maybe_send_sts_header(conn, _), do: conn
end

View File

@ -4,17 +4,22 @@
# Upstream: https://git.pleroma.social/pleroma/pleroma/blob/develop/lib/pleroma/reverse_proxy.ex
defmodule Mobilizon.Web.ReverseProxy do
@keep_req_headers ~w(accept user-agent accept-encoding cache-control
if-modified-since if-unmodified-since if-none-match if-range range)
@resp_cache_headers ~w(etag date last-modified cache-control)
@keep_resp_headers @resp_cache_headers ++ ~w(content-type content-disposition
content-encoding content-range accept-ranges vary)
@range_headers ~w(range if-range)
@keep_req_headers ~w(accept user-agent accept-encoding cache-control if-modified-since) ++
~w(if-unmodified-since if-none-match) ++ @range_headers
@resp_cache_headers ~w(etag date last-modified)
@keep_resp_headers @resp_cache_headers ++
~w(content-length content-type content-disposition content-encoding) ++
~w(content-range accept-ranges vary)
@default_cache_control_header "public, max-age=1209600"
@valid_resp_codes [200, 206, 304]
@max_read_duration :timer.seconds(30)
@max_body_length :infinity
@methods ~w(GET HEAD)
def max_read_duration_default, do: @max_read_duration
def default_cache_control_header, do: @default_cache_control_header
@moduledoc """
A reverse proxy.
@ -145,6 +150,7 @@ defmodule Mobilizon.Web.ReverseProxy do
end
end
# sobelow_skip ["XSS.SendResp"]
def call(conn, _, _) do
conn
|> send_resp(400, Conn.Status.reason_phrase(400))
@ -223,6 +229,7 @@ defmodule Mobilizon.Web.ReverseProxy do
|> send_resp(code, "")
end
# sobelow_skip ["XSS.SendResp"]
defp error_or_redirect(conn, url, code, body, opts) do
if Keyword.get(opts, :redirect_on_failure, false) do
conn

View File

@ -30,6 +30,7 @@ defmodule Mobilizon.Web.Router do
pipeline :activity_pub_and_html do
plug(:accepts, ["html", "activity-json"])
plug(:put_secure_browser_headers)
plug(Cldr.Plug.AcceptLanguage,
cldr_backend: Mobilizon.Cldr
@ -37,6 +38,7 @@ defmodule Mobilizon.Web.Router do
end
pipeline :atom_and_ical do
plug(:put_secure_browser_headers)
plug(:accepts, ["atom", "ics", "html"])
end
@ -48,9 +50,6 @@ defmodule Mobilizon.Web.Router do
)
plug(:accepts, ["html"])
plug(:fetch_session)
plug(:fetch_flash)
plug(:protect_from_forgery)
plug(:put_secure_browser_headers)
end
@ -158,10 +157,17 @@ defmodule Mobilizon.Web.Router do
get("/interact", PageController, :interact)
get("/auth/:provider", AuthController, :request)
# Have a look at https://github.com/ueberauth/ueberauth/issues/125 some day
# Also possible CSRF issue
get("/auth/:provider/callback", AuthController, :callback)
post("/auth/:provider/callback", AuthController, :callback)
end
scope "/proxy/", Mobilizon.Web do
get("/:sig/:url", MediaProxyController, :remote)
get("/:sig/:url/:filename", MediaProxyController, :remote)
end
if Application.fetch_env!(:mobilizon, :env) in [:dev, :e2e] do
# If using Phoenix
forward("/sent_emails", Bamboo.SentEmailViewerPlug)

View File

@ -2,6 +2,6 @@
==
<%= gettext "%{name} (%{domain}) just requested to follow your instance.", name: @follower.name, domain: @follower.domain %>
<%= gettext "If you accept, this instance will receive all of your public events." %>
<%= gettext "Note: %{name} (%{domain}) following you doesn't necessarily imply that you follow this instance, but you can ask to follow them too." %>
<%= gettext "Note: %{name} (%{domain}) following you doesn't necessarily imply that you follow this instance, but you can ask to follow them too.", name: @follower.name, domain: @follower.domain %>
<%= gettext "To accept this invitation, head over to the instance's admin settings." %>
<%= "#{Mobilizon.Web.Endpoint.url()}/settings/admin/relays/followers" %>

View File

@ -153,9 +153,19 @@ defmodule Mobilizon.Web.ActivityPub.ActorView do
"orderedItems" => Enum.map(collection, &item/1)
}
if offset < total do
Map.put(map, "next", Actor.build_url(preferred_username, endpoint, page: page + 1))
end
map =
if offset < total do
Map.put(map, "next", Actor.build_url(preferred_username, endpoint, page: page + 1))
else
map
end
map =
if offset > total do
Map.put(map, "prev", Actor.build_url(preferred_username, endpoint, page: page - 1))
else
map
end
map
end

View File

@ -5,6 +5,7 @@ defmodule Mobilizon.Web.Views.Utils do
alias Mobilizon.Service.Metadata.Utils, as: MetadataUtils
# sobelow_skip ["Traversal.FileModule"]
@spec inject_tags(Enum.t(), String.t()) :: {:safe, String.t()}
def inject_tags(tags, locale \\ "en") do
with {:ok, index_content} <- File.read(index_file_path()) do

28
mix.exs
View File

@ -1,7 +1,7 @@
defmodule Mobilizon.Mixfile do
use Mix.Project
@version "1.0.3"
@version "1.0.4"
def project do
[
@ -28,7 +28,12 @@ defmodule Mobilizon.Mixfile do
name: "Mobilizon",
source_url: "https://framagit.org/framasoft/mobilizon",
homepage_url: "https://joinmobilizon.org",
docs: docs()
docs: docs(),
releases: [
mobilizon: [
applications: [eldap: :transient]
]
]
]
end
@ -77,7 +82,7 @@ defmodule Mobilizon.Mixfile do
{:gettext, "~> 0.11"},
{:cowboy, "~> 2.6"},
{:guardian, "~> 2.0"},
{:guardian_db, "~> 2.0.2"},
{:guardian_db, "~> 2.1.0"},
{:guardian_phoenix, "~> 2.0"},
{:argon2_elixir, "~> 2.0"},
{:cors_plug, "~> 2.0"},
@ -98,12 +103,14 @@ defmodule Mobilizon.Mixfile do
{:bamboo_smtp, "~> 3.0"},
{:geolix, "~> 2.0"},
{:geolix_adapter_mmdb2, "~> 0.6.0"},
{:absinthe, "~> 1.5.5"},
{:absinthe_phoenix, "~> 2.0.0"},
{:absinthe, "~> 1.6"},
{:absinthe_phoenix,
github: "absinthe-graphql/absinthe_phoenix",
ref: "67dc53db5b826ea12f37860bcce4334d4aaad028"},
{:absinthe_plug, "~> 1.5.0"},
{:dataloader, "~> 1.0.6"},
{:plug_cowboy, "~> 2.0"},
{:atomex, "0.3.0"},
{:atomex, "~> 0.4"},
{:cachex, "~> 3.1"},
{:geohax, "~> 0.4.0"},
{:mogrify, "~> 0.8.0"},
@ -130,22 +137,25 @@ defmodule Mobilizon.Mixfile do
{:ecto_shortuuid, "~> 0.1"},
{:tesla, "~> 1.4.0"},
{:sitemapper, "~> 0.5.0"},
{:xml_builder, "~> 2.1.1", override: true},
{:xml_builder, "~> 2.1.1"},
{:remote_ip, "~> 0.2.0"},
{:ex_cldr_languages, "~> 0.2.1"},
{:slugger, "~> 0.3"},
# Dev and test dependencies
{:phoenix_live_reload, "~> 1.2", only: [:dev, :e2e]},
{:ex_machina, "~> 2.3", only: [:dev, :test]},
{:excoveralls, "~> 0.13.0", only: :test},
{:ex_doc, "~> 0.23", only: [:dev, :test], runtime: false},
{:mix_test_watch, "~> 1.0", only: :dev, runtime: false},
{:ex_unit_notifier, "~> 0.1", only: :test},
{:ex_unit_notifier, "~> 1.0", only: :test},
{:dialyxir, "~> 1.0.0", only: [:dev], runtime: false},
{:exvcr, "~> 0.12", only: :test},
{:credo, "~> 1.5", only: [:dev, :test], runtime: false},
{:mock, "~> 0.3.4", only: :test},
{:elixir_feed_parser, "~> 2.1.0", only: :test},
{:mox, "~> 1.0", only: :test}
{:mox, "~> 1.0", only: :test},
{:junit_formatter, "~> 3.1", only: [:test]},
{:sobelow, "~> 0.8", only: [:dev, :test]}
] ++ oauth_deps()
end

View File

@ -1,41 +1,38 @@
%{
"absinthe": {:hex, :absinthe, "1.5.5", "22b26228f56dc6a1074c52cea9c64e869a0cb2427403bcf9056c422d36c66292", [:mix], [{:dataloader, "~> 1.0.0", [hex: :dataloader, repo: "hexpm", optional: true]}, {:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}, {:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "41e79ed4bffbab4986493ff4120c948d59871fd08ad5e31195129ce3c01aad58"},
"absinthe_ecto": {:hex, :absinthe_ecto, "0.1.3", "420b68129e79fe4571a4838904ba03e282330d335da47729ad52ffd7b8c5fcb1", [:mix], [{:absinthe, "~> 1.3.0 or ~> 1.4.0", [hex: :absinthe, repo: "hexpm", optional: false]}, {:ecto, ">= 0.0.0", [hex: :ecto, repo: "hexpm", optional: false]}], "hexpm", "355b9db34abfab96ae1e025434b66e11002babcf4fe6b7144d26ff7548985f52"},
"absinthe_phoenix": {:hex, :absinthe_phoenix, "2.0.0", "01c6a90af0ca12ee08d0fb93e23f9890d75bb6d3027f49ee4383bc03058ef5c3", [:mix], [{:absinthe, "~> 1.5.0", [hex: :absinthe, repo: "hexpm", optional: false]}, {:absinthe_plug, "~> 1.5.0", [hex: :absinthe_plug, repo: "hexpm", optional: false]}, {:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.5", [hex: :phoenix, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.13", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}], "hexpm", "7ffbfe9fb82a14cafb78885cc2cef4f9d454bbbe2c95eec12b5463f5a20d1020"},
"absinthe_plug": {:hex, :absinthe_plug, "1.5.2", "995de73f0afa763e0aae17e4e0e4affbb5d79e33199bf7e075aeb07f1fb6b7d1", [:mix], [{:absinthe, "~> 1.5.0", [hex: :absinthe, repo: "hexpm", optional: false]}, {:plug, "~> 1.3.2 or ~> 1.4", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "e03549bce5bb77d7b4a9bd68c69f442b0f4409b723b9ce41683ac5c1c70b5958"},
"argon2_elixir": {:hex, :argon2_elixir, "2.3.0", "e251bdafd69308e8c1263e111600e6d68bd44f23d2cccbe43fcb1a417a76bc8e", [:make, :mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "28ccb63bff213aecec1f7f3dde9648418b031f822499973281d8f494b9d5a3b3"},
"atomex": {:hex, :atomex, "0.3.0", "19b5d1a2aef8706dbd307385f7d5d9f6f273869226d317492c396c7bacf26402", [:mix], [{:xml_builder, "~> 2.0.0", [hex: :xml_builder, repo: "hexpm", optional: false]}], "hexpm", "025dbc3a3e99380894791a093019f535d0ef6cf1916f6ec1b778ac107fcfc3e4"},
"auto_linker": {:git, "https://git.pleroma.social/pleroma/auto_linker.git", "95e8188490e97505c56636c1379ffdf036c1fdde", [ref: "95e8188490e97505c56636c1379ffdf036c1fdde"]},
"absinthe": {:hex, :absinthe, "1.6.0", "7cb42eebbb9cbf5077541d73c189e205ebe12caf1c78372fc5b9e706fc8ac298", [:mix], [{:dataloader, "~> 1.0.0", [hex: :dataloader, repo: "hexpm", optional: true]}, {:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}, {:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "99915841495522332b3af8ff10c9cbb51e256b28d9b19c0dfaac5f044b6bfb66"},
"absinthe_phoenix": {:git, "https://github.com/absinthe-graphql/absinthe_phoenix.git", "67dc53db5b826ea12f37860bcce4334d4aaad028", [ref: "67dc53db5b826ea12f37860bcce4334d4aaad028"]},
"absinthe_plug": {:hex, :absinthe_plug, "1.5.4", "daff02d04be7c06d0114ef5b4361865a4dacbe8ddb325ce709b103253d4a014b", [:mix], [{:absinthe, "~> 1.5", [hex: :absinthe, repo: "hexpm", optional: false]}, {:plug, "~> 1.4", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "80360cd8ad541d87c75336f3abc59b894d474458f6a7f8e563781c01148860de"},
"argon2_elixir": {:hex, :argon2_elixir, "2.4.0", "2a22ea06e979f524c53b42b598fc6ba38cdcbc977a155e33e057732cfb1fb311", [:make, :mix], [{:comeonin, "~> 5.3", [hex: :comeonin, repo: "hexpm", optional: false]}, {:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "4ea82e183cf8e7f66dab1f767fedcfe6a195e140357ef2b0423146b72e0a551d"},
"atomex": {:hex, :atomex, "0.4.1", "7d3910ff7795db91b9af9f8d3e65af7ac69f235adf03484995fc667a36f3edc5", [:mix], [{:xml_builder, "~> 2.1", [hex: :xml_builder, repo: "hexpm", optional: false]}], "hexpm", "f3ac737f7493d42cfddf917f3ac49d60e0a0cf1a35c0712851b07fe8c0a05c7a"},
"bamboo": {:hex, :bamboo, "1.6.0", "adfb583bef028923aae6f22deaea6667290561da1246058556ecaeb0fec5a175", [:mix], [{:hackney, ">= 1.13.0", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "454e67feacbc9b6e00553ce1d2fba003c861e0035600d59b09d6159985b17f9b"},
"bamboo_smtp": {:hex, :bamboo_smtp, "3.0.0", "b7f0c371af96a1cb7131908918b02abb228f9db234910bf10cf4fb177c083259", [:mix], [{:bamboo, "~> 1.2", [hex: :bamboo, repo: "hexpm", optional: false]}, {:gen_smtp, "~> 0.15.0", [hex: :gen_smtp, repo: "hexpm", optional: false]}], "hexpm", "77cb1fa3076b24109e54df622161fe1e5619376b4ecf86d8b99b46f327acc49f"},
"bunt": {:hex, :bunt, "0.2.0", "951c6e801e8b1d2cbe58ebbd3e616a869061ddadcc4863d0a2182541acae9a38", [:mix], [], "hexpm", "7af5c7e09fe1d40f76c8e4f9dd2be7cebd83909f31fee7cd0e9eadc567da8353"},
"cachex": {:hex, :cachex, "3.3.0", "6f2ebb8f27491fe39121bd207c78badc499214d76c695658b19d6079beeca5c2", [:mix], [{:eternal, "~> 1.2", [hex: :eternal, repo: "hexpm", optional: false]}, {:jumper, "~> 1.0", [hex: :jumper, repo: "hexpm", optional: false]}, {:sleeplocks, "~> 1.1", [hex: :sleeplocks, repo: "hexpm", optional: false]}, {:unsafe, "~> 1.0", [hex: :unsafe, repo: "hexpm", optional: false]}], "hexpm", "d90e5ee1dde14cef33f6b187af4335b88748b72b30c038969176cd4e6ccc31a1"},
"certifi": {:hex, :certifi, "2.5.2", "b7cfeae9d2ed395695dd8201c57a2d019c0c43ecaf8b8bcb9320b40d6662f340", [:rebar3], [{:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm", "3b3b5f36493004ac3455966991eaf6e768ce9884693d9968055aeeeb1e575040"},
"certifi": {:hex, :certifi, "2.5.3", "70bdd7e7188c804f3a30ee0e7c99655bc35d8ac41c23e12325f36ab449b70651", [:rebar3], [{:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm", "ed516acb3929b101208a9d700062d520f3953da3b6b918d866106ffa980e1c10"},
"cldr_utils": {:hex, :cldr_utils, "2.14.0", "edcef8dd2654b93d84a90087f3536ffabf9c9d82b34ff82bc9ca54c0668b3a4a", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.5", [hex: :certifi, repo: "hexpm", optional: true]}, {:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}], "hexpm", "6903356ff6988342a29b90637eece4ca98a4ed2b9759c22233d3474ade57645a"},
"combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm", "1b1dbc1790073076580d0d1d64e42eae2366583e7aecd455d1215b0d16f2451b"},
"comeonin": {:hex, :comeonin, "5.3.1", "7fe612b739c78c9c1a75186ef2d322ce4d25032d119823269d0aa1e2f1e20025", [:mix], [], "hexpm", "d6222483060c17f0977fad1b7401ef0c5863c985a64352755f366aee3799c245"},
"comeonin": {:hex, :comeonin, "5.3.2", "5c2f893d05c56ae3f5e24c1b983c2d5dfb88c6d979c9287a76a7feb1e1d8d646", [:mix], [], "hexpm", "d0993402844c49539aeadb3fe46a3c9bd190f1ecf86b6f9ebd71957534c95f04"},
"connection": {:hex, :connection, "1.1.0", "ff2a49c4b75b6fb3e674bfc5536451607270aac754ffd1bdfe175abe4a6d7a68", [:mix], [], "hexpm", "722c1eb0a418fbe91ba7bd59a47e28008a189d47e37e0e7bb85585a016b2869c"},
"cors_plug": {:hex, :cors_plug, "2.0.2", "2b46083af45e4bc79632bd951550509395935d3e7973275b2b743bd63cc942ce", [:mix], [{:plug, "~> 1.8", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "f0d0e13f71c51fd4ef8b2c7e051388e4dfb267522a83a22392c856de7e46465f"},
"cowboy": {:hex, :cowboy, "2.8.0", "f3dc62e35797ecd9ac1b50db74611193c29815401e53bac9a5c0577bd7bc667d", [:rebar3], [{:cowlib, "~> 2.9.1", [hex: :cowlib, repo: "hexpm", optional: false]}, {:ranch, "~> 1.7.1", [hex: :ranch, repo: "hexpm", optional: false]}], "hexpm", "4643e4fba74ac96d4d152c75803de6fad0b3fa5df354c71afdd6cbeeb15fac8a"},
"cowboy_telemetry": {:hex, :cowboy_telemetry, "0.3.1", "ebd1a1d7aff97f27c66654e78ece187abdc646992714164380d8a041eda16754", [:rebar3], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3a6efd3366130eab84ca372cbd4a7d3c3a97bdfcfb4911233b035d117063f0af"},
"cowlib": {:hex, :cowlib, "2.9.1", "61a6c7c50cf07fdd24b2f45b89500bb93b6686579b069a89f88cb211e1125c78", [:rebar3], [], "hexpm", "e4175dc240a70d996156160891e1c62238ede1729e45740bdd38064dad476170"},
"credo": {:hex, :credo, "1.5.3", "f345253655f2efe1e4693a03437606462681e91303ebc9e3909c14268effc37a", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2.8", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "f7e238c10051cc22515e3f75754200b567d93c00d93be81fc59d47bc3dfdc5be"},
"credo": {:hex, :credo, "1.5.4", "9914180105b438e378e94a844ec3a5088ae5875626fc945b7c1462b41afc3198", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2.8", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "cf51af45eadc0a3f39ba13b56fdac415c91b34f7b7533a13dc13550277141bc4"},
"dataloader": {:hex, :dataloader, "1.0.8", "114294362db98a613f231589246aa5b0ce847412e8e75c4c94f31f204d272cbf", [:mix], [{:ecto, ">= 3.4.3 and < 4.0.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "eaf3c2aa2bc9dbd2f1e960561d616b7f593396c4754185b75904f6d66c82a667"},
"db_connection": {:hex, :db_connection, "2.3.1", "4c9f3ed1ef37471cbdd2762d6655be11e38193904d9c5c1c9389f1b891a3088e", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}], "hexpm", "abaab61780dde30301d840417890bd9f74131041afd02174cf4e10635b3a63f5"},
"decimal": {:hex, :decimal, "1.9.0", "83e8daf59631d632b171faabafb4a9f4242c514b0a06ba3df493951c08f64d07", [:mix], [], "hexpm", "b1f2343568eed6928f3e751cf2dffde95bfaa19dd95d09e8a9ea92ccfd6f7d85"},
"decimal": {:hex, :decimal, "2.0.0", "a78296e617b0f5dd4c6caf57c714431347912ffb1d0842e998e9792b5642d697", [:mix], [], "hexpm", "34666e9c55dea81013e77d9d87370fe6cb6291d1ef32f46a1600230b1d44f577"},
"dialyxir": {:hex, :dialyxir, "1.0.0", "6a1fa629f7881a9f5aaf3a78f094b2a51a0357c843871b8bc98824e7342d00a5", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "aeb06588145fac14ca08d8061a142d52753dbc2cf7f0d00fc1013f53f8654654"},
"earmark": {:hex, :earmark, "1.4.13", "2c6ce9768fc9fdbf4046f457e207df6360ee6c91ee1ecb8e9a139f96a4289d91", [:mix], [{:earmark_parser, ">= 1.4.12", [hex: :earmark_parser, repo: "hexpm", optional: false]}], "hexpm", "a0cf3ed88ef2b1964df408889b5ecb886d1a048edde53497fc935ccd15af3403"},
"earmark_parser": {:hex, :earmark_parser, "1.4.12", "b245e875ec0a311a342320da0551da407d9d2b65d98f7a9597ae078615af3449", [:mix], [], "hexpm", "711e2cc4d64abb7d566d43f54b78f7dc129308a63bc103fbd88550d2174b3160"},
"ecto": {:hex, :ecto, "3.5.5", "48219a991bb86daba6e38a1e64f8cea540cded58950ff38fbc8163e062281a07", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "98dd0e5e1de7f45beca6130d13116eae675db59adfa055fb79612406acf6f6f1"},
"ecto": {:hex, :ecto, "3.5.6", "29c77e999e471921c7ce7347732bab7bfa3e24c587640a36f17e0744d1474b8e", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "3ae1f3eaecc3e72eeb65ed43239b292bb1eaf335c7e6cea3a7fc27aadb6e93e7"},
"ecto_autoslug_field": {:hex, :ecto_autoslug_field, "2.0.1", "2177c1c253f6dd3efd4b56d1cb76104d0a6ef044c6b9a7a0ad6d32665c4111e5", [:mix], [{:ecto, ">= 2.1.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:slugger, ">= 0.2.0", [hex: :slugger, repo: "hexpm", optional: false]}], "hexpm", "a3cc73211f2e75b89a03332183812ebe1ac08be2e25a1df5aa3d1422f92c45c3"},
"ecto_enum": {:hex, :ecto_enum, "1.4.0", "d14b00e04b974afc69c251632d1e49594d899067ee2b376277efd8233027aec8", [:mix], [{:ecto, ">= 3.0.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:ecto_sql, "> 3.0.0", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:mariaex, ">= 0.0.0", [hex: :mariaex, repo: "hexpm", optional: true]}, {:postgrex, ">= 0.0.0", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "8fb55c087181c2b15eee406519dc22578fa60dd82c088be376d0010172764ee4"},
"ecto_shortuuid": {:hex, :ecto_shortuuid, "0.1.3", "d36aede64edf256e4b769be2ad15a8ad5d9d1ff8ad46befe39e8cb4489abcd05", [:mix], [{:ecto, "~> 2.2 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:shortuuid, "~> 2.1.1", [hex: :shortuuid, repo: "hexpm", optional: false]}], "hexpm", "d215c8ced7125265de94d55abc696125942caef33439cf281fafded9744a4294"},
"ecto_sql": {:hex, :ecto_sql, "3.5.3", "1964df0305538364b97cc4661a2bd2b6c89d803e66e5655e4e55ff1571943efd", [:mix], [{:db_connection, "~> 2.2", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.5.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.3.0 or ~> 0.4.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d2f53592432ce17d3978feb8f43e8dc0705e288b0890caf06d449785f018061c"},
"ecto_sql": {:hex, :ecto_sql, "3.5.4", "a9e292c40bd79fff88885f95f1ecd7b2516e09aa99c7dd0201aa84c54d2358e4", [:mix], [{:db_connection, "~> 2.2", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.5.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.3.0 or ~> 0.4.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.15.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "1fff1a28a898d7bbef263f1f3ea425b04ba9f33816d843238c84eff883347343"},
"elixir_feed_parser": {:hex, :elixir_feed_parser, "2.1.0", "bb96fb6422158dc7ad59de62ef211cc69d264acbbe63941a64a5dce97bbbc2e6", [:mix], [{:timex, "~> 3.4", [hex: :timex, repo: "hexpm", optional: false]}], "hexpm", "2d3c62fe7b396ee3b73d7160bc8fadbd78bfe9597c98c7d79b3f1038d9cba28f"},
"elixir_make": {:hex, :elixir_make, "0.6.1", "8faa29a5597faba999aeeb72bbb9c91694ef8068f0131192fb199f98d32994ef", [:mix], [], "hexpm", "35d33270680f8d839a4003c3e9f43afb595310a592405a00afc12de4c7f55a18"},
"elixir_make": {:hex, :elixir_make, "0.6.2", "7dffacd77dec4c37b39af867cedaabb0b59f6a871f89722c25b28fcd4bd70530", [:mix], [], "hexpm", "03e49eadda22526a7e5279d53321d1cced6552f344ba4e03e619063de75348d9"},
"erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"},
"esaml": {:git, "git://github.com/wrren/esaml.git", "2cace5778e4323216bcff2085ca9739e42a68a42", [branch: "ueberauth_saml"]},
"eternal": {:hex, :eternal, "1.2.1", "d5b6b2499ba876c57be2581b5b999ee9bdf861c647401066d3eeed111d096bc4", [:mix], [], "hexpm", "b14f1dc204321429479c569cfbe8fb287541184ed040956c8862cb7a677b8406"},
"eternal": {:hex, :eternal, "1.2.2", "d1641c86368de99375b98d183042dd6c2b234262b8d08dfd72b9eeaafc2a1abd", [:mix], [], "hexpm", "2c9fe32b9c3726703ba5e1d43a1d255a4f3f2d8f8f9bc19f094c7cb1a7a9e782"},
"ex_cldr": {:hex, :ex_cldr, "2.18.2", "c0557145c234a4d31ff450a0438c5a70e786ccba9449a9f9f895809be20bed7d", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.5", [hex: :certifi, repo: "hexpm", optional: true]}, {:cldr_utils, "~> 2.12", [hex: :cldr_utils, repo: "hexpm", optional: false]}, {:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:gettext, "~> 0.13", [hex: :gettext, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}, {:plug, "~> 1.9", [hex: :plug, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "ac28055ae6df438b72f98703c842c2c0d969af6bd68662a8f586862a9a0ddc79"},
"ex_cldr_calendars": {:hex, :ex_cldr_calendars, "1.12.0", "0cf7c804937a93baa9c3b471667ad05c478942865cc457e8397b5d83fc6f2c7a", [:mix], [{:calendar_interval, "~> 0.2", [hex: :calendar_interval, repo: "hexpm", optional: true]}, {:earmark, "~> 1.0", [hex: :earmark, repo: "hexpm", optional: false]}, {:ex_cldr_numbers, "~> 2.16", [hex: :ex_cldr_numbers, repo: "hexpm", optional: false]}, {:ex_cldr_units, "~> 3.3", [hex: :ex_cldr_units, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "edcb91ec52ee4e24a928e2bcf6d3354da465eced42887fbdb3f878a7a329963f"},
"ex_cldr_currencies": {:hex, :ex_cldr_currencies, "2.8.0", "b2ecc94e9fa4b8ec07614830f4d6e811e5df5e7679c6d2be92f4fe4f31184913", [:mix], [{:ex_cldr, "~> 2.18", [hex: :ex_cldr, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "a39780667b73bfd3d2bd08e61981bca23a97912b86f3236042850ecb062f48eb"},
@ -45,11 +42,11 @@
"ex_crypto": {:hex, :ex_crypto, "0.10.0", "af600a89b784b36613a989da6e998c1b200ff1214c3cfbaf8deca4aa2f0a1739", [:mix], [{:poison, ">= 2.0.0", [hex: :poison, repo: "hexpm", optional: false]}], "hexpm", "ccc7472cfe8a0f4565f97dce7e9280119bf15a5ea51c6535e5b65f00660cde1c"},
"ex_doc": {:hex, :ex_doc, "0.23.0", "a069bc9b0bf8efe323ecde8c0d62afc13d308b1fa3d228b65bca5cf8703a529d", [:mix], [{:earmark_parser, "~> 1.4.0", [hex: :earmark_parser, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}], "hexpm", "f5e2c4702468b2fd11b10d39416ddadd2fcdd173ba2a0285ebd92c39827a5a16"},
"ex_ical": {:hex, :ex_ical, "0.2.0", "4b928b554614704016cc0c9ee226eb854da9327a1cc460457621ceacb1ac29a6", [:mix], [{:timex, "~> 3.1", [hex: :timex, repo: "hexpm", optional: false]}], "hexpm", "db76473b2ae0259e6633c6c479a5a4d8603f09497f55c88f9ef4d53d2b75befb"},
"ex_machina": {:hex, :ex_machina, "2.4.0", "09a34c5d371bfb5f78399029194a8ff67aff340ebe8ba19040181af35315eabb", [:mix], [{:ecto, "~> 2.2 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_sql, "~> 3.0", [hex: :ecto_sql, repo: "hexpm", optional: true]}], "hexpm", "a20bc9ddc721b33ea913b93666c5d0bdca5cbad7a67540784ae277228832d72c"},
"ex_machina": {:hex, :ex_machina, "2.5.0", "8143cd1bf25364f197b089230c0e463941d5909b84c1a8491393ebf97a4b53fa", [:mix], [{:ecto, "~> 2.2 or ~> 3.0", [hex: :ecto, repo: "hexpm", optional: true]}, {:ecto_sql, "~> 3.0", [hex: :ecto_sql, repo: "hexpm", optional: true]}], "hexpm", "8f24851c32b3f9f8adb11335f1e4801ea76a2e0dfa21d8c4bc40ee0d6156c084"},
"ex_optimizer": {:hex, :ex_optimizer, "0.1.1", "62da37e206fc2233ff7a4e54e40eae365c40f96c81992fcd15b782eb25169b80", [:mix], [{:file_info, "~> 0.0.4", [hex: :file_info, repo: "hexpm", optional: false]}], "hexpm", "e6f5c059bcd58b66be2f6f257fdc4f69b74b0fa5c9ddd669486af012e4b52286"},
"ex_unit_notifier": {:hex, :ex_unit_notifier, "0.1.4", "36a2dcab829f506e01bf17816590680dd1474407926d43e64c1263e627c364b8", [:mix], [], "hexpm", "fddf5054dd5fd2f809e837b749570baa5c9798e11d0163921baec49b7d5762f2"},
"ex_unit_notifier": {:hex, :ex_unit_notifier, "1.0.0", "85a95b4666b1300412798c76a33344b69f00fab99519c48839780ce2678dfead", [:mix], [], "hexpm", "ed54c8cf4a4ddb3230ef8a23071dd371e5d64cc4026a2b047532c1db4ca58e6d"},
"exactor": {:hex, :exactor, "2.2.4", "5efb4ddeb2c48d9a1d7c9b465a6fffdd82300eb9618ece5d34c3334d5d7245b1", [:mix], [], "hexpm", "1222419f706e01bfa1095aec9acf6421367dcfab798a6f67c54cf784733cd6b5"},
"excoveralls": {:hex, :excoveralls, "0.13.3", "edc5f69218f84c2bf61b3609a22ddf1cec0fbf7d1ba79e59f4c16d42ea4347ed", [:mix], [{:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "cc26f48d2f68666380b83d8aafda0fffc65dafcc8d8650358e0b61f6a99b1154"},
"excoveralls": {:hex, :excoveralls, "0.13.4", "7b0baee01fe150ef81153e6ffc0fc68214737f54570dc257b3ca4da8e419b812", [:mix], [{:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "faae00b3eee35cdf0342c10b669a7c91f942728217d2a7c7f644b24d391e6190"},
"exgravatar": {:hex, :exgravatar, "2.0.2", "638412896170409da114f98947d3f8d4f38e851b0e329c1cc4cd324d5e2ea081", [:mix], [], "hexpm", "f3deb5baa6fcf354a965d794ee73a956d95f1f79f41bddf69800c713cfb014a1"},
"exjsx": {:hex, :exjsx, "4.0.0", "60548841e0212df401e38e63c0078ec57b33e7ea49b032c796ccad8cde794b5c", [:mix], [{:jsx, "~> 2.8.0", [hex: :jsx, repo: "hexpm", optional: false]}], "hexpm", "32e95820a97cffea67830e91514a2ad53b888850442d6d395f53a1ac60c82e07"},
"exvcr": {:hex, :exvcr, "0.12.2", "e8fc0beeb62924d3b755b2718a161b13cb4ed53311378e5e587606c15190c8ed", [:mix], [{:exactor, "~> 2.2", [hex: :exactor, repo: "hexpm", optional: false]}, {:exjsx, "~> 4.0", [hex: :exjsx, repo: "hexpm", optional: false]}, {:httpoison, "~> 1.0", [hex: :httpoison, repo: "hexpm", optional: true]}, {:httpotion, "~> 3.1", [hex: :httpotion, repo: "hexpm", optional: true]}, {:ibrowse, "4.4.0", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:meck, "~> 0.8", [hex: :meck, repo: "hexpm", optional: false]}], "hexpm", "63776555a1bd003ff60635aead47461ced1ff985c66427421ad344e317ba983c"},
@ -65,27 +62,24 @@
"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"},
"git_status": {:hex, :git_status, "0.1.0", "228b5d2e62c60a157314ff7398a92ab9a108005f4e532d4ecb07bc62fdd67e85", [:mix], [], "hexpm", "2393ee163f71ff75d5374bf20ceab6ea200249ed1beee5a4a31a8e599710de19"},
"guardian": {:hex, :guardian, "2.1.1", "1f02b349f6ba765647cc834036a8d76fa4bd65605342fe3a031df3c99d0d411a", [:mix], [{:jose, "~> 1.8", [hex: :jose, repo: "hexpm", optional: false]}, {:plug, "~> 1.3.3 or ~> 1.4", [hex: :plug, repo: "hexpm", optional: true]}], "hexpm", "189b87ba7ce6b40d6ba029138098b96ffc4ae78f229f5b39539b9141af8bf0f8"},
"guardian_db": {:hex, :guardian_db, "2.0.3", "18c847efbf7ec3c0dd44c7aecaeeb2777588bbb8d2073ffc36e71037108b3be6", [:mix], [{:ecto, "~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:ecto_sql, "~> 3.1", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:guardian, "~> 1.0 or ~> 2.0", [hex: :guardian, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.13", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "17306e09498bca379fb8eded2ac44d7690f738ca14b17080d06a948d034ea087"},
"guardian_db": {:hex, :guardian_db, "2.1.0", "ec95a9d99cdd1e550555d09a7bb4a340d8887aad0697f594590c2fd74be02426", [:mix], [{:ecto, "~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:ecto_sql, "~> 3.1", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:guardian, "~> 1.0 or ~> 2.0", [hex: :guardian, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.13", [hex: :postgrex, repo: "hexpm", optional: true]}], "hexpm", "f8e7d543ac92c395f3a7fd5acbe6829faeade57d688f7562e2f0fca8f94a0d70"},
"guardian_phoenix": {:hex, :guardian_phoenix, "2.0.1", "89a817265af09a6ddf7cb1e77f17ffca90cea2db10ff888375ef34502b2731b1", [:mix], [{:guardian, "~> 2.0", [hex: :guardian, repo: "hexpm", optional: false]}, {:phoenix, "~> 1.3", [hex: :phoenix, repo: "hexpm", optional: false]}], "hexpm", "21f439246715192b231f228680465d1ed5fbdf01555a4a3b17165532f5f9a08c"},
"hackney": {:hex, :hackney, "1.16.0", "5096ac8e823e3a441477b2d187e30dd3fff1a82991a806b2003845ce72ce2d84", [:rebar3], [{:certifi, "2.5.2", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "6.0.1", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "3.3.0", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.6", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm", "3bf0bebbd5d3092a3543b783bf065165fa5d3ad4b899b836810e513064134e18"},
"hammox": {:hex, :hammox, "0.2.5", "55436c392c242ae893ebddda8ad20bafb3a5fd6d9899dd44dbf29b84420cf316", [:mix], [{:mox, "~> 0.5", [hex: :mox, repo: "hexpm", optional: false]}, {:ordinal, "~> 0.1", [hex: :ordinal, repo: "hexpm", optional: false]}], "hexpm", "c4862a86eeec8531f14795b584677870c58a4c8de5eab5730904db3a27b836f2"},
"hashids": {:hex, :hashids, "2.0.4", "ea47a2c2018b7ffb4f5ac9b0f8ea0af6d6159b9e190c5ed09f0ea83276968e0f", [:mix], [], "hexpm", "812e2c7ae763609a47acdd4c64d58c72f63bcfd741e6c605127e43af1507e019"},
"hackney": {:hex, :hackney, "1.17.0", "717ea195fd2f898d9fe9f1ce0afcc2621a41ecfe137fae57e7fe6e9484b9aa99", [:rebar3], [{:certifi, "~>2.5", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "~>6.1.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "~>1.0.0", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "~>1.1.0", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}, {:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "64c22225f1ea8855f584720c0e5b3cd14095703af1c9fbc845ba042811dc671c"},
"html_entities": {:hex, :html_entities, "0.5.1", "1c9715058b42c35a2ab65edc5b36d0ea66dd083767bef6e3edb57870ef556549", [:mix], [], "hexpm", "30efab070904eb897ff05cd52fa61c1025d7f8ef3a9ca250bc4e6513d16c32de"},
"html_sanitize_ex": {:hex, :html_sanitize_ex, "1.4.0", "0310d27d7bafb662f30bff22ec732a72414799c83eaf44239781fd23b96216c0", [:mix], [{:mochiweb, "~> 2.15", [hex: :mochiweb, repo: "hexpm", optional: false]}], "hexpm", "c5d79626be0b6e50c19ecdfb783ee26e85bd3a77436b488379ce6dc104ec4593"},
"http_sign": {:hex, :http_sign, "0.1.1", "b16edb83aa282892f3271f9a048c155e772bf36e15700ab93901484c55f8dd10", [:mix], [{:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "2d4b1c2579d85534035f12c9e1260abdf6d03a9ad4f515b2ee53b50e68c8b787"},
"http_signatures": {:hex, :http_signatures, "0.1.0", "4e4b501a936dbf4cb5222597038a89ea10781776770d2e185849fa829686b34c", [:mix], [], "hexpm", "f8a7b3731e3fd17d38fa6e343fcad7b03d6874a3b0a108c8568a71ed9c2cf824"},
"httpoison": {:hex, :httpoison, "1.7.0", "abba7d086233c2d8574726227b6c2c4f6e53c4deae7fe5f6de531162ce9929a0", [:mix], [{:hackney, "~> 1.16", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "975cc87c845a103d3d1ea1ccfd68a2700c211a434d8428b10c323dc95dc5b980"},
"icalendar": {:git, "https://github.com/tcitworld/icalendar.git", "bd08e872c125f70a87c3ac7d87ea2f22a5577059", []},
"idna": {:hex, :idna, "6.0.1", "1d038fb2e7668ce41fbf681d2c45902e52b3cb9e9c77b55334353b222c2ee50c", [:rebar3], [{:unicode_util_compat, "0.5.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "a02c8a1c4fd601215bb0b0324c8a6986749f807ce35f25449ec9e69758708122"},
"httpoison": {:hex, :httpoison, "1.8.0", "6b85dea15820b7804ef607ff78406ab449dd78bed923a49c7160e1886e987a3d", [:mix], [{:hackney, "~> 1.17", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "28089eaa98cf90c66265b6b5ad87c59a3729bea2e74e9d08f9b51eb9729b3c3a"},
"icalendar": {:git, "https://github.com/tcitworld/icalendar.git", "e16a3a0b74e07ba79044361fbf5014bed344f2da", []},
"idna": {:hex, :idna, "6.1.1", "8a63070e9f7d0c62eb9d9fcb360a7de382448200fbbd1b106cc96d3d8099df8d", [:rebar3], [{:unicode_util_compat, "~>0.7.0", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "92376eb7894412ed19ac475e4a86f7b413c1b9fbb5bd16dccd57934157944cea"},
"inet_cidr": {:hex, :inet_cidr, "1.0.4", "a05744ab7c221ca8e395c926c3919a821eb512e8f36547c062f62c4ca0cf3d6e", [:mix], [], "hexpm", "64a2d30189704ae41ca7dbdd587f5291db5d1dda1414e0774c29ffc81088c1bc"},
"ip_reserved": {:hex, :ip_reserved, "0.1.0", "5c3b6df25eb875618e489db47e00fb8dac53bc2b0dc2d546b713e6141210fe9f", [:mix], [{:inet_cidr, "~> 1.0.0", [hex: :inet_cidr, repo: "hexpm", optional: false]}], "hexpm", "88b0e96f40048f214b9e90e64eaebbf18acfec066008d7ef993b08282b2fe484"},
"jason": {:hex, :jason, "1.2.2", "ba43e3f2709fd1aa1dce90aaabfd039d000469c05c56f0b8e31978e03fa39052", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "18a228f5f0058ee183f29f9eae0805c6e59d61c3b006760668d8d18ff0d12179"},
"jose": {:hex, :jose, "1.10.1", "16d8e460dae7203c6d1efa3f277e25b5af8b659febfc2f2eb4bacf87f128b80a", [:mix, :rebar3], [], "hexpm", "3c7ddc8a9394b92891db7c2771da94bf819834a1a4c92e30857b7d582e2f8257"},
"jose": {:hex, :jose, "1.11.1", "59da64010c69aad6cde2f5b9248b896b84472e99bd18f246085b7b9fe435dcdb", [:mix, :rebar3], [], "hexpm", "078f6c9fb3cd2f4cfafc972c814261a7d1e8d2b3685c0a76eb87e158efff1ac5"},
"jsx": {:hex, :jsx, "2.8.3", "a05252d381885240744d955fbe3cf810504eb2567164824e19303ea59eef62cf", [:mix, :rebar3], [], "hexpm", "fc3499fed7a726995aa659143a248534adc754ebd16ccd437cd93b649a95091f"},
"jumper": {:hex, :jumper, "1.0.1", "3c00542ef1a83532b72269fab9f0f0c82bf23a35e27d278bfd9ed0865cecabff", [:mix], [], "hexpm", "318c59078ac220e966d27af3646026db9b5a5e6703cb2aa3e26bcfaba65b7433"},
"linkify": {:hex, :linkify, "0.4.0", "7845b6ac33050a41acaf9318923ce6e7f3854418be9a5f22184de103f7a68ff9", [:mix], [], "hexpm", "a0ceb4c78591fecccf1d99fecc10c13dba75a307c663c80e28af9e2cdd9776ee"},
"junit_formatter": {:hex, :junit_formatter, "3.1.0", "3f69c61c5413750f9c45e367d77aabbeac9b395acf478d8e70b4ee9d1989c709", [:mix], [], "hexpm", "da52401a93f711fc4f77ffabdda68f9a16fcad5d96f5fce4ae606ab1d73b72f4"},
"linkify": {:hex, :linkify, "0.4.1", "f881eb3429ae88010cf736e6fb3eed406c187bcdd544902ec937496636b7c7b3", [:mix], [], "hexpm", "ce98693f54ae9ace59f2f7a8aed3de2ef311381a8ce7794804bd75484c371dda"},
"makeup": {:hex, :makeup, "1.0.5", "d5a830bc42c9800ce07dd97fa94669dfb93d3bf5fcf6ea7a0c67b2e0e4a7f26c", [:mix], [{:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "cfa158c02d3f5c0c665d0af11512fed3fba0144cf1aadee0f2ce17747fba2ca9"},
"makeup_elixir": {:hex, :makeup_elixir, "0.15.0", "98312c9f0d3730fde4049985a1105da5155bfe5c11e47bdc7406d88e01e4219b", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.1", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "75ffa34ab1056b7e24844c90bfc62aaf6f3a37a15faa76b07bc5eba27e4a8b4a"},
"meck": {:hex, :meck, "0.8.13", "ffedb39f99b0b99703b8601c6f17c7f76313ee12de6b646e671e3188401f7866", [:rebar3], [], "hexpm", "d34f013c156db51ad57cc556891b9720e6a1c1df5fe2e15af999c84d6cebeb1a"},
@ -95,7 +89,6 @@
"mimetype_parser": {:hex, :mimetype_parser, "0.1.3", "628ac9fe56aa7edcedb534d68397dd66674ab82493c8ebe39acb9a19b666099d", [:mix], [], "hexpm", "7d8f80c567807ce78cd93c938e7f4b0a20b1aaaaab914bf286f68457d9f7a852"},
"mix_test_watch": {:hex, :mix_test_watch, "1.0.2", "34900184cbbbc6b6ed616ed3a8ea9b791f9fd2088419352a6d3200525637f785", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}], "hexpm", "47ac558d8b06f684773972c6d04fcc15590abdb97aeb7666da19fcbfdc441a07"},
"mmdb2_decoder": {:hex, :mmdb2_decoder, "3.0.0", "54828676a36e75e9a25bc9a0bb0598d4c7fcc767bf0b40674850b22e05b7b6cc", [:mix], [], "hexpm", "359dc9242915538d1dceb9f6d96c72201dca76ce62e49d22e2ed1e86f20bea8e"},
"mochiweb": {:hex, :mochiweb, "2.20.1", "e4dbd0ed716f076366ecf62ada5755a844e1d95c781e8c77df1d4114be868cdf", [:rebar3], [], "hexpm", "d1aeee7870470d2fa9eae0b3d5ab6c33801aa2d82b10e9dade885c5c921b36aa"},
"mock": {:hex, :mock, "0.3.6", "e810a91fabc7adf63ab5fdbec5d9d3b492413b8cda5131a2a8aa34b4185eb9b4", [:mix], [{:meck, "~> 0.8.13", [hex: :meck, repo: "hexpm", optional: false]}], "hexpm", "bcf1d0a6826fb5aee01bae3d74474669a3fa8b2df274d094af54a25266a1ebd2"},
"mogrify": {:hex, :mogrify, "0.8.0", "3506f3ca3f7b95a155f3b4ef803b5db176f5a0633723e3fe85e0d6399e3b11c8", [:mix], [], "hexpm", "2278d245f07056ea3b586e98801e933695147066fa4cf563f552c1b4f0ff8ad9"},
"mox": {:hex, :mox, "1.0.0", "4b3c7005173f47ff30641ba044eb0fe67287743eec9bd9545e37f3002b0a9f8b", [:mix], [], "hexpm", "201b0a20b7abdaaab083e9cf97884950f8a30a1350a1da403b3145e213c6f4df"},
@ -104,9 +97,7 @@
"oauth2": {:hex, :oauth2, "2.0.0", "338382079fe16c514420fa218b0903f8ad2d4bfc0ad0c9f988867dfa246731b0", [:mix], [{:hackney, "~> 1.13", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "881b8364ac7385f9fddc7949379cbe3f7081da37233a1aa7aab844670a91e7e7"},
"oauther": {:hex, :oauther, "1.1.1", "7d8b16167bb587ecbcddd3f8792beb9ec3e7b65c1f8ebd86b8dd25318d535752", [:mix], [], "hexpm", "9374f4302045321874cccdc57eb975893643bd69c3b22bf1312dab5f06e5788e"},
"oban": {:hex, :oban, "2.3.4", "ec7509b9af2524d55f529cb7aee93d36131ae0bf0f37706f65d2fe707f4d9fd8", [:mix], [{:ecto_sql, ">= 3.4.3", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:jason, "~> 1.1", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.14", [hex: :postgrex, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c70ca0434758fd1805422ea4446af5e910ddc697c0c861549c8f0eb0cfbd2fdf"},
"ordinal": {:hex, :ordinal, "0.1.0", "2f7a1a64ff4be44b8a674718bb00d1584188fe92fa2fa48b95b1e72096d74a34", [:mix], [], "hexpm", "9f3d0a50c285ac99faa9626376e11afa6fc83d42e95166768b37d176cff485a3"},
"paddle": {:hex, :paddle, "0.1.4", "3697996d79e3d771d6f7560a23e4bad1ed7b7f7fd3e784f97bc39565963b2b13", [:mix], [], "hexpm", "fc719a9e7c86f319b9f4bf413d6f0f326b0c4930d5bc6630d074598ed38e2143"},
"parse_trans": {:hex, :parse_trans, "3.3.0", "09765507a3c7590a784615cfd421d101aec25098d50b89d7aa1d66646bc571c1", [:rebar3], [], "hexpm", "17ef63abde837ad30680ea7f857dd9e7ced9476cdd7b0394432af4bfc241b960"},
"parse_trans": {:hex, :parse_trans, "3.3.1", "16328ab840cc09919bd10dab29e431da3af9e9e7e7e6f0089dd5a2d2820011d8", [:rebar3], [], "hexpm", "07cd9577885f56362d414e8c4c4e6bdf10d43a8767abb92d24cbe8b24c54888b"},
"phoenix": {:hex, :phoenix, "1.5.7", "2923bb3af924f184459fe4fa4b100bd25fa6468e69b2803dfae82698269aa5e0", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:phoenix_html, "~> 2.13", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:phoenix_pubsub, "~> 2.0", [hex: :phoenix_pubsub, repo: "hexpm", optional: false]}, {:plug, "~> 1.10", [hex: :plug, repo: "hexpm", optional: false]}, {:plug_cowboy, "~> 1.0 or ~> 2.2", [hex: :plug_cowboy, repo: "hexpm", optional: true]}, {:plug_crypto, "~> 1.1.2 or ~> 1.2", [hex: :plug_crypto, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "774cd64417c5a3788414fdbb2be2eb9bcd0c048d9e6ad11a0c1fd67b7c0d0978"},
"phoenix_ecto": {:hex, :phoenix_ecto, "4.2.1", "13f124cf0a3ce0f1948cf24654c7b9f2347169ff75c1123f44674afee6af3b03", [:mix], [{:ecto, "~> 3.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.14.2 or ~> 2.15", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:plug, "~> 1.0", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "478a1bae899cac0a6e02be1deec7e2944b7754c04e7d4107fc5a517f877743c0"},
"phoenix_html": {:hex, :phoenix_html, "2.14.3", "51f720d0d543e4e157ff06b65de38e13303d5778a7919bcc696599e5934271b8", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "efd697a7fff35a13eeeb6b43db884705cba353a1a41d127d118fda5f90c8e80f"},
@ -116,9 +107,8 @@
"plug_cowboy": {:hex, :plug_cowboy, "2.4.1", "779ba386c0915027f22e14a48919a9545714f849505fa15af2631a0d298abf0f", [:mix], [{:cowboy, "~> 2.7", [hex: :cowboy, repo: "hexpm", optional: false]}, {:cowboy_telemetry, "~> 0.3", [hex: :cowboy_telemetry, repo: "hexpm", optional: false]}, {:plug, "~> 1.7", [hex: :plug, repo: "hexpm", optional: false]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "d72113b6dff7b37a7d9b2a5b68892808e3a9a752f2bf7e503240945385b70507"},
"plug_crypto": {:hex, :plug_crypto, "1.2.0", "1cb20793aa63a6c619dd18bb33d7a3aa94818e5fd39ad357051a67f26dfa2df6", [:mix], [], "hexpm", "a48b538ae8bf381ffac344520755f3007cc10bd8e90b240af98ea29b69683fc2"},
"poison": {:hex, :poison, "4.0.1", "bcb755a16fac91cad79bfe9fc3585bb07b9331e50cfe3420a24bcc2d735709ae", [:mix], [], "hexpm", "ba8836feea4b394bb718a161fc59a288fe0109b5006d6bdf97b6badfcf6f0f25"},
"poolboy": {:hex, :poolboy, "1.5.2", "392b007a1693a64540cead79830443abf5762f5d30cf50bc95cb2c1aaafa006b", [:rebar3], [], "hexpm", "dad79704ce5440f3d5a3681c8590b9dc25d1a561e8f5a9c995281012860901e3"},
"postgrex": {:hex, :postgrex, "0.15.7", "724410acd48abac529d0faa6c2a379fb8ae2088e31247687b16cacc0e0883372", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "88310c010ff047cecd73d5ceca1d99205e4b1ab1b9abfdab7e00f5c9d20ef8f9"},
"progress_bar": {:hex, :progress_bar, "2.0.0", "447285f533b4b8717881fdb7160c7360c2f2ab57276f8904ce6d40482857e573", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: false]}], "hexpm", "9d8b879f322fd5563e8e7ec39f1d02a9da3ffc36019f05287788744e88260fde"},
"postgrex": {:hex, :postgrex, "0.15.8", "f5e782bbe5e8fa178d5e3cd1999c857dc48eda95f0a4d7f7bd92a50e84a0d491", [:mix], [{:connection, "~> 1.0", [hex: :connection, repo: "hexpm", optional: false]}, {:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "698fbfacea34c4cf22c8281abeb5cf68d99628d541874f085520ab3b53d356fe"},
"progress_bar": {:hex, :progress_bar, "2.0.1", "7b40200112ae533d5adceb80ff75fbe66dc753bca5f6c55c073bfc122d71896d", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}], "hexpm", "2519eb58a2f149a3a094e729378256d8cb6d96a259ec94841bd69fdc71f18f87"},
"ranch": {:hex, :ranch, "1.7.1", "6b1fab51b49196860b733a49c07604465a47bdb78aa10c1c16a3d199f7f8c881", [:rebar3], [], "hexpm", "451d8527787df716d99dc36162fca05934915db0b6141bbdac2ea8d3c7afc7d7"},
"remote_ip": {:hex, :remote_ip, "0.2.1", "cd27cd8ea54ecaaf3532776ff4c5e353b3804e710302e88c01eadeaaf42e7e24", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:inet_cidr, "~> 1.0", [hex: :inet_cidr, repo: "hexpm", optional: false]}, {:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "2e7ab1a461cc3cd5719f37e116a08f45c8b8493923063631b164315d6b7ee8e0"},
"rsa_ex": {:hex, :rsa_ex, "0.4.0", "e28dd7dc5236e156df434af0e4aa822384c8866c928e17b785d4edb7c253b558", [:mix], [], "hexpm", "40e1f08e8401da4be59a6dd0f4da30c42d5bb01703161f0208d839d97db27f4e"},
@ -126,23 +116,21 @@
"sitemapper": {:hex, :sitemapper, "0.5.0", "23b0bb7b3888f03d4e4e5bedb7034e6d2979e169366372d960d6f433112b9bdf", [:mix], [{:ex_aws_s3, "~> 2.0", [hex: :ex_aws_s3, repo: "hexpm", optional: true]}, {:xml_builder, "~> 2.1.1", [hex: :xml_builder, repo: "hexpm", optional: false]}], "hexpm", "be7acff8d0245aa7ca125b9c4d0751009bbbca26ef866d888fef4fdf98670e41"},
"sleeplocks": {:hex, :sleeplocks, "1.1.1", "3d462a0639a6ef36cc75d6038b7393ae537ab394641beb59830a1b8271faeed3", [:rebar3], [], "hexpm", "84ee37aeff4d0d92b290fff986d6a95ac5eedf9b383fadfd1d88e9b84a1c02e1"},
"slugger": {:hex, :slugger, "0.3.0", "efc667ab99eee19a48913ccf3d038b1fb9f165fa4fbf093be898b8099e61b6ed", [:mix], [], "hexpm", "20d0ded0e712605d1eae6c5b4889581c3460d92623a930ddda91e0e609b5afba"},
"sobelow": {:hex, :sobelow, "0.11.0", "cdc17e3a9f1ea78dc55dbe0a03121cb6767fef737c6d9f1e62ee7e78730abccc", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "c57807bfe6f231338b657781f89ef0320b66a0dbe779aa911d6ed27cfa14ae6e"},
"ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.6", "cf344f5692c82d2cd7554f5ec8fd961548d4fd09e7d22f5b62482e5aeaebd4b0", [:make, :mix, :rebar3], [], "hexpm", "bdb0d2471f453c88ff3908e7686f86f9be327d065cc1ec16fa4540197ea04680"},
"telemetry": {:hex, :telemetry, "0.4.2", "2808c992455e08d6177322f14d3bdb6b625fbcfd233a73505870d8738a2f4599", [:rebar3], [], "hexpm", "2d1419bd9dda6a206d7b5852179511722e2b18812310d304620c7bd92a13fcef"},
"tesla": {:hex, :tesla, "1.4.0", "1081bef0124b8bdec1c3d330bbe91956648fb008cf0d3950a369cda466a31a87", [:mix], [{:castore, "~> 0.1", [hex: :castore, repo: "hexpm", optional: true]}, {:exjsx, ">= 3.0.0", [hex: :exjsx, repo: "hexpm", optional: true]}, {:finch, "~> 0.3", [hex: :finch, repo: "hexpm", optional: true]}, {:fuse, "~> 2.4", [hex: :fuse, repo: "hexpm", optional: true]}, {:gun, "~> 1.3", [hex: :gun, repo: "hexpm", optional: true]}, {:hackney, "~> 1.6", [hex: :hackney, repo: "hexpm", optional: true]}, {:ibrowse, "~> 4.4.0", [hex: :ibrowse, repo: "hexpm", optional: true]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: true]}, {:mime, "~> 1.0", [hex: :mime, repo: "hexpm", optional: false]}, {:mint, "~> 1.0", [hex: :mint, repo: "hexpm", optional: true]}, {:poison, ">= 1.0.0", [hex: :poison, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4", [hex: :telemetry, repo: "hexpm", optional: true]}], "hexpm", "bf1374a5569f5fca8e641363b63f7347d680d91388880979a33bc12a6eb3e0aa"},
"timex": {:hex, :timex, "3.6.2", "845cdeb6119e2fef10751c0b247b6c59d86d78554c83f78db612e3290f819bc2", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 0.1.8 or ~> 0.5 or ~> 1.0.0", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "26030b46199d02a590be61c2394b37ea25a3664c02fafbeca0b24c972025d47a"},
"tzdata": {:hex, :tzdata, "1.0.4", "a3baa4709ea8dba552dca165af6ae97c624a2d6ac14bd265165eaa8e8af94af6", [:mix], [{:hackney, "~> 1.0", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "b02637db3df1fd66dd2d3c4f194a81633d0e4b44308d36c1b2fdfd1e4e6f169b"},
"timex": {:hex, :timex, "3.6.3", "58ce6c9eda8ed47fc80c24dde09d481465838d3bcfc230949287fc1b0b0041c1", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 0.1.8 or ~> 0.5 or ~> 1.0.0", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "6d69f4f95fcf5684102a9cb3cf92c5ba6545bd60ed8d8a6a93cd2a4a4fb0d9ec"},
"tzdata": {:hex, :tzdata, "1.0.5", "69f1ee029a49afa04ad77801febaf69385f3d3e3d1e4b56b9469025677b89a28", [:mix], [{:hackney, "~> 1.0", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "55519aa2a99e5d2095c1e61cc74c9be69688f8ab75c27da724eb8279ff402a5a"},
"ueberauth": {:hex, :ueberauth, "0.6.3", "d42ace28b870e8072cf30e32e385579c57b9cc96ec74fa1f30f30da9c14f3cc0", [:mix], [{:plug, "~> 1.5", [hex: :plug, repo: "hexpm", optional: false]}], "hexpm", "afc293d8a1140d6591b53e3eaf415ca92842cb1d32fad3c450c6f045f7f91b60"},
"ueberauth_discord": {:hex, :ueberauth_discord, "0.5.2", "afc5d68879575c365972fd4d7cf7b01c16f7d062fc6bf7e86e2595736ac41127", [:mix], [{:oauth2, "~> 1.0 or ~> 2.0", [hex: :oauth2, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.6.3", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "bbd7701d8fef02623fb106ed7c24427ed2327ef769bcb1d2eba5670e54716cdc"},
"ueberauth_facebook": {:hex, :ueberauth_facebook, "0.8.1", "c254be4ab367c276773c2e41d3c0fe343ae118e244afc8d5a4e3e5c438951fdc", [:mix], [{:oauth2, "~> 1.0 or ~> 2.0", [hex: :oauth2, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.6.0", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "c2cf210ef45bd20611234ef17517f9d1dff6b31d3fb6ad96789143eb0943f540"},
"ueberauth_github": {:hex, :ueberauth_github, "0.8.0", "2216c8cdacee0de6245b422fb397921b64a29416526985304e345dab6a799d17", [:mix], [{:oauth2, "~> 1.0 or ~> 2.0", [hex: :oauth2, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.6.0", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "b65ccc001a7b0719ba069452f3333d68891f4613ae787a340cce31e2a43307a3"},
"ueberauth_gitlab_strategy": {:git, "https://github.com/tcitworld/ueberauth_gitlab.git", "9fc5d30b5d87ff7cdef293a1c128f25777dcbe59", [branch: "upgrade-deps"]},
"ueberauth_google": {:hex, :ueberauth_google, "0.10.0", "ae00e7228207be977d5cdd0a562e39961851cea74f513aab6446cb51468f283c", [:mix], [{:oauth2, "~> 1.0 or ~> 2.0", [hex: :oauth2, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.6.3", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "148e2575fd24a29b8bcaa44f9d3d1a38550a74ceed645f5059d4516b93992650"},
"ueberauth_keycloak": {:git, "https://github.com/tcitworld/ueberauth_keycloak.git", "02447d8a75bd36ba26c17c7b1b8bab3538bb2e7a", [branch: "upgrade-deps"]},
"ueberauth_keycloak_strategy": {:git, "https://github.com/tcitworld/ueberauth_keycloak.git", "d892f0f9daf9e0023319b69ac2f7c2c6edff2b14", [branch: "upgrade-deps"]},
"ueberauth_saml": {:git, "https://github.com/wrren/ueberauth_saml.git", "dfcb4ae3f509afec0f442ce455c41feacac24511", []},
"ueberauth_twitter": {:hex, :ueberauth_twitter, "0.4.0", "4b98620341bc91bac90459093bba093c650823b6e2df35b70255c493c17e9227", [:mix], [{:httpoison, "~> 1.0", [hex: :httpoison, repo: "hexpm", optional: false]}, {:oauther, "~> 1.1", [hex: :oauther, repo: "hexpm", optional: false]}, {:ueberauth, "~> 0.6", [hex: :ueberauth, repo: "hexpm", optional: false]}], "hexpm", "fb29c9047ca263038c0c61f5a0ec8597e8564aba3f2b4cb02704b60205fd4468"},
"unicode_util_compat": {:hex, :unicode_util_compat, "0.5.0", "8516502659002cec19e244ebd90d312183064be95025a319a6c7e89f4bccd65b", [:rebar3], [], "hexpm", "d48d002e15f5cc105a696cf2f1bbb3fc72b4b770a184d8420c8db20da2674b38"},
"unicode_util_compat": {:hex, :unicode_util_compat, "0.7.0", "bc84380c9ab48177092f43ac89e4dfa2c6d62b40b8bd132b1059ecc7232f9a78", [:rebar3], [], "hexpm", "25eee6d67df61960cf6a794239566599b09e17e668d3700247bc498638152521"},
"unsafe": {:hex, :unsafe, "1.0.1", "a27e1874f72ee49312e0a9ec2e0b27924214a05e3ddac90e91727bc76f8613d8", [:mix], [], "hexpm", "6c7729a2d214806450d29766abc2afaa7a2cbecf415be64f36a6691afebb50e5"},
"uuid": {:git, "git://github.com/botsunit/erlang-uuid", "1effbbbd200f9f5d9d5154e81b83fe8e4c3fe714", [branch: "master"]},
"xml_builder": {:hex, :xml_builder, "2.1.4", "e60e21c0a39b9dd8dec1db5a2525c713f7fe4e85ed247caedf22a9bcdd2d5069", [:mix], [], "hexpm", "48188a4df8b9168ceb8318d128299bce064d272e18967349b2592347c434e677"},
}

View File

@ -20,11 +20,6 @@ msgstr ""
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/service/export/feed.ex:170
msgid "Feed for %{email} on Mobilizon"
msgstr ""
#, elixir-format
#: lib/web/templates/email/report.html.eex:74
msgid "%{title} by %{creator}"
@ -145,7 +140,7 @@ msgid "Warning"
msgstr "تنبيه"
#, elixir-format
#: lib/web/email/participation.ex:134
#: lib/web/email/participation.ex:135
msgid "Confirm your participation to event %{title}"
msgstr ""
@ -328,7 +323,7 @@ msgid "Mobilizon on %{instance}: email changed"
msgstr ""
#, elixir-format
#: lib/web/email/notification.ex:46
#: lib/web/email/notification.ex:47
msgid "One event planned today"
msgid_plural "%{nb_events} events planned today"
msgstr[0] ""
@ -389,12 +384,12 @@ msgid "View the event on: %{link}"
msgstr ""
#, elixir-format
#: lib/web/email/group.ex:32
#: lib/web/email/group.ex:33
msgid "You have been invited by %{inviter} to join group %{group}"
msgstr ""
#, elixir-format
#: lib/web/email/notification.ex:70
#: lib/web/email/notification.ex:71
msgid "One event planned this week"
msgid_plural "%{nb_events} events planned this week"
msgstr[0] ""
@ -405,7 +400,7 @@ msgstr[4] ""
msgstr[5] ""
#, elixir-format
#: lib/web/email/notification.ex:92
#: lib/web/email/notification.ex:93
msgid "One participation request for event %{title} to process"
msgid_plural "%{number_participation_requests} participation requests for event %{title} to process"
msgstr[0] ""
@ -1081,7 +1076,7 @@ msgid "So long, and thanks for the fish!"
msgstr ""
#, elixir-format
#: lib/web/email/group.ex:62
#: lib/web/email/group.ex:63
msgid "You have been removed from group %{group}"
msgstr ""
@ -1137,12 +1132,12 @@ msgid "Your instance's moderation team has decided to suspend %{group_name} (%{g
msgstr ""
#, elixir-format
#: lib/web/email/group.ex:135
#: lib/web/email/group.ex:136
msgid "The group %{group} has been deleted on %{instance}"
msgstr ""
#, elixir-format
#: lib/web/email/group.ex:96
#: lib/web/email/group.ex:97
msgid "The group %{group} has been suspended on %{instance}"
msgstr ""
@ -1302,12 +1297,12 @@ msgid "You have now confirmed your participation. Update your calendar, because
msgstr ""
#, elixir-format
#: lib/mobilizon/posts/post.ex:91
#: lib/mobilizon/posts/post.ex:94
msgid "A text is required for the post"
msgstr ""
#, elixir-format
#: lib/mobilizon/posts/post.ex:90
#: lib/mobilizon/posts/post.ex:93
msgid "A title is required for the post"
msgstr ""
@ -1399,3 +1394,23 @@ msgstr ""
#: lib/web/templates/email/email.text.eex:4
msgid "This is a demonstration site to test Mobilizon."
msgstr ""
#, elixir-format
#: lib/service/metadata/actor.ex:53 lib/service/metadata/actor.ex:60
msgid "%{name}'s feed"
msgstr ""
#, elixir-format
#: lib/service/export/feed.ex:77
msgid "%{actor}'s private events feed on %{instance}"
msgstr ""
#, elixir-format
#: lib/service/export/feed.ex:72
msgid "%{actor}'s public events feed on %{instance}"
msgstr ""
#, elixir-format
#: lib/service/export/feed.ex:203
msgid "Feed for %{email} on %{instance}"
msgstr ""

View File

@ -124,12 +124,12 @@ msgid "Cannot refresh the token"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/group.ex:198
#: lib/graphql/resolvers/group.ex:195
msgid "Current profile is not a member of this group"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/group.ex:202
#: lib/graphql/resolvers/group.ex:199
msgid "Current profile is not an administrator of the selected group"
msgstr ""
@ -139,13 +139,13 @@ msgid "Error while saving user settings"
msgstr ""
#, elixir-format
#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:195
#: lib/graphql/resolvers/group.ex:226 lib/graphql/resolvers/group.ex:261 lib/graphql/resolvers/member.ex:80
#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:192
#: lib/graphql/resolvers/group.ex:223 lib/graphql/resolvers/group.ex:258 lib/graphql/resolvers/member.ex:80
msgid "Group not found"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/group.ex:66
#: lib/graphql/resolvers/group.ex:63
msgid "Group with ID %{id} not found"
msgstr ""
@ -155,7 +155,7 @@ msgid "Impossible to authenticate, either your email or password are invalid."
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/group.ex:258
#: lib/graphql/resolvers/group.ex:255
msgid "Member not found"
msgstr ""
@ -171,16 +171,15 @@ msgid "No user to validate with this email was found"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/person.ex:229 lib/graphql/resolvers/user.ex:76
#: lib/graphql/resolvers/user.ex:219
#: lib/graphql/resolvers/person.ex:249 lib/graphql/resolvers/user.ex:219
msgid "No user with this email was found"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/feed_token.ex:28
#: lib/graphql/resolvers/participant.ex:29 lib/graphql/resolvers/participant.ex:160
#: lib/graphql/resolvers/participant.ex:189 lib/graphql/resolvers/person.ex:153 lib/graphql/resolvers/person.ex:187
#: lib/graphql/resolvers/person.ex:253 lib/graphql/resolvers/person.ex:282 lib/graphql/resolvers/person.ex:295
#: lib/graphql/resolvers/participant.ex:28 lib/graphql/resolvers/participant.ex:159
#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:161 lib/graphql/resolvers/person.ex:195
#: lib/graphql/resolvers/person.ex:273 lib/graphql/resolvers/person.ex:302 lib/graphql/resolvers/person.ex:315
msgid "Profile is not owned by authenticated user"
msgstr ""
@ -246,22 +245,22 @@ msgid "User requested is not logged-in"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/group.ex:232
#: lib/graphql/resolvers/group.ex:229
msgid "You are already a member of this group"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/group.ex:265
#: lib/graphql/resolvers/group.ex:262
msgid "You can't leave this group because you are the only administrator"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/group.ex:229
#: lib/graphql/resolvers/group.ex:226
msgid "You cannot join this group"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/group.ex:94
#: lib/graphql/resolvers/group.ex:91
msgid "You may not list groups unless moderator."
msgstr ""
@ -276,7 +275,7 @@ msgid "You need to be logged-in to change your password"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/group.ex:207
#: lib/graphql/resolvers/group.ex:204
msgid "You need to be logged-in to delete a group"
msgstr ""
@ -286,25 +285,20 @@ msgid "You need to be logged-in to delete your account"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/group.ex:237
#: lib/graphql/resolvers/group.ex:234
msgid "You need to be logged-in to join a group"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/group.ex:270
#: lib/graphql/resolvers/group.ex:267
msgid "You need to be logged-in to leave a group"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/group.ex:172
#: lib/graphql/resolvers/group.ex:169
msgid "You need to be logged-in to update a group"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/user.ex:58
msgid "You need to have admin access to list users"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/user.ex:108
msgid "You need to have an existing token to get a refresh token"
@ -356,22 +350,22 @@ msgid "Profile already suspended"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/participant.ex:93
#: lib/graphql/resolvers/participant.ex:92
msgid "A valid email is required by your instance"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/participant.ex:87
#: lib/graphql/resolvers/participant.ex:86
msgid "Anonymous participation is not enabled"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/person.ex:184
#: lib/graphql/resolvers/person.ex:192
msgid "Cannot remove the last administrator of a group"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/person.ex:181
#: lib/graphql/resolvers/person.ex:189
msgid "Cannot remove the last identity of a user"
msgstr ""
@ -381,7 +375,7 @@ msgid "Comment is already deleted"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/discussion.ex:61
#: lib/graphql/resolvers/discussion.ex:62
msgid "Discussion not found"
msgstr ""
@ -396,29 +390,29 @@ msgid "Error while updating report"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/participant.ex:128
#: lib/graphql/resolvers/participant.ex:127
msgid "Event id not found"
msgstr ""
#, elixir-format
#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:235
#: lib/graphql/resolvers/event.ex:279
#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:236
#: lib/graphql/resolvers/event.ex:280
msgid "Event not found"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/participant.ex:84
#: lib/graphql/resolvers/participant.ex:125 lib/graphql/resolvers/participant.ex:157
#: lib/graphql/resolvers/participant.ex:83
#: lib/graphql/resolvers/participant.ex:124 lib/graphql/resolvers/participant.ex:156
msgid "Event with this ID %{id} doesn't exist"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/participant.ex:100
#: lib/graphql/resolvers/participant.ex:99
msgid "Internal Error"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/discussion.ex:193
#: lib/graphql/resolvers/discussion.ex:186
msgid "No discussion with ID %{id}"
msgstr ""
@ -433,14 +427,14 @@ msgid "No such feed token"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/participant.ex:238
#: lib/graphql/resolvers/participant.ex:237
msgid "Participant already has role %{role}"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/participant.ex:170
#: lib/graphql/resolvers/participant.ex:199 lib/graphql/resolvers/participant.ex:231
#: lib/graphql/resolvers/participant.ex:241
#: lib/graphql/resolvers/participant.ex:169
#: lib/graphql/resolvers/participant.ex:198 lib/graphql/resolvers/participant.ex:230
#: lib/graphql/resolvers/participant.ex:240
msgid "Participant not found"
msgstr ""
@ -450,22 +444,17 @@ msgid "Person with ID %{id} not found"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/person.ex:50
#: lib/graphql/resolvers/person.ex:51
msgid "Person with username %{username} not found"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/picture.ex:41
msgid "Picture with ID %{id} was not found"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/post.ex:165 lib/graphql/resolvers/post.ex:198
#: lib/graphql/resolvers/post.ex:167 lib/graphql/resolvers/post.ex:200
msgid "Post ID is not a valid ID"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/post.ex:168 lib/graphql/resolvers/post.ex:201
#: lib/graphql/resolvers/post.ex:170 lib/graphql/resolvers/post.ex:203
msgid "Post doesn't exist"
msgstr ""
@ -480,8 +469,8 @@ msgid "Profile is already a member of this group"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/post.ex:131 lib/graphql/resolvers/post.ex:171
#: lib/graphql/resolvers/post.ex:204 lib/graphql/resolvers/resource.ex:87 lib/graphql/resolvers/resource.ex:124
#: lib/graphql/resolvers/post.ex:132 lib/graphql/resolvers/post.ex:173
#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:87 lib/graphql/resolvers/resource.ex:124
#: lib/graphql/resolvers/resource.ex:153 lib/graphql/resolvers/resource.ex:182 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
@ -489,12 +478,12 @@ msgid "Profile is not member of group"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/person.ex:150 lib/graphql/resolvers/person.ex:178
#: lib/graphql/resolvers/person.ex:158 lib/graphql/resolvers/person.ex:186
msgid "Profile not found"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/event.ex:101 lib/graphql/resolvers/participant.ex:235
#: lib/graphql/resolvers/event.ex:100 lib/graphql/resolvers/participant.ex:234
msgid "Provided moderator profile doesn't have permission on this event"
msgstr ""
@ -509,12 +498,12 @@ msgid "Resource doesn't exist"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/participant.ex:121
#: lib/graphql/resolvers/participant.ex:120
msgid "The event has already reached its maximum capacity"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/participant.ex:261
#: lib/graphql/resolvers/participant.ex:260
msgid "This token is invalid"
msgstr ""
@ -540,22 +529,22 @@ msgid "Token is not a valid UUID"
msgstr ""
#, elixir-format
#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:317
#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:331
msgid "User not found"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/person.ex:232
#: lib/graphql/resolvers/person.ex:252
msgid "You already have a profile for this user"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/participant.ex:131
#: lib/graphql/resolvers/participant.ex:130
msgid "You are already a participant of this event"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/discussion.ex:197
#: lib/graphql/resolvers/discussion.ex:190
msgid "You are not a member of the group the discussion belongs to"
msgstr ""
@ -595,8 +584,8 @@ msgid "You are not allowed to update a comment if not connected"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/participant.ex:164
#: lib/graphql/resolvers/participant.ex:193
#: lib/graphql/resolvers/participant.ex:163
#: lib/graphql/resolvers/participant.ex:192
msgid "You can't leave event because you're the only event creator participant"
msgstr ""
@ -611,7 +600,7 @@ msgid "You cannot delete this comment"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/event.ex:275
#: lib/graphql/resolvers/event.ex:276
msgid "You cannot delete this event"
msgstr ""
@ -661,7 +650,7 @@ msgid "You need to be logged-in and an administrator to save admin settings"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/discussion.ex:75
#: lib/graphql/resolvers/discussion.ex:76
msgid "You need to be logged-in to access discussions"
msgstr ""
@ -671,12 +660,12 @@ msgid "You need to be logged-in to access resources"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/event.ex:210
#: lib/graphql/resolvers/event.ex:211
msgid "You need to be logged-in to create events"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/post.ex:139
#: lib/graphql/resolvers/post.ex:140
msgid "You need to be logged-in to create posts"
msgstr ""
@ -691,12 +680,12 @@ msgid "You need to be logged-in to create resources"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/event.ex:284
#: lib/graphql/resolvers/event.ex:285
msgid "You need to be logged-in to delete an event"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/post.ex:209
#: lib/graphql/resolvers/post.ex:211
msgid "You need to be logged-in to delete posts"
msgstr ""
@ -706,22 +695,22 @@ msgid "You need to be logged-in to delete resources"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/participant.ex:105
#: lib/graphql/resolvers/participant.ex:104
msgid "You need to be logged-in to join an event"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/participant.ex:204
#: lib/graphql/resolvers/participant.ex:203
msgid "You need to be logged-in to leave an event"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/event.ex:249
#: lib/graphql/resolvers/event.ex:250
msgid "You need to be logged-in to update an event"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/post.ex:176
#: lib/graphql/resolvers/post.ex:178
msgid "You need to be logged-in to update posts"
msgstr ""
@ -735,11 +724,6 @@ msgstr ""
msgid "You need to be logged-in to view a resource preview"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/picture.ex:79
msgid "You need to login to upload a picture"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/resource.ex:121
msgid "Parent resource doesn't belong to this group"
@ -816,22 +800,22 @@ msgid "You can't reject this invitation with this profile."
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/picture.ex:71
#: lib/graphql/resolvers/media.ex:62
msgid "File doesn't have an allowed MIME type."
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/group.ex:167
#: lib/graphql/resolvers/group.ex:164
msgid "Profile is not administrator for the group"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/event.ex:238
#: lib/graphql/resolvers/event.ex:239
msgid "You can't edit this event."
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/event.ex:241
#: lib/graphql/resolvers/event.ex:242
msgid "You can't attribute this event to this profile."
msgstr ""
@ -851,21 +835,27 @@ msgid "You don't have the right to remove this member."
msgstr ""
#, elixir-format
#: lib/mobilizon/actors/actor.ex:344
#: lib/mobilizon/actors/actor.ex:351
msgid "This username is already taken."
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/discussion.ex:72
#: lib/graphql/resolvers/discussion.ex:73
msgid "You must provide either an ID or a slug to access a discussion"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/event.ex:199
#: lib/graphql/resolvers/event.ex:200
msgid "Organizer profile is not owned by the user"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/participant.ex:90
#: lib/graphql/resolvers/participant.ex:89
msgid "Profile ID provided is not the anonymous profile one"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/person.ex:128 lib/graphql/resolvers/person.ex:155
#: lib/graphql/resolvers/person.ex:246
msgid "The provided picture is too heavy"
msgstr ""

View File

@ -17,11 +17,6 @@ msgstr ""
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/service/export/feed.ex:170
msgid "Feed for %{email} on Mobilizon"
msgstr ""
#, elixir-format
#: lib/web/templates/email/report.html.eex:74
msgid "%{title} by %{creator}"
@ -142,7 +137,7 @@ msgid "Warning"
msgstr ""
#, elixir-format
#: lib/web/email/participation.ex:134
#: lib/web/email/participation.ex:135
msgid "Confirm your participation to event %{title}"
msgstr ""
@ -325,7 +320,7 @@ msgid "Mobilizon on %{instance}: email changed"
msgstr ""
#, elixir-format
#: lib/web/email/notification.ex:46
#: lib/web/email/notification.ex:47
msgid "One event planned today"
msgid_plural "%{nb_events} events planned today"
msgstr[0] ""
@ -380,12 +375,12 @@ msgid "View the event on: %{link}"
msgstr ""
#, elixir-format
#: lib/web/email/group.ex:32
#: lib/web/email/group.ex:33
msgid "You have been invited by %{inviter} to join group %{group}"
msgstr ""
#, elixir-format
#: lib/web/email/notification.ex:70
#: lib/web/email/notification.ex:71
msgid "One event planned this week"
msgid_plural "%{nb_events} events planned this week"
msgstr[0] ""
@ -393,7 +388,7 @@ msgstr[1] ""
msgstr[2] ""
#, elixir-format
#: lib/web/email/notification.ex:92
#: lib/web/email/notification.ex:93
msgid "One participation request for event %{title} to process"
msgid_plural "%{number_participation_requests} participation requests for event %{title} to process"
msgstr[0] ""
@ -1057,7 +1052,7 @@ msgid "So long, and thanks for the fish!"
msgstr ""
#, elixir-format
#: lib/web/email/group.ex:62
#: lib/web/email/group.ex:63
msgid "You have been removed from group %{group}"
msgstr ""
@ -1113,12 +1108,12 @@ msgid "Your instance's moderation team has decided to suspend %{group_name} (%{g
msgstr ""
#, elixir-format
#: lib/web/email/group.ex:135
#: lib/web/email/group.ex:136
msgid "The group %{group} has been deleted on %{instance}"
msgstr ""
#, elixir-format
#: lib/web/email/group.ex:96
#: lib/web/email/group.ex:97
msgid "The group %{group} has been suspended on %{instance}"
msgstr ""
@ -1278,12 +1273,12 @@ msgid "You have now confirmed your participation. Update your calendar, because
msgstr ""
#, elixir-format
#: lib/mobilizon/posts/post.ex:91
#: lib/mobilizon/posts/post.ex:94
msgid "A text is required for the post"
msgstr ""
#, elixir-format
#: lib/mobilizon/posts/post.ex:90
#: lib/mobilizon/posts/post.ex:93
msgid "A title is required for the post"
msgstr ""
@ -1375,3 +1370,23 @@ msgstr ""
#: lib/web/templates/email/email.text.eex:4
msgid "This is a demonstration site to test Mobilizon."
msgstr ""
#, elixir-format
#: lib/service/metadata/actor.ex:53 lib/service/metadata/actor.ex:60
msgid "%{name}'s feed"
msgstr ""
#, elixir-format
#: lib/service/export/feed.ex:77
msgid "%{actor}'s private events feed on %{instance}"
msgstr ""
#, elixir-format
#: lib/service/export/feed.ex:72
msgid "%{actor}'s public events feed on %{instance}"
msgstr ""
#, elixir-format
#: lib/service/export/feed.ex:203
msgid "Feed for %{email} on %{instance}"
msgstr ""

View File

@ -98,12 +98,12 @@ msgid "Cannot refresh the token"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/group.ex:198
#: lib/graphql/resolvers/group.ex:195
msgid "Current profile is not a member of this group"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/group.ex:202
#: lib/graphql/resolvers/group.ex:199
msgid "Current profile is not an administrator of the selected group"
msgstr ""
@ -113,13 +113,13 @@ msgid "Error while saving user settings"
msgstr ""
#, elixir-format
#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:195
#: lib/graphql/resolvers/group.ex:226 lib/graphql/resolvers/group.ex:261 lib/graphql/resolvers/member.ex:80
#: lib/graphql/error.ex:90 lib/graphql/resolvers/group.ex:192
#: lib/graphql/resolvers/group.ex:223 lib/graphql/resolvers/group.ex:258 lib/graphql/resolvers/member.ex:80
msgid "Group not found"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/group.ex:66
#: lib/graphql/resolvers/group.ex:63
msgid "Group with ID %{id} not found"
msgstr ""
@ -129,7 +129,7 @@ msgid "Impossible to authenticate, either your email or password are invalid."
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/group.ex:258
#: lib/graphql/resolvers/group.ex:255
msgid "Member not found"
msgstr ""
@ -145,16 +145,15 @@ msgid "No user to validate with this email was found"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/person.ex:229 lib/graphql/resolvers/user.ex:76
#: lib/graphql/resolvers/user.ex:219
#: lib/graphql/resolvers/person.ex:249 lib/graphql/resolvers/user.ex:219
msgid "No user with this email was found"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/feed_token.ex:28
#: lib/graphql/resolvers/participant.ex:29 lib/graphql/resolvers/participant.ex:160
#: lib/graphql/resolvers/participant.ex:189 lib/graphql/resolvers/person.ex:153 lib/graphql/resolvers/person.ex:187
#: lib/graphql/resolvers/person.ex:253 lib/graphql/resolvers/person.ex:282 lib/graphql/resolvers/person.ex:295
#: lib/graphql/resolvers/participant.ex:28 lib/graphql/resolvers/participant.ex:159
#: lib/graphql/resolvers/participant.ex:188 lib/graphql/resolvers/person.ex:161 lib/graphql/resolvers/person.ex:195
#: lib/graphql/resolvers/person.ex:273 lib/graphql/resolvers/person.ex:302 lib/graphql/resolvers/person.ex:315
msgid "Profile is not owned by authenticated user"
msgstr ""
@ -220,22 +219,22 @@ msgid "User requested is not logged-in"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/group.ex:232
#: lib/graphql/resolvers/group.ex:229
msgid "You are already a member of this group"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/group.ex:265
#: lib/graphql/resolvers/group.ex:262
msgid "You can't leave this group because you are the only administrator"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/group.ex:229
#: lib/graphql/resolvers/group.ex:226
msgid "You cannot join this group"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/group.ex:94
#: lib/graphql/resolvers/group.ex:91
msgid "You may not list groups unless moderator."
msgstr ""
@ -250,7 +249,7 @@ msgid "You need to be logged-in to change your password"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/group.ex:207
#: lib/graphql/resolvers/group.ex:204
msgid "You need to be logged-in to delete a group"
msgstr ""
@ -260,25 +259,20 @@ msgid "You need to be logged-in to delete your account"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/group.ex:237
#: lib/graphql/resolvers/group.ex:234
msgid "You need to be logged-in to join a group"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/group.ex:270
#: lib/graphql/resolvers/group.ex:267
msgid "You need to be logged-in to leave a group"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/group.ex:172
#: lib/graphql/resolvers/group.ex:169
msgid "You need to be logged-in to update a group"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/user.ex:58
msgid "You need to have admin access to list users"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/user.ex:108
msgid "You need to have an existing token to get a refresh token"
@ -330,22 +324,22 @@ msgid "Profile already suspended"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/participant.ex:93
#: lib/graphql/resolvers/participant.ex:92
msgid "A valid email is required by your instance"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/participant.ex:87
#: lib/graphql/resolvers/participant.ex:86
msgid "Anonymous participation is not enabled"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/person.ex:184
#: lib/graphql/resolvers/person.ex:192
msgid "Cannot remove the last administrator of a group"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/person.ex:181
#: lib/graphql/resolvers/person.ex:189
msgid "Cannot remove the last identity of a user"
msgstr ""
@ -355,7 +349,7 @@ msgid "Comment is already deleted"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/discussion.ex:61
#: lib/graphql/resolvers/discussion.ex:62
msgid "Discussion not found"
msgstr ""
@ -370,29 +364,29 @@ msgid "Error while updating report"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/participant.ex:128
#: lib/graphql/resolvers/participant.ex:127
msgid "Event id not found"
msgstr ""
#, elixir-format
#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:235
#: lib/graphql/resolvers/event.ex:279
#: lib/graphql/error.ex:89 lib/graphql/resolvers/event.ex:236
#: lib/graphql/resolvers/event.ex:280
msgid "Event not found"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/participant.ex:84
#: lib/graphql/resolvers/participant.ex:125 lib/graphql/resolvers/participant.ex:157
#: lib/graphql/resolvers/participant.ex:83
#: lib/graphql/resolvers/participant.ex:124 lib/graphql/resolvers/participant.ex:156
msgid "Event with this ID %{id} doesn't exist"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/participant.ex:100
#: lib/graphql/resolvers/participant.ex:99
msgid "Internal Error"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/discussion.ex:193
#: lib/graphql/resolvers/discussion.ex:186
msgid "No discussion with ID %{id}"
msgstr ""
@ -407,14 +401,14 @@ msgid "No such feed token"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/participant.ex:238
#: lib/graphql/resolvers/participant.ex:237
msgid "Participant already has role %{role}"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/participant.ex:170
#: lib/graphql/resolvers/participant.ex:199 lib/graphql/resolvers/participant.ex:231
#: lib/graphql/resolvers/participant.ex:241
#: lib/graphql/resolvers/participant.ex:169
#: lib/graphql/resolvers/participant.ex:198 lib/graphql/resolvers/participant.ex:230
#: lib/graphql/resolvers/participant.ex:240
msgid "Participant not found"
msgstr ""
@ -424,22 +418,17 @@ msgid "Person with ID %{id} not found"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/person.ex:50
#: lib/graphql/resolvers/person.ex:51
msgid "Person with username %{username} not found"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/picture.ex:41
msgid "Picture with ID %{id} was not found"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/post.ex:165 lib/graphql/resolvers/post.ex:198
#: lib/graphql/resolvers/post.ex:167 lib/graphql/resolvers/post.ex:200
msgid "Post ID is not a valid ID"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/post.ex:168 lib/graphql/resolvers/post.ex:201
#: lib/graphql/resolvers/post.ex:170 lib/graphql/resolvers/post.ex:203
msgid "Post doesn't exist"
msgstr ""
@ -454,8 +443,8 @@ msgid "Profile is already a member of this group"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/post.ex:131 lib/graphql/resolvers/post.ex:171
#: lib/graphql/resolvers/post.ex:204 lib/graphql/resolvers/resource.ex:87 lib/graphql/resolvers/resource.ex:124
#: lib/graphql/resolvers/post.ex:132 lib/graphql/resolvers/post.ex:173
#: lib/graphql/resolvers/post.ex:206 lib/graphql/resolvers/resource.ex:87 lib/graphql/resolvers/resource.ex:124
#: lib/graphql/resolvers/resource.ex:153 lib/graphql/resolvers/resource.ex:182 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
@ -463,12 +452,12 @@ msgid "Profile is not member of group"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/person.ex:150 lib/graphql/resolvers/person.ex:178
#: lib/graphql/resolvers/person.ex:158 lib/graphql/resolvers/person.ex:186
msgid "Profile not found"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/event.ex:101 lib/graphql/resolvers/participant.ex:235
#: lib/graphql/resolvers/event.ex:100 lib/graphql/resolvers/participant.ex:234
msgid "Provided moderator profile doesn't have permission on this event"
msgstr ""
@ -483,12 +472,12 @@ msgid "Resource doesn't exist"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/participant.ex:121
#: lib/graphql/resolvers/participant.ex:120
msgid "The event has already reached its maximum capacity"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/participant.ex:261
#: lib/graphql/resolvers/participant.ex:260
msgid "This token is invalid"
msgstr ""
@ -514,22 +503,22 @@ msgid "Token is not a valid UUID"
msgstr ""
#, elixir-format
#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:317
#: lib/graphql/error.ex:87 lib/graphql/resolvers/person.ex:331
msgid "User not found"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/person.ex:232
#: lib/graphql/resolvers/person.ex:252
msgid "You already have a profile for this user"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/participant.ex:131
#: lib/graphql/resolvers/participant.ex:130
msgid "You are already a participant of this event"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/discussion.ex:197
#: lib/graphql/resolvers/discussion.ex:190
msgid "You are not a member of the group the discussion belongs to"
msgstr ""
@ -569,8 +558,8 @@ msgid "You are not allowed to update a comment if not connected"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/participant.ex:164
#: lib/graphql/resolvers/participant.ex:193
#: lib/graphql/resolvers/participant.ex:163
#: lib/graphql/resolvers/participant.ex:192
msgid "You can't leave event because you're the only event creator participant"
msgstr ""
@ -585,7 +574,7 @@ msgid "You cannot delete this comment"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/event.ex:275
#: lib/graphql/resolvers/event.ex:276
msgid "You cannot delete this event"
msgstr ""
@ -635,7 +624,7 @@ msgid "You need to be logged-in and an administrator to save admin settings"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/discussion.ex:75
#: lib/graphql/resolvers/discussion.ex:76
msgid "You need to be logged-in to access discussions"
msgstr ""
@ -645,12 +634,12 @@ msgid "You need to be logged-in to access resources"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/event.ex:210
#: lib/graphql/resolvers/event.ex:211
msgid "You need to be logged-in to create events"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/post.ex:139
#: lib/graphql/resolvers/post.ex:140
msgid "You need to be logged-in to create posts"
msgstr ""
@ -665,12 +654,12 @@ msgid "You need to be logged-in to create resources"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/event.ex:284
#: lib/graphql/resolvers/event.ex:285
msgid "You need to be logged-in to delete an event"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/post.ex:209
#: lib/graphql/resolvers/post.ex:211
msgid "You need to be logged-in to delete posts"
msgstr ""
@ -680,22 +669,22 @@ msgid "You need to be logged-in to delete resources"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/participant.ex:105
#: lib/graphql/resolvers/participant.ex:104
msgid "You need to be logged-in to join an event"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/participant.ex:204
#: lib/graphql/resolvers/participant.ex:203
msgid "You need to be logged-in to leave an event"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/event.ex:249
#: lib/graphql/resolvers/event.ex:250
msgid "You need to be logged-in to update an event"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/post.ex:176
#: lib/graphql/resolvers/post.ex:178
msgid "You need to be logged-in to update posts"
msgstr ""
@ -709,11 +698,6 @@ msgstr ""
msgid "You need to be logged-in to view a resource preview"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/picture.ex:79
msgid "You need to login to upload a picture"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/resource.ex:121
msgid "Parent resource doesn't belong to this group"
@ -790,22 +774,22 @@ msgid "You can't reject this invitation with this profile."
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/picture.ex:71
#: lib/graphql/resolvers/media.ex:62
msgid "File doesn't have an allowed MIME type."
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/group.ex:167
#: lib/graphql/resolvers/group.ex:164
msgid "Profile is not administrator for the group"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/event.ex:238
#: lib/graphql/resolvers/event.ex:239
msgid "You can't edit this event."
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/event.ex:241
#: lib/graphql/resolvers/event.ex:242
msgid "You can't attribute this event to this profile."
msgstr ""
@ -825,21 +809,27 @@ msgid "You don't have the right to remove this member."
msgstr ""
#, elixir-format
#: lib/mobilizon/actors/actor.ex:344
#: lib/mobilizon/actors/actor.ex:351
msgid "This username is already taken."
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/discussion.ex:72
#: lib/graphql/resolvers/discussion.ex:73
msgid "You must provide either an ID or a slug to access a discussion"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/event.ex:199
#: lib/graphql/resolvers/event.ex:200
msgid "Organizer profile is not owned by the user"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/participant.ex:90
#: lib/graphql/resolvers/participant.ex:89
msgid "Profile ID provided is not the anonymous profile one"
msgstr ""
#, elixir-format
#: lib/graphql/resolvers/person.ex:128 lib/graphql/resolvers/person.ex:155
#: lib/graphql/resolvers/person.ex:246
msgid "The provided picture is too heavy"
msgstr ""

Some files were not shown because too many files have changed in this diff Show More