Merge branch 'master' into back-to-top-button

This commit is contained in:
Baptiste Lemoine 2019-11-23 18:26:57 +01:00
commit e1374c2719
267 changed files with 12268 additions and 6142 deletions

5
.gitignore vendored
View File

@ -17,10 +17,10 @@ erl_crash.dump
.env.production
.env.test
.env
/.env
.env.2
setup_db.psql
/setup_db.psql
.elixir_ls
/doc
@ -30,6 +30,7 @@ priv/data/*
!priv/data/.gitkeep
.vscode/
cover/
site/
test/fixtures/image_tmp.jpg
test/uploads/
uploads/*

View File

@ -77,36 +77,38 @@ exunit:
script:
- mix coveralls
cypress:
stage: test
services:
- name: mdillon/postgis:11
alias: postgres
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 &
- cd js
- npx wait-on http://localhost:4000
- npx cypress run --record --parallel --key $CYPRESS_KEY
artifacts:
expire_in: 2 day
paths:
- js/tests/e2e/screenshots/**/*.png
- js/tests/e2e/videos/**/*.mp4
#cypress:
# stage: test
# services:
# - name: mdillon/postgis:11
# alias: postgres
# 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 &
# - 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
# artifacts:
# expire_in: 2 day
# paths:
# - js/tests/e2e/screenshots/**/*.png
# - js/tests/e2e/videos/**/*.mp4
pages:
stage: deploy
script:
- mkdir public
- mkdocs build
- mv site/* public/
- mix deps.get
- mix docs
- mv doc public/backend

69
CHANGELOG.md Normal file
View File

@ -0,0 +1,69 @@
# Changelog
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).
## [Unreleased]
### Special operations
These two operations couldn't be handled during migrations.
They are optional, but you won't be able to search or get participant stats on existing events if they are not executed.
These commands will be removed in Mobilizon 1.0.0-beta.3.
In order to populate search index for existing events, you need to run the following command (with prod environment):
* `mix mobilizon.setup_search`
In order to move participant stats to the event table for existing events, you need to run the following command (with prod environment):
* `mix mobilizon.move_participant_stats`
### Added
- Implement search engine & service in backend **(read special instructions above)**
- Allow WebP and Gif pics upload
- Optimize uploaded pics
- Make tags clickable, redirecting to search
- Add a different welcome message when coming from registration
- Link to participation page from event page when you are an organizer
- Added mix commands to manage users and view actors
- Added a demo mode to show or hide instance warnings that data is deleted
- Added a warning on login that everything is deleted regularly
- Updated Occitan translations (Quentin)
- Updated French translations (Gavy, Zilverspar, ty kayn)
- Updated Swedish translations (Anton Strömkvist)
- Upgraded frontend and backend dependencies
### Changed
- Move participant stats to event table **(read special instructions above)**
- Limit length (20 characters) and number (10) of tags allowed
- Added some backend changes and validation for field length
- Handle error message difference between user not found and user not confirmed
- Make external links (from URL field and description) open in a new tab with `noopener`
- Improve Docker setup and docs
- Upgrade vue-cli to v4, change the way server params injection is made
- Improve some production ipv6 configuration
- Limited year range in the DatePicker
### Fixed
- Fix event URL validation and check if hostname is correct before showing it
- Fix participations stats on the MyEvents page
- Fix event description lists margin
- Fix Cypress tests
- Fix contribution guide link and improve contribution guide (Joel Takvorian)
- Improve grammar (Damien)
- Fix recursive alias in systemd unit file (Geno)
- Fix multiline display on participants page
- Add polyfill for IntersectionObserver so that it's usable on relatively old browsers
- Fixed crash on Safari on description input by removing `-apple-system` from font-family
- Improve installation docs (mkljczk)
- Limit file uploads to 10MB
- Added missing `setup_db.psql` file (Geno)
- Fixed docker setup when using non-GNU make (JohanBaskovec)
- Fixed actors deletion that didn't cascade to followers
- Reduced datetime picker input width
### Security
- Sanitize event title to avoid XSS
## [1.0.0-beta.1] - 2019-10-15
### Added
- Initial release

View File

@ -1 +1 @@
Please read our full contributing document at [https://framasoft.frama.io/mobilizon/contributing.html](https://framasoft.frama.io/mobilizon/contributing.html)
Please read our full contributing document at [https://framasoft.frama.io/mobilizon/backend/contributing.html](https://framasoft.frama.io/mobilizon/backend/contributing.html)

View File

@ -1,10 +1,10 @@
FROM bitwalker/alpine-elixir:latest
RUN apk add inotify-tools postgresql-client yarn
RUN apk add inotify-tools postgresql-client yarn file
RUN apk add --no-cache make gcc libc-dev argon2 imagemagick
RUN mix local.hex --force && mix local.rebar --force
WORKDIR /app
EXPOSE 4000 4001 4002
EXPOSE 4000

View File

@ -4,7 +4,7 @@ init:
start: stop
@bash docker/message.sh "starting Mobilizon with docker"
docker-compose up -d
docker-compose up -d api
@bash docker/message.sh "started"
stop:
@bash docker/message.sh "stopping Mobilizon"

View File

@ -18,12 +18,13 @@ config :mobilizon, :instance,
version: "1.0.0-dev",
hostname: System.get_env("MOBILIZON_INSTANCE_HOST") || "localhost",
registrations_open: System.get_env("MOBILIZON_INSTANCE_REGISTRATIONS_OPEN") || false,
demo: System.get_env("MOBILIZON_INSTANCE_DEMO_MODE") || false,
repository: Mix.Project.config()[:source_url],
allow_relay: true,
# Federation is to be activated with Mobilizon 1.0.0-beta.2
federating: false,
remote_limit: 100_000,
upload_limit: 16_000_000,
upload_limit: 10_000_000,
avatar_upload_limit: 2_000_000,
banner_upload_limit: 4_000_000,
email_from: System.get_env("MOBILIZON_INSTANCE_EMAIL") || "noreply@localhost",
@ -44,7 +45,10 @@ config :mobilizon, MobilizonWeb.Endpoint,
# Upload configuration
config :mobilizon, MobilizonWeb.Upload,
uploader: MobilizonWeb.Uploaders.Local,
filters: [MobilizonWeb.Upload.Filter.Dedupe],
filters: [
MobilizonWeb.Upload.Filter.Dedupe,
MobilizonWeb.Upload.Filter.Optimize
],
link_name: true,
proxy_remote: false,
proxy_opts: [
@ -103,9 +107,7 @@ config :auto_linker,
# TODO: Set to :no_scheme when it works properly
validate_tld: true,
class: false,
strip_prefix: false,
new_window: false,
rel: false
strip_prefix: false
]
config :phoenix, :format_encoders, json: Jason, "activity-json": Jason
@ -136,6 +138,25 @@ config :mobilizon, Mobilizon.Service.Geospatial.GoogleMaps,
config :mobilizon, Mobilizon.Service.Geospatial.MapQuest,
api_key: System.get_env("GEOSPATIAL_MAP_QUEST_API_KEY") || nil
config :mobilizon, Mobilizon.Service.Geospatial.Mimirsbrunn,
endpoint: System.get_env("GEOSPATIAL_MIMIRSBRUNN_ENDPOINT") || nil
config :mobilizon, Mobilizon.Service.Geospatial.Pelias,
endpoint: System.get_env("GEOSPATIAL_PELIAS_ENDPOINT") || nil
config :mobilizon, :maps,
tiles: [
endpoint:
System.get_env("MAPS_TILES_ENDPOINT") ||
"https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png",
attribution: System.get_env("MAPS_TILES_ATTRIBUTION")
]
config :mobilizon, Oban,
repo: Mobilizon.Storage.Repo,
prune: {:maxlen, 10_000},
queues: [default: 10, search: 20]
# Import environment specific config. This must remain at the bottom
# of this file so it overrides the configuration defined above.
import_config "#{Mix.env()}.exs"

View File

@ -52,7 +52,7 @@ config :mobilizon, MobilizonWeb.Endpoint,
# Do not include metadata nor timestamps in development logs
config :logger, :console, format: "[$level] $message\n", level: :debug
config :mobilizon, Mobilizon.Service.Geospatial, service: Mobilizon.Service.Geospatial.Nominatim
config :mobilizon, Mobilizon.Service.Geospatial, service: Mobilizon.Service.Geospatial.Mimirsbrunn
# Set a higher stacktrace during development. Avoid configuring such
# in production as building large stacktraces may be expensive.
@ -71,4 +71,5 @@ config :mobilizon, Mobilizon.Storage.Repo,
database: System.get_env("MOBILIZON_DATABASE_DBNAME") || "mobilizon_dev",
hostname: System.get_env("MOBILIZON_DATABASE_HOST") || "localhost",
port: System.get_env("MOBILIZON_DATABASE_PORT") || "5432",
pool_size: 10
pool_size: 10,
show_sensitive_data_on_connection_error: true

View File

@ -1,7 +1,10 @@
import Config
config :mobilizon, MobilizonWeb.Endpoint,
http: [:inet6, port: System.get_env("MOBILIZON_INSTANCE_PORT") || 4000],
http: [
port: System.get_env("MOBILIZON_INSTANCE_PORT") || 4000,
transport_options: [socket_opts: [:inet6]]
],
url: [
host: System.get_env("MOBILIZON_INSTANCE_HOST") || "mobilizon.me",
port: 443,

View File

@ -40,3 +40,5 @@ config :exvcr,
vcr_cassette_library_dir: "test/fixtures/vcr_cassettes"
config :mobilizon, Mobilizon.Service.Geospatial, service: Mobilizon.Service.Geospatial.Mock
config :mobilizon, Oban, queues: false, prune: :disabled

View File

@ -30,7 +30,15 @@ services:
MOBILIZON_DATABASE_USERNAME: postgres
MOBILIZON_DATABASE_DBNAME: mobilizon_dev
MOBILIZON_DATABASE_HOST: postgres
command: "mix phx.deps_migrate_serve"
command: >
sh -c "cd js &&
yarn install &&
cd ../ &&
mix deps.get &&
mix compile &&
mix ecto.create &&
mix ecto.migrate &&
mix phx.server"
volumes:
pgdata:
.:

View File

@ -2,9 +2,10 @@ FROM elixir:latest
LABEL maintainer="Thomas Citharel <tcit@tcit.fr>"
ENV REFRESHED_AT=2019-10-06
RUN apt-get update -yq && apt-get install -yq build-essential inotify-tools postgresql-client git curl gnupg xvfb libgtk-3-dev libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2
RUN apt-get update -yq && apt-get install -yq build-essential inotify-tools postgresql-client git curl gnupg xvfb libgtk-3-dev libnotify-dev libgconf-2-4 libnss3 libxss1 libasound2 python3-pip
RUN curl -sL https://deb.nodesource.com/setup_10.x | bash && apt-get install nodejs -yq
RUN npm install -g yarn wait-on
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN mix local.hex --force && mix local.rebar --force
RUN pip3 install mkdocs mkdocs-material pymdown-extensions pygments mkdocs-git-revision-date-plugin
RUN curl http://geolite.maxmind.com/download/geoip/database/GeoLite2-City.tar.gz --output GeoLite2-City.tar.gz -s && tar zxf GeoLite2-City.tar.gz && mkdir -p /usr/share/GeoIP && mv GeoLite2-City_*/GeoLite2-City.mmdb /usr/share/GeoIP/GeoLite2-City.mmdb

View File

@ -1,4 +1,4 @@
# Mobilizon
# About Mobilizon
<p align="center">
<a href="https://joinmobilizon.org">
@ -43,7 +43,7 @@ There's no lock-in, you can interact with the event without registration.
## Contributing
We appreciate any contribution to Mobilizon. Check our [Contributing](contributing.html) page for more information.
We appreciate any contribution to Mobilizon. Check our [Contributing](contribute/index.md) page for more information.
## Links
@ -54,11 +54,11 @@ We appreciate any contribution to Mobilizon. Check our [Contributing](contributi
### Discuss
* 💬 Matrix: `#Mobilizon:matrix.org` [Riot](https://riot.im/app/#/room/#Mobilizon:matrix.org)
* #IRC: `#mobilizon` on Freenode
* IRC: `#mobilizon` on Freenode
* 🗣️ Forum: [https://framacolibri.org/c/mobilizon](https://framacolibri.org/c/mobilizon)
### Follow
* 🐘 Mastodon: [https://framapiaf.org/@mobilizon](https://framapiaf.org/@mobilizon)
* 🐦 Twitter [https://twitter.com/@joinmobilizon](https://twitter.com/@joinmobilizon)
Note: Most federation code comes from [Pleroma](https://pleroma.social), which is `Copyright © 2017-2018 Pleroma Authors - AGPL-3.0`
Note: Most federation code comes from [Pleroma](https://pleroma.social), which is `Copyright © 2017-2019 Pleroma Authors - AGPL-3.0`

View File

@ -0,0 +1,52 @@
# Maintenance tasks
## Installation
Generates new configuration files.
!!! warning
This command generates configuration for your Mobilizon instance and should be run only once when installing.
If any options are left unspecified, you will be prompted interactively.
```bash
mix mobilizon.instance gen [<options>]
```
### Options
* `-f`, `--force` Whether to erase existing files
* `-o`, `--output PATH` The path to output the `.env` file. Defaults to `.env.production`.
* `--output_psql PATH` The path to output the SQL script. Defaults to `setup_db.psql`.
* `--domain DOMAIN` The instance's domain
* `--instance_name INSTANCE_NAME` The instance's name
* `--admin_email ADMIN_EMAIL` The administrator's email
* `--dbhost HOSTNAME` The database hostname of the PostgreSQL database to use
* `--dbname DBNAME` The name of the database to use
* `--dbuser DBUSER` The database user (aka role) to use for the database connection
* `--dbpass DBPASS` The database user's password to use for the database connection
* `--dbport DBPORT` The database port
## Depreciated commands
### move_participant_stats
Task to move participant stats directly on the `event` table (so there's no need to count event participants each time).
This task should **only be run once** when migrating from `v1.0.0-beta.1` to `v1.0.0-beta.2`.
This task will be removed in version `v1.0.0-beta.3`.
```bash
mix mobilizon.move_participant_stats
```
### setup_search
Task to setup search for existing events.
This task should **only be run once** when migrating from `v1.0.0-beta.1` to `v1.0.0-beta.2`.
This task will be removed in version `v1.0.0-beta.3`.
```bash
mix mobilizon.setup_search
```

View File

@ -0,0 +1,4 @@
# Manage users
!!! bug
Not yet existing

View File

@ -0,0 +1,25 @@
# Relay
Manages remote relays
## Make your instance follow a mobilizon instance
```bash
mix mobilizon.relay follow <relay_url>
```
Example:
```bash
mix mobilizon.relay follow https://example.org/relay
```
## Make your instance unfollow a mobilizon instance
```bash
mix mobilizon.relay unfollow <relay_url>
```
Example:
```bash
mix mobilizon.relay unfollow https://example.org/relay
```

View File

@ -0,0 +1,81 @@
# Geocoders
Geocoding is the ability to match an input **string representing a location - such as an address - to geographical coordinates**.
Reverse geocoding is logically the opposite, matching **geographical coordinates to names of places**.
This is needed to set correct address for events, and more easily find events with geographical data, for instance if you want to discover events happening near your current position.
However, providing a geocoding service is quite expensive, especially if you want to cover the whole Earth.
!!! note "Hardware setup"
To give an idea of what hardware is required to self-host a geocoding service, we successfully installed and used [Addok](#addok), [Pelias](#pelias) and [Mimirsbrunn](#mimirsbrunn) on a 8 cores/16GB RAM machine without any issues **importing only French addresses and data**.
## List of supported geocoders
This is the list of all geocoders supported by Mobilizon. The current default one is [Nominatim](#nominatim) and uses the official OpenStreetMap instance.
!!! bug
Changing geocoder through `.env` configuration isn't currently supported by Mobilizon.
Instead you need to edit the following line in `config.prod.exs`:
```elixir
config :mobilizon, Mobilizon.Service.Geospatial, service: Mobilizon.Service.Geospatial.Nominatim
```
And change `Nominatim` to one of the supported geocoders. This change might be overwritten when updating Mobilizon.
### Nominatim
[Nominatim](https://wiki.openstreetmap.org/wiki/Nominatim) is a GPL-2.0 licenced tool to search data by name and address. It's written in C and PHP and uses PostgreSQL.
It's the current default search tool on the [OpenStreetMap homepage](https://www.openstreetmap.org).
!!! warning "Terms"
When using the official Nominatim OpenStreetMap instance (default endpoint for this geocoder if not configured otherwise), you need to read and accept the [Usage Policy](https://operations.osmfoundation.org/policies/nominatim).
!!! danger "Limitations"
Autocomplete is not possible using Nominatim, you'll obtain no suggestions while typing.
Several companies provide hosted instances of Nominatim that you can query via an API, for example see [MapQuest Open Initiative](https://developer.mapquest.com/documentation/open/nominatim-search).
### Addok
[Addok](https://github.com/addok/addok) is a WTFPL licenced search engine for address (and only address). It's written in Python and uses Redis.
It's used by French government for [adresse.data.gouv.fr](https://adresse.data.gouv.fr).
!!! warning "Terms"
When using France's Addok instance at `api-adresse.data.gouv.fr` (default endpoint for this geocoder if not configured otherwise), you need to read and accept the [GCU](https://adresse.data.gouv.fr/cgu) (in French).
### Photon
[Photon](https://photon.komoot.de/) is an Apache 2.0 licenced search engine written in Java and powered by ElasticSearch.
!!! warning "Terms"
The terms of use for the official instance (default endpoint for this geocoder if not configured otherwise) are simply the following:
> You can use the API for your project, but please be fair - extensive usage will be throttled. We do not guarantee for the availability and usage might be subject of change in the future.
### Pelias
[Pelias](https://github.com/pelias/pelias) is a MIT licensed geocoder composed of several services written in NodeJS. It's powered by ElasticSearch.
There's [Geocode Earth](https://geocode.earth/) SAAS that provides a Pelias API.
They offer discounts for Open-Source projects. [See the pricing](https://geocode.earth/).
### Mimirsbrunn
[Mimirsbrunn](https://github.com/CanalTP/mimirsbrunn) is an AGPL-3.0 licensed geocoding written in Rust and powered by ElasticSearch.
Mimirsbrunn is used by [Qwant Maps](https://www.qwant.com/maps) and [Navitia](https://www.navitia.io).
### Google Maps
[Google Maps](https://developers.google.com/maps/documentation/geocoding/intro) is a proprietary service that provides APIs for geocoding.
They don't have a free plan, but offer credit when creating a new account. [See the pricing](https://cloud.google.com/maps-platform/pricing/).
### MapQuest
[MapQuest](https://developer.mapquest.com/documentation/open/geocoding-api/) is a proprietary service that provides APIs for geocoding.
They offer a free plan. [See the pricing](https://developer.mapquest.com/plans).
### More geocoding services
Geocoding implementations are simple modules that need to implement the [`Mobilizon.Service.Geospatial.Provider` behaviour](https://framasoft.frama.io/mobilizon/backend/Mobilizon.Service.Geospatial.Provider.html), so feel free to write your own!

View File

@ -0,0 +1,113 @@
# Dependencies
## Debian / Ubuntu and derivatives
This documentation is appropriate for Debian 10 (Buster) and Ubuntu 18.04 LTS.
### Security
We advise to make sure your webserver is secure enough.
For instance you can require authentication through SSH keys and not passwords, install Fail2Ban to block repeated login attempts and block unused ports by installing and configuring a firewall.
### Basic tools
We begin by making sure some basic tools are installed:
```bash
sudo apt install curl unzip vim openssl make git
```
### Web server
We only officially support nginx.
```bash
sudo apt install nginx
```
### HTTPS Certificates
Then we need to install [certbot](https://certbot.eff.org/), a tool to ask for free Let's Encrypt HTTPS certificates.
```bash
sudo apt install certbot
```
You can use certbot with web server plugins or manually. See [Certbot's documentation](https://certbot.eff.org/instructions).
### NodeJS
We install the latest NodeJS version by adding NodeSource repos and installing NodeJS:
Head over to [this page](https://github.com/nodesource/distributions/blob/master/README.md#table-of-contents) and follow the instructions for `Node.js v12.x`.
!!! info
Unless stated otherwise, Mobilizon always supports only the latest LTS version of NodeJS.
!!! tip
NodeSource repos only gives updates for a specific version of NodeJS (it doesn't upgrade itself to a new major version). When a new major version of NodeJS is released, you need to remove the old repo and add the new one.
### Yarn
Mobilizon uses [Yarn](https://yarnpkg.com/) to manage NodeJS packages, so we need to install it as well.
Follow the instructions on [this page](https://yarnpkg.com/en/docs/install#debian-stable) to add Yarn's repository and install it.
!!! info
It is also possible to install `yarn` directly with `npm`:
```bash
npm install -g yarn
```.
You need to make sure npm's binary packages folder in your `$PATH` afterwards to use `yarn`.
### Erlang and Elixir
The packages from Debian or Ubuntu are badly packaged and often out of date, so we need to add one final source repository.
Follow the instructions for Ubuntu/Debian on [this page](https://elixir-lang.org/install.html#unix-and-unix-like) to add Erlang Solutions repo and install Erlang and Elixir.
!!! tip
The Erlang package also wants to install an add-on for Emacs for some reason (but it doesn't install Emacs). If you see a warning, nothing to worry about.
### PostgreSQL and PostGIS
Mobilizon uses the [PostgreSQL](https://www.postgresql.org) database, and the PostgreSQL [Postgis](https://postgis.net) extension to store geographical data into PostgreSQL.
```bash
sudo apt install postgresql postgresql-contrib postgis
```
After that we can enable and start the PostgreSQL service.
```
sudo systemctl --now enable postgresql
```
### Misc
We need the following tools to handle and optimize pictures that are uploaded on Mobilizon.
```bash
sudo apt install imagemagick
```
The following packages are optional, Mobilizon can run without them.
```bash
sudo apt install webp gifsicle jpegoptim optipng pngquant
```
Once finished, let's [head back to the install guide](index.md).
## Arch Linux
Run the following command to install all at once:
```bash
sudo pacman -S nodejs postgresql openssl git wget unzip base-devel yarn nginx elixir postgis imagemagick
```
Now that dependencies are installed, before running Mobilizon you should start PostgreSQL:
```
sudo systemctl --now enable postgresql
```
Once finished, let's [head back to the install guide](index.md).
## Other distributions
Feel free to update this file in a pull request!

View File

@ -12,4 +12,4 @@ Then, just run `make` to build containers.
make
```
This will start a database container, an API container and the front-end container running on localhost.
This will start a database container, an API container also containing the front-end running on `localhost`.

View File

@ -1,50 +1,50 @@
# Install
## Pre-requisites
* A Linux machine with **root access**
* A **domain name** (or subdomain) for the Mobilizon server, e.g. `example.net`
* An **SMTP server** to deliver emails
!!! tip
You can also install Mobilizon [with Docker](docker.md).
## Dependencies
Follow the steps of the [dependencies guide](dependencies.html)
Mobilizon requires Elixir, NodeJS and PostgreSQL among other things.
## Database
Installing dependencies depends on the system you're using. Follow the steps of the [dependencies guide](dependencies.md).
Create the production database and a mobilizon user inside PostgreSQL:
## Setup
```bash
sudo -u postgres createuser -P mobilizon
sudo -u postgres createdb -O mobilizon mobilizon_prod
```
Then enable extensions Mobilizon needs:
```bash
sudo -u postgres psql -c "CREATE EXTENSION postgis;" mobilizon_prod
sudo -u postgres psql -c "CREATE EXTENSION pg_trgm;" mobilizon_prod
sudo -u postgres psql -c "CREATE EXTENSION unaccent;" mobilizon_prod
```
## Mobilizon user
Create a `mobilizon` user with `/home/mobilizon` home:
We're going to use a dedicated `mobilizon` user with `/home/mobilizon` home:
```bash
sudo adduser --disabled-login mobilizon
```
!!! tip
On FreeBSD
``` bash
sudo pw useradd -n mobilizon -d /home/mobilizon -s /usr/local/bin/bash -m
sudo passwd mobilizon
```
Then let's connect as this user:
```bash
sudo -i -u mobilizon
```
**On FreeBSD**
Let's start by cloning the repository in a directory named `live`:
```bash
sudo pw useradd -n mobilizon -d /home/mobilizon -s /usr/local/bin/bash -m
sudo passwd mobilizon
```
You can now fetch the code with git:
```bash
git clone https://framagit.org/framasoft/mobilizon live && cd live
```
## Configuration
### Backend
## Installing dependencies
Install Elixir dependencies
@ -52,23 +52,12 @@ Install Elixir dependencies
mix deps.get
```
Configure your instance with
Then compile these dependencies and Mobilizon (this can take a few minutes)
```bash
mix mobilizon.instance gen
mix compile
```
This will ask you questions about your instance and generate a `.env.prod` file.
### Migration
Run database migrations: `mix ecto.migrate`. You will have to do this again after most updates.
> If some migrations fail, it probably means you're not using a recent enough version of PostgreSQL,
or that you haven't installed [the required extensions](#database).
### Front-end
Go into the `js/` directory
```bash
@ -81,11 +70,34 @@ and install the Javascript dependencies
yarn install
```
Finally, build the front-end with
Finally, we can build the front-end (this can take a few seconds)
```bash
yarn run build
```
Let's go back to the main directory
```bash
cd ../
```
## Configuration
Mobilizon provides a command line tool to generate configuration
```bash
mix mobilizon.instance gen
```
This will ask you questions about your instance and generate a `.env.prod` file.
### Migration
Run database migrations: `mix ecto.migrate`. You will have to do this again after most updates.
!!! tip
If some migrations fail, it probably means you're not using a recent enough version of PostgreSQL, or that you haven't installed the required extensions.
## Services
### Systemd
@ -114,7 +126,7 @@ It will run Mobilizon and enable startup on boot. You can follow the logs with
sudo journalctl -fu mobilizon.service
```
The Elixir server runs on port 4000 on the local interface only, so you need to add a reverse-proxy.
The Mobilizon server runs on port 4000 on the local interface only, so you need to add a reverse-proxy.
## Reverse proxy
@ -134,4 +146,4 @@ sudo ln -s /etc/nginx/sites-available/mobilizon.conf /etc/nginx/sites-enabled/
Edit the file `/etc/nginx/sites-available` and adapt it to your own configuration.
Test the configuration with `sudo nginx -t` and reload nginx with `systemctl reload nginx`.
Test the configuration with `sudo nginx -t` and reload nginx with `systemctl reload nginx`.

View File

@ -0,0 +1,91 @@
---
title: Upgrading to a new release
---
# Preparing
The release page contains a changelog, and below it, upgrade instructions. **Read and understand** the release instructions.
Some tasks (like database migrations) can take a while, so we advise you to run commands inside a `tmux` or `screen`.
# Backup
Always make sure your database and `.env.production` file are properly backuped before performing upgrades.
Unless stated otherwise in the release notes, the following steps are enough to upgrade Mobilizon.
# Steps
### Fetch latest code
Switch to the `mobilizon` user:
```bash
sudo -i -u mobilizon
```
And navigate to the Mobilizon root directory:
```bash
cd /home/mobilizon/live
```
Fetch the latest tags
```bash
git fetch --tags
```
And checkout the tag you want to switch to. For instance, if I want to upgrade to version `v1.1`:
```bash
git checkout v1.1
```
### Fetch new dependencies
Fetch new and/or updated Elixir and NodeJS dependencies
```bash
mix deps.get
```
```bash
cd js
yarn install
```
### Rebuild Mobilizon's front-end
```bash
yarn run build
cd ../
```
### Recompile Mobilizon
```bash
mix compile
```
Let's switch back to your regular user.
### Stop running Mobilizon processes
```bash
sudo systemctl stop mobilizon
```
### Perform database migrations
Go back to the `mobilizon` user.
```bash
sudo -i -u mobilizon
cd live
mix ecto.migrate
```
### Restart Mobilizon
Let's switch back one last time to your regular user.
```bash
sudo systemctl restart mobilizon
```
You can follow the Mobilizon logs to check that everything works properly.
```bash
sudo journalctl -u mobilizon -f
```
**Thats all!** Youre running the new version of Mobilizon now.
If you have issues after upgrading, try reviewing upgrade steps and release notes.
Then feel free to [contact us](../about.md#discuss) or file an issue on [our Gitlab](https://framagit.org/framasoft/mobilizon/issues)

View File

@ -1,15 +1,32 @@
# Development
Clone the repo, and start the project through Docker. You'll need both Docker and Docker-Compose.
Clone the repository:
```bash
# With HTTPS
git clone https://framagit.org/framasoft/mobilizon && cd mobilizon
make
# With SSH
git clone git@framagit.org:framasoft/mobilizon.git && cd mobilizon
```
## Manual
Run Mobilizon:
* with Docker and Docker-Compose (**Recommended**)
* without Docker and Docker-Compose (This involves more work on your part, use Docker and Docker-Compose if you can)
## With Docker and Docker-Compose
* Install [Docker](https://docs.docker.com/install/#supported-platforms) and [Docker-Compose](https://docs.docker.com/compose/install/) for your system.
* Run `make start` to build, then launch a database container and an API container.
* Follow the progress of the build with `docker-compose logs -f`.
* Access `localhost:4000` in your browser once the containers are fully built and launched.
## Without Docker and Docker-Compose
* Install dependencies:
* Elixir (and Erlang) by following the instructions at [https://elixir-lang.github.io/install.html](https://elixir-lang.github.io/install.html)
* [PostgreSQL]() with PostGIS
* Install NodeJS (we guarantee support for the latest LTS and later) ![](https://img.shields.io/badge/node-%3E%3D%2010.0+-brightgreen.svg)
* Install NodeJS (we guarantee support for the latest LTS and later) ![](https://img.shields.io/badge/node-%3E%3D%2012.0+-brightgreen.svg)
* Start services:
* Start postgres
* Setup services:
@ -31,12 +48,3 @@ make
Now you can visit [`localhost:4000`](http://localhost:4000) in your browser
and see the website (server *and* client) in action.
## Docker
You need to install the latest supported [Docker](https://docs.docker.com/install/#supported-platforms) and [Docker-Compose](https://docs.docker.com/compose/install/) before using the Docker way of installing Mobilizon.
Just run :
```bash
make start
```
to build and launch a database container and an API container running on localhost.

View File

@ -40,17 +40,11 @@ This project is part of [Framasoft](https://framasoft.org)'s [Contributopia Camp
![Framameet illustration on Contributopia Website](https://contributopia.org/img/services-framameet.jpg)
### We practice [Ethical Design](https://2017.ind.ie/ethical-design/)
We endeavour to build technology that respects human rights, human effort, and human experience, and hope you will join in this effort.
[![Ethical Design diagram](https://i.imgur.com/O7RJo60.png)](https://2017.ind.ie/ethical-design/)
---
## [Code Of Conduct](code_of_conduct.html)
## [Code Of Conduct](code_of_conduct.md)
We require all participants to read and accept our [Code of Conduct](code_of_conduct.html).
We require all participants to read and accept our [Code of Conduct](code_of_conduct.md).
---
@ -70,7 +64,8 @@ Please go through the checklist below before posting any ✨ 💄 🐛
* **Perform a cursory search** in the issue tracker to see if the enhancement has already been suggested. If it has, add a comment to the existing issue instead of opening a new one.
* Never report security related issues, vulnerabilities or bugs including sensitive information to the issue tracker, or elsewhere in public. Instead, sensitive bugs must be sent by email to tcit plus mobilizon at framasoft dot org.
> **Note:** If you find a **Closed** issue that seems like it is the same thing that you're experiencing, open a new issue and include a link to the original issue in the body of your new one.
!!! note
If you find a **Closed** issue that seems like it is the same thing that you're experiencing, open a new issue and include a link to the original issue in the body of your new one.
### Suggesting Features & Enhancements
@ -167,7 +162,7 @@ Unsure where to begin contributing? You can start by looking through issues tagg
#### Local development
Mobilizon can be developed locally. For instructions on how to do this, please see [the documentation](development.html).
Mobilizon can be developed locally. For instructions on how to do this, please see [the documentation](development.md).
#### Coding & git practices
@ -178,10 +173,10 @@ Mobilizon can be developed locally. For instructions on how to do this, please s
#### How to make changes
* Make your changes on a separate branch which includes an issue number e.g. `1234-some-new-feature` where 1234 is the issue number where the feature is documented. Make sure the branch is based on `develop`.
* Make your changes on a separate branch which includes an issue number e.g. `1234-some-new-feature` where 1234 is the issue number where the feature is documented. Make sure the branch is based on `master`.
* Do not commit changes to files that are irrelevant to your feature or bugfix.
* Use commit messages descriptive of your changes.
* Push to the upstream of your new branch.
* Push to your own repository fork.
* Create a merge request at GitLab.
#### Git commit messages
@ -192,7 +187,7 @@ Mobilizon can be developed locally. For instructions on how to do this, please s
#### Merge requests
* Follow [the code styleguides](styleguide.html).
* Follow [the code styleguides](styleguide.md).
* Document new code based on [the documentation styleguide](https://hexdocs.pm/elixir/writing-documentation.html).
* Each merge request should implement ONE feature or bugfix. If you want to add or fix more than one thing, submit more than one merge request.
* Fill in the merge request template below.

View File

@ -5,6 +5,7 @@
We format our code with the Elixir Formatter and check for issues with [Credo](https://github.com/rrrene/credo) (a few rules are not blocking).
Please run these two commands before pushing code:
* `mix format`
* `mix credo`
@ -25,4 +26,4 @@ We also try to follow the [official Vue.js style guide](https://vuejs.org/v2/sty
### Styleguide
We present the components used on Mobilizon's front-end here: https://framasoft.frama.io/mobilizon/frontend/. The documentation is builded through [Vue Styleguidist](https://vue-styleguidist.github.io/)
We present the components used on Mobilizon's front-end here: https://framasoft.frama.io/mobilizon/frontend/. The documentation is builded through [Vue Styleguidist](https://vue-styleguidist.github.io/)

View File

@ -9,6 +9,9 @@ To launch all the tests:
mix test
```
!!! info
If you're using Docker, you can use `make test`
If you want test coverage:
```bash
@ -29,7 +32,8 @@ If you want to test a specific test, block or line:
mix test test/mobilizon/actors/actors_test.exs:85
```
> Note: The coveralls.html also works the same
!!! tip
Note: The `coveralls.html` also works the same
## Front-end
@ -41,6 +45,11 @@ Not done yet.
We use [Cypress](https://cypress.io) for End-to-end testing.
You first need to run the webserver with the `e2e` environment: `MIX_ENV=e2e mix phx.server`. The same environment parameters as the `dev` environment must be provided.
This allows to run database operations in the sandbox and not pollute your database.
Then, run `MIX_ENV=e2e mix run priv/repo/e2e.seed.exs` to have some initial data inside your instance for the tests.
When inside the `js` directory, you can do either
```bash
npx cypress run
@ -51,4 +60,5 @@ npx cypress open
```
to open the interactive GUI.
Cypress provided [a subscription](https://www.cypress.io/oss-plan) to their recording dashboard since Mobilizon is an Open-Source project. Thanks!
!!! info
Cypress provided [a subscription](https://www.cypress.io/oss-plan) to their recording dashboard since Mobilizon is an Open-Source project. Thanks!

10
docs/index.md Normal file
View File

@ -0,0 +1,10 @@
---
title: Mobilizon documentation
---
Welcome to the Mobilizon documentation
* [Learn more about Mobilizon](about.md)
* Learn how to use Mobilizon (not yet written)
* [Learn how to install Mobilizon](administration/index.md)
* [Learn how to contribute to Mobilizon](contribute/index.md)

1
docs/logo.png Symbolic link
View File

@ -0,0 +1 @@
../js/public/img/mobilizon_logo.png

107
docs/theme/partials/footer.html vendored Normal file
View File

@ -0,0 +1,107 @@
<!--
Copyright (c) 2016-2019 Martin Donath <martin.donath@squidfunk.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to
deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
sell copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE.
-->
{% import "partials/language.html" as lang with context %}
<!-- Application footer -->
<footer class="md-footer">
<!-- Link to previous and/or next page -->
{% if page.previous_page or page.next_page %}
<div class="md-footer-nav">
<nav class="md-footer-nav__inner md-grid">
<!-- Link to previous page -->
{% if page.previous_page %}
<a href="{{ page.previous_page.url | url }}"
title="{{ page.previous_page.title | striptags }}"
class="md-flex md-footer-nav__link md-footer-nav__link--prev"
rel="prev">
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-back
md-footer-nav__button"></i>
</div>
<div class="md-flex__cell md-flex__cell--stretch
md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
{{ lang.t("footer.previous") }}
</span>
{{ page.previous_page.title }}
</span>
</div>
</a>
{% endif %}
<!-- Link to next page -->
{% if page.next_page %}
<a href="{{ page.next_page.url | url }}"
title="{{ page.next_page.title | striptags }}"
class="md-flex md-footer-nav__link md-footer-nav__link--next"
rel="next">
<div class="md-flex__cell md-flex__cell--stretch
md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
{{ lang.t("footer.next") }}
</span>
{{ page.next_page.title }}
</span>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-forward
md-footer-nav__button"></i>
</div>
</a>
{% endif %}
</nav>
</div>
{% endif %}
<!-- Further information -->
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<!-- Copyright and theme information -->
<div class="md-footer-copyright">
{% if config.copyright %}
<div class="md-footer-copyright__highlight">
{{ config.copyright }}
</div>
{% endif %}
powered by
<a href="https://www.mkdocs.org">MkDocs</a>
and
<a href="https://squidfunk.github.io/mkdocs-material/">
Material for MkDocs</a>
{% if page and page.meta.revision_date %}
<br>
<i>Updated {{ page.meta.revision_date }}</i>
{% endif %}
</div>
<!-- Social links -->
{% include "partials/social.html" %}
</div>
</div>
</footer>

View File

@ -1,5 +0,0 @@
{
"presets": [
"@vue/app"
]
}

1
js/.env Normal file
View File

@ -0,0 +1 @@
VUE_APP_INJECT_COMMENT = <meta name="server-injected-data" />

1
js/.gitignore vendored
View File

@ -27,4 +27,3 @@ yarn-error.log*
*.sln
*.sw*
.env

7
js/babel.config.js Normal file
View File

@ -0,0 +1,7 @@
module.exports = {
presets: [
[
"@vue/app", {useBuiltIns: "entry"}
]
]
};

View File

@ -1,9 +1,10 @@
{
"name": "mobilizon",
"version": "1.0.0-beta.1",
"license": "AGPL-3.0",
"private": true,
"scripts": {
"build": "vue-cli-service build",
"build": "vue-cli-service build --modern",
"test:unit": "vue-cli-service test:unit",
"test:e2e": "vue-cli-service test:e2e",
"lint": "vue-cli-service lint",
@ -24,7 +25,9 @@
"eslint-plugin-vue": "^5.2.3",
"graphql": "^14.5.8",
"graphql-tag": "^2.10.1",
"intersection-observer": "^0.7.0",
"leaflet": "^1.4.0",
"leaflet.locatecontrol": "^0.68.0",
"lodash": "^4.17.11",
"ngeohash": "^0.6.3",
"register-service-worker": "^1.6.2",
@ -43,15 +46,17 @@
"devDependencies": {
"@types/chai": "^4.2.3",
"@types/leaflet": "^1.5.2",
"@types/leaflet.locatecontrol": "^0.60.7",
"@types/lodash": "^4.14.141",
"@types/mocha": "^5.2.6",
"@vue/cli-plugin-babel": "^3.6.0",
"@vue/cli-plugin-e2e-cypress": "^4.0.0-rc.7",
"@vue/cli-plugin-pwa": "^3.6.0",
"@vue/cli-plugin-typescript": "^3.6.0",
"@vue/cli-plugin-unit-mocha": "^3.6.0",
"@vue/cli-service": "^3.6.0",
"@vue/eslint-config-typescript": "^4.0.0",
"@vue/cli-plugin-babel": "^4.0.3",
"@vue/cli-plugin-e2e-cypress": "^4.0.3",
"@vue/cli-plugin-pwa": "^4.0.3",
"@vue/cli-plugin-router": "^4.0.3",
"@vue/cli-plugin-typescript": "^4.0.3",
"@vue/cli-plugin-unit-mocha": "^4.0.3",
"@vue/cli-service": "^4.0.3",
"@vue/eslint-config-typescript": "^5.0.0",
"@vue/test-utils": "^1.0.0-beta.29",
"apollo-link-error": "^1.1.12",
"chai": "^4.2.0",
@ -63,8 +68,8 @@
"tslint": "^5.20.0",
"tslint-config-airbnb": "^5.11.2",
"typescript": "^3.6.3",
"vue-cli-plugin-styleguidist": "^3.24.2",
"vue-cli-plugin-webpack-bundle-analyzer": "^1.3.0",
"vue-cli-plugin-styleguidist": "^4.0.1",
"vue-cli-plugin-webpack-bundle-analyzer": "^2.0.0",
"vue-i18n-extract": "^1.0.2",
"vue-svg-inline-loader": "^1.3.0",
"vue-template-compiler": "^2.6.10",
@ -72,7 +77,7 @@
},
"browserslist": [
">0.25%",
"not ie 11",
"ie 11",
"not op_mini all"
],
"engines": {

Binary file not shown.

Before

Width:  |  Height:  |  Size: 793 B

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 793 B

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 793 B

After

Width:  |  Height:  |  Size: 668 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 537 B

After

Width:  |  Height:  |  Size: 507 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 793 B

After

Width:  |  Height:  |  Size: 668 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 793 B

After

Width:  |  Height:  |  Size: 668 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 793 B

After

Width:  |  Height:  |  Size: 668 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 793 B

After

Width:  |  Height:  |  Size: 668 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 793 B

After

Width:  |  Height:  |  Size: 668 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 793 B

After

Width:  |  Height:  |  Size: 668 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.1 KiB

After

Width:  |  Height:  |  Size: 5.5 KiB

View File

@ -6,7 +6,7 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<!--server-generated-meta-->
<%= VUE_APP_INJECT_COMMENT %>
</head>
<body>

View File

@ -1,5 +1,5 @@
{
"name": "mobilizon",
"name": "Mobilizon",
"short_name": "mobilizon",
"icons": [
{
@ -13,8 +13,8 @@
"type": "image/png"
}
],
"start_url": "/index.html",
"start_url": "/",
"display": "standalone",
"background_color": "#000000",
"theme_color": "#4DBA87"
"background_color": "#FAB12D",
"theme_color": "#424056"
}

2
js/public/robots.txt Normal file
View File

@ -0,0 +1,2 @@
User-agent: *
Allow: /

View File

@ -1,14 +1,14 @@
<template>
<div id="mobilizon">
<NavBar />
<div class="container">
<b-message type="is-danger" :title="$t('Warning').toLocaleUpperCase()" closable>
<div class="container" v-if="config && config.demoMode">
<b-message type="is-danger" :title="$t('Warning').toLocaleUpperCase()" closable aria-close-label="Close">
<p>{{ $t('This is a demonstration site to test the beta version of Mobilizon.') }}</p>
<p v-html="$t('<b>Please do not use it in any real way</b>: everything you create here (accounts, events, identities, etc.) will be automatically deleted every 48 hours.')" />
<p>
<span v-html="$t('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>.')" />
<i18n path="In the meantime, please consider that the software is not (yet) finished. More information {onBlog}.">
<a slot="onBlog" href='https://framablog.org/?p=18299'>{{ $t('on our blog') }}</a>
<a slot="onBlog" :href="$i18n.locale === 'fr' ? 'https://framablog.org/?p=18268' : 'https://framablog.org/?p=18299'">{{ $t('on our blog') }}</a>
</i18n>
</p>
</b-message>
@ -35,11 +35,14 @@ import { CURRENT_USER_CLIENT, UPDATE_CURRENT_USER_CLIENT } from '@/graphql/user'
import Footer from '@/components/Footer.vue';
import Logo from '@/components/Logo.vue';
import { initializeCurrentActor } from '@/utils/auth';
import { CONFIG } from '@/graphql/config';
import { IConfig } from '@/types/config.model';
@Component({
apollo: {
currentUser: {
query: CURRENT_USER_CLIENT,
},
config: CONFIG,
},
components: {
Logo,
@ -48,6 +51,8 @@ import { initializeCurrentActor } from '@/utils/auth';
},
})
export default class App extends Vue {
config!: IConfig;
async created() {
if (await this.initializeCurrentUser()) {
await initializeCurrentActor(this.$apollo.provider.defaultClient);
@ -99,5 +104,21 @@ $mdi-font-path: "~@mdi/font/fonts";
body {
// background: #f7f8fa;
background: #ebebeb;
font-family: BlinkMacSystemFont,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Fira Sans','Droid Sans','Helvetica Neue',Helvetica,Arial,sans-serif;
main {
margin: 1rem auto 0;
}
}
#mobilizon > .container > .message {
margin: 1rem auto auto;
.message-header {
button.delete {
background: #4a4a4a;
}
color: #111;
}
}
</style>

View File

@ -1,134 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1"
x="0px"
y="0px"
viewBox="0 0 64 64"
style="enable-background:new 0 0 64 64;"
xml:space="preserve"
id="svg4965"
sodipodi:docname="Circle-icons-calendar.svg"
inkscape:version="0.92.4 5da689c313, 2019-01-14"><metadata
id="metadata4971"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs4969" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1920"
inkscape:window-height="1018"
id="namedview4967"
showgrid="false"
inkscape:zoom="10.429825"
inkscape:cx="30.416304"
inkscape:cy="28.788016"
inkscape:window-x="0"
inkscape:window-y="34"
inkscape:window-maximized="1"
inkscape:current-layer="g4961" />
<style
type="text/css"
id="style4919">
.st0{fill:#77B3D4;}
.st1{opacity:0.2;}
.st2{fill:#231F20;}
.st3{fill:#FFFFFF;}
.st4{fill:#C75C5C;}
.st5{fill:#4F5D73;}
.st6{fill:#E0E0D1;}
</style>
<g
id="Layer_1">
<g
id="g4923">
<circle
class="st0"
cx="32"
cy="32"
r="32"
id="circle4921" />
</g>
<g
id="g4961">
<g
class="st1"
id="g4927">
<path
class="st2"
d="M12,25v25c0,2.2,1.8,4,4,4h32c2.2,0,4-1.8,4-4V25H12z"
id="path4925" />
</g>
<g
id="g4931">
<path
class="st3"
d="M12,23v25c0,2.2,1.8,4,4,4h32c2.2,0,4-1.8,4-4V23H12z"
id="path4929" />
</g>
<g
class="st1"
id="g4935">
<path
class="st2"
d="M48,14H16c-2.2,0-4,1.8-4,4v7h40v-7C52,15.8,50.2,14,48,14z"
id="path4933" />
</g>
<g
id="g4939">
<path
class="st4"
d="M48,12H16c-2.2,0-4,1.8-4,4v7h40v-7C52,13.8,50.2,12,48,12z"
id="path4937" />
</g>
<g
class="st1"
id="g4947">
<path
class="st2"
d="M20,21c-1.1,0-2-0.9-2-2v-7c0-1.1,0.9-2,2-2l0,0c1.1,0,2,0.9,2,2v7C22,20.1,21.1,21,20,21L20,21z"
id="path4945" />
</g>
<g
class="st1"
id="g4951">
<path
class="st2"
d="M45,21c-1.1,0-2-0.9-2-2v-7c0-1.1,0.9-2,2-2l0,0c1.1,0,2,0.9,2,2v7C47,20.1,46.1,21,45,21L45,21z"
id="path4949" />
</g>
<g
id="g4955">
<path
class="st6"
d="M20,19c-1.1,0-2-0.9-2-2v-7c0-1.1,0.9-2,2-2l0,0c1.1,0,2,0.9,2,2v7C22,18.1,21.1,19,20,19L20,19z"
id="path4953" />
</g>
<g
id="g4959">
<path
class="st6"
d="M45,19c-1.1,0-2-0.9-2-2v-7c0-1.1,0.9-2,2-2l0,0c1.1,0,2,0.9,2,2v7C47,18.1,46.1,19,45,19L45,19z"
id="path4957" />
</g>
</g>
</g>
<g
id="Layer_2">
</g>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" x="0" y="0" viewBox="0 0 64 64" xml:space="preserve" id="svg4965"><style type="text/css" id="style4919">.st1{opacity:.2}.st2{fill:#231f20}.st6{fill:#e0e0d1}</style><g id="Layer_1"><g id="g4923"><circle cx="32" cy="32" r="32" id="circle4921" fill="#77b3d4"/></g><g id="g4961"><g class="st1" id="g4927"><path class="st2" d="M12 25v25c0 2.2 1.8 4 4 4h32c2.2 0 4-1.8 4-4V25H12z" id="path4925"/></g><g id="g4931"><path d="M12 23v25c0 2.2 1.8 4 4 4h32c2.2 0 4-1.8 4-4V23H12z" id="path4929" fill="#fff"/></g><g class="st1" id="g4935"><path class="st2" d="M48 14H16c-2.2 0-4 1.8-4 4v7h40v-7c0-2.2-1.8-4-4-4z" id="path4933"/></g><g id="g4939"><path d="M48 12H16c-2.2 0-4 1.8-4 4v7h40v-7c0-2.2-1.8-4-4-4z" id="path4937" fill="#c75c5c"/></g><g class="st1" id="g4947"><path class="st2" d="M20 21c-1.1 0-2-.9-2-2v-7c0-1.1.9-2 2-2s2 .9 2 2v7c0 1.1-.9 2-2 2z" id="path4945"/></g><g class="st1" id="g4951"><path class="st2" d="M45 21c-1.1 0-2-.9-2-2v-7c0-1.1.9-2 2-2s2 .9 2 2v7c0 1.1-.9 2-2 2z" id="path4949"/></g><g id="g4955"><path class="st6" d="M20 19c-1.1 0-2-.9-2-2v-7c0-1.1.9-2 2-2s2 .9 2 2v7c0 1.1-.9 2-2 2z" id="path4953"/></g><g id="g4959"><path class="st6" d="M45 19c-1.1 0-2-.9-2-2v-7c0-1.1.9-2 2-2s2 .9 2 2v7c0 1.1-.9 2-2 2z" id="path4957"/></g></g></g></svg>

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@ -0,0 +1,4 @@
<svg version="1.1" viewBox="0 0 65.131 65.131" xmlns="http://www.w3.org/2000/svg">
<path d="m28.214 64.754c-6.9441-0.80647-14.478-4.7044-19.429-10.053-8.1024-8.7516-10.823-21.337-7.0178-32.463 3.8465-11.248 12.917-19.153 24.746-21.569 7.2561-1.4817 14.813-0.27619 21.622 3.4495 7.517 4.1126 12.568 10.251 15.291 18.582 5.5678 17.038-4.1941 35.667-21.417 40.87-4.6929 1.4178-8.7675 1.7673-13.795 1.1834zm0.43913-17.263c2.0058-2.7986 3.7663-5.0883 3.9123-5.0883 0.14591 0 1.9109 2.2959 3.9221 5.102 2.0112 2.8061 3.827 5.0577 4.0349 5.0035 0.90081-0.23467 8.2871-5.9034 8.1633-6.265-0.07527-0.21984-1.7555-2.6427-3.7338-5.3842-1.9783-2.7414-3.552-5.0223-3.497-5.0686 0.05497-0.04629 2.8095-0.97845 6.1211-2.0715 3.3117-1.093 6.0224-2.1432 6.0239-2.3338 0.0073-0.92502-2.9094-9.4312-3.283-9.5746-0.23567-0.09043-2.9906 0.68953-6.1221 1.7332-3.1315 1.0437-5.8046 1.8977-5.9404 1.8977-0.13575 0-0.28828-2.9385-0.33895-6.53l-0.09213-6.53h-10.516l-0.09213 6.53c-0.05067 3.5915-0.20809 6.53-0.34982 6.53s-2.9544-0.90204-6.2504-2.0045l-5.9927-2.0045-1.5444 4.6339c-0.8494 2.5487-1.5444 4.866-1.5444 5.1496 0 0.36743 1.7311 1.087 6.0212 2.503 3.3117 1.093 6.0662 2.0252 6.1211 2.0715 0.05497 0.04629-1.5187 2.3272-3.497 5.0686-1.9783 2.7415-3.6605 5.1643-3.7382 5.3842-0.14163 0.40073 7.4833 6.2827 8.1896 6.3175 0.20673 0.01021 2.017-2.2712 4.0228-5.0698z" stroke-width=".33922"/>
<path d="m23.631 51.953c-2.348-1.5418-6.9154-5.1737-7.0535-5.6088-0.06717-0.21164 0.45125-0.99318 3.3654-5.0734 2.269-3.177 3.7767-5.3581 3.7767-5.4637 0-0.03748-1.6061-0.60338-3.5691-1.2576-6.1342-2.0442-8.3916-2.9087-8.5288-3.2663-0.03264-0.08506 0.09511-0.68598 0.28388-1.3354 0.643-2.212 2.7038-8.4123 2.7959-8.4123 0.05052 0 2.6821 0.85982 5.848 1.9107 3.1659 1.0509 5.897 1.9222 6.0692 1.9362 0.3089 0.02514 0.31402 0.01925 0.38295-0.44107 0.09851-0.65784 0.26289-5.0029 0.2633-6.9599 1.87e-4 -0.90267 0.02801-2.5298 0.06184-3.6158l0.0615-1.9746h10.392l0.06492 4.4556c0.06287 4.3148 0.18835 7.8236 0.29865 8.3513 0.0295 0.14113 0.11236 0.2566 0.18412 0.2566 0.07176 0 1.6955-0.50861 3.6084-1.1303 4.5213-1.4693 6.2537-2.0038 7.3969-2.2822 0.87349-0.21269 0.94061-0.21704 1.0505-0.06806 0.45169 0.61222 3.3677 9.2365 3.1792 9.4025-0.33681 0.29628-2.492 1.1048-6.9823 2.6194-5.3005 1.7879-5.1321 1.7279-5.1321 1.8283 0 0.13754 0.95042 1.522 3.5468 5.1666 1.3162 1.8475 2.6802 3.7905 3.0311 4.3176l0.63804 0.95842-0.27216 0.28519c-1.1112 1.1644-7.3886 5.8693-7.8309 5.8693-0.22379 0-1.2647-1.2321-2.9284-3.4663-0.90374-1.2137-2.264-3.0402-3.0228-4.059-0.75878-1.0188-1.529-2.0203-1.7116-2.2256l-0.33201-0.37324-0.32674 0.37324c-0.43918 0.50169-2.226 2.867-3.8064 5.0388-2.1662 2.9767-3.6326 4.8055-3.8532 4.8055-0.05161 0-0.4788-0.25278-0.94931-0.56173z" fill="#fff" stroke-width=".093311"/>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -1,33 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 248.16 46.78">
<title>Fichier 1</title>
<g id="e11b986d-bcba-4466-9834-a5e44ebfe12a" data-name="Calque 2">
<g id="ab18705c-9f78-4d57-8f04-bd2f1ccdd04c" data-name="header">
<path d="M0,46.07,3.18,5.27a29.88,29.88,0,0,1,5.07-.36,27.74,27.74,0,0,1,4.95.36l4.86,17.16A92.19,92.19,0,0,1,20.4,32.51h.36A92.19,92.19,0,0,1,23.1,22.43L28,5.27a29.23,29.23,0,0,1,5-.36,29.23,29.23,0,0,1,5,.36l3.18,40.8a13.61,13.61,0,0,1-3.63.42,23.41,23.41,0,0,1-3.63-.24l-1.2-19.92q-.36-5.52-.48-12.84H31.8L24.48,40a25.62,25.62,0,0,1-4,.3,23.36,23.36,0,0,1-3.84-.3L9.36,13.49H9q-.3,8.94-.48,12.84L7.26,46.25a22.47,22.47,0,0,1-3.6.24A13.75,13.75,0,0,1,0,46.07Z"
transform="translate(0 -0.25)"/>
<path d="M74,31.31q0,8-4.26,12.3a12.21,12.21,0,0,1-9,3.42,12.21,12.21,0,0,1-9-3.42q-4.26-4.26-4.26-12.3T51.72,19a12.21,12.21,0,0,1,9-3.42,12.21,12.21,0,0,1,9,3.42Q74,23.27,74,31.31ZM60.75,21.23q-5.67,0-5.67,10.08t5.67,10.08q5.67,0,5.67-10.08T60.75,21.23Z"
transform="translate(0 -0.25)"/>
<path d="M103.2,20q2.7,4.11,2.7,11.28T102,42.56a13.18,13.18,0,0,1-10,4.11,31.41,31.41,0,0,1-11.34-2V2.45L81.06,2h2.76A4,4,0,0,1,87,3.08a5.38,5.38,0,0,1,.93,3.57V18.59a12.08,12.08,0,0,1,7.56-2.7A8.71,8.71,0,0,1,103.2,20ZM93.48,22a7.28,7.28,0,0,0-5.58,2.82v16a15,15,0,0,0,4.08.54,5.25,5.25,0,0,0,4.68-2.67q1.68-2.67,1.68-7.59Q98.34,22.07,93.48,22Z"
transform="translate(0 -0.25)"/>
<path d="M121,22.25V46.19a20.85,20.85,0,0,1-3.66.3,23,23,0,0,1-3.78-.3V25q0-3.24-2.7-3.24h-.72a9.32,9.32,0,0,1-.3-2.58,10.7,10.7,0,0,1,.3-2.7,39.63,39.63,0,0,1,4.38-.24h1a5.19,5.19,0,0,1,4,1.62A6.27,6.27,0,0,1,121,22.25Z"
transform="translate(0 -0.25)"/>
<path d="M119.82,1.09a7.37,7.37,0,0,1,.6,3,7.37,7.37,0,0,1-.6,3,7.46,7.46,0,0,1-3.87.84A6.49,6.49,0,0,1,112.26,7a7.37,7.37,0,0,1-.6-3,7.37,7.37,0,0,1,.6-3,8.09,8.09,0,0,1,3.87-.84A7.05,7.05,0,0,1,119.82,1.09Z"
transform="translate(0 -0.25)" fill="#fff"/>
<path d="M139.08,40.67h2a10.23,10.23,0,0,1,.6,3.18,9.24,9.24,0,0,1-.18,2.1,38.47,38.47,0,0,1-5.64.54q-6.48,0-6.48-7v-37l.36-.42h2.88a3.94,3.94,0,0,1,3.12,1.05,5.52,5.52,0,0,1,.9,3.57V38Q136.62,40.67,139.08,40.67Z"
transform="translate(0 -0.25)"/>
<path d="M155.94,22.25V46.19a20.85,20.85,0,0,1-3.66.3,23,23,0,0,1-3.78-.3V25q0-3.24-2.7-3.24h-.72a9.32,9.32,0,0,1-.3-2.58,10.7,10.7,0,0,1,.3-2.7,39.63,39.63,0,0,1,4.38-.24h1a5.19,5.19,0,0,1,4.05,1.62A6.27,6.27,0,0,1,155.94,22.25Z"
transform="translate(0 -0.25)"/>
<path d="M154.8,3.09a7.37,7.37,0,0,1,.6,3,7.37,7.37,0,0,1-.6,3,7.46,7.46,0,0,1-3.87.84A6.49,6.49,0,0,1,147.24,9a7.37,7.37,0,0,1-.6-3,7.37,7.37,0,0,1,.6-3,8.09,8.09,0,0,1,3.87-.84A7.05,7.05,0,0,1,154.8,3.09Z"
transform="translate(0 -0.25)" fill="#fff"/>
<path d="M163.08,39.47l8.76-11.82q1.32-1.8,4.8-5.7l-.18-.3a63.09,63.09,0,0,1-7.74.42H163a9.79,9.79,0,0,1-.24-2.34,15.8,15.8,0,0,1,.42-3.3h20.4a16.31,16.31,0,0,1,1,4.26,4.1,4.1,0,0,1-.78,2.34L175,34.91a64.65,64.65,0,0,1-4.56,5.7l.18.24q3.12-.3,5.22-.3h2.58a15.35,15.35,0,0,0,6.12-.9,9.4,9.4,0,0,1,.72,3.12q0,3.42-4.32,3.42h-18a14.27,14.27,0,0,1-.9-3.93A5.08,5.08,0,0,1,163.08,39.47Z"
transform="translate(0 -0.25)"/>
<path d="M215.88,31.31q0,8-4.26,12.3a13.63,13.63,0,0,1-18.06,0q-4.26-4.26-4.26-12.3T193.56,19a13.63,13.63,0,0,1,18.06,0Q215.88,23.27,215.88,31.31ZM202.59,21.23q-5.67,0-5.67,10.08t5.67,10.08q5.67,0,5.67-10.08T202.59,21.23Z"
transform="translate(0 -0.25)"/>
<path d="M247,26.09V39.41a11,11,0,0,0,1.2,5.64,7,7,0,0,1-4.41,1.56q-2.43,0-3.33-1.14a5.69,5.69,0,0,1-.9-3.54V27.65a7.74,7.74,0,0,0-.72-3.87,2.78,2.78,0,0,0-2.58-1.17,8.62,8.62,0,0,0-6.3,3V46.19a20.85,20.85,0,0,1-3.66.3,23,23,0,0,1-3.78-.3V16.49l.42-.36h2.76q3.42,0,4.08,3.6,4.38-3.84,8.73-3.84t6.42,2.82A12.17,12.17,0,0,1,247,26.09Z"
transform="translate(0 -0.25)"/>
<path d="M57.26,11a7.37,7.37,0,0,1-.6-3,7.37,7.37,0,0,1,.6-3,8.09,8.09,0,0,1,3.87-.84,7.05,7.05,0,0,1,3.69.84,7.37,7.37,0,0,1,.6,3,7.37,7.37,0,0,1-.6,3,7.46,7.46,0,0,1-3.87.84A6.49,6.49,0,0,1,57.26,11Z"
transform="translate(0 -0.25)" fill="#fff"/>
<path d="M198.26,11a7.37,7.37,0,0,1-.6-3,7.37,7.37,0,0,1,.6-3,8.09,8.09,0,0,1,3.87-.84,7.05,7.05,0,0,1,3.69.84,7.37,7.37,0,0,1,.6,3,7.37,7.37,0,0,1-.6,3,7.46,7.46,0,0,1-3.87.84A6.49,6.49,0,0,1,198.26,11Z"
transform="translate(0 -0.25)" fill="#fff"/>
</g>
</g>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 248.16 46.78"><g data-name="header"><path d="M0 45.82l3.18-40.8a29.88 29.88 0 015.07-.36 27.74 27.74 0 014.95.36l4.86 17.16a92.19 92.19 0 012.34 10.08h.36a92.19 92.19 0 012.34-10.08L28 5.02a29.23 29.23 0 015-.36 29.23 29.23 0 015 .36l3.18 40.8a13.61 13.61 0 01-3.63.42 23.41 23.41 0 01-3.63-.24l-1.2-19.92q-.36-5.52-.48-12.84h-.44l-7.32 26.51a25.62 25.62 0 01-4 .3 23.36 23.36 0 01-3.84-.3L9.36 13.24H9q-.3 8.94-.48 12.84L7.26 46a22.47 22.47 0 01-3.6.24A13.75 13.75 0 010 45.82zM74 31.06q0 8-4.26 12.3a12.21 12.21 0 01-9 3.42 12.21 12.21 0 01-9-3.42q-4.26-4.26-4.26-12.3t4.24-12.31a12.21 12.21 0 019-3.42 12.21 12.21 0 019 3.42Q74 23.02 74 31.06zM60.75 20.98q-5.67 0-5.67 10.08t5.67 10.08q5.67 0 5.67-10.08t-5.67-10.08zM103.2 19.75q2.7 4.11 2.7 11.28T102 42.31a13.18 13.18 0 01-10 4.11 31.41 31.41 0 01-11.34-2V2.2l.4-.45h2.76A4 4 0 0187 2.83a5.38 5.38 0 01.93 3.57v11.94a12.08 12.08 0 017.56-2.7 8.71 8.71 0 017.71 4.11zm-9.72 2a7.28 7.28 0 00-5.58 2.82v16a15 15 0 004.08.54 5.25 5.25 0 004.68-2.67q1.68-2.67 1.68-7.59 0-9.03-4.86-9.1zM121 22v23.94a20.85 20.85 0 01-3.66.3 23 23 0 01-3.78-.3V24.75q0-3.24-2.7-3.24h-.72a9.32 9.32 0 01-.3-2.58 10.7 10.7 0 01.3-2.7 39.63 39.63 0 014.38-.24h1a5.19 5.19 0 014 1.62A6.27 6.27 0 01121 22z"/><path d="M119.82.84a7.37 7.37 0 01.6 3 7.37 7.37 0 01-.6 3 7.46 7.46 0 01-3.87.84 6.49 6.49 0 01-3.69-.93 7.37 7.37 0 01-.6-3 7.37 7.37 0 01.6-3 8.09 8.09 0 013.87-.84 7.05 7.05 0 013.69.93z" fill="#fff"/><path d="M139.08 40.42h2a10.23 10.23 0 01.6 3.18 9.24 9.24 0 01-.18 2.1 38.47 38.47 0 01-5.64.54q-6.48 0-6.48-7v-37l.36-.42h2.88a3.94 3.94 0 013.12 1.05 5.52 5.52 0 01.9 3.57v31.31q-.02 2.67 2.44 2.67zM155.94 22v23.94a20.85 20.85 0 01-3.66.3 23 23 0 01-3.78-.3V24.75q0-3.24-2.7-3.24h-.72a9.32 9.32 0 01-.3-2.58 10.7 10.7 0 01.3-2.7 39.63 39.63 0 014.38-.24h1a5.19 5.19 0 014.05 1.62 6.27 6.27 0 011.43 4.39z"/><path d="M154.8 2.84a7.37 7.37 0 01.6 3 7.37 7.37 0 01-.6 3 7.46 7.46 0 01-3.87.84 6.49 6.49 0 01-3.69-.93 7.37 7.37 0 01-.6-3 7.37 7.37 0 01.6-3 8.09 8.09 0 013.87-.84 7.05 7.05 0 013.69.93z" fill="#fff"/><path d="M163.08 39.22l8.76-11.82q1.32-1.8 4.8-5.7l-.18-.3a63.09 63.09 0 01-7.74.42H163a9.79 9.79 0 01-.24-2.34 15.8 15.8 0 01.42-3.3h20.4a16.31 16.31 0 011 4.26 4.1 4.1 0 01-.78 2.34L175 34.66a64.65 64.65 0 01-4.56 5.7l.18.24q3.12-.3 5.22-.3h2.58a15.35 15.35 0 006.12-.9 9.4 9.4 0 01.72 3.12q0 3.42-4.32 3.42h-18a14.27 14.27 0 01-.9-3.93 5.08 5.08 0 011.04-2.79zM215.88 31.06q0 8-4.26 12.3a13.63 13.63 0 01-18.06 0q-4.26-4.26-4.26-12.3t4.26-12.31a13.63 13.63 0 0118.06 0q4.26 4.27 4.26 12.31zm-13.29-10.08q-5.67 0-5.67 10.08t5.67 10.08q5.67 0 5.67-10.08t-5.67-10.08zM247 25.84v13.32a11 11 0 001.2 5.64 7 7 0 01-4.41 1.56q-2.43 0-3.33-1.14a5.69 5.69 0 01-.9-3.54V27.4a7.74 7.74 0 00-.72-3.87 2.78 2.78 0 00-2.58-1.17 8.62 8.62 0 00-6.3 3v20.58a20.85 20.85 0 01-3.66.3 23 23 0 01-3.78-.3v-29.7l.42-.36h2.76q3.42 0 4.08 3.6 4.38-3.84 8.73-3.84t6.42 2.82a12.17 12.17 0 012.07 7.38z"/><path d="M57.26 10.75a7.37 7.37 0 01-.6-3 7.37 7.37 0 01.6-3 8.09 8.09 0 013.87-.84 7.05 7.05 0 013.69.84 7.37 7.37 0 01.6 3 7.37 7.37 0 01-.6 3 7.46 7.46 0 01-3.87.84 6.49 6.49 0 01-3.69-.84zM198.26 10.75a7.37 7.37 0 01-.6-3 7.37 7.37 0 01.6-3 8.09 8.09 0 013.87-.84 7.05 7.05 0 013.69.84 7.37 7.37 0 01.6 3 7.37 7.37 0 01-.6 3 7.46 7.46 0 01-3.87.84 6.49 6.49 0 01-3.69-.84z" fill="#fff"/></g></svg>

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -1,65 +1 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
data-name="Layer 1"
viewBox="0 0 100 125"
x="0px"
y="0px"
id="svg2"
version="1.1"
inkscape:version="0.91 r13725"
sodipodi:docname="profile.svg">
<metadata
id="metadata24">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs22" />
<sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="640"
inkscape:window-height="480"
id="namedview20"
showgrid="false"
inkscape:zoom="1.888"
inkscape:cx="50"
inkscape:cy="62.5"
inkscape:window-x="0"
inkscape:window-y="36"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<title
id="title4">47 all</title>
<g
id="g6">&quot;&gt;<g
id="g8">&quot;&gt;<path
d="M77.74,83.19H22.26V76.47a24,24,0,0,1,24-24h7.48a24,24,0,0,1,24,24Zm-51.48-4H73.74V76.47a20,20,0,0,0-20-20H46.26a20,20,0,0,0-20,20Z"
id="path10" />
</g>
<g
id="g12">&quot;&gt;<path
d="M50,50.5A16.85,16.85,0,1,1,66.85,33.66,16.87,16.87,0,0,1,50,50.5Zm0-29.7A12.85,12.85,0,1,0,62.85,33.66,12.86,12.86,0,0,0,50,20.81Z"
id="path14" />
</g>
</g>
</svg>
<svg xmlns="http://www.w3.org/2000/svg" data-name="Layer 1" viewBox="0 0 100 125">&quot;&gt;&quot;&gt;<path d="M77.74 83.19H22.26v-6.72a24 24 0 0124-24h7.48a24 24 0 0124 24zm-51.48-4h47.48v-2.72a20 20 0 00-20-20h-7.48a20 20 0 00-20 20z"/><g>&quot;&gt;<path d="M50 50.5a16.85 16.85 0 1116.85-16.84A16.87 16.87 0 0150 50.5zm0-29.7a12.85 12.85 0 1012.85 12.86A12.86 12.86 0 0050 20.81z"/></g></svg>

Before

Width:  |  Height:  |  Size: 1.8 KiB

After

Width:  |  Height:  |  Size: 395 B

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 17 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

@ -32,9 +32,9 @@
</div>
<footer class="card-footer">
<b-button v-if="[ParticipantRole.NOT_APPROVED, ParticipantRole.REJECTED].includes(participant.role)" @click="accept(participant)" type="is-success" class="card-footer-item">{{ $t('Approve') }}</b-button>
<b-button v-if="participant.role === ParticipantRole.NOT_APPROVED" @click="reject(participant)" type="is-danger" class="card-footer-item">{{ $t('Reject')}} </b-button>
<b-button v-if="participant.role === ParticipantRole.PARTICIPANT" @click="exclude(participant)" type="is-danger" class="card-footer-item">{{ $t('Exclude')}} </b-button>
<span v-if="participant.role === ParticipantRole.CREATOR" class="card-footer-item">{{ $t('Creator')}} </span>
<b-button v-if="participant.role === ParticipantRole.NOT_APPROVED" @click="reject(participant)" type="is-danger" class="card-footer-item">{{ $t('Reject')}}</b-button>
<b-button v-if="participant.role === ParticipantRole.PARTICIPANT" @click="exclude(participant)" type="is-danger" class="card-footer-item">{{ $t('Exclude')}}</b-button>
<span v-if="participant.role === ParticipantRole.CREATOR" class="card-footer-item">{{ $t('Creator')}}</span>
</footer>
</article>
</template>
@ -62,4 +62,8 @@ export default class ParticipantCard extends Vue {
</script>
<style lang="scss">
@import "../../variables.scss";
.card-footer-item {
height: $control-height;
}
</style>

View File

@ -296,7 +296,7 @@ export default class EditorComponent extends Vue {
new History(),
new Placeholder({
emptyClass: 'is-empty',
emptyNodeText: 'Write something …',
emptyNodeText: this.$t('Write something…'),
showOnlyWhenEditable: false,
}),
new Image(),
@ -387,6 +387,7 @@ export default class EditorComponent extends Vue {
placement: 'top-start',
inertia: true,
duration: [400, 200],
// @ts-ignore for some reason
showOnInit: true,
arrow: true,
arrowType: 'round',

View File

@ -1,124 +1,266 @@
<template>
<div>
<b-field :label="$t('Find an address')">
<b-field expanded>
<template slot="label">
{{ $t('Find an address') }}
<b-button v-if="!gettingLocation" size="is-small" icon-right="map-marker" @click="locateMe" />
<span v-else>{{ $t('Getting location') }}</span>
</template>
<b-autocomplete
:data="data"
:data="addressData"
v-model="queryText"
:placeholder="$t('e.g. 10 Rue Jangot')"
field="description"
field="fullName"
:loading="isFetching"
@typing="getAsyncData"
@select="option => selected = option">
@typing="fetchAsyncData"
icon="map-marker"
expanded
@select="updateSelected">
<template slot-scope="{option}">
<b>{{ option.description }}</b><br />
<i v-if="option.url != null">Local</i>
<p>
<small>{{ option.street }},&#32; {{ option.postalCode }} {{ option.locality }}</small>
</p>
<b-icon :icon="option.poiInfos.poiIcon.icon" />
<b>{{ option.poiInfos.name }}</b><br />
<small>{{ option.poiInfos.alternativeName }}</small>
</template>
<template slot="empty">
<span v-if="queryText.length < 5">{{ $t('Please type at least 5 characters') }}</span>
<span v-else-if="isFetching">{{ $t('Searching…') }}</span>
<div v-else class="is-enabled">
<span>{{ $t('No results for "{queryText}"', { queryText }) }}</span>
<p class="control" @click="addressModalActive = true">
<button type="button" class="button is-primary">{{ $t('Add') }}</button>
</p>
<span v-if="isFetching">{{ $t('Searching') }}</span>
<div v-else-if="queryText.length >= 3" class="is-enabled">
<span>{{ $t('No results for "{queryText}"') }}</span>
<span>{{ $t('You can try another search term or drag and drop the marker on the map', { queryText }) }}</span>
<!-- <p class="control" @click="openNewAddressModal">-->
<!-- <button type="button" class="button is-primary">{{ $t('Add') }}</button>-->
<!-- </p>-->
</div>
</template>
</b-autocomplete>
</b-field>
<b-modal :active.sync="addressModalActive" :width="640" has-modal-card scroll="keep">
<div class="modal-card" style="width: auto">
<header class="modal-card-head">
<p class="modal-card-title">{{ $t('Add an address') }}</p>
</header>
<section class="modal-card-body">
<form>
<b-field :label="$t('Name')">
<b-input aria-required="true" required v-model="selected.description" />
</b-field>
<div class="map" v-if="selected && selected.geom">
<map-leaflet
:coords="selected.geom"
:marker="{ text: [selected.poiInfos.name, selected.poiInfos.alternativeName], icon: selected.poiInfos.poiIcon.icon}"
:updateDraggableMarkerCallback="reverseGeoCode"
:options="{ zoom: mapDefaultZoom }"
:readOnly="false"
/>
</div>
<!-- <b-modal v-if="selected" :active.sync="addressModalActive" :width="640" has-modal-card scroll="keep">-->
<!-- <div class="modal-card" style="width: auto">-->
<!-- <header class="modal-card-head">-->
<!-- <p class="modal-card-title">{{ $t('Add an address') }}</p>-->
<!-- </header>-->
<!-- <section class="modal-card-body">-->
<!-- <form>-->
<!-- <b-field :label="$t('Name')">-->
<!-- <b-input aria-required="true" required v-model="selected.description" />-->
<!-- </b-field>-->
<b-field :label="$t('Street')">
<b-input v-model="selected.street" />
</b-field>
<!-- <b-field :label="$t('Street')">-->
<!-- <b-input v-model="selected.street" />-->
<!-- </b-field>-->
<b-field :label="$t('Postal Code')">
<b-input v-model="selected.postalCode" />
</b-field>
<!-- <b-field grouped>-->
<!-- <b-field :label="$t('Postal Code')">-->
<!-- <b-input v-model="selected.postalCode" />-->
<!-- </b-field>-->
<b-field :label="$t('Locality')">
<b-input v-model="selected.locality" />
</b-field>
<!-- <b-field :label="$t('Locality')">-->
<!-- <b-input v-model="selected.locality" />-->
<!-- </b-field>-->
<!-- </b-field>-->
<b-field :label="$t('Region')">
<b-input v-model="selected.region" />
</b-field>
<!-- <b-field grouped>-->
<!-- <b-field :label="$t('Region')">-->
<!-- <b-input v-model="selected.region" />-->
<!-- </b-field>-->
<b-field :label="$t('Country')">
<b-input v-model="selected.country" />
</b-field>
</form>
</section>
<footer class="modal-card-foot">
<button class="button" type="button" @click="resetPopup()">{{ $t('Clear') }}</button>
</footer>
</div>
</b-modal>
<!-- <b-field :label="$t('Country')">-->
<!-- <b-input v-model="selected.country" />-->
<!-- </b-field>-->
<!-- </b-field>-->
<!-- </form>-->
<!-- </section>-->
<!-- <footer class="modal-card-foot">-->
<!-- <button class="button" type="button" @click="resetPopup()">{{ $t('Clear') }}</button>-->
<!-- </footer>-->
<!-- </div>-->
<!-- </b-modal>-->
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue, Watch } from 'vue-property-decorator';
import { Address, IAddress } from '@/types/address.model';
import { ADDRESS } from '@/graphql/address';
import { ADDRESS, REVERSE_GEOCODE } from '@/graphql/address';
import { Modal } from 'buefy/dist/components/dialog';
import { LatLng } from 'leaflet';
import { debounce } from 'lodash';
import { CONFIG } from '@/graphql/config';
import { IConfig } from '@/types/config.model';
@Component({
components: {
'map-leaflet': () => import(/* webpackChunkName: "map" */ '@/components/Map.vue'),
Modal,
},
apollo: {
config: CONFIG,
},
})
export default class AddressAutoComplete extends Vue {
@Prop({ required: false, default: () => [] }) initialData!: IAddress[];
@Prop({ required: false }) value!: IAddress;
@Prop({ required: true }) value!: IAddress;
data: IAddress[] = this.initialData;
selected: IAddress|null = new Address();
addressData: IAddress[] = [];
selected: IAddress = new Address();
isFetching: boolean = false;
queryText: string = this.value && this.value.description || '';
queryText: string = this.value && (new Address(this.value)).fullName || '';
addressModalActive: boolean = false;
private gettingLocation: boolean = false;
private location!: Position;
private gettingLocationError: any;
private mapDefaultZoom: number = 15;
config!: IConfig;
async getAsyncData(query) {
if (query.length < 5) {
this.data = [];
// We put this in data because of issues like https://github.com/vuejs/vue-class-component/issues/263
data() {
return {
fetchAsyncData: debounce(this.asyncData, 500),
};
}
async asyncData(query: String) {
if (!query.length) {
this.addressData = [];
this.selected = new Address();
return;
}
if (query.length < 3) {
this.addressData = [];
return;
}
this.isFetching = true;
const result = await this.$apollo.query({
query: ADDRESS,
fetchPolicy: 'no-cache',
variables: { query },
fetchPolicy: 'network-only',
variables: {
query,
locale: this.$i18n.locale,
},
});
this.data = result.data.searchAddress as IAddress[];
this.addressData = result.data.searchAddress.map(address => new Address(address));
this.isFetching = false;
}
// Watch deep because of subproperties
@Watch('selected', { deep: true })
updateSelected() {
@Watch('config')
watchConfig(config: IConfig) {
if (!config.geocoding.autocomplete) {
// If autocomplete is disabled, we put a larger debounce value so that we don't request with incomplete address
// @ts-ignore
this.fetchAsyncData = debounce(this.asyncData, 2000);
}
}
@Watch('value')
updateEditing() {
this.selected = this.value;
const address = new Address(this.selected);
this.queryText = `${address.poiInfos.name} ${address.poiInfos.alternativeName}`;
}
updateSelected(option) {
if (option == null) return;
this.selected = option;
this.$emit('input', this.selected);
}
resetPopup() {
this.selected = new Address();
}
openNewAddressModal() {
this.resetPopup();
this.addressModalActive = true;
}
async reverseGeoCode(e: LatLng, zoom: Number) {
// If the position has been updated through autocomplete selection, no need to geocode it !
if (this.checkCurrentPosition(e)) return;
const result = await this.$apollo.query({
query: REVERSE_GEOCODE,
variables: {
latitude: e.lat,
longitude: e.lng,
zoom,
locale: this.$i18n.locale,
},
});
this.addressData = result.data.reverseGeocode.map(address => new Address(address));
const defaultAddress = new Address(this.addressData[0]);
this.selected = defaultAddress;
this.$emit('input', this.selected);
this.queryText = `${defaultAddress.poiInfos.name} ${defaultAddress.poiInfos.alternativeName}`;
}
checkCurrentPosition(e: LatLng) {
if (!this.selected || !this.selected.geom) return false;
const lat = parseFloat(this.selected.geom.split(';')[1]);
const lon = parseFloat(this.selected.geom.split(';')[0]);
return e.lat === lat && e.lng === lon;
}
async locateMe(): Promise<void> {
this.gettingLocation = true;
try {
this.gettingLocation = false;
this.location = await this.getLocation();
this.mapDefaultZoom = 12;
this.reverseGeoCode(new LatLng(this.location.coords.latitude, this.location.coords.longitude), 12);
} catch (e) {
this.gettingLocation = false;
this.gettingLocationError = e.message;
}
}
async getLocation(): Promise<Position> {
return new Promise((resolve, reject) => {
if (!('geolocation' in navigator)) {
reject(new Error('Geolocation is not available.'));
}
navigator.geolocation.getCurrentPosition(pos => {
resolve(pos);
}, err => {
reject(err);
});
});
}
}
</script>
<style lang="scss">
.autocomplete .dropdown-item.is-disabled .is-enabled {
opacity: 1 !important;
cursor: auto;
.autocomplete {
.dropdown-menu {
z-index: 2000;
}
.dropdown-item.is-disabled {
opacity: 1 !important;
cursor: auto;
}
}
.read-only {
cursor: pointer;
}
.map {
height: 400px;
width: 100%;
}
</style>

View File

@ -50,7 +50,7 @@ export default class DateCalendarIcon extends Vue {
flex-direction: column;
justify-content: center;
/*height: 50px;*/
width: 48px;
width: 50px;
padding: 8px;
text-align: center;

View File

@ -12,19 +12,33 @@
```
</docs>
<template>
<b-field grouped horizontal :label="label">
<b-datepicker
:day-names="localeShortWeekDayNamesProxy"
:month-names="localeMonthNamesProxy"
expanded
:first-day-of-week="parseInt($t('firstDayOfWeek'), 10)"
:min-date="minDate"
v-model="date"
:placeholder="$t('Click to select')"
icon="calendar"
/>
<b-input expanded type="time" required v-model="time" />
</b-field>
<div class="field is-horizontal">
<div class="field-label is-normal">
<label class="label">{{ label }}</label>
</div>
<div class="field-body">
<div class="field is-narrow is-grouped">
<b-datepicker
:day-names="localeShortWeekDayNamesProxy"
:month-names="localeMonthNamesProxy"
:first-day-of-week="parseInt($t('firstDayOfWeek'), 10)"
:min-date="minDate"
v-model="dateWithoutTime"
:placeholder="$t('Click to select')"
:years-range="[-2,10]"
icon="calendar"
class="is-narrow"
/>
<b-timepicker
placeholder="Type or select a time..."
icon="clock"
v-model="dateWithTime"
size="is-small"
inline>
</b-timepicker>
</div>
</div>
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue, Watch } from 'vue-property-decorator';
@ -53,40 +67,26 @@ export default class DateTimePicker extends Vue {
*/
@Prop({ required: false, type: Date, default: null }) minDate!: Date;
date: Date = this.value;
time: string = '00:00';
dateWithoutTime: Date = this.value;
dateWithTime: Date = this.dateWithoutTime;
localeShortWeekDayNamesProxy = localeShortWeekDayNames();
localeMonthNamesProxy = localeMonthNames();
mounted() {
this.convertTime();
@Watch('value')
updateValue() {
this.dateWithoutTime = this.value;
this.dateWithTime = this.dateWithoutTime;
}
convertTime() {
let minutes = this.date.getHours() * 60 + this.date.getMinutes();
minutes = Math.ceil(minutes / this.step) * this.step;
this.time = [Math.floor(minutes / 60), minutes % 60].map((v) => { return v < 10 ? `0${v}` : v; }).join(':');
}
@Watch('time')
updateTime(time: string) {
const [hours, minutes] = time.split(':', 2);
this.date.setHours(parseInt(hours, 10));
this.date.setMinutes(parseInt(minutes, 10));
@Watch('dateWithoutTime')
updateDateWithoutTimeWatcher() {
this.updateDateTime();
}
@Watch('date')
updateDate() {
this.updateTime(this.time);
}
@Watch('value')
updateValue() {
this.date = this.value;
this.convertTime();
@Watch('dateWithTime')
updateDateWithTimeWatcher() {
this.updateDateTime();
}
updateDateTime() {
@ -95,7 +95,17 @@ export default class DateTimePicker extends Vue {
*
* @type {Date}
*/
this.$emit('input', this.date);
this.dateWithoutTime.setHours(this.dateWithTime.getHours());
this.dateWithoutTime.setMinutes(this.dateWithTime.getMinutes());
this.$emit('input', this.dateWithoutTime);
}
}
</script>
<style lang="scss" scoped>
.timepicker {
/deep/ .dropdown-content {
padding: 0;
}
}
</style>

View File

@ -28,13 +28,11 @@ A simple card for an event
<template>
<router-link class="card" :to="{ name: 'Event', params: { uuid: event.uuid } }">
<div class="card-image" v-if="!event.image">
<figure class="image is-16by9">
<div class="card-image">
<figure class="image is-16by9" :style="`background-image: url('${event.picture ? event.picture.url : '/img/mobilizon_default_card.png'}')`">
<div class="tag-container" v-if="event.tags">
<b-tag v-for="tag in event.tags.slice(0, 3)" :key="tag.slug" type="is-secondary">{{ tag.title }}</b-tag>
</div>
<img v-if="event.picture" :src="event.picture.url" />
<img v-else src="https://picsum.photos/g/400/225/?random" />
</figure>
</div>
<div class="content">
@ -46,7 +44,6 @@ A simple card for an event
</div>
<span class="organizer-place-wrapper">
<span v-if="actorDisplayName && actorDisplayName !== '@'">{{ $t('By {name}', { name: actorDisplayName }) }}</span>
<span v-if="actorDisplayName && actorDisplayName !== '@'">-</span>
<span v-if="event.physicalAddress && (event.physicalAddress.locality || event.physicalAddress.description)">
{{ event.physicalAddress.locality || event.physicalAddress.description }}
</span>
@ -76,17 +73,10 @@ A simple card for an event
</template>
<script lang="ts">
import { IEvent, ParticipantRole } from '@/types/event.model';
import { IEvent, IEventCardOptions, ParticipantRole } from '@/types/event.model';
import { Component, Prop, Vue } from 'vue-property-decorator';
import DateCalendarIcon from '@/components/Event/DateCalendarIcon.vue';
import { IActor, IPerson, Person } from '@/types/actor';
export interface IEventCardOptions {
hideDate: boolean;
loggedPerson: IPerson | boolean;
hideDetails: boolean;
organizerActor: IActor | null;
}
import { Person } from '@/types/actor';
@Component({
components: {
@ -175,6 +165,11 @@ export default class EventCard extends Vue {
div.card-image {
background: $secondary;
figure.image {
background-size: cover;
background-position: center;
}
}
div.content {
@ -195,9 +190,9 @@ export default class EventCard extends Vue {
-webkit-box-orient: vertical;
overflow: hidden;
font-weight: 400;
font-size: 1.6em;
font-size: 1.4em;
margin-top: auto;
min-height: 3.5rem;
min-height: 3.4rem;
}
}
span.organizer-place-wrapper {
@ -208,6 +203,11 @@ export default class EventCard extends Vue {
padding-right: 0.25rem;
}
span:not(:last-child):after {
content: '-';
padding-left: 0.25rem;
}
span:last-child {
flex: 1;
white-space: nowrap;

View File

@ -18,14 +18,31 @@
</docs>
<template>
<span v-if="!endsOn">{{ beginsOn | formatDateTimeString }}</span>
<span v-else-if="isSameDay()">
<span v-if="!endsOn">{{ beginsOn | formatDateTimeString(showStartTime) }}</span>
<span v-else-if="isSameDay() && showStartTime && showEndTime">
{{ $t('On {date} from {startTime} to {endTime}', {date: formatDate(beginsOn), startTime: formatTime(beginsOn), endTime: formatTime(endsOn)}) }}
</span>
<span v-else-if="endsOn">
<span v-else-if="isSameDay() && !showStartTime && showEndTime">
{{ $t('On {date} ending at {endTime}', {date: formatDate(beginsOn), endTime: formatTime(endsOn)}) }}
</span>
<span v-else-if="isSameDay() && showStartTime && !showEndTime">
{{ $t('On {date} starting at {startTime}', {date: formatDate(beginsOn), startTime: formatTime(beginsOn)}) }}
</span>
<span v-else-if="isSameDay()">
{{ $t('On {date}', {date: formatDate(beginsOn)}) }}
</span>
<span v-else-if="endsOn && showStartTime && showEndTime">
{{ $t('From the {startDate} at {startTime} to the {endDate} at {endTime}',
{startDate: formatDate(beginsOn), startTime: formatTime(beginsOn), endDate: formatDate(endsOn), endTime: formatTime(endsOn)}) }}
</span>
<span v-else-if="endsOn && showStartTime">
{{ $t('From the {startDate} at {startTime} to the {endDate}',
{startDate: formatDate(beginsOn), startTime: formatTime(beginsOn), endDate: formatDate(endsOn)}) }}
</span>
<span v-else-if="endsOn">
{{ $t('From the {startDate} to the {endDate}',
{startDate: formatDate(beginsOn), endDate: formatDate(endsOn)}) }}
</span>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
@ -34,6 +51,8 @@ import { Component, Prop, Vue } from 'vue-property-decorator';
export default class EventFullDate extends Vue {
@Prop({ required: true }) beginsOn!: string;
@Prop({ required: false }) endsOn!: string;
@Prop({ required: false, default: true }) showStartTime!: boolean;
@Prop({ required: false, default: true }) showEndTime!: boolean;
formatDate(value) {
if (!this.$options.filters) return;

View File

@ -14,7 +14,7 @@ export default {
data() {
return {
participation: {
event: {
event: {
title: 'Vue Styleguidist first meetup: learn the basics!',
id: 5,
uuid: 'some uuid',
@ -31,7 +31,7 @@ export default {
},
participantStats: {
approved: 1,
unapproved: 2
notApproved: 2
}
},
actor: {
@ -55,40 +55,41 @@ export default {
<div class="columns">
<div class="content column">
<div class="title-wrapper">
<div class="date-component" v-if="!mergedOptions.hideDate">
<div class="date-component">
<date-calendar-icon :date="participation.event.beginsOn" />
</div>
<h2 class="title">{{ participation.event.title }}</h2>
</div>
<div>
<div class="participation-actor has-text-grey">
<span v-if="participation.event.physicalAddress && participation.event.physicalAddress.locality">{{ participation.event.physicalAddress.locality }} - </span>
<span v-if="participation.actor.id === participation.event.organizerActor.id">{{ $t("You're organizing this event") }}</span>
<span v-else>
<span v-if="participation.event.beginsOn < new Date()">{{ $t('Organized by {name}', { name: participation.event.organizerActor.displayName() } ) }}</span>
|
<span>{{ $t('Going as {name}', { name: participation.actor.displayName() }) }}</span>
<span>
<span>{{ $t('Organized by {name}', { name: participation.event.organizerActor.displayName() } ) }}</span>
<span v-if="participation.role === ParticipantRole.PARTICIPANT">{{ $t('Going as {name}', { name: participation.actor.displayName() }) }}</span>
</span>
</div>
<div class="columns">
<span class="column is-narrow">
<b-icon icon="earth" v-if=" participation.event.visibility === EventVisibility.PUBLIC" />
<b-icon icon="lock_opened" v-if=" participation.event.visibility === EventVisibility.RESTRICTED" />
<b-icon icon="lock" v-if=" participation.event.visibility === EventVisibility.PRIVATE" />
<b-icon icon="earth" v-if="participation.event.visibility === EventVisibility.PUBLIC" />
<b-icon icon="lock-open" v-if="participation.event.visibility === EventVisibility.UNLISTED" />
<b-icon icon="lock" v-if="participation.event.visibility === EventVisibility.PRIVATE" />
</span>
<span class="column">
<span v-if="!participation.event.options.maximumAttendeeCapacity">
{{ $tc('{count} participants', participation.event.participantStats.approved, { count: participation.event.participantStats.approved })}}
<span class="column is-narrow participant-stats">
<span v-if="participation.event.options.maximumAttendeeCapacity !== 0">
{{ $t('{approved} / {total} seats', {approved: participation.event.participantStats.participant, total: participation.event.options.maximumAttendeeCapacity }) }}
<!-- <b-progress-->
<!-- v-if="participation.event.options.maximumAttendeeCapacity > 0"-->
<!-- size="is-medium"-->
<!-- :value="participation.event.participantStats.participant * 100 / participation.event.options.maximumAttendeeCapacity">-->
<!-- </b-progress>-->
</span>
<span v-else>
{{ $tc('{count} participants', participation.event.participantStats.participant, { count: participation.event.participantStats.participant })}}
</span>
<b-progress
v-if="participation.event.options.maximumAttendeeCapacity > 0"
type="is-primary"
size="is-medium"
:value="participation.event.participantStats.approved * 100 / participation.event.options.maximumAttendeeCapacity" show-value>
{{ $t('{approved} / {total} seats', {approved: participation.event.participantStats.approved, total: participation.event.options.maximumAttendeeCapacity }) }}
</b-progress>
<span
v-if="participation.event.participantStats.unapproved > 0">
{{ $tc('{count} requests waiting', participation.event.participantStats.unapproved, { count: participation.event.participantStats.unapproved })}}
v-if="participation.event.participantStats.notApproved > 0">
<b-button type="is-text" @click="gotToWithCheck(participation, { name: RouteName.PARTICIPATIONS, params: { eventId: participation.event.uuid } })">
{{ $tc('{count} requests waiting', participation.event.participantStats.notApproved, { count: participation.event.participantStats.notApproved })}}
</b-button>
</span>
</span>
</div>
@ -96,20 +97,36 @@ export default {
<div class="actions column is-narrow">
<ul>
<li v-if="!([ParticipantRole.PARTICIPANT, ParticipantRole.NOT_APPROVED].includes(participation.role))">
<router-link :to="{ name: RouteName.EDIT_EVENT, params: { eventId: participation.event.uuid } }">
<b-icon icon="pencil" /> {{ $t('Edit') }}
</router-link>
<b-button
type="is-text"
@click="gotToWithCheck(participation, { name: RouteName.EDIT_EVENT, params: { eventId: participation.event.uuid } })"
icon-left="pencil"
>
{{ $t('Edit') }}
</b-button>
</li>
<li v-if="!([ParticipantRole.PARTICIPANT, ParticipantRole.NOT_APPROVED].includes(participation.role))" @click="openDeleteEventModalWrapper">
<b-button type="is-text" icon-left="delete">
{{ $t('Delete') }}
</b-button>
</li>
<li v-if="!([ParticipantRole.PARTICIPANT, ParticipantRole.NOT_APPROVED].includes(participation.role))">
<a @click="openDeleteEventModalWrapper"><b-icon icon="delete" /> {{ $t('Delete') }}</a>
</li>
<li v-if="!([ParticipantRole.PARTICIPANT, ParticipantRole.NOT_APPROVED].includes(participation.role))">
<router-link :to="{ name: RouteName.PARTICIPATIONS, params: { eventId: participation.event.uuid } }">
<b-icon icon="account-multiple-plus" /> {{ $t('Manage participations') }}
</router-link>
<b-button
type="is-text"
@click="gotToWithCheck(participation, { name: RouteName.PARTICIPATIONS, params: { eventId: participation.event.uuid } })"
icon-left="account-multiple-plus"
>
{{ $t('Manage participations') }}
</b-button>
</li>
<li>
<router-link :to="{ name: RouteName.EVENT, params: { uuid: participation.event.uuid } }"><b-icon icon="view-compact" /> {{ $t('View event page') }}</router-link>
<b-button
tag="router-link"
icon-left="view-compact"
type="is-text"
:to="{ name: RouteName.EVENT, params: { uuid: participation.event.uuid } }">
{{ $t('View event page') }}
</b-button>
</li>
</ul>
</div>
@ -118,17 +135,17 @@ export default {
</template>
<script lang="ts">
import { IParticipant, ParticipantRole, EventVisibility } from '@/types/event.model';
import { IParticipant, ParticipantRole, EventVisibility, IEventCardOptions } from '@/types/event.model';
import { Component, Prop } from 'vue-property-decorator';
import DateCalendarIcon from '@/components/Event/DateCalendarIcon.vue';
import { IActor, IPerson, Person } from '@/types/actor';
import { IPerson } from '@/types/actor';
import { mixins } from 'vue-class-component';
import ActorMixin from '@/mixins/actor';
import { CURRENT_ACTOR_CLIENT, LOGGED_USER_PARTICIPATIONS } from '@/graphql/actor';
import { CURRENT_ACTOR_CLIENT } from '@/graphql/actor';
import EventMixin from '@/mixins/event';
import { RouteName } from '@/router';
import { ICurrentUser } from '@/types/current-user.model';
import { IEventCardOptions } from './EventCard.vue';
import { changeIdentity } from '@/utils/auth';
import { Route } from 'vue-router';
const defaultOptions: IEventCardOptions = {
hideDate: true,
@ -174,10 +191,26 @@ export default class EventListCard extends mixins(ActorMixin, EventMixin) {
await this.openDeleteEventModal(this.participation.event, this.currentActor);
}
async gotToWithCheck(participation: IParticipant, route: Route) {
if (participation.actor.id !== this.currentActor.id && participation.event.organizerActor) {
const organizer = participation.event.organizerActor as IPerson;
await changeIdentity(this.$apollo.provider.defaultClient, organizer);
this.$buefy.notification.open({
message: this.$t('Current identity has been changed to {identityName} in order to manage this event.', {
identityName: organizer.preferredUsername,
}) as string,
type: 'is-info',
position: 'is-bottom-right',
duration: 5000,
});
}
return await this.$router.push(route);
}
}
</script>
<style lang="scss">
<style lang="scss" scoped>
@import "../../variables";
article.box {
@ -205,6 +238,15 @@ export default class EventListCard extends mixins(ActorMixin, EventMixin) {
div.content {
padding: 5px;
.participation-actor span, .participant-stats span {
padding: 0 5px;
button {
height: auto;
padding-top: 0;
}
}
div.title-wrapper {
display: flex;
align-items: center;
@ -227,14 +269,29 @@ export default class EventListCard extends mixins(ActorMixin, EventMixin) {
}
}
progress + .progress-value {
color: $primary !important;
/deep/ progress + .progress-value {
color: lighten($primary, 20%) !important;
}
}
.actions {
ul li {
margin: 0 auto;
.is-link {
cursor: pointer;
}
.button.is-text {
text-decoration: none;
/deep/ span:first-child i.mdi::before {
font-size: 24px !important;
}
/deep/ span:last-child {
padding-left: 4px;
}
}
* {
font-size: 0.8rem;

View File

@ -39,6 +39,8 @@ export default {
:allow-new="true"
:field="path"
icon="label"
maxlength="20"
maxtags="10"
:placeholder="$t('Eg: Stockholm, Dance, Chess…')"
@typing="getFilteredTags"
>

View File

@ -1,44 +1,64 @@
<template>
<div class="map-container">
<div class="map-container" v-if="config">
<l-map
:zoom="mergedOptions.zoom"
:style="`height: ${mergedOptions.height}; width: ${mergedOptions.width}`"
class="leaflet-map"
:center="[lat, lon]"
@click="clickMap"
@update:zoom="updateZoom"
>
<l-tile-layer
url="https://{s}.tile.osm.org/{z}/{x}/{y}.png"
attribution="© OpenStreetMap contributors"
:url="config.maps.tiles.endpoint"
:attribution="attribution"
>
</l-tile-layer>
<l-marker :lat-lng="[lat, lon]" >
<l-popup v-if="popup">{{ popup }}</l-popup>
<v-locatecontrol :options="{icon: 'mdi mdi-map-marker'}"/>
<l-marker :lat-lng="[lat, lon]" @add="openPopup" @update:latLng="updateDraggableMarkerPosition" :draggable="!readOnly">
<l-popup v-if="popupMultiLine">
<span v-for="line in popupMultiLine" :key="line">{{ line }}<br /></span>
</l-popup>
</l-marker>
</l-map>
</div>
</template>
<script lang="ts">
import { Icon } from 'leaflet';
import { Icon, LatLng, LeafletMouseEvent } from 'leaflet';
import 'leaflet/dist/leaflet.css';
import { Component, Prop, Vue } from 'vue-property-decorator';
import { LMap, LTileLayer, LMarker, LPopup } from 'vue2-leaflet';
import { LMap, LTileLayer, LMarker, LPopup, LIcon } from 'vue2-leaflet';
import Vue2LeafletLocateControl from '@/components/Map/Vue2LeafletLocateControl.vue';
import { CONFIG } from '@/graphql/config';
import { IConfig } from '@/types/config.model';
@Component({
components: { LTileLayer, LMap, LMarker, LPopup },
components: { LTileLayer, LMap, LMarker, LPopup, LIcon, 'v-locatecontrol': Vue2LeafletLocateControl },
apollo: {
config: CONFIG,
},
})
export default class Map extends Vue {
@Prop({ type: Boolean, required: false, default: true }) readOnly!: boolean;
@Prop({ type: String, required: true }) coords!: string;
@Prop({ type: String, required: false }) popup!: string;
@Prop({ type: Object, required: false }) marker!: { text: String|String[], icon: String };
@Prop({ type: Object, required: false }) options!: object;
@Prop({ type: Function, required: false, default: () => {} }) updateDraggableMarkerCallback!: Function;
defaultOptions: object = {
defaultOptions: {
zoom: Number;
height: String;
width: String;
} = {
zoom: 15,
height: '100%',
width: '100%',
};
zoom = this.defaultOptions.zoom;
config!: IConfig;
mounted() {
// this part resolve an issue where the markers would not appear
// @ts-ignore
@ -51,12 +71,41 @@ export default class Map extends Vue {
});
}
openPopup(event) {
this.$nextTick(() => {
event.target.openPopup();
});
}
get mergedOptions(): object {
return { ...this.defaultOptions, ...this.options };
}
get lat() { return this.$props.coords.split(';')[1]; }
get lon() { return this.$props.coords.split(';')[0]; }
get popupMultiLine() {
if (Array.isArray(this.marker.text)) {
return this.marker.text;
}
return [this.marker.text];
}
clickMap(event: LeafletMouseEvent) {
this.updateDraggableMarkerPosition(event.latlng);
}
updateDraggableMarkerPosition(e: LatLng) {
this.updateDraggableMarkerCallback(e, this.zoom);
}
updateZoom(zoom: Number) {
this.zoom = zoom;
}
get attribution() {
return this.config.maps.tiles.attribution || this.$t('© The OpenStreetMap Contributors');
}
}
</script>
<style lang="scss" scoped>

View File

@ -0,0 +1,47 @@
<template>
<div style="display: none;">
<slot v-if="ready"></slot>
</div>
</template>
<script lang="ts">
/**
* Fork of https://github.com/domoritz/leaflet-locatecontrol to try to trigger location manually (not done ATM)
*/
import L, { DomEvent } from 'leaflet';
import { findRealParent, propsBinder } from 'vue2-leaflet';
import 'leaflet.locatecontrol';
import { Component, Prop, Vue } from 'vue-property-decorator';
@Component({
beforeDestroy() {
// @ts-ignore
this.parentContainer.removeLayer(this);
},
})
export default class Vue2LeafletLocateControl extends Vue {
@Prop({ type: Object, default: () => { return {}; } }) options;
@Prop({ type: Boolean, default: true }) visible = true;
ready: boolean = false;
mapObject!: any;
parentContainer: any;
mounted() {
this.mapObject = L.control.locate(this.options);
DomEvent.on(this.mapObject, this.$listeners as any);
propsBinder(this, this.mapObject, this.$props);
this.ready = true;
this.parentContainer = findRealParent(this.$parent);
this.mapObject.addTo(this.parentContainer.mapObject, !this.visible);
}
public locate() {
this.mapObject.start();
}
}
</script>
<style>
@import "~leaflet.locatecontrol/dist/L.Control.Locate.css";
</style>

View File

@ -20,7 +20,7 @@
<figure class="image is-32x32" v-if="currentActor.avatar">
<img class="is-rounded" alt="avatarUrl" :src="currentActor.avatar.url">
</figure>
<span>{{ currentActor.preferredUsername }}</span>
<b-icon v-else icon="account-circle" />
</template>
<b-navbar-item tag="span" v-for="identity in identities" v-if="identities.length > 1" :active="identity.id === currentActor.id" :key="identity.id">
@ -29,10 +29,14 @@
<figure class="image is-32x32" v-if="identity.avatar">
<img class="is-rounded" :src="identity.avatar.url" alt="" />
</figure>
<b-icon v-else icon="account-circle" />
</div>
<div class="media-content">
<span>{{ identity.displayName() }}</span>
<span class="has-text-grey" v-if="identity.name">
@{{ identity.preferredUsername }}
</span>
</div>
</span>

View File

@ -28,6 +28,7 @@
margin-right: 30px;
max-height: 200px;
max-width: 200px;
overflow: hidden;
}
.image-placeholder {
@ -52,7 +53,7 @@ import { Component, Model, Prop, Vue, Watch } from 'vue-property-decorator';
@Component
export default class PictureUpload extends Vue {
@Model('change', { type: File }) readonly pictureFile!: File;
@Prop({ type: String, required: false, default: 'image/png,image/jpeg' }) accept;
@Prop({ type: String, required: false, default: 'image/gif,image/png,image/jpeg,image/webp' }) accept;
// @ts-ignore
@Prop({ type: String, required: false, default() { return this.$t('Avatar'); } }) textFallback!: string;

View File

@ -25,5 +25,9 @@ export default class SearchField extends Vue {
input.searchField {
box-shadow: none;
border-color: #b5b5b5;
&::placeholder {
color: gray;
}
}
</style>
</style>

View File

@ -10,8 +10,13 @@ function formatTimeString(value: string): string {
return parseDateTime(value).toLocaleTimeString(undefined, { hour: 'numeric', minute: 'numeric' });
}
function formatDateTimeString(value: string): string {
return parseDateTime(value).toLocaleTimeString(undefined, { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric' });
function formatDateTimeString(value: string, showTime: boolean = true): string {
const options = { weekday: 'long', year: 'numeric', month: 'long', day: 'numeric', hour: 'numeric', minute: 'numeric' };
if (showTime) {
options.hour = 'numeric';
options.minute = 'numeric';
}
return parseDateTime(value).toLocaleTimeString(undefined, options);
}

View File

@ -70,7 +70,7 @@ query {
}`;
export const CURRENT_ACTOR_CLIENT = gql`
query {
query currentActor {
currentActor @client {
id,
avatar {
@ -113,8 +113,8 @@ query LoggedUserParticipations($afterDateTime: DateTime, $beforeDateTime: DateTi
}
},
participantStats {
approved,
unapproved
notApproved
participant
},
options {
maximumAttendeeCapacity
@ -160,8 +160,8 @@ export const LOGGED_USER_DRAFTS = gql`
}
},
participantStats {
approved,
unapproved
going,
notApproved
},
options {
maximumAttendeeCapacity

View File

@ -1,21 +1,34 @@
import gql from 'graphql-tag';
const $addressFragment = `
id,
description,
geom,
street,
locality,
postalCode,
region,
country,
type,
url,
originId
`;
export const ADDRESS = gql`
query($query:String!) {
query($query:String!, $locale: String) {
searchAddress(
query: $query
query: $query,
locale: $locale
) {
id,
description,
geom,
floor,
street,
locality,
postalCode,
region,
country,
url,
originId
${$addressFragment}
}
}
`;
export const REVERSE_GEOCODE = gql`
query($latitude: Float!, $longitude: Float!, $zoom: Int, $locale: String) {
reverseGeocode(latitude: $latitude, longitude: $longitude, zoom: $zoom, locale: $locale) {
${$addressFragment}
}
}
`;

View File

@ -5,7 +5,24 @@ query {
config {
name,
description,
registrationsOpen
registrationsOpen,
demoMode,
countryCode,
location {
latitude,
longitude,
accuracyRadius
},
maps {
tiles {
endpoint,
attribution
}
},
geocoding {
provider,
autocomplete
}
}
}
`;

View File

@ -18,14 +18,15 @@ const participantQuery = `
const physicalAddressQuery = `
description,
floor,
street,
locality,
postalCode,
region,
country,
geom,
id
type,
id,
originId
`;
const tagsQuery = `
@ -38,6 +39,8 @@ const optionsQuery = `
maximumAttendeeCapacity,
remainingAttendeeCapacity,
showRemainingAttendeeCapacity,
showStartTime,
showEndTime,
offers {
price,
priceCurrency,
@ -100,9 +103,9 @@ export const FETCH_EVENT = gql`
# name,
# },
participantStats {
approved,
unapproved,
participants
going,
notApproved,
participant
},
tags {
${tagsQuery}
@ -257,9 +260,9 @@ export const CREATE_EVENT = gql`
id,
},
participantStats {
approved,
unapproved,
participants
going,
notApproved,
participant
},
tags {
${tagsQuery}
@ -286,6 +289,7 @@ export const EDIT_EVENT = gql`
$picture: PictureInput,
$onlineAddress: String,
$phoneAddress: String,
$organizerActorId: ID,
$category: String,
$physicalAddress: AddressInput,
$options: EventOptionsInput,
@ -304,6 +308,7 @@ export const EDIT_EVENT = gql`
picture: $picture,
onlineAddress: $onlineAddress,
phoneAddress: $phoneAddress,
organizerActorId: $organizerActorId,
category: $category,
physicalAddress: $physicalAddress
options: $options,
@ -342,9 +347,9 @@ export const EDIT_EVENT = gql`
id,
},
participantStats {
approved,
unapproved,
participants
going,
notApproved,
participant
},
tags {
${tagsQuery}
@ -408,10 +413,10 @@ export const PARTICIPANTS = gql`
${participantQuery}
},
participantStats {
approved,
unapproved,
going,
notApproved,
rejected,
participants
participant
}
}
}

52
js/src/i18n/ar.json Normal file
View File

@ -0,0 +1,52 @@
{
"Avatar": "الصورة الرمزية",
"Cancel": "الغاء",
"Category": "الفئة",
"Change": "تعديل",
"Change password": "تعديل الكلمة السرية",
"Comments": "التعليقات",
"Confirm my particpation": "تأكيد مشاركتي",
"Country": "البلد",
"Create": "انشاء",
"Create a new event": "انشاء فعالية جديدة",
"Create a new group": "إنشاء فريق جديد",
"Create a new identity": "إنشاء هوية جديدة",
"Create group": "إنشاء فريق",
"Create my event": "انشئ فعاليتي",
"Create my group": "انشئ فريقي",
"Create my profile": "انشئ ملفي التعريفي",
"Date and time settings": "إعدادات التاريخ والوقت",
"Delete": "حذف",
"Delete this identity": "حذف هذه الهوية",
"Description": "الوصف",
"Display name": "الإسم المعروض",
"Draft": "مسودة",
"Drafts": "المسودات",
"Eg: Stockholm, Dance, Chess…": "مثال: تونس ، رقص ، شطرنج…",
"Email": "البريد الإلكتروني",
"Event": "فعالية",
"Event list": "قائمة الفعاليات",
"Events": "الفعاليات",
"Explore": "استكشاف",
"Features": "الميزات",
"Forgot your password ?": "هل نسيت كلمتك السرية؟",
"General information": "معلومات عامة",
"Group List": "قائمة الفِرَق",
"Group name": "اسم الفريق",
"Groups": "الفِرَق",
"I participate": "أشارِك",
"Last published event": "آخِر فعالية تم نشرها",
"Last week": "الأسبوع الماضي",
"Learn more": "معرفة المزيد",
"License": "الرخصة",
"New password": "الكلمة السرية الجديدة",
"Old password": "الكلمة السرية القديمة",
"Password": "الكلمة السرية",
"Password (confirmation)": "الكلمة السرية (تأكيد)",
"Reset my password": "صفّر كلمتي السرية",
"The password was successfully changed": "تم تعديل الكلمة السرية بنجاح",
"Username": "إسم المستخدم",
"Welcome back {username}!": "أهلا بك ثانيةً {username}!",
"Welcome back!": "أهلًا بك ثانيةً!",
"Welcome to Mobilizon, {username}!": "مرحبًا بك إلى موبيليزون ، {username}!"
}

View File

@ -1 +1,332 @@
{}
{
"<b>Please do not use it in any real way</b>: everything you create here (accounts, events, identities, etc.) will be automatically deleted every 48 hours.": "<b>Bitte nutze es für keine wirklichen Veranstaltungen</b>: Alles, was Du hier erstellst (Accounts, Veranstaltungen, Identitäten, etc.) wird nach 48 Stunden automatisch gelöscht.",
"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.",
"Abandon edition": "Bearbeitung abbrechen",
"About": "Über",
"About Mobilizon": "Über Mobilizon",
"About this event": "Über diese Veranstaltung",
"About this instance": "Über diese Instanz",
"Add": "Hinzufügen",
"Add an address": "Adresse hinzufügen",
"Add some tags": "Füge Tags hinzu",
"Add to my calendar": "Zu meinem Kalender hinzufügen",
"Additional comments": "Zusätzliche Kommentare",
"Administration": "Administration",
"All data will be deleted every 48 hours, so please don't use this for anything real.": "Alle Daten werden alle 48 Stunden gelöscht, also benutze diesen Service bitte nur zu Testzwecken.",
"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",
"Allow all comments": "Erlaube alle Kommentare",
"An error has occurred.": "Ein Fehler ist aufgetreten.",
"Approve": "Bestätigen",
"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.",
"Avatar": "Profilbild",
"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.",
"By {name}": "Nach {name}",
"Cancel": "Abbrechen",
"Cancel creation": "Erstellung abbrechen",
"Cancel edition": "Bearbeiten abbrechen",
"Cancel my participation request…": "Meine Teilnahmeanfrage abbrechen…",
"Cancel my participation…": "Meine Teilnahme absagen…",
"Cancelled: Won't happen": "Abgebrochen: Wird nicht stattfinden",
"Category": "Kategorie",
"Change": "Ändern",
"Change my identity…": "Identität wechseln…",
"Change my password": "Passwort ändern",
"Change password": "Passwort ändern",
"Clear": "Leeren",
"Click to select": "Klicken zum Auswählen",
"Click to upload": "Klicken zum Hochladen",
"Close comments for all (except for admins)": "Schließe die Kommentare für alle (außer für Administratoren)",
"Comments": "Kommentare",
"Comments on the event page": "Kommentare auf der Veranstaltungs-Seite",
"Confirm my particpation": "Bestätige meine Teilnahme",
"Confirmed: Will happen": "Bestätigt: Wird stattfinden",
"Continue editing": "Bearbeitung fortsetzen",
"Country": "Land",
"Create": "Erstellen",
"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 and manage several identities from the same account": "Erstelle und verwalte mehrere Identitäten vom selben Account aus",
"Create group": "Gruppe erstellen",
"Create my event": "Erstelle eine neue Veranstaltung",
"Create my group": "Erstelle meine Gruppe",
"Create my profile": "Erstelle mein Profil",
"Create token": "Token erstellen",
"Create, edit or delete events": "Erstelle, bearbeite oder lösche Veranstaltungen",
"Creator": "Ersteller",
"Current identity has been changed to {identityName} in order to manage this event.": "Aktuelle Identität wurde zu {identityName} geändert, um das Event bearbeiten zu können.",
"Date and time settings": "Datums- und Uhrzeiteinstellungen",
"Date parameters": "Datumsoptionen",
"Delete": "Löschen",
"Delete event": "Event löschen",
"Delete this identity": "Identität löschen",
"Delete your identity": "Deine Identität löschen",
"Delete {eventTitle}": "Lösche {eventTitle}",
"Delete {preferredUsername}": "Lösche {preferredUsername}",
"Description": "Beschreibung",
"Didn't receive the instructions ?": "Bestätigung nicht erhalten?",
"Display name": "Namen einzeigen",
"Display participation price": "Teilnahmegebühr anzeigen",
"Draft": "Entwurf",
"Drafts": "Entwürfe",
"Edit": "Bearbeiten",
"Eg: Stockholm, Dance, Chess…": "z.B.: Berlin, Tanzen, Schach…",
"Either the account is already validated, either the validation token is incorrect.": "Der Account ist bereits bestätigt, oder der Bestätigungstoken ist abgelaufen.",
"Email": "E-Mail",
"Ends on…": "Endet mit…",
"Enjoy discovering Mobilizon!": "Viel Spaß beim Entdecken von Mobilizon!",
"Enter the link URL": "Füge die URL ein",
"Error while communicating with the server.": "Fehler bei der Kommunikation mit dem Server.",
"Error while saving report.": "Fehler beim Speichern der Meldung.",
"Error while validating account": "Fehler beim Bestätigen des Accounts",
"Event": "Veranstaltung",
"Event already passed": "Veranstaltung hat bereits stattgefunden",
"Event cancelled": "Veranstaltung abgesagt",
"Event creation": "Veranstaltungserstellung",
"Event edition": "Veranstaltungsbearbeitung",
"Event list": "Veranstaltungsliste",
"Event not found.": "Veranstaltung nicht gefunde.",
"Event page settings": "Einstellungen der Veranstaltungsseite",
"Event to be confirmed": "Veranstaltungsbestätigung noch ausstehend",
"Event {eventTitle} deleted": "Veranstaltung {eventTitle} gelöscht",
"Event {eventTitle} reported": "Veranstaltung {eventTitle} gemeldet",
"Events": "Veranstaltungen",
"Exclude": "Ausschließen",
"Explore": "Entdecken",
"Featured events": "Vorgestellte Veranstaltungen",
"Features": "Funktionen",
"Find an address": "Adresse finden",
"Find an instance": "Eine Instanz finden",
"For instance: London, Taekwondo, Architecture…": "Beispielsweise: London, Taekwondo, Architektur…",
"Forgot your password ?": "Passwort vergessen?",
"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?": "Von kleinen Geburtstagspartys mit Freunden und Familie, bis hin zu Demonstrationen gegen den Klimawandel, momentan sind alle Treffen <b>in den Platformen der Tech-Giganten gefangen</b>. Wie können wir uns organisieren, wie können wir auf \"Teilnehmen\" klicken, ohne <b>private Daten an Facebook zu geben</b> oder <b>uns selbst an MeetUp zu binden</b>?",
"From the {startDate} at {startTime} to the {endDate}": "Vom {startDate} um {startTime} bis zum {endDate}",
"From the {startDate} at {startTime} to the {endDate} at {endTime}": "Vom {startDate} um {startTime} bis zum {endDate} um {endTime}",
"From the {startDate} to the {endDate}": "Vom {startDate} bis zum {endDate}",
"Gather ⋅ Organize ⋅ Mobilize": "Treffen ⋅ Organisieren ⋅ Mobilisieren",
"General information": "Allgemeine Informationen",
"Getting location": "Standort ermitteln",
"Going as {name}": "Teilnahme als {name}",
"Group List": "Gruppenliste",
"Group full name": "Vollständiger Gruppenname",
"Group name": "Gruppenname",
"Group {displayName} created": "Gruppe {displayName} erstellt",
"Groups": "Guppen",
"Headline picture": "Titelbild",
"I create an identity": "Ich erstelle eine Identität",
"I participate": "Ich nehme teil",
"I want to approve every participation request": "Ich will jede Teilnahmeanfrage manuell bestätigen",
"Identity {displayName} created": "Identität {displayName} erstellt",
"Identity {displayName} deleted": "Identität {displayName} gelöscht",
"Identity {displayName} updated": "Identität {displayName} aktualisiert",
"If an account with this email exists, we just sent another confirmation email to {email}": "Falls ein Account mit dieser E-Mail-Adresse existiert, werden wir eine neue Bestätigung an {email} senden",
"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 der einzige Administrator von einer oder mehrerer Gruppen sein sollte, musst du diese erst löschen, bevor du diese Identität löschen kannst.",
"Impossible to login, your email or password seems incorrect.": "Login nicht möglich. Deine Email oder dein Passwort ist falsch.",
"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 unter {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.",
"Join {instance}, a Mobilizon instance": "Tritt {instance} bei, eine Mobilizoninstanz",
"Last published event": "Zuletzt veröffentlichte Veranstaltung",
"Last week": "Letzte Woche",
"Learn more": "Erfahre mehr",
"Learn more about Mobilizon": "Lerne mehr über Mobilizon",
"Leave event": "Veranstaltung Verlassen",
"Leaving event \"{title}\"": "Verlasse Veranstalung \"{title}\"",
"Let's create a new common": "Lass uns eine neues Gemeingut erschaffen",
"License": "Lizenz",
"Limited number of places": "Limitierte Anzahl an Plätzen",
"Load more": "Lade mehr",
"Locality": "Ort",
"Log in": "Einloggen",
"Log out": "Abmelden",
"Login": "Login",
"Login on Mobilizon!": "Log dich auf Mobilizon ein!",
"Manage participations": "Teilnehmer Verwalten",
"Members": "Mitglieder",
"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 eine freie (wie Freiheit) software, welche es Gemeinschaften erlaubt <b>ihre eigenen Raum</b> zu schaffen um Veranstaltungen bekannt zu geben, und um sich von den Tech Giganten loszulösen.",
"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>.",
"Mobilizons licence": "Mobilizons Lizenz",
"Moderated comments (shown after approval)": "Moderierte Kommentare (anzeigen nach manueller Freigabe)",
"My account": "Mein Account",
"My events": "Meine Veranstaltungen",
"My identities": "Meine Identitäten",
"Name": "Name",
"New password": "Neues Passwort",
"No address defined": "Keine Adresse festgelegt",
"No end date": "Keine Enddatum",
"No events found": "Keine Veranstaltungen gefunden",
"No group found": "Keine Gruppe gefunden",
"No groups found": "Keine Gruppen gefunden",
"No results for \"{queryText}\"": "Keine Ergebnisse für \"{queryText}\"",
"No user account with this email was found. Maybe you made a typo?": "Kein Account mit dieser E-Mail gefunden. Vielleicht hast Du dich vertippt?",
"Number of places": "Anzahl der Plätze",
"OK": "OK",
"Old password": "Altes Passwort",
"On {date}": "Am {date}",
"On {date} ending at {endTime}": "Am {date} endend um {endTime}",
"On {date} from {startTime} to {endTime}": "Am {date} von {startTime} bis {endTime}",
"On {date} starting at {startTime}": "Am {date} beginnend um {startTime}",
"One person is going": "Niemand geht hin | Eine Person geht hin | {approved} Personen gehen hin",
"Only accessible through link and search (private)": "Nur erreichbar über den Link oder die Suche (privat)",
"Opened reports": "Geöffnete Meldungen",
"Organized": "Organisiert",
"Organized by {name}": "Organisiert von {name}",
"Organizer": "Organisator",
"Otherwise this identity will just be removed from the group administrators.": "Andernfalls wird diese Identität nur als Gruppenadministrator entfernt.",
"Page limited to my group (asks for auth)": "Seite ist auf meine Gruppe beschränkt (fragt nach Authentifikation)",
"Page not found": "Seite nicht gefunden",
"Participant already was rejected.": "Teilnehmer wurde bereits abgelehnt.",
"Participant has already been approved as participant.": "Teilnehmer wurde bereits bestätigt.",
"Participants": "Teilnehmer",
"Participate": "Teilnehmen",
"Participation approval": "Teilnahmebestätigung",
"Participation requested!": "Teilnahme angefragt!",
"Password": "Passwort",
"Password (confirmation)": "Passwort (Bestätigung)",
"Password change": "Passwort Ändern",
"Password reset": "Passwort zurücksetzen",
"Past events": "Vergangene Veranstaltungen",
"Pick an identity": "Wähle eine Identität",
"Please check your spam folder if you didn't receive the email.": "Bitte schaue auch in deinem Spam-Ordner nach, ob 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 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 read the full rules": "Bitte ließ die kompletten Regeln",
"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",
"Postal Code": "Postleitzahl",
"Private event": "Private Veranstaltung",
"Private feeds": "Private Feeds",
"Public RSS/Atom Feed": "Öffentlicher RSS/Atom-Feed",
"Public comment moderation": "Öffentliche Kommentare",
"Public event": "Öffentliches Event",
"Public feeds": "Öffentliche Feeds",
"Public iCal Feed": "Öffentlicher iCal-Feed",
"Publish": "Veröffentlichen",
"Published events": "Veröffentlichte Veranstaltungen",
"RSS/Atom Feed": "RSS/Atom-Feed",
"Read Framasofts statement of intent on the Framablog": "Ließ Framasofts Absichtserklärung im Framablog",
"Region": "Region",
"Register": "Registrieren",
"Register an account on Mobilizon!": "Registriere einen Account bei Mobilizon!",
"Register for an event by choosing one of your identities": "Registriere dich für eine Veranstaltung, indem Du eine deiner Identitäten wählst",
"Registration is currently closed.": "Registrierungen sind aktuell geschlossen.",
"Reject": "Ablehnen",
"Rejected": "Abgelehnt",
"Rejected participations": "Abgelehnte Teilnahmen",
"Report": "Melden",
"Report this event": "Diese Veranstaltung melden",
"Requests": "Anfragen",
"Resend confirmation email": "Bestätigungsmail erneut senden",
"Reset my password": "Mein Passwort zurücksetzen",
"Save": "Speichern",
"Save draft": "Entwurf speichern",
"Search": "Suche",
"Search events, groups, etc.": "Durchsuche Veranstaltungen, Gruppen, etc.",
"Search results: \"{search}\"": "Suchergebnisse: \"{search}\"",
"Searching…": "Suche…",
"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 report": "Meldung senden",
"Share this event": "Diese Veranstaltung teilen",
"Show map": "Karte anzeigen",
"Show remaining number of places": "Freie Plätze anzeigen",
"Show the time when the event begins": "Zeige mir die Zeit, zu der die Veranstaltung endet",
"Show the time when the event ends": "Zeige mir die Zeit, zu der die Veranstaltung endet",
"Sign up": "Registrieren",
"Software to the people": "Software für die Menschen",
"Starts on…": "Startet am…",
"Status": "Status",
"Street": "Straße",
"Tentative: Will be confirmed later": "Vorläufig: Wird später bestätigt",
"The content came from another server. Transfer an anonymous copy of the report?": "Der Inhalt kam von einem anderen Server. Willst Du 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 draft event has been updated": "Der Entwurf wurde aktualisiert",
"The event has been created as a draft": "Diese Veranstaltung wurde als Entwurf erstellt",
"The event has been published": "Diese Veranstaltung wurde veröffentlicht",
"The event has been updated": "Diese Veranstaltung wurde aktualisiert",
"The event has been updated and published": "Diese Veranstaltung wurde aktualisiert und veröffentlicht",
"The event organizer didn't add any description.": "Der Organisator hat keine Beschreibung hinzugefügt.",
"The event title will be ellipsed.": "Der Titel der Veranstaltung wird verkürzt dargestellt.",
"The page you're looking for doesn't exist.": "Die Seite, nach der Du suchst, existiert nicht.",
"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 Moderatoren deiner Instanz gesendet. Du kannst unten erläutern, warum Du diesen Inhalt meldest.",
"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 eventuell im Spam-Ordner nach.",
"There are {participants} participants.": "Es gibt {participants} Teilnehmer.",
"These events may interest you": "Diese Veranstaltungen könnten dich interessieren",
"This installation (called “instance“) can easily {interconnect}, thanks to {protocol}.": "Solch eine 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 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 will delete / anonymize all content (events, comments, messages, participations…) created from this identity.": "Dies wird alle Inhalte (Veranstaltungen, Kommentare, Nachrichten, Teilnahmen...) löschen/anonymisieren, die von dieser Identität erstellt wurden.",
"Title": "Titel",
"To achieve your registration, please create a first identity profile.": "Erstelle bitte deine erste Identität, um die Registrierung abzuschließen.",
"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",
"Transfer to {outsideDomain}": "Zu {outsideDomain} übertragen",
"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 Organisatoren abgelehnt.",
"Unknown error.": "Unbekannter Fehler.",
"Unsaved changes": "Nicht gespeicherte Änderungen",
"Upcoming": "Demnächst",
"Update event {name}": "Event {name} aktualisieren",
"Update my event": "Meine Veranstaltungen aktualisieren",
"User accounts and every other data is currently deleted every 48 hours, so you may want to register again.": "Nutzeraccounts und jegliche andere Daten werden aktuell alle 48 Stunden gelöscht. Daher müsstest Du dich neu registrieren.",
"Username": "Nutzername",
"Users": "Nutzer",
"View event page": "Veranstaltungsseite anzeigen",
"View everything": "Alles anzeigen",
"View page on {hostname} (in a new window)": "Seite auf {hostname} anzeigen (in einem neuen Fenster)",
"Visible everywhere on the web (public)": "Sichtbar im ganzen Internet (öffentlich)",
"Waiting for organization team approval.": "Warte auf die Bestätigung des Organisationsteams.",
"Waiting list": "Warteliste",
"Warning": "Warnung",
"We just sent an email to {email}": "Wir haben gerade eine E-Mail an {email} gesendet",
"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> entwickeln, welches <b>Privatsphäre und Aktivismus</b> respektiert, und jeder sein Eigen nennen kann.",
"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, welches 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.",
"Website / URL": "Website / URL",
"Welcome back {username}!": "Willkommen zurück {username}!",
"Welcome back!": "Willkommen zurück!",
"Welcome on your administration panel": "Willkommen in deiner Administrationsansicht",
"Welcome to Mobilizon, {username}!": "Willkommen zu Mobilizon, {username}!",
"Who can view this event and participate": "Wer kann diese Veranstaltung sehen und teilnehmen",
"World map": "Weltkarte",
"Write something…": "Schreibe 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 bist bereits ein Teilnehmer dieser Veranstaltung.",
"You are already logged-in.": "Du bist bereits eingeloggt.",
"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't remove your last identity.": "Du kannst deine letzte Identität nicht löschen.",
"You have been disconnected": "Deine Verbindung wurde getrennt",
"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 may also ask to {resend_confirmation_email}.": "Du kannst auch die {resend_confirmation_email}.",
"You need to login.": "Du musst dich einloggen.",
"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 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 requested": "Deine Teilnahme wurde angefragt",
"a decentralised federation protocol": "eins dezentralisiertem Föderatons-Protokoll",
"e.g. 10 Rue Jangot": "z.B. Musterstraße 21",
"firstDayOfWeek": "0",
"iCal Feed": "iCal-Feed",
"interconnect with others like it": "mit anderen seiner Art verbinden",
"its source code is public": "der Quellcode offen ist",
"on our blog": "in unserem Blog",
"resend confirmation email": "Bestätigungsmail erneut senden",
"respect of the fundamental freedoms": "Respekt für die fundamentalen Freiheiten",
"with another identity…": "mit einer anderen Identität.…",
"with {identity}": "mit {identity}",
"{approved} / {total} seats": "{approved} / {total} Plätze",
"{count} participants": "Noch keine Teilnehmer | Ein Teilnehmer | {count} Teilnehmer",
"{count} requests waiting": "{count} Anfragen ausstehend",
"{license} guarantees {respect} of the people who will use it. Since {source}, anyone can audit it, which guarantees its transparency.": "{license} garantiert den {respect} der Leute die es Nutzen. Da {sources}, kann jeder ihn einsehen und analysieren, was Tranzparenz verspricht.",
"© The Mobilizon Contributors {date} - Made with Elixir, Phoenix, VueJS & with some love and some weeks": "© Das Mobilizon Team {date} - Entwickelt mit Elixir, Phoenix, VueJS & viel liebe und viel Zeit",
"© The OpenStreetMap Contributors": "© OpenStreetMap-Mitwirkende"
}

View File

@ -13,12 +13,15 @@
"Add": "Add",
"Additional comments": "Additional comments",
"Administration": "Administration",
"All data will be deleted every 48 hours, so please don't use this for anything real.": "All data will be deleted every 48 hours, so please don't use this for anything real.",
"All the places have already been taken": "All the places have been taken|One place is still available|{places} places are still available",
"Allow all comments": "Allow all comments",
"An error has occurred.": "An error has occurred.",
"Approve": "Approve",
"Are you sure you want to cancel the event creation? You'll lose all modifications.": "Are you sure you want to cancel the event creation? You'll lose all modifications.",
"Are you sure you want to cancel the event edition? You'll lose all modifications.": "Are you sure you want to cancel the event edition? You'll lose all modifications.",
"Are you sure you want to cancel your participation at event \"{title}\"?": "Are you sure you want to cancel your participation at event \"{title}\"?",
"Are you sure you want to delete this event? This action cannot be reverted.": "Are you sure you want to delete this event? This action cannot be reverted.",
"Avatar": "Avatar",
"Before you can login, you need to click on the link inside it to validate your account": "Before you can login, you need to click on the link inside it to validate your account",
"By {name}": "By {name}",
@ -46,23 +49,28 @@
"Create a new event": "Create a new event",
"Create a new group": "Create a new group",
"Create a new identity": "Create a new identity",
"Create and manage several identities from the same account": "Create and manage several identities from the same account",
"Create group": "Create group",
"Create my event": "Create my event",
"Create my group": "Create my group",
"Create my profile": "Create my profile",
"Create token": "Create token",
"Create your communities and your events": "Create your communities and your events",
"Create, edit or delete events": "Create, edit or delete events",
"Create": "Create",
"Creator": "Creator",
"Current identity has been changed to {identityName} in order to manage this event.": "Current identity has been changed to {identityName} in order to manage this event.",
"Date and time settings": "Date and time settings",
"Date parameters": "Date parameters",
"Delete event": "Delete event",
"Delete this identity": "Delete this identity",
"Delete your identity": "Delete your identity",
"Delete {eventTitle}": "Delete {eventTitle}",
"Delete {preferredUsername}": "Delete {preferredUsername}",
"Delete": "Delete",
"Description": "Description",
"Didn't receive the instructions ?": "Didn't receive the instructions ?",
"Display name": "Display name",
"Display participation price": "Display participation price",
"Displayed name": "Displayed name",
"Draft": "Draft",
"Drafts": "Drafts",
"Edit": "Edit",
@ -70,13 +78,18 @@
"Either the account is already validated, either the validation token is incorrect.": "Either the account is already validated, either the validation token is incorrect.",
"Email": "Email",
"Ends on…": "Ends on…",
"Enjoy discovering Mobilizon!": "Enjoy discovering Mobilizon!",
"Enter the link URL": "Enter the link URL",
"Error while communicating with the server.": "Error while communicating with the server.",
"Error while saving report.": "Error while saving report.",
"Error while validating account": "Error while validating account",
"Event already passed": "Event already passed",
"Event cancelled": "Event cancelled",
"Event creation": "Event creation",
"Event edition": "Event edition",
"Event list": "Event list",
"Event not found.": "Event not found.",
"Event page settings": "Event page settings",
"Event to be confirmed": "Event to be confirmed",
"Event {eventTitle} deleted": "Event {eventTitle} deleted",
"Event {eventTitle} reported": "Event {eventTitle} reported",
@ -92,8 +105,11 @@
"Forgot your password ?": "Forgot your password ?",
"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?": "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?",
"From the {startDate} at {startTime} to the {endDate} at {endTime}": "From the {startDate} at {startTime} to the {endDate} at {endTime}",
"From the {startDate} at {startTime} to the {endDate}": "From the {startDate} at {startTime} to the {endDate}",
"From the {startDate} to the {endDate}": "From the {startDate} to the {endDate}",
"Gather ⋅ Organize ⋅ Mobilize": "Gather ⋅ Organize ⋅ Mobilize",
"General information": "General information",
"Getting location": "Getting location",
"Going as {name}": "Going as {name}",
"Group List": "Group List",
"Group full name": "Group full name",
@ -109,6 +125,7 @@
"Identity {displayName} updated": "Identity {displayName} updated",
"If an account with this email exists, we just sent another confirmation email to {email}": "If an account with this email exists, we just sent another confirmation email to {email}",
"If this identity is the only administrator of some groups, you need to delete them before being able to delete this identity.": "If this identity is the only administrator of some groups, you need to delete them before being able to delete this identity.",
"Impossible to login, your email or password seems incorrect.": "Impossible to login, your email or password seems incorrect.",
"In the meantime, please consider that the software is not (yet) finished. More information {onBlog}.": "In the meantime, please consider that the software is not (yet) finished. More information {onBlog}.",
"Installing Mobilizon will allow communities to free themselves from the services of tech giants by creating <b>their own event platform</b>.": "Installing Mobilizon will allow communities to free themselves from the services of tech giants by creating <b>their own event platform</b>.",
"Join {instance}, a Mobilizon instance": "Join {instance}, a Mobilizon instance",
@ -139,22 +156,31 @@
"Name": "Name",
"New password": "New password",
"No address defined": "No address defined",
"No end date": "No end date",
"No events found": "No events found",
"No group found": "No group found",
"No groups found": "No groups found",
"No results for \"{queryText}\"": "No results for \"{queryText}\"",
"No user account with this email was found. Maybe you made a typo?": "No user account with this email was found. Maybe you made a typo?",
"Number of places": "Number of places",
"OK": "OK",
"Old password": "Old password",
"On {date} ending at {endTime}": "On {date} ending at {endTime}",
"On {date} from {startTime} to {endTime}": "On {date} from {startTime} to {endTime}",
"On {date} starting at {startTime}": "On {date} starting at {startTime}",
"On {date}": "On {date}",
"One person is going": "No one is going | One person is going | {approved} persons are going",
"Only accessible through link and search (private)": "Only accessible through link and search (private)",
"Only alphanumeric characters and underscores are supported.": "Only alphanumeric characters and underscores are supported.",
"Opened reports": "Opened reports",
"Organized by {name}": "Organized by {name}",
"Organized": "Organized",
"Organizer": "Organizer",
"Other stuff…": "Other stuff…",
"Otherwise this identity will just be removed from the group administrators.": "Otherwise this identity will just be removed from the group administrators.",
"Page limited to my group (asks for auth)": "Page limited to my group (asks for auth)",
"Page not found": "Page not found",
"Participant already was rejected.": "Participant already was rejected.",
"Participant has already been approved as participant.": "Participant has already been approved as participant.",
"Participants": "Participants",
"Participate": "Participate",
"Participation approval": "Participation approval",
@ -165,12 +191,11 @@
"Password": "Password",
"Past events": "Passed events",
"Pick an identity": "Pick an identity",
"Please be nice to each other": "Please be nice to each other",
"Please check your spam folder if you didn't receive the email.": "Please check your spam folder if you didn't receive the email.",
"Please contact this instance's Mobilizon admin if you think this is a mistake.": "Please contact this instance's Mobilizon admin if you think this is a mistake.",
"Please make sure the address is correct and that the page hasn't been moved.": "Please make sure the address is correct and that the page hasn't been moved.",
"Please read the full rules": "Please read the full rules",
"Please type at least 5 characters": "Please type at least 5 characters",
"Please refresh the page and retry.": "Please refresh the page and retry.",
"Postal Code": "Postal Code",
"Private event": "Private event",
"Private feeds": "Private feeds",
@ -185,6 +210,7 @@
"Read Framasofts statement of intent on the Framablog": "Read Framasofts statement of intent on the Framablog",
"Region": "Region",
"Register an account on Mobilizon!": "Register an account on Mobilizon!",
"Register for an event by choosing one of your identities": "Register for an event by choosing one of your identities",
"Register": "Register",
"Registration is currently closed.": "Registration is currently closed.",
"Reject": "Reject",
@ -207,6 +233,8 @@
"Share this event": "Share this event",
"Show map": "Show map",
"Show remaining number of places": "Show remaining number of places",
"Show the time when the event begins": "Show the time when the event begins",
"Show the time when the event ends": "Show the time when the event ends",
"Sign up": "Sign up",
"Software to the people": "Software to the people",
"Starts on…": "Starts on…",
@ -214,11 +242,19 @@
"Street": "Street",
"Tentative: Will be confirmed later": "Tentative: Will be confirmed later",
"The content came from another server. Transfer an anonymous copy of the report?": "The content came from another server. Transfer an anonymous copy of the report ?",
"The current identity doesn't have any permission on this event. You should probably change it.": "The current identity doesn't have any permission on this event. You should probably change it.",
"The draft event has been updated": "The draft event has been updated",
"The event has been created as a draft": "The event has been created as a draft",
"The event has been published": "The event has been published",
"The event has been updated and published": "The event has been updated and published",
"The event has been updated": "The event has been updated",
"The event organizer didn't add any description.": "The event organizer didn't add any description.",
"The event title will be ellipsed.": "The event title will be ellipsed.",
"The page you're looking for doesn't exist.": "The page you're looking for doesn't exist.",
"The password was successfully changed": "The password was successfully changed",
"The report will be sent to the moderators of your instance. You can explain why you report this content below.": "The report will be sent to the moderators of your instance. You can explain why you report this content below.",
"The user account you're trying to login as has not been confirmed yet. Check your email inbox and eventually your spam folder.": "The user account you're trying to login as has not been confirmed yet. Check your email inbox and eventually your spam folder.",
"There are {participants} participants.": "There are {participants} participants.",
"These events may interest you": "These events may interest you",
"This installation (called “instance“) can easily {interconnect}, thanks to {protocol}.": "This installation (called “instance“) can easily {interconnect}, thanks to {protocol}.",
"This instance isn't opened to registrations, but you can register on other instances.": "This instance isn't opened to registrations, but you can register on other instances.",
@ -227,6 +263,7 @@
"Title": "Title",
"To achieve your registration, please create a first identity profile.": "To achieve your registration, please create a first identity profile.",
"To change the world, change the software": "To change the world, change the software",
"To confirm, type your event title \"{eventTitle}\"": "To confirm, type your event title \"{eventTitle}\"",
"To confirm, type your identity username \"{preferredUsername}\"": "To confirm, type your identity username \"{preferredUsername}\"",
"Transfer to {outsideDomain}": "Transfer to {outsideDomain}",
"Unfortunately, this instance isn't opened to registrations": "Unfortunately, this instance isn't opened to registrations",
@ -236,10 +273,12 @@
"Upcoming": "Upcoming",
"Update event {name}": "Update event {name}",
"Update my event": "Update my event",
"User accounts and every other data is currently deleted every 48 hours, so you may want to register again.": "User accounts and every other data is currently deleted every 48 hours, so you may want to register again.",
"Username": "Username",
"Users": "Users",
"View event page": "View event page",
"View everything": "View everything",
"View page on {hostname} (in a new window)": "View page on {hostname} (in a new window)",
"Visible everywhere on the web (public)": "Visible everywhere on the web (public)",
"Waiting for organization team approval.": "Waiting for organization team approval.",
"Waiting list": "Waiting list",
@ -248,38 +287,47 @@
"We want to develop a <b>digital common</b>, that everyone can make their own, which respects <b>privacy and activism by design</b>.": "We want to develop a <b>digital common</b>, that everyone can make their own, which respects <b>privacy and activism by design</b>.",
"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.": "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.",
"Website / URL": "Website / URL",
"Welcome back {username}": "Welcome back {username}",
"Welcome back {username}!": "Welcome back {username}!",
"Welcome back!": "Welcome back!",
"Welcome on your administration panel": "Welcome on your administration panel",
"Welcome to Mobilizon, {username}!": "Welcome to Mobilizon, {username}!",
"Who can view this event and participate": "Who can view this event and participate",
"World map": "World map",
"Write something…": "Write something…",
"You and one other person are going to this event": "You're the only one going to this event | You and one other person are going to this event | You and {approved} persons are going to this event.",
"You are already a participant of this event.": "You are already a participant of this event.",
"You are already logged-in.": "You are already logged-in.",
"You can add tags by hitting the Enter key or by adding a comma": "You can add tags by hitting the Enter key or by adding a comma",
"You can try another search term or drag and drop the marker on the map": "You can try another search term or drag and drop the marker on the map",
"You can't remove your last identity.": "You can't remove your last identity.",
"You have been disconnected": "You have been disconnected",
"You have cancelled your participation": "You have cancelled your participation",
"You have one event in {days} days.": "You have no events in {days} days | You have one event in {days} days. | You have {count} events in {days} days",
"You have one event today.": "You have no events today | You have one event today. | You have {count} events today",
"You have one event tomorrow.": "You have no events tomorrow | You have one event tomorrow. | You have {count} events tomorrow",
"You may also ask to {resend_confirmation_email}.": "You may also ask to {resend_confirmation_email}.",
"You need to login.": "You need to login.",
"You're organizing this event": "You're organizing this event",
"Your account has been validated": "Your account has been validated",
"Your account is being validated": "Your account is being validated",
"Your account is nearly ready, {username}": "Your account is nearly ready, {username}",
"Your local administrator resumed it's policy:": "Your local administrator resumed it's policy:",
"Your local administrator resumed its policy:": "Your local administrator resumed its policy:",
"Your participation has been confirmed": "Your participation has been confirmed",
"Your participation has been requested": "Your participation has been requested",
"a decentralised federation protocol": "a decentralised federation protocol",
"e.g. 10 Rue Jangot": "e.g. 10 Rue Jangot",
"firstDayOfWeek": "0",
"iCal Feed": "iCal Feed",
"interconnect with others like it": "interconnect with others like it",
"its source code is public": "its source code is public",
"meditate a bit": "meditate a bit",
"on our blog": "on our blog",
"resend confirmation email": "resend confirmation email",
"respect of the fundamental freedoms": "respect of the fundamental freedoms",
"with another identity…": "with another identity…",
"with {identity}": "with {identity}",
"{approved} / {total} seats": "{approved} / {total} seats",
"{count} participants": "{count} participants",
"{count} participants": "No participants yet | One participant | {count} participants",
"{count} requests waiting": "{count} requests waiting",
"{license} guarantees {respect} of the people who will use it. Since {source}, anyone can audit it, which guarantees its transparency.": "{license} guarantees {respect} of the people who will use it. Since {source}, anyone can audit it, which guarantees its transparency.",
"© The Mobilizon Contributors {date} - Made with Elixir, Phoenix, VueJS & with some love and some weeks": "© The Mobilizon Contributors {date} - Made with Elixir, Phoenix, VueJS & with some love and some weeks"
}
"© The Mobilizon Contributors {date} - Made with Elixir, Phoenix, VueJS & with some love and some weeks": "© The Mobilizon Contributors {date} - Made with Elixir, Phoenix, VueJS & with some love and some weeks",
"© The OpenStreetMap Contributors": "© The OpenStreetMap Contributors"
}

View File

@ -1,5 +1,5 @@
{
"<b>Please do not use it in any real way</b>: everything you create here (accounts, events, identities, etc.) will be automatically deleted every 48 hours.": "<b>Merci de ne pas en faire un utilisation réelle</b> : tout ce que vous créerez ici (comptes, événements, identités, etc.) sera automatiquement effacé toutes les 48 heures.",
"<b>Please do not use it in any real way</b>: everything you create here (accounts, events, identities, etc.) will be automatically deleted every 48 hours.": "<b>Merci de ne pas en faire une utilisation réelle</b> : tout ce que vous créerez ici (comptes, événements, identités, etc.) sera automatiquement effacé toutes les 48 heures.",
"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}",
"Abandon edition": "Abandonner l'édition",
@ -7,18 +7,17 @@
"About this event": "À propos de cet événement",
"About this instance": "À propos de cette instance",
"About": "À propos",
"Add a new profile": "Ajouter un nouveau profil",
"Add a tag": "Ajouter un tag",
"Add an address": "Ajouter une adresse",
"Add some tags": "Ajouter des tags",
"Add to my calendar": "Ajouter à mon agenda",
"Add": "Ajouter",
"Additional comments": "Commentaires additionnels",
"Administration": "Administration",
"All data will be deleted every 48 hours, so please don't use this for anything real.": "Toutes les données seront effacées toutes les 48 heures, donc n'utilisez pas ce site à des fins autres que de démonstration.",
"All the places have already been taken": "Toutes les places ont été prises|Une place est encore disponible|{places} places sont encore disponibles",
"Allow all comments": "Autoriser tous les commentaires",
"An error has occurred.": "Une erreur est survenue.",
"Approve": "Approuver",
"Are you going to this event?": "Allez-vous à cet événement ?",
"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 l'édition 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} » ?",
@ -31,7 +30,7 @@
"Cancel my participation request…": "Annuler ma demande de participation…",
"Cancel my participation…": "Annuler ma participation…",
"Cancel": "Annuler",
"Cancelled: Won't happen": "Annulé: N'aura pas lieu",
"Cancelled: Won't happen": "Annulé : N'aura pas lieu",
"Category": "Catégorie",
"Change my identity…": "Changer mon identité…",
"Change my password": "Modifier mon mot de passe",
@ -43,22 +42,25 @@
"Close comments for all (except for admins)": "Fermer les commentaires à tout le monde (excepté les administrateurs)",
"Comments on the event page": "Commentaires sur la page de l'événement",
"Comments": "Commentaires",
"Confirm my particpation": "Confirmer ma particpation",
"Confirm my particpation": "Confirmer ma participation",
"Confirmed: Will happen": "Confirmé : aura lieu",
"Continue editing": "Continuer l'édition",
"Country": "Pays",
"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 and manage several identities from the same account": "Créer et gérer plusieurs identités sur un même compte",
"Create group": "Créer un groupe",
"Create my event": "Créer mon événement",
"Create my group": "Créer mon groupe",
"Create my profile": "Créer mon profil",
"Create token": "Créer un jeton",
"Create your communities and your events": "Créer vos communautés et vos événements",
"Create, edit or delete events": "Créer, modifier ou supprimer des événements",
"Create": "Créer",
"Creator": "Créateur",
"Current": "Actuel",
"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.",
"Date and time settings": "Paramètres de date et d'heure",
"Date parameters": "Paramètres de date",
"Delete event": "Supprimer un événement",
"Delete this identity": "Supprimer cette identité",
"Delete your identity": "Supprimer votre identité",
@ -67,11 +69,8 @@
"Delete": "Supprimer",
"Description": "Description",
"Didn't receive the instructions ?": "Vous n'avez pas reçu les instructions ?",
"Disallow promoting on Mobilizon": "Refuser la mise en avant sur Mobilizon",
"Display name": "Nom affiché",
"Display participation price": "Afficher un prix de participation",
"Displayed name": "Nom affiché",
"Do you want to participate in {title}?": "Voulez-vous participer à {title} ?",
"Draft": "Brouillon",
"Drafts": "Brouillons",
"Edit": "Éditer",
@ -79,20 +78,22 @@
"Either the account is already validated, either the validation token is incorrect.": "Soit le compte est déjà validé, soit le jeton de validation est incorrect.",
"Email": "Email",
"Ends on…": "Se termine le…",
"Enter some tags": "Écrire des tags",
"Enjoy discovering Mobilizon!": "Amusez-vous bien en découvrant Mobilizon !",
"Enter the link URL": "Entrez l'URL du lien",
"Error while communicating with the server.": "Erreur de communication avec le serveur.",
"Error while saving report.": "Erreur lors de l'enregistrement du signalement.",
"Error while validating account": "Erreur lors de la validation du compte",
"Event already passed": "Événement déjà passé",
"Event cancelled": "Événement annulé",
"Event creation": "Création d'événement",
"Event edition": "Édition 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 to be confirmed": "Événement à confirmer",
"Event {eventTitle} deleted": "Événement {eventTitle} supprimé",
"Event {eventTitle} reported": "Événement {eventTitle} signalé",
"Event": "Événement",
"Events nearby you": "Événements près de chez vous",
"Events you're going at": "Événements auxquels vous vous rendez",
"Events": "Événements",
"Exclude": "Exclure",
"Explore": "Explorer",
@ -100,57 +101,49 @@
"Features": "Fonctionnalités",
"Find an address": "Trouver une adresse",
"Find an instance": "Trouver une instance",
"For instance: London, Taekwondo, Architecture…": "Par exemple: Lyon, Taekwondo, Architecture…",
"For instance: London, Taekwondo, Architecture…": "Par exemple : Lyon, Taekwondo, Architecture…",
"Forgot your password ?": "Mot de passe oublié ?",
"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?": "De lanniversaire entre ami·e·s à une marche pour le climat, aujourdhui, les bonnes raisons de se rassembler sont <b>captées par les géants du web</b>. Comment sorganiser, comment cliquer sur «je participe» sans <b>livrer des données intimes</b> à Facebook ou<b> senfermer</b> dans MeetUp?",
"From the {startDate} at {startTime} to the {endDate} at {endTime}": "Du {startDate} à {startTime} au {endDate} à {endTime}",
"From the {startDate} at {startTime} to the {endDate}": "Du {startDate} à {startTime} jusqu'au {endDate}",
"From the {startDate} to the {endDate}": "Du {startDate} au {endDate}",
"Gather ⋅ Organize ⋅ Mobilize": "Rassembler ⋅ Organiser ⋅ Mobiliser",
"General information": "Information générales",
"General information": "Informations générales",
"Getting location": "Récupération de la position",
"Going as {name}": "En tant que {name}",
"Group List": "Liste de groupes",
"Group full name": "Nom complet du groupe",
"Group name": "Nom du groupe",
"Group {displayName} created": "Groupe {displayName} créé",
"Group": "Groupe",
"Groups": "Groupes",
"Headline picture": "Image à la une",
"I create an identity": "Je crée une identité",
"I participate": "Je participe",
"I want to approve every participation request": "Je veux approuver chaque demande de participation",
"Identities": "Identités",
"Identity {displayName} created": "Identité {displayName} créée",
"Identity {displayName} deleted": "Identité {displayName} supprimée",
"Identity {displayName} updated": "Identité {displayName} mise à jour",
"Identity": "Identité",
"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 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é.",
"Impossible to login, your email or password seems incorrect.": "Impossible de se connecter, votre email ou bien votre mot de passe semble incorrect.",
"In the meantime, please consider that the software is not (yet) finished. More information {onBlog}.": "D'ici là, veuillez considérer que le logiciel n'est pas (encore) fini. Plus d'informations {onBlog}.",
"Installing Mobilizon will allow communities to free themselves from the services of tech giants by creating <b>their own event platform</b>.": "Installer Mobilizon permettra à des collectifs de sémanciper des outils des géants du web en créant <b>leur propre plateforme dévénements</b>.",
"Join event {title}": "Rejoindre {title}",
"Join {instance}, a Mobilizon instance": "Rejoignez {instance}, une instance Mobilizon",
"Join": "Rejoindre",
"Last published event": "Dernier événement publié",
"Last week": "La semaine dernière",
"Learn more about Mobilizon": "En apprendre plus à propos de Mobilizon",
"Learn more on {0}": "En apprendre plus sur {0}",
"Learn more on": "En apprendre plus sur",
"Learn more": "En apprendre plus",
"Leave event": "Annuler ma participation à l'événement",
"Leave": "Quitter",
"Leaving event \"{title}\"": "Annuler ma participation à l'événement",
"Legal": "Mentions légales",
"Let's create a new common": "Créons un nouveau Common",
"License": "Licence",
"Limited number of places": "Nombre de places limité",
"Limited places": "Places limitées",
"Load more": "Voir plus",
"Loading…": "Chargement en cours…",
"Locality": "Commune",
"Log in": "Se connecter",
"Log out": "Se déconnecter",
"Login on Mobilizon!": "Se connecter sur Mobilizon !",
"Login": "Se connecter",
"Manage participants": "Gérer les participants",
"Manage participations": "Gérer les participations",
"Members": "Membres",
"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.",
@ -163,24 +156,31 @@
"Name": "Nom",
"New password": "Nouveau mot de passe",
"No address defined": "Aucune adresse définie",
"No end date": "Pas de date de fin",
"No events found": "Aucun événement trouvé",
"No group found": "Aucun groupe trouvé",
"No groups found": "Aucun groupe trouvé",
"No participants yet.": "Pas de participants pour le moment.",
"No results for \"{queryText}\"": "Pas de résultats pour « {queryText} »",
"No user account with this email was found. Maybe you made a typo?": "Aucun compte utilisateur trouvé pour cet email. Peut-être avez-vous fait une faute de frappe ?",
"Number of places": "Nombre de places",
"OK": "OK",
"Old password": "Ancien mot de passe",
"On {date} from {startTime} to {endTime}": "On {date} de {startTime} à {endTime}",
"On {date} ending at {endTime}": "Le {date}, se terminant à {endTime}",
"On {date} from {startTime} to {endTime}": "Le {date} de {startTime} à {endTime}",
"On {date} starting at {startTime}": "Le {date} à partir de {startTime}",
"On {date}": "Le {date}",
"One person is going": "Personne n'y va | Une personne y va | {approved} personnes y vont",
"Only accessible through link and search (private)": "Uniquement accessibles par lien et la recherche (privé)",
"Only alphanumeric characters and underscores are supported.": "Seuls les caractères alphanumériques et les tirets bas sont acceptés.",
"Opened reports": "Signalements ouverts",
"Organize and take action, freely": "S'organiser et agir, librement",
"Organized by {name}": "Organisé par {name}",
"Organized": "Organisés",
"Organizer": "Organisateur",
"Other stuff…": "Autres trucs…",
"Otherwise this identity will just be removed from the group administrators.": "Sinon cette identité sera juste supprimée des administrateurs du groupe.",
"Page limited to my group (asks for auth)": "Accès limité à mon groupe (demande authentification)",
"Page not found": "Page non trouvée",
"Participant already was rejected.": "Le participant a déjà été refusé.",
"Participant has already been approved as participant.": "Le participant a déjà été approuvé en tant que participant.",
"Participants": "Participants",
"Participate": "Participer",
"Participation approval": "Validation des participations",
@ -191,16 +191,15 @@
"Password": "Mot de passe",
"Past events": "Événements passés",
"Pick an identity": "Choisissez une identité",
"Please be nice to each other": "Soyez sympas entre vous",
"Please check your spam folder if you didn't receive the email.": "Merci de vérifier votre dossier des indésirables si vous n'avez pas reçu l'email.",
"Please contact this instance's Mobilizon admin if you think this is a mistake.": "Veuillez contacter l'administrateur de cette instance Mobilizon si vous pensez quil sagit dune erreur.",
"Please make sure the address is correct and that the page hasn't been moved.": "Assurezvous que ladresse est correcte et que la page na pas été déplacée.",
"Please read the full rules": "Merci de lire les règles complètes",
"Please refresh the page and retry.": "Merci de rafraîchir la page puis réessayer.",
"Please type at least 5 characters": "Merci d'entrer au moins 5 caractères",
"Postal Code": "Code postal",
"Private event": "Événement privé",
"Private feeds": "Flux privés",
"Promotion": "Mise en avant",
"Public RSS/Atom Feed": "Flux RSS/Atom public",
"Public comment moderation": "Modération des commentaires publics",
"Public event": "Événement public",
@ -212,6 +211,7 @@
"Read Framasofts statement of intent on the Framablog": "Lire la note dintention de Framasoft sur le Framablog",
"Region": "Région",
"Register an account on Mobilizon!": "S'inscrire sur Mobilizon !",
"Register for an event by choosing one of your identities": "S'inscrire à un événement en choisissant une de vos identités",
"Register": "S'inscrire",
"Registration is currently closed.": "Les inscriptions sont actuellement fermées.",
"Reject": "Rejetter",
@ -225,32 +225,36 @@
"Save draft": "Enregistrer le brouillon",
"Save": "Enregistrer",
"Search events, groups, etc.": "Rechercher des événements, des groupes, etc.",
"Search results: \"{search}\"": "Résultats de recherche: « {search} »",
"Search results: \"{search}\"": "Résultats de recherche : « {search} »",
"Search": "Rechercher",
"Searching…": "Recherche en cours…",
"Send confirmation email again": "Envoyer l'email de confirmation à nouveau",
"Send email to reset my password": "Envoyer un email pour réinitialiser mon mot de passe",
"Send me an email to reset my password": "Envoyez-moi un email pour réinitialiser mon mot de passe",
"Send me the confirmation email once again": "Envoyez-moi l'email de confirmation encore une fois",
"Send the report": "Envoyer le signalement",
"Share this event": "Partager l'événement",
"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",
"Sign up": "S'enregistrer",
"Software to the people": "Software to the people",
"Software to the people": "Des logiciels pour les gens",
"Starts on…": "Débute le…",
"Status": "Statut",
"Street": "Rue",
"Tentative: Will be confirmed later": "Provisoire : sera confirmé plus tard",
"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 event came from another instance. Your participation will be confirmed after we confirm it with the other instance.": "L'événement provient d'une autre instance. Votre participation sera confirmée après que nous ayons la confirmation de l'autre instance.",
"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 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 and published": "L'événement a été mis à jour et publié",
"The event has been updated": "L'événement a été mis à jour",
"The event organizer didn't add any description.": "L'organisateur de l'événement n'a pas ajouté de description.",
"The event organizer has chosen to approve manually the participations to this event. You will receive a notification when your participation has been approved": "L'organisateur⋅ice de l'événement a choisi d'approuver manuellement les participations à cet événement. Vous recevrez une notification lorsque votre participation sera approuvée",
"The event title will be ellipsed.": "Le titre de l'événement sera ellipsé.",
"The page you're looking for doesn't exist.": "La page que vous recherchez n'existe pas.",
"The password was successfully changed": "Le mot de passe a été changé avec succès",
"The report will be sent to the moderators of your instance. You can explain why you report this content below.": "Le signalement sera envoyé aux modérateur⋅ices de votre instance. Vous pouvez expliquer pourquoi vous signalez ce contenu ci-dessous.",
"The {date} at {time}": "Le {date} à {time}",
"The user account you're trying to login as has not been confirmed yet. Check your email inbox and eventually your spam folder.": "Le compte utilisateur avec lequel vous essayez de vous connectez n'a pas été confirmé. Vérifiez la boite de réception de votre adresse email et éventuellement le dossier des messages indésirables.",
"There are {participants} participants.": "Il n'y a qu'un⋅e participant⋅e. | Il y a {participants} participants.",
"These events may interest you": "Ces événements peuvent vous intéresser",
"This installation (called “instance“) can easily {interconnect}, thanks to {protocol}.": "Cette installation (appelée “instance“) peut facilement {interconnect}, grâce à {protocol}.",
@ -270,11 +274,12 @@
"Upcoming": "À venir",
"Update event {name}": "Éditer l'événement {name}",
"Update my event": "Éditer mon événement",
"User logout": "Déconnexion",
"User accounts and every other data is currently deleted every 48 hours, so you may want to register again.": "Les comptes utilisateurs et toutes les autres données sont actuellement supprimées toutes les 48 heures, donc vous voulez peut-être vous inscrire à nouveau.",
"Username": "Pseudo",
"Users": "Utilisateurs",
"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 (public)": "Visible partout sur le web (public)",
"Waiting for organization team approval.": "En attente d'approbation par l'organisation.",
"Waiting list": "Liste d'attente",
@ -283,42 +288,47 @@
"We want to develop a <b>digital common</b>, that everyone can make their own, which respects <b>privacy and activism by design</b>.": "Nous voulons développer un <b>commun numérique</b>, que tout le monde pourra sapproprier, conçu dans <b>le respect de la vie privée et de laction militante</b>.",
"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.": "On ne changera pas le monde depuis Facebook. Loutil dont nous rêvons, les entreprises du capitalisme de surveillance sont incapables de le produire, car elles ne sauraient pas en tirer profit. Cest loccasion de faire mieux quelles, en faisant autrement.",
"Website / URL": "Site web / URL",
"Welcome back {username}": "Bon retour {username}",
"Welcome back {username}!": "Bon retour {username} !",
"Welcome back!": "Bon retour !",
"Welcome on your administration panel": "Bienvenue sur votre espace d'administration",
"Welcome to Mobilizon, {username}!": "Bienvenue sur Mobilizon, {username} !",
"Who can view this event and participate": "Qui peut voir cet événement et y participer",
"World map": "Carte mondiale",
"Write something…": "Écrivez quelque chose…",
"You and one other person are going to this event": "Vous êtes le ou la seule à vous rendre à cet événement | Vous et une autre personne vous rendez à cet événement | Vous et {approved} autres personnes vous rendez à cet événement.",
"You announced that you're going to this event.": "Vous avez annoncé vous rendre à cet événement.",
"You are already a participant of this event.": "Vous participez déjà à cet événement.",
"You are already logged-in.": "Vous êtes déjà connecté.",
"You are an organizer.": "Vous êtes un organisateur.",
"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",
"You can try another search term or drag and drop the marker on the map": "Vous pouvez essayer avec d'autres termes de recherche ou bien glisser et déposer le marqueur sur la carte",
"You can't remove your last identity.": "Vous ne pouvez pas supprimer votre dernière identité.",
"You have been disconnected": "Vous avez été déconnecté⋅e",
"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 may also ask to {resend_confirmation_email}.": "Vous pouvez aussi demander à {resend_confirmation_email}.",
"You need to login.": "Vous devez vous connecter.",
"You're not going to any event yet": "Vous n'allez à aucun événement pour le moment",
"You're organizing this event": "Vous organisez cet événement",
"Your account has been validated": "Votre compte a été validé",
"Your account is being validated": "Votre compte est en cours de validation",
"Your account is nearly ready, {username}": "Votre compte est presque prêt, {username}",
"Your local administrator resumed it's policy:": "Votre administrateur local a résumé sa politique ainsi :",
"Your local administrator resumed its policy:": "Votre administrateur local a résumé sa politique ainsi :",
"Your participation has been confirmed": "Votre participation a été confirmée",
"Your participation has been requested": "Votre participation a été demandée",
"a decentralised federation protocol": "un protocole de fédération décentralisée",
"e.g. 10 Rue Jangot": "par exemple : 10 Rue Jangot",
"firstDayOfWeek": "1",
"iCal Feed": "Flux iCal",
"interconnect with others like it": "sinterconnecter simplement avec dautres",
"its source code is public": "son code source est public",
"meditate a bit": "méditez un peu",
"on our blog": "sur notre blog",
"resend confirmation email": "réenvoyer l'email de confirmation",
"respect of the fundamental freedoms": "le respect des libertés fondamentales",
"with another identity…": "avec une autre identité…",
"with {identity}": "avec {identity}",
"{actor}'s avatar": "Avatar de {actor}",
"{approved} / {total} seats": "{approved} / {total} places",
"{count} participants": "Un⋅e participant⋅e|{count} participant⋅e⋅s",
"{count} requests waiting": "Une demande en attente|{count} demandes en attente",
"{count} participants": "Aucun⋅e participant⋅e | Un⋅e participant⋅e | {count} participant⋅e⋅s",
"{count} requests waiting": "Une demande en attente|{count} demandes en attente",
"{license} guarantees {respect} of the people who will use it. Since {source}, anyone can audit it, which guarantees its transparency.": "{license} garantit {respect} des personnes qui l'utiliseront. Puisque {source}, il est publiquement auditable, ce qui garantit sa transparence.",
"© The Mobilizon Contributors {date} - Made with Elixir, Phoenix, VueJS & with some love and some weeks": "© Les contributeurs de Mobilizon {date} - Fait avec Elixir, Phoenix, VueJS & et de l'amour et des semaines"
}
"© The Mobilizon Contributors {date} - Made with Elixir, Phoenix, VueJS & with some love and some weeks": "© Les contributeurs de Mobilizon {date} - Fait avec Elixir, Phoenix, VueJS & et de l'amour et des semaines",
"© The OpenStreetMap Contributors": "© Les Contributeur⋅ices OpenStreetMap"
}

View File

@ -1 +1,330 @@
{}
{
"<b>Please do not use it in any real way</b>: everything you create here (accounts, events, identities, etc.) will be automatically deleted every 48 hours.": "<b>Gelieve dit niet te gebruiken voor echte evenementen</b>: alles wat u hier aanmaakt (accounts, evenementen, identiteiten, etc.) wordt iedere 48u automatisch gewist.",
"A user-friendly, emancipatory and ethical tool for gathering, organising, and mobilising.": "Een gebruiksvriendelijk, emanciperend en ethisch verantwoord instrument om mensen samen te brengen, zich te organiseren, en te mobiliseren.",
"A validation email was sent to {email}": "Er is een valideringsemail verstuurd naar {email}",
"Abandon edition": "Bewerking annuleren",
"About": "Over",
"About Mobilizon": "Over Mobilizon",
"About this event": "Over dit evenement",
"About this instance": "Over deze server",
"Add": "Toevoegen",
"Add an address": "Een adres toevoegen",
"Add some tags": "Tags toevoegen",
"Add to my calendar": "Aan mijn kalender toevoegen",
"Additional comments": "Meer opmerkingen",
"Administration": "Administratie",
"All data will be deleted every 48 hours, so please don't use this for anything real.": "Alle gegevens worden iedere 48 uur verwijderd, dus gebruik dit enkel als test.",
"All the places have already been taken": "Ale plaatsen zijn bezet|Er is nog één plaats vrij|Er zijn nog {places} plaatsen vrij",
"Allow all comments": "Alle opmerkingen toestaan",
"An error has occurred.": "Er is een fout opgetreden.",
"Approve": "Goedkeuren",
"Are you sure you want to cancel the event creation? You'll lose all modifications.": "Bent u zeker dat u het aanmaken van dit evenement wil annuleren? Alle veranderingen zullen verloren gaan.",
"Are you sure you want to cancel the event edition? You'll lose all modifications.": "Bent u zeker dat u het bewerken van dit evenement wil annuleren? Alle veranderingen zullen verloren gaan.",
"Are you sure you want to cancel your participation at event \"{title}\"?": "Bent u zeker dat u uw deelname aan het evenement \"{title}\" wil annuleren?",
"Are you sure you want to delete this event? This action cannot be reverted.": "Bent u zeker dat u dit evenement wil verwijderen? Dit kan niet ongedaan gemaakt worden.",
"Avatar": "Profielfoto",
"Before you can login, you need to click on the link inside it to validate your account": "Voordat u zich kan aanmelden, moet u op de link erin klikken om uw account te valideren",
"By {name}": "Door {name}",
"Cancel": "Annuleren",
"Cancel creation": "Aanmaken annuleren",
"Cancel edition": "Bewerken annuleren",
"Cancel my participation request…": "Mijn deelnameverzoek annuleren…",
"Cancel my participation…": "Mijn deelname annuleren…",
"Cancelled: Won't happen": "Geannuleerd: gaat niet door",
"Category": "Categorie",
"Change": "Wijzigen",
"Change my identity…": "Identiteit veranderen…",
"Change my password": "Wachtwoord wijzigen",
"Change password": "Wachtwoord wijzigen",
"Clear": "Leegmaken",
"Click to select": "Klik om te kiezen",
"Click to upload": "Klik om te uploaden",
"Close comments for all (except for admins)": "Opmerkingen sluiten voor iedereen (behalve beheerders)",
"Comments": "Opmerkingen",
"Comments on the event page": "Opmerkingen op de pagina van het evenement",
"Confirm my particpation": "Mijn deelname bevestigen",
"Confirmed: Will happen": "Bevestigd: gaat door",
"Continue editing": "Verder gaan met bewerken",
"Country": "Land",
"Create": "Aanmaken",
"Create a new event": "Maak een nieuw evenement aan",
"Create a new group": "Maak een nieuwe groep",
"Create a new identity": "Maak een nieuwe identiteit",
"Create and manage several identities from the same account": "Maak en beheer meerdere identiteiten vanuit dezelfde account",
"Create group": "Groep aanmaken",
"Create my event": "Mijn evenement aanmaken",
"Create my group": "Mijn groep aanmaken",
"Create my profile": "Mijn profiel aanmaken",
"Create token": "Token aanmaken",
"Create, edit or delete events": "Maak, bewerk, of verwijder evenementen",
"Creator": "Aanmaker",
"Current identity has been changed to {identityName} in order to manage this event.": "De huidige identiteit is veranderd in {identityName} om dit evenement te beheren.",
"Date and time settings": "Datum- en tijdsinstellingen",
"Date parameters": "Datuminstellingen",
"Delete": "Verwijder",
"Delete event": "Evenement verwijderen",
"Delete this identity": "Deze identiteit verwijderen",
"Delete your identity": "Uw identiteit verwijderen",
"Delete {eventTitle}": "Verwijder {eventTitle}",
"Delete {preferredUsername}": "Verwijder {preferredUsername}",
"Description": "Beschrijving",
"Didn't receive the instructions ?": "Hebt u de instructies niet ontvangen?",
"Display name": "Getoonde naam",
"Display participation price": "Prijs voor deelname tonen",
"Draft": "Concept",
"Drafts": "Concepten",
"Edit": "Bewerken",
"Eg: Stockholm, Dance, Chess…": "Bvb: Stockholm, dansen, schaken…",
"Either the account is already validated, either the validation token is incorrect.": "Ofwel is de account al gevalideerd, ofwel is de validatietoken incorrect.",
"Email": "Email",
"Ends on…": "Eindigt op…",
"Enjoy discovering Mobilizon!": "Veel plezier met het ontdekken van Mobilizon!",
"Enter the link URL": "Voeg de link URL in",
"Error while communicating with the server.": "Fout tijdens het communiceren met de server.",
"Error while saving report.": "Fout tijdens het opslaan van de melding.",
"Error while validating account": "Fout tijdens het valideren van de account",
"Event": "Evenement",
"Event already passed": "Evenement is al voorbij",
"Event cancelled": "Evenement geannuleerd",
"Event creation": "Aanmaken van het evenement",
"Event edition": "Bewerken van het evenement",
"Event list": "Evenementenlijst",
"Event not found.": "Evenement niet gevonden.",
"Event page settings": "Instellingen voor de pagina van het evenement",
"Event to be confirmed": "Evenement te bevestigen",
"Event {eventTitle} deleted": "Evenement {eventTitle} verwjderd",
"Event {eventTitle} reported": "Evenement {eventTitle} gemeld",
"Events": "Evenementen",
"Exclude": "Uitsluiten",
"Explore": "Ontdekken",
"Featured events": "Suggesties",
"Features": "Functies",
"Find an address": "Een adres zoeken",
"Find an instance": "Een server zoeken",
"For instance: London, Taekwondo, Architecture…": "Bijvoorbeeld: Londen, Taekwondo, Architectuur…",
"Forgot your password ?": "Wachtwoord vergeten?",
"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?": "Van een verjaardagsfeestje met vrienden en familie tot een mars tegen de klimaatverandering, momenteel zitten onze bijeenkomsten <b>gevangen in de platformen van de techgiganten</b>. Hoe kunnen we iets organiseren, hoe kunnen we op \"Aanwezig\" klikken, zonder <b>privégegevens aan Facebook te geven</b> of <b>onszelf op te sluiten</b> in MeetUp?",
"From the {startDate} at {startTime} to the {endDate}": "Van{startDate} om {startTime} tot {endDate}",
"From the {startDate} at {startTime} to the {endDate} at {endTime}": "Van {startDate} om {startTime} tot {endDate} om {endTime}",
"From the {startDate} to the {endDate}": "Van {startDate} tot {endDate}",
"Gather ⋅ Organize ⋅ Mobilize": "Breng samen - Organiseer - Mobiliseer",
"General information": "Algemene informatie",
"Going as {name}": "Deelnemen als {name}",
"Group List": "Lijst met groepen",
"Group full name": "Volledige naam van de groep",
"Group name": "Groepsnaam",
"Group {displayName} created": "Groep {displayName} aangemaakt",
"Groups": "Groepen",
"Headline picture": "TItelafbeelding",
"I create an identity": "Ik maak een identiteit aan",
"I participate": "Ik neem deel",
"I want to approve every participation request": "Ik wil ieder deelnameverzoek goedkeuren",
"Identity {displayName} created": "Identiteit {displayName} aangemaakt",
"Identity {displayName} deleted": "Identiteit {displayName} verwijderd",
"Identity {displayName} updated": "Identiteit {displayName} bijgewerkt",
"If an account with this email exists, we just sent another confirmation email to {email}": "Als er al een account met dit emailadres bestaat, hebben we net nog een bevestigingsemail verstuurd naar {email}",
"If this identity is the only administrator of some groups, you need to delete them before being able to delete this identity.": "Als deze identiteit de enige beheerder van een of meerdere groepen is, moet u deze eerst verwijderen voordat u de identiteit kan verwijderen.",
"Impossible to login, your email or password seems incorrect.": "Aanmelden niet mogelijk, uw emailadres of wachtwoord is fout.",
"In the meantime, please consider that the software is not (yet) finished. More information {onBlog}.": "Gelieve er intussen rekening mee te houden dat de software (nog) niet klaar is. Meer informatie {onBlog}.",
"Installing Mobilizon will allow communities to free themselves from the services of tech giants by creating <b>their own event platform</b>.": "Door Mobilizon te installeren zullen gemeenschappen zich kunnen bevrijden van de platformen en diensten van de techgiganten, en <b>hun eigen evenementenplatform maken</b>.",
"Join {instance}, a Mobilizon instance": "Sluit je aan bij {instance}, een Mobilizonserver",
"Last published event": "Laatst gepubliceerd evenement",
"Last week": "Vorige week",
"Learn more": "Leer meer",
"Learn more about Mobilizon": "Leer meer over Mobilizon",
"Leave event": "Evenement verlaten",
"Leaving event \"{title}\"": "Evenement \"{title}\" verlaten",
"Let's create a new common": "Laten we een nieuwe “common” maken",
"License": "Licentie",
"Limited number of places": "Beperkt aantal plaatsen",
"Load more": "Meer laden",
"Locality": "Plaats",
"Log in": "Aanmelden",
"Log out": "Afmelden",
"Login": "Aanmelden",
"Login on Mobilizon!": "Aanmelden bij Mobilizon!",
"Manage participations": "Deelnames beheren",
"Members": "Leden",
"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 is gratis/vrije software die gemeenschappen in staat stelt om <b>hun eigen ruimtes</b> te maken om evenementen te publiceren, zodat ze zich beter kunnen emanciperen van de techgiganten.",
"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 is in ontwikkeling, we zullen regelmatig nieuwe functies toevoegen aan deze site via updates, tot <b>versie 1 van de software beschikbaar is in de eerste helft van 2020</b>.",
"Mobilizons licence": "Mobilizonlicentie",
"Moderated comments (shown after approval)": "Gemodereerde opmerkingen (getoond na goedkeuring)",
"My account": "Mijn account",
"My events": "Mijn evenementen",
"My identities": "Mijn identiteiten",
"Name": "Naam",
"New password": "Nieuw wachtwoord",
"No address defined": "Geen adres ingesteld",
"No end date": "Geen einddatum",
"No events found": "Geen evenementen gevonden",
"No group found": "Geen groep gevonden",
"No groups found": "Geen groepen gevonden",
"No results for \"{queryText}\"": "Geen resultaten voor \"{queryText}\"",
"No user account with this email was found. Maybe you made a typo?": "Er is geen gebruikersaccount gevonden met dit emailadres. Misschien hebt u een tikfout gemaakt?",
"Number of places": "Aantal plaatsen",
"OK": "OK",
"Old password": "Oud wachtwoord",
"On {date}": "Op {date}",
"On {date} ending at {endTime}": "Op {date}, tot {endTime}",
"On {date} from {startTime} to {endTime}": "Op {date} van {startTime} tot {endTime}",
"On {date} starting at {startTime}": "Op {date} vanaf {startTime}",
"One person is going": "Niemand gaat | Eén persoon gaat | {approved} personen gaan",
"Only accessible through link and search (private)": "Alleen bereikbaar via link en zoeken (privé)",
"Opened reports": "Geopende meldingen",
"Organized": "Georganiseerd",
"Organized by {name}": "Georganiseerd door {name}",
"Organizer": "Organisator",
"Otherwise this identity will just be removed from the group administrators.": "Anders zal deze identiteit alleen verwijderd worden uit de beheerders van de groep.",
"Page limited to my group (asks for auth)": "Pagina beperkt tot mijn groep (vraag om authentificatie)",
"Page not found": "Pagina niet gevonden",
"Participant already was rejected.": "Deelnemer werd al geweigerd.",
"Participant has already been approved as participant.": "Deelnemer is al goedgekeurd.",
"Participants": "Deelnemers",
"Participate": "Deelnemen",
"Participation approval": "Goedkeuring van deelnemers",
"Participation requested!": "Deelname aangevraagd!",
"Password": "Wachtwoord",
"Password (confirmation)": "Wachtwoord (bevestigen)",
"Password change": "Wachtwoord veranderen",
"Password reset": "Wachtwoord opnieuw instellen",
"Past events": "Voorbije evenementen",
"Pick an identity": "Kies een identiteit",
"Please check your spam folder if you didn't receive the email.": "Gelieve uw map met spamberichten te controleren indien u de email niet ontvangen hebt.",
"Please contact this instance's Mobilizon admin if you think this is a mistake.": "Gelieve de beheerder van deze Mobilizonserver te contacteren als u denkt dat dit niet juist is.",
"Please make sure the address is correct and that the page hasn't been moved.": "Gelieve te controleren dat het adres juist is, en de pagina niet verplaatst is.",
"Please read the full rules": "Gelieve de volledige regels te lezen",
"Please refresh the page and retry.": "Gelieve de pagina te verversen, en opnieuw te proberen.",
"Please type at least 5 characters": "Gelieve minstens 5 tekens te typen",
"Postal Code": "Postcode",
"Private event": "Privé-evenement",
"Private feeds": "Privéfeeds",
"Public RSS/Atom Feed": "Openbaar RSS-/Atomfeed",
"Public comment moderation": "Modereren van openbare opmerkingen",
"Public event": "Openbaar evenement",
"Public feeds": "Openbare feeds",
"Public iCal Feed": "Openbaar iCalfeed",
"Publish": "Publiceren",
"Published events": "Gepubliceerde evenementen",
"RSS/Atom Feed": "RSS-/Atomfeed",
"Read Framasofts statement of intent on the Framablog": "Lees de intentieverklaring van Framasoft op de Framablog",
"Region": "Regio",
"Register": "Inschrijven",
"Register an account on Mobilizon!": "Maak een account op Mobilizon!",
"Register for an event by choosing one of your identities": "Meld u aan voor een evenement door een van uw identiteiten te kiezen",
"Registration is currently closed.": "Inschrijvingen zijn momenteel gesloten.",
"Reject": "Afwijzen",
"Rejected": "Afgewezen",
"Rejected participations": "Afgewezen deelnames",
"Report": "Melden",
"Report this event": "Meld dit evenement",
"Requests": "Aanvragen",
"Resend confirmation email": "Bevestigingsemail opnieuw versturen",
"Reset my password": "Mijn wachtwoord opnieuw instellen",
"Save": "Opslaan",
"Save draft": "Concept opslaan",
"Search": "Zoeken",
"Search events, groups, etc.": "Zoek evenementen, groepen, etc.",
"Search results: \"{search}\"": "Zoekresultaten: \"{search}\"",
"Searching…": "Zoeken…",
"Send me an email to reset my password": "Stuur mij een email om mijn wachtwoord opnieuw in te stellen",
"Send me the confirmation email once again": "Stuur mij de bevestigingsemail nog eens",
"Send the report": "Verstuur de melding",
"Share this event": "Dit evenement delen",
"Show map": "Kaart tonen",
"Show remaining number of places": "Toon het overblijvend aantal plaatsen",
"Show the time when the event begins": "Toon de tijd wanneer het evenement begint",
"Show the time when the event ends": "Toon de tijd wanneer het evenement eindigt",
"Sign up": "Inschrijven",
"Software to the people": "Software voor de mensen",
"Starts on…": "Begint op…",
"Status": "Status",
"Street": "Straat",
"Tentative: Will be confirmed later": "Onder voorbehoud: zal later bevestigd worden",
"The content came from another server. Transfer an anonymous copy of the report?": "De inhoud komt van een andere server. Wilt u een anonieme kopie van de melding versturen?",
"The current identity doesn't have any permission on this event. You should probably change it.": "De huidige identiteit heeft geen toegang tot dit evenement. U moet waarschijnlijk een andere kiezen.",
"The draft event has been updated": "Het conceptevenement is bijgewerkt",
"The event has been created as a draft": "Het evenement is aangemaakt als concept",
"The event has been published": "Het evenement is gepubliceerd",
"The event has been updated": "Het evenement is bijgewerkt",
"The event has been updated and published": "Het evenement is bijgewerkt en gepubliceerd",
"The event organizer didn't add any description.": "De organisator van het evenement heeft geen beschrijving toegevoegd.",
"The event title will be ellipsed.": "De titel van het evenement zal verkort getoond worden.",
"The page you're looking for doesn't exist.": "De pagina waarnaar u zoekt bestaat niet.",
"The password was successfully changed": "Het wachtwoord is succesvol veranderd",
"The report will be sent to the moderators of your instance. You can explain why you report this content below.": "De melding zal verstuurd worden naar de moderatoren van uw server. U kunt uitleggen waarom u onderstaande inhoud gemeld hebt.",
"The user account you're trying to login as has not been confirmed yet. Check your email inbox and eventually your spam folder.": "De account waarmee u zich probeert aan te melden is nog niet bevestigd. Controleer uw email inbox, en eventueel uw map met spamberichten.",
"There are {participants} participants.": "Er zijn {participants} deelnemers.",
"These events may interest you": "Deze evenementen zouden u kunnen interesseren",
"This installation (called “instance“) can easily {interconnect}, thanks to {protocol}.": "Deze installatie (\"server\" genoemd) kan zich dankzij {protocol} gemakkelijk {interconnect}.",
"This instance isn't opened to registrations, but you can register on other instances.": "Deze server is nog niet open voor inschrijvingen, maar u kan zich inschrijven op andere servers.",
"This is a demonstration site to test the beta version of Mobilizon.": "Dit is een demosite om de bètaversie van Mobilizon te testen.",
"This will delete / anonymize all content (events, comments, messages, participations…) created from this identity.": "Dit zal alle inhoud (evenementen, opmerkingen, berichten, deelnames…) die aangemaakt is met deze identiteit verwijderen / anonimiseren.",
"Title": "Titel",
"To achieve your registration, please create a first identity profile.": "Gelieven een eerste identiteitsprofiel aan te maken om uw inschrijven te voltooien.",
"To change the world, change the software": "Verander de software om de wereld te veranderen",
"To confirm, type your event title \"{eventTitle}\"": "Typ de titel van uw evenement \"{eventTitle}\" om te bevestigen",
"To confirm, type your identity username \"{preferredUsername}\"": "Typ de gebruikersnaam van uw identiteit \"{preferredUsername}\" om te bevestigen",
"Transfer to {outsideDomain}": "Verplaatsen naar {outsideDomain}",
"Unfortunately, this instance isn't opened to registrations": "Jammer genoeg is deze server niet open voor inschrijvingen",
"Unfortunately, your participation request was rejected by the organizers.": "Helaas is uw deelnameverzoek afgewezen door de organisatoren.",
"Unknown error.": "Onbekende fout.",
"Unsaved changes": "Niet-bewaarde veranderingen",
"Upcoming": "Binnenkort",
"Update event {name}": "Evenement {name} bijwerken",
"Update my event": "Mijn evenement bijwerken",
"User accounts and every other data is currently deleted every 48 hours, so you may want to register again.": "Gebruikersaccounts en alle andere data worden momenteel iedere 48 uur gewist, dus misschien wilt u zich opnieuw inschrijven.",
"Username": "Gebruikersnaam",
"Users": "Gebruikers",
"View event page": "Pagina van het evenement bekijken",
"View everything": "Alles bekijken",
"View page on {hostname} (in a new window)": "Pagina bekijken op {hostname} (in een nieuw venster)",
"Visible everywhere on the web (public)": "Overal op het internet zichtbaar (openbaar)",
"Waiting for organization team approval.": "Wacht op goedkeuring van het organisatieteam.",
"Waiting list": "Wachtlijst",
"Warning": "Waarschuwing",
"We just sent an email to {email}": "We hebben zonet een email verstuurd naar {email}",
"We want to develop a <b>digital common</b>, that everyone can make their own, which respects <b>privacy and activism by design</b>.": "We willen een <b>digitale “common”</b> ontwikkelen, die iedereen hun eigen kan maken, en die ontworpen is om <b>privacy en activisme te respecteren</b>.",
"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.": "We zullen de wereld niet veranderen van Facebook. Het hulpmiddel waar we van dromen zal niet door de bedrijven van het toezichtskapitalisme ontwikkeld worden omdat ze er geen winst kunnen mee maken. Er is een mogelijkheid om iets beters te bouwen door een andere benadering te kiezen.",
"Website / URL": "Website / URL",
"Welcome back {username}!": "Welkom terug {username}!",
"Welcome back!": "Welkom terug!",
"Welcome on your administration panel": "Welkom bij uw beheersoverzicht",
"Welcome to Mobilizon, {username}!": "Welkom bij Mobilizon, {username}!",
"Who can view this event and participate": "Wie kan dit evenement bekijken en eraan deelnemen",
"World map": "Wereldkaart",
"Write something…": "Schrijf iets…",
"You and one other person are going to this event": "U bent de enige die naar dit evenement gaat | U en één andere persoon gaan naar dit evenement | U en {approved} personen gaan naar dit evenement.",
"You are already a participant of this event.": "U neemt al deel aan dit evenement.",
"You are already logged-in.": "U bent al aangemeld.",
"You can add tags by hitting the Enter key or by adding a comma": "U kunt tags toevoegen door op de Enter-toets te drukken, of door een komma toe te voegen",
"You can't remove your last identity.": "U kunt uw laatste identiteit niet verwijderen.",
"You have been disconnected": "De verbinding is verbroken",
"You have cancelled your participation": "U hebt uw deelname geannuleerd",
"You have one event in {days} days.": "U hebt geen evenementen in {days} dagen | U hebt één evenement in {days} dagen. | U hebt {count} evenementen in {days} dagen",
"You have one event today.": "U hebt vandaag geen evenementen | U hebt vandaag één evenement | U hebt vandaag {count} evenementen",
"You have one event tomorrow.": "U hebt morgen geen evenementen | U hebt morgen één evenement. | U hebt morgen {count} evenementen",
"You may also ask to {resend_confirmation_email}.": "U kunt ook vragen om {resend_confirmation_email}.",
"You need to login.": "U moet zich aanmelden.",
"Your account has been validated": "Uw account is gevalideerd",
"Your account is being validated": "Uw account wordt gevalideerd",
"Your account is nearly ready, {username}": "Uw account is bijna klaar, {username}",
"Your local administrator resumed its policy:": "Uw plaatselijke beheerder heeft zijn politiek hervat:",
"Your participation has been confirmed": "Uw deelname is bevestigd",
"Your participation has been requested": "Uw deelname is aangevraagd",
"a decentralised federation protocol": "een gedecentraliseerd federatieprotocol",
"e.g. 10 Rue Jangot": "bvb. Jangotstraat 10",
"firstDayOfWeek": "1",
"iCal Feed": "iCalfeed",
"interconnect with others like it": "zich met andere zoals zichzelf verbinden",
"its source code is public": "de broncode is openbaar",
"on our blog": "op onze blog",
"resend confirmation email": "bevestigingsemail opnieuw versturen",
"respect of the fundamental freedoms": "respect voor de fundamentele vrijheden",
"with another identity…": "met een andere identiteit…",
"with {identity}": "met {identity}",
"{approved} / {total} seats": "{approved} / {total} plaatsen",
"{count} participants": "Nog geen deelnemers | Eén deelnemer | {count} deelnemers",
"{count} requests waiting": "{count} aanvragen in afwachting",
"{license} guarantees {respect} of the people who will use it. Since {source}, anyone can audit it, which guarantees its transparency.": "{license} garandeert {respect} van de mensen die het gebruiken. Omdat {source} kan iedereen het bekijken en analyseren, wat transparantie garandeert.",
"© The Mobilizon Contributors {date} - Made with Elixir, Phoenix, VueJS & with some love and some weeks": "© Het Mobilizonteam {date} - Ontwikkeld met Elixir, Phoenix, VueJS & veel liefde en tijd"
}

View File

@ -1,284 +1,368 @@
{
"{actor}'s avatar": "Avatar de {actor}",
"iCal Feed": "Flux iCal",
"e.g. 10 Rue Jangot": "per exemple : 10 carrièra Jangot",
"Your account is being validated": "Vòstre compte es en validacion",
"Your account has been validated": "Vòstre compte es estat validat",
"World map": "Mapa mondiala",
"Welcome on your administration panel": "La benvenguda a vòstre espaci dadministracion",
"Website / URL": "Site web / URL",
"Waiting list": "Lista despèra",
"View everything": "O veire tot",
"View event page": "Veire la pagina de leveniment",
"Users": "Utilizaires",
"Username": "Nom dutilizaire",
"User logout": "Desconnexion",
"Update event {name}": "Actualizar leveniment {name}",
"Upcoming": "Venents",
"Unknown error.": "Error desconeguda.",
"Title": "Títol",
"The {date} from {startTime} to {endTime}": "Lo {date} de {startTime} fins a {endTime}",
"The {date} at {time}": "Lo {date} a {time}",
"Street": "Carrièra",
"Status": "Estat",
"Starts on…": "Comença lo…",
"Show map": "Mostrar la mapa",
"Search": "Recercar",
"Save": "Enregistrar",
"Report": "Senhalar",
"Report this event": "Senhalar aqueste eveniment",
"Reject": "Regetar",
"Registration is currently closed.": "Las inscripcions son actualament tampadas.",
"Register": "Sinscriure",
"Register an account on Mobilizon!": "Sinscriure a Mobilizon !",
"Region": "Region",
"RSS/Atom Feed": "Flux RSS/Atom",
"Published events": "Eveniments publicats",
"Public iCal Feed": "Flux iCal public",
"Public feeds": "Flux publics",
"Public event": "Eveniment public",
"Public RSS/Atom Feed": "Flux RSS/Atom public",
"Promotion": "Promocion",
"Private feeds": "Flux privats",
"Private event": "Eveniment privat",
"Postal Code": "Còdi postal",
"Please type at least 5 characters": "Mercés de picar almens 5 caractèrs",
"Please read the full rules": "Mercés de legir las règlas complètas",
"Pick an identity": "Causir una identitat",
"Past events": "Eveniments passats",
"Password": "Senhal",
"Password (confirmation)": "Senhal (confirmacion)",
"Participants": "Participants",
"Other stuff…": "Autras causas…",
"Organized": "Organizats",
"Organized by {name}": "Organizat per {name}",
"Number of places": "Nombre de plaças",
"Name": "Nom",
"My identities": "Mas identitats",
"My events": "Mos eveniments",
"My account": "Mon compte",
"Members": "Membres",
"Manage participations": "Gerir las participacions",
"Manage participants": "Gerir los participants",
"Login": "Se connectar",
"Log out": "Se desconnectar",
"Log in": "Se connectar",
"Locality": "Comuna",
"Loading…": "Cargament…",
"Load more": "Ne veire mai",
"Limited places": "Plaças limitadas",
"License": "Licéncia",
"Leave": "Quitar",
"Last week": "La setmana passada",
"Join event {title}": "Participar a {title}",
"Join": "Participar",
"Identity": "Identitat",
"Identities": "Identitats",
"Groups": "Grops",
"Group": "Grop",
"Group name": "Nom del grop",
"Group List": "Lista dels grops",
"General information": "Informacions generalas",
"Forgot your password ?": "Senhal oblidat ?",
"Find an address": "Trobar una adreça",
"Features": "Foncionalitats",
"Explore": "Explorar",
"<b>Please do not use it in any real way</b>: everything you create here (accounts, events, identities, etc.) will be automatically deleted every 48 hours.": "<b>Mercés de far pas una utilizacion reala</b> : tot çò que creatz aquí (compte, eveniments, identitats, etc.) serà automaticament suprimit cada 48 oras.",
"A user-friendly, emancipatory and ethical tool for gathering, organising, and mobilising.": "Una aisina conviviala, liberatritz e etica per samassar, sorganizar e se mobilizar.",
"A validation email was sent to {email}": "Un corrièl de validacion es estat enviat a {email}",
"Abandon edition": "Abandonar la modificacion",
"About": "A prepaus",
"About Mobilizon": "A prepaus de Mobilizon",
"About this event": "Tocant aqueste eveniment",
"About this instance": "Tocant aquesta instància",
"Add": "Ajustar",
"Add a new profile": "Ajustar un perfil novèl",
"Add a tag": "Ajustar una etiqueta",
"Add an address": "Ajustar una adreça",
"Add some tags": "Ajustar detiquetas",
"Add to my calendar": "Ajustar a mon calendièr",
"Additional comments": "Comentari adicional",
"Administration": "Administracion",
"All data will be deleted every 48 hours, so please don't use this for anything real.": "Estant que totas las donadas son suprimidas cada 48 oras, utilizetz pas aquò per quicòm mai quuna demostracion.",
"All the places have already been taken": "Totas las plaças son presas|Una plaça es encara disponibla|{places} plaças son encara disponiblas",
"Allow all comments": "Autorizar totes los comentaris",
"An error has occurred.": "Una error ses producha.",
"Approve": "Aprovar",
"Are you going to this event?": "Anatz a aqueste eveniment ?",
"Are you sure you want to cancel the event creation? You'll lose all modifications.": "Volètz vertadièrament anullar la creacion de leveniment ? Perdretz totas vòstras modificacions.",
"Are you sure you want to cancel the event edition? You'll lose all modifications.": "Volètz vertadièrament anullar la modificacion de leveniment ? Perdretz totas vòstras modificacions.",
"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.",
"Avatar": "Avatar",
"Before you can login, you need to click on the link inside it to validate your account": "Abans que poscatz vos marcar, devètz clicar lo ligam dedins per validar lo compte",
"By {name}": "Per {name}",
"Cancel": "Anullar",
"Cancel creation": "Anullar la creacion",
"Cancel edition": "Anullar la modificacion",
"Cancel my participation request…": "Anullar ma demanda de participacion…",
"Cancel my participation…": "Anullar ma participacion…",
"Cancelled: Won't happen": "Anullat : se tendrà pas",
"Category": "Categoria",
"Change": "Modificar",
"Change my identity…": "Cambiar mon identitat…",
"Change my password": "Modificar mon senhal",
"Change password": "Modificar mon senhal",
"Clear": "Escafar",
"Click to select": "Clicatz per seleccionar",
"Click to upload": "Clicatz per enviar",
"Close comments for all (except for admins)": "Barrar los comentaris a tot lo monde (fòra los administrators)",
"Comments": "Comentaris",
"Comments on the event page": "Comentari a pagina de leveniment",
"Confirm my particpation": "Confirmar ma participacion",
"Confirmed: Will happen": "Confirmat : se tendrà",
"Continue editing": "Contunhar la modificacion",
"Country": "País",
"Create": "Crear",
"Create a new event": "Crear un eveniment novèl",
"Create a new group": "Crear un grop novèl",
"Create a new identity": "Crear una identitat novèla",
"Create and manage several identities from the same account": "Crear e gerir mantunas identitats amb lo meteis compte",
"Create group": "Crear un grop",
"Create my event": "Crear mon eveniment",
"Create my group": "Crear mon grop",
"Create my profile": "Crear mon perfil",
"Create token": "Crear un geton",
"Create, edit or delete events": "Crear, modificar o suprimir deveniments",
"Creator": "Creator",
"Current": "Actual",
"Current identity has been changed to {identityName} in order to manage this event.": "Lidentitat actuala es estada cambiada per {identityName} per dire de poder gerir aqueste eveniment.",
"Date and time settings": "Paramètres de data e dora",
"Date parameters": "Paramètres de data",
"Delete": "Suprimir",
"Delete event": "Suprimir un eveniment",
"Delete this identity": "Suprimir aquesta identitat",
"Delete your identity": "Suprimir vòstra identitat",
"Delete {eventTitle}": "Suprimir {eventTitle}",
"Delete {preferredUsername}": "Suprimir {preferredUsername}",
"Description": "Descripcion",
"Didn't receive the instructions ?": "Avètz pas recebudas las consignas ?",
"Disallow promoting on Mobilizon": "Refusar la promocion sus Mobilizon",
"Display name": "Nom mostrat",
"Display participation price": "Far veire un prètz de participacion",
"Do you want to participate in {title}?": "Volètz participar a {title} ?",
"Draft": "Borrolhon",
"Drafts": "Borrolhons",
"Edit": "Editar",
"Eg: Stockholm, Dance, Chess…": "Per exemple : Tolosa, balèti, velhada…",
"Either the account is already validated, either the validation token is incorrect.": "Siá lo compte es ja validat, siá lo geton de validacion es incorrècte.",
"Email": "Corrièl",
"Ends on…": "Sacaba lo…",
"Enjoy discovering Mobilizon!": "Amusatz-vos ben en descobrir Mobilizon !",
"Enter some tags": "Escriure detiquetas",
"Enter the link URL": "Picatz lURL del ligam",
"Error while communicating with the server.": "Error de comunicacion amb lo servidor.",
"Error while saving report.": "Error en enregistrant lo senhalament.",
"Error while validating account": "Error en validant lo compte",
"Event": "Eveniment",
"Event already passed": "Eveniment ja passat",
"Event cancelled": "Eveniment anullat",
"Event creation": "Creacion deveniment",
"Event edition": "Modificacion deveniment",
"Event list": "Lista deveniments",
"Event not found.": "Eveniment pas trobat.",
"Event page settings": "Paramètres de la pagina deveniment",
"Event to be confirmed": "Eveniment de confirmar",
"Event {eventTitle} deleted": "Eveniment {eventTitle} suprimit",
"Event {eventTitle} reported": "Eveniment {eventTitle} senhalat",
"Events": "Eveniments",
"Events nearby you": "Eveniments prop de çò vòstre",
"Event": "Eveniment",
"Enter some tags": "Escriure detiquetas",
"Ends on…": "Sacaba lo…",
"Email": "Corrièl",
"Edit": "Editar",
"Description": "Descripcion",
"Delete": "Suprimir",
"Current": "Actual",
"Create": "Crear",
"Country": "País",
"Comments": "Comentaris",
"Click to upload": "Clicatz per enviar",
"Click to select": "Clicatz per seleccionar",
"Clear": "Escafar",
"Change": "Modificar",
"Category": "Categoria",
"Cancel": "Anullar",
"By {name}": "Per {name}",
"Are you going to this event?": "Anatz a aqueste eveniment ?",
"Approve": "Aprovar",
"Allow all comments": "Autorizar totes los comentaris",
"Administration": "Administracion",
"Additional comments": "Comentari adicional",
"Add": "Ajustar",
"Add to my calendar": "Ajustar mon calendièr",
"Add an address": "Ajustar una adreça",
"Add a tag": "Ajustar una etiqueta",
"Add a new profile": "Ajustar un perfil novèl",
"About": "A prepaus",
"About this instance": "Tocant aquesta instància",
"About this event": "Tocant aqueste eveniment",
"© The Mobilizon Contributors {date} - Made with Elixir, Phoenix, VueJS & with some love and some weeks": "© Loscontribuidors de Mobilizon {date} - Fach amb Elixir, Phoenix, VueJS e damor e de setmanas",
"{count} requests waiting": "Una demanda en espèra|{count} demandas en espèra",
"{count} participants": "Un participant|{count} participants",
"{approved} / {total} seats": "{approved} / {total} plaças",
"meditate a bit": "meditatz un pauc",
"You're organizing this event": "Organizatz aqueste eveniment",
"You need to login.": "Vos cal vos connectar.",
"You are an organizer.": "Sètz un organizaire.",
"You are already logged-in.": "Sètz ja connectat.",
"You announced that you're going to this event.": "Avètz anonciat quanatz a aqueste eveniment.",
"Who can view this event and participate": "Qual pòt veire aqueste eveniment e i participar",
"We just sent an email to {email}": "Avèm pas quenviat un corrièl a {email}",
"Visible everywhere on the web (public)": "Visible per tot lo web (public)",
"Update my event": "Modificar mon eveniment",
"Transfer to {outsideDomain}": "Transferit a {outsideDomain}",
"To confirm, type your identity username \"{preferredUsername}\"": "Per confirmar picatz lo nom de lidentitat « {preferredUsername} »",
"To confirm, type your event title \"{eventTitle}\"": "Per confirmar picatz lo títol de leveniment « {eventTitle} »",
"These events may interest you": "Aquestes eveniments pòdon vos interessar",
"There are {participants} participants.": "I a pas quun participant | I a {participants} participants.",
"The page you're looking for doesn't exist.": "La pagina que cercatz existís pas.",
"The event title will be ellipsed.": "Lo títol de leveniment utilizarà una ellipsi.",
"The event organizer didn't add any description.": "Lorganizator de leveniment a pas ajustat cap de descripcion.",
"Tentative: Will be confirmed later": "Provisòri : serà confirmat mai tard",
"Sign up": "Sinscriure",
"Show remaining number of places": "Far veire lo nombre de plaças que demòran",
"Share this event": "Partejar leveniment",
"Send the report": "Enviar lo senhalament",
"Send email to reset my password": "Enviar un corrièl per dire de reïnicializar mon senhal",
"Send confirmation email again": "Tornar enviar lo corrièl de validacion",
"Searching…": "Recèrca…",
"Search results: \"{search}\"": "Resultats de recèrca : « {search} »",
"Search events, groups, etc.": "Recercar deveniments, de grops, etc.",
"Reset my password": "Reïnicializar mon senhal",
"Resend confirmation email": "Tornar enviar lo corrièl de confirmacion",
"Public comment moderation": "Moderacion dels comentaris publics",
"Please be nice to each other": "Siatz polits",
"Password reset": "Reïnicializar del senhal",
"Participation approval": "Validacion dels participants",
"Page limited to my group (asks for auth)": "Accès limitat a mon grop (demanda dautentificacion)",
"Organizer": "Organizator",
"Opened reports": "Senhalaments dubèrts",
"Only accessible through link and search (private)": "Solament accessible via ligam e la recèrca (privat)",
"One person is going": "Degun i va pas | Una persona i va | {approved} personas i van",
"No results for \"{queryText}\"": "Cap de resultats per « {queryText} »",
"No participants yet.": "Cap de participacion pel moment.",
"No groups found": "Cap de grop pas trobat",
"No group found": "Cap de grop pas trobat",
"No events found": "Cap deveniment pas trobat",
"No address defined": "Cap dadreça pas definida",
"Moderated comments (shown after approval)": "Comentaris moderats (mostrat aprèp validacion)",
"Legal": "Mencions legalas",
"Leaving event \"{title}\"": "Quitar leveniment « {title} »",
"Leave event": "Anullar ma participacion a leveniment",
"Learn more on": "Ne saber mai sus",
"Learn more on {0}": "Ne saber mai sus {0}",
"Last published event": "Darrièr eveniment publicat",
"Identity {displayName} updated": "Identitat {displayName} actualizada",
"Identity {displayName} deleted": "Identitat {displayName} suprimida",
"Identity {displayName} created": "Identitat {displayName} creada",
"I want to approve every participation request": "Vòli aprovar cada demanda de participacion",
"I create an identity": "Crèï una identitat",
"Group {displayName} created": "Grop {displayName} creat",
"Group full name": "Nom complèt del grop",
"Going as {name}": "Coma {name}",
"From the {startDate} at {startTime} to the {endDate} at {endTime}": "Del {startDate} a {startTime} fins al {endDate} a {endTime}",
"Exclude": "Exclure",
"Events you're going at": "Eveniment ont anatz",
"Event {eventTitle} reported": "Eveniment {eventTitle} senhalat",
"Event {eventTitle} deleted": "Eveniment {eventTitle} suprimit",
"Event list": "Lista deveniments",
"Error while validating account": "Error en validant lo compte",
"Do you want to participate in {title}?": "Volètz participar a {title} ?",
"Displayed name": "Nom mostrat",
"Display participation price": "Far veire un prètz de participacion",
"Display name": "Nom mostrat",
"Didn't receive the instructions ?": "Avètz pas recebudas las consignas ?",
"Delete {preferredUsername}": "Suprimir {preferredUsername}",
"Delete {eventTitle}": "Suprimir {eventTitle}",
"Delete your identity": "Suprimir vòstra identitat",
"Delete this identity": "Suprimir aquesta identitat",
"Delete event": "Suprimir un eveniment",
"Creator": "Creator",
"Create your communities and your events": "Creatz vòstra comunitat e vòstres eveniments",
"Create token": "Crear un geton",
"Create my profile": "Crear mon perfil",
"Create my group": "Crear mon grop",
"Create my event": "Crear mon eveniment",
"Create group": "Crear un grop",
"Create a new identity": "Crear una identitat novèla",
"Create a new group": "Crear un grop novèl",
"Create a new event": "Crear un eveniment novèl",
"Confirmed: Will happen": "Confirmat : se tendrà",
"Confirm my particpation": "Confirmar ma participacion",
"Comments on the event page": "Comentari a pagina de leveniment",
"Close comments for all (except for admins)": "Barrar los comentaris a tot lo monde (fòra los administrators)",
"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.",
"Are you sure you want to cancel your participation at event \"{title}\"?": "Volètz vertadièrament anullar vòstra participacion a leveniment « {title} » ?",
"A validation email was sent to {email}": "Un corrièl de validat es estat enviar a {email}",
"Welcome back!": "Tornatz ben aquí !",
"Welcome back {username}": "Tornatz ben {username}",
"You have one event in {days} days.": "Avètz pas cap deveniment daquí {days} jorns | Avètz un eveniment daquí {days} jorns. | Avètz {count} eveniments daquí {days} jorns",
"You and one other person are going to this event": "Sètz lunica persona a anar a aqueste eveniment | Vos e una persona mai anatz a aqueste eveniment | Vos e {approved} personas mai anatz a aqueste eveniment.",
"This will delete / anonymize all content (events, comments, messages, participations…) created from this identity.": "Aquò suprimirà / far venir anonim tot lo contengut (eveniments, comentaris, messatges, participacions…) creat amb aquesta identitat.",
"This instance isn't opened to registrations, but you can register on other instances.": "Aquesta instància permet pas las inscripcion, mas podètz vos marcar sus dautras instàncias.",
"The report will be sent to the moderators of your instance. You can explain why you report this content below.": "Lo senhalament serà enviat als moderators de lautra instància. Podètz explicar çai-jos perque senhalatz lo contengut.",
"The event organizer has chosen to approve manually the participations to this event. You will receive a notification when your participation has been approved": "Lorganizator de leveniment causèt daprovar manualament las participacions daqueste eveniment. Recebretz una notificacion quand serà aprovada",
"The event came from another instance. Your participation will be confirmed after we confirm it with the other instance.": "Leveniment ven duna autra instància. Vòstra participacion serà confirmada aprèp quajam recebut la confirmacion de lautra instància.",
"Please contact this instance's Mobilizon admin if you think this is a mistake.": "Volgatz contactar ladministrator daquesta instància Mobilizon se pensatz ques una error.",
"Please check your spam folder if you didn't receive the email.": "Mercés de verificar vòstre dorsièr de messatges indesirables savètz pas recebut lo corrièl.",
"If this identity is the only administrator of some groups, you need to delete them before being able to delete this identity.": "Saquesta identitat es lunica que pòt administrar unes grops, vos cal los suprimir den primièr per dire de poder suprimir aquesta identitat.",
"The content came from another server. Transfer an anonymous copy of the report?": "Lo contengut ven duna autra instància. Transferir una còpia anonima del senhalament ?",
"Please make sure the address is correct and that the page hasn't been moved.": "Asseguratz-vos que ladreça es corrècta e que la pagina es pas estada desplaçada.",
"Otherwise this identity will just be removed from the group administrators.": "Autrament aquesta identitat serà pas que suprimida dels administrators del grop.",
"Disallow promoting on Mobilizon": "Refusar la promocion sus Mobilizon",
"with {identity}": "amb {identity}",
"with another identity…": "amb una autra identitat…",
"Your local administrator resumed it's policy:": "Vòstre administrator local resumèt sa politica aital :",
"Your account is nearly ready, {username}": "Vòstre compte es gaireben prèst, {username}",
"You're not going to any event yet": "Avètz pas cap deveniment pel moment",
"You have one event tomorrow.": "Avètz pas cap deveniment deman| Avètz un eveniment deman. | Avètz {count} eveniments deman",
"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 been disconnected": "Sètz estat desconnectat",
"Waiting for organization team approval.": "Es espèra daprovacion per lorganizacion.",
"The password was successfully changed": "Lo senhal es estat corrèctament cambiat",
"Password change": "Cambiament de senhal",
"Participation requested!": "Participacion demandada !",
"Participate": "Participar",
"Old password": "Ancian senhal",
"New password": "Nòu senhal",
"If an account with this email exists, we just sent another confirmation email to {email}": "Se un compte amb aquesta adreça existís, avèm enviat un novèl corrièl de confirmacion a{email}",
"Exclude": "Exclure",
"Explore": "Explorar",
"Featured events": "Eveniments notables",
"Features": "Foncionalitats",
"Find an address": "Trobar una adreça",
"Find an instance": "Trobar una instància",
"For instance: London, Taekwondo, Architecture…": "Per exemple : Tolosa, Taekwondo, Arquitectura…",
"Forgot your password ?": "Senhal oblidat ?",
"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?": "De lanniversari damics a una caminada pel climat, uèi, las bonas rasons de samassar son <b>traçadas pels gigants del web</b>. Cossí sorganizar, cossí clicar sus « participi » sens <b>provesir de donadas privadas</b> a Facebook o <b>se clavar dins</b> MeetUp ?",
"From the {startDate} at {startTime} to the {endDate}": "Del {startDate} a {startTime} fins al {endDate}",
"From the {startDate} at {startTime} to the {endDate} at {endTime}": "Del {startDate} a {startTime} fins al {endDate} a {endTime}",
"From the {startDate} to the {endDate}": "Del {startDate} fins al {endDate}",
"Gather ⋅ Organize ⋅ Mobilize": "Amassar ⋅ Organizar ⋅ Mobilizar",
"General information": "Informacions generalas",
"Getting location": "Obtencion de la localizacion",
"Going as {name}": "Coma {name}",
"Group": "Grop",
"Group List": "Lista dels grops",
"Group full name": "Nom complèt del grop",
"Group name": "Nom del grop",
"Group {displayName} created": "Grop {displayName} creat",
"Groups": "Grops",
"Headline picture": "Imatge endavant",
"I create an identity": "Crèï una identitat",
"I participate": "Participi",
"Either the account is already validated, either the validation token is incorrect.": "Siá lo compte es ja validat, siá lo geton de validacion es incorrècte.",
"Change password": "Modificar mon senhal",
"Change my password": "Modificar mon senhal",
"Change my identity…": "Cambiar mon identitat…",
"Cancel my participation…": "Anullar ma participacion…",
"Cancel my participation request…": "Anullar ma demanda de participacion…",
"Before you can login, you need to click on the link inside it to validate your account": "Abans que poscatz vos marcar, devètz clicar lo ligam dedins per validar lo compte",
"Unfortunately, your participation request was rejected by the organizers.": "Malaürosament, vòstra demanda de participacion es estada refusada pels organizators.",
"Rejected participations": "Participacions regetadas",
"Rejected": "Regetadas",
"Requests": "Requèstas",
"Organize and take action, freely": "Sorganizar e agir, liurament",
"I want to approve every participation request": "Vòli aprovar cada demanda de participacion",
"Identities": "Identitats",
"Identity": "Identitat",
"Identity {displayName} created": "Identitat {displayName} creada",
"Identity {displayName} deleted": "Identitat {displayName} suprimida",
"Identity {displayName} updated": "Identitat {displayName} actualizada",
"If an account with this email exists, we just sent another confirmation email to {email}": "Se un compte amb aquesta adreça existís, venèm denviar un novèl corrièl de confirmacion a {email}",
"If this identity is the only administrator of some groups, you need to delete them before being able to delete this identity.": "Saquesta identitat es lunica que pòt administrar unes grops, vos cal los suprimir den primièr per dire de poder suprimir aquesta identitat.",
"Impossible to login, your email or password seems incorrect.": "Connexion impossibla, lo corrièl o lo senhal sembla incorrècte.",
"In the meantime, please consider that the software is not (yet) finished. More information {onBlog}.": "Daquel temps, consideratz que lo logicial es pas (encara) acabat. Mai dinformacion {onBlog}.",
"Installing Mobilizon will allow communities to free themselves from the services of tech giants by creating <b>their own event platform</b>.": "Installar Mobilizon permetrà a de collectius de se liberar de las aisinas dels gigants del web en creant <b>lor pròpria plataforma deveniments</b>.",
"Join": "Participar",
"Join event {title}": "Participar a {title}",
"Join {instance}, a Mobilizon instance": "Rejonhètz {instance}, una instància Mobilizon",
"Event already passed": "Eveniment ja passat",
"Are you sure you want to cancel the event edition? You'll lose all modifications.": "Volètz vertadièrament anullar la modificacion de leveniment ? Perdretz totas vòstras modificacions.",
"Are you sure you want to cancel the event creation? You'll lose all modifications.": "Volètz vertadièrament anullar la creacion de leveniment ? Perdretz totas vòstras modificacions.",
"Drafts": "Borrolhons",
"Draft": "Borrolhon",
"its source code is public": "son còdi font es public",
"a decentralised federation protocol": "un protocòl de federacion descentralizat",
"Unsaved changes": "Modificacions pas enregistradas",
"To change the world, change the software": "Per cambiar lo monde, cambiatz de logicial",
"Software to the people": "Logicial pel pòble",
"Save draft": "Enregistar lo borrolhon",
"Publish": "Publicar",
"Mobilizons licence": "Licéncia de Mobilizon",
"Last published event": "Darrièr eveniment publicat",
"Last week": "La setmana passada",
"Learn more": "Ne saber mai",
"Learn more about Mobilizon": "Ne saber mai subre Mobilizon",
"Gather ⋅ Organize ⋅ Mobilize": "Amassar ⋅ Organizar ⋅ Mobilizar",
"Find an instance": "Trobar una instància",
"Continue editing": "Contunhar la modificacion",
"Cancel edition": "Anullar la modificacion",
"Cancel creation": "Anullar la creacion",
"About Mobilizon": "A prepaus de Mobilizon"
"Learn more on": "Ne saber mai sus",
"Learn more on {0}": "Ne saber mai sus {0}",
"Leave": "Quitar",
"Leave event": "Anullar ma participacion a leveniment",
"Leaving event \"{title}\"": "Quitar leveniment « {title} »",
"Legal": "Mencions legalas",
"Let's create a new common": "Creem un nòu Common",
"License": "Licéncia",
"Limited number of places": "Nombre de plaças limitat",
"Limited places": "Plaças limitadas",
"Load more": "Ne veire mai",
"Loading…": "Cargament…",
"Locality": "Comuna",
"Log in": "Se connectar",
"Log out": "Se desconnectar",
"Login": "Se connectar",
"Login on Mobilizon!": "Se connectar a Mobilizon !",
"Manage participants": "Gerir los participants",
"Manage participations": "Gerir las participacions",
"Members": "Membres",
"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 es un logicial liure que permetrà a de comunautats de <b>crear lor pròpris espacis</b> de publicacion deveniments, per dire de se liberar melhor dels gigants del web.",
"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 es en desvolopament, ajustarem de nòvas foncionalitats a aqueste site pendent de mesas a jorn regularas, fins a la publicacion de <b>la version 1 del logicial al primièr semèstre 2020</b>.",
"Mobilizons licence": "Licéncia de Mobilizon",
"Moderated comments (shown after approval)": "Comentaris moderats (mostrat aprèp validacion)",
"My account": "Mon compte",
"My events": "Mos eveniments",
"My identities": "Mas identitats",
"Name": "Nom",
"New password": "Nòu senhal",
"No address defined": "Cap dadreça pas definida",
"No end date": "Cap de data de fin",
"No events found": "Cap deveniment pas trobat",
"No group found": "Cap de grop pas trobat",
"No groups found": "Cap de grop pas trobat",
"No participants yet": "Cap de participant pel moment",
"No results for \"{queryText}\"": "Cap de resultats per « {queryText} »",
"No user account with this email was found. Maybe you made a typo?": "Pas de compte utilizaire pas trobat amb aquesta adreça. Benlèu quavètz fach una deca ?",
"Number of places": "Nombre de plaças",
"OK": "OK",
"Old password": "Ancian senhal",
"On {date}": "Lo {date}",
"On {date} ending at {endTime}": "Lo {date}, sacaba a {endTime}",
"On {date} from {startTime} to {endTime}": "Lo {date} de {startTime} fins a {endTime}",
"On {date} starting at {startTime}": "Lo {date} a partir de {startTime}",
"One person is going": "Degun i va pas | Una persona i va | {approved} personas i van",
"Only accessible through link and search (private)": "Solament accessible via ligam e la recèrca (privat)",
"Only alphanumeric characters and underscores are supported.": "Solament los caractèrs alfanumerics e los jonhents basses son suportats.",
"Opened reports": "Senhalaments dubèrts",
"Organize and take action, freely": "Sorganizar e agir, liurament",
"Organized": "Organizats",
"Organized by {name}": "Organizat per {name}",
"Organizer": "Organizator",
"Otherwise this identity will just be removed from the group administrators.": "Autrament aquesta identitat serà pas que suprimida dels administrators del grop.",
"Page limited to my group (asks for auth)": "Accès limitat a mon grop (demanda dautentificacion)",
"Page not found": "Pagina pas trobada",
"Participant already was rejected.": "Lo participant es ja estat regetat.",
"Participant has already been approved as participant.": "Lo participant es ja estat aprovat coma participant.",
"Participants": "Participants",
"Participate": "Participar",
"Participation approval": "Validacion dels participants",
"Participation requested!": "Participacion demandada !",
"Password": "Senhal",
"Password (confirmation)": "Senhal (confirmacion)",
"Password change": "Cambiament de senhal",
"Password reset": "Reïnicializar lo senhal",
"Past events": "Eveniments passats",
"Pick an identity": "Causir una identitat",
"Please check your spam folder if you didn't receive the email.": "Mercés de verificar vòstre dorsièr de messatges indesirables savètz pas recebut lo corrièl.",
"Please contact this instance's Mobilizon admin if you think this is a mistake.": "Volgatz contactar ladministrator daquesta instància Mobilizon se pensatz ques una error.",
"Please make sure the address is correct and that the page hasn't been moved.": "Asseguratz-vos que ladreça es corrècta e que la pagina es pas estada desplaçada.",
"Please read the full rules": "Mercés de legir las règlas complètas",
"Please refresh the page and retry.": "Actualizatz la pagina e tornatz ensajar.",
"Please type at least 5 characters": "Mercés de picar almens 5 caractèrs",
"Postal Code": "Còdi postal",
"Private event": "Eveniment privat",
"Private feeds": "Flux privats",
"Promotion": "Promocion",
"Public RSS/Atom Feed": "Flux RSS/Atom public",
"Public comment moderation": "Moderacion dels comentaris publics",
"Public event": "Eveniment public",
"Public feeds": "Flux publics",
"Public iCal Feed": "Flux iCal public",
"Publish": "Publicar",
"Published events": "Eveniments publicats",
"RSS/Atom Feed": "Flux RSS/Atom",
"Read Framasofts statement of intent on the Framablog": "Legir la nòta dintencion de Framasoft sul Framablog",
"Region": "Region",
"Register": "Sinscriure",
"Register an account on Mobilizon!": "Sinscriure a Mobilizon !",
"Register for an event by choosing one of your identities": "Sinscriure a un eveniment en causir una de vòstras identitats",
"Registration is currently closed.": "Las inscripcions son actualament tampadas.",
"Reject": "Regetar",
"Rejected": "Regetadas",
"Rejected participations": "Participacions regetadas",
"Report": "Senhalar",
"Report this event": "Senhalar aqueste eveniment",
"Requests": "Requèstas",
"Resend confirmation email": "Tornar enviar lo corrièl de confirmacion",
"Reset my password": "Reïnicializar mon senhal",
"Save": "Enregistrar",
"Save draft": "Enregistar lo borrolhon",
"Search": "Recercar",
"Search events, groups, etc.": "Recercar deveniments, de grops, etc.",
"Search results: \"{search}\"": "Resultats de recèrca : « {search} »",
"Searching…": "Recèrca…",
"Send confirmation email again": "Tornar enviar lo corrièl de validacion",
"Send email to reset my password": "Enviar un corrièl per dire de reïnicializar mon senhal",
"Send me an email to reset my password": "Enviatz-me un corrièl per reïnicializar lo senhal",
"Send me the confirmation email once again": "Tornatz-me enviar lo corrièl de confirmacion",
"Send the report": "Enviar lo senhalament",
"Share this event": "Partejar leveniment",
"Show map": "Mostrar la mapa",
"Show remaining number of places": "Far veire lo nombre de plaças que demòran",
"Show the time when the event begins": "Mostrar lora de debuta de leveniment",
"Show the time when the event ends": "Mostrar lora de fin de leveniment",
"Sign up": "Sinscriure",
"Software to the people": "Logicial pel pòble",
"Starts on…": "Comença lo…",
"Status": "Estat",
"Street": "Carrièra",
"Tentative: Will be confirmed later": "Provisòri : serà confirmat mai tard",
"The content came from another server. Transfer an anonymous copy of the report?": "Lo contengut ven duna autra instància. Transferir una còpia anonima del senhalament ?",
"The current identity doesn't have any permission on this event. You should probably change it.": "Lidentitat actuala a pas cap dautorizacion sus aqueste eveniment. Deuriatz benlèu ne causir una autra.",
"The draft event has been updated": "Leveniment borrolhon es estat actualizat",
"The event came from another instance. Your participation will be confirmed after we confirm it with the other instance.": "Leveniment ven duna autra instància. Vòstra participacion serà confirmada aprèp quajam recebut la confirmacion de lautra instància.",
"The event has been created as a draft": "Leveniment es estat creat coma borrolhon",
"The event has been published": "Leveniment es estat publicat",
"The event has been updated": "Leveniment es estat actualizat",
"The event has been updated and published": "Leveniment es estat actualizat e publicat",
"The event organizer didn't add any description.": "Lorganizator de leveniment a pas ajustat cap de descripcion.",
"The event organizer has chosen to approve manually the participations to this event. You will receive a notification when your participation has been approved": "Lorganizator de leveniment causèt daprovar manualament las participacions daqueste eveniment. Recebretz una notificacion quand serà aprovada",
"The event title will be ellipsed.": "Lo títol de leveniment utilizarà una ellipsi.",
"The page you're looking for doesn't exist.": "La pagina que cercatz existís pas.",
"The password was successfully changed": "Lo senhal es estat corrèctament cambiat",
"The report will be sent to the moderators of your instance. You can explain why you report this content below.": "Lo senhalament serà enviat als moderators de lautra instància. Podètz explicar çai-jos perque senhalatz lo contengut.",
"The user account you're trying to login as has not been confirmed yet. Check your email inbox and eventually your spam folder.": "Lo compte utilizaire que volètz utilizar per vos connectar es pas estat confirmat. Verificatz la bóstia de recepcion de vòstre corrièl e eventualament lo dorsièr de messatges indesirables.",
"The {date} at {time}": "Lo {date} a {time}",
"There are {participants} participants.": "I a pas quun participant | I a {participants} participants.",
"These events may interest you": "Aquestes eveniments pòdon vos interessar",
"This installation (called “instance“) can easily {interconnect}, thanks to {protocol}.": "Aquesta installacion (apeladas « instància ») pòt facilament {interconnect}, gràcias a {protocol}.",
"This instance isn't opened to registrations, but you can register on other instances.": "Aquesta instància permet pas las inscripcion, mas podètz vos marcar sus dautras instàncias.",
"This is a demonstration site to test the beta version of Mobilizon.": "Aquò es un site de demostracion per ensajar la version beta de Mobilizon.",
"This will delete / anonymize all content (events, comments, messages, participations…) created from this identity.": "Aquò suprimirà / far venir anonim tot lo contengut (eveniments, comentaris, messatges, participacions…) creat amb aquesta identitat.",
"Title": "Títol",
"To achieve your registration, please create a first identity profile.": "Per acabar vòstra inscripcion, mercés de crear un primièr perfil.",
"To change the world, change the software": "Per cambiar lo monde, cambiatz de logicial",
"To confirm, type your event title \"{eventTitle}\"": "Per confirmar picatz lo títol de leveniment « {eventTitle} »",
"To confirm, type your identity username \"{preferredUsername}\"": "Per confirmar picatz lo nom de lidentitat « {preferredUsername} »",
"Transfer to {outsideDomain}": "Transferit a {outsideDomain}",
"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 error.": "Error desconeguda.",
"Unsaved changes": "Modificacions pas enregistradas",
"Upcoming": "Venents",
"Update event {name}": "Actualizar leveniment {name}",
"Update my event": "Modificar mon eveniment",
"User accounts and every other data is currently deleted every 48 hours, so you may want to register again.": "Los comptes utilizaires e totas las autras donadas son actualament suprimits cada 48 oras, doncas benlèu que volètz vos inscriure de nòu.",
"User logout": "Desconnexion",
"Username": "Nom dutilizaire",
"Users": "Utilizaires",
"View event page": "Veire la pagina de leveniment",
"View everything": "O veire tot",
"View page on {hostname} (in a new window)": "Veire la pagina {hostname} (dins una fenèstra novèla)",
"Visible everywhere on the web (public)": "Visible per tot lo web (public)",
"Waiting for organization team approval.": "Es espèra daprovacion per lorganizacion.",
"Waiting list": "Lista despèra",
"Warning": "Avertiment",
"We just sent an email to {email}": "Venèm denviar un corrièl a {email}",
"We want to develop a <b>digital common</b>, that everyone can make their own, which respects <b>privacy and activism by design</b>.": "Volèm desvolopar un <b>ben comun numeric</b>, que tot lo monde poirà sapropriar, concebut dins <b>lo respet de la vida privada e de laccion militanta</b>.",
"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.": "Cambiarem pas lo monde de Facebook estant. Laisina que somiem, las entrepresas del capitalisme de susvelhança son pas capablas de lo produire, perque poirián pas ne traire profièch.",
"Website / URL": "Site web / URL",
"Welcome back {username}!": "Tornatz ben {username} !",
"Welcome back!": "Tornatz ben aquí !",
"Welcome on your administration panel": "La benvenguda a vòstre espaci dadministracion",
"Welcome to Mobilizon, {username}!": "Benvengut a Mobilizon, {username} !",
"Who can view this event and participate": "Qual pòt veire aqueste eveniment e i participar",
"World map": "Mapa mondiala",
"Write something…": "Escrivètz quicòm…",
"You and one other person are going to this event": "Sètz lunica persona a anar a aqueste eveniment | Vos e una persona mai anatz a aqueste eveniment | Vos e {approved} personas mai anatz a aqueste eveniment.",
"You announced that you're going to this event.": "Avètz anonciat quanatz a aqueste eveniment.",
"You are already a participant of this event.": "Participatz ja a aqueste eveniment.",
"You are already logged-in.": "Sètz ja connectat.",
"You are an organizer.": "Sètz un organizaire.",
"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",
"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 remove your last identity.": "Podètz pas suprimir vòstra darrièra identitat.",
"You have been disconnected": "Sètz estat desconnectat",
"You have cancelled your participation": "Avètz anullada vòstra participacion",
"You have one event in {days} days.": "Avètz pas cap deveniment daquí {days} jorns | Avètz un eveniment daquí {days} jorns. | Avètz {count} eveniments daquí {days} jorns",
"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 need to login.": "Vos cal vos connectar.",
"You're not going to any event yet": "Avètz pas cap deveniment pel moment",
"Your account has been validated": "Vòstre compte es estat validat",
"Your account is being validated": "Vòstre compte es en validacion",
"Your account is nearly ready, {username}": "Vòstre compte es gaireben prèst, {username}",
"Your local administrator resumed its policy:": "Vòstre administrator local resumèt sa politica aital :",
"Your participation has been confirmed": "Vòstra participacion es estada confirmada",
"Your participation has been requested": "Vòstra participacion es estada demandada",
"a decentralised federation protocol": "un protocòl de federacion descentralizat",
"e.g. 10 Rue Jangot": "per exemple : 10 carrièra Jangot",
"firstDayOfWeek": "1",
"iCal Feed": "Flux iCal",
"interconnect with others like it": "sinterconnectar simplament amb dautras",
"its source code is public": "son còdi font es public",
"on our blog": "sus nòstre blòg",
"resend confirmation email": "tornar enviar lo messatge de confirmacion",
"respect of the fundamental freedoms": "lo respet de las libertats fondamentalas",
"with another identity…": "amb una autra identitat…",
"with {identity}": "amb {identity}",
"{actor}'s avatar": "Avatar de {actor}",
"{approved} / {total} seats": "{approved} / {total} plaças",
"{count} participants": "Cap de participacion pel moment|Un participant|{count} participants",
"{count} requests waiting": "Una demanda en espèra|{count} demandas en espèra",
"{license} guarantees {respect} of the people who will use it. Since {source}, anyone can audit it, which guarantees its transparency.": "{license} assegura {respect} del monde que lutilizaràn. Del moment que {source}, tot lo monde pòt linspectar, aquò assegura sa transparéncia.",
"© The Mobilizon Contributors {date} - Made with Elixir, Phoenix, VueJS & with some love and some weeks": "© Los contribuidors de Mobilizon {date} - Fach amb Elixir, Phoenix, VueJS e damor e de setmanas",
"© The OpenStreetMap Contributors": "© Los contribuitors dOpenStreetMap"
}

View File

@ -1 +1,295 @@
{}
{
"<b>Please do not use it in any real way</b>: everything you create here (accounts, events, identities, etc.) will be automatically deleted every 48 hours.": "<b>Nie używaj go do rzeczywistego działania</b>: wszystko co tu utworzysz (konta, wydarzenia, tożsamości itp.) zostanie automatycznie usunięte po 48 godzinach.",
"A validation email was sent to {email}": "Wiadomość potwierdzającą została wysłana na {email}",
"Abandon edition": "Porzuć edycję",
"About": "Informacje",
"About Mobilizon": "O Mobilizon",
"About this event": "O tym wydarzeniu",
"About this instance": "O tej instancji",
"Add": "Dodaj",
"Add an address": "Dodaj adres",
"Add some tags": "Dodaj tagi",
"Add to my calendar": "Dodaj do kalendarza",
"Additional comments": "Dodatkowe komentarze",
"Administration": "Administracja",
"All data will be deleted every 48 hours, so please don't use this for anything real.": "Wszystkie dane zostaną usunięte co 48 godzin, więc nie używaj tego do rzeczywistych działań.",
"Allow all comments": "Pozwól na wszystkie komentarze",
"An error has occurred.": "Wystąpił błąd.",
"Approve": "Zatwierdź",
"Are you sure you want to cancel the event creation? You'll lose all modifications.": "Czy na pewno chcesz anulować tworzenie wydarzenia? Utracisz wszystkie zmiany.",
"Are you sure you want to cancel the event edition? You'll lose all modifications.": "Czy na pewno chcesz usunąć edycję wydarzenia? Utracisz wszystkie zmiany.",
"Are you sure you want to cancel your participation at event \"{title}\"?": "Czy na pewno chcesz wycofać swój udział w wydarzeniu „{title}”?",
"Are you sure you want to delete this event? This action cannot be reverted.": "Czy na pewno chcesz usunąć to wydarzenie? To działanie nie może zostać odwrócone.",
"Avatar": "Awatar",
"Before you can login, you need to click on the link inside it to validate your account": "Zanim się zalogujesz, musisz odwiedzić odnośnik znajdujący się w niej, aby potwierdzić swoje konto",
"By {name}": "Od {name}",
"Cancel": "Anuluj",
"Cancel creation": "Anuluj tworzenie",
"Cancel edition": "Anuluj edycję",
"Cancel my participation request…": "Anuluj moje zgłoszenie udziału…",
"Cancel my participation…": "Anuluj mój udział…",
"Cancelled: Won't happen": "Anulowano: Nie odbędzie się",
"Category": "Kategoria",
"Change": "Zmień",
"Change my identity…": "Zmień moją tożsamość…",
"Change my password": "Zmień moje hasło",
"Change password": "Zmień hasło",
"Clear": "Wyczyść",
"Click to select": "Naciśnij aby wybrać",
"Click to upload": "Naciśnij aby wysłać",
"Close comments for all (except for admins)": "Wyłącz komentarze dla wszystkich (poza administracją)",
"Comments": "Komentarze",
"Comments on the event page": "Komentarze na stronie wydarzenia",
"Confirm my particpation": "Potwierdź mój udział",
"Confirmed: Will happen": "Potwierdzone: odbędzie się",
"Continue editing": "Kontynuuj edycję",
"Country": "Kraj",
"Create": "Utwórz",
"Create a new event": "Utwórz nowe wydarzenie",
"Create a new group": "Utwórz nową grupę",
"Create a new identity": "Utwórz nową tożsamość",
"Create and manage several identities from the same account": "Utwórz i zarządzaj wieloma tożsamościami z tego samego konta",
"Create group": "Utwórz grupę",
"Create my event": "Utwórz wydarzenie",
"Create my group": "Utwórz grupę",
"Create my profile": "Utwórz profil",
"Create token": "Utwórz token",
"Create, edit or delete events": "Twórz, edytuj i usuwaj wydarzenia",
"Creator": "Twórca",
"Current identity has been changed to {identityName} in order to manage this event.": "Obecna tożsamość została zmieniona na {identityName}, aby móc zarządzać tym wydarzeniem.",
"Date and time settings": "Ustawienia daty i czasu",
"Date parameters": "Parametry daty",
"Delete": "Usuń",
"Delete event": "Usuń wydarzenie",
"Delete this identity": "Usuń tę tożsamość",
"Delete your identity": "Usuń swoją tożsamość",
"Delete {eventTitle}": "Usuń {eventTitle}",
"Delete {preferredUsername}": "Usuń {preferredUsername}",
"Description": "Opis",
"Didn't receive the instructions ?": "Nie otrzymałeś(-aś) instrukcji?",
"Display name": "Wyświetlana nazwa",
"Display participation price": "Wyświetlaj cenę udziału",
"Draft": "Szkic",
"Drafts": "Szkice",
"Edit": "Edytuj",
"Eg: Stockholm, Dance, Chess…": "Np. Sztokholm, taniec, szachy…",
"Either the account is already validated, either the validation token is incorrect.": "Konto jest już potwierdzone lub token walidacji jest nieprawidłowy.",
"Email": "E-mail",
"Ends on…": "Kończy się…",
"Enter the link URL": "Wprowadź adres URL",
"Error while communicating with the server.": "Błąd połączenia z serwerem.",
"Error while saving report.": "Błąd podczas zapisywania zgłoszenia.",
"Error while validating account": "Błąd podczas potwierdzania konta",
"Event": "Wydarzenie",
"Event cancelled": "Anulowano wydarzenie",
"Event creation": "Utworzenie wydarzenia",
"Event edition": "Edycja wydarzenia",
"Event list": "Lista wydarzeń",
"Event not found.": "Nie znaleziono wydarzenia.",
"Event page settings": "Ustawienia strony wydarzenia",
"Event to be confirmed": "Wydarzenie musi zostać potwierdzone",
"Event {eventTitle} deleted": "Usunięto wydarzenie {eventTitle}",
"Event {eventTitle} reported": "Zgłoszono wydarzenie {eventTitle}",
"Events": "Wydarzenia",
"Exclude": "Wyłącz",
"Explore": "Przeglądaj",
"Featured events": "Wyróżnione wydarzenia",
"Features": "Możliwości",
"Find an address": "Znajdź adres",
"Find an instance": "Znajdź instancję",
"For instance: London, Taekwondo, Architecture…": "Na przykład: Londyn, taekwondo, architektura…",
"Forgot your password ?": "Zapomniałeś(-aś) hasła?",
"From the {startDate} at {startTime} to the {endDate}": "Od {startDate} o {startTime} do {endDate}",
"From the {startDate} at {startTime} to the {endDate} at {endTime}": "Od {startDate} o {startTime} do {endDate} o {endTime}",
"From the {startDate} to the {endDate}": "Od {startDate} do {endDate}",
"General information": "Ogólne informacje",
"Getting location": "Uzyskiwanie położenia",
"Going as {name}": "Wybieram się jako {name}",
"Group List": "Lista grup",
"Group full name": "Pełna nazwa grupy",
"Group name": "Nazwa grupy",
"Group {displayName} created": "Utworzono grupę {displayName}",
"Groups": "Grupy",
"Headline picture": "Obraz nagłówka",
"I create an identity": "Tworzę tożsamość",
"I participate": "Biorę udział",
"I want to approve every participation request": "Chcę zatwierdzać każde zgłoszenie udziału",
"Identity {displayName} created": "Utworzono tożsamość {displayName}",
"Identity {displayName} deleted": "Usunięto tożsamość {displayName}",
"Identity {displayName} updated": "Zaktualizowano tożsamość {displayName}",
"If an account with this email exists, we just sent another confirmation email to {email}": "Jeżeli konto z tym adresem e-mail istnieje z wyślemy kolejną wiadomość potwierdzającą na {email}",
"If this identity is the only administrator of some groups, you need to delete them before being able to delete this identity.": "Jeżeli ta tożsamość jest jedynym administratorem jakiejś grupy, musisz ją usunąć. Zanim usuniesz tę tożsamość.",
"Impossible to login, your email or password seems incorrect.": "Nie udało się zalogować, adres e-mail lub hasło wydaje się być nieprawidłowe.",
"In the meantime, please consider that the software is not (yet) finished. More information {onBlog}.": "W międzyczasie, pamiętaj że to oprogramowanie nie jest (jeszcze) ukończone. Więcej informacji {onBlog}.",
"Installing Mobilizon will allow communities to free themselves from the services of tech giants by creating <b>their own event platform</b>.": "Zainstalowanie Mobilizon pozwoli społecznościom uwolnić się od usług technologicznych gigantów, tworząc <b>własną platformę wydarzeń</b>.",
"Join {instance}, a Mobilizon instance": "Dołącz do {instance}, instancji Mobilizon",
"Last published event": "Ostatnio opublikowane wydarzenie",
"Last week": "Ostatni tydzień",
"Learn more": "Dowiedz się więcej",
"Learn more about Mobilizon": "Dowiedz się więcej o Mobilizon",
"Leave event": "Opuść wydarzenie",
"Leaving event \"{title}\"": "Opuszczanie wydarzenia „{title}”",
"Let's create a new common": "Utworzony nową wspólnotę",
"License": "Licencja",
"Limited number of places": "Ograniczona liczba miejsc",
"Load more": "Załaduj więcej",
"Log in": "Zaloguj się",
"Log out": "Wyloguj się",
"Login": "Login",
"Login on Mobilizon!": "Zaloguj się na Mobilizon!",
"Manage participations": "Zarządzaj uczestnikami",
"Members": "Członkowie",
"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 jest wolnym/otwartym oprogramowaniem pozwalającym społecznościom na utworzenie <b>własnej przestrzeni</b> do organizacji wydarzeń, aby uwolnić się od gigantów technologicznych.",
"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 jest wciąż rozwijany, na stronie będą regularnie pojawiały się nowe funkcje, do czasu wydania <b>pierwszej wersji oprogramowania w pierwszej połowie 2020 roku</b>.",
"Mobilizons licence": "Licencja Mobilizon",
"Moderated comments (shown after approval)": "Moderowane komentarze (pojawią się po zatwierdzeniu)",
"My account": "Moje konto",
"My events": "Moje wydarzenia",
"My identities": "Moje tożsamości",
"Name": "Nazwa",
"New password": "Nowe hasło",
"No address defined": "Nie określono adresu",
"No end date": "Brak daty zakończenia",
"No events found": "Nie znaleziono wydarzeń",
"No group found": "Nie znaleziono grup",
"No groups found": "Nie znaleziono grup",
"No results for \"{queryText}\"": "Brak wyników dla „{queryText}”",
"No results for \"{queryText}\". You can try another search term or drag and drop the marker on the map": "Brak wyników dla „{queryText}”. Spróbuj innego zapytania lub przeciągnij i upuść znacznik na mapie",
"No user account with this email was found. Maybe you made a typo?": "Nie znaleziono użytkownika z tym adresem e-mail. Może zrobiłeś(-aś) literówkę?",
"Number of places": "Liczba miejsc",
"OK": "OK",
"Old password": "Stare hasło",
"On {date}": "{date}",
"On {date} ending at {endTime}": "{date}, kończy się o {endTime}",
"On {date} from {startTime} to {endTime}": "{date} od {startTime} do {endTime}",
"On {date} starting at {startTime}": "{date}, rozpoczyna się o {startTime}",
"Only accessible through link and search (private)": "Dostępne tylko przez odnośnik i wyszukiwanie (prywatne)",
"Only alphanumeric characters and underscores are supported.": "Tylko znaki alfanumeryczne i podkreślniki są dozwolone.",
"Opened reports": "Otwarte zgłoszenia",
"Organized": "Zorganizowane",
"Organized by {name}": "Organizowane przez {name}",
"Organizer": "Organizator",
"Otherwise this identity will just be removed from the group administrators.": "W przeciwnym razie tożsamość zostanie usunięta z administratorów grupy.",
"Page limited to my group (asks for auth)": "Strona ograniczona dla mojej grupy (prosi o zalogowanie)",
"Page not found": "Nie znaleziono strony",
"Participant already was rejected.": "Uczestnik został już odrzucony.",
"Participant has already been approved as participant.": "Uczestnik już został zatwierdzonym uczestnikiem.",
"Participants": "Uczestnicy",
"Participate": "Weź udział",
"Participation requested!": "Poproszono o udział!",
"Password": "Hasło",
"Password (confirmation)": "Hasło (potwierdzenie)",
"Password change": "Zmiana hasła",
"Password reset": "Resetowanie hasła",
"Pick an identity": "Wybierz tożsamość",
"Please check your spam folder if you didn't receive the email.": "Upewnij się, że wiadomość nie znajduje się w folderze spam.",
"Please contact this instance's Mobilizon admin if you think this is a mistake.": "Skontaktuj się z administratorem tej instancji, jeżeli uważasz że to pomyłka.",
"Please make sure the address is correct and that the page hasn't been moved.": "Upewnij się, że adres jest prawidłowy i strona nie została przeniesiona.",
"Please read the full rules": "Przeczytaj pełne zasady",
"Please refresh the page and retry.": "Odśwież stronę i spróbuj ponownie.",
"Postal Code": "Kod pocztowy",
"Private event": "Prywatne wydarzenie",
"Private feeds": "Prywatne strumienie",
"Public RSS/Atom Feed": "Publiczny strumień RSS/Atom",
"Public comment moderation": "Moderacja publicznych komentarzy",
"Public event": "Publiczne wydarzenie",
"Public feeds": "Publiczne strumienie",
"Public iCal Feed": "Publiczny strumień iCal",
"Publish": "Publikuj",
"Published events": "Opublikowane wydarzenia",
"RSS/Atom Feed": "Strumień RSS/Atom",
"Region": "Region",
"Register an account on Mobilizon!": "Zarejestruj się na Mobilizon!",
"Register for an event by choosing one of your identities": "Zgłoś się do wydarzenia wybierając jedną ze swoich tożsamości",
"Registration is currently closed.": "Rejestracja jest obecnie zamknięta.",
"Reject": "Odrzuć",
"Rejected participations": "Odrzuceni uczestnicy",
"Report": "Zgłoś",
"Report this event": "Zgłoś to wydarzenie",
"Requests": "Zgłoszenia",
"Resend confirmation email": "Wyślij ponownie wiadomość potwierdzającą",
"Reset my password": "Resetuj moje hasło",
"Save": "Zapisz",
"Save draft": "Zapisz szkic",
"Search": "Szukaj",
"Search events, groups, etc.": "Szukaj wydarzeń, grup itp.",
"Search results: \"{search}\"": "Wyniki wyszukiwania: „{search}”",
"Searching…": "Wyszukiwanie…",
"Send me an email to reset my password": "Wyślij mi e-mail z linkiem resetującym hasło",
"Send me the confirmation email once again": "Wyślij wiadomość potwierdzającą ponownie",
"Send the report": "Wyślij zgłoszenie",
"Share this event": "Udostępnij to wydarzenie",
"Show map": "Pokaż mapę",
"Show remaining number of places": "Pokaż pozostałą liczbę miejsc",
"Show the time when the event begins": "Pokaż czas rozpoczęcia wydarzenia",
"Sign up": "Zarejestruj się",
"Software to the people": "Oprogramowanie dla ludzi",
"Starts on…": "Rozpoczyna się…",
"Status": "Stan",
"Street": "Ulica",
"The content came from another server. Transfer an anonymous copy of the report?": "To zgłoszenie pochodzi z innego serwera. Przenieść anonimową kopię zgłoszenia?",
"The draft event has been updated": "Szkic wydarzenia został zaktualizowany",
"The event has been created as a draft": "Wydarzenie zostało utworzone jako szkic",
"The event has been published": "Wydarzenie zostało opublikowane",
"The event has been updated": "Zaktualizowano wydarzenie",
"The event has been updated and published": "Opublikowano i zaktualizowano wydarzenie",
"The event organizer didn't add any description.": "Organizator wydarzenia nie dodał żadnego opisu.",
"The page you're looking for doesn't exist.": "Strona którą próbujesz odwiedzić nie istnieje.",
"The password was successfully changed": "Pomyślnie zmieniono hasło",
"The report will be sent to the moderators of your instance. You can explain why you report this content below.": "Zgłoszenie zostanie wysłane do moderatorów Twojej instancji. Możesz wyjaśnić powód zgłoszenia poniżej.",
"The user account you're trying to login as has not been confirmed yet. Check your email inbox and eventually your spam folder.": "Konto użytkownika na które próbujesz się zalogować nie zostało jeszcze potwierdzone. Sprawdź nowe wiadomości e-mail lub folder spam.",
"These events may interest you": "Te wydarzenia mogą Cię zainteresować",
"This installation (called “instance“) can easily {interconnect}, thanks to {protocol}.": "Ta instalacja (nazywana „instancją” może łatwo {interconnect} dzięki {protocol}.",
"This instance isn't opened to registrations, but you can register on other instances.": "Ta instancja nie pozwala na rejestrację, ale możesz zarejestrować się na innych.",
"This is a demonstration site to test the beta version of Mobilizon.": "To strona demonstracyjna pozwalająca na przetestowanie wersji beta Mobilizon.",
"This will delete / anonymize all content (events, comments, messages, participations…) created from this identity.": "Ta opcja usunie/zanonimizuje całą zawartość (wydarzenia, komentarze, wiadomości, deklaracje udziału…) utworzone z tej tożsamości.",
"Title": "Tytuł",
"To change the world, change the software": "Zmień oprogramowanie, by zmienić świat",
"To confirm, type your event title \"{eventTitle}\"": "Aby potwierdzić, wprowadź tytuł wydarzenia „{eventTitle}”",
"To confirm, type your identity username \"{preferredUsername}\"": "Aby potwierdzić, wprowadź nazwę tożsamości „{preferredUsername}”",
"Transfer to {outsideDomain}": "Przenieś do {outsideDomain}",
"Unfortunately, this instance isn't opened to registrations": "Niestety, rejestracja jest zamknięta na tej instancji",
"Unfortunately, your participation request was rejected by the organizers.": "Niestety, Twoje zgłoszenie udziału zostało odrzucone przez organizatorów.",
"Unknown error.": "Nieznany błąd.",
"Unsaved changes": "Niezapisane zmiany",
"Update event {name}": "Zaktualizuj wydarzenie {name}",
"Update my event": "Zaktualizuj wydarzenie",
"User accounts and every other data is currently deleted every 48 hours, so you may want to register again.": "Konta użytkowników i inne dane są usuwane co 48 godzin, więc możesz potrzebować zarejestrować się ponownie.",
"Username": "Nazwa użytkownika",
"Users": "Użytkownicy",
"View event page": "Zobacz stronę wydarzenia",
"View everything": "Zobacz wszystko",
"View page on {hostname} (in a new window)": "Zobacz stronę na {hostname} (w nowym oknie)",
"Visible everywhere on the web (public)": "Widoczne w całym internecie (publiczne)",
"Waiting for organization team approval.": "Oczekiwanie na przyjęcie przez organizatorów.",
"Warning": "Ostrzeżenie",
"We just sent an email to {email}": "Wysłaliśmy e-mail do {email}",
"We want to develop a <b>digital common</b>, that everyone can make their own, which respects <b>privacy and activism by design</b>.": "Chcemy utworzyć <b>cyfrową wspólnotę</b>, którą każdy może uczynić swoją; która została <b>zaprojektowana by wspierać prywatność i aktywizm</b>.",
"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.": "Nie zmienimy świata używając Facebooka. Korporacje tworzące „kapitalizm inwigilacyjny” nie utworzą narzędzia naszych marzeń, ponieważ nie przyniosłoby to im korzyść. Oto okazja, aby zbudować coś lepszego, w oparciu o inne podejście.",
"Website / URL": "Strona internetowa/URL",
"Welcome back {username}!": "Witaj ponownie, {username}!",
"Welcome back!": "Witaj ponownie!",
"Welcome on your administration panel": "Witaj w panelu administracyjnym",
"Welcome to Mobilizon, {username}!": "Witaj na Mobilizon, {username}!",
"Who can view this event and participate": "Kto może wyświetlić i wziąć udział w wydarzeniu",
"World map": "Mapa świata",
"Write something…": "Napisz coś…",
"You are already a participant of this event.": "Już jesteś uczestnikiem tego wydarzenia.",
"You are already logged-in.": "Jesteś już zalogowany(-a).",
"You can add tags by hitting the Enter key or by adding a comma": "Możesz dodać tagi klawiszem Enter lub dodając przecinek",
"You can try another search term or drag and drop the marker on the map": "Możesz spróbować innego kryterium wyszukiwania lub przeciągnąć i upuścić znacznik na mapie",
"You can't remove your last identity.": "Nie możesz usunąć swojej jedynej tożsamości.",
"You have been disconnected": "Zostałeś(-aś) rozłączony(-a)",
"You have cancelled your participation": "Wycofałeś(-aś) swój udział",
"You may also ask to {resend_confirmation_email}.": "Możesz też poprosić o {resend_confirmation_email}.",
"You need to login.": "Musisz się zalogować.",
"Your account has been validated": "Twoje konto zostało zatwierdzone",
"Your account is nearly ready, {username}": "Twoje konto jest już prawie gotowe, {username}",
"Your participation has been confirmed": "Twój udział został potwierdzony",
"a decentralised federation protocol": "zdecentralizowanemu protokołu federacji",
"iCal Feed": "Strumień iCal",
"interconnect with others like it": "łączyć się z innymi",
"on our blog": "na naszym blogu",
"resend confirmation email": "ponowne wysłanie wiadomości potwierdzającej",
"© The OpenStreetMap Contributors": "© Współtwórcy OpenStreetMap"
}

323
js/src/i18n/sv.json Normal file
View File

@ -0,0 +1,323 @@
{
"<b>Please do not use it in any real way</b>: everything you create here (accounts, events, identities, etc.) will be automatically deleted every 48 hours.": "<b>Var god använd inte på riktigt</b>: allting du skapar här (konton, evenemang, identiteter, etc.) kommer tas bort automatiskt var 48e timme.",
"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 edition": "Överge redigering",
"About": "Om",
"About Mobilizon": "Om Mobilizon",
"About this event": "Om det här evenemanget",
"About this instance": "Om den här instansen",
"Add": "Lägg till",
"Add an address": "Lägg till en adress",
"Add some tags": "Lägg till några taggar",
"Add to my calendar": "Lägg till i min kalender",
"Additional comments": "Yttligare kommentarer",
"Administration": "Administration",
"All data will be deleted every 48 hours, so please don't use this for anything real.": "All data kommer raderas varje 48e timme, så använd inte detta för något riktigt.",
"All the places have already been taken": "Alla platser är bokade|Det finns en plats kvar|Det finns {places} kvar",
"Allow all comments": "Tillåt alla kommentarer",
"An error has occurred.": "Ett fel har uppstått.",
"Approve": "Godkänn",
"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}\"?",
"Are you sure you want to delete this event? This action cannot be reverted.": "Är du säker på att du vill radera det här evenemanget? Den här handlingen kan inte ångras.",
"Avatar": "Avatar",
"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 {name}": "Av {name}",
"Cancel": "Avbryt",
"Cancel creation": "Avbryt skapandet",
"Cancel edition": "Avbryt redigeringen",
"Cancel my participation request…": "Avbryt min ansökan om att delta…",
"Cancel my participation…": "Avsluta mitt deltagande…",
"Cancelled: Won't happen": "Inställt: Kommer inte ske",
"Category": "Kategori",
"Change": "Ändra",
"Change my identity…": "Ändra min identitet…",
"Change my password": "Ändra mitt lösenord",
"Change password": "Ändra lösenord",
"Clear": "Rensa",
"Click to select": "Klicka för att välja",
"Click to upload": "Klicka för att ladda upp",
"Close comments for all (except for admins)": "Stäng kommentarerna för alla (förutom administratörer)",
"Comments": "Kommentarer",
"Comments on the event page": "Kommentarer på evenemangets sida",
"Confirm my particpation": "Bekräfta mitt deltagande",
"Confirmed: Will happen": "Fastställt: Kommer ske",
"Continue editing": "Fortsätt redigera",
"Country": "Land",
"Create": "Skapa",
"Create a new event": "Skapa ett nytt evenemang",
"Create a new group": "Skapa en ny grupp",
"Create a new identity": "Skapa en ny identitet",
"Create and manage several identities from the same account": "Skapa och hantera flera identiteter från samma konto",
"Create group": "Skapa grupp",
"Create my event": "Skapa mitt evenemang",
"Create my group": "Skapa min grupp",
"Create my profile": "Skapa min profil",
"Create token": "Skapa token",
"Create, edit or delete events": "Skapa, redigera eller radera evenemang",
"Creator": "Skapare",
"Current identity has been changed to {identityName} in order to manage this event.": "Aktiv identitet har ändrats till {identityName} för att hantera det här evenemanget.",
"Date and time settings": "Datum- och tidsinställningar",
"Date parameters": "Datumparametrar",
"Delete": "Radera",
"Delete event": "Radera evenemang",
"Delete this identity": "Radera den här identiteten",
"Delete your identity": "Radera din identitet",
"Delete {eventTitle}": "Radera {eventTitle}",
"Delete {preferredUsername}": "Radera {preferredUsername}",
"Description": "Beskrivning",
"Didn't receive the instructions ?": "Fick inte instruktionerna?",
"Display name": "Visa namn",
"Display participation price": "Visa pris för deltagande",
"Draft": "Utkast",
"Drafts": "Utkast",
"Edit": "Redigera",
"Eg: Stockholm, Dance, Chess…": "E.g.: Stockholm, Dans, Schack…",
"Either the account is already validated, either the validation token is incorrect.": "Antingen är kontot redan validerat eller så är valideringstoken inkorrekt.",
"Email": "E-post",
"Ends on…": "Slutar…",
"Enjoy discovering Mobilizon!": "Njut av att utforska Mobilizon!",
"Enter the link URL": "Skriv in länken",
"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",
"Event": "Evenemang",
"Event already passed": "Evenemanget är över",
"Event cancelled": "Evenemanget är inställt",
"Event creation": "Evenemangskapande",
"Event edition": "Evenemangredigerande",
"Event list": "Evenemanglista",
"Event not found.": "Evenemanget hittades inte.",
"Event page settings": "Evenemangsidans inställningar",
"Event to be confirmed": "Evenemang ska bekräftas",
"Event {eventTitle} deleted": "Evenemang {eventTitle} raderat",
"Event {eventTitle} reported": "Evenemang {eventTitle} rapporterat",
"Events": "Evenemang",
"Exclude": "Exkludera",
"Explore": "Utforska",
"Featured events": "Utvalda evenemang",
"Features": "Utvalda",
"Find an address": "Hitta en adress",
"Find an instance": "Hitta en instans",
"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 information": "Generell information",
"Going as {name}": "Går som {name}",
"Group List": "Grupplista",
"Group full name": "Gruppnamn (hela)",
"Group name": "Gruppnamn",
"Group {displayName} created": "Gruppen {displayName} skapad",
"Groups": "Grupper",
"Headline picture": "Huvudbild",
"I create an identity": "Jag skapar en identitet",
"I participate": "Jag deltar",
"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 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>.",
"Join {instance}, a Mobilizon instance": "Gå med i {instance}, en Mobilizon instans",
"Last published event": "Senast publicerade evenemang",
"Last week": "Senaste veckan",
"Learn more": "Lär dig mer",
"Learn more about Mobilizon": "Lär dig mer om Mobilizon",
"Leave event": "Lämna evenemang",
"Leaving event \"{title}\"": "Lämnar evenemanget \"{title}\"",
"Let's create a new common": "Låt oss skapa en ny gemenskap",
"License": "Licens",
"Limited number of places": "Begränsat antal platser",
"Load more": "Ladda fler",
"Locality": "Plats",
"Log in": "Logga in",
"Log out": "Logga ut",
"Login": "Logga in",
"Login on Mobilizon!": "Logga in på Mobilizon!",
"Manage participations": "Hantera deltaganden",
"Members": "Medlemmar",
"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 är fri/libre mjukvara som gör det möjligt för gemenskaper att skapa <b>sina egena platser</b> för att publisera evenemang, för att bättre frigöra sig själva från teknikjättar.",
"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 är under utveckling, vi kommer lägga till nya funktioner till den här sidan med regelbundna uppdatering, tills vi släpper <b>version 1 av mjukvaran under första halvåret av 2020</b>.",
"Mobilizons licence": "Mobilizons licens",
"Moderated comments (shown after approval)": "Modererade kommentarer (visas när de godkänts)",
"My account": "Mitt konto",
"My events": "Mina evenemang",
"My identities": "Mina identiteter",
"Name": "Namn",
"New password": "Nytt lösenord",
"No address defined": "Ingen adress fastställd",
"No end date": "Inget slutdatum",
"No events found": "Inga evenemang hittade",
"No group found": "Ingen grupp hittades",
"No groups found": "Inga grupper hittades",
"No results for \"{queryText}\"": "Inga resultat för \"{queryText}\"",
"No user account with this email was found. Maybe you made a typo?": "Inget användarkonto med den e-postadressen hittades. Du kanske råkade göra ett stavfel?",
"Number of places": "Antal platser",
"OK": "Okej",
"Old password": "Gammalt lösenord",
"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)",
"Opened reports": "Öppnade rapporter",
"Organized": "Organiserad",
"Organized by {name}": "Organiserad 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)",
"Page not found": "Sidan hittades inte",
"Participant already was rejected.": "Deltagaren har redan blivit avfärdad.",
"Participant has already been approved as participant.": "Deltagaren har redan godkänts.",
"Participants": "Deltagare",
"Participate": "Delta",
"Participation approval": "Deltagandegodkännande",
"Participation requested!": "Du har ansökt om deltagande!",
"Password": "Lösenord",
"Password (confirmation)": "Lösenord (bekräftning)",
"Password change": "Ändra lösenord",
"Password reset": "Återställ lösenord",
"Past events": "Tidigare evenemang",
"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 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",
"Postal Code": "Postkod",
"Private event": "Privat evenemang",
"Private feeds": "Privata feeds",
"Public RSS/Atom Feed": "Publik RSS/Atom-feed",
"Public comment moderation": "Publik kommentarmoderering",
"Public event": "Publikt evenemang",
"Public feeds": "Publika feeds",
"Public iCal Feed": "Publik iCal-feed",
"Publish": "Publicera",
"Published events": "Publicerade evenemang",
"RSS/Atom Feed": "RSS/Atom-feed",
"Read Framasofts statement of intent on the Framablog": "Läs Framasofts uttalande om intention på Framabloggen",
"Region": "Region",
"Register": "Registrera",
"Register an account on Mobilizon!": "Registrera ett konto på Mobilizon!",
"Register for an event by choosing one of your identities": "Registrera dig för ett evenemang genom att välja en av dina identiteter",
"Registration is currently closed.": "Registreringen är stängd för närvarande.",
"Reject": "Avfärda",
"Rejected": "Avfärdad",
"Rejected participations": "Avfärdade deltaganden",
"Report": "Rapportera",
"Report this event": "Rapportera det här evenemanget",
"Requests": "Förfrågningar",
"Resend confirmation email": "Skicka bekräftelsemailet igen",
"Reset my password": "Återställ mitt lösenord",
"Save": "Spara",
"Save draft": "Spara utkast",
"Search": "Sök",
"Search events, groups, etc.": "Sök evenemang, grupper, etc.",
"Search results: \"{search}\"": "Sökresultat: \"{search}\"",
"Searching…": "Söker…",
"Send me an email to reset my password": "Skicka mig ett mail för att återställa mitt lösenord",
"Send me the confirmation email once again": "Skicka mig bekräftelsemailet en gång till",
"Send the report": "Skicka rapporten",
"Share this event": "Dela det här evenemanget",
"Show map": "Visa karta",
"Show remaining number of places": "Visa antal lediga platser",
"Show the time when the event begins": "Visa vilken tid evenemanget börjar",
"Show the time when the event ends": "Visa vilken tid evenemanget slutar",
"Sign up": "Gå med",
"Software to the people": "Mjukvara åt folket",
"Starts on…": "Börjar…",
"Status": "Status",
"Street": "Gata",
"Tentative: Will be confirmed later": "Preliminär: Kommer bekräftas senare",
"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",
"The event has been created as a draft": "Evenemanget har skapats som ett utkast",
"The event has been published": "Evenemanget har publicerats",
"The event has been updated": "Evenemanget har uppdaterats",
"The event has been updated and published": "Evenemanget har uppdaterats och publicerats",
"The event organizer didn't add any description.": "Evenemangets organisatör lade inte till någon beskrivning.",
"The event title will be ellipsed.": "Evenemangets titel kommer förkortas med en ellipsis.",
"The page you're looking for doesn't exist.": "Sidan du letar efter existerar inte.",
"The password was successfully changed": "Lösenordet ändrades",
"The report will be sent to the moderators of your instance. You can explain why you report this content below.": "Rapporten kommer skickas till moderatorerna på din instans. Du kan förklara varför du rapporterade det här innehållet här under.",
"The user account you're trying to login as has not been confirmed yet. Check your email inbox and eventually your spam folder.": "Användarkontot du försöker logga in som har inte bekräftats ännu. Kolla din e-postinbox och eventuellt din spam-folder.",
"There are {participants} participants.": "Det är {participants} deltagare.",
"These events may interest you": "Dessa evenemang kanske intresserar dig",
"This installation (called “instance“) can easily {interconnect}, thanks to {protocol}.": "Den här installationen (kallat \"instans\") kan enkelt {interconnect}, tack vare {protocol}.",
"This instance isn't opened to registrations, but you can register on other instances.": "Den här isntansen är inte öppen för registrering, men du kan registrera på andra instanser.",
"This is a demonstration site to test the beta version of Mobilizon.": "Det här är en demosida för att testa beta-versionen av Mobilizon.",
"This will delete / anonymize all content (events, comments, messages, participations…) created from this identity.": "Det här kommer radera / anonymisera allt innehåll (evenemang, kommentarer, meddelanden, deltaganden...) skapade av den här identiteten.",
"Title": "Titel",
"To achieve your registration, please create a first identity profile.": "För att fullfölja din registrering, vänligen skapa din första identitetsprofil.",
"To change the world, change the software": "För att ändra världen, ändra mjukvaran",
"To confirm, type your event title \"{eventTitle}\"": "För att bekräfta, skriv in evenemangets titel \"{eventTitle}\"",
"To confirm, type your identity username \"{preferredUsername}\"": "För att bekräfta, skriv in din identitets användarnamn \"{preferredUsername}\"",
"Transfer to {outsideDomain}": "Överför till {outsideDomain}",
"Unfortunately, this instance isn't opened to registrations": "Tyvärr är den här instansen inte öppen för registrering",
"Unfortunately, your participation request was rejected by the organizers.": "Tyvärr blev ditt deltagande avfärdat av organisatörerna.",
"Unknown error.": "Okänt fel.",
"Unsaved changes": "Osparade ändringar",
"Upcoming": "Kommande",
"Update event {name}": "Uppdatera evenemang {name}",
"Update my event": "Uppdatera mitt evenemang",
"User accounts and every other data is currently deleted every 48 hours, so you may want to register again.": "Användarkonton och all annan data tas bort var 48e timme, så du vill kanske registrera igen.",
"Username": "Användarnamn",
"Users": "Användare",
"View event page": "Visa evenemangsidan",
"View everything": "Visa allt",
"Visible everywhere on the web (public)": "Synlig överallt på internet (publikt)",
"Waiting for organization team approval.": "Väntar på godkännande från organisationsteamet.",
"Waiting list": "Väntlista",
"Warning": "Varning",
"We just sent an email to {email}": "Vi skickade precis ett mail till {email}",
"We want to develop a <b>digital common</b>, that everyone can make their own, which respects <b>privacy and activism by design</b>.": "Vi vill utveckla en <b>digital allmänning</b>, som alla kan göra till sin egen, som respekterar <b>integritet och aktivism från grunden</b>.",
"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.": "Vi kommer inte ändra världen utifrån Facebook. Verktyget i drömmer om kommer inte utvecklas av övervakande, kapitalistiska företag, eftersom de inte kan gör vinst på det. Det här är ett tillfälle att bygga någonting bättre genom att tänka annorlunda.",
"Website / URL": "Hemsida / URL",
"Welcome back {username}!": "Välkommen tillbaka {username}!",
"Welcome back!": "Välkommen tillbaka!",
"Welcome on your administration panel": "Välkommen till din administrationspanel",
"Welcome to Mobilizon, {username}!": "Välkommen till Mobilizon, {username}!",
"Who can view this event and participate": "Vem kan se och delta i detta evenemang",
"World map": "Världskarta",
"You and one other person are going to this event": "Du är den enda som deltar i detta evenemang|Du och en annan person deltar i detta evenemang|Du och {approved} andra deltar i detta evenemang.",
"You are already a participant of this event.": "Du är redan en deltagare av detta evenemang.",
"You are already logged-in.": "Du är redan inloggad.",
"You can add tags by hitting the Enter key or by adding a comma": "Du kan lägga till taggar genom att trycka Enter eller skriva ett komma",
"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 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.",
"Your account has been validated": "Ditt konto har validerats",
"Your account is being validated": "Ditt konto håller på att valideras",
"Your account is nearly ready, {username}": "Ditt konto är nästan redo, {username}",
"Your local administrator resumed its policy:": "Din lokala administratör återupptog sin policy:",
"Your participation has been confirmed": "Ditt deltagande har bekräftats",
"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",
"firstDayOfWeek": "0",
"iCal Feed": "iCal-feed",
"interconnect with others like it": "sammanlänka med liknande",
"its source code is public": "dens mjukvara är publik",
"on our blog": "på vår blogg",
"resend confirmation email": "skicka bekräftelsemail igen",
"respect of the fundamental freedoms": "respektera våra grundläggande friheter",
"with another identity…": "med en annan identitet…",
"with {identity}": "med {identity}",
"{approved} / {total} seats": "{approved} / {total} platser",
"{count} participants": "Inga deltagande ännu|En deltagande|{count} deltagande",
"{count} requests waiting": "{count} förfrågningar väntar",
"{license} guarantees {respect} of the people who will use it. Since {source}, anyone can audit it, which guarantees its transparency.": "{license} garanterar {respect} av folket som använder den. Eftersom {source}, kan vem som helst läsa den, vilket garanterar genomskinlighet.",
"© The Mobilizon Contributors {date} - Made with Elixir, Phoenix, VueJS & with some love and some weeks": "© Mobilizon bidragarna {date} - Gjord med Elixir, Phoenix, VueJS & och med kärlek och några veckor"
}

View File

@ -2,15 +2,14 @@
// (runtime-only or standalone) has been set in webpack.base.conf with an alias.
import Vue from 'vue';
import Buefy from 'buefy';
import VueI18n from 'vue-i18n';
import Component from 'vue-class-component';
import App from '@/App.vue';
import router from '@/router';
import { apolloProvider } from './vue-apollo';
import { NotifierPlugin } from '@/plugins/notifier';
import filters from '@/filters';
import messages from '@/i18n/index';
import VueMeta from 'vue-meta';
import { i18n } from '@/utils/i18n';
Vue.config.productionTip = false;
@ -19,16 +18,6 @@ Vue.use(NotifierPlugin);
Vue.use(filters);
Vue.use(VueMeta);
const language = (window.navigator as any).userLanguage || window.navigator.language;
Vue.use(VueI18n);
const i18n = new VueI18n({
locale: language.split('-')[0], // set locale
messages, // set locale messages
fallbackLocale: 'en_US',
});
// Register the router hooks with their names
Component.registerHooks([
'beforeRouteEnter',

View File

@ -8,10 +8,10 @@ import { IPerson } from '@/types/actor';
@Component
export default class EventMixin extends mixins(Vue) {
async openDeleteEventModal (event: IEvent, currentActor: IPerson) {
const participantsLength = event.participantStats.approved;
const participantsLength = event.participantStats.participant;
const prefix = participantsLength
? this.$tc('There are {participants} participants.', event.participantStats.approved, {
participants: event.participantStats.approved,
? this.$tc('There are {participants} participants.', event.participantStats.participant, {
participants: event.participantStats.participant,
})
: '';

View File

@ -0,0 +1,35 @@
import { Component, Mixins, Vue } from 'vue-property-decorator';
import { Person } from '@/types/actor';
@Component
export default class IdentityEditionMixin extends Mixins(Vue) {
identity = new Person();
oldDisplayName: string | null = null;
autoUpdateUsername(newDisplayName: string | null) {
const oldUsername = IdentityEditionMixin.convertToUsername(this.oldDisplayName);
if (this.identity.preferredUsername === oldUsername) {
this.identity.preferredUsername = IdentityEditionMixin.convertToUsername(newDisplayName);
}
this.oldDisplayName = newDisplayName;
}
private static convertToUsername(value: string | null) {
if (!value) return '';
// https://stackoverflow.com/a/37511463
return value.toLocaleLowerCase()
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '')
.replace(/ /g, '_')
.replace(/[^a-z0-9_]/g, '')
;
}
validateUsername() {
return this.identity.preferredUsername === IdentityEditionMixin.convertToUsername(this.identity.preferredUsername);
}
}

View File

@ -1,6 +1,7 @@
import EventList from '@/views/Event/EventList.vue';
import Location from '@/views/Location.vue';
import { RouteConfig } from 'vue-router';
import { RouteName } from '@/router/index';
// tslint:disable:space-in-parens
const participations = () => import(/* webpackChunkName: "participations" */ '@/views/Event/Participants.vue');
@ -19,6 +20,7 @@ export enum EventRouteName {
PARTICIPATIONS = 'Participations',
EVENT = 'Event',
LOCATION = 'Location',
TAG = 'Tag',
}
export const eventRoutes: RouteConfig[] = [
@ -73,4 +75,9 @@ export const eventRoutes: RouteConfig[] = [
props: true,
meta: { requiredAuth: false },
},
{
path: '/tag/:tag',
name: EventRouteName.TAG,
redirect: '/search/:tag',
},
];

View File

@ -74,11 +74,15 @@ const router = new Router({
meta: { requiredAuth: false },
},
{
path: '*',
path: '/404',
name: RouteName.PAGE_NOT_FOUND,
component: PageNotFound,
meta: { requiredAuth: false },
},
{
path: '*',
redirect: { name: RouteName.PAGE_NOT_FOUND },
},
],
});

View File

@ -1,12 +1,14 @@
import poiIcons from '@/utils/poiIcons';
export interface IAddress {
id?: number;
id?: string;
description: string;
floor: string;
street: string;
locality: string;
postalCode: string;
region: string;
country: string;
type: string;
geom?: string;
url?: string;
originId?: string;
@ -15,9 +17,92 @@ export interface IAddress {
export class Address implements IAddress {
country: string = '';
description: string = '';
floor: string = '';
locality: string = '';
postalCode: string = '';
region: string = '';
street: string = '';
type: string = '';
id?: string = '';
originId?: string = '';
url?: string = '';
geom?: string = '';
constructor(hash?) {
if (!hash) return;
this.id = hash.id;
this.description = hash.description;
this.street = hash.street;
this.locality = hash.locality;
this.postalCode = hash.postalCode;
this.region = hash.region;
this.country = hash.country;
this.type = hash.type;
this.geom = hash.geom;
this.url = hash.url;
this.originId = hash.originId;
}
get poiInfos() {
/* generate name corresponding to poi type */
let name = '';
let alternativeName = '';
let poiIcon = poiIcons.default;
// Google Maps doesn't have a type
if (this.type == null && this.description === this.street) this.type = 'house';
switch (this.type) {
case 'house':
name = this.description;
alternativeName = [this.postalCode, this.locality, this.country].filter(zone => zone).join(', ');
poiIcon = poiIcons.defaultAddress;
break;
case 'street':
case 'secondary':
name = this.description;
alternativeName = [this.postalCode, this.locality, this.country].filter(zone => zone).join(', ');
poiIcon = poiIcons.defaultStreet;
break;
case 'zone':
case 'city':
case 'administrative':
name = this.postalCode ? `${this.description} (${this.postalCode})` : this.description;
alternativeName = [this.region, this.country].filter(zone => zone).join(', ');
poiIcon = poiIcons.defaultAdministrative;
break;
default:
// POI
name = this.description;
alternativeName = '';
if (this.street && this.street.trim()) {
alternativeName = `${this.street}`;
if (this.locality) {
alternativeName += ` (${this.locality})`;
}
} else if (this.locality && this.locality.trim()) {
alternativeName = `${this.locality}, ${this.region}, ${this.country}`;
} else if (this.region && this.region.trim()) {
alternativeName = `${this.region}, ${this.country}`;
} else if (this.country && this.country.trim()) {
alternativeName = this.country;
}
poiIcon = this.iconForPOI;
break;
}
return { name, alternativeName, poiIcon };
}
get fullName() {
const { name, alternativeName } = this.poiInfos;
return `${name}, ${alternativeName}`;
}
get iconForPOI() {
if (this.type == null) {
return poiIcons.default;
}
const type = this.type.split(':').pop() || '';
if (poiIcons[type]) return poiIcons[type];
return poiIcons.default;
}
}

View File

@ -3,4 +3,21 @@ export interface IConfig {
description: string;
registrationsOpen: boolean;
demoMode: boolean;
countryCode: string;
location: {
latitude: number;
longitude: number;
accuracyRadius: number;
};
maps: {
tiles: {
endpoint: string;
attribution: string|null;
},
};
geocoding: {
provider: string;
autocomplete: boolean;
};
}

View File

@ -1,5 +1,5 @@
import { Actor, IActor } from './actor';
import { IAddress } from '@/types/address.model';
import { Actor, IActor, IPerson } from './actor';
import { Address, IAddress } from '@/types/address.model';
import { ITag } from '@/types/tag.model';
import { IPicture } from '@/types/picture.model';
@ -45,6 +45,13 @@ export enum Category {
MEETING = 'meeting',
}
export interface IEventCardOptions {
hideDate: boolean;
loggedPerson: IPerson | boolean;
hideDetails: boolean;
organizerActor: IActor | null;
}
export interface IParticipant {
id?: string;
role: ParticipantRole;
@ -86,6 +93,16 @@ export enum CommentModeration {
CLOSED = 'CLOSED',
}
export interface IEventParticipantStats {
notApproved: number;
rejected: number;
participant: number;
creator: number;
moderator: number;
administrator: number;
going: number;
}
export interface IEvent {
id?: string;
uuid: string;
@ -108,12 +125,7 @@ export interface IEvent {
organizerActor?: IActor;
attributedTo: IActor;
participantStats: {
approved: number;
unapproved: number;
rejected: number;
participants: number;
};
participantStats: IEventParticipantStats;
participants: IParticipant[];
relatedEvents: IEvent[];
@ -138,6 +150,8 @@ export interface IEventOptions {
program: string;
commentModeration: CommentModeration;
showParticipationPrice: boolean;
showStartTime: boolean;
showEndTime: boolean;
}
export class EventOptions implements IEventOptions {
@ -150,6 +164,8 @@ export class EventOptions implements IEventOptions {
program = '';
commentModeration = CommentModeration.ALLOW_ALL;
showParticipationPrice = false;
showStartTime = true;
showEndTime = true;
}
export class EventModel implements IEvent {
@ -179,7 +195,7 @@ export class EventModel implements IEvent {
publishAt = new Date();
participantStats = { approved: 0, unapproved: 0, rejected: 0, participants: 0 };
participantStats = { notApproved: 0, rejected: 0, participant: 0, moderator: 0, administrator: 0, creator: 0, going: 0 };
participants: IParticipant[] = [];
relatedEvents: IEvent[] = [];
@ -223,7 +239,7 @@ export class EventModel implements IEvent {
this.onlineAddress = hash.onlineAddress;
this.phoneAddress = hash.phoneAddress;
this.physicalAddress = hash.physicalAddress;
this.physicalAddress = new Address(hash.physicalAddress);
this.participantStats = hash.participantStats;
this.tags = hash.tags;

View File

@ -1,3 +1,9 @@
export enum LoginErrorCode {
NEED_TO_LOGIN = 'rouge',
}
export enum LoginError {
USER_NOT_CONFIRMED = 'User account not confirmed',
USER_DOES_NOT_EXIST = 'No user with this email was found',
USER_EMAIL_PASSWORD_INVALID = 'Impossible to authenticate, either your email or password are invalid.',
}

View File

@ -1,4 +1,5 @@
export interface IPicture {
id: string;
url: string;
name: string;
alt: string;

View File

@ -0,0 +1,22 @@
root = true
[*]
charset = utf-8
end_of_line = lf
indent_size = 4
indent_style = space
insert_final_newline = true
max_line_length = 120
tab_width = 4
trim_trailing_whitespace = true
[*.ex]
indent_size = 2
tab_width = 2
[*.scss]
indent_size = 2
[*.ts]
indent_size = 2
tab_width = 2

80
js/src/utils/errors.ts Normal file
View File

@ -0,0 +1,80 @@
import { i18n } from '@/utils/i18n';
export const refreshSuggestion = i18n.t('Please refresh the page and retry.') as string;
export const defaultError: IError = {
match: / /,
value: i18n.t('An error has occurred.') as string,
};
export interface IError { match: RegExp; value: string|null; suggestRefresh?: boolean; }
export const errors: IError[] = [
{
match: /^Event with UUID .* not found$/,
value: i18n.t('Page not found') as string,
suggestRefresh: false,
},
{
match: /^Event not found$/,
value: i18n.t('Event not found.') as string,
},
{
match: /^Event with this ID .* doesn't exist$/,
value: i18n.t('Event not found.') as string,
},
{
match: /^Error while saving report$/,
value: i18n.t('Error while saving report.') as string,
},
{
match: /^Participant already has role rejected$/,
value: i18n.t('Participant already was rejected.') as string,
},
{
match: /^Participant already has role participant$/,
value: i18n.t('Participant has already been approved as participant.') as string,
},
{
match: /^You are already a participant of this event$/,
value: i18n.t('You are already a participant of this event.') as string,
},
{
match: /NetworkError when attempting to fetch resource.$/,
value: i18n.t('Error while communicating with the server.') as string,
},
{
match: /Provided moderator actor ID doesn't have permission on this event$/,
value: i18n.t("The current identity doesn't have any permission on this event. You should probably change it.") as string,
suggestRefresh: false,
},
{
match: /Cannot remove the last identity of a user/,
value: i18n.t("You can't remove your last identity.") as string,
suggestRefresh: false,
},
{
match: /^No user with this email was found$/,
value: null,
},
{
match: /^Username is already taken$/,
value: null,
},
{
match: /^Impossible to authenticate, either your email or password are invalid.$/,
value: null,
},
{
match: /^No user to validate with this email was found$/,
value: null,
},
{
match: /^This email is already used.$/,
value: null,
},
{
match: /^User account not confirmed$/,
value: null,
},
];

13
js/src/utils/i18n.ts Normal file
View File

@ -0,0 +1,13 @@
import Vue from 'vue';
import VueI18n from 'vue-i18n';
import messages from '@/i18n/index';
const language = (window.navigator as any).userLanguage || window.navigator.language;
Vue.use(VueI18n);
export const i18n = new VueI18n({
locale: language.split('-')[0], // set locale
messages, // set locale messages
fallbackLocale: 'en_US',
});

61
js/src/utils/poiIcons.ts Normal file
View File

@ -0,0 +1,61 @@
export default {
default: {
icon: 'map-marker',
color: '#5C6F84',
},
defaultAdministrative: {
icon: 'city',
color: '#5c6f84',
},
defaultStreet: {
icon: 'road-variant',
color: '#5c6f84',
},
defaultAddress: {
icon: 'home',
color: '#5c6f84',
},
place_house: {
icon: 'home',
color: '#5c6f84',
},
theatre: {
icon: 'drama-masks',
},
parking: {
icon: 'parking',
},
police: {
icon: 'police-badge',
},
post_office: {
icon: 'email',
},
university: {
icon: 'school',
},
college: {
icon: 'school',
},
park: {
icon: 'pine-tree',
},
garden: {
icon: 'pine-tree',
},
bicycle_rental: {
icon: 'bicycle',
},
hospital: {
icon: 'hospital-box',
},
townhall: {
icon: 'office-building',
},
toilets: {
icon: 'human-male-female',
},
hairdresser: {
icon: 'content-cut',
},
};

View File

@ -10,7 +10,7 @@
</div>
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
import { Component, Prop, Vue, Watch } from 'vue-property-decorator';
import { IActor } from '@/types/actor';
import IdentityPicker from './IdentityPicker.vue';
@ -22,6 +22,11 @@ export default class IdentityPickerWrapper extends Vue {
isComponentModalActive: boolean = false;
currentIdentity: IActor = this.value;
@Watch('value')
updateCurrentActor(value) {
this.currentIdentity = value;
}
relay(identity: IActor) {
this.currentIdentity = identity;
this.$emit('input', identity);
@ -36,4 +41,4 @@ export default class IdentityPickerWrapper extends Vue {
height: 1.5em;
vertical-align: text-bottom;
}
</style>
</style>

View File

@ -9,6 +9,10 @@
{{ $t('To achieve your registration, please create a first identity profile.')}}
</b-message>
<form v-if="!validationSent" @submit.prevent="submit">
<b-field :label="$t('Display name')">
<b-input aria-required="true" required v-model="identity.name" @input="autoUpdateUsername($event)"/>
</b-field>
<b-field
:label="$t('Username')"
:type="errors.preferred_username ? 'is-danger' : null"
@ -19,7 +23,7 @@
aria-required="true"
required
expanded
v-model="person.preferredUsername"
v-model="identity.preferredUsername"
/>
<p class="control">
<span class="button is-static">@{{ host }}</span>
@ -27,12 +31,8 @@
</b-field>
</b-field>
<b-field :label="$t('Displayed name')">
<b-input v-model="person.name"/>
</b-field>
<b-field :label="$t('Description')">
<b-input type="textarea" v-model="person.summary"/>
<b-input type="textarea" v-model="identity.summary"/>
</b-field>
<p class="control has-text-centered">
@ -45,7 +45,7 @@
<div v-if="validationSent && !userAlreadyActivated">
<b-message title="Success" type="is-success" closable="false">
<h2 class="title">
{{ $t('Your account is nearly ready, {username}', { username: person.preferredUsername }) }}
{{ $t('Your account is nearly ready, {username}', { username: identity.preferredUsername }) }}
</h2>
<p>
{{ $t('A validation email was sent to {email}', { email }) }}
@ -61,22 +61,22 @@
</template>
<script lang="ts">
import { Component, Prop, Vue } from 'vue-property-decorator';
import { IPerson, Person } from '@/types/actor';
import { Component, Prop } from 'vue-property-decorator';
import { IPerson } from '@/types/actor';
import { IDENTITIES, REGISTER_PERSON } from '@/graphql/actor';
import { MOBILIZON_INSTANCE_HOST } from '@/api/_entrypoint';
import { RouteName } from '@/router';
import { changeIdentity } from '@/utils/auth';
import { ICurrentUser } from '@/types/current-user.model';
import { mixins } from 'vue-class-component';
import identityEditionMixin from '@/mixins/identityEdition';
@Component
export default class Register extends Vue {
export default class Register extends mixins(identityEditionMixin) {
@Prop({ type: String, required: true }) email!: string;
@Prop({ type: Boolean, required: false, default: false }) userAlreadyActivated!: boolean;
host?: string = MOBILIZON_INSTANCE_HOST;
person: IPerson = new Person();
errors: object = {};
validationSent: boolean = false;
sendingValidation: boolean = false;
@ -94,7 +94,7 @@ export default class Register extends Vue {
this.errors = {};
const { data } = await this.$apollo.mutate<{ registerPerson: IPerson }>({
mutation: REGISTER_PERSON,
variables: Object.assign({ email: this.email }, this.person),
variables: Object.assign({ email: this.email }, this.identity),
update: (store, { data }) => {
if (this.userAlreadyActivated) {
const identitiesData = store.readQuery<{ identities: IPerson[] }>({ query: IDENTITIES });
@ -108,6 +108,7 @@ export default class Register extends Vue {
});
if (data) {
this.validationSent = true;
window.localStorage.setItem('new-registered-user', 'yes');
if (this.userAlreadyActivated) {
await changeIdentity(this.$apollo.provider.defaultClient, data.registerPerson);

View File

@ -7,13 +7,13 @@
<picture-upload v-model="avatarFile" class="picture-upload"></picture-upload>
<b-field :label="$t('Display name')">
<b-field horizontal :label="$t('Display name')">
<b-input aria-required="true" required v-model="identity.name" @input="autoUpdateUsername($event)"/>
</b-field>
<b-field :label="$t('Username')">
<b-field>
<b-input aria-required="true" required v-model="identity.preferredUsername" :disabled="isUpdate"/>
<b-field horizontal custom-class="username-field" expanded :label="$t('Username')" :message="message">
<b-field expanded>
<b-input aria-required="true" required v-model="identity.preferredUsername" :disabled="isUpdate" :use-html5-validation="!isUpdate" pattern="[a-z0-9_]+"/>
<p class="control">
<span class="button is-static">@{{ getInstanceHost() }}</span>
@ -21,7 +21,7 @@
</b-field>
</b-field>
<b-field :label="$t('Description')">
<b-field horizontal :label="$t('Description')">
<b-input type="textarea" aria-required="false" v-model="identity.summary"/>
</b-field>
@ -77,10 +77,14 @@
cursor: pointer;
margin-top: 15px;
}
.username-field + .field {
margin-bottom: 0;
}
</style>
<script lang="ts">
import { Component, Prop, Vue, Watch } from 'vue-property-decorator';
import { Component, Prop, Watch } from 'vue-property-decorator';
import {
CREATE_PERSON,
CURRENT_ACTOR_CLIENT,
@ -96,6 +100,8 @@ import { Dialog } from 'buefy/dist/components/dialog';
import { RouteName } from '@/router';
import { buildFileFromIPicture, buildFileVariable, readFileAsync } from '@/utils/image';
import { changeIdentity } from '@/utils/auth';
import { mixins } from 'vue-class-component';
import identityEditionMixin from '@/mixins/identityEdition';
@Component({
components: {
@ -108,18 +114,21 @@ import { changeIdentity } from '@/utils/auth';
},
},
})
export default class EditIdentity extends Vue {
export default class EditIdentity extends mixins(identityEditionMixin) {
@Prop({ type: Boolean }) isUpdate!: boolean;
errors: string[] = [];
identityName!: string | undefined;
avatarFile: File | null = null;
identity = new Person();
private oldDisplayName: string | null = null;
private currentActor: IPerson | null = null;
get message() {
if (this.isUpdate) return null;
return this.$t('Only alphanumeric characters and underscores are supported.');
}
@Watch('isUpdate')
async isUpdateChanged () {
this.resetFields();
@ -134,9 +143,14 @@ export default class EditIdentity extends Vue {
this.resetFields();
this.identityName = val;
const identity = await this.getIdentity();
if (this.identityName) {
this.identity = await this.getIdentity();
if (!identity) {
return await this.$router.push({ name: 'CreateIdentity' });
}
if (this.identityName && identity) {
this.identity = identity;
this.avatarFile = await buildFileFromIPicture(this.identity.avatar);
}
@ -148,16 +162,6 @@ export default class EditIdentity extends Vue {
return this.createIdentity();
}
autoUpdateUsername(newDisplayName: string | null) {
const oldUsername = this.convertToUsername(this.oldDisplayName);
if (this.identity.preferredUsername === oldUsername) {
this.identity.preferredUsername = this.convertToUsername(newDisplayName);
}
this.oldDisplayName = newDisplayName;
}
/**
* Delete an identity
*/
@ -280,15 +284,18 @@ export default class EditIdentity extends Vue {
});
}
private async getIdentity() {
const result = await this.$apollo.query({
query: FETCH_PERSON,
variables: {
username: this.identityName,
},
});
return new Person(result.data.fetchPerson);
private async getIdentity(): Promise<Person|null> {
try {
const result = await this.$apollo.query({
query: FETCH_PERSON,
variables: {
username: this.identityName,
},
});
return new Person(result.data.fetchPerson);
} catch (e) {
return null;
}
}
private handleError(err: any) {
@ -301,18 +308,6 @@ export default class EditIdentity extends Vue {
}
}
private convertToUsername(value: string | null) {
if (!value) return '';
// https://stackoverflow.com/a/37511463
return value.toLocaleLowerCase()
.normalize('NFD')
.replace(/[\u0300-\u036f]/g, '')
.replace(/ /g, '_')
.replace(/[^a-z0-9._]/g, '')
;
}
private async buildVariables() {
const avatarObj = buildFileVariable(this.avatarFile, 'avatar', `${this.identity.preferredUsername}'s avatar`);
const res = Object.assign({}, this.identity, avatarObj);

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